Exemplo n.º 1
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;
        }
Exemplo n.º 2
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);
        }
Exemplo n.º 3
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;
        }