예제 #1
0
        public static string Abandon(int colonyId, int userId)
        {
            SpacegameServer.Core.Core core = SpacegameServer.Core.Core.Instance;
            //moveShip
            SpacegameServer.Core.Colony colony = core.colonies[colonyId];

            //prepare output
            string ret = "";

            XMLGroups.MoveResultTree scan = new XMLGroups.MoveResultTree();
            scan.ships    = new List <Core.Ship>();
            scan.stars    = new List <Core.SystemMap>();
            scan.colonies = new List <Core.Colony>();

            //call abandon
            if (!colony.Abandon(userId, ref scan.ships))
            {
                return(ret);
            }
            scan.colonies.Add(colony);

            //create xml
            BusinessConnector.Serialize <BC.XMLGroups.MoveResultTree>(scan, ref ret);
            return(ret);
        }
예제 #2
0
        public static SpacegameServer.BC.BusinessConnector createServer()
        {
            SpacegameServer.Core.Core core = SpacegameServer.Core.Core.Instance; //new SpacegameServer.Core.SpaceServerCore(); -> Singleton

            SpacegameServer.BC.BusinessConnector bc = new BC.BusinessConnector();
            return(bc);
        }
예제 #3
0
        public static string Repair(int shipId, int userId)
        {
            SpacegameServer.Core.Core core = SpacegameServer.Core.Core.Instance;
            //moveShip
            SpacegameServer.Core.Ship ship = core.ships[shipId];
            SpacegameServer.Core.User user = core.users[userId];

            Core.Colony colony     = null;
            var         IsRepaired = ship.Repair(user, ref colony);

            //core.colonize(ship, user, newname, ref ret);
            //do the action
            //ship.colonize(user, newname, ref ret);

            //calc the xml result
            XMLGroups.MoveResultTree scan = new XMLGroups.MoveResultTree();
            scan.ships    = new List <Core.Ship>();
            scan.stars    = new List <Core.SystemMap>();
            scan.colonies = new List <Core.Colony>();

            scan.ships.Add(ship);
            scan.colonies.Add(colony);

            string ret = "";

            BusinessConnector.Serialize <BC.XMLGroups.MoveResultTree>(scan, ref ret);

            return(ret);
        }
예제 #4
0
        public static bool deconstructBuilding(int userId, int colonyId, int buildingId)
        {
            SpacegameServer.Core.Core core = SpacegameServer.Core.Core.Instance;

            //ToDo: eventually the xml will be generated here:
            return(SpacegameServer.Core.ColonyBuildingActions.deconstruct(userId, colonyId, buildingId));;
        }
예제 #5
0
        public string buildShip()
        {
            SpacegameServer.Core.Core core = SpacegameServer.Core.Core.Instance;

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

            SpacegameServer.Core.ShipBuild builder = new Core.ShipBuild(core);
            string retValue  = "";
            int    newShipId = 0;

            //builder.build(shipTemplateId, userId, colonyId, fastBuild, ref retValue);
            Core.ShipBuildErrorCode errorCode = 0;
            int errorValue = 0;

            if (builder.build2(shipTemplateId, userId, colonyId, fastBuild, ref newShipId, ref errorCode, ref errorValue))
            {
                SpacegameServer.BC.XMLGroups.shipBuild built = new SpacegameServer.BC.XMLGroups.shipBuild();
                built.Colonies = new List <Core.Colony>();
                built.Colonies.Add(core.colonies[colonyId]);
                built.ship = core.ships[newShipId];

                BusinessConnector.Serialize <SpacegameServer.BC.XMLGroups.shipBuild>(built, ref retValue, true);
            }
            else
            {
                retValue = "<error><errorCode>" + ((int)errorCode).ToString() + "</errorCode>" + "<errorValue>" + errorValue.ToString() + "</errorValue></error>";
            }

            return(retValue);
        }
예제 #6
0
        public static string buildBuilding(int userId, int colonyId, int tileNr, short buildingId)
        {
            string xml = "";

            SpacegameServer.Core.Core core = SpacegameServer.Core.Core.Instance;

            //moveShip
            SpacegameServer.Core.User user = core.users[userId];
            int newBuildingId = -1;

            SpacegameServer.Core.ColonyBuildingActions.build(userId, colonyId, tileNr, buildingId, ref newBuildingId);

            if (newBuildingId == -1)
            {
                xml = @"<buildResult>
                        <result>0</result>
                        </buildResult>";
                return(xml);
            }

            Core.ColonyBuilding newBuilding = core.colonyBuildings[newBuildingId];
            SpacegameServer.BC.XMLGroups.ColonyBuildings buildResult = new XMLGroups.ColonyBuildings(newBuilding);

            BusinessConnector.Serialize <SpacegameServer.BC.XMLGroups.ColonyBuildings>(buildResult, ref xml, true);

            return(xml);
        }
예제 #7
0
        public ShipMove(int _shipId, byte _direction, int _userId, int _duration = 1, int _attackedShipId = 0)
        {
            shipId         = _shipId;
            direction      = _direction;
            userId         = _userId;
            duration       = _duration;
            attackedShipId = _attackedShipId;

            core = SpacegameServer.Core.Core.Instance;
        }
