aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Handlers/ItemHandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Handlers/ItemHandler.cpp')
-rw-r--r--src/server/game/Handlers/ItemHandler.cpp116
1 files changed, 76 insertions, 40 deletions
diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp
index a4e35620bd2..26f88bc6528 100644
--- a/src/server/game/Handlers/ItemHandler.cpp
+++ b/src/server/game/Handlers/ItemHandler.cpp
@@ -201,8 +201,21 @@ void WorldSession::HandleAutoEquipItemOpcode(WorldPackets::Item::AutoEquipItem&
Item* dstItem = _player->GetItemByPos(dest);
if (!dstItem) // empty slot, simple case
{
+ if (!srcItem->GetChildItem().IsEmpty())
+ {
+ InventoryResult childEquipResult = _player->CanEquipChildItem(srcItem);
+ if (childEquipResult != EQUIP_ERR_OK)
+ {
+ _player->SendEquipError(msg, srcItem);
+ return;
+ }
+ }
+
_player->RemoveItem(autoEquipItem.PackSlot, autoEquipItem.Slot, true);
_player->EquipItem(dest, srcItem, true);
+ if (!srcItem->GetChildItem().IsEmpty())
+ _player->EquipChildItem(autoEquipItem.PackSlot, autoEquipItem.Slot, srcItem);
+
_player->AutoUnequipOffhandIfNeed();
}
else // have currently equipped item, not simple case
@@ -217,52 +230,75 @@ void WorldSession::HandleAutoEquipItemOpcode(WorldPackets::Item::AutoEquipItem&
return;
}
- // check dest->src move possibility
- ItemPosCountVec sSrc;
- uint16 eSrc = 0;
- if (_player->IsInventoryPos(src))
- {
- msg = _player->CanStoreItem(autoEquipItem.PackSlot, autoEquipItem.Slot, sSrc, dstItem, true);
- if (msg != EQUIP_ERR_OK)
- msg = _player->CanStoreItem(autoEquipItem.PackSlot, NULL_SLOT, sSrc, dstItem, true);
- if (msg != EQUIP_ERR_OK)
- msg = _player->CanStoreItem(NULL_BAG, NULL_SLOT, sSrc, dstItem, true);
- }
- else if (_player->IsBankPos(src))
+ if (!dstItem->HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_CHILD))
{
- msg = _player->CanBankItem(autoEquipItem.PackSlot, autoEquipItem.Slot, sSrc, dstItem, true);
- if (msg != EQUIP_ERR_OK)
- msg = _player->CanBankItem(autoEquipItem.PackSlot, NULL_SLOT, sSrc, dstItem, true);
+ // check dest->src move possibility
+ ItemPosCountVec sSrc;
+ uint16 eSrc = 0;
+ if (_player->IsInventoryPos(src))
+ {
+ msg = _player->CanStoreItem(autoEquipItem.PackSlot, autoEquipItem.Slot, sSrc, dstItem, true);
+ if (msg != EQUIP_ERR_OK)
+ msg = _player->CanStoreItem(autoEquipItem.PackSlot, NULL_SLOT, sSrc, dstItem, true);
+ if (msg != EQUIP_ERR_OK)
+ msg = _player->CanStoreItem(NULL_BAG, NULL_SLOT, sSrc, dstItem, true);
+ }
+ else if (_player->IsBankPos(src))
+ {
+ msg = _player->CanBankItem(autoEquipItem.PackSlot, autoEquipItem.Slot, sSrc, dstItem, true);
+ if (msg != EQUIP_ERR_OK)
+ msg = _player->CanBankItem(autoEquipItem.PackSlot, NULL_SLOT, sSrc, dstItem, true);
+ if (msg != EQUIP_ERR_OK)
+ msg = _player->CanBankItem(NULL_BAG, NULL_SLOT, sSrc, dstItem, true);
+ }
+ else if (_player->IsEquipmentPos(src))
+ {
+ msg = _player->CanEquipItem(autoEquipItem.Slot, eSrc, dstItem, true);
+ if (msg == EQUIP_ERR_OK)
+ msg = _player->CanUnequipItem(eSrc, true);
+ }
+
+ if (msg == EQUIP_ERR_OK && Player::IsEquipmentPos(dest) && !srcItem->GetChildItem().IsEmpty())
+ msg = _player->CanEquipChildItem(srcItem);
+
if (msg != EQUIP_ERR_OK)
- msg = _player->CanBankItem(NULL_BAG, NULL_SLOT, sSrc, dstItem, true);
- }
- else if (_player->IsEquipmentPos(src))
- {
- msg = _player->CanEquipItem(autoEquipItem.Slot, eSrc, dstItem, true);
- if (msg == EQUIP_ERR_OK)
- msg = _player->CanUnequipItem(eSrc, true);
- }
+ {
+ _player->SendEquipError(msg, dstItem, srcItem);
+ return;
+ }
- if (msg != EQUIP_ERR_OK)
- {
- _player->SendEquipError(msg, dstItem, srcItem);
- return;
- }
+ // now do moves, remove...
+ _player->RemoveItem(dstbag, dstslot, false);
+ _player->RemoveItem(autoEquipItem.PackSlot, autoEquipItem.Slot, false);
- // now do moves, remove...
- _player->RemoveItem(dstbag, dstslot, false);
- _player->RemoveItem(autoEquipItem.PackSlot, autoEquipItem.Slot, false);
+ // add to dest
+ _player->EquipItem(dest, srcItem, true);
- // add to dest
- _player->EquipItem(dest, srcItem, true);
+ // add to src
+ if (_player->IsInventoryPos(src))
+ _player->StoreItem(sSrc, dstItem, true);
+ else if (_player->IsBankPos(src))
+ _player->BankItem(sSrc, dstItem, true);
+ else if (_player->IsEquipmentPos(src))
+ _player->EquipItem(eSrc, dstItem, true);
- // add to src
- if (_player->IsInventoryPos(src))
- _player->StoreItem(sSrc, dstItem, true);
- else if (_player->IsBankPos(src))
- _player->BankItem(sSrc, dstItem, true);
- else if (_player->IsEquipmentPos(src))
- _player->EquipItem(eSrc, dstItem, true);
+ if (Player::IsEquipmentPos(dest) && !srcItem->GetChildItem().IsEmpty())
+ _player->EquipChildItem(autoEquipItem.PackSlot, autoEquipItem.Slot, srcItem);
+ }
+ else
+ {
+ if (Item* parentItem = _player->GetItemByGuid(dstItem->GetGuidValue(ITEM_FIELD_CREATOR)))
+ {
+ if (Player::IsEquipmentPos(dest))
+ {
+ _player->AutoUnequipChildItem(parentItem);
+ // dest is now empty
+ _player->SwapItem(src, dest);
+ // src is now empty
+ _player->SwapItem(parentItem->GetPos(), src);
+ }
+ }
+ }
_player->AutoUnequipOffhandIfNeed();
}