diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Item/Item.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Handlers/ItemHandler.cpp | 75 |
3 files changed, 41 insertions, 41 deletions
diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 04aed3fa0c4..acae7866362 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -2210,7 +2210,7 @@ uint32 Item::GetBuyPrice(ItemTemplate const* proto, uint32 quality, uint32 itemL typeFactor = weaponPrice->Data; } - standardPrice = false; + standardPrice = true; return uint32(proto->GetPriceVariance() * typeFactor * baseFactor * qualityFactor * proto->GetPriceRandomValue()); } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 6383f9eb9d1..36dc7f8d4f1 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -13162,10 +13162,7 @@ void Player::AddItemToBuyBackSlot(Item* pItem) uint32 eslot = slot - BUYBACK_SLOT_START; SetInvSlot(slot, pItem->GetGUID()); - if (ItemTemplate const* proto = pItem->GetTemplate()) - SetBuybackPrice(eslot, proto->GetSellPrice() * pItem->GetCount()); - else - SetBuybackPrice(eslot, 0); + SetBuybackPrice(eslot, pItem->GetSellPrice(this) * pItem->GetCount()); SetBuybackTimestamp(eslot, (uint32)etime); 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; |