From 5e6dfb61aca1d54a15aaf52299cd8068d611873f Mon Sep 17 00:00:00 2001 From: hondacrx Date: Sun, 29 May 2022 16:00:04 -0400 Subject: [PATCH] [Exploit/Dupe] Container item Port From (https://github.com/TrinityCore/TrinityCore/commit/0910bca34cd36ae17652daef9621c318772270d1) --- .../Database/Databases/CharacterDatabase.cs | 6 +-- Source/Game/Entities/Player/Player.Items.cs | 2 +- Source/Game/Loot/Loot.cs | 2 + Source/Game/Loot/LootItemStorage.cs | 45 ++++++++++--------- 4 files changed, 30 insertions(+), 25 deletions(-) diff --git a/Source/Framework/Database/Databases/CharacterDatabase.cs b/Source/Framework/Database/Databases/CharacterDatabase.cs index dc1b52951..257408e9a 100644 --- a/Source/Framework/Database/Databases/CharacterDatabase.cs +++ b/Source/Framework/Database/Databases/CharacterDatabase.cs @@ -678,10 +678,10 @@ namespace Framework.Database PrepareStatement(CharStatements.DEL_CHAR_CUF_PROFILES, "DELETE FROM character_cuf_profiles WHERE guid = ?"); // Items that hold loot or money - PrepareStatement(CharStatements.SEL_ITEMCONTAINER_ITEMS, "SELECT container_id, item_id, item_count, follow_rules, ffa, blocked, counted, under_threshold, needs_quest, rnd_bonus, context, bonus_list_ids FROM item_loot_items"); + PrepareStatement(CharStatements.SEL_ITEMCONTAINER_ITEMS, "SELECT container_id, item_id, item_count, item_index, follow_rules, ffa, blocked, counted, under_threshold, needs_quest, rnd_bonus, context, bonus_list_ids FROM item_loot_items"); PrepareStatement(CharStatements.DEL_ITEMCONTAINER_ITEMS, "DELETE FROM item_loot_items WHERE container_id = ?"); - PrepareStatement(CharStatements.DEL_ITEMCONTAINER_ITEM, "DELETE FROM item_loot_items WHERE container_id = ? AND item_id = ? AND item_count = ?"); - PrepareStatement(CharStatements.INS_ITEMCONTAINER_ITEMS, "INSERT INTO item_loot_items (container_id, item_id, item_count, follow_rules, ffa, blocked, counted, under_threshold, needs_quest, rnd_bonus, context, bonus_list_ids) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); + PrepareStatement(CharStatements.DEL_ITEMCONTAINER_ITEM, "DELETE FROM item_loot_items WHERE container_id = ? AND item_id = ? AND item_count = ? AND item_index = ?"); + PrepareStatement(CharStatements.INS_ITEMCONTAINER_ITEMS, "INSERT INTO item_loot_items (container_id, item_id, item_count, item_index, follow_rules, ffa, blocked, counted, under_threshold, needs_quest, rnd_bonus, context, bonus_list_ids) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); PrepareStatement(CharStatements.SEL_ITEMCONTAINER_MONEY, "SELECT container_id, money FROM item_loot_money"); PrepareStatement(CharStatements.DEL_ITEMCONTAINER_MONEY, "DELETE FROM item_loot_money WHERE container_id = ?"); PrepareStatement(CharStatements.INS_ITEMCONTAINER_MONEY, "INSERT INTO item_loot_money (container_id, money) VALUES (?, ?)"); diff --git a/Source/Game/Entities/Player/Player.Items.cs b/Source/Game/Entities/Player/Player.Items.cs index 9b74fc08a..1e59305ca 100644 --- a/Source/Game/Entities/Player/Player.Items.cs +++ b/Source/Game/Entities/Player/Player.Items.cs @@ -6018,7 +6018,7 @@ namespace Game.Entities // LootItem is being removed (looted) from the container, delete it from the DB. if (!loot.containerID.IsEmpty()) - Global.LootItemStorage.RemoveStoredLootItemForContainer(loot.containerID.GetCounter(), item.itemid, item.count); + Global.LootItemStorage.RemoveStoredLootItemForContainer(loot.containerID.GetCounter(), item.itemid, item.count, item.itemIndex); } else diff --git a/Source/Game/Loot/Loot.cs b/Source/Game/Loot/Loot.cs index fffe5ab49..7078c2860 100644 --- a/Source/Game/Loot/Loot.cs +++ b/Source/Game/Loot/Loot.cs @@ -109,6 +109,7 @@ namespace Game.Loots public List GetAllowedLooters() { return allowedGUIDs; } public uint itemid; + public uint itemIndex; public uint randomBonusListId; public List BonusListIDs = new(); public ItemContext context; @@ -191,6 +192,7 @@ namespace Game.Loots LootItem generatedLoot = new(item); generatedLoot.context = _itemContext; generatedLoot.count = (byte)Math.Min(count, proto.GetMaxStackSize()); + generatedLoot.itemIndex = lootItems.Count; if (_itemContext != 0) { List bonusListIDs = Global.DB2Mgr.GetDefaultItemBonusTree(generatedLoot.itemid, _itemContext); diff --git a/Source/Game/Loot/LootItemStorage.cs b/Source/Game/Loot/LootItemStorage.cs index 332ae66ef..0cb5e743e 100644 --- a/Source/Game/Loot/LootItemStorage.cs +++ b/Source/Game/Loot/LootItemStorage.cs @@ -50,15 +50,16 @@ namespace Game.Loots LootItem lootItem = new(); lootItem.itemid = result.Read(1); lootItem.count = result.Read(2); - lootItem.follow_loot_rules = result.Read(3); - lootItem.freeforall = result.Read(4); - lootItem.is_blocked = result.Read(5); - lootItem.is_counted = result.Read(6); - lootItem.is_underthreshold = result.Read(7); - lootItem.needs_quest = result.Read(8); - lootItem.randomBonusListId = result.Read(9); - lootItem.context = (ItemContext)result.Read(10); - StringArray bonusLists = new(result.Read(11), ' '); + lootItem.itemIndex = result.Read(3); + lootItem.follow_loot_rules = result.Read(4); + lootItem.freeforall = result.Read(5); + lootItem.is_blocked = result.Read(6); + lootItem.is_counted = result.Read(7); + lootItem.is_underthreshold = result.Read(8); + lootItem.needs_quest = result.Read(9); + lootItem.randomBonusListId = result.Read(10); + lootItem.context = (ItemContext)result.Read(11); + StringArray bonusLists = new(result.Read(12), ' '); foreach (string str in bonusLists) lootItem.BonusListIDs.Add(uint.Parse(str)); @@ -167,12 +168,12 @@ namespace Game.Loots DB.Characters.CommitTransaction(trans); } - public void RemoveStoredLootItemForContainer(ulong containerId, uint itemId, uint count) + public void RemoveStoredLootItemForContainer(ulong containerId, uint itemId, uint count, uint itemIndex) { if (!_lootItemStorage.ContainsKey(containerId)) return; - _lootItemStorage[containerId].RemoveItem(itemId, count); + _lootItemStorage[containerId].RemoveItem(itemId, count, itemIndex); } public void AddNewStoredLoot(Loot loot, Player player) @@ -242,20 +243,21 @@ namespace Game.Loots stmt.AddValue(0, _containerId); stmt.AddValue(1, lootItem.itemid); stmt.AddValue(2, lootItem.count); - stmt.AddValue(3, lootItem.follow_loot_rules); - stmt.AddValue(4, lootItem.freeforall); - stmt.AddValue(5, lootItem.is_blocked); - stmt.AddValue(6, lootItem.is_counted); - stmt.AddValue(7, lootItem.is_underthreshold); - stmt.AddValue(8, lootItem.needs_quest); - stmt.AddValue(9, lootItem.randomBonusListId); - stmt.AddValue(10, (uint)lootItem.context); + stmt.AddValue(3, lootItem.itemIndex); + stmt.AddValue(4, lootItem.follow_loot_rules); + stmt.AddValue(5, lootItem.freeforall); + stmt.AddValue(6, lootItem.is_blocked); + stmt.AddValue(7, lootItem.is_counted); + stmt.AddValue(8, lootItem.is_underthreshold); + stmt.AddValue(9, lootItem.needs_quest); + stmt.AddValue(10, lootItem.randomBonusListId); + stmt.AddValue(11, (uint)lootItem.context); StringBuilder bonusListIDs = new(); foreach (int bonusListID in lootItem.BonusListIDs) bonusListIDs.Append(bonusListID + ' '); - stmt.AddValue(11, bonusListIDs.ToString()); + stmt.AddValue(12, bonusListIDs.ToString()); trans.Append(stmt); } @@ -284,7 +286,7 @@ namespace Game.Loots DB.Characters.Execute(stmt); } - public void RemoveItem(uint itemId, uint count) + public void RemoveItem(uint itemId, uint count, uint itemIndex) { var bounds = _lootItems.LookupByKey(itemId); foreach (var itr in bounds) @@ -301,6 +303,7 @@ namespace Game.Loots stmt.AddValue(0, _containerId); stmt.AddValue(1, itemId); stmt.AddValue(2, count); + stmt.AddValue(3, itemIndex); DB.Characters.Execute(stmt); }