//storage => base => public container -> owner character public void ReturnToLocalPublicContainer(out VolumeWrapperContainer volumeWrapperContainer, out PublicContainer publicContainer) { GetLocalPublicContainer(ownercharacter, out volumeWrapperContainer, ownercharacter, out publicContainer); publicContainer.AddItem(volumeWrapperContainer, false); volumeWrapperContainer.Owner = ownercharacter.Eid; volumeWrapperContainer.ClearAssignmentId(); volumeWrapperContainer.Save(); }
public void GiveToVolunteer(out VolumeWrapperContainer volumeWrapperContainer, out PublicContainer publicContainer) { if (volunteercharacter == Character.None) { throw new PerpetuumException(ErrorCodes.WTFErrorMedicalAttentionSuggested); } GetLocalPublicContainer(ownercharacter, out volumeWrapperContainer, volunteercharacter, out publicContainer); volumeWrapperContainer.Owner = volunteercharacter.Eid; publicContainer.AddItem(volumeWrapperContainer, false); volumeWrapperContainer.Save(); }
private static void AdministerDelivery(TransportAssignment transportAssignmentInfo, VolumeWrapperContainer volumeWrapperContainer, PublicContainer container) { //normal procedure //successful delivery transportAssignmentInfo.PayOutReward(); volumeWrapperContainer.ReloadItems(transportAssignmentInfo.volunteercharacter); volumeWrapperContainer.PrintDebug(); container.AddItem(volumeWrapperContainer, transportAssignmentInfo.ownercharacter.Eid, false); volumeWrapperContainer.Owner = transportAssignmentInfo.ownercharacter.Eid; volumeWrapperContainer.ClearAssignmentId(); volumeWrapperContainer.Save(); volumeWrapperContainer.PrintDebug(); //owner transportAssignmentInfo.WriteLog(TransportAssignmentEvent.deliver, container.Parent); transportAssignmentInfo.DeleteFromDb(); transportAssignmentInfo.SendDeliveryMessage(container); }
// A sell order was found so the deal is done instantly public void FulfillBuyOrderInstantly(Character buyer, bool useBuyerCorporationWallet, MarketOrder marketSellOrder, double pricePerPiece, int duration, int quantity, PublicContainer publicContainer, long?forMembersOf) { var forCorporation = forMembersOf != null; var seller = Character.GetByEid(marketSellOrder.submitterEID); Item itemOnMarket; if (!marketSellOrder.isVendorItem) { //the seller is NOT a vendor itemOnMarket = GetItemByMarketOrder(marketSellOrder); seller.ThrowIfEqual(null, ErrorCodes.CharacterNotFound); if (itemOnMarket.Quantity > quantity) { // unstack a fraction var fractionItem = itemOnMarket.Unstack(quantity); fractionItem.Owner = buyer.Eid; // save the remaining item itemOnMarket.Save(); // add to public container and change owner publicContainer.AddItem(fractionItem, true); //the remaining amount marketSellOrder.quantity = itemOnMarket.Quantity; // update remaining amount _orderRepository.UpdateQuantity(marketSellOrder); //cash in _marketHelper.CashIn(buyer, useBuyerCorporationWallet, marketSellOrder.price, marketSellOrder.itemDefinition, quantity, TransactionType.marketBuy); //pay out this.PayOutToSeller(seller, marketSellOrder.useCorporationWallet, itemOnMarket.Definition, marketSellOrder.price, quantity, TransactionType.marketSell, marketSellOrder.IsAffectsAverage(), forCorporation); } else if (itemOnMarket.Quantity == quantity) { itemOnMarket.Owner = buyer.Eid; // add to public container and change owner publicContainer.AddItem(itemOnMarket, true); //delete the sell order coz it's done _orderRepository.Delete(marketSellOrder); //cash in _marketHelper.CashIn(buyer, useBuyerCorporationWallet, marketSellOrder.price, marketSellOrder.itemDefinition, quantity, TransactionType.marketBuy); //pay out this.PayOutToSeller(seller, marketSellOrder.useCorporationWallet, itemOnMarket.Definition, marketSellOrder.price, quantity, TransactionType.marketSell, marketSellOrder.IsAffectsAverage(), forCorporation); marketSellOrder.quantity = 0; //signal the sell order delete to the client } else if (itemOnMarket.Quantity < quantity) { //a part of the buy order is fulfilled immediately itemOnMarket.Owner = buyer.Eid; // add to public container and change owner publicContainer.AddItem(itemOnMarket, true); _orderRepository.Delete(marketSellOrder); // create a buy order for the rest of the quantity var newBuyOrder = CreateBuyOrder(buyer, marketSellOrder.itemDefinition, duration, pricePerPiece, quantity - itemOnMarket.Quantity, marketSellOrder.useCorporationWallet, forMembersOf); // cash in for the actual transaction _marketHelper.CashIn(buyer, useBuyerCorporationWallet, marketSellOrder.price, marketSellOrder.itemDefinition, itemOnMarket.Quantity, TransactionType.marketBuy); // cash in for the deposit - for the rest of the quantity _marketHelper.CashIn(buyer, useBuyerCorporationWallet, pricePerPiece, marketSellOrder.itemDefinition, quantity - itemOnMarket.Quantity, TransactionType.buyOrderDeposit); AddCentralBank(TransactionType.buyOrderDeposit, pricePerPiece * (quantity - itemOnMarket.Quantity)); //pay out for the current market item this.PayOutToSeller(seller, marketSellOrder.useCorporationWallet, itemOnMarket.Definition, marketSellOrder.price, itemOnMarket.Quantity, TransactionType.marketSell, marketSellOrder.IsAffectsAverage(), forCorporation); marketSellOrder.quantity = 0; //signal to the client //the item he just bought, the sell order update //the new buy order Message.Builder.SetCommand(Commands.MarketBuyOrderCreated) .WithData(new Dictionary <string, object> { { k.buyOrder, newBuyOrder.ToDictionary() } }) .ToCharacter(buyer) .Send(); } Market.SendMarketItemBoughtMessage(buyer, itemOnMarket); Message.Builder.SetCommand(Commands.MarketSellOrderUpdate) .WithData(new Dictionary <string, object> { { k.sellOrder, marketSellOrder.ToDictionary() } }) .ToCharacters(seller, buyer) .Send(); return; } //check VENDOR sell order's quantity if (marketSellOrder.quantity > 0) { //finite order cases var boughtQuantity = quantity; if (marketSellOrder.quantity == quantity) { _orderRepository.Delete(marketSellOrder); marketSellOrder.quantity = 0; //signal client } else if (marketSellOrder.quantity > quantity) { marketSellOrder.quantity -= quantity; //signal client _orderRepository.UpdateQuantity(marketSellOrder); } else if (marketSellOrder.quantity < quantity) { _orderRepository.Delete(marketSellOrder); boughtQuantity = marketSellOrder.quantity; //create buyorder for the rest of the quantity var buyOrder = CreateBuyOrder(buyer, marketSellOrder.itemDefinition, duration, pricePerPiece, quantity - marketSellOrder.quantity, marketSellOrder.useCorporationWallet, forMembersOf); Message.Builder.SetCommand(Commands.MarketBuyOrderCreated) .WithData(new Dictionary <string, object> { { k.item, buyOrder.ToDictionary() } }) .ToCharacter(buyer) .Send(); marketSellOrder.quantity = 0; //signal client //cash in deposit _marketHelper.CashIn(buyer, useBuyerCorporationWallet, pricePerPiece, marketSellOrder.itemDefinition, quantity - boughtQuantity, TransactionType.buyOrderDeposit); AddCentralBank(TransactionType.buyOrderDeposit, pricePerPiece * (quantity - boughtQuantity)); } //take the money for the quantity bought _marketHelper.CashIn(buyer, useBuyerCorporationWallet, marketSellOrder.price, marketSellOrder.itemDefinition, boughtQuantity, TransactionType.marketBuy); Message.Builder.SetCommand(Commands.MarketSellOrderUpdate) .WithData(new Dictionary <string, object> { { k.sellOrder, marketSellOrder.ToDictionary() } }) .ToCharacter(buyer) .Send(); // vendor stuff itemOnMarket = publicContainer.CreateAndAddItem(marketSellOrder.itemDefinition, false, item => { item.Owner = buyer.Eid; item.Quantity = boughtQuantity; }); Market.SendMarketItemBoughtMessage(buyer, itemOnMarket); //average price _marketHandler.InsertAveragePrice(this, marketSellOrder.itemDefinition, boughtQuantity * marketSellOrder.price, boughtQuantity); AddCentralBank(TransactionType.marketBuy, boughtQuantity * pricePerPiece); //vendor income return; } //infinite quantity case _marketHelper.CashIn(buyer, useBuyerCorporationWallet, marketSellOrder.price, marketSellOrder.itemDefinition, quantity, TransactionType.marketBuy); itemOnMarket = publicContainer.CreateAndAddItem(marketSellOrder.itemDefinition, false, item => { item.Owner = buyer.Eid; item.Quantity = quantity; }); Market.SendMarketItemBoughtMessage(buyer, itemOnMarket); //average price _marketHandler.InsertAveragePrice(this, marketSellOrder.itemDefinition, quantity * marketSellOrder.price, quantity); AddCentralBank(TransactionType.marketBuy, quantity * pricePerPiece); //vendor income }