aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Chat/ChatLink.cpp54
-rw-r--r--src/server/game/Chat/ChatLink.h3
-rw-r--r--src/server/game/DataStores/DB2Stores.cpp6
-rw-r--r--src/server/game/DataStores/DB2Stores.h2
-rw-r--r--src/server/game/Entities/Item/Item.cpp10
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)