diff options
author | UltraNix <80540499+UltraNix@users.noreply.github.com> | 2022-11-21 22:51:40 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-11-21 18:51:40 -0300 |
commit | 8f697bdaee685c51d93c918bdd1e2ee2c4a14b32 (patch) | |
tree | 04cb66f2ea361673d10bf048febe2143f6b41d6f /src/server/game/Handlers/ItemHandler.cpp | |
parent | cb475290b48d4d0a2e5484cdc95f9af9ec81dbb6 (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.cpp | 51 |
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(); } |