示例#1
0
        public static ShipTemplateModules mockShipTemplateModules(int shiptemplateid = shiptemplateid, byte posx = posx, byte posy = posy, short moduleid = moduleid)
        {
            ShipTemplateModules shipTemplateModules = new ShipTemplateModules(shiptemplateid, posx, posy, moduleid);

            return(shipTemplateModules);
        }
        public static bool createUpdate(string xml, int userId, ref SpacegameServer.Core.ShipTemplate template, ref SpacegameServer.Core.ShipTemplate oldTemplate)
        {
            /*
             * <?xml version="1.0" encoding="utf-8" ?>
             * <ShipTemplate>
             * <ShipTemplateId>1</ShipTemplateId>
             * <ShipTemplateHullId>1</ShipTemplateHullId>
             * <name>testName</name>
             * <gif>scout.png</gif>
             * <shipHullsImage>1</shipHullsImage>
             * <modulePositions>
             * <modulePosition>
             *  <posX>3</posX>
             *  <posY>3</posY>
             *  <moduleId>1</moduleId>
             * </modulePosition>
             * <modulePosition>
             *  <posX>2</posX>
             *  <posY>3</posY>
             *  <moduleId>2</moduleId>
             * </modulePosition>
             * </modulePositions>
             * </ShipTemplate>
             */

            Core            core           = Core.Instance;
            List <Lockable> elementsToLock = new List <Lockable>(2);


            SpacegameServer.Core.User user = core.users[userId];

            XmlDocument doc = new XmlDocument();

            doc.LoadXml(xml);

            string templateIdString = doc.DocumentElement.SelectSingleNode("/ShipTemplate/ShipTemplateId").InnerText;
            int    templateId;

            if (!Int32.TryParse(templateIdString, out templateId))
            {
                return(false);
            }

            string templateHullIdString = doc.DocumentElement.SelectSingleNode("/ShipTemplate/ShipTemplateHullId").InnerText;
            byte   templateHullId;

            if (!System.Byte.TryParse(templateHullIdString, out templateHullId))
            {
                return(false);
            }

            string shipHullsImageString = doc.DocumentElement.SelectSingleNode("/ShipTemplate/shipHullsImage").InnerText;
            int    shipHullsImage;

            if (!Int32.TryParse(shipHullsImageString, out shipHullsImage))
            {
                return(false);
            }


            if (templateId != -1)
            {
                template = core.shipTemplate[templateId];

                if (template.userId != userId)
                {
                    return(false);
                }
                if (template.amountbuilt > 0)
                {
                    oldTemplate = template;
                    int newTemplateId = (int)SpacegameServer.Core.Core.Instance.identities.templateLock.getNext();
                    template = new SpacegameServer.Core.ShipTemplate(newTemplateId);
                }
            }
            else
            {
                int newTemplateId = (int)SpacegameServer.Core.Core.Instance.identities.templateLock.getNext();
                template        = new SpacegameServer.Core.ShipTemplate(newTemplateId);
                template.userId = userId;
                template.gif    = "Dummy";
            }


            template.name           = doc.DocumentElement.SelectSingleNode("/ShipTemplate/name").InnerText;
            template.hullid         = templateHullId;
            template.shipHullsImage = shipHullsImage;

            elementsToLock.Add(template);
            if (oldTemplate != null)
            {
                elementsToLock.Add(oldTemplate);
            }
            if (!LockingManager.lockAllOrSleep(elementsToLock))
            {
                return(false);
            }
            try
            {
                template.shipModules.Clear();

                System.Xml.XmlNodeList modules = doc.DocumentElement.SelectNodes("/ShipTemplate/modulePositions/modulePosition");
                foreach (System.Xml.XmlNode node in modules)
                {
                    string posXS     = node.SelectSingleNode("posX").InnerText;     //or loop through its children as well
                    string posYS     = node.SelectSingleNode("posY").InnerText;     //or loop through its children as well
                    string moduleIdS = node.SelectSingleNode("moduleId").InnerText; //or loop through its children as well

                    byte  posX, posY;
                    short moduleId;
                    if (!(Byte.TryParse(posXS, out posX) && Byte.TryParse(posYS, out posY) && Int16.TryParse(moduleIdS, out moduleId)))
                    {
                        LockingManager.unlockAll(elementsToLock);
                        return(false);
                    }

                    ShipTemplateModules newModule = new ShipTemplateModules();
                    newModule.posX           = posX;
                    newModule.posY           = posY;
                    newModule.moduleId       = moduleId;
                    newModule.shiptemplateid = template.id;
                    template.shipModules.Add(newModule);
                }

                StatisticsCalculator.calc(template, Core.Instance);

                template.isConstructable = template.energy >= 0 && template.crew >= 0;

                if (!core.shipTemplate.ContainsKey(template.id))
                {
                    core.shipTemplate[template.id] = template;
                }

                //save newTemplate and oldTemplate
                List <AsyncSaveable> elementsToSave = new List <AsyncSaveable>();
                elementsToSave.Add(template);
                if (oldTemplate != null)
                {
                    oldTemplate.obsolete = true;
                    elementsToSave.Add(oldTemplate);
                }
                core.dataConnection.saveAsync(elementsToSave);
            }
            catch (Exception ex)
            {
                core.writeExceptionToLog(ex);
            }
            finally
            {
                LockingManager.unlockAll(elementsToLock);
            }
            return(true);
        }