From c2f54527e2a7047b5ef89f1b765efb51744d235e Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Sat, 2 Mar 2019 21:26:25 +0300 Subject: Impliment packet SMSG_PLAYER_COMBINED_EQUIPMENT 0x0b0a --- src/net/ea/inventoryitem.h | 10 +++-- src/net/eathena/inventoryrecv.cpp | 94 ++++++++++++++++++++++++++++++--------- src/net/tmwa/inventoryrecv.cpp | 6 ++- 3 files changed, 85 insertions(+), 25 deletions(-) diff --git a/src/net/ea/inventoryitem.h b/src/net/ea/inventoryitem.h index 39e3224d9..3dcb4d7c3 100644 --- a/src/net/ea/inventoryitem.h +++ b/src/net/ea/inventoryitem.h @@ -60,6 +60,7 @@ class InventoryItem final Damaged damaged; Favorite favorite; Equipm equip; + int equipIndex; InventoryItem(const int slot0, const int id0, @@ -72,7 +73,8 @@ class InventoryItem final const Identified identified0, const Damaged damaged0, const Favorite favorite0, - Equipm equip0) : + Equipm equip0, + int equipIndex0) : slot(slot0), id(id0), type(type0), @@ -84,7 +86,8 @@ class InventoryItem final identified(identified0), damaged(damaged0), favorite(favorite0), - equip(equip0) + equip(equip0), + equipIndex(equipIndex0) { if (cards0 == nullptr) return; @@ -104,7 +107,8 @@ class InventoryItem final identified(c.identified), damaged(c.damaged), favorite(c.favorite), - equip(c.equip) + equip(c.equip), + equipIndex(c.equipIndex) { for (int f = 0; f < 4; f ++) cards[f] = c.cards[f]; diff --git a/src/net/eathena/inventoryrecv.cpp b/src/net/eathena/inventoryrecv.cpp index 134a1e45b..8e713ae9b 100644 --- a/src/net/eathena/inventoryrecv.cpp +++ b/src/net/eathena/inventoryrecv.cpp @@ -525,7 +525,8 @@ void InventoryRecv::processPlayerStorage(Net::MessageIn &msg) fromBool(flags.bits.isIdentified, Identified), fromBool(flags.bits.isDamaged, Damaged), fromBool(flags.bits.isFavorite, Favorite), - Equipm_false)); + Equipm_false, + -1)); } BLOCK_END("InventoryRecv::processPlayerInventory") } @@ -744,7 +745,8 @@ void InventoryRecv::processPlayerStorageEquip(Net::MessageIn &msg) fromBool(flags.bits.isIdentified, Identified), fromBool(flags.bits.isDamaged, Damaged), fromBool(flags.bits.isFavorite, Favorite), - Equipm_false)); + Equipm_false, + -1)); delete options; } BLOCK_END("InventoryRecv::processPlayerStorageEquip") @@ -1029,7 +1031,8 @@ void InventoryRecv::processPlayerCartAdd(Net::MessageIn &msg) fromBool(identified, Identified), damaged, Favorite_false, - Equipm_false)); + Equipm_false, + -1)); } delete options; BLOCK_END("InventoryRecv::processPlayerCartAdd") @@ -1114,7 +1117,8 @@ void InventoryRecv::processPlayerCartEquip(Net::MessageIn &msg) fromBool(flags.bits.isIdentified, Identified), fromBool(flags.bits.isDamaged, Damaged), fromBool(flags.bits.isFavorite, Favorite), - Equipm_false)); + Equipm_false, + -1)); delete options; } BLOCK_END("InventoryRecv::processPlayerCartEquip") @@ -1180,7 +1184,8 @@ void InventoryRecv::processPlayerCartItems(Net::MessageIn &msg) fromBool(flags.bits.isIdentified, Identified), fromBool(flags.bits.isDamaged, Damaged), fromBool(flags.bits.isFavorite, Favorite), - Equipm_false)); + Equipm_false, + -1)); } BLOCK_END("InventoryRecv::processPlayerCartItems") } @@ -1671,13 +1676,13 @@ void InventoryRecv::processInventoryContinue(Net::MessageIn &msg, fromBool(flags.bits.isIdentified, Identified), fromBool(flags.bits.isDamaged, Damaged), fromBool(flags.bits.isFavorite, Favorite), - Equipm_false)); + Equipm_false, + -1)); } } void InventoryRecv::processPlayerCombinedEquipment1(Net::MessageIn &msg) { - UNIMPLEMENTEDPACKET; const int dataLen = msg.readInt16("len") - 4; processEquipmentContinue(msg, dataLen, @@ -1686,7 +1691,6 @@ void InventoryRecv::processPlayerCombinedEquipment1(Net::MessageIn &msg) void InventoryRecv::processPlayerCombinedEquipment2(Net::MessageIn &msg) { - UNIMPLEMENTEDPACKET; const int dataLen = msg.readInt16("len") - 5; const NetInventoryTypeT invType = static_cast( msg.readUInt8("type")); @@ -1697,33 +1701,83 @@ void InventoryRecv::processPlayerCombinedEquipment2(Net::MessageIn &msg) void InventoryRecv::processEquipmentContinue(Net::MessageIn &msg, const int len, - const NetInventoryTypeT invType - A_UNUSED) + const NetInventoryTypeT invType) { const int packetLen = 47 + 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("index"); - msg.readItemId("item id"); - msg.readUInt8("item type"); + const int index = msg.readInt16("item index") - offset; + const int itemId = msg.readItemId("item id"); + const ItemTypeT itemType = static_cast( + msg.readUInt8("item type")); msg.readInt32("location"); - msg.readInt32("wear state"); - msg.readInt8("refine"); + int equipType = msg.readInt32("wear state"); + const uint8_t refine = CAST_U8(msg.readInt8("refine")); + int cards[maxCards]; for (int f = 0; f < maxCards; f++) - msg.readItemId("card"); + cards[f] = msg.readItemId("card"); msg.readInt32("hire expire date (?)"); msg.readInt16("equip type"); msg.readInt16("item sprite number"); - msg.readUInt8("option count"); + ItemOptionsList *options = new ItemOptionsList(msg.readUInt8("option count")); for (int f = 0; f < 5; f ++) { - msg.readInt16("option index"); - msg.readInt16("option value"); + const uint16_t idx = msg.readInt16("option index"); + const uint16_t val = msg.readInt16("option value"); msg.readUInt8("option param"); + options->add(idx, val); } - msg.readUInt8("flags"); + ItemFlags flags; + flags.byte = msg.readUInt8("flags"); + + items->push_back(Ea::InventoryItem(index, + itemId, + itemType, + cards, + options, + 1, + refine, + ItemColorManager::getColorFromCards(&cards[0]), + fromBool(flags.bits.isIdentified, Identified), + fromBool(flags.bits.isDamaged, Damaged), + fromBool(flags.bits.isFavorite, Favorite), + Equipm_true, + equipType)); + delete options; } } diff --git a/src/net/tmwa/inventoryrecv.cpp b/src/net/tmwa/inventoryrecv.cpp index 8aacd38a0..991a777ef 100644 --- a/src/net/tmwa/inventoryrecv.cpp +++ b/src/net/tmwa/inventoryrecv.cpp @@ -369,7 +369,8 @@ void InventoryRecv::processPlayerStorage(Net::MessageIn &msg) fromBool(identified, Identified), Damaged_false, Favorite_false, - Equipm_false)); + Equipm_false, + -1)); } BLOCK_END("InventoryRecv::processPlayerInventory") } @@ -456,7 +457,8 @@ void InventoryRecv::processPlayerStorageEquip(Net::MessageIn &msg) fromBool(identified, Identified), Damaged_false, Favorite_false, - Equipm_false)); + Equipm_false, + -1)); } BLOCK_END("InventoryRecv::processPlayerStorageEquip") } -- cgit v1.2.3-70-g09d2