summaryrefslogtreecommitdiff
path: root/src/net/eathena
diff options
context:
space:
mode:
Diffstat (limited to 'src/net/eathena')
-rw-r--r--src/net/eathena/inventoryrecv.cpp73
1 files changed, 60 insertions, 13 deletions
diff --git a/src/net/eathena/inventoryrecv.cpp b/src/net/eathena/inventoryrecv.cpp
index d47dadb02..134a1e45b 100644
--- a/src/net/eathena/inventoryrecv.cpp
+++ b/src/net/eathena/inventoryrecv.cpp
@@ -58,6 +58,7 @@
#include "resources/iteminfo.h"
+#include "utils/checkutils.h"
#include "utils/gettext.h"
#include "utils/foreach.h"
#include "utils/stringutils.h"
@@ -1547,12 +1548,12 @@ void InventoryRecv::processInventoryStartContinue(const NetInventoryTypeT type,
switch (type)
{
case NetInventoryType::Inventory:
- InventoryRecv::mInventoryItems.clear();
+ mInventoryItems.clear();
inventory = PlayerInfo::getInventory();
window = inventoryWindow;
break;
case NetInventoryType::Cart:
- InventoryRecv::mCartItems.clear();
+ mCartItems.clear();
inventory = PlayerInfo::getCartInventory();
window = cartWindow;
break;
@@ -1588,7 +1589,6 @@ void InventoryRecv::processInventoryEnd2(Net::MessageIn &msg)
void InventoryRecv::processPlayerCombinedInventory1(Net::MessageIn &msg)
{
- UNIMPLEMENTEDPACKET;
const int dataLen = msg.readInt16("len") - 4;
processInventoryContinue(msg,
dataLen,
@@ -1597,7 +1597,6 @@ void InventoryRecv::processPlayerCombinedInventory1(Net::MessageIn &msg)
void InventoryRecv::processPlayerCombinedInventory2(Net::MessageIn &msg)
{
- UNIMPLEMENTEDPACKET;
const int dataLen = msg.readInt16("len") - 5;
const NetInventoryTypeT invType = static_cast<NetInventoryTypeT>(
msg.readUInt8("type"));
@@ -1608,23 +1607,71 @@ void InventoryRecv::processPlayerCombinedInventory2(Net::MessageIn &msg)
void InventoryRecv::processInventoryContinue(Net::MessageIn &msg,
const int len,
- const NetInventoryTypeT invType
- A_UNUSED)
+ const NetInventoryTypeT invType)
{
const int packetLen = 14 + itemIdLen * 5;
const int number = len / packetLen;
+ int offset = INVENTORY_OFFSET;
+
+ switch (invType)
+ {
+ case NetInventoryType::Inventory:
+ case NetInventoryType::Cart:
+ default:
+ offset = INVENTORY_OFFSET;
+ break;
+ case NetInventoryType::Storage:
+ case NetInventoryType::GuildStorage:
+ offset = STORAGE_OFFSET;
+ break;
+ }
+
+ Ea::InventoryItems *items = nullptr;
+ switch (invType)
+ {
+ case NetInventoryType::Inventory:
+ items = &mInventoryItems;
+ break;
+ case NetInventoryType::Cart:
+ items = &mCartItems;
+ break;
+ case NetInventoryType::Storage:
+ case NetInventoryType::GuildStorage:
+ items = &Ea::InventoryRecv::mStorageItems;
+ break;
+ default:
+ reportAlways("Unknown inventory type %d", CAST_S32(invType));
+ return;
+ }
for (int loop = 0; loop < number; loop++)
{
- msg.readInt16("item index");
- msg.readItemId("item id");
- msg.readUInt8("item type");
- msg.readInt16("amount");
+ const int index = msg.readInt16("item index") - offset;
+ const int itemId = msg.readItemId("item id");
+ const ItemTypeT itemType = static_cast<ItemTypeT>(
+ msg.readUInt8("item type"));
+ const int amount = msg.readInt16("amount");
msg.readInt32("wear state / equip");
+ int cards[maxCards];
for (int f = 0; f < maxCards; f++)
- msg.readItemId("card");
- msg.readInt32("hire expire date");
- msg.readUInt8("flags");
+ cards[f] = msg.readItemId("card");
+
+ msg.readInt32("hire expire date (?)");
+ ItemFlags flags;
+ flags.byte = msg.readUInt8("flags");
+
+ items->push_back(Ea::InventoryItem(index,
+ itemId,
+ itemType,
+ cards,
+ nullptr,
+ amount,
+ 0,
+ ItemColorManager::getColorFromCards(&cards[0]),
+ fromBool(flags.bits.isIdentified, Identified),
+ fromBool(flags.bits.isDamaged, Damaged),
+ fromBool(flags.bits.isFavorite, Favorite),
+ Equipm_false));
}
}