예제 #8
0
        public static bool deconstruct(int userId, int colonyId, int buildingId)
        {
            SpacegameServer.Core.Core core = SpacegameServer.Core.Core.Instance;
            Colony colony = core.colonies[colonyId];

            if (colony == null)
            {
                return(false);
            }

            if (!deconstructCheck(userId, colony, buildingId))
            {
                return(false);
            }

            List <Lockable> elementsToLock = new List <Lockable>(1);

            elementsToLock.Add(colony);

            if (!LockingManager.lockAllOrSleep(elementsToLock))
            {
                return(false);
            }

            try
            {
                //owner may have been changed by another thread, so check it again after locking
                if (!deconstructCheck(userId, colony, buildingId))
                {
                    return(false);
                }

                ColonyBuilding itemToRemove = colony.colonyBuildings.Single(colonyBuilding => colonyBuilding.id == buildingId);
                itemToRemove.Recycle(colony);

                colony.colonyBuildings.Remove(itemToRemove);
                core.colonyBuildings.TryRemove(buildingId);

                Core.Instance.dataConnection.saveColonyGoods(colony);
                Core.Instance.dataConnection.DeconstructBuilding(userId, buildingId);
            }
            catch (Exception ex)
            {
                SpacegameServer.Core.Core.Instance.writeExceptionToLog(ex);
                return(false);
            }
            finally
            {
                //release the ressources
                LockingManager.unlockAll(elementsToLock);
            }


            return(true);
        }
예제 #9
0
        public static string buildModules(int userId, int colonyId)
        {
            SpacegameServer.Core.Core core = SpacegameServer.Core.Core.Instance;

            //moveShip
            SpacegameServer.Core.User user = core.users[userId];
            string retValue = "";

            SpacegameServer.Core.Modules.build(userId, colonyId, ref retValue);

            //ToDo: eventually the xml will be generated here:
            return(retValue);
        }
예제 #10
0
        public static bool build(int userId, int colonyId, ref string xml)
        {
            SpacegameServer.Core.Core core = SpacegameServer.Core.Core.Instance;

            // lock colony
            Colony colony = core.colonies[colonyId];

            if (colony == null)
            {
                return(false);
            }

            for (int i = 0; i < 10; i++)
            {
                bool colonyLocked = false;

                colonyLocked = colony.setLock();

                if (colonyLocked)
                {
                    //userId may have been changed by another thread, so check it again after locking
                    if (colony.userId != userId)
                    {
                        colony.removeLock();
                        return(false);
                    }
                    Core.Instance.dataConnection.buildModules(userId, colonyId, ref xml);

                    // get colony data (goods, later population (colony ships))
                    Core.Instance.dataConnection.getColonyStock(core, colony);


                    //release the ressources and return true
                    colony.removeLock();

                    BC.XMLGroups.Colonize bCCol = new BC.XMLGroups.Colonize();
                    bCCol.Colony = colony;
                    BC.BusinessConnector.Serialize <BC.XMLGroups.Colonize>(bCCol, ref xml);

                    return(true);
                }
                else
                {
                    Thread.Sleep(Lockable.rnd.Next(0, 50));
                }
            }

            return(true);
        }
예제 #11
0
        public static void rename(int userId, int colonyId, string name)
        {
            SpacegameServer.Core.Core core = SpacegameServer.Core.Core.Instance;

            if (!core.colonies.ContainsKey(colonyId))
            {
                return;
            }
            if (core.colonies[colonyId].userId != userId)
            {
                return;
            }

            core.colonies[colonyId].rename(name);
        }
예제 #12
0
        public static void  changeActive(int userId, int colonyBuildingId)
        {
            SpacegameServer.Core.Core core = SpacegameServer.Core.Core.Instance;

            if (!core.colonyBuildings.ContainsKey(colonyBuildingId))
            {
                return;
            }
            if (core.colonyBuildings[colonyBuildingId].userId != userId)
            {
                return;
            }

            core.colonyBuildings[colonyBuildingId].changeActive();
        }
예제 #13
0
        public static void delete(int userId, int templateId)
        {
            SpacegameServer.Core.Core core = SpacegameServer.Core.Core.Instance;
            SpacegameServer.Core.User user = core.users[userId];

            if (core.shipTemplate.ContainsKey(templateId))
            //if(core.shipTemplate.ElementAtOrDefault(templateId) != null)
            {
                SpacegameServer.Core.ShipTemplate template = core.shipTemplate[templateId];
                if (template.userId != userId)
                {
                    return;
                }
                SpacegameServer.Core.ShipTemplate.delete(template);
            }
        }
예제 #14
0
        public string rename()
        {
            SpacegameServer.Core.Core core = SpacegameServer.Core.Core.Instance;

            //moveShip
            SpacegameServer.Core.Ship ship = core.ships[shipId];
            SpacegameServer.Core.User user = core.users[userId];

            if (ship.userid != userId)
            {
                return("");
            }

            ship.rename(newname);

            return("");
        }
