diff options
author | Carbenium <carbenium@outlook.com> | 2015-11-03 17:48:01 +0100 |
---|---|---|
committer | Carbenium <carbenium@outlook.com> | 2015-11-07 01:02:11 +0100 |
commit | 74d76277784f483e1145513469d54e1cf3b35667 (patch) | |
tree | 2dd004eb6471804064e192be321bfe3c9882bd55 /src | |
parent | f605300c71ebf2586bdf1282e3adb8669f3e2720 (diff) |
Merge pull request #15720 from Tonghost/3.3.5
Core/Items: Fix a trading spoof exploit.
(cherry picked from commit 12ae32a9b629b5c473e76f73cc85ef4daf506a64)
Conflicts:
src/server/game/Entities/Item/Item.cpp
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Item/Item.cpp | 16 | ||||
-rw-r--r-- | src/server/game/Entities/Item/Item.h | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 2 |
4 files changed, 20 insertions, 4 deletions
diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index ffa924cc0ea..955f03b6c8e 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -790,6 +790,22 @@ bool Item::CanBeTraded(bool mail, bool trade) const return true; } +void Item::SetCount(uint32 value) +{ + SetUInt32Value(ITEM_FIELD_STACK_COUNT, value); + + if (Player* player = GetOwner()) + { + if (TradeData* tradeData = player->GetTradeData()) + { + TradeSlots slot = tradeData->GetTradeSlotForItem(GetGUID()); + + if (slot != TRADE_SLOT_INVALID) + tradeData->SetItem(slot, this, true); + } + } +} + bool Item::HasEnchantRequiredSkill(const Player* player) const { // Check all enchants for required skill diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h index 37d7e3613f2..3452951d554 100644 --- a/src/server/game/Entities/Item/Item.h +++ b/src/server/game/Entities/Item/Item.h @@ -318,7 +318,7 @@ class Item : public Object bool GemsFitSockets() const; uint32 GetCount() const { return GetUInt32Value(ITEM_FIELD_STACK_COUNT); } - void SetCount(uint32 value) { SetUInt32Value(ITEM_FIELD_STACK_COUNT, value); } + void SetCount(uint32 value); uint32 GetMaxStackCount() const { return GetTemplate()->GetMaxStackSize(); } uint8 GetGemCountWithID(uint32 GemID) const; uint8 GetGemCountWithLimitCategory(uint32 limitCategory) const; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 797b5691891..576c86fbcc5 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -165,13 +165,13 @@ Item* TradeData::GetSpellCastItem() const return !m_spellCastItem.IsEmpty() ? m_player->GetItemByGuid(m_spellCastItem) : NULL; } -void TradeData::SetItem(TradeSlots slot, Item* item) +void TradeData::SetItem(TradeSlots slot, Item* item, bool update /*= false*/) { ObjectGuid itemGuid; if (item) itemGuid = item->GetGUID(); - if (m_items[slot] == itemGuid) + if (m_items[slot] == itemGuid && !update) return; m_items[slot] = itemGuid; diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 3a1ae5a59c5..e78c12f9cf6 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1146,7 +1146,7 @@ class TradeData Item* GetItem(TradeSlots slot) const; bool HasItem(ObjectGuid itemGuid) const; TradeSlots GetTradeSlotForItem(ObjectGuid itemGuid) const; - void SetItem(TradeSlots slot, Item* item); + void SetItem(TradeSlots slot, Item* item, bool update = false); uint32 GetSpell() const { return m_spell; } void SetSpell(uint32 spell_id, Item* castItem = NULL); |