/// <summary> /// Adds an item to the tradewindow /// </summary> /// <param name="itemForTrade">InventoryItem to add</param> /// <returns>true if added</returns> public bool AddItemToTrade(InventoryItem itemForTrade) { lock (Sync) { // allow admin and gm account opened windows to trade any item if (this.m_owner.Client.Account.PrivLevel == 1) { if (!itemForTrade.IsDropable || !itemForTrade.IsPickable || itemForTrade.IsNotLosingDur || !itemForTrade.IsTradable) { return(false); } } if (TradeItems.Contains(itemForTrade)) { return(false); } if (TradeItems.Count >= MAX_ITEMS) { TradeUpdate(); return(false); } TradeItems.Add(itemForTrade); TradeUpdate(); return(true); } }
public async void IDLoaderLoop() { while (true) { var queue = _messageQueue.DequeueChunk(10).ToList(); if (queue.Any()) { var result = await _exileEngine.FetchAsync(queue); if (result != null) { var items = result.Result; items.Reverse(); foreach (var item in items) { TradeItems.Insert(0, item); if (TradeItems.Count > 100) { TradeItems.RemoveAt(TradeItems.Count - 1); } } } } await Task.Delay(1000); } // ReSharper disable once FunctionNeverReturns }
/// <summary> /// Adds an item to the tradewindow /// </summary> /// <param name="itemForTrade">InventoryItem to add</param> /// <returns>true if added</returns> public bool AddItemToTrade(InventoryItem itemForTrade) { lock (Sync) { if (!itemForTrade.IsDropable || !itemForTrade.IsPickable || itemForTrade.IsNotLosingDur) { return(false); } if (TradeItems.Contains(itemForTrade)) { return(false); } if (TradeItems.Count >= MAX_ITEMS) { TradeUpdate(); return(false); } TradeItems.Add(itemForTrade); TradeUpdate(); return(true); } }
// 08 03 public void OnTradeItem(SagaMap.Packets.Client.GetTradeItem p) { if (this.state != SESSION_STATE.MAP_LOADED) { return; } if (this.Char.trading != Trading.TRADING) { return; } byte Tradeslot = p.GetSlot(); byte ItemIndex = p.GetItem(); byte quantity = p.GetQuantity(); byte status; //Lookup trade items information from character's inventory Item TradeItem = this.Char.inv.GetItem(CONTAINER_TYPE.INVENTORY, ItemIndex); if (quantity > TradeItem.stack) { quantity = TradeItem.stack; } TradeItem = new Item(TradeItem.id, TradeItem.creatorName, TradeItem.durability, TradeItem.stack);// make sure it's a different instance than the old one if (this.Char.trading == Trading.TRADING) { if (!TradeItem.tradeAble) { this.SendTradeResult(TradeResults.NOT_TRADEABLE); status = 9; } else { status = 0; // Add item to chars list of items to trade try { TradeItems.Add(TradeItem, quantity); } catch { } Logger.ShowInfo("Trade item added", null); //Send info about item to clients Packets.Server.TradeItem sendPacket = new SagaMap.Packets.Server.TradeItem(); sendPacket.SetTradeSlot(Tradeslot); sendPacket.SetItemIndex(ItemIndex); sendPacket.SetQuantity(quantity); sendPacket.SetStatus(status); netIO.SendPacket(sendPacket, this.SessionID); ActorPC target = (ActorPC)map.GetActor(this.Char.TradeTarget); if (target == null) { return; } target.e.OnTradeItem(Tradeslot, TradeItem); } } }
public void Handle(POESESSIDChangedEvent message) { List <ExileTradeWebSocketSetting> tempSettings = null; TradeItems.Clear(); WebSockets.Clear(); if (_exileWebSocketManager != null) { _exileWebSocketManager.OnLogMessageEvent -= OnLogMessage; _exileWebSocketManager.OnNewIdRecievedEvent -= OnNewIdRecieved; _exileWebSocketManager.OnWebSocketConnectedEvent -= OnWebSocketConnected; _exileWebSocketManager.OnWebSocketDisconnectedEvent -= OnWebSocketDisconnected; tempSettings = _exileWebSocketManager.Settings(); _exileWebSocketManager.Dispose(); _exileWebSocketManager = null; } if (!string.IsNullOrWhiteSpace(message.NewValue)) { IsEnabled = true; _exileWebSocketManager = new ExileTradeWebSocketManager(19, message.NewValue, Settings.Default.UserAgent); _exileWebSocketManager.OnLogMessageEvent += OnLogMessage; _exileWebSocketManager.OnNewIdRecievedEvent += OnNewIdRecieved; _exileWebSocketManager.OnWebSocketConnectedEvent += OnWebSocketConnected; _exileWebSocketManager.OnWebSocketDisconnectedEvent += OnWebSocketDisconnected; if (tempSettings != null) { AddRange(tempSettings); } else if (File.Exists(SAVE_FILE)) { try { var des = JsonConvert.DeserializeObject <List <ExileTradeWebSocketSetting> >(File.ReadAllText(SAVE_FILE)); AddRange(des); } catch (JsonSerializationException) { // Ignore } } } else { IsEnabled = false; } }
/// <summary> /// Removes an item from the tradewindow /// </summary> /// <param name="itemToRemove"></param> public void RemoveItemToTrade(InventoryItem itemToRemove) { if (itemToRemove == null) { return; } lock (Sync) { TradeItems.Remove(itemToRemove); if (!m_tradeAccept || !m_partnerWindow.m_tradeAccept) { TradeUpdate(); } } }
void CreateReadOnlyTradeItemCollection() { if (TradeItems != null) { TradeItems.Dispose(); } TradeItems = ViewModelHelper.CreateReadOnlyDispatcherCollection( CurrentProduct.TradeItems, x => { var vm = new TradeItemViewModel(); vm.Initialize(x); return(vm); }, DispatcherHelper.UIDispatcher); }
public void ClearTradeItems() { TradeItems.Clear(); }
/// <summary> /// Called each time a player push the accept button to accept the trade /// </summary> public bool AcceptTrade() { lock (Sync) { m_tradeAccept = true; GamePlayer partner = m_partnerWindow.Owner; partner.Out.SendMessage(m_owner.Name + " has accepted the trade.", eChatType.CT_System, eChatLoc.CL_SystemWindow); // Check if the tradepartner has also agreed to the trade if (!m_partnerWindow.m_tradeAccept) { return(false); } bool logTrade = ServerProperties.Properties.LOG_TRADES; if (m_owner.Client.Account.PrivLevel > 1 || partner.Client.Account.PrivLevel > 1) { logTrade = true; } //Test if we and our partner have enough money bool enoughMoney = m_owner.RemoveMoney(TradeMoney); bool partnerEnoughMoney = partner.RemoveMoney(m_partnerWindow.TradeMoney); //Check the preconditions if (!enoughMoney || !partnerEnoughMoney) { if (!enoughMoney) { //Reset the money if we don't have enough TradeMoney = 0; if (partnerEnoughMoney) { partner.AddMoney(m_partnerWindow.TradeMoney); InventoryLogging.LogInventoryAction(partner, m_owner, eInventoryActionType.Trade, m_partnerWindow.TradeMoney); } m_owner.Out.SendMessage("You don't have enough money.", eChatType.CT_Merchant, eChatLoc.CL_SystemWindow); partner.Out.SendMessage(m_owner.Name + " doesn't have enough money.", eChatType.CT_Merchant, eChatLoc.CL_SystemWindow); } if (!partnerEnoughMoney) { //Reset the money if our partner doesn't have enough m_partnerWindow.TradeMoney = 0; if (enoughMoney) { m_owner.AddMoney(TradeMoney); InventoryLogging.LogInventoryAction(m_owner, partner, eInventoryActionType.Trade, TradeMoney); } partner.Out.SendMessage("You don't have enough money.", eChatType.CT_Merchant, eChatLoc.CL_SystemWindow); m_owner.Out.SendMessage(partner.Name + " doesn't have enough money.", eChatType.CT_Merchant, eChatLoc.CL_SystemWindow); } //Update our tradewindow and return TradeUpdate(); return(false); } if (m_combine == true) { GamePlayer crafter = (m_recipiant == true ? m_owner : partner); // -------------------------------------------------------------- // Luhz Crafting Update: // Players may now have any, and all, "primary" crafting skills. // AbstractCraftingSkill skill = CraftingMgr.getSkillbyEnum(crafter.CraftingPrimarySkill); AbstractCraftingSkill skill = null; lock (crafter.TradeWindow.Sync) { foreach (InventoryItem i in (ArrayList)crafter.TradeWindow.TradeItems.Clone()) { if (i.Object_Type == (int)eObjectType.AlchemyTincture) { if (m_owner.GetCraftingSkillValue(eCraftingSkill.Alchemy) > 0) { skill = CraftingMgr.getSkillbyEnum(eCraftingSkill.Alchemy); break; } } else if (i.Object_Type == (int)eObjectType.SpellcraftGem) { if (crafter.GetCraftingSkillValue(eCraftingSkill.SpellCrafting) > 0) { skill = CraftingMgr.getSkillbyEnum(eCraftingSkill.SpellCrafting); break; } } } } // -------------------------------------------------------------- if (skill != null && skill is AdvancedCraftingSkill) { ((AdvancedCraftingSkill)skill).CombineItems(crafter); } } else if (m_repair == true) { GamePlayer crafter = (m_recipiant == true ? m_owner : partner); InventoryItem itemToRepair = (InventoryItem)(m_recipiant == true ? m_partnerWindow.TradeItems[0] : TradeItems[0]); if (itemToRepair != null) { crafter.RepairItem(itemToRepair); } } else { //Calculate the count of items int myTradeItemsCount = m_tradeItems.Count; int partnerTradeItemsCount = m_partnerWindow.TradeItems.Count; //Test if we and our partner have enough space in inventory int mySpaceNeeded = Math.Max(0, partnerTradeItemsCount - myTradeItemsCount); int partnerSpaceNeeded = Math.Max(0, myTradeItemsCount - partnerTradeItemsCount); bool enoughSpace = m_owner.Inventory.IsSlotsFree(mySpaceNeeded, eInventorySlot.FirstBackpack, eInventorySlot.LastBackpack); bool partnerEnoughSpace = partner.Inventory.IsSlotsFree(partnerSpaceNeeded, eInventorySlot.FirstBackpack, eInventorySlot.LastBackpack); //Check the preconditions if (!enoughSpace || !partnerEnoughSpace) { if (!enoughSpace) { m_owner.Out.SendMessage("You don't have enough space in your inventory.", eChatType.CT_Merchant, eChatLoc.CL_SystemWindow); partner.Out.SendMessage(m_owner.Name + " doesn't have enough space in his inventory.", eChatType.CT_Merchant, eChatLoc.CL_SystemWindow); } if (!partnerEnoughSpace) { partner.Out.SendMessage("You don't have enough space in your inventory.", eChatType.CT_Merchant, eChatLoc.CL_SystemWindow); m_owner.Out.SendMessage(partner.Name + " doesn't have enough space in his inventory.", eChatType.CT_Merchant, eChatLoc.CL_SystemWindow); } //Update our tradewindow and return TradeUpdate(); //This was already removed above, needs to be returned to the players on trade failure. m_owner.AddMoney(TradeMoney); partner.AddMoney(m_partnerWindow.TradeMoney); return(false); } //Now transfer everything m_owner.Inventory.BeginChanges(); partner.Inventory.BeginChanges(); m_changesCount++; m_partnerWindow.m_changesCount++; // must be cloned because Inventory.RemoveItem removes it from trade window ArrayList ownerTradeItems = (ArrayList)TradeItems.Clone(); ArrayList partnerTradeItems = (ArrayList)m_partnerWindow.TradeItems.Clone(); // remove all items first to make sure there is enough space // if inventory is full but removed items count >= received count foreach (InventoryItem item in ownerTradeItems) { lock (m_owner.Inventory) { if (!m_owner.Inventory.RemoveTradeItem(item)) { if (logTrade) { GameServer.Instance.LogGMAction(" NOTItem: " + m_owner.Name + "(" + m_owner.Client.Account.Name + ") -> " + partner.Name + "(" + partner.Client.Account.Name + ") : " + item.Name + "(" + item.Id_nb + ")"); } //BOT.Ban(m_owner, "Trade Hack"); //BOT.Ban(partner, "Trade Hack"); return(false); } } } foreach (InventoryItem item in partnerTradeItems) { lock (partner.Inventory) { if (!partner.Inventory.RemoveTradeItem(item)) { if (logTrade) { GameServer.Instance.LogGMAction(" NOTItem: " + m_owner.Name + "(" + m_owner.Client.Account.Name + ") -> " + partner.Name + "(" + partner.Client.Account.Name + ") : " + item.Name + "(" + item.Id_nb + ")"); } //BOT.Ban(m_owner, "Trade Hack"); //BOT.Ban(partner, "Trade Hack"); return(false); } } } foreach (InventoryItem item in ownerTradeItems) { if (m_owner.Guild != partner.Guild) { item.Emblem = 0; } bool tradeSuccess = false; if (item.IsDeleted) { tradeSuccess = partner.Inventory.AddItem(eInventorySlot.FirstEmptyBackpack, item); } else { tradeSuccess = partner.Inventory.AddTradeItem(eInventorySlot.FirstEmptyBackpack, item); } if (!tradeSuccess) { log.Error("Trade item was not added to Partner first free slot. Owner = " + m_owner.Name + ", Partner = " + partner.Name + "; Item = " + item.Id_nb); } else { InventoryLogging.LogInventoryAction(m_owner, partner, eInventoryActionType.Trade, item.Template, item.Count); if (logTrade) { GameServer.Instance.LogGMAction(" Item: " + m_owner.Name + "(" + m_owner.Client.Account.Name + ") -> " + partner.Name + "(" + partner.Client.Account.Name + ") : " + item.Name + "(" + item.Id_nb + ")"); } } } foreach (InventoryItem item in partnerTradeItems) { if (m_owner.Guild != partner.Guild) { item.Emblem = 0; } bool tradeSuccess = false; if (item.IsDeleted) { tradeSuccess = m_owner.Inventory.AddItem(eInventorySlot.FirstEmptyBackpack, item); } else { tradeSuccess = m_owner.Inventory.AddTradeItem(eInventorySlot.FirstEmptyBackpack, item); } if (!tradeSuccess) { log.Error("Trade item was not added to Owner first free slot. Owner = " + m_owner.Name + ", Partner = " + partner.Name + "; Item = " + item.Id_nb); } else { InventoryLogging.LogInventoryAction(partner, m_owner, eInventoryActionType.Trade, item.Template, item.Count); if (logTrade) { GameServer.Instance.LogGMAction(" Item: " + partner.Name + "(" + partner.Client.Account.Name + ") -> " + m_owner.Name + "(" + m_owner.Client.Account.Name + ") : " + item.Name + "(" + item.Id_nb + ")"); } } } m_owner.Inventory.CommitChanges(); partner.Inventory.CommitChanges(); m_changesCount--; m_partnerWindow.m_changesCount--; m_owner.Out.SendMessage("Trade Completed. " + myTradeItemsCount + " items for " + partnerTradeItemsCount + " items.", eChatType.CT_System, eChatLoc.CL_SystemWindow); partner.Out.SendMessage("Trade Completed. " + partnerTradeItemsCount + " items for " + myTradeItemsCount + " items.", eChatType.CT_System, eChatLoc.CL_SystemWindow); m_owner.Inventory.SaveIntoDatabase(m_owner.InternalID); partner.Inventory.SaveIntoDatabase(partner.InternalID); } if (logTrade) { if (m_partnerWindow.TradeMoney > 0) { GameServer.Instance.LogGMAction(" Money: " + partner.Name + "(" + partner.Client.Account.Name + ") -> " + m_owner.Name + "(" + m_owner.Client.Account.Name + ") : " + m_partnerWindow.TradeMoney + "coppers"); } if (TradeMoney > 0) { GameServer.Instance.LogGMAction(" Money: " + m_owner.Name + "(" + m_owner.Client.Account.Name + ") -> " + partner.Name + "(" + partner.Client.Account.Name + ") : " + TradeMoney + "coppers"); } } if (TradeMoney > 0 || m_partnerWindow.TradeMoney > 0) { //Now add the money m_owner.AddMoney(m_partnerWindow.TradeMoney, "You get {0}."); partner.AddMoney(TradeMoney, "You get {0}."); InventoryLogging.LogInventoryAction(m_owner, partner, eInventoryActionType.Trade, TradeMoney); InventoryLogging.LogInventoryAction(partner, m_owner, eInventoryActionType.Trade, m_partnerWindow.TradeMoney); m_owner.SaveIntoDatabase(); partner.SaveIntoDatabase(); } CloseTrade(); // Close the Trade Window return(true); } }
public override void OnPlayerBuy(GamePlayer player, int item_slot, int number) { if (m_moneyItem == null || m_moneyItem.Item == null) { return; } // Get the template int pagenumber = item_slot / MerchantTradeItems.MAX_ITEM_IN_TRADEWINDOWS; int slotnumber = item_slot % MerchantTradeItems.MAX_ITEM_IN_TRADEWINDOWS; ItemTemplate template = TradeItems.GetItem(pagenumber, (eMerchantWindowSlot)slotnumber); if (template == null) { return; } // Calculate the amout of items int amountToBuy = number; if (template.PackSize > 0) { amountToBuy *= template.PackSize; } if (amountToBuy <= 0) { return; } // Calculate the value of items long totalValue = number * template.Price; lock (player.Inventory) { if (player.Inventory.CountItemTemplate(m_moneyItem.Item.Id_nb, eInventorySlot.FirstBackpack, eInventorySlot.LastBackpack) < totalValue) { player.Out.SendMessage(LanguageMgr.GetTranslation(player.Client.Account.Language, "GameMerchant.OnPlayerBuy.YouNeed2", totalValue, MoneyItemName), eChatType.CT_System, eChatLoc.CL_SystemWindow); return; } if (!player.Inventory.AddTemplate(GameInventoryItem.Create(template), amountToBuy, eInventorySlot.FirstBackpack, eInventorySlot.LastBackpack)) { player.Out.SendMessage(LanguageMgr.GetTranslation(player.Client.Account.Language, "GameMerchant.OnPlayerBuy.NotInventorySpace"), eChatType.CT_System, eChatLoc.CL_SystemWindow); return; } InventoryLogging.LogInventoryAction(this, player, eInventoryActionType.Merchant, template, amountToBuy); // Generate the buy message string message; if (amountToBuy > 1) { message = LanguageMgr.GetTranslation(player.Client.Account.Language, "GameMerchant.OnPlayerBuy.BoughtPieces2", amountToBuy, template.GetName(1, false), totalValue, MoneyItemName); } else { message = LanguageMgr.GetTranslation(player.Client.Account.Language, "GameMerchant.OnPlayerBuy.Bought2", template.GetName(1, false), totalValue, MoneyItemName); } var items = player.Inventory.GetItemRange(eInventorySlot.FirstBackpack, eInventorySlot.LastBackpack); int removed = 0; foreach (InventoryItem item in items) { if (item.Id_nb != m_moneyItem.Item.Id_nb) { continue; } int remFromStack = Math.Min(item.Count, (int)(totalValue - removed)); player.Inventory.RemoveCountFromStack(item, remFromStack); InventoryLogging.LogInventoryAction(player, this, eInventoryActionType.Merchant, item.Template, remFromStack); removed += remFromStack; if (removed == totalValue) { break; } } player.Out.SendInventoryItemsUpdate(items); player.Out.SendMessage(message, eChatType.CT_Merchant, eChatLoc.CL_SystemWindow); } }
public override void OnPlayerBuy(GamePlayer player, int item_slot, int number) { // Get the template int pagenumber = item_slot / MerchantTradeItems.MAX_ITEM_IN_TRADEWINDOWS; int slotnumber = item_slot % MerchantTradeItems.MAX_ITEM_IN_TRADEWINDOWS; ItemTemplate template = TradeItems.GetItem(pagenumber, (eMerchantWindowSlot)slotnumber); if (template == null) { return; } // Calculate the amout of items int amountToBuy = number; if (template.PackSize > 0) { amountToBuy *= template.PackSize; } if (amountToBuy <= 0) { return; } // Calculate the value of items long totalValue = number * template.Price; lock (player.Inventory) { if (player.BountyPoints < totalValue) { player.Out.SendMessage(LanguageMgr.GetTranslation(player.Client.Account.Language, "GameMerchant.OnPlayerBuy.YouNeedBP", totalValue), eChatType.CT_System, eChatLoc.CL_SystemWindow); return; } if (!player.Inventory.AddTemplate(GameInventoryItem.Create(template), amountToBuy, eInventorySlot.FirstBackpack, eInventorySlot.LastBackpack)) { player.Out.SendMessage(LanguageMgr.GetTranslation(player.Client.Account.Language, "GameMerchant.OnPlayerBuy.NotInventorySpace"), eChatType.CT_System, eChatLoc.CL_SystemWindow); return; } InventoryLogging.LogInventoryAction(this, player, eInventoryActionType.Merchant, template, amountToBuy); // Generate the buy message string message; if (number > 1) { message = LanguageMgr.GetTranslation(player.Client.Account.Language, "GameMerchant.OnPlayerBuy.BoughtPiecesBP", totalValue, template.GetName(1, false)); } else { message = LanguageMgr.GetTranslation(player.Client.Account.Language, "GameMerchant.OnPlayerBuy.BoughtBP", template.GetName(1, false), totalValue); } player.BountyPoints -= totalValue; player.Out.SendUpdatePoints(); player.Out.SendMessage(message, eChatType.CT_Merchant, eChatLoc.CL_SystemWindow); } }