예제 #15
0
        public static string selfdestruct(int _userId, int _shipId)
        {
            SpacegameServer.Core.Core core = SpacegameServer.Core.Core.Instance;

            SpacegameServer.Core.Ship ship = core.ships[_shipId];

            if (ship.userid != _userId)
            {
                return("");
            }
            if (ship.isTranscension())
            {
                return("");
            }
            ship.selfDestruct();

            return("");
        }
예제 #16
0
        public static string MovePathFleet(List <int> fleetIds, List <byte> directions, int userId, int attackedShipId = 0)
        {
            SpacegameServer.Core.Core core = SpacegameServer.Core.Core.Instance;

            BC.XMLGroups.MovePathResult Pathresult = new XMLGroups.MovePathResult();
            Pathresult.StepResults = new List <string>();

            foreach (var direction in directions)
            {
                Pathresult.StepResults.Add(MoveFleet(fleetIds, direction, userId, attackedShipId));
            }

            string ret = "";

            //BusinessConnector.Serialize<SpacegameServer.Core.Ship>(ship, ref x);
            BusinessConnector.Serialize <BC.XMLGroups.MovePathResult>(Pathresult, ref ret);


            return(ret);
        }
예제 #17
0
        public static string constructSpaceStation(int shipId, int userId)
        {
            SpacegameServer.Core.Core core = SpacegameServer.Core.Core.Instance;
            //moveShip
            SpacegameServer.Core.Ship ship = core.ships[shipId];
            SpacegameServer.Core.User user = core.users[userId];

            int newShipId = 0;

            var FinishedConstruction = ship.createSpaceStation(user, ref newShipId);

            //core.colonize(ship, user, newname, ref ret);
            //do the action
            //ship.colonize(user, newname, ref ret);

            //calc the xml result
            XMLGroups.MoveResultTree scan = new XMLGroups.MoveResultTree();
            scan.ships    = new List <Core.Ship>();
            scan.stars    = new List <Core.SystemMap>();
            scan.colonies = new List <Core.Colony>();
            if (FinishedConstruction)
            {
                core.getUserScans(ship.userid, core.ships[newShipId], ref scan.ships, ref scan.stars, ref scan.colonies);

                //ship.userid = -1;
                scan.ships.Add(ship);

                //if the scan range of the new base is 0, it is not included so add it to the result manually
                if (!scan.ships.Any(e => e.id == newShipId))
                {
                    scan.ships.Add(core.ships[newShipId]);
                }
            }

            string ret = "";

            BusinessConnector.Serialize <BC.XMLGroups.MoveResultTree>(scan, ref ret);

            return(ret);
        }
예제 #18
0
        public static string transcensionAdd(int shipId, int userId)
        {
            SpacegameServer.Core.Core core = SpacegameServer.Core.Core.Instance;
            //break if the elements
            if ((!core.ships.ContainsKey(shipId)) ||
                (!core.users.ContainsKey(userId)))
            {
                return("");
            }

            //moveShip
            SpacegameServer.Core.Ship ship = core.ships[shipId];
            SpacegameServer.Core.User user = core.users[userId];
            int stationId;

            ship.transcensionAdd(user, out stationId);


            //calc the xml result
            XMLGroups.MoveResultTree scan = new XMLGroups.MoveResultTree();
            scan.ships    = new List <Core.Ship>();
            scan.stars    = new List <Core.SystemMap>();
            scan.colonies = new List <Core.Colony>();

            ship.userid = -1;
            scan.ships.Add(ship);

            if (stationId != 0 && core.ships.ContainsKey(stationId))
            {
                scan.ships.Add(core.ships[stationId]);
            }

            string ret = "";

            BusinessConnector.Serialize <BC.XMLGroups.MoveResultTree>(scan, ref ret);

            return(ret);
        }
예제 #19
0
        public static string refit(int userId, string refitXml)
        {
            SpacegameServer.Core.Core core = SpacegameServer.Core.Core.Instance;
            SpacegameServer.Core.User user = core.users[userId];

            XmlDocument doc = new XmlDocument();

            doc.LoadXml(refitXml);
            string shipString = doc.DocumentElement.SelectSingleNode("/Ship/ShipId").InnerText;
            int    shipId;

            if (!Int32.TryParse(shipString, out shipId))
            {
                return("");
            }

            SpacegameServer.Core.Ship ship = core.ships[shipId];
            if (!ship.refit(refitXml))
            {
                return("");
            }



            //calc the xml result
            XMLGroups.MoveResultTree scan = new XMLGroups.MoveResultTree();
            scan.ships    = new List <Core.Ship>();
            scan.stars    = new List <Core.SystemMap>();
            scan.colonies = new List <Core.Colony>();
            scan.ships.Add(ship);

            string ret = "";

            BusinessConnector.Serialize <BC.XMLGroups.MoveResultTree>(scan, ref ret);

            return(ret);
        }
