summaryrefslogtreecommitdiff
path: root/src/net/eathena/inventoryhandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/net/eathena/inventoryhandler.cpp')
-rw-r--r--src/net/eathena/inventoryhandler.cpp950
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