aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Handlers/ItemHandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Handlers/ItemHandler.cpp')
-rw-r--r--src/server/game/Handlers/ItemHandler.cpp75
1 files changed, 39 insertions, 36 deletions
diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp
index eb7bfa32d7a..efbc978c45b 100644
--- a/src/server/game/Handlers/ItemHandler.cpp
+++ b/src/server/game/Handlers/ItemHandler.cpp
@@ -450,54 +450,57 @@ void WorldSession::HandleSellItemOpcode(WorldPackets::Item::SellItem& packet)
}
}
- ItemTemplate const* pProto = pItem->GetTemplate();
- if (pProto)
+ if (uint32 sellPrice = pItem->GetSellPrice(_player); sellPrice > 0)
{
- if (pProto->GetSellPrice() > 0)
+ uint64 money = uint64(sellPrice) * packet.Amount;
+
+ using BuybackStorageType = std::remove_cvref_t<decltype(_player->m_activePlayerData->BuybackPrice[0])>;
+ if (money > std::numeric_limits<BuybackStorageType>::max()) // ensure sell price * amount doesn't overflow buyback price
{
- uint64 money = uint64(pProto->GetSellPrice()) * packet.Amount;
+ _player->SendSellError(SELL_ERR_CANT_SELL_ITEM, creature, packet.ItemGUID);
+ return;
+ }
+
+ if (!_player->ModifyMoney(money)) // ensure player doesn't exceed gold limit
+ {
+ _player->SendSellError(SELL_ERR_CANT_SELL_ITEM, creature, packet.ItemGUID);
+ return;
+ }
- if (!_player->ModifyMoney(money)) // ensure player doesn't exceed gold limit
+ _player->UpdateCriteria(CriteriaType::MoneyEarnedFromSales, money);
+ _player->UpdateCriteria(CriteriaType::SellItemsToVendors, 1);
+
+ if (packet.Amount < pItem->GetCount()) // need split items
+ {
+ Item* pNewItem = pItem->CloneItem(packet.Amount, _player);
+ if (!pNewItem)
{
+ TC_LOG_ERROR("network", "WORLD: HandleSellItemOpcode - could not create clone of item {}; count = {}", pItem->GetEntry(), packet.Amount);
_player->SendSellError(SELL_ERR_CANT_SELL_ITEM, creature, packet.ItemGUID);
return;
}
- _player->UpdateCriteria(CriteriaType::MoneyEarnedFromSales, money);
- _player->UpdateCriteria(CriteriaType::SellItemsToVendors, 1);
+ pItem->SetCount(pItem->GetCount() - packet.Amount);
+ _player->ItemRemovedQuestCheck(pItem->GetEntry(), packet.Amount);
+ if (_player->IsInWorld())
+ pItem->SendUpdateToPlayer(_player);
+ pItem->SetState(ITEM_CHANGED, _player);
- if (packet.Amount < pItem->GetCount()) // need split items
- {
- Item* pNewItem = pItem->CloneItem(packet.Amount, _player);
- if (!pNewItem)
- {
- TC_LOG_ERROR("network", "WORLD: HandleSellItemOpcode - could not create clone of item {}; count = {}", pItem->GetEntry(), packet.Amount);
- _player->SendSellError(SELL_ERR_CANT_SELL_ITEM, creature, packet.ItemGUID);
- return;
- }
-
- pItem->SetCount(pItem->GetCount() - packet.Amount);
- _player->ItemRemovedQuestCheck(pItem->GetEntry(), packet.Amount);
- if (_player->IsInWorld())
- pItem->SendUpdateToPlayer(_player);
- pItem->SetState(ITEM_CHANGED, _player);
-
- _player->AddItemToBuyBackSlot(pNewItem);
- if (_player->IsInWorld())
- pNewItem->SendUpdateToPlayer(_player);
- }
- else
- {
- _player->RemoveItem(pItem->GetBagSlot(), pItem->GetSlot(), true);
- _player->ItemRemovedQuestCheck(pItem->GetEntry(), pItem->GetCount());
- RemoveItemFromUpdateQueueOf(pItem, _player);
- _player->AddItemToBuyBackSlot(pItem);
- }
+ _player->AddItemToBuyBackSlot(pNewItem);
+ if (_player->IsInWorld())
+ pNewItem->SendUpdateToPlayer(_player);
}
else
- _player->SendSellError(SELL_ERR_CANT_SELL_ITEM, creature, packet.ItemGUID);
- return;
+ {
+ _player->RemoveItem(pItem->GetBagSlot(), pItem->GetSlot(), true);
+ _player->ItemRemovedQuestCheck(pItem->GetEntry(), pItem->GetCount());
+ RemoveItemFromUpdateQueueOf(pItem, _player);
+ _player->AddItemToBuyBackSlot(pItem);
+ }
}
+ else
+ _player->SendSellError(SELL_ERR_CANT_SELL_ITEM, creature, packet.ItemGUID);
+ return;
}
_player->SendSellError(SELL_ERR_CANT_FIND_ITEM, creature, packet.ItemGUID);
return;