Going to start work on SerializingItems for bulk inv sends

This commit is contained in:
KimLS 2015-02-23 01:50:50 -08:00
parent ca278d029e
commit 4e4168852b
7 changed files with 311 additions and 294 deletions

View File

@ -532,71 +532,72 @@ namespace RoF
{ {
//consume the packet //consume the packet
EQApplicationPacket *in = *p; 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; delete in;
return; //*p = nullptr;
} //
//if (in->size == 0) {
InternalSerializedItem_Struct *eq = (InternalSerializedItem_Struct *)in->pBuffer; //
// in->size = 4;
in->pBuffer = new uchar[4]; // in->pBuffer = new uchar[in->size];
*(uint32 *)in->pBuffer = ItemCount; //
in->size = 4; // *((uint32 *)in->pBuffer) = 0;
//
for (int r = 0; r < ItemCount; r++, eq++) { // dest->FastQueuePacket(&in, ack_req);
// return;
uint32 Length = 0; //}
//
char* Serialized = SerializeItem((const ItemInst*)eq->inst, eq->slot_id, &Length, 0); ////store away the emu struct
//unsigned char *__emu_buffer = in->pBuffer;
if (Serialized) { //
//int ItemCount = in->size / sizeof(InternalSerializedItem_Struct);
uchar *OldBuffer = in->pBuffer; //
in->pBuffer = new uchar[in->size + Length]; //if (ItemCount == 0 || (in->size % sizeof(InternalSerializedItem_Struct)) != 0) {
memcpy(in->pBuffer, OldBuffer, in->size); //
// Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d",
safe_delete_array(OldBuffer); // opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(InternalSerializedItem_Struct));
//
memcpy(in->pBuffer + in->size, Serialized, Length); // delete in;
in->size += Length; //
// return;
safe_delete_array(Serialized); //}
} //
else { //InternalSerializedItem_Struct *eq = (InternalSerializedItem_Struct *)in->pBuffer;
Log.Out(Logs::General, Logs::Netcode, "[ERROR] Serialization failed on item slot %d during OP_CharInventory. Item skipped.", eq->slot_id); //
} //in->pBuffer = new uchar[4];
} //*(uint32 *)in->pBuffer = ItemCount;
//in->size = 4;
delete[] __emu_buffer; //
//for (int r = 0; r < ItemCount; r++, eq++) {
//Log.LogDebugType(Logs::General, Logs::Netcode, "[ERROR] Sending inventory to client"); //
//Log.Hex(Logs::Netcode, in->pBuffer, in->size); // uint32 Length = 0;
//
dest->FastQueuePacket(&in, ack_req); // 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) ENCODE(OP_ClickObjectAction)

View File

@ -13,6 +13,7 @@
#include "rof2_structs.h" #include "rof2_structs.h"
#include "../rulesys.h" #include "../rulesys.h"
#include "../memory_buffer.h" #include "../memory_buffer.h"
#include "../item_instance.h"
#include <iostream> #include <iostream>
#include <sstream> #include <sstream>
@ -26,7 +27,7 @@ namespace RoF2
static Strategy struct_strategy; static Strategy struct_strategy;
char* SerializeItem(const ItemInst *inst, int16 slot_id, uint32 *length, uint8 depth, ItemPacketType packet_type); 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 // server to client inventory location converters
static inline structs::ItemSlotStruct ServerToRoF2Slot(uint32 serverSlot, ItemPacketType PacketType = ItemPacketInvalid); static inline structs::ItemSlotStruct ServerToRoF2Slot(uint32 serverSlot, ItemPacketType PacketType = ItemPacketInvalid);
static inline structs::MainInvItemSlotStruct ServerToRoF2MainInvSlot(uint32 serverSlot); static inline structs::MainInvItemSlotStruct ServerToRoF2MainInvSlot(uint32 serverSlot);
@ -612,14 +613,23 @@ namespace RoF2
return; return;
} }
//SerializedItemInstance_Struct *sis = (SerializedItemInstance_Struct*)in->pBuffer; SerializedItemInstance_Struct *sis = (SerializedItemInstance_Struct*)in->pBuffer;
//EQEmu::MemoryBuffer packet_data; EQEmu::MemoryBuffer packet_data;
//packet_data.Write<uint32>(entries); packet_data.Write<uint32>(entries);
//
//for(size_t i = 0; i < entries; ++i) { 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*) // //SerializeItem((const EQEmu::ItemInstance*)
// //char* Serialized = SerializeItem((const ItemInst*)eq->inst, eq->slot_id, &Length, 0, ItemPacketCharInventory); // //char* Serialized = SerializeItem((const ItemInst*)eq->inst, eq->slot_id, &Length, 0, ItemPacketCharInventory);
//} }
delete in;
//if (in->size == 0) { //if (in->size == 0) {
// //