예제 #20
0
        public static bool acceptTrade(int userId, int senderId, int senderType, int tradeOfferIdInt, int receiverId, int receiverType, ref string output)
        {
            SpacegameServer.Core.Core core = SpacegameServer.Core.Core.Instance;

            SpacegameServer.Core.UserSpaceObject sender   = null;
            SpacegameServer.Core.UserSpaceObject receiver = null;

            if (senderType == 0)
            {
                if (core.ships.ContainsKey(senderId))
                {
                    sender = core.ships[senderId];
                }
            }
            if (senderType == 1)
            {
                if (core.colonies.ContainsKey(senderId))
                {
                    sender = core.colonies[senderId];
                }
            }

            if (receiverType == 0)
            {
                if (core.ships.ContainsKey(receiverId))
                {
                    receiver = core.ships[receiverId];
                }
            }
            if (receiverType == 1)
            {
                if (core.colonies.ContainsKey(receiverId))
                {
                    receiver = core.colonies[receiverId];
                }
            }

            if (sender == null || receiver == null)
            {
                return(false);
            }

            List <Lockable> toLock = new List <Lockable>();

            toLock.Add(sender);
            toLock.Add(receiver);

            if (!LockingManager.lockAllOrSleep(toLock))
            {
                return(false);
            }

            //make changes
            //Core.Instance.dataConnection.deconstructBuilding(userId, buildingId, ref xml);

            //atm : call sql procedure:
            Core.Instance.dataConnection.acceptTrade(userId, senderId, senderType, tradeOfferIdInt, ref output);


            //save changes

            /*
             * List<AsyncSaveable> toSave = new List<AsyncSaveable>();
             * toSave.Add(sender);
             * toSave.Add(receiver);
             * DataConnectors.SqlConnector.saveAsync(toSave);
             */

            // get colony data (goods, later population (colony ships))
            //Core.Instance.dataConnection.getColonyStock(core, colony);
            List <UserSpaceObject> toUpdate = new List <UserSpaceObject>();

            toUpdate.Add(sender);
            toUpdate.Add(receiver);
            Core.Instance.dataConnection.updateStock(toUpdate);

            //unlock
            LockingManager.unlockAll(toLock);


            Core.Instance.DeleteTrade(tradeOfferIdInt);
            return(true);
        }
예제 #21
0
 public CommNode(Core.CommunicationNode node, Core.User user)
 {
     this.node = node;
     this.user = user;
     core      = SpacegameServer.Core.Core.Instance;
 }
예제 #22
0
 public User(int _userId, Core.User user = null)
 {
     userId    = _userId;
     core      = SpacegameServer.Core.Core.Instance;
     this.user = user;
 }
예제 #23
0
 public Message(Core.User user)
 {
     this.user = user;
     core      = SpacegameServer.Core.Core.Instance;
 }
