aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2016-06-28 20:46:07 +0200
committerShauren <shauren.trinity@gmail.com>2016-06-28 20:46:07 +0200
commitedad98625909eaa5d46f1a385e2f48ab26ef4046 (patch)
tree942de82e495fc54aa157f1585f52026d7040d256
parentd5fa0e783a20be288401f00d54c8c7501657cc19 (diff)
Core/Items: Fixed item icons
-rw-r--r--src/server/game/DataStores/DB2Stores.cpp26
-rw-r--r--src/server/game/DataStores/DB2Stores.h5
-rw-r--r--src/server/game/Entities/Item/Item.cpp6
-rw-r--r--src/server/game/Entities/Item/Item.h1
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; }