diff options
author | Shauren <shauren.trinity@gmail.com> | 2016-06-28 20:46:07 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2016-06-28 20:46:07 +0200 |
commit | edad98625909eaa5d46f1a385e2f48ab26ef4046 (patch) | |
tree | 942de82e495fc54aa157f1585f52026d7040d256 /src | |
parent | d5fa0e783a20be288401f00d54c8c7501657cc19 (diff) |
Core/Items: Fixed item icons
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/DataStores/DB2Stores.cpp | 26 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2Stores.h | 5 | ||||
-rw-r--r-- | src/server/game/Entities/Item/Item.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Entities/Item/Item.h | 1 |
4 files changed, 29 insertions, 9 deletions
diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index ff6fb779650..f4a8d6423b8 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -598,8 +598,11 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) _itemsWithCurrencyCost.insert(itemCurrencyCost->ItemId); for (ItemModifiedAppearanceEntry const* appearanceMod : sItemModifiedAppearanceStore) - if (ItemAppearanceEntry const* appearance = sItemAppearanceStore.LookupEntry(appearanceMod->AppearanceID)) - _itemDisplayIDs[appearanceMod->ItemID | (appearanceMod->AppearanceModID << 24)] = appearance->DisplayID; + { + ASSERT(appearanceMod->ItemID <= 0xFFFFFF); + ASSERT(appearanceMod->AppearanceModID <= 0xFF); + _itemModifiedAppearancesByItem[appearanceMod->ItemID | (appearanceMod->AppearanceModID << 24)] = appearanceMod; + } for (ItemSetSpellEntry const* itemSetSpell : sItemSetSpellStore) _itemSetSpells[itemSetSpell->ItemSetID].push_back(itemSetSpell); @@ -1052,19 +1055,28 @@ std::set<uint32> DB2Manager::GetItemBonusTree(uint32 itemId, uint32 itemBonusTre uint32 DB2Manager::GetItemDisplayId(uint32 itemId, uint32 appearanceModId) const { - auto itr = _itemDisplayIDs.find(itemId | (appearanceModId << 24)); - if (itr != _itemDisplayIDs.end()) + if (ItemModifiedAppearanceEntry const* modifiedAppearance = GetItemModifiedAppearance(itemId, appearanceModId)) + if (ItemAppearanceEntry const* itemAppearance = sItemAppearanceStore.LookupEntry(modifiedAppearance->AppearanceID)) + return itemAppearance->DisplayID; + + return 0; +} + +ItemModifiedAppearanceEntry const* DB2Manager::GetItemModifiedAppearance(uint32 itemId, uint32 appearanceModId) const +{ + auto itr = _itemModifiedAppearancesByItem.find(itemId | (appearanceModId << 24)); + if (itr != _itemModifiedAppearancesByItem.end()) return itr->second; // Fall back to unmodified appearance if (appearanceModId) { - itr = _itemDisplayIDs.find(itemId); - if (itr != _itemDisplayIDs.end()) + itr = _itemModifiedAppearancesByItem.find(itemId); + if (itr != _itemModifiedAppearancesByItem.end()) return itr->second; } - return 0; + return nullptr; } std::vector<ItemSetSpellEntry const*> const* DB2Manager::GetItemSetSpells(uint32 itemSetId) const diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index e5579e080e2..b5a052428f4 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -233,7 +233,7 @@ public: typedef std::vector<ItemBonusEntry const*> ItemBonusList; typedef std::unordered_map<uint32 /*bonusListId*/, ItemBonusList> ItemBonusListContainer; typedef std::unordered_multimap<uint32 /*itemId*/, uint32 /*bonusTreeId*/> ItemToBonusTreeContainer; - typedef std::unordered_map<uint32 /*itemId | appearanceMod << 24*/, uint32> ItemDisplayIdContainer; + typedef std::unordered_map<uint32 /*itemId | appearanceMod << 24*/, ItemModifiedAppearanceEntry const*> ItemModifiedAppearanceByItemContainer; typedef std::unordered_map<uint32, std::set<ItemBonusTreeNodeEntry const*>> ItemBonusTreeContainer; typedef std::unordered_map<uint32, std::vector<ItemSetSpellEntry const*>> ItemSetSpellContainer; typedef std::unordered_map<uint32, std::vector<ItemSpecOverrideEntry const*>> ItemSpecOverridesContainer; @@ -282,6 +282,7 @@ public: std::set<uint32> GetItemBonusTree(uint32 itemId, uint32 itemBonusTreeMod) const; bool HasItemCurrencyCost(uint32 itemId) const { return _itemsWithCurrencyCost.count(itemId) > 0; } uint32 GetItemDisplayId(uint32 itemId, uint32 appearanceModId) const; + ItemModifiedAppearanceEntry const* GetItemModifiedAppearance(uint32 itemId, uint32 appearanceModId) const; std::vector<ItemSetSpellEntry const*> const* GetItemSetSpells(uint32 itemSetId) const; std::vector<ItemSpecOverrideEntry const*> const* GetItemSpecOverrides(uint32 itemId) const; static LfgDungeonsEntry const* GetLfgDungeon(uint32 mapId, Difficulty difficulty); @@ -330,7 +331,7 @@ private: ItemBonusListContainer _itemBonusLists; ItemBonusTreeContainer _itemBonusTrees; std::unordered_set<uint32> _itemsWithCurrencyCost; - ItemDisplayIdContainer _itemDisplayIDs; + ItemModifiedAppearanceByItemContainer _itemModifiedAppearancesByItem; ItemToBonusTreeContainer _itemToBonusTree; ItemSetSpellContainer _itemSetSpells; ItemSpecOverridesContainer _itemSpecOverrides; diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 70fe83b7825..9fbea011dd6 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -1871,6 +1871,11 @@ uint32 Item::GetDisplayId() const return sDB2Manager.GetItemDisplayId(GetEntry(), GetAppearanceModId()); } +ItemModifiedAppearanceEntry const* Item::GetItemModifiedAppearance() const +{ + return sDB2Manager.GetItemModifiedAppearance(GetEntry(), _bonusData.AppearanceModID); +} + void Item::SetModifier(ItemModifier modifier, uint32 value) { _modifiers[modifier] = value; @@ -1916,6 +1921,7 @@ void Item::AddBonuses(uint32 bonusListID) AddDynamicValue(ITEM_DYNAMIC_FIELD_BONUSLIST_IDS, bonusListID); for (ItemBonusEntry const* bonus : *bonuses) _bonusData.AddBonus(bonus->Type, bonus->Value); + SetUInt32Value(ITEM_FIELD_APPEARANCE_MOD_ID, _bonusData.AppearanceModID); } } diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h index 30d8c56ecb3..7f52e3874fe 100644 --- a/src/server/game/Entities/Item/Item.h +++ b/src/server/game/Entities/Item/Item.h @@ -398,6 +398,7 @@ class TC_GAME_API Item : public Object uint32 GetArmor(Player const* owner) const { return GetTemplate()->GetArmor(GetItemLevel(owner)); } void GetDamage(Player const* owner, float& minDamage, float& maxDamage) const { GetTemplate()->GetDamage(GetItemLevel(owner), minDamage, maxDamage); } uint32 GetDisplayId() const; + ItemModifiedAppearanceEntry const* GetItemModifiedAppearance() const; float GetRepairCostMultiplier() const { return _bonusData.RepairCostMultiplier; } uint32 GetScalingStatDistribution() const { return _bonusData.ScalingStatDistribution; } |