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; }