diff --git a/common/patches/rof.cpp b/common/patches/rof.cpp index 0304dc1d7..a54f0872c 100644 --- a/common/patches/rof.cpp +++ b/common/patches/rof.cpp @@ -532,71 +532,72 @@ namespace RoF { //consume the packet EQApplicationPacket *in = *p; + delete in; - *p = nullptr; - - if (in->size == 0) { - - in->size = 4; - in->pBuffer = new uchar[in->size]; - - *((uint32 *)in->pBuffer) = 0; - - dest->FastQueuePacket(&in, ack_req); - return; - } - - //store away the emu struct - unsigned char *__emu_buffer = in->pBuffer; - - int ItemCount = in->size / sizeof(InternalSerializedItem_Struct); - - if (ItemCount == 0 || (in->size % sizeof(InternalSerializedItem_Struct)) != 0) { - - Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", - opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(InternalSerializedItem_Struct)); - - delete in; - - return; - } - - InternalSerializedItem_Struct *eq = (InternalSerializedItem_Struct *)in->pBuffer; - - in->pBuffer = new uchar[4]; - *(uint32 *)in->pBuffer = ItemCount; - in->size = 4; - - for (int r = 0; r < ItemCount; r++, eq++) { - - uint32 Length = 0; - - char* Serialized = SerializeItem((const ItemInst*)eq->inst, eq->slot_id, &Length, 0); - - if (Serialized) { - - uchar *OldBuffer = in->pBuffer; - in->pBuffer = new uchar[in->size + Length]; - memcpy(in->pBuffer, OldBuffer, in->size); - - safe_delete_array(OldBuffer); - - memcpy(in->pBuffer + in->size, Serialized, Length); - in->size += Length; - - safe_delete_array(Serialized); - } - else { - Log.Out(Logs::General, Logs::Netcode, "[ERROR] Serialization failed on item slot %d during OP_CharInventory. Item skipped.", eq->slot_id); - } - } - - delete[] __emu_buffer; - - //Log.LogDebugType(Logs::General, Logs::Netcode, "[ERROR] Sending inventory to client"); - //Log.Hex(Logs::Netcode, in->pBuffer, in->size); - - dest->FastQueuePacket(&in, ack_req); + //*p = nullptr; + // + //if (in->size == 0) { + // + // in->size = 4; + // in->pBuffer = new uchar[in->size]; + // + // *((uint32 *)in->pBuffer) = 0; + // + // dest->FastQueuePacket(&in, ack_req); + // return; + //} + // + ////store away the emu struct + //unsigned char *__emu_buffer = in->pBuffer; + // + //int ItemCount = in->size / sizeof(InternalSerializedItem_Struct); + // + //if (ItemCount == 0 || (in->size % sizeof(InternalSerializedItem_Struct)) != 0) { + // + // Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", + // opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(InternalSerializedItem_Struct)); + // + // delete in; + // + // return; + //} + // + //InternalSerializedItem_Struct *eq = (InternalSerializedItem_Struct *)in->pBuffer; + // + //in->pBuffer = new uchar[4]; + //*(uint32 *)in->pBuffer = ItemCount; + //in->size = 4; + // + //for (int r = 0; r < ItemCount; r++, eq++) { + // + // uint32 Length = 0; + // + // char* Serialized = SerializeItem((const ItemInst*)eq->inst, eq->slot_id, &Length, 0); + // + // if (Serialized) { + // + // uchar *OldBuffer = in->pBuffer; + // in->pBuffer = new uchar[in->size + Length]; + // memcpy(in->pBuffer, OldBuffer, in->size); + // + // safe_delete_array(OldBuffer); + // + // memcpy(in->pBuffer + in->size, Serialized, Length); + // in->size += Length; + // + // safe_delete_array(Serialized); + // } + // else { + // Log.Out(Logs::General, Logs::Netcode, "[ERROR] Serialization failed on item slot %d during OP_CharInventory. Item skipped.", eq->slot_id); + // } + //} + // + //delete[] __emu_buffer; + // + ////Log.LogDebugType(Logs::General, Logs::Netcode, "[ERROR] Sending inventory to client"); + ////Log.Hex(Logs::Netcode, in->pBuffer, in->size); + // + //dest->FastQueuePacket(&in, ack_req); } ENCODE(OP_ClickObjectAction) diff --git a/common/patches/rof2.cpp b/common/patches/rof2.cpp index 3126f13ce..60f439777 100644 --- a/common/patches/rof2.cpp +++ b/common/patches/rof2.cpp @@ -13,6 +13,7 @@ #include "rof2_structs.h" #include "../rulesys.h" #include "../memory_buffer.h" +#include "../item_instance.h" #include #include @@ -26,7 +27,7 @@ namespace RoF2 static Strategy struct_strategy; char* SerializeItem(const ItemInst *inst, int16 slot_id, uint32 *length, uint8 depth, ItemPacketType packet_type); - + void SerializeItem(EQEmu::MemoryBuffer &packet_data, EQEmu::ItemInstance *inst, int container_id, int slot_id, int bag_id, int aug_id); // server to client inventory location converters static inline structs::ItemSlotStruct ServerToRoF2Slot(uint32 serverSlot, ItemPacketType PacketType = ItemPacketInvalid); static inline structs::MainInvItemSlotStruct ServerToRoF2MainInvSlot(uint32 serverSlot); @@ -612,14 +613,23 @@ namespace RoF2 return; } - //SerializedItemInstance_Struct *sis = (SerializedItemInstance_Struct*)in->pBuffer; - //EQEmu::MemoryBuffer packet_data; - //packet_data.Write(entries); - // - //for(size_t i = 0; i < entries; ++i) { + SerializedItemInstance_Struct *sis = (SerializedItemInstance_Struct*)in->pBuffer; + EQEmu::MemoryBuffer packet_data; + packet_data.Write(entries); + + for(size_t i = 0; i < entries; ++i) { + EQEmu::ItemInstance *inst = (EQEmu::ItemInstance*)sis[i].inst; + + if(!inst) { + continue; + } + + //SerializeItem(packet_data, inst, sis[i].container_id, sis[i].slot_id, -1, -1, ItemPacketCharInventory); // //SerializeItem((const EQEmu::ItemInstance*) // //char* Serialized = SerializeItem((const ItemInst*)eq->inst, eq->slot_id, &Length, 0, ItemPacketCharInventory); - //} + } + + delete in; //if (in->size == 0) { // diff --git a/common/patches/sod.cpp b/common/patches/sod.cpp index a46946c93..f67198b26 100644 --- a/common/patches/sod.cpp +++ b/common/patches/sod.cpp @@ -336,71 +336,72 @@ namespace SoD { //consume the packet EQApplicationPacket *in = *p; + delete in; - *p = nullptr; - - if (in->size == 0) { - - in->size = 4; - - in->pBuffer = new uchar[in->size]; - - *((uint32 *)in->pBuffer) = 0; - - dest->FastQueuePacket(&in, ack_req); - - return; - } - - //store away the emu struct - unsigned char *__emu_buffer = in->pBuffer; - - int ItemCount = in->size / sizeof(InternalSerializedItem_Struct); - - if (ItemCount == 0 || (in->size % sizeof(InternalSerializedItem_Struct)) != 0) { - - Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", - opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(InternalSerializedItem_Struct)); - - delete in; - return; - } - - InternalSerializedItem_Struct *eq = (InternalSerializedItem_Struct *)in->pBuffer; - in->pBuffer = new uchar[4]; - *(uint32 *)in->pBuffer = ItemCount; - in->size = 4; - - for (int r = 0; r < ItemCount; r++, eq++) { - - uint32 Length = 0; - char* Serialized = SerializeItem((const ItemInst*)eq->inst, eq->slot_id, &Length, 0); - - if (Serialized) { - - uchar *OldBuffer = in->pBuffer; - in->pBuffer = new uchar[in->size + Length]; - memcpy(in->pBuffer, OldBuffer, in->size); - - safe_delete_array(OldBuffer); - - memcpy(in->pBuffer + in->size, Serialized, Length); - in->size += Length; - - safe_delete_array(Serialized); - - } - else { - Log.Out(Logs::General, Logs::Netcode, "[ERROR] Serialization failed on item slot %d during OP_CharInventory. Item skipped.", eq->slot_id); - } - } - - delete[] __emu_buffer; - - //Log.LogDebugType(Logs::General, Logs::Netcode, "[ERROR] Sending inventory to client"); - //Log.Hex(Logs::Netcode, in->pBuffer, in->size); - - dest->FastQueuePacket(&in, ack_req); + //*p = nullptr; + // + //if (in->size == 0) { + // + // in->size = 4; + // + // in->pBuffer = new uchar[in->size]; + // + // *((uint32 *)in->pBuffer) = 0; + // + // dest->FastQueuePacket(&in, ack_req); + // + // return; + //} + // + ////store away the emu struct + //unsigned char *__emu_buffer = in->pBuffer; + // + //int ItemCount = in->size / sizeof(InternalSerializedItem_Struct); + // + //if (ItemCount == 0 || (in->size % sizeof(InternalSerializedItem_Struct)) != 0) { + // + // Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", + // opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(InternalSerializedItem_Struct)); + // + // delete in; + // return; + //} + // + //InternalSerializedItem_Struct *eq = (InternalSerializedItem_Struct *)in->pBuffer; + //in->pBuffer = new uchar[4]; + //*(uint32 *)in->pBuffer = ItemCount; + //in->size = 4; + // + //for (int r = 0; r < ItemCount; r++, eq++) { + // + // uint32 Length = 0; + // char* Serialized = SerializeItem((const ItemInst*)eq->inst, eq->slot_id, &Length, 0); + // + // if (Serialized) { + // + // uchar *OldBuffer = in->pBuffer; + // in->pBuffer = new uchar[in->size + Length]; + // memcpy(in->pBuffer, OldBuffer, in->size); + // + // safe_delete_array(OldBuffer); + // + // memcpy(in->pBuffer + in->size, Serialized, Length); + // in->size += Length; + // + // safe_delete_array(Serialized); + // + // } + // else { + // Log.Out(Logs::General, Logs::Netcode, "[ERROR] Serialization failed on item slot %d during OP_CharInventory. Item skipped.", eq->slot_id); + // } + //} + // + //delete[] __emu_buffer; + // + ////Log.LogDebugType(Logs::General, Logs::Netcode, "[ERROR] Sending inventory to client"); + ////Log.Hex(Logs::Netcode, in->pBuffer, in->size); + // + //dest->FastQueuePacket(&in, ack_req); } ENCODE(OP_ClientUpdate) diff --git a/common/patches/sof.cpp b/common/patches/sof.cpp index ba1bf74cf..e6cf7e83d 100644 --- a/common/patches/sof.cpp +++ b/common/patches/sof.cpp @@ -318,69 +318,70 @@ namespace SoF { //consume the packet EQApplicationPacket *in = *p; + delete in; - *p = nullptr; - - if (in->size == 0) { - in->size = 4; - in->pBuffer = new uchar[in->size]; - *((uint32 *)in->pBuffer) = 0; - - dest->FastQueuePacket(&in, ack_req); - return; - } - - //store away the emu struct - unsigned char *__emu_buffer = in->pBuffer; - - int ItemCount = in->size / sizeof(InternalSerializedItem_Struct); - - if (ItemCount == 0 || (in->size % sizeof(InternalSerializedItem_Struct)) != 0) { - - Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", - opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(InternalSerializedItem_Struct)); - - delete in; - return; - } - - InternalSerializedItem_Struct *eq = (InternalSerializedItem_Struct *)in->pBuffer; - - in->pBuffer = new uchar[4]; - *(uint32 *)in->pBuffer = ItemCount; - in->size = 4; - - for (int r = 0; r < ItemCount; r++, eq++) { - - uint32 Length = 0; - - char* Serialized = SerializeItem((const ItemInst*)eq->inst, eq->slot_id, &Length, 0); - - if (Serialized) { - uchar *OldBuffer = in->pBuffer; - - in->pBuffer = new uchar[in->size + Length]; - memcpy(in->pBuffer, OldBuffer, in->size); - - safe_delete_array(OldBuffer); - - memcpy(in->pBuffer + in->size, Serialized, Length); - in->size += Length; - - safe_delete_array(Serialized); - - } - else { - Log.Out(Logs::General, Logs::Netcode, "[ERROR] Serialization failed on item slot %d during OP_CharInventory. Item skipped.", eq->slot_id); - } - } - - delete[] __emu_buffer; - - //Log.LogDebugType(Logs::General, Logs::Netcode, "[ERROR] Sending inventory to client"); - //Log.Hex(Logs::Netcode, in->pBuffer, in->size); - - dest->FastQueuePacket(&in, ack_req); + //*p = nullptr; + // + //if (in->size == 0) { + // in->size = 4; + // in->pBuffer = new uchar[in->size]; + // *((uint32 *)in->pBuffer) = 0; + // + // dest->FastQueuePacket(&in, ack_req); + // return; + //} + // + ////store away the emu struct + //unsigned char *__emu_buffer = in->pBuffer; + // + //int ItemCount = in->size / sizeof(InternalSerializedItem_Struct); + // + //if (ItemCount == 0 || (in->size % sizeof(InternalSerializedItem_Struct)) != 0) { + // + // Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", + // opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(InternalSerializedItem_Struct)); + // + // delete in; + // return; + //} + // + //InternalSerializedItem_Struct *eq = (InternalSerializedItem_Struct *)in->pBuffer; + // + //in->pBuffer = new uchar[4]; + //*(uint32 *)in->pBuffer = ItemCount; + //in->size = 4; + // + //for (int r = 0; r < ItemCount; r++, eq++) { + // + // uint32 Length = 0; + // + // char* Serialized = SerializeItem((const ItemInst*)eq->inst, eq->slot_id, &Length, 0); + // + // if (Serialized) { + // uchar *OldBuffer = in->pBuffer; + // + // in->pBuffer = new uchar[in->size + Length]; + // memcpy(in->pBuffer, OldBuffer, in->size); + // + // safe_delete_array(OldBuffer); + // + // memcpy(in->pBuffer + in->size, Serialized, Length); + // in->size += Length; + // + // safe_delete_array(Serialized); + // + // } + // else { + // Log.Out(Logs::General, Logs::Netcode, "[ERROR] Serialization failed on item slot %d during OP_CharInventory. Item skipped.", eq->slot_id); + // } + //} + // + //delete[] __emu_buffer; + // + ////Log.LogDebugType(Logs::General, Logs::Netcode, "[ERROR] Sending inventory to client"); + ////Log.Hex(Logs::Netcode, in->pBuffer, in->size); + // + //dest->FastQueuePacket(&in, ack_req); } ENCODE(OP_ClientUpdate) diff --git a/common/patches/titanium.cpp b/common/patches/titanium.cpp index 87d091dd3..8c3367697 100644 --- a/common/patches/titanium.cpp +++ b/common/patches/titanium.cpp @@ -263,40 +263,42 @@ namespace Titanium EQApplicationPacket *in = *p; *p = nullptr; - //store away the emu struct - unsigned char *__emu_buffer = in->pBuffer; + delete in; - int itemcount = in->size / sizeof(InternalSerializedItem_Struct); - if (itemcount == 0 || (in->size % sizeof(InternalSerializedItem_Struct)) != 0) { - Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(InternalSerializedItem_Struct)); - delete in; - return; - } - InternalSerializedItem_Struct *eq = (InternalSerializedItem_Struct *)in->pBuffer; - - //do the transform... - int r; - std::string serial_string; - for (r = 0; r < itemcount; r++, eq++) { - uint32 length; - char *serialized = SerializeItem((const ItemInst*)eq->inst, eq->slot_id, &length, 0); - if (serialized) { - serial_string.append(serialized, length + 1); - safe_delete_array(serialized); - } - else { - Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Serialization failed on item slot %d during OP_CharInventory. Item skipped.", eq->slot_id); - } - - } - - in->size = serial_string.length(); - in->pBuffer = new unsigned char[in->size]; - memcpy(in->pBuffer, serial_string.c_str(), serial_string.length()); - - delete[] __emu_buffer; - - dest->FastQueuePacket(&in, ack_req); + ////store away the emu struct + //unsigned char *__emu_buffer = in->pBuffer; + // + //int itemcount = in->size / sizeof(InternalSerializedItem_Struct); + //if (itemcount == 0 || (in->size % sizeof(InternalSerializedItem_Struct)) != 0) { + // Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(InternalSerializedItem_Struct)); + // delete in; + // return; + //} + //InternalSerializedItem_Struct *eq = (InternalSerializedItem_Struct *)in->pBuffer; + // + ////do the transform... + //int r; + //std::string serial_string; + //for (r = 0; r < itemcount; r++, eq++) { + // uint32 length; + // char *serialized = SerializeItem((const ItemInst*)eq->inst, eq->slot_id, &length, 0); + // if (serialized) { + // serial_string.append(serialized, length + 1); + // safe_delete_array(serialized); + // } + // else { + // Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Serialization failed on item slot %d during OP_CharInventory. Item skipped.", eq->slot_id); + // } + // + //} + // + //in->size = serial_string.length(); + //in->pBuffer = new unsigned char[in->size]; + //memcpy(in->pBuffer, serial_string.c_str(), serial_string.length()); + // + //delete[] __emu_buffer; + // + //dest->FastQueuePacket(&in, ack_req); } ENCODE(OP_DeleteCharge) { ENCODE_FORWARD(OP_MoveItem); } diff --git a/common/patches/uf.cpp b/common/patches/uf.cpp index eb525b1ec..8a1754992 100644 --- a/common/patches/uf.cpp +++ b/common/patches/uf.cpp @@ -474,68 +474,69 @@ namespace UF { //consume the packet EQApplicationPacket *in = *p; - - *p = nullptr; - - if (in->size == 0) { - - in->size = 4; - in->pBuffer = new uchar[in->size]; - *((uint32 *)in->pBuffer) = 0; - - dest->FastQueuePacket(&in, ack_req); - return; - } - - //store away the emu struct - unsigned char *__emu_buffer = in->pBuffer; - - int ItemCount = in->size / sizeof(InternalSerializedItem_Struct); - - if (ItemCount == 0 || (in->size % sizeof(InternalSerializedItem_Struct)) != 0) { - - Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", - opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(InternalSerializedItem_Struct)); - - delete in; - return; - } - - InternalSerializedItem_Struct *eq = (InternalSerializedItem_Struct *)in->pBuffer; - - in->pBuffer = new uchar[4]; - *(uint32 *)in->pBuffer = ItemCount; - in->size = 4; - - for (int r = 0; r < ItemCount; r++, eq++) { - - uint32 Length = 0; - char* Serialized = SerializeItem((const ItemInst*)eq->inst, eq->slot_id, &Length, 0); - - if (Serialized) { - - uchar *OldBuffer = in->pBuffer; - in->pBuffer = new uchar[in->size + Length]; - memcpy(in->pBuffer, OldBuffer, in->size); - - safe_delete_array(OldBuffer); - - memcpy(in->pBuffer + in->size, Serialized, Length); - in->size += Length; - - safe_delete_array(Serialized); - } - else { - Log.Out(Logs::General, Logs::Netcode, "[ERROR] Serialization failed on item slot %d during OP_CharInventory. Item skipped.", eq->slot_id); - } - } - - delete[] __emu_buffer; - - //Log.LogDebugType(Logs::General, Logs::Netcode, "[ERROR] Sending inventory to client"); - //Log.Hex(Logs::Netcode, in->pBuffer, in->size); - - dest->FastQueuePacket(&in, ack_req); + delete in; + + //*p = nullptr; + // + //if (in->size == 0) { + // + // in->size = 4; + // in->pBuffer = new uchar[in->size]; + // *((uint32 *)in->pBuffer) = 0; + // + // dest->FastQueuePacket(&in, ack_req); + // return; + //} + // + ////store away the emu struct + //unsigned char *__emu_buffer = in->pBuffer; + // + //int ItemCount = in->size / sizeof(InternalSerializedItem_Struct); + // + //if (ItemCount == 0 || (in->size % sizeof(InternalSerializedItem_Struct)) != 0) { + // + // Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d", + // opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(InternalSerializedItem_Struct)); + // + // delete in; + // return; + //} + // + //InternalSerializedItem_Struct *eq = (InternalSerializedItem_Struct *)in->pBuffer; + // + //in->pBuffer = new uchar[4]; + //*(uint32 *)in->pBuffer = ItemCount; + //in->size = 4; + // + //for (int r = 0; r < ItemCount; r++, eq++) { + // + // uint32 Length = 0; + // char* Serialized = SerializeItem((const ItemInst*)eq->inst, eq->slot_id, &Length, 0); + // + // if (Serialized) { + // + // uchar *OldBuffer = in->pBuffer; + // in->pBuffer = new uchar[in->size + Length]; + // memcpy(in->pBuffer, OldBuffer, in->size); + // + // safe_delete_array(OldBuffer); + // + // memcpy(in->pBuffer + in->size, Serialized, Length); + // in->size += Length; + // + // safe_delete_array(Serialized); + // } + // else { + // Log.Out(Logs::General, Logs::Netcode, "[ERROR] Serialization failed on item slot %d during OP_CharInventory. Item skipped.", eq->slot_id); + // } + //} + // + //delete[] __emu_buffer; + // + ////Log.LogDebugType(Logs::General, Logs::Netcode, "[ERROR] Sending inventory to client"); + ////Log.Hex(Logs::Netcode, in->pBuffer, in->size); + // + //dest->FastQueuePacket(&in, ack_req); } ENCODE(OP_ClientUpdate) diff --git a/zone/client_process.cpp b/zone/client_process.cpp index 5adf4bb6f..901793df2 100644 --- a/zone/client_process.cpp +++ b/zone/client_process.cpp @@ -820,8 +820,9 @@ void Client::BulkSendInventoryItems() { return; } - EQApplicationPacket* outapp = new EQApplicationPacket(OP_CharInventory, items.Size()); - memcpy(outapp->pBuffer, items, items.Size()); + EQApplicationPacket outapp(OP_CharInventory, items.Size()); + memcpy(outapp.pBuffer, items, items.Size()); + QueuePacket(&outapp); //int16 slot_id = 0;