예제 #24
0
        public static bool transfer(int userId,string  transfer, ref string xml)
        {
            SpacegameServer.Core.Core core = SpacegameServer.Core.Core.Instance;

            SpacegameServer.Core.UserSpaceObject sender = null;
            SpacegameServer.Core.UserSpaceObject receiver = null;


            //check XML for sender and receiver
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(transfer);

            //string xml = "<transfer><sender><shipId>1760</shipId><goods></goods></sender><receiver><colonyId>11</colonyId><goods><good><goodsId>50</goodsId><amount>3</amount></good></goods></receiver></transfer>";
            //.SelectSingleNode("/book/title");
            XmlNode senderShipNode = doc.DocumentElement.SelectSingleNode("/transfer/sender/shipId");
            XmlNode senderColonyNode = doc.DocumentElement.SelectSingleNode("/transfer/sender/colonyId");
            XmlNode receiverShipNode = doc.DocumentElement.SelectSingleNode("/transfer/receiver/shipId");
            XmlNode receiverColonyNode = doc.DocumentElement.SelectSingleNode("/transfer/receiver/colonyId");

            int senderUserId = 0, receiverUserId = 0;

            if (senderShipNode != null)
            {
                string sendStr = senderShipNode.InnerText;
                int senderId;
                if (Int32.TryParse(sendStr, out senderId))
                {
                    if (core.ships.ContainsKey(senderId)) { 
                        sender = core.ships[senderId];
                        senderUserId = core.ships[senderId].userid;
                    }
                }
            }
            if (senderColonyNode != null)
            {
                string ColonyStr = senderColonyNode.InnerText;
                int ColonyId;
                if (Int32.TryParse(ColonyStr, out ColonyId))
                {
                    if (core.colonies.ContainsKey(ColonyId))
                    { 
                        sender = core.colonies[ColonyId];
                        senderUserId = core.colonies[ColonyId].userId;
                    }
                }
            }
            if (receiverShipNode != null)
            {
                string receiverStr = receiverShipNode.InnerText;
                int receiverId;
                if (Int32.TryParse(receiverStr, out receiverId))
                {
                    if (core.ships.ContainsKey(receiverId))
                    { 
                        receiver = core.ships[receiverId];
                        receiverUserId = core.ships[receiverId].userid;
                    }
                }
            }
            if (receiverColonyNode != null)
            {
                string receiverStr = receiverColonyNode.InnerText;
                int receiverId;
                if (Int32.TryParse(receiverStr, out receiverId))
                {
                    if (core.colonies.ContainsKey(receiverId))
                    {
                        receiver = core.colonies[receiverId];
                        receiverUserId = core.colonies[receiverId].userId;
                    }
                }
            }
            if (sender == null || receiver == null) return false;

            //check that one does not move cargo from a neutral (0) space station (hullId 201)
            if( sender is Ship)
            {
                var SendShip = (Ship)sender;
                if (SendShip.hullid == 201 && SendShip.userid == 0) return false;
            }
            if (receiver is Ship)
            {
                var RecShip = (Ship)receiver;
                if (RecShip.hullid == 201 && RecShip.userid == 0) return false;
            }


            //test if goods are received:
            var receive = false;
            XmlNode sentNode = doc.DocumentElement.SelectSingleNode("/transfer/sender/goods/good");
            XmlNode receiveNode = doc.DocumentElement.SelectSingleNode("/transfer/receiver/goods/good");
            if (receiveNode != null) receive = true;

            //if trade is between users, and goods are received, check that they are at war           
            if (receive &&  senderUserId != receiverUserId && receiverUserId != 0)
            {
                //check that both are enemies (or player 0  is involved)
                if (receive && Core.Instance.userRelations.getRelation(Core.Instance.users[senderUserId], Core.Instance.users[receiverUserId]) != 0)
                {
                    return false;
                }
            }

            List<Lockable> toLock = new List<Lockable>();
            toLock.Add(sender);
            toLock.Add(receiver);

            if (!LockingManager.lockAllOrSleep(toLock)) return false;

            //make changes
            //Core.Instance.dataConnection.deconstructBuilding(userId, buildingId, ref xml);

            //atm : call sql procedure:
            Core.Instance.dataConnection.transfer(userId, transfer, ref xml);


            //save changes
            /*
            List<AsyncSaveable> toSave = new List<AsyncSaveable>();
            toSave.Add(sender);
            toSave.Add(receiver);
            DataConnectors.SqlConnector.saveAsync(toSave);
            */

            // get colony data (goods, later population (colony ships))
            //Core.Instance.dataConnection.getColonyStock(core, colony);
            List<UserSpaceObject> toUpdate = new List<UserSpaceObject>();
            toUpdate.Add(sender);
            toUpdate.Add(receiver);
            Core.Instance.dataConnection.updateStock(toUpdate);

            //unlock
            LockingManager.unlockAll(toLock);

            

            return true;
        }
예제 #25
0
        public static bool transfer2(int userId, SpacegameServer.Core.Transfer transfer, ref string xml)
        {
            SpacegameServer.Core.Core core = SpacegameServer.Core.Core.Instance;

            SpacegameServer.Core.UserSpaceObject sender = null;
            SpacegameServer.Core.UserSpaceObject receiver = null;
            Ship SenderShip = null;
            Ship TargetShip = null;
            Colony SenderColony = null;
            Colony TargetColony = null;


            int senderUserId = 0;
            int receiverUserId = 0;
            //for sender and receiver
            if (transfer.Sender < 1 || transfer.SenderType < 1 || transfer.TargetType < 1) return false;

            if (transfer.SenderType == 1)
            {
                if (core.ships.ContainsKey(transfer.Sender)) 
                {
                    SenderShip = core.ships[transfer.Sender]; 
                    sender = core.ships[transfer.Sender];
                    senderUserId = SenderShip.userid;
                }
            }
            if (transfer.SenderType == 2)
            {
                if (core.colonies.ContainsKey(transfer.Sender)) 
                {
                    SenderColony = core.colonies[transfer.Sender];
                    sender = core.colonies[transfer.Sender];
                    senderUserId = SenderColony.userId; 
                }
            }

            if (transfer.TargetType == 1)
            {
                if (core.ships.ContainsKey(transfer.Target)) 
                {
                    TargetShip = core.ships[transfer.Target];
                    receiver = core.ships[transfer.Target]; 
                    receiverUserId = core.ships[transfer.Target].userid;
                }
                else
                {
                    
                }
            }
            if (transfer.TargetType == 2)
            {
                if (core.colonies.ContainsKey(transfer.Target)) 
                {
                    TargetColony = core.colonies[transfer.Target]; 
                    receiver = core.colonies[transfer.Target];
                    receiverUserId = TargetColony.userId; 
                }

                //mock a target for srap and recycling actions
                if (transfer.Target < 1)
                {
                    TargetShip = Ship.createTransferMock();
                    receiver = TargetShip;
                    receiverUserId = 0;
                }
            }

            if (sender == null || receiver == null) return false;


            if (!TransferChecks(userId, sender, receiver, transfer, SenderShip, TargetShip, SenderColony, TargetColony)) return false;

            List<Lockable> toLock = new List<Lockable>();
            toLock.Add(sender);
            if (receiver.GetUserId() != 0)
            { 
                toLock.Add(receiver); 
            }

            if (!LockingManager.lockAllOrSleep(toLock)) return false;

            if (!TransferChecks(userId, sender, receiver, transfer, SenderShip, TargetShip, SenderColony, TargetColony)) 
            {
                LockingManager.unlockAll(toLock);
                return false; 
            }

            try
            {

                if (SenderShip != null) SenderShip.RemoveAllTrades();
                if (TargetShip != null) TargetShip.RemoveAllTrades();

                foreach (var transferLine in transfer.Goods)
                {
                    //var Good = Core.Instance.Goods[transferLine.Id];
                    sender.addGood((short)transferLine.Id, -transferLine.Qty);

                    //recycle:
                    if (transfer.Target == 0)
                    {
                        Core.Instance.Goods[transferLine.Id].Recycle(sender, transferLine.Qty);
                    }

                    //add goods if it is not scrapping or rececling...
                    if (TargetShip == null || TargetShip.id > 0) receiver.addGood((short)transferLine.Id, transferLine.Qty);
                }

                //Core.Instance.dataConnection.saveShipGoods(this);
                //core.dataConnection.saveColonyGoods(colony);

                if (SenderShip != null) Core.Instance.dataConnection.saveShipGoods(SenderShip);
                if (TargetShip != null && transfer.Target > 0) Core.Instance.dataConnection.saveShipGoods(TargetShip);

                if (SenderColony != null) Core.Instance.dataConnection.saveColonyGoods(SenderColony);
                if (TargetColony != null && transfer.Target > 0) Core.Instance.dataConnection.saveColonyGoods(TargetColony);

            }
            catch (Exception e)
            {
                Core.Instance.writeExceptionToLog(e);
                return false;
            }
            finally
            {
                //unlock
                LockingManager.unlockAll(toLock);
            }


            return true;
        }
