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