diff options
author | Bloodtigress <145388458+Bloodtigress@users.noreply.github.com> | 2024-05-12 14:31:49 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-12 14:31:49 +0200 |
commit | 500301b96256792357b13ef78d7e1836028cff26 (patch) | |
tree | 69754b2f55077ee25e73aa3e24cb5e10748fd493 /src/server/game/Handlers/ItemHandler.cpp | |
parent | ef22003a563b9e79a38ae999f05ce14b876513b8 (diff) |
Core/Items: Fix item sell price not scaling with item level (#29972)
Diffstat (limited to 'src/server/game/Handlers/ItemHandler.cpp')
-rw-r--r-- | src/server/game/Handlers/ItemHandler.cpp | 75 |
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; |