View File

@ -336,71 +336,72 @@ namespace SoD
{ {
//consume the packet //consume the packet
EQApplicationPacket *in = *p; 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; delete in;
return;
}
InternalSerializedItem_Struct *eq = (InternalSerializedItem_Struct *)in->pBuffer; //*p = nullptr;
in->pBuffer = new uchar[4]; //
*(uint32 *)in->pBuffer = ItemCount; //if (in->size == 0) {
in->size = 4; //
// in->size = 4;
for (int r = 0; r < ItemCount; r++, eq++) { //
// in->pBuffer = new uchar[in->size];
uint32 Length = 0; //
char* Serialized = SerializeItem((const ItemInst*)eq->inst, eq->slot_id, &Length, 0); // *((uint32 *)in->pBuffer) = 0;
//
if (Serialized) { // dest->FastQueuePacket(&in, ack_req);
//
uchar *OldBuffer = in->pBuffer; // return;
in->pBuffer = new uchar[in->size + Length]; //}
memcpy(in->pBuffer, OldBuffer, in->size); //
////store away the emu struct
safe_delete_array(OldBuffer); //unsigned char *__emu_buffer = in->pBuffer;
//
memcpy(in->pBuffer + in->size, Serialized, Length); //int ItemCount = in->size / sizeof(InternalSerializedItem_Struct);
in->size += Length; //
//if (ItemCount == 0 || (in->size % sizeof(InternalSerializedItem_Struct)) != 0) {
safe_delete_array(Serialized); //
// 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));
else { //
Log.Out(Logs::General, Logs::Netcode, "[ERROR] Serialization failed on item slot %d during OP_CharInventory. Item skipped.", eq->slot_id); // delete in;
} // return;
} //}
//
delete[] __emu_buffer; //InternalSerializedItem_Struct *eq = (InternalSerializedItem_Struct *)in->pBuffer;
//in->pBuffer = new uchar[4];
//Log.LogDebugType(Logs::General, Logs::Netcode, "[ERROR] Sending inventory to client"); //*(uint32 *)in->pBuffer = ItemCount;
//Log.Hex(Logs::Netcode, in->pBuffer, in->size); //in->size = 4;
//
dest->FastQueuePacket(&in, ack_req); //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) ENCODE(OP_ClientUpdate)

View File

@ -318,69 +318,70 @@ namespace SoF
{ {
//consume the packet //consume the packet
EQApplicationPacket *in = *p; 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; delete in;
return;
}
InternalSerializedItem_Struct *eq = (InternalSerializedItem_Struct *)in->pBuffer; //*p = nullptr;
//
in->pBuffer = new uchar[4]; //if (in->size == 0) {
*(uint32 *)in->pBuffer = ItemCount; // in->size = 4;
in->size = 4; // in->pBuffer = new uchar[in->size];
// *((uint32 *)in->pBuffer) = 0;
for (int r = 0; r < ItemCount; r++, eq++) { //
// dest->FastQueuePacket(&in, ack_req);
uint32 Length = 0; // return;
//}
char* Serialized = SerializeItem((const ItemInst*)eq->inst, eq->slot_id, &Length, 0); //
////store away the emu struct
if (Serialized) { //unsigned char *__emu_buffer = in->pBuffer;
uchar *OldBuffer = in->pBuffer; //
//int ItemCount = in->size / sizeof(InternalSerializedItem_Struct);
in->pBuffer = new uchar[in->size + Length]; //
memcpy(in->pBuffer, OldBuffer, in->size); //if (ItemCount == 0 || (in->size % sizeof(InternalSerializedItem_Struct)) != 0) {
//
safe_delete_array(OldBuffer); // 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));
memcpy(in->pBuffer + in->size, Serialized, Length); //
in->size += Length; // delete in;
// return;
safe_delete_array(Serialized); //}
//
} //InternalSerializedItem_Struct *eq = (InternalSerializedItem_Struct *)in->pBuffer;
else { //
Log.Out(Logs::General, Logs::Netcode, "[ERROR] Serialization failed on item slot %d during OP_CharInventory. Item skipped.", eq->slot_id); //in->pBuffer = new uchar[4];
} //*(uint32 *)in->pBuffer = ItemCount;
} //in->size = 4;
//
delete[] __emu_buffer; //for (int r = 0; r < ItemCount; r++, eq++) {
//
//Log.LogDebugType(Logs::General, Logs::Netcode, "[ERROR] Sending inventory to client"); // uint32 Length = 0;
//Log.Hex(Logs::Netcode, in->pBuffer, in->size); //
// char* Serialized = SerializeItem((const ItemInst*)eq->inst, eq->slot_id, &Length, 0);
dest->FastQueuePacket(&in, ack_req); //
// 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) ENCODE(OP_ClientUpdate)

View File

@ -263,40 +263,42 @@ namespace Titanium
EQApplicationPacket *in = *p; EQApplicationPacket *in = *p;
*p = nullptr; *p = nullptr;
//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; delete in;
return;
}
InternalSerializedItem_Struct *eq = (InternalSerializedItem_Struct *)in->pBuffer;
//do the transform... ////store away the emu struct
int r; //unsigned char *__emu_buffer = in->pBuffer;
std::string serial_string; //
for (r = 0; r < itemcount; r++, eq++) { //int itemcount = in->size / sizeof(InternalSerializedItem_Struct);
uint32 length; //if (itemcount == 0 || (in->size % sizeof(InternalSerializedItem_Struct)) != 0) {
char *serialized = SerializeItem((const ItemInst*)eq->inst, eq->slot_id, &length, 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));
if (serialized) { // delete in;
serial_string.append(serialized, length + 1); // return;
safe_delete_array(serialized); //}
} //InternalSerializedItem_Struct *eq = (InternalSerializedItem_Struct *)in->pBuffer;
else { //
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Serialization failed on item slot %d during OP_CharInventory. Item skipped.", eq->slot_id); ////do the transform...
} //int r;
//std::string serial_string;
} //for (r = 0; r < itemcount; r++, eq++) {
// uint32 length;
in->size = serial_string.length(); // char *serialized = SerializeItem((const ItemInst*)eq->inst, eq->slot_id, &length, 0);
in->pBuffer = new unsigned char[in->size]; // if (serialized) {
memcpy(in->pBuffer, serial_string.c_str(), serial_string.length()); // serial_string.append(serialized, length + 1);
// safe_delete_array(serialized);
delete[] __emu_buffer; // }
// else {
dest->FastQueuePacket(&in, ack_req); // 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); } ENCODE(OP_DeleteCharge) { ENCODE_FORWARD(OP_MoveItem); }

View File

@ -474,68 +474,69 @@ namespace UF
{ {
//consume the packet //consume the packet
EQApplicationPacket *in = *p; 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; delete in;
return;
}
InternalSerializedItem_Struct *eq = (InternalSerializedItem_Struct *)in->pBuffer; //*p = nullptr;
//
in->pBuffer = new uchar[4]; //if (in->size == 0) {
*(uint32 *)in->pBuffer = ItemCount; //
in->size = 4; // in->size = 4;
// in->pBuffer = new uchar[in->size];
for (int r = 0; r < ItemCount; r++, eq++) { // *((uint32 *)in->pBuffer) = 0;
//
uint32 Length = 0; // dest->FastQueuePacket(&in, ack_req);
char* Serialized = SerializeItem((const ItemInst*)eq->inst, eq->slot_id, &Length, 0); // return;
//}
if (Serialized) { //
////store away the emu struct
uchar *OldBuffer = in->pBuffer; //unsigned char *__emu_buffer = in->pBuffer;
in->pBuffer = new uchar[in->size + Length]; //
memcpy(in->pBuffer, OldBuffer, in->size); //int ItemCount = in->size / sizeof(InternalSerializedItem_Struct);
//
safe_delete_array(OldBuffer); //if (ItemCount == 0 || (in->size % sizeof(InternalSerializedItem_Struct)) != 0) {
//
memcpy(in->pBuffer + in->size, Serialized, Length); // Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Wrong size on outbound %s: Got %d, expected multiple of %d",
in->size += Length; // opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(InternalSerializedItem_Struct));
//
safe_delete_array(Serialized); // delete in;
} // return;
else { //}
Log.Out(Logs::General, Logs::Netcode, "[ERROR] Serialization failed on item slot %d during OP_CharInventory. Item skipped.", eq->slot_id); //
} //InternalSerializedItem_Struct *eq = (InternalSerializedItem_Struct *)in->pBuffer;
} //
//in->pBuffer = new uchar[4];
delete[] __emu_buffer; //*(uint32 *)in->pBuffer = ItemCount;
//in->size = 4;
//Log.LogDebugType(Logs::General, Logs::Netcode, "[ERROR] Sending inventory to client"); //
//Log.Hex(Logs::Netcode, in->pBuffer, in->size); //for (int r = 0; r < ItemCount; r++, eq++) {
//
dest->FastQueuePacket(&in, ack_req); // 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) ENCODE(OP_ClientUpdate)

View File

@ -820,8 +820,9 @@ void Client::BulkSendInventoryItems() {
return; return;
} }
EQApplicationPacket* outapp = new EQApplicationPacket(OP_CharInventory, items.Size()); EQApplicationPacket outapp(OP_CharInventory, items.Size());
memcpy(outapp->pBuffer, items, items.Size()); memcpy(outapp.pBuffer, items, items.Size());
QueuePacket(&outapp);
//int16 slot_id = 0; //int16 slot_id = 0;