Core/Items: Add durability sell penalty when selling damaged items to vendors

(cherry picked from commit 32cd598d03413033413d5a4ee10a17679b4432d8)
This commit is contained in:
kik0swd
2026-07-19 23:59:07 +02:00
committed by Shauren
parent 7b7fac8483
commit b9d25498c7
3 changed files with 27 additions and 3 deletions
+7 -2
View File
@@ -1380,7 +1380,7 @@ void Item::SetCount(uint32 value)
}
}
uint64 Item::CalculateDurabilityRepairCost(float discount) const
uint64 Item::CalculateDurabilityRepairCost(float discount, bool useRateConfig /*= true*/) const
{
uint32 maxDurability = m_itemData->MaxDurability;
if (!maxDurability)
@@ -1411,7 +1411,7 @@ uint64 Item::CalculateDurabilityRepairCost(float discount) const
dmultiplier = durabilityCost->ArmorSubClassCost[itemTemplate->GetSubClass()];
uint64 cost = std::round(lostDurability * dmultiplier * durabilityQualityEntry->Data * GetRepairCostMultiplier());
cost = uint64(cost * discount * sWorld->getRate(RATE_REPAIRCOST));
cost = uint64(cost * discount * (useRateConfig ? sWorld->getRate(RATE_REPAIRCOST) : 1));
if (cost == 0) // Fix for ITEM_QUALITY_ARTIFACT
cost = 1;
@@ -1419,6 +1419,11 @@ uint64 Item::CalculateDurabilityRepairCost(float discount) const
return cost;
}
uint64 Item::CalculateDurabilitySellPenalty() const
{
return CalculateDurabilityRepairCost(1.0f, false);
}
bool Item::HasEnchantRequiredSkill(Player const* player) const
{
// Check all enchants for required skill
+2 -1
View File
@@ -271,7 +271,8 @@ class TC_GAME_API Item : public Object
void SetInTrade(bool b = true) { mb_in_trade = b; }
bool IsInTrade() const { return mb_in_trade; }
uint64 CalculateDurabilityRepairCost(float discount) const;
uint64 CalculateDurabilityRepairCost(float discount, bool useRateConfig = true) const;
uint64 CalculateDurabilitySellPenalty() const;
bool HasEnchantRequiredSkill(Player const* player) const;
uint32 GetEnchantRequiredLevel() const;
@@ -23922,6 +23922,15 @@ Optional<SellResult> Player::CanSellItemToVendor(Item const* item, uint32 amount
return SELL_ERR_CANT_SELL_ITEM;
uint64 money = uint64(sellPrice) * amount;
uint64 durabilityPenalty = item->CalculateDurabilitySellPenalty();
if (durabilityPenalty)
{
if (durabilityPenalty > money)
money = 1;
else
money -= durabilityPenalty;
}
using BuybackStorageType = std::remove_cvref_t<decltype(m_activePlayerData->BuybackPrice[0])>;
if (money > std::numeric_limits<BuybackStorageType>::max()) // ensure sell price * amount doesn't overflow buyback price
@@ -23933,6 +23942,15 @@ Optional<SellResult> Player::CanSellItemToVendor(Item const* item, uint32 amount
Optional<SellResult> Player::SellItemToVendor(Item* item, uint32 amount)
{
uint64 money = uint64(item->GetSellPrice(this)) * amount;
uint64 durabilityPenalty = item->CalculateDurabilitySellPenalty();
if (durabilityPenalty)
{
if (durabilityPenalty > money)
money = 1;
else
money -= durabilityPenalty;
}
if (!ModifyMoney(money)) // ensure player doesn't exceed gold limit
return SELL_ERR_CANT_SELL_ITEM;