예제 #26
0
        public static bool BuildModules(int userId, SpacegameServer.Core.Transfer transfer, ref string xml)
        {
            SpacegameServer.Core.Core core = SpacegameServer.Core.Core.Instance;

            if (!core.colonies.ContainsKey(transfer.Sender))
            {
                return(false);
            }

            Colony colony = core.colonies[transfer.Sender];

            if (colony.userId != userId)
            {
                return(false);
            }

            User user = Core.Instance.users[userId];

            //check if modules are researched:
            foreach (var moduleLine in transfer.Goods)
            {
                if (moduleLine.Qty < 0)
                {
                    return(false);
                }

                //check that the Module exists
                if (!Core.Instance.Modules.Any(e => e != null && e.goodsId == moduleLine.Id))
                {
                    return(false);
                }

                Module toBuild = Core.Instance.Modules.First(e => e != null && e.goodsId == moduleLine.Id);

                if (!user.hasModuleResearch(toBuild))
                {
                    return(false);
                }
            }

            if (!Modules.checkGoodsAvailability(colony, transfer))
            {
                return(false);
            }

            List <Lockable> elementsToLock = new List <Lockable>(3);

            elementsToLock.Add(colony);

            if (!LockingManager.lockAllOrSleep(elementsToLock))
            {
                return(false);
            }

            try
            {
                if (!Modules.checkGoodsAvailability(colony, transfer))
                {
                    return(false);
                }

                //remove TemplateModules
                foreach (var moduleLine in transfer.Goods)
                {
                    Module toBuild = core.Modules.First(e => e != null && e.goodsId == moduleLine.Id);

                    foreach (var costs in toBuild.ModulesCosts)
                    {
                        colony.addGood(costs.goodsId, -costs.amount * moduleLine.Qty, false);
                    }

                    colony.addGood(toBuild.goodsId, moduleLine.Qty, false);
                }

                Core.Instance.dataConnection.saveColonyGoods(colony);
            }
            catch (Exception ex)
            {
                SpacegameServer.Core.Core.Instance.writeExceptionToLog(ex);
            }
            finally
            {
                //release the ressources and return true
                LockingManager.unlockAll(elementsToLock);
            }

            return(true);
        }
예제 #27
0
        public static string createUpdate(int userId, string templateXml)
        {
            /*
             * <?xml version="1.0" encoding="utf-8" ?>
             * <ShipTemplate>
             * <ShipTemplateId>1</ShipTemplateId>
             * <ShipTemplateHullId>1</ShipTemplateHullId>
             * <name>testName</name>
             * <shipHullsImage>1</shipHullsImage>
             * <gif>scout.png</gif>
             * <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>
             */

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

            XmlDocument doc = new XmlDocument();

            doc.LoadXml(templateXml);



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

            if (!Int32.TryParse(templateIdString, out templateId))
            {
                return("");
            }
            SpacegameServer.Core.ShipTemplate newTemplate = null;
            SpacegameServer.Core.ShipTemplate oldTemplate = null;

            if (!SpacegameServer.Core.ShipTemplate.createUpdate(templateXml, userId, ref newTemplate, ref oldTemplate))
            {
                return("");
            }



            //calc the xml result
            SpacegameServer.BC.XMLGroups.ShipTemplates ShipTemplate = new SpacegameServer.BC.XMLGroups.ShipTemplates();

            ShipTemplate.ShipTemplate.Add(newTemplate);
            if (oldTemplate != null)
            {
                ShipTemplate.ShipTemplate.Add(oldTemplate);
            }

            string ret = "";

            BusinessConnector.Serialize <SpacegameServer.BC.XMLGroups.ShipTemplates>(ShipTemplate, ref ret);

            return(ret);
        }
