summaryrefslogtreecommitdiff
path: root/src/server/game/Handlers/ItemHandler.cpp
diff options
context:
space:
mode:
authorUltraNix <80540499+UltraNix@users.noreply.github.com>2022-11-21 22:51:40 +0100
committerGitHub <noreply@github.com>2022-11-21 18:51:40 -0300
commit8f697bdaee685c51d93c918bdd1e2ee2c4a14b32 (patch)
tree04cb66f2ea361673d10bf048febe2143f6b41d6f /src/server/game/Handlers/ItemHandler.cpp
parentcb475290b48d4d0a2e5484cdc95f9af9ec81dbb6 (diff)
fix(Core/Items): Item sell prices are affected by durability loss. So… (#13801)
...urce: Vmangos.
Diffstat (limited to 'src/server/game/Handlers/ItemHandler.cpp')
-rw-r--r--src/server/game/Handlers/ItemHandler.cpp51
1 files changed, 49 insertions, 2 deletions
diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp
index 19bcc766c8..dae3a05a0b 100644
--- a/src/server/game/Handlers/ItemHandler.cpp
+++ b/src/server/game/Handlers/ItemHandler.cpp
@@ -818,6 +818,51 @@ void WorldSession::HandleSellItemOpcode(WorldPacket& recvData)
if (sWorld->getBoolConfig(CONFIG_ITEMDELETE_VENDOR))
recoveryItem(pItem);
+ uint32 maxDurability = pItem->GetUInt32Value(ITEM_FIELD_MAXDURABILITY);
+ if (maxDurability)
+ {
+ uint32 curDurability = pItem->GetUInt32Value(ITEM_FIELD_DURABILITY);
+ uint32 LostDurability = maxDurability - curDurability;
+
+ if (LostDurability > 0)
+ {
+ DurabilityCostsEntry const* dcost = sDurabilityCostsStore.LookupEntry(pProto->ItemLevel);
+ if (!dcost)
+ {
+ _player->SendSellError(SELL_ERR_CANT_SELL_ITEM, creature, itemguid, 0);
+ LOG_ERROR("network.opcode", "WORLD: HandleSellItemOpcode - Wrong item lvl {} for item {} count = {}", pProto->ItemLevel, pItem->GetEntry(), count);
+ return;
+ }
+
+ uint32 dQualitymodEntryId = (pProto->Quality + 1) * 2;
+ DurabilityQualityEntry const* dQualitymodEntry = sDurabilityQualityStore.LookupEntry(dQualitymodEntryId);
+ if (!dQualitymodEntry)
+ {
+ _player->SendSellError(SELL_ERR_CANT_SELL_ITEM, creature, itemguid, 0);
+ LOG_ERROR("network.opcode", "WORLD: HandleSellItemOpcode - Wrong dQualityModEntry {} for item {} count = {}", dQualitymodEntryId, pItem->GetEntry(), count);
+ return;
+ }
+
+ uint32 dmultiplier = dcost->multiplier[ItemSubClassToDurabilityMultiplierId(pProto->Class, pProto->SubClass)];
+ uint32 refund = uint32(std::ceil(LostDurability * dmultiplier * double(dQualitymodEntry->quality_mod)));
+
+ if (!refund)
+ {
+ refund = 1;
+ }
+
+ //starter items can cost more to refund than vendorprice
+ if (refund > money)
+ {
+ money = 1;
+ }
+ else
+ {
+ money -= refund;
+ }
+ }
+ }
+
if (count < pItem->GetCount()) // need split items
{
Item* pNewItem = pItem->CloneItem(count, _player);
@@ -828,13 +873,15 @@ void WorldSession::HandleSellItemOpcode(WorldPacket& recvData)
return;
}
+ pNewItem->SetUInt32Value(ITEM_FIELD_DURABILITY, pItem->GetUInt32Value(ITEM_FIELD_DURABILITY));
+
pItem->SetCount(pItem->GetCount() - count);
_player->ItemRemovedQuestCheck(pItem->GetEntry(), count);
if (_player->IsInWorld())
pItem->SendUpdateToPlayer(_player);
pItem->SetState(ITEM_CHANGED, _player);
- _player->AddItemToBuyBackSlot(pNewItem);
+ _player->AddItemToBuyBackSlot(pNewItem, money);
if (_player->IsInWorld())
pNewItem->SendUpdateToPlayer(_player);
}
@@ -843,7 +890,7 @@ void WorldSession::HandleSellItemOpcode(WorldPacket& recvData)
_player->ItemRemovedQuestCheck(pItem->GetEntry(), pItem->GetCount());
_player->RemoveItem(pItem->GetBagSlot(), pItem->GetSlot(), true);
pItem->RemoveFromUpdateQueueOf(_player);
- _player->AddItemToBuyBackSlot(pItem);
+ _player->AddItemToBuyBackSlot(pItem, money);
_player->UpdateTitansGrip();
}