diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Chat/ChatLink.cpp | 54 | ||||
-rw-r--r-- | src/server/game/Chat/ChatLink.h | 3 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2Stores.cpp | 6 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2Stores.h | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Item/Item.cpp | 10 |
5 files changed, 60 insertions, 15 deletions
diff --git a/src/server/game/Chat/ChatLink.cpp b/src/server/game/Chat/ChatLink.cpp index 9d5d518234a..3c5ba51b20a 100644 --- a/src/server/game/Chat/ChatLink.cpp +++ b/src/server/game/Chat/ChatLink.cpp @@ -102,8 +102,8 @@ bool ChatLink::ValidateName(char* buffer, const char* /*context*/) return true; } -// |color|Hitem:item_id:perm_ench_id:gem1:gem2:gem3:0:random_property:0:reporter_level|h[name]|h|r -// |cffa335ee|Hitem:812:0:0:0:0:0:0:0:70|h[Glowing Brightwood Staff]|h|r +// |color|Hitem:item_id:perm_ench_id:gem1:gem2:gem3:0:random_property:property_seed:reporter_level:upgrade_id:context:numBonusListIDs|h[name]|h|r +// |cffa335ee|Hitem:124382:0:0:0:0:0:0:0:0:0:0:0:4:42:562:565:567|h[Edict of Argus]|h|r"); bool ItemChatLink::Initialize(std::istringstream& iss) { // Read item entry @@ -113,6 +113,7 @@ bool ItemChatLink::Initialize(std::istringstream& iss) TC_LOG_TRACE("chat.system", "ChatHandler::isValidChatMessage('%s'): sequence finished unexpectedly while reading item entry", iss.str().c_str()); return false; } + // Validate item _item = sObjectMgr->GetItemTemplate(itemEntry); if (!_item) @@ -120,15 +121,23 @@ bool ItemChatLink::Initialize(std::istringstream& iss) TC_LOG_TRACE("chat.system", "ChatHandler::isValidChatMessage('%s'): got invalid itemEntry %u in |item command", iss.str().c_str(), itemEntry); return false; } + // Validate item's color - if (_color != ItemQualityColors[_item->GetQuality()]) + uint32 colorQuality = _item->GetQuality(); + if (_item->GetFlags3() & ITEM_FLAG3_HEIRLOOM_QUALITY) + colorQuality = ITEM_QUALITY_HEIRLOOM; + + if (_color != ItemQualityColors[colorQuality]) { - TC_LOG_TRACE("chat.system", "ChatHandler::isValidChatMessage('%s'): linked item has color %u, but user claims %u", iss.str().c_str(), ItemQualityColors[_item->GetQuality()], _color); + TC_LOG_TRACE("chat.system", "ChatHandler::isValidChatMessage('%s'): linked item has color %u, but user claims %u", iss.str().c_str(), ItemQualityColors[colorQuality], _color); return false; } + // Number of various item properties after item entry - const uint8 propsCount = 8; - const uint8 randomPropertyPosition = 5; + uint8 const propsCount = 11; + uint8 const randomPropertyPosition = 5; + uint8 const numBonusListIDsPosition = 10; + uint8 const maxBonusListIDs = 100; for (uint8 index = 0; index < propsCount; ++index) { if (!CheckDelimiter(iss, DELIMITER, "item")) @@ -162,8 +171,41 @@ bool ItemChatLink::Initialize(std::istringstream& iss) } } } + if (index == numBonusListIDsPosition) + { + if (id > maxBonusListIDs) + { + TC_LOG_TRACE("chat.system", "ChatHandler::isValidChatMessage('%s'): too many item bonus list IDs %u in |item command", iss.str().c_str(), id); + return false; + } + + _bonusListIDs.resize(id); + } + _data[index] = id; } + + for (int32 index = 0; index < _bonusListIDs.size(); ++index) + { + if (!CheckDelimiter(iss, DELIMITER, "item")) + return false; + + int32 id = 0; + if (!ReadInt32(iss, id)) + { + TC_LOG_TRACE("chat.system", "ChatHandler::isValidChatMessage('%s'): sequence finished unexpectedly while reading item bonus list id (%u)", iss.str().c_str(), index); + return false; + } + + if (!sDB2Manager.GetItemBonusList(id)) + { + TC_LOG_TRACE("chat.system", "ChatHandler::isValidChatMessage('%s'): got invalid item bonus list id %d in |item command", iss.str().c_str(), id); + return false; + } + + _bonusListIDs[index] = id; + } + return true; } diff --git a/src/server/game/Chat/ChatLink.h b/src/server/game/Chat/ChatLink.h index 83a8d2425bb..2a463e36e39 100644 --- a/src/server/game/Chat/ChatLink.h +++ b/src/server/game/Chat/ChatLink.h @@ -69,7 +69,8 @@ protected: std::string FormatName(uint8 index, LocalizedString* suffixStrings) const; ItemTemplate const* _item; - int32 _data[8]; + int32 _data[11]; + std::vector<int32> _bonusListIDs; ItemRandomSuffixEntry const* _suffix; ItemRandomPropertiesEntry const* _property; }; diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index 5e9344f10b0..59249b02612 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -611,13 +611,13 @@ uint32 DB2Manager::GetHeirloomItemLevel(uint32 curveId, uint32 level) const return uint32(previousItr->second->Y); // Lowest scaling point } -DB2Manager::ItemBonusList DB2Manager::GetItemBonusList(uint32 bonusListId) const +DB2Manager::ItemBonusList const* DB2Manager::GetItemBonusList(uint32 bonusListId) const { auto itr = _itemBonusLists.find(bonusListId); if (itr != _itemBonusLists.end()) - return itr->second; + return &itr->second; - return ItemBonusList(); + return nullptr; } std::set<uint32> DB2Manager::GetItemBonusTree(uint32 itemId, uint32 itemBonusTreeMod) const diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index b99a5f75309..59931769c4a 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -166,7 +166,7 @@ public: uint32 GetPowerIndexByClass(uint32 powerType, uint32 classId) const; GlyphSlotContainer const& GetGlyphSlots() const { return _glyphSlots; } uint32 GetHeirloomItemLevel(uint32 curveId, uint32 level) const; - ItemBonusList GetItemBonusList(uint32 bonusListId) const; + ItemBonusList const* GetItemBonusList(uint32 bonusListId) const; std::set<uint32> GetItemBonusTree(uint32 itemId, uint32 itemBonusTreeMod) const; uint32 GetItemDisplayId(uint32 itemId, uint32 appearanceModId) const; std::vector<ItemSpecOverrideEntry const*> const* GetItemSpecOverrides(uint32 itemId) const; diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 7250c0cff23..70d63a853e7 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -1792,10 +1792,12 @@ uint32 Item::GetVisibleAppearanceModId() const void Item::AddBonuses(uint32 bonusListID) { - DB2Manager::ItemBonusList bonuses = sDB2Manager.GetItemBonusList(bonusListID); - AddDynamicValue(ITEM_DYNAMIC_FIELD_BONUSLIST_IDS, bonusListID); - for (ItemBonusEntry const* bonus : bonuses) - _bonusData.AddBonus(bonus->Type, bonus->Value); + if (DB2Manager::ItemBonusList const* bonuses = sDB2Manager.GetItemBonusList(bonusListID)) + { + AddDynamicValue(ITEM_DYNAMIC_FIELD_BONUSLIST_IDS, bonusListID); + for (ItemBonusEntry const* bonus : *bonuses) + _bonusData.AddBonus(bonus->Type, bonus->Value); + } } void BonusData::Initialize(ItemTemplate const* proto) |