예제 #28
0
        public static BC.XMLGroups.MoveResultTree MoveFleet2(List <int> fleetIds, byte direction, int userId, int duration = 1, int attackedShipId = 0)
        {
            SpacegameServer.Core.Core   core = SpacegameServer.Core.Core.Instance;
            BC.XMLGroups.MoveResultTree scan = new BC.XMLGroups.MoveResultTree();
            scan.result = 0;

            List <Core.Ship> fleet = new List <Core.Ship>();

            foreach (var shipId in fleetIds)
            {
                if (!core.ships.ContainsKey(shipId))
                {
                    return(scan);
                }
                fleet.Add(core.ships[shipId]);
            }

            if (fleet.Count == 0)
            {
                return(scan);
            }

            byte result = 0;

            //Todo: move kann auch occupyColony zurücksenden
            string combatLog = "";

            //SpacegameServer.Core.Classes.ShipMovement move = new SpacegameServer.Core.Classes.ShipMovement();
            Core.Combat Combat = null;
            SpacegameServer.Core.Ship.MoveFleet(fleet, direction, userId, duration, ref result, ref combatLog, ref Combat, attackedShipId);

            if (Combat != null)
            {
                SpacegameServer.BC.XMLGroups.CombatMessages messages = new SpacegameServer.BC.XMLGroups.CombatMessages();
                messages.messages.Add(Combat);
                combatLog = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(messages);
            }
            //move.move(ship, direction, userId, duration, ref result, ref combatLog);

            /*
             * scanResult scan = new scanResult();
             * scan.ships.ship = new List<Core.Ship>();
             * scan.stars.star = new List<Core.StarMap>();
             * scan.colonies.colony = new List<Core.Colony>();
             *
             *
             * core.getUserScans(ship.userid, ship, ref scan.ships.ship, ref scan.stars.star, ref scan.colonies.colony);
             * scan.result = result;
             * scan.combatLog = combatLog;
             */

            scan.ships    = new List <Core.Ship>();
            scan.stars    = new List <Core.SystemMap>();
            scan.colonies = new List <Core.Colony>();

            var MaxScanrange = fleet.Select(s => s.scanRange).Max();
            var BestScanner  = fleet.First(e => e.scanRange == MaxScanrange);

            core.getUserScans(userId, BestScanner, ref scan.ships, ref scan.stars, ref scan.colonies);

            //user tried to move into an area that was neutral to him
            //fetch the system/colony that creatd the neutral area
            if (result == 31)
            {
                scan.ships    = new List <Core.Ship>();
                scan.stars    = new List <Core.SystemMap>();
                scan.colonies = new List <Core.Colony>();
                core.getAreaCreator(direction, userId, BestScanner, ref scan.ships, ref scan.stars, ref scan.colonies);
            }

            scan.result    = result;
            scan.combatLog = combatLog;



            return(scan);
        }
