From 40ed3570431584d96767165f6863dea239e1a12b Mon Sep 17 00:00:00 2001 From: hondacrx Date: Mon, 2 Dec 2019 13:21:01 -0500 Subject: [PATCH] Core/Items: Add location filters to Player.GetItemByEntry Port From (https://github.com/TrinityCore/TrinityCore/commit/96575e33bb6992e6906e02427f20c58af674bdaa) --- Source/Framework/Constants/PlayerConst.cs | 13 ++- Source/Game/Achievements/CriteriaHandler.cs | 12 +-- Source/Game/Entities/GameObject/GameObject.cs | 2 +- Source/Game/Entities/Player/Player.Items.cs | 102 ++++++++++++------ Source/Game/Entities/Player/Player.Talents.cs | 2 +- Source/Game/Entities/Player/Player.cs | 2 +- Source/Game/Handlers/AzeriteHandler.cs | 6 +- Source/Game/Handlers/InspectHandler.cs | 2 +- Source/Game/Spells/SpellEffects.cs | 2 +- 9 files changed, 98 insertions(+), 45 deletions(-) diff --git a/Source/Framework/Constants/PlayerConst.cs b/Source/Framework/Constants/PlayerConst.cs index 6f7e09412..e8ec1edc4 100644 --- a/Source/Framework/Constants/PlayerConst.cs +++ b/Source/Framework/Constants/PlayerConst.cs @@ -740,10 +740,21 @@ namespace Framework.Constants FailedRestArea = 8 } - public enum TutorialsFlag + public enum TutorialsFlag { None = 0x00, Changed = 0x01, LoadedFromDB = 0x02 } + + public enum ItemSearchLocation + { + InEquipment = 0x01, + InInventory = 0x02, + InBank = 0x04, + InReagentBank = 0x08, + + Default = InEquipment | InInventory, + Everywhere = InEquipment | InInventory | InBank | InReagentBank + } } diff --git a/Source/Game/Achievements/CriteriaHandler.cs b/Source/Game/Achievements/CriteriaHandler.cs index 40515e06a..79b508748 100644 --- a/Source/Game/Achievements/CriteriaHandler.cs +++ b/Source/Game/Achievements/CriteriaHandler.cs @@ -2293,7 +2293,7 @@ namespace Game.Achievements } case CriteriaAdditionalCondition.AzeriteItemLevel: // 235 { - Item heartOfAzeroth = referencePlayer.GetItemByEntry(PlayerConst.ItemIdHeartOfAzeroth); + Item heartOfAzeroth = referencePlayer.GetItemByEntry(PlayerConst.ItemIdHeartOfAzeroth, ItemSearchLocation.Everywhere); if (!heartOfAzeroth || heartOfAzeroth.ToAzeriteItem().GetLevel() < reqValue) return false; break; @@ -2346,7 +2346,7 @@ namespace Game.Achievements break; case CriteriaAdditionalCondition.UnlockedAzeriteEssenceRankLower: // 259 { - Item heartOfAzeroth = referencePlayer.GetItemByEntry(PlayerConst.ItemIdHeartOfAzeroth); + Item heartOfAzeroth = referencePlayer.GetItemByEntry(PlayerConst.ItemIdHeartOfAzeroth, ItemSearchLocation.Everywhere); if (heartOfAzeroth != null) { AzeriteItem azeriteItem = heartOfAzeroth.ToAzeriteItem(); @@ -2361,7 +2361,7 @@ namespace Game.Achievements } case CriteriaAdditionalCondition.UnlockedAzeriteEssenceRankEqual: // 260 { - Item heartOfAzeroth = referencePlayer.GetItemByEntry(PlayerConst.ItemIdHeartOfAzeroth); + Item heartOfAzeroth = referencePlayer.GetItemByEntry(PlayerConst.ItemIdHeartOfAzeroth, ItemSearchLocation.Everywhere); if (heartOfAzeroth != null) { AzeriteItem azeriteItem = heartOfAzeroth.ToAzeriteItem(); @@ -2376,7 +2376,7 @@ namespace Game.Achievements } case CriteriaAdditionalCondition.UnlockedAzeriteEssenceRankGreater: // 261 { - Item heartOfAzeroth = referencePlayer.GetItemByEntry(PlayerConst.ItemIdHeartOfAzeroth); + Item heartOfAzeroth = referencePlayer.GetItemByEntry(PlayerConst.ItemIdHeartOfAzeroth, ItemSearchLocation.Everywhere); if (heartOfAzeroth != null) { AzeriteItem azeriteItem = heartOfAzeroth.ToAzeriteItem(); @@ -2406,7 +2406,7 @@ namespace Game.Achievements break; case CriteriaAdditionalCondition.SelectedAzeriteEssenceRankLower: // 266 { - Item heartOfAzeroth = referencePlayer.GetItemByEntry(PlayerConst.ItemIdHeartOfAzeroth); + Item heartOfAzeroth = referencePlayer.GetItemByEntry(PlayerConst.ItemIdHeartOfAzeroth, ItemSearchLocation.Everywhere); if (heartOfAzeroth != null) { AzeriteItem azeriteItem = heartOfAzeroth.ToAzeriteItem(); @@ -2425,7 +2425,7 @@ namespace Game.Achievements } case CriteriaAdditionalCondition.SelectedAzeriteEssenceRankGreater: // 267 { - Item heartOfAzeroth = referencePlayer.GetItemByEntry(PlayerConst.ItemIdHeartOfAzeroth); + Item heartOfAzeroth = referencePlayer.GetItemByEntry(PlayerConst.ItemIdHeartOfAzeroth, ItemSearchLocation.Everywhere); if (heartOfAzeroth != null) { AzeriteItem azeriteItem = heartOfAzeroth.ToAzeriteItem(); diff --git a/Source/Game/Entities/GameObject/GameObject.cs b/Source/Game/Entities/GameObject/GameObject.cs index f70b1fe72..f2937176c 100644 --- a/Source/Game/Entities/GameObject/GameObject.cs +++ b/Source/Game/Entities/GameObject/GameObject.cs @@ -1912,7 +1912,7 @@ namespace Game.Entities } case 2: // Heart Forge { - Item item = player.GetItemByEntry(PlayerConst.ItemIdHeartOfAzeroth); + Item item = player.GetItemByEntry(PlayerConst.ItemIdHeartOfAzeroth, ItemSearchLocation.Everywhere); if (!item) return; diff --git a/Source/Game/Entities/Player/Player.Items.cs b/Source/Game/Entities/Player/Player.Items.cs index 52f0d2b0c..20e12f8ce 100644 --- a/Source/Game/Entities/Player/Player.Items.cs +++ b/Source/Game/Entities/Player/Player.Items.cs @@ -2858,47 +2858,89 @@ namespace Game.Entities return null; } - public Item GetItemByEntry(uint entry) + public Item GetItemByEntry(uint entry, ItemSearchLocation where = ItemSearchLocation.Default) { - // in inventory - int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount(); - for (byte i = InventorySlots.ItemStart; i < inventoryEnd; ++i) + if (where.HasAnyFlag(ItemSearchLocation.InEquipment)) { - Item pItem = GetItemByPos(InventorySlots.Bag0, i); - if (pItem != null) - if (pItem.GetEntry() == entry) - return pItem; + for (byte i = EquipmentSlot.Start; i < InventorySlots.BagEnd; ++i) + { + Item pItem = GetItemByPos(InventorySlots.Bag0, i); + if (pItem != null) + if (pItem.GetEntry() == entry) + return pItem; + } } - for (byte i = InventorySlots.BagStart; i < InventorySlots.BagEnd; ++i) + if (where.HasAnyFlag(ItemSearchLocation.InInventory)) { - Bag pBag = GetBagByPos(i); - if (pBag != null) - for (byte j = 0; j < pBag.GetBagSize(); ++j) - { - Item pItem = pBag.GetItemByPos(j); - if (pItem != null) + int inventoryEnd = InventorySlots.ItemStart + GetInventorySlotCount(); + for (byte i = InventorySlots.ItemStart; i < inventoryEnd; ++i) + { + Item pItem = GetItemByPos(InventorySlots.Bag0, i); + if (pItem != null) + if (pItem.GetEntry() == entry) + return pItem; + } + + for (byte i = InventorySlots.BagStart; i < InventorySlots.BagEnd; ++i) + { + Bag pBag = GetBagByPos(i); + if (pBag != null) + for (byte j = 0; j < pBag.GetBagSize(); ++j) { - if (pItem.GetEntry() == entry) - return pItem; + Item pItem = pBag.GetItemByPos(j); + if (pItem != null) + { + if (pItem.GetEntry() == entry) + return pItem; + } + } + } + + for (byte i = InventorySlots.ChildEquipmentStart; i < InventorySlots.ChildEquipmentEnd; ++i) + { + Item pItem = GetItemByPos(InventorySlots.Bag0, i); + if (pItem) + if (pItem.GetEntry() == entry) + return pItem; + } + } + + if (where.HasAnyFlag(ItemSearchLocation.InBank)) + { + for (byte i = InventorySlots.BankItemStart; i < InventorySlots.BankItemEnd; ++i) + { + Item pItem = GetItemByPos(InventorySlots.Bag0, i); + if (pItem != null) + if (pItem.GetEntry() == entry) + return pItem; + } + + for (byte i = InventorySlots.BankBagStart; i < InventorySlots.BankBagEnd; ++i) + { + Bag pBag = GetBagByPos(i); + if (pBag != null) + { + for (byte j = 0; j < pBag.GetBagSize(); ++j) + { + Item pItem = pBag.GetItemByPos(j); + if (pItem != null) + if (pItem.GetEntry() == entry) + return pItem; } } + } } - for (byte i = EquipmentSlot.Start; i < InventorySlots.BagEnd; ++i) + if (where.HasAnyFlag(ItemSearchLocation.InReagentBank)) { - Item pItem = GetItemByPos(InventorySlots.Bag0, i); - if (pItem != null) - if (pItem.GetEntry() == entry) - return pItem; - } - - for (byte i = InventorySlots.ChildEquipmentStart; i < InventorySlots.ChildEquipmentEnd; ++i) - { - Item pItem = GetItemByPos(InventorySlots.Bag0, i); - if (pItem) - if (pItem.GetEntry() == entry) - return pItem; + for (byte i = InventorySlots.ReagentStart; i < InventorySlots.ReagentEnd; ++i) + { + Item pItem = GetItemByPos(InventorySlots.Bag0, i); + if (pItem != null) + if (pItem.GetEntry() == entry) + return pItem; + } } return null; diff --git a/Source/Game/Entities/Player/Player.Talents.cs b/Source/Game/Entities/Player/Player.Talents.cs index 0cf70047c..f28a9fa2f 100644 --- a/Source/Game/Entities/Player/Player.Talents.cs +++ b/Source/Game/Entities/Player/Player.Talents.cs @@ -422,7 +422,7 @@ namespace Game.Entities activeGlyphs.IsFullUpdate = true; SendPacket(activeGlyphs); - Item item = GetItemByEntry(PlayerConst.ItemIdHeartOfAzeroth); + Item item = GetItemByEntry(PlayerConst.ItemIdHeartOfAzeroth, ItemSearchLocation.Everywhere); if (item != null) { AzeriteItem azeriteItem = item.ToAzeriteItem(); diff --git a/Source/Game/Entities/Player/Player.cs b/Source/Game/Entities/Player/Player.cs index 3c3f6e346..e8c8ba66e 100644 --- a/Source/Game/Entities/Player/Player.cs +++ b/Source/Game/Entities/Player/Player.cs @@ -1248,7 +1248,7 @@ namespace Game.Entities { if (count > 0) { - Item heartOfAzeroth = GetItemByEntry(PlayerConst.ItemIdHeartOfAzeroth); + Item heartOfAzeroth = GetItemByEntry(PlayerConst.ItemIdHeartOfAzeroth, ItemSearchLocation.Everywhere); if (heartOfAzeroth != null) heartOfAzeroth.ToAzeriteItem().GiveXP((ulong)count); } diff --git a/Source/Game/Handlers/AzeriteHandler.cs b/Source/Game/Handlers/AzeriteHandler.cs index 5cfff545e..f9a42fa2c 100644 --- a/Source/Game/Handlers/AzeriteHandler.cs +++ b/Source/Game/Handlers/AzeriteHandler.cs @@ -32,7 +32,7 @@ namespace Game if (!AzeriteItem.FindHeartForge(_player)) return; - Item item = _player.GetItemByEntry(PlayerConst.ItemIdHeartOfAzeroth); + Item item = _player.GetItemByEntry(PlayerConst.ItemIdHeartOfAzeroth, ItemSearchLocation.Everywhere); if (!item) return; @@ -65,8 +65,8 @@ namespace Game AzeriteEssenceSelectionResult activateEssenceResult = new AzeriteEssenceSelectionResult(); activateEssenceResult.AzeriteEssenceID = azeriteEssenceActivateEssence.AzeriteEssenceID; - Item item = _player.GetItemByEntry(PlayerConst.ItemIdHeartOfAzeroth); - if (!item || !item.IsEquipped()) + Item item = _player.GetItemByEntry(PlayerConst.ItemIdHeartOfAzeroth, ItemSearchLocation.InEquipment); + if (item == null) { activateEssenceResult.Reason = AzeriteEssenceActivateResult.NotEquipped; activateEssenceResult.Slot = azeriteEssenceActivateEssence.Slot; diff --git a/Source/Game/Handlers/InspectHandler.cs b/Source/Game/Handlers/InspectHandler.cs index ce441e6aa..2931dfc8e 100644 --- a/Source/Game/Handlers/InspectHandler.cs +++ b/Source/Game/Handlers/InspectHandler.cs @@ -67,7 +67,7 @@ namespace Game inspectResult.GuildData.Set(guildData); } - Item heartOfAzeroth = player.GetItemByEntry(PlayerConst.ItemIdHeartOfAzeroth); + Item heartOfAzeroth = player.GetItemByEntry(PlayerConst.ItemIdHeartOfAzeroth, ItemSearchLocation.Everywhere); if (heartOfAzeroth != null) { AzeriteItem azeriteItem = heartOfAzeroth.ToAzeriteItem(); diff --git a/Source/Game/Spells/SpellEffects.cs b/Source/Game/Spells/SpellEffects.cs index 653cc6256..b084f074e 100644 --- a/Source/Game/Spells/SpellEffects.cs +++ b/Source/Game/Spells/SpellEffects.cs @@ -5760,7 +5760,7 @@ namespace Game.Spells if (!playerTarget) return; - Item heartOfAzeroth = playerTarget.GetItemByEntry(PlayerConst.ItemIdHeartOfAzeroth); + Item heartOfAzeroth = playerTarget.GetItemByEntry(PlayerConst.ItemIdHeartOfAzeroth, ItemSearchLocation.Everywhere); if (heartOfAzeroth == null) return;