diff options
Diffstat (limited to 'src/net/eathena/inventoryhandler.cpp')
-rw-r--r-- | src/net/eathena/inventoryhandler.cpp | 950 |
1 files changed, 44 insertions, 906 deletions
diff --git a/src/net/eathena/inventoryhandler.cpp b/src/net/eathena/inventoryhandler.cpp index fd74ac11a..a6b16c466 100644 --- a/src/net/eathena/inventoryhandler.cpp +++ b/src/net/eathena/inventoryhandler.cpp @@ -39,6 +39,9 @@ #include "listeners/arrowslistener.h" +#include "net/ea/inventoryrecv.h" + +#include "net/eathena/inventoryrecv.h" #include "net/eathena/itemflags.h" #include "net/eathena/menu.h" #include "net/eathena/messageout.h" @@ -80,8 +83,6 @@ const EquipSlot::Type EQUIP_CONVERT[] = namespace EAthena { -Ea::InventoryItems InventoryHandler::mCartItems; - InventoryHandler::InventoryHandler() : MessageHandler(), Ea::InventoryHandler(), @@ -134,7 +135,7 @@ InventoryHandler::InventoryHandler() : handledMessages = _messages; inventoryHandler = this; - mCartItems.clear(); + InventoryRecv::mCartItems.clear(); } InventoryHandler::~InventoryHandler() @@ -146,163 +147,163 @@ void InventoryHandler::handleMessage(Net::MessageIn &msg) switch (msg.getId()) { case SMSG_PLAYER_INVENTORY: - processPlayerInventory(msg); + InventoryRecv::processPlayerInventory(msg); break; case SMSG_PLAYER_STORAGE_ITEMS: - processPlayerStorage(msg); + InventoryRecv::processPlayerStorage(msg); break; case SMSG_PLAYER_STORAGE_EQUIP: - processPlayerStorageEquip(msg); + InventoryRecv::processPlayerStorageEquip(msg); break; case SMSG_PLAYER_INVENTORY_ADD: - processPlayerInventoryAdd(msg); + InventoryRecv::processPlayerInventoryAdd(msg); break; case SMSG_PLAYER_INVENTORY_REMOVE: - processPlayerInventoryRemove(msg); + Ea::InventoryRecv::processPlayerInventoryRemove(msg); break; case SMSG_PLAYER_INVENTORY_REMOVE2: - processPlayerInventoryRemove2(msg); + InventoryRecv::processPlayerInventoryRemove2(msg); break; case SMSG_PLAYER_INVENTORY_USE: - processPlayerInventoryUse(msg); + Ea::InventoryRecv::processPlayerInventoryUse(msg); break; case SMSG_ITEM_USE_RESPONSE: - processItemUseResponse(msg); + Ea::InventoryRecv::processItemUseResponse(msg); break; case SMSG_PLAYER_STORAGE_STATUS: - processPlayerStorageStatus(msg); + Ea::InventoryRecv::processPlayerStorageStatus(msg); break; case SMSG_PLAYER_STORAGE_ADD: - processPlayerStorageAdd(msg); + InventoryRecv::processPlayerStorageAdd(msg); break; case SMSG_PLAYER_STORAGE_REMOVE: - processPlayerStorageRemove(msg); + InventoryRecv::processPlayerStorageRemove(msg); break; case SMSG_PLAYER_STORAGE_CLOSE: - processPlayerStorageClose(msg); + Ea::InventoryRecv::processPlayerStorageClose(msg); break; case SMSG_PLAYER_EQUIPMENT: - processPlayerEquipment(msg); + InventoryRecv::processPlayerEquipment(msg); break; case SMSG_PLAYER_EQUIP: - processPlayerEquip(msg); + InventoryRecv::processPlayerEquip(msg); break; case SMSG_PLAYER_UNEQUIP: - processPlayerUnEquip(msg); + InventoryRecv::processPlayerUnEquip(msg); break; case SMSG_PLAYER_ATTACK_RANGE: - processPlayerAttackRange(msg); + Ea::InventoryRecv::processPlayerAttackRange(msg); break; case SMSG_PLAYER_ARROW_EQUIP: - processPlayerArrowEquip(msg); + Ea::InventoryRecv::processPlayerArrowEquip(msg); break; case SMSG_PLAYER_USE_CARD: - processPlayerUseCard(msg); + InventoryRecv::processPlayerUseCard(msg); break; case SMSG_PLAYER_INSERT_CARD: - processPlayerInsertCard(msg); + InventoryRecv::processPlayerInsertCard(msg); break; case SMSG_PLAYER_ITEM_RENTAL_TIME: - processPlayerItemRentalTime(msg); + InventoryRecv::processPlayerItemRentalTime(msg); break; case SMSG_PLAYER_ITEM_RENTAL_EXPIRED: - processPlayerItemRentalExpired(msg); + InventoryRecv::processPlayerItemRentalExpired(msg); break; case SMSG_CART_INFO: - processCartInfo(msg); + InventoryRecv::processCartInfo(msg); break; case SMSG_CART_REMOVE: - processCartRemove(msg); + InventoryRecv::processCartRemove(msg); break; case SMSG_PLAYER_CART_ADD: - processPlayerCartAdd(msg); + InventoryRecv::processPlayerCartAdd(msg); break; case SMSG_PLAYER_CART_EQUIP: - processPlayerCartEquip(msg); + InventoryRecv::processPlayerCartEquip(msg); break; case SMSG_PLAYER_CART_ITEMS: - processPlayerCartItems(msg); + InventoryRecv::processPlayerCartItems(msg); break; case SMSG_PLAYER_CART_REMOVE: - processPlayerCartRemove(msg); + InventoryRecv::processPlayerCartRemove(msg); break; case SMSG_PLAYER_IDENTIFY_LIST: - processPlayerIdentifyList(msg); + InventoryRecv::processPlayerIdentifyList(msg); break; case SMSG_PLAYER_IDENTIFIED: - processPlayerIdentified(msg); + InventoryRecv::processPlayerIdentified(msg); break; case SMSG_PLAYER_REFINE: - processPlayerRefine(msg); + InventoryRecv::processPlayerRefine(msg); break; case SMSG_PLAYER_REPAIR_LIST: - processPlayerRepairList(msg); + InventoryRecv::processPlayerRepairList(msg); break; case SMSG_PLAYER_REPAIR_EFFECT: - processPlayerRepairEffect(msg); + InventoryRecv::processPlayerRepairEffect(msg); break; case SMSG_PLAYER_REFINE_LIST: - processPlayerRefineList(msg); + InventoryRecv::processPlayerRefineList(msg); break; case SMSG_PLAYER_STORAGE_PASSWORD: - processPlayerStoragePassword(msg); + InventoryRecv::processPlayerStoragePassword(msg); break; case SMSG_PLAYER_STORAGE_PASSWORD_RESULT: - processPlayerStoragePasswordResult(msg); + InventoryRecv::processPlayerStoragePasswordResult(msg); break; case SMSG_PLAYER_COOKING_LIST: - processPlayerCookingList(msg); + InventoryRecv::processPlayerCookingList(msg); break; case SMSG_ITEM_DAMAGED: - processItemDamaged(msg); + InventoryRecv::processItemDamaged(msg); break; case SMSG_PLAYER_FAVORITE_ITEM: - processFavoriteItem(msg); + InventoryRecv::processFavoriteItem(msg); break; case SMSG_PLAYER_CART_ADD_ERROR: - processCartAddError(msg); + InventoryRecv::processCartAddError(msg); break; case SMSG_BIND_ITEM: - processBindItem(msg); + InventoryRecv::processBindItem(msg); break; default: @@ -431,467 +432,6 @@ void InventoryHandler::favoriteItem(const Item *const item, outMsg.writeInt8(favorite, "favorite flag"); } -void InventoryHandler::processPlayerEquipment(Net::MessageIn &msg) -{ - BLOCK_START("InventoryHandler::processPlayerEquipment") - Inventory *const inventory = localPlayer - ? PlayerInfo::getInventory() : nullptr; - - msg.readInt16("len"); - Equipment *const equipment = PlayerInfo::getEquipment(); - if (equipment && !equipment->getBackend()) - { // look like SMSG_PLAYER_INVENTORY was not received - mEquips.clear(); - equipment->setBackend(&mEquips); - } - const int number = (msg.getLength() - 4) / 31; - - for (int loop = 0; loop < number; loop++) - { - const int index = msg.readInt16("index") - INVENTORY_OFFSET; - const int itemId = msg.readInt16("item id"); - const int itemType = msg.readUInt8("item type"); - msg.readInt32("location"); - const int equipType = msg.readInt32("wear state"); - const uint8_t refine = static_cast<uint8_t>(msg.readInt8("refine")); - int cards[4]; - for (int f = 0; f < 4; f++) - cards[f] = msg.readInt16("card"); - msg.readInt32("hire expire date (?)"); - msg.readInt16("equip type"); - msg.readInt16("item sprite number"); - ItemFlags flags; - flags.byte = msg.readUInt8("flags"); - if (inventory) - { - inventory->setItem(index, - itemId, - itemType, - 1, - refine, - ItemColorManager::getColorFromCards(&cards[0]), - fromBool(flags.bits.isIdentified, Identified), - fromBool(flags.bits.isDamaged, Damaged), - fromBool(flags.bits.isFavorite, Favorite), - Equipm_true, - Equipped_false); - inventory->setCards(index, cards, 4); - } - - if (equipType) - mEquips.setEquipment(getSlot(equipType), index); - } - BLOCK_END("InventoryHandler::processPlayerEquipment") -} - -void InventoryHandler::processPlayerInventoryAdd(Net::MessageIn &msg) -{ - BLOCK_START("InventoryHandler::processPlayerInventoryAdd") - Inventory *const inventory = localPlayer - ? PlayerInfo::getInventory() : nullptr; - - if (PlayerInfo::getEquipment() - && !PlayerInfo::getEquipment()->getBackend()) - { // look like SMSG_PLAYER_INVENTORY was not received - mEquips.clear(); - PlayerInfo::getEquipment()->setBackend(&mEquips); - } - const int index = msg.readInt16("index") - INVENTORY_OFFSET; - int amount = msg.readInt16("count"); - const int itemId = msg.readInt16("item id"); - uint8_t identified = msg.readUInt8("identified"); - const uint8_t damaged = msg.readUInt8("is damaged"); - const uint8_t refine = msg.readUInt8("refine"); - int cards[4]; - for (int f = 0; f < 4; f++) - cards[f] = msg.readInt16("card"); - const int equipType = msg.readInt32("location"); - const int itemType = msg.readUInt8("item type"); - const unsigned char err = msg.readUInt8("result"); - msg.readInt32("hire expire date"); - msg.readInt16("bind on equip"); - - const ItemColor color = ItemColorManager::getColorFromCards(&cards[0]); - const ItemInfo &itemInfo = ItemDB::get(itemId); - BeingId floorId; - if (mSentPickups.empty()) - { - floorId = BeingId_zero; - } - else - { - floorId = mSentPickups.front(); - mSentPickups.pop(); - } - - if (err) - { - PickupT pickup; - switch (err) - { - case 1: - pickup = Pickup::BAD_ITEM; - break; - case 2: - pickup = Pickup::TOO_HEAVY; - break; - case 4: - pickup = Pickup::INV_FULL; - break; - case 5: - pickup = Pickup::MAX_AMOUNT; - break; - case 6: - pickup = Pickup::TOO_FAR; - break; - case 7: - pickup = Pickup::STACK_AMOUNT; - break; - default: - pickup = Pickup::UNKNOWN; - UNIMPLIMENTEDPACKET; - break; - } - if (localPlayer) - { - localPlayer->pickedUp(itemInfo, - 0, - color, - floorId, - pickup); - } - } - else - { - if (localPlayer) - { - localPlayer->pickedUp(itemInfo, - amount, - color, - floorId, - Pickup::OKAY); - } - - if (inventory) - { - const Item *const item = inventory->getItem(index); - - if (item && item->getId() == itemId) - amount += item->getQuantity(); - - inventory->setItem(index, - itemId, - itemType, - amount, - refine, - color, - fromBool(identified, Identified), - fromBool(damaged, Damaged), - Favorite_false, - fromBool(equipType, Equipm), - Equipped_false); - inventory->setCards(index, cards, 4); - } - ArrowsListener::distributeEvent(); - } - BLOCK_END("InventoryHandler::processPlayerInventoryAdd") -} - -void InventoryHandler::processPlayerInventory(Net::MessageIn &msg) -{ - BLOCK_START("InventoryHandler::processPlayerInventory") - Inventory *const inventory = localPlayer - ? PlayerInfo::getInventory() : nullptr; - if (PlayerInfo::getEquipment()) - { - // Clear inventory - this will be a complete refresh - mEquips.clear(); - PlayerInfo::getEquipment()->setBackend(&mEquips); - } - - if (inventory) - inventory->clear(); - - msg.readInt16("len"); - - const int number = (msg.getLength() - 4) / 24; - - for (int loop = 0; loop < number; loop++) - { - const int index = msg.readInt16("item index") - INVENTORY_OFFSET; - const int itemId = msg.readInt16("item id"); - const int itemType = msg.readUInt8("item type"); - const int amount = msg.readInt16("count"); - msg.readInt32("wear state / equip"); - int cards[4]; - for (int f = 0; f < 4; f++) - cards[f] = msg.readInt16("card"); - msg.readInt32("hire expire date (?)"); - ItemFlags flags; - flags.byte = msg.readUInt8("flags"); - - if (inventory) - { - inventory->setItem(index, - itemId, - itemType, - amount, - 0, - ItemColorManager::getColorFromCards(&cards[0]), - fromBool(flags.bits.isIdentified, Identified), - fromBool(flags.bits.isDamaged, Damaged), - fromBool(flags.bits.isFavorite, Favorite), - Equipm_false, - Equipped_false); - inventory->setCards(index, cards, 4); - } - } - BLOCK_END("InventoryHandler::processPlayerInventory") -} - -void InventoryHandler::processPlayerStorage(Net::MessageIn &msg) -{ - BLOCK_START("InventoryHandler::processPlayerInventory") - mInventoryItems.clear(); - - msg.readInt16("len"); - msg.readString(24, "storage name"); - - const int number = (msg.getLength() - 4 - 24) / 24; - - for (int loop = 0; loop < number; loop++) - { - const int index = msg.readInt16("item index") - STORAGE_OFFSET; - const int itemId = msg.readInt16("item id"); - const int itemType = msg.readUInt8("item type"); - const int amount = msg.readInt16("count"); - msg.readInt32("wear state / equip"); - int cards[4]; - for (int f = 0; f < 4; f++) - cards[f] = msg.readInt16("card"); - msg.readInt32("hire expire date (?)"); - ItemFlags flags; - flags.byte = msg.readUInt8("flags"); - - mInventoryItems.push_back(Ea::InventoryItem(index, - itemId, - itemType, - cards, - amount, - 0, - ItemColorManager::getColorFromCards(&cards[0]), - fromBool(flags.bits.isIdentified, Identified), - fromBool(flags.bits.isDamaged, Damaged), - fromBool(flags.bits.isFavorite, Favorite), - Equipm_false)); - } - BLOCK_END("InventoryHandler::processPlayerInventory") -} - -void InventoryHandler::processPlayerEquip(Net::MessageIn &msg) -{ - BLOCK_START("InventoryHandler::processPlayerEquip") - const int index = msg.readInt16("index") - INVENTORY_OFFSET; - const int equipType = msg.readInt32("wear location"); - msg.readInt16("sprite"); - const uint8_t flag = msg.readUInt8("result"); - - switch (flag) - { - case 0: - mEquips.setEquipment(getSlot(equipType), index); - break; - case 1: - NotifyManager::notify(NotifyTypes::EQUIP_FAILED_LEVEL); - break; - - case 2: - default: - NotifyManager::notify(NotifyTypes::EQUIP_FAILED); - break; - } - BLOCK_END("InventoryHandler::processPlayerEquip") -} - -void InventoryHandler::processPlayerUnEquip(Net::MessageIn &msg) -{ - BLOCK_START("InventoryHandler::processPlayerUnEquip") - msg.readInt16("index"); - const int equipType = msg.readInt32("wear location"); - const uint8_t flag = msg.readUInt8("result"); - - // +++ need use UNEQUIP_FAILED event - if (flag) - NotifyManager::notify(NotifyTypes::EQUIP_FAILED); - else - mEquips.setEquipment(getSlot(equipType), -1); - if (equipType & 0x8000) - ArrowsListener::distributeEvent(); - BLOCK_END("InventoryHandler::processPlayerUnEquip") -} - -void InventoryHandler::processPlayerInventoryRemove2(Net::MessageIn &msg) -{ - BLOCK_START("InventoryHandler::processPlayerInventoryRemove2") - Inventory *const inventory = localPlayer - ? PlayerInfo::getInventory() : nullptr; - - // +++ here possible use particle or text/sound effects - // for different reasons - msg.readInt16("reason"); - const int index = msg.readInt16("index") - INVENTORY_OFFSET; - const int amount = msg.readInt16("amount"); - if (inventory) - { - if (Item *const item = inventory->getItem(index)) - { - item->increaseQuantity(-amount); - if (item->getQuantity() == 0) - inventory->removeItemAt(index); - ArrowsListener::distributeEvent(); - } - } - BLOCK_END("InventoryHandler::processPlayerInventoryRemove2") -} - -void InventoryHandler::processPlayerStorageEquip(Net::MessageIn &msg) -{ - BLOCK_START("InventoryHandler::processPlayerStorageEquip") - msg.readInt16("len"); - const int number = (msg.getLength() - 4 - 24) / 31; - - msg.readString(24, "storage name"); - for (int loop = 0; loop < number; loop++) - { - const int index = msg.readInt16("index") - STORAGE_OFFSET; - const int itemId = msg.readInt16("item id"); - const int itemType = msg.readUInt8("item type"); - const int amount = 1; - msg.readInt32("location"); - msg.readInt32("wear state"); - const uint8_t refine = msg.readUInt8("refine level"); - int cards[4]; - for (int f = 0; f < 4; f++) - cards[f] = msg.readInt16("card"); - msg.readInt32("hire expire date"); - msg.readInt16("bind on equip"); - msg.readInt16("sprite"); - ItemFlags flags; - flags.byte = msg.readUInt8("flags"); - - mInventoryItems.push_back(Ea::InventoryItem(index, - itemId, - itemType, - cards, - amount, - refine, - ItemColorManager::getColorFromCards(&cards[0]), - fromBool(flags.bits.isIdentified, Identified), - fromBool(flags.bits.isDamaged, Damaged), - fromBool(flags.bits.isFavorite, Favorite), - Equipm_false)); - } - BLOCK_END("InventoryHandler::processPlayerStorageEquip") -} - -void InventoryHandler::processPlayerStorageAdd(Net::MessageIn &msg) -{ - BLOCK_START("InventoryHandler::processPlayerStorageAdd") - // Move an item into storage - const int index = msg.readInt16("index") - STORAGE_OFFSET; - const int amount = msg.readInt32("amount"); - const int itemId = msg.readInt16("item id"); - const int itemType = msg.readUInt8("type"); - const unsigned char identified = msg.readUInt8("identify"); - const Damaged damaged = fromBool(msg.readUInt8("attribute"), Damaged); - const uint8_t refine = msg.readUInt8("refine"); - int cards[4]; - for (int f = 0; f < 4; f++) - cards[f] = msg.readInt16("card"); - - const ItemColor color = ItemColorManager::getColorFromCards(&cards[0]); - if (Item *const item = mStorage->getItem(index)) - { - item->setId(itemId, color); - item->increaseQuantity(amount); - } - else - { - if (mStorage) - { - mStorage->setItem(index, - itemId, - itemType, - amount, - refine, - color, - fromBool(identified, Identified), - damaged, - Favorite_false, - Equipm_false, - Equipped_false); - mStorage->setCards(index, cards, 4); - } - } - BLOCK_END("InventoryHandler::processPlayerStorageAdd") -} - -void InventoryHandler::processPlayerUseCard(Net::MessageIn &msg) -{ - const Inventory *const inv = PlayerInfo::getInventory(); - const int index = inventoryHandler->getItemIndex(); - const Item *item1 = nullptr; - if (inv) - item1 = inv->getItem(index); - SellDialog *const dialog = CREATEWIDGETR(InsertCardDialog, - index, item1); - - const int count = (msg.readInt16("len") - 4) / 2; - for (int f = 0; f < count; f ++) - { - const int itemIndex = msg.readInt16("item index") - INVENTORY_OFFSET; - if (!inv) - continue; - const Item *const item = inv->getItem(itemIndex); - if (!item) - continue; - dialog->addItem(item, 0); - } -} - -void InventoryHandler::processPlayerInsertCard(Net::MessageIn &msg) -{ - const int itemIndex = msg.readInt16("item index") - INVENTORY_OFFSET; - const int cardIndex = msg.readInt16("card index") - INVENTORY_OFFSET; - if (msg.readUInt8("flag")) - { - NotifyManager::notify(NotifyTypes::CARD_INSERT_FAILED); - } - else - { - NotifyManager::notify(NotifyTypes::CARD_INSERT_SUCCESS); - Inventory *const inv = PlayerInfo::getInventory(); - if (!inv) - return; - Item *const card = inv->getItem(cardIndex); - int cardId = 0; - if (card) - { - cardId = card->getId(); - card->increaseQuantity(-1); - if (card->getQuantity() == 0) - inv->removeItemAt(cardIndex); - } - Item *const item = inv->getItem(itemIndex); - if (item) - { - item->addCard(cardId); - item->updateColor(); - itemPopup->resetPopup(); - } - } -} - void InventoryHandler::selectEgg(const Item *const item) const { if (!item) @@ -902,40 +442,6 @@ void InventoryHandler::selectEgg(const Item *const item) const menu = MenuType::Unknown; } -void InventoryHandler::processPlayerItemRentalTime(Net::MessageIn &msg) -{ - const int id = msg.readInt16("item id"); - const int seconds = msg.readInt32("seconds"); - const ItemInfo &info = ItemDB::get(id); - const std::string timeStr = timeDiffToString(seconds); - NotifyManager::notify(NotifyTypes::RENTAL_TIME_LEFT, - // TRANSLATORS: notification message - strprintf(_("Left %s rental time for item %s."), - timeStr.c_str(), info.getName().c_str())); -} - -void InventoryHandler::processPlayerItemRentalExpired(Net::MessageIn &msg) -{ - Inventory *const inventory = localPlayer - ? PlayerInfo::getInventory() : nullptr; - - const int index = msg.readInt16("index") - INVENTORY_OFFSET; - const int id = msg.readInt16("item id"); - const ItemInfo &info = ItemDB::get(id); - - NotifyManager::notify(NotifyTypes::RENTAL_TIME_EXPIRED, - info.getName()); - if (inventory) - { - if (Item *const item = inventory->getItem(index)) - { - item->increaseQuantity(-item->getQuantity()); - inventory->removeItemAt(index); - ArrowsListener::distributeEvent(); - } - } -} - int InventoryHandler::convertFromServerSlot(const int serverSlot) const { if (serverSlot < 0 || serverSlot > 15) @@ -944,372 +450,4 @@ int InventoryHandler::convertFromServerSlot(const int serverSlot) const return static_cast<int>(EQUIP_CONVERT[serverSlot]); } -void InventoryHandler::processPlayerStorageRemove(Net::MessageIn &msg) -{ - BLOCK_START("InventoryHandler::processPlayerStorageRemove") - // Move an item out of storage - const int index = msg.readInt16("index") - STORAGE_OFFSET; - const int amount = msg.readInt32("amount"); - if (mStorage) - { - if (Item *const item = mStorage->getItem(index)) - { - item->increaseQuantity(-amount); - if (item->getQuantity() == 0) - mStorage->removeItemAt(index); - } - } - BLOCK_END("InventoryHandler::processPlayerStorageRemove") -} - -void InventoryHandler::processCartInfo(Net::MessageIn &msg) -{ - msg.readInt16("cart items used"); - const int size = msg.readInt16("max cart items"); - PlayerInfo::setAttribute(Attributes::CART_TOTAL_WEIGHT, - msg.readInt32("cart weight")); - PlayerInfo::setAttribute(Attributes::CART_MAX_WEIGHT, - msg.readInt32("max cart weight")); - if (mCartItems.empty()) - return; - - Inventory *const inv = PlayerInfo::getCartInventory(); - if (!inv) - return; - - inv->resize(size); - - FOR_EACH (Ea::InventoryItems::const_iterator, it, mCartItems) - { - inv->setItem((*it).slot, - (*it).id, - (*it).type, - (*it).quantity, - (*it).refine, - (*it).color, - (*it).identified, - (*it).damaged, - (*it).favorite, - (*it).equip, - Equipped_false); - } - mCartItems.clear(); -} - -void InventoryHandler::processCartRemove(Net::MessageIn &msg) -{ - UNIMPLIMENTEDPACKET; - // +++ need close or clear cart? -} - -void InventoryHandler::processPlayerCartAdd(Net::MessageIn &msg) -{ - BLOCK_START("InventoryHandler::processPlayerCartAdd") - Inventory *const inventory = localPlayer - ? PlayerInfo::getCartInventory() : nullptr; - - const int index = msg.readInt16("index") - INVENTORY_OFFSET; - int amount = msg.readInt32("count"); - const int itemId = msg.readInt16("item id"); - const int itemType = msg.readUInt8("item type"); - uint8_t identified = msg.readUInt8("identified"); - const Damaged damaged = fromBool(msg.readUInt8("attribute"), Damaged); - const uint8_t refine = msg.readUInt8("refine"); - int cards[4]; - for (int f = 0; f < 4; f++) - cards[f] = msg.readInt16("card"); - - if (inventory) - { - const Item *const item = inventory->getItem(index); - - if (item && item->getId() == itemId) - amount += item->getQuantity(); - - inventory->setItem(index, - itemId, - itemType, - amount, - refine, - ItemColorManager::getColorFromCards(&cards[0]), - fromBool(identified, Identified), - damaged, - Favorite_false, - Equipm_false, - Equipped_false); - inventory->setCards(index, cards, 4); - } - BLOCK_END("InventoryHandler::processPlayerCartAdd") -} - -void InventoryHandler::processPlayerCartEquip(Net::MessageIn &msg) -{ - BLOCK_START("InventoryHandler::processPlayerCartEquip") - msg.readInt16("len"); - const int number = (msg.getLength() - 4) / 31; - for (int loop = 0; loop < number; loop++) - { - const int index = msg.readInt16("index") - INVENTORY_OFFSET; - const int itemId = msg.readInt16("item id"); - const int itemType = msg.readUInt8("item type"); - const int amount = 1; - msg.readInt32("location"); - msg.readInt32("wear state"); - const uint8_t refine = msg.readUInt8("refine level"); - int cards[4]; - for (int f = 0; f < 4; f++) - cards[f] = msg.readInt16("card"); - msg.readInt32("hire expire date"); - msg.readInt16("bind on equip"); - msg.readInt16("sprite"); - ItemFlags flags; - flags.byte = msg.readUInt8("flags"); - - mCartItems.push_back(Ea::InventoryItem(index, - itemId, - itemType, - cards, - amount, - refine, - ItemColorManager::getColorFromCards(&cards[0]), - fromBool(flags.bits.isIdentified, Identified), - fromBool(flags.bits.isDamaged, Damaged), - fromBool(flags.bits.isFavorite, Favorite), - Equipm_false)); - } - BLOCK_END("InventoryHandler::processPlayerCartEquip") -} - -void InventoryHandler::processPlayerCartItems(Net::MessageIn &msg) -{ - BLOCK_START("InventoryHandler::processPlayerCartItems") - mInventoryItems.clear(); - - msg.readInt16("len"); - const int number = (msg.getLength() - 4) / 23; - - for (int loop = 0; loop < number; loop++) - { - const int index = msg.readInt16("item index") - INVENTORY_OFFSET; - const int itemId = msg.readInt16("item id"); - const int itemType = msg.readUInt8("item type"); - const int amount = msg.readInt16("count"); - msg.readInt32("wear state / equip"); - int cards[4]; - for (int f = 0; f < 4; f++) - cards[f] = msg.readInt16("card"); - msg.readInt32("hire expire date (?)"); - ItemFlags flags; - flags.byte = msg.readUInt8("flags"); - - mCartItems.push_back(Ea::InventoryItem(index, - itemId, - itemType, - cards, - amount, - 0, - ItemColorManager::getColorFromCards(&cards[0]), - fromBool(flags.bits.isIdentified, Identified), - fromBool(flags.bits.isDamaged, Damaged), - fromBool(flags.bits.isFavorite, Favorite), - Equipm_false)); - } - BLOCK_END("InventoryHandler::processPlayerCartItems") -} - -void InventoryHandler::processPlayerCartRemove(Net::MessageIn &msg) -{ - BLOCK_START("InventoryHandler::processPlayerCartRemove") - const int index = msg.readInt16("index") - INVENTORY_OFFSET; - const int amount = msg.readInt32("amount"); - - Inventory *const inv = PlayerInfo::getCartInventory(); - if (!inv) - return; - - if (Item *const item = inv->getItem(index)) - { - item->increaseQuantity(-amount); - if (item->getQuantity() == 0) - inv->removeItemAt(index); - } - BLOCK_END("InventoryHandler::processPlayerCartRemove") -} - -void InventoryHandler::processPlayerIdentifyList(Net::MessageIn &msg) -{ - UNIMPLIMENTEDPACKET; - - menu = MenuType::Identify; - const int count = msg.readInt16("len") - 4; - for (int f = 0; f < count; f ++) - msg.readInt16("inv index"); -} - -void InventoryHandler::processPlayerIdentified(Net::MessageIn &msg) -{ - UNIMPLIMENTEDPACKET; - - msg.readInt16("inv index"); - msg.readUInt8("flag"); -} - -void InventoryHandler::processPlayerRefine(Net::MessageIn &msg) -{ - const int flag = msg.readInt16("flag"); - const int index = msg.readInt16("inv index") - INVENTORY_OFFSET; - msg.readInt16("refine"); - const Inventory *const inv = PlayerInfo::getInventory(); - const Item *item = nullptr; - int notifyType; - std::string message; - std::string itemName; - if (inv) - item = inv->getItem(index); - if (item) - { - itemName = item->getName(); - } - else - { - // TRANSLATORS: unknown item - itemName = _("Unknown item"); - } - switch (flag) - { - case 0: - notifyType = NotifyTypes::REFINE_SUCCESS; - break; - case 1: - notifyType = NotifyTypes::REFINE_FAILURE; - break; - case 2: - notifyType = NotifyTypes::REFINE_DOWNGRADE; - break; - default: - UNIMPLIMENTEDPACKET; - notifyType = NotifyTypes::REFINE_UNKNOWN; - break; - } - NotifyManager::notify(notifyType, itemName); -} - -void InventoryHandler::processPlayerRepairList(Net::MessageIn &msg) -{ - UNIMPLIMENTEDPACKET; - - const int count = (msg.readInt16("len") - 4) / 13; - for (int f = 0; f < count; f ++) - { - msg.readInt16("index"); - msg.readInt16("item id"); - msg.readUInt8("refine"); - for (int d = 0; d < 4; d ++) - msg.readInt16("card"); - } - menu = MenuType::RepairWespon; -} - -void InventoryHandler::processPlayerRepairEffect(Net::MessageIn &msg) -{ - UNIMPLIMENTEDPACKET; - - msg.readInt16("item index"); - msg.readUInt8("flag"); -} - -void InventoryHandler::processPlayerRefineList(Net::MessageIn &msg) -{ - UNIMPLIMENTEDPACKET; - - const int count = (msg.readInt16("len") - 4) / 13; - - for (int f = 0; f < count; f ++) - { - msg.readInt16("item index"); - msg.readInt16("item id"); - msg.readUInt8("refine"); - for (int d = 0; d < 4; d ++) - msg.readInt16("card"); - } - menu = MenuType::WeaponeRefine; -} - -void InventoryHandler::processPlayerStoragePassword(Net::MessageIn &msg) -{ - UNIMPLIMENTEDPACKET; - - msg.readInt16("info"); -} - -void InventoryHandler::processPlayerStoragePasswordResult(Net::MessageIn &msg) -{ - UNIMPLIMENTEDPACKET; - - msg.readInt16("result"); - msg.readInt16("error count"); -} - -void InventoryHandler::processPlayerCookingList(Net::MessageIn &msg) -{ - UNIMPLIMENTEDPACKET; - - const int count = (msg.readInt16("len") - 6) / 2; - msg.readInt16("list type"); - for (int f = 0; f < count; f ++) - msg.readInt16("item id"); -} - -void InventoryHandler::processItemDamaged(Net::MessageIn &msg) -{ - UNIMPLIMENTEDPACKET; - - msg.readInt16("position"); - msg.readBeingId("account id"); -} - -void InventoryHandler::processFavoriteItem(Net::MessageIn &msg) -{ - UNIMPLIMENTEDPACKET; - - msg.readInt16("item index"); - msg.readUInt8("favorite (0 - favorite)"); -} - -void InventoryHandler::processCartAddError(Net::MessageIn &msg) -{ - switch(msg.readUInt8("flag")) - { - case 0: - NotifyManager::notify(NotifyTypes::CART_ADD_WEIGHT_ERROR); - break; - case 1: - NotifyManager::notify(NotifyTypes::CART_ADD_COUNT_ERROR); - break; - default: - break; - } -} - -void InventoryHandler::processBindItem(Net::MessageIn &msg) -{ - const int index = msg.readInt16("item index") - INVENTORY_OFFSET; - const Inventory *const inv = PlayerInfo::getInventory(); - if (inv) - { - std::string itemName; - const Item *item = inv->getItem(index); - if (item) - { - itemName = item->getName(); - } - else - { - // TRANSLATORS: unknown item message - itemName = _("Unknown item"); - } - NotifyManager::notify(NotifyTypes::BOUND_ITEM, itemName); - } -} - } // namespace EAthena |