예제 #29
0
        public static bool build(int userId, int colonyId, int tileNr, short buildingId, ref int newBuildingId)
        {
            SpacegameServer.Core.Core core = SpacegameServer.Core.Core.Instance;

            //check against research
            if (!Core.Instance.users.ContainsKey(userId))
            {
                return(false);
            }
            var User = Core.Instance.users[userId];

            if (!User.hasGameObjectEnabled(3, buildingId))
            {
                return(false);
            }


            Colony colony = core.colonies[colonyId];

            if (colony == null)
            {
                return(false);
            }

            Building template = core.Buildings[buildingId];

            if (template == null)
            {
                return(false);
            }

            //check on building count in case of mines, hydrocarbon, rare chemicals
            if (buildingId == 2 || buildingId == 6)
            {
                if (ColonyBuildingActions.countBuildings(colony, buildingId) >= ColonyBuildingActions.allowedBuildings(colony, buildingId))
                {
                    return(false);
                }
            }

            //check tile position
            if (colony.colonyBuildings.Any(e => e.planetSurfaceId == tileNr))
            {
                return(false);
            }



            // lock colony
            List <Lockable> elementsToLock = new List <Lockable>(1);

            elementsToLock.Add(colony);
            if (!LockingManager.lockAllOrSleep(elementsToLock))
            {
                return(false);
            }

            try
            {
                //userId may have been changed by another thread, so check it again after locking
                if (colony.userId != userId)
                {
                    colony.removeLock();
                    return(false);
                }

                //test ressources on colony
                var costOK = true;
                foreach (var cost in template.BuildingCosts)
                {
                    if (!colony.goods.Any(e => e.goodsId == cost.goodsId))
                    {
                        costOK = false;
                        break;
                    }

                    if (colony.goods.Find(e => e.goodsId == cost.goodsId).amount < cost.amount)
                    {
                        costOK = false;
                        break;
                    }
                }
                if (!costOK)
                {
                    colony.removeLock();
                    return(false);
                }



                if (template.oncePerColony)
                {
                    if (colony.colonyBuildings.Any(e => e.buildingId == template.id))
                    {
                        colony.removeLock();
                        return(false);
                    }
                }

                //Special Ressourcen

                /*
                 * if (template.id > 1029 && template.id < 1035)
                 * {
                 *  var star = Core.Instance.stars[colony.starId];
                 *  if (star.ressourceid != template.id - 1030)
                 *  {
                 *      colony.removeLock();
                 *      return false;
                 *  }
                 * }
                 */

                //Create Building
                var newId = (int)core.identities.colonyBuildingId.getNext();
                newBuildingId = newId;
                var building = new ColonyBuilding(core, newId, colony, template, tileNr, userId);

                /*
                 * var building = new ColonyBuilding(newId);
                 * building.colonyId = colony.id;
                 * building.colony = colony;
                 * building.planetSurfaceId = tileNr;
                 * building.userId = userId;
                 * building.buildingId  = buildingId;
                 * building.isActive = true;
                 * building.underConstruction = false;
                 * building.remainingHitpoint = 100;
                 * building.building = template;
                 * colony.colonyBuildings.Add(building);
                 * Core.Instance.colonyBuildings.Add(newId, building);
                 */


                foreach (var cost in template.BuildingCosts)
                {
                    colony.addGood(cost.goodsId, -cost.amount);
                }


                /*check auf:
                 *          TODO - Feld frei?
                 *          TODO - Forschung
                 */


                //Todo: Scanrange, CommNode
                if (building.buildingId == 51)
                {
                    building.colony.scanRange = Math.Max(building.colony.scanRange, (byte)7);
                    core.dataConnection.saveSingleColony(building.colony);
                }

                if (building.buildingId == 64)
                {
                    building.colony.scanRange = Math.Max(building.colony.scanRange, (byte)9);
                    core.dataConnection.saveSingleColony(building.colony);
                }

                core.dataConnection.saveColonyBuildings(building);
                core.dataConnection.saveColonyGoods(colony);

                CommunicationNode.createCommNodeBuilding(building);

                //Core.Instance.dataConnection.buildBuilding(userId,  colonyId,  tileNr,  buildingId, ref xml);

                // get colony data (goods, later population (colony ships))
                //Core.Instance.dataConnection.getColonyStock(core, colony);
                //Core.Instance.dataConnection.getColonyBuildings(core, colony);
            }
            catch (Exception ex)
            {
                core.writeExceptionToLog(ex);
            }
            finally
            {
                LockingManager.unlockAll(elementsToLock);
            }
            return(true);
        }
예제 #30
0
        public string colonize()
        {
            SpacegameServer.Core.Core core = SpacegameServer.Core.Core.Instance;

            //fetch user and ship objects
            SpacegameServer.Core.Ship ship = core.ships[shipId];
            SpacegameServer.Core.User user = core.users[userId];

            //create result data sctructure
            string ret = "";

            XMLGroups.MoveResultTree scan = new XMLGroups.MoveResultTree();
            scan.ships    = new List <Core.Ship>();
            scan.stars    = new List <Core.SystemMap>();
            scan.colonies = new List <Core.Colony>();

            //fetch planet
            if (!core.stars.ContainsKey((int)ship.systemid))
            {
                return(ret);
            }
            Core.SolarSystemInstance planet = core.stars[(int)ship.systemid].getPlanet(ship.getSystemCoords());
            if (planet == null)
            {
                return(ret);
            }
            if (!user.CanColonize(planet))
            {
                return(ret);
            }
            //var MajorColony =

            //create Colony
            Core.Colony newColony = null;
            if (!ship.colonize(user, newname, ref scan.ships, ref newColony, planet))
            {
                return(ret);
            }

            scan.ships.Add(ship);

            string shipRet = "";

            /*
             * BusinessConnector.Serialize<List<SpacegameServer.Core.Ship>>(scan.ships, ref shipRet, true);
             * //shipRet += ret;
             *
             * // remove </ArrayOfShip> , add ret , add </ArrayOfShip>
             * shipRet = shipRet.Substring(0, shipRet.Length - "</ArrayOfShip>".Length);
             * shipRet = shipRet + ret + "</ArrayOfShip>";
             */
            SpacegameServer.BC.XMLGroups.Colonize response = new XMLGroups.Colonize();
            response.respCode = 1;
            response.Colony   = newColony;
            response.ships    = scan.ships;
            //response.planet = planet;

            response.ColonyPlanet = new XMLGroups.ColonyPlanet(planet.id, planet, planet.surfaceFields);
            //response.planet2 = new XMLGroups.ColonyPlanets();
            //response.planet2
            //response.planets.AddRange(core.planets.Where(e => e.Value.colonyId == colonyId).Select(e => new XMLGroups.ColonyPlanet(e.Value.id, e.Value, e.Value.surfaceFields)));


            BusinessConnector.Serialize <SpacegameServer.BC.XMLGroups.Colonize>(response, ref shipRet, true);

            return(shipRet);
        }