aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Item/Item.cpp2
-rw-r--r--src/server/game/Entities/Player/Player.cpp5
-rw-r--r--src/server/game/Handlers/ItemHandler.cpp75
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;