diff options
-rw-r--r-- | src/net/eathena/inventoryrecv.cpp | 53 | ||||
-rw-r--r-- | src/net/eathena/packetsin.inc | 10 |
2 files changed, 44 insertions, 19 deletions
diff --git a/src/net/eathena/inventoryrecv.cpp b/src/net/eathena/inventoryrecv.cpp index 9587da970..7a99ad717 100644 --- a/src/net/eathena/inventoryrecv.cpp +++ b/src/net/eathena/inventoryrecv.cpp @@ -110,18 +110,22 @@ void InventoryRecv::processPlayerEquipment(Net::MessageIn &msg) Ea::InventoryRecv::mEquips.clear(); equipment->setBackend(&Ea::InventoryRecv::mEquips); } - int sz; - if ((serverVersion >= 8 || serverVersion == 0) && - msg.getVersion() >= 20150226) - { - sz = 57; - } + + int packetLen = 2 + 2 + 1 + 1 + 8; + if (msg.getVersion() >= 20120925) + packetLen += 4 + 4 + 1; else - { - sz = 31; - } + packetLen += 1 + 2 + 2 + 1; + if (msg.getVersion() >= 20071002) + packetLen += 4; + if (msg.getVersion() >= 20080102) + packetLen += 2; + if (msg.getVersion() >= 20100629) + packetLen += 2; + if (msg.getVersion() >= 20150226) + packetLen += 26; - const int number = (msg.getLength() - 4) / sz; + const int number = (msg.getLength() - 4) / packetLen; for (int loop = 0; loop < number; loop++) { @@ -129,15 +133,29 @@ void InventoryRecv::processPlayerEquipment(Net::MessageIn &msg) const int itemId = msg.readInt16("item id"); const ItemTypeT itemType = static_cast<ItemTypeT>( msg.readUInt8("item type")); - msg.readInt32("location"); - const int equipType = msg.readInt32("wear state"); + int equipType; + if (msg.getVersion() >= 20120925) + { + msg.readInt32("location"); + equipType = msg.readInt32("wear state"); + } + else + { + msg.readUInt8("identified"); + msg.readInt16("location"); + equipType = msg.readInt16("wear state"); + msg.readUInt8("is damaged"); + } const uint8_t refine = CAST_U8(msg.readInt8("refine")); int cards[maxCards]; for (int f = 0; f < maxCards; f++) cards[f] = msg.readInt16("card"); - msg.readInt32("hire expire date (?)"); - msg.readInt16("equip type"); - msg.readInt16("item sprite number"); + if (msg.getVersion() >= 20071002) + msg.readInt32("hire expire date (?)"); + if (msg.getVersion() >= 20080102) + msg.readInt16("equip type"); + if (msg.getVersion() >= 20100629) + msg.readInt16("item sprite number"); if ((serverVersion >= 8 || serverVersion == 0) && msg.getVersion() >= 20150226) { @@ -150,7 +168,10 @@ void InventoryRecv::processPlayerEquipment(Net::MessageIn &msg) } } ItemFlags flags; - flags.byte = msg.readUInt8("flags"); + if (msg.getVersion() >= 20120925) + flags.byte = msg.readUInt8("flags"); + else + flags.byte = 0; if (inventory) { inventory->setItem(index, diff --git a/src/net/eathena/packetsin.inc b/src/net/eathena/packetsin.inc index d8256e53e..bec8aa983 100644 --- a/src/net/eathena/packetsin.inc +++ b/src/net/eathena/packetsin.inc @@ -24,6 +24,7 @@ packet(SMSG_BEING_FAKE_NAME, 0x0078, 54, &BeingRecv::processBeingFakeName, 1); packet(SMSG_WHISPER, 0x0097, -1, &ChatRecv::processWhisper, 1); packet(SMSG_WHISPER_RESPONSE, 0x0098, 3, &ChatRecv::processWhisperResponse, 1); +packet(SMSG_PLAYER_EQUIPMENT, 0x00a4, -1, &InventoryRecv::processPlayerEquipment, 1); packet(SMSG_BEING_CHANGE_LOOKS_OUTDATED, 0x00c3, 8, nullptr, 1); packet(SMSG_TRADE_REQUEST, 0x00e5, 26, &TradeRecv::processTradeRequest, 1); packet(SMSG_TRADE_ITEM_ADD, 0x00e9, 19, &TradeRecv::processTradeItemAdd, 1); @@ -441,6 +442,7 @@ packet(SMSG_BEING_ACTION2, 0x02e1, 33, &BeingRecv::processBeing // 20080102 if (packetVersion >= 20080102) { + packet(SMSG_PLAYER_EQUIPMENT, 0x02d0, -1, &InventoryRecv::processPlayerEquipment, 20080102); packet(SMSG_PLAYER_INVENTORY, 0x02e8, -1, &InventoryRecv::processPlayerInventory, 20080102); packet(SMSG_PLAYER_CART_ITEMS, 0x02e9, -1, &InventoryRecv::processPlayerCartItems, 20080102); packet(SMSG_PLAYER_STORAGE_ITEMS, 0x02ea, -1, &InventoryRecv::processPlayerStorage, 20080102); @@ -448,7 +450,6 @@ if (packetVersion >= 20080102) packet(SMSG_BEING_FONT, 0x02ef, 8, &BeingRecv::processBeingFont, 20080102); } - // 20080318 packet(SMSG_NPC_SHOW_PROGRESS_BAR, 0x02f0, 10, &NpcRecv::processNpcShowProgressBar, 20080318); packet(SMSG_NPC_PROGRESS_BAR_ABORT, 0x02f2, 2, &NpcRecv::processProgressBarAbort, 20080318); @@ -557,6 +558,11 @@ if (packetVersion >= 20100608) packet(SMSG_SEARCHSTORE_CLICK_ACK, 0x083d, 6, &SearchStoreRecv::processSearchClickAck, 20100608); } +if (packetVersion >= 20100629) +{ + packet(SMSG_PLAYER_EQUIPMENT, 0x02d0, -1, &InventoryRecv::processPlayerEquipment, 20100629); +} + // 20100701 if (packetVersion >= 20100701) { @@ -618,7 +624,6 @@ if (packetVersion >= 20120925) packet(SMSG_PLAYER_UNEQUIP, 0x099a, 9, &InventoryRecv::processPlayerUnEquip, 20120925); } - // 20121010 packet(SMSG_MAP_TYPE_PROPERTY2, 0x099b, 8, &BeingRecv::processMapTypeProperty, 20121010); @@ -704,7 +709,6 @@ if ((serverVersion >= 8 || serverVersion == 0) && packetVersion >= 20150226) { packet(SMSG_VENDING_OPEN, 0x0136, -1, &VendingRecv::processOpen, 20150226); packet(SMSG_VENDING_ITEMS_LIST, 0x0800, -1, &VendingRecv::processItemsList, 20150226); - packet(SMSG_TRADE_ITEM_ADD, 0x0a09, 45, &TradeRecv::processTradeItemAdd, 20150226); packet(SMSG_PLAYER_STORAGE_ADD, 0x0a0a, 47, &InventoryRecv::processPlayerStorageAdd, 20150226); packet(SMSG_PLAYER_CART_ADD, 0x0a0b, 47, &InventoryRecv::processPlayerCartAdd, 20150226); |