diff options
author | Shauren <shauren.trinity@gmail.com> | 2021-05-04 00:00:07 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2021-05-04 00:00:07 +0200 |
commit | 6d746a706a595e4bb4881fa61aee85af37a7236d (patch) | |
tree | f0b5260a8861c892ae1495c06ac19871f6d6aeb6 | |
parent | af5202b52891c36d231af8214156b6be6411caf3 (diff) |
Core/Chat: Updated item chat link format to 9.0
-rw-r--r-- | src/server/game/Chat/ChatLink.cpp | 53 |
1 files changed, 41 insertions, 12 deletions
diff --git a/src/server/game/Chat/ChatLink.cpp b/src/server/game/Chat/ChatLink.cpp index 5e17714555c..d1cf52203a4 100644 --- a/src/server/game/Chat/ChatLink.cpp +++ b/src/server/game/Chat/ChatLink.cpp @@ -106,7 +106,7 @@ bool ChatLink::ValidateName(char* buffer, char const* /*context*/) return true; } -// |color|Hitem:item_id:perm_ench_id:gem1:gem2:gem3:0:random_property:property_seed:reporter_level:reporter_spec:modifiers_mask:context:numBonusListIDs:bonusListIDs(%d):mods(%d):gem1numBonusListIDs:gem1bonusListIDs(%d):gem2numBonusListIDs:gem2bonusListIDs(%d):gem3numBonusListIDs:gem3bonusListIDs(%d)|h[name]|h|r +// |color|Hitem:item_id:perm_ench_id:gem1:gem2:gem3:0:random_property:property_seed:reporter_level:reporter_spec:modifiers_mask:context:numBonusListIDs:bonusListIDs(%d):numModifiers:(modifierType(%d):modifierValue(%d)):gem1numBonusListIDs:gem1bonusListIDs(%d):gem2numBonusListIDs:gem2bonusListIDs(%d):gem3numBonusListIDs:gem3bonusListIDs(%d)|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) { @@ -277,22 +277,51 @@ bool ItemChatLink::Initialize(std::istringstream& iss) _bonusListIDs[index] = id; } - for (uint32 i = 0; i < MAX_ITEM_MODIFIERS; ++i) + if (!CheckDelimiter(iss, DELIMITER, "item")) + return false; + + uint32 numModifiers = 0; + if (HasValue(iss) && !ReadUInt32(iss, numModifiers)) { - if (modifiersMask & (1 << i)) + TC_LOG_TRACE("chat.system", "ChatHandler::isValidChatMessage('%s'): sequence finished unexpectedly while reading item modifiers size", iss.str().c_str()); + return false; + } + + if (numModifiers > MAX_ITEM_MODIFIERS) + { + TC_LOG_TRACE("chat.system", "ChatHandler::isValidChatMessage('%s'): too many item modifiers %u in |item command", iss.str().c_str(), numBonusListIDs); + return false; + } + + for (uint32 i = 0; i < numModifiers; ++i) + { + if (!CheckDelimiter(iss, DELIMITER, "item")) + return false; + + int32 type = 0; + if (!ReadInt32(iss, type)) { - if (!CheckDelimiter(iss, DELIMITER, "item")) - return false; + TC_LOG_TRACE("chat.system", "ChatHandler::isValidChatMessage('%s'): sequence finished unexpectedly while reading item modifier type (index %u)", iss.str().c_str(), i); + return false; + } - int32 id = 0; - if (!ReadInt32(iss, id)) - { - TC_LOG_TRACE("chat.system", "ChatHandler::isValidChatMessage('%s'): sequence finished unexpectedly while reading item modifier id (index %u)", iss.str().c_str(), i); - return false; - } + if (type > MAX_ITEM_MODIFIERS) + { + TC_LOG_TRACE("chat.system", "ChatHandler::isValidChatMessage('%s'): invalid item modifier type %u (index %u)", iss.str().c_str(), type, i); + return false; + } - _modifiers.push_back(std::make_pair(i, id)); + 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 modifier value (index %u)", iss.str().c_str(), i); + return false; } + + _modifiers.emplace_back(type, id); } for (uint32 i = 0; i < MAX_ITEM_PROTO_SOCKETS; ++i) |