diff options
Diffstat (limited to 'src/server/game/Chat/ChatLink.cpp')
-rw-r--r-- | src/server/game/Chat/ChatLink.cpp | 54 |
1 files changed, 48 insertions, 6 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; } |