示例#1
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;
        }