void WorldSession::HandleSwapInvItemOpcode(WorldPackets::Item::SwapInvItem& swapInvItem) { if (swapInvItem.Inv.Items.size() != 2) { TC_LOG_ERROR("network", "HandleSwapInvItemOpcode - Invalid itemCount (" SZFMTD ")", swapInvItem.Inv.Items.size()); return; } TC_LOG_DEBUG("network", "HandleSwapInvItemOpcode: receive Slot1: %u, Slot2: %u", swapInvItem.Slot1, swapInvItem.Slot2); // prevent attempt swap same item to current position generated by client at special checting sequence if (swapInvItem.Slot1 == swapInvItem.Slot2) return; if (!_player->IsValidPos(INVENTORY_SLOT_BAG_0, swapInvItem.Slot1, true)) { _player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND); return; } if (!_player->IsValidPos(INVENTORY_SLOT_BAG_0, swapInvItem.Slot2, true)) { _player->SendEquipError(EQUIP_ERR_WRONG_SLOT); return; } if (_player->IsBankPos(INVENTORY_SLOT_BAG_0, swapInvItem.Slot1) && !CanUseBank()) { TC_LOG_DEBUG("network", "HandleSwapInvItemOpcode - Unit (%s) not found or you can't interact with him.", m_currentBankerGUID.ToString().c_str()); return; } if (_player->IsBankPos(INVENTORY_SLOT_BAG_0, swapInvItem.Slot2) && !CanUseBank()) { TC_LOG_DEBUG("network", "HandleSwapInvItemOpcode - Unit (%s) not found or you can't interact with him.", m_currentBankerGUID.ToString().c_str()); return; } uint16 src = ((INVENTORY_SLOT_BAG_0 << 8) | swapInvItem.Slot1); uint16 dst = ((INVENTORY_SLOT_BAG_0 << 8) | swapInvItem.Slot2); _player->SwapItem(src, dst); }
void WorldSession::HandleSwapItem(WorldPackets::Item::SwapItem& swapItem) { if (swapItem.Inv.Items.size() != 2) { TC_LOG_ERROR("network", "HandleSwapItem - Invalid itemCount (" SZFMTD ")", swapItem.Inv.Items.size()); return; } TC_LOG_DEBUG("network", "HandleSwapItem: receive ContainerSlotA: %u, SlotA: %u, ContainerSlotB: %u, SlotB: %u", swapItem.ContainerSlotA, swapItem.SlotA, swapItem.ContainerSlotB, swapItem.SlotB); uint16 src = ((swapItem.ContainerSlotA << 8) | swapItem.SlotA); uint16 dst = ((swapItem.ContainerSlotB << 8) | swapItem.SlotB); // prevent attempt swap same item to current position generated by client at special checting sequence if (src == dst) return; if (!_player->IsValidPos(swapItem.ContainerSlotA, swapItem.SlotA, true)) { _player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND); return; } if (!_player->IsValidPos(swapItem.ContainerSlotB, swapItem.SlotB, true)) { _player->SendEquipError(EQUIP_ERR_WRONG_SLOT); return; } if (_player->IsBankPos(swapItem.ContainerSlotA, swapItem.SlotA) && !CanUseBank()) { TC_LOG_DEBUG("network", "HandleSwapItem - Unit (%s) not found or you can't interact with him.", m_currentBankerGUID.ToString().c_str()); return; } if (_player->IsBankPos(swapItem.ContainerSlotB, swapItem.SlotB) && !CanUseBank()) { TC_LOG_DEBUG("network", "HandleSwapItem - Unit (%s) not found or you can't interact with him.", m_currentBankerGUID.ToString().c_str()); return; } _player->SwapItem(src, dst); }
void WorldSession::HandleSwapInvItemOpcode(WorldPacket& recvData) { //TC_LOG_DEBUG("network", "WORLD: CMSG_SWAP_INV_ITEM"); uint8 srcslot, dstslot; recvData >> dstslot >> srcslot; //TC_LOG_DEBUG("STORAGE: receive srcslot = %u, dstslot = %u", srcslot, dstslot); // prevent attempt swap same item to current position generated by client at special checting sequence if (srcslot == dstslot) return; if (!_player->IsValidPos(INVENTORY_SLOT_BAG_0, srcslot, true)) { _player->SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, nullptr, nullptr); return; } if (!_player->IsValidPos(INVENTORY_SLOT_BAG_0, dstslot, true)) { _player->SendEquipError(EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT, nullptr, nullptr); return; } if (_player->IsBankPos(INVENTORY_SLOT_BAG_0, srcslot) && !CanUseBank()) { TC_LOG_DEBUG("network", "WORLD: HandleSwapInvItemOpcode - Unit (%s) not found or you can't interact with him.", m_currentBankerGUID.ToString().c_str()); return; } if (_player->IsBankPos(INVENTORY_SLOT_BAG_0, dstslot) && !CanUseBank()) { TC_LOG_DEBUG("network", "WORLD: HandleSwapInvItemOpcode - Unit (%s) not found or you can't interact with him.", m_currentBankerGUID.ToString().c_str()); return; } uint16 src = ((INVENTORY_SLOT_BAG_0 << 8) | srcslot); uint16 dst = ((INVENTORY_SLOT_BAG_0 << 8) | dstslot); _player->SwapItem(src, dst); }
void WorldSession::HandleBuyBankSlotOpcode(WorldPacket& recvPacket) { TC_LOG_DEBUG("network", "WORLD: CMSG_BUY_BANK_SLOT"); ObjectGuid guid; recvPacket >> guid; if (!CanUseBank(guid)) { TC_LOG_DEBUG("network", "WORLD: HandleBuyBankSlotOpcode - %s not found or you can't interact with him.", guid.ToString().c_str()); return; } uint32 slot = _player->GetBankBagSlotCount(); // next slot ++slot; TC_LOG_INFO("network", "PLAYER: Buy bank bag slot, slot number = %u", slot); BankBagSlotPricesEntry const* slotEntry = sBankBagSlotPricesStore.LookupEntry(slot); WorldPacket data(SMSG_BUY_BANK_SLOT_RESULT, 4); if (!slotEntry) { data << uint32(ERR_BANKSLOT_FAILED_TOO_MANY); SendPacket(&data); return; } uint32 price = slotEntry->price; if (!_player->HasEnoughMoney(price)) { data << uint32(ERR_BANKSLOT_INSUFFICIENT_FUNDS); SendPacket(&data); return; } _player->SetBankBagSlotCount(slot); _player->ModifyMoney(-int32(price)); data << uint32(ERR_BANKSLOT_OK); SendPacket(&data); _player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT); }
void WorldSession::HandleAutoStoreBankItemOpcode(WorldPacket& recvPacket) { TC_LOG_DEBUG("network", "WORLD: CMSG_AUTOSTORE_BANK_ITEM"); uint8 srcbag, srcslot; recvPacket >> srcbag >> srcslot; TC_LOG_DEBUG("network", "STORAGE: receive srcbag = %u, srcslot = %u", srcbag, srcslot); if (!CanUseBank()) { TC_LOG_DEBUG("network", "WORLD: HandleAutoStoreBankItemOpcode - Unit (%s) not found or you can't interact with him.", m_currentBankerGUID.ToString().c_str()); return; } Item* pItem = _player->GetItemByPos(srcbag, srcslot); if (!pItem) return; if (_player->IsBankPos(srcbag, srcslot)) // moving from bank to inventory { ItemPosCountVec dest; InventoryResult msg = _player->CanStoreItem(NULL_BAG, NULL_SLOT, dest, pItem, false); if (msg != EQUIP_ERR_OK) { _player->SendEquipError(msg, pItem, nullptr); return; } _player->RemoveItem(srcbag, srcslot, true); if (Item const* storedItem = _player->StoreItem(dest, pItem, true)) _player->ItemAddedQuestCheck(storedItem->GetEntry(), storedItem->GetCount()); } else // moving from inventory to bank { ItemPosCountVec dest; InventoryResult msg = _player->CanBankItem(NULL_BAG, NULL_SLOT, dest, pItem, false); if (msg != EQUIP_ERR_OK) { _player->SendEquipError(msg, pItem, nullptr); return; } _player->RemoveItem(srcbag, srcslot, true); _player->BankItem(dest, pItem, true); } }
void WorldSession::HandleAutoBankItemOpcode(WorldPacket& recvPacket) { TC_LOG_DEBUG("network", "WORLD: CMSG_AUTOBANK_ITEM"); uint8 srcbag, srcslot; recvPacket >> srcbag >> srcslot; TC_LOG_DEBUG("network", "STORAGE: receive srcbag = %u, srcslot = %u", srcbag, srcslot); if (!CanUseBank()) { TC_LOG_DEBUG("network", "WORLD: HandleAutoBankItemOpcode - Unit (%s) not found or you can't interact with him.", m_currentBankerGUID.ToString().c_str()); return; } Item* pItem = _player->GetItemByPos(srcbag, srcslot); if (!pItem) return; ItemPosCountVec dest; InventoryResult msg = _player->CanBankItem(NULL_BAG, NULL_SLOT, dest, pItem, false); if (msg != EQUIP_ERR_OK) { _player->SendEquipError(msg, pItem, nullptr); return; } if (dest.size() == 1 && dest[0].pos == pItem->GetPos()) { _player->SendEquipError(EQUIP_ERR_NONE, pItem, nullptr); return; } _player->RemoveItem(srcbag, srcslot, true); _player->ItemRemovedQuestCheck(pItem->GetEntry(), pItem->GetCount()); _player->BankItem(dest, pItem, true); }