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;
delete in;
*p = nullptr; //*p = nullptr;
//
if (in->size == 0) { //if (in->size == 0) {
//
in->size = 4; // in->size = 4;
in->pBuffer = new uchar[in->size]; // in->pBuffer = new uchar[in->size];
//
*((uint32 *)in->pBuffer) = 0; // *((uint32 *)in->pBuffer) = 0;
//
dest->FastQueuePacket(&in, ack_req); // dest->FastQueuePacket(&in, ack_req);
return; // return;
} //}
//
//store away the emu struct ////store away the emu struct
unsigned char *__emu_buffer = in->pBuffer; //unsigned char *__emu_buffer = in->pBuffer;
//
int ItemCount = in->size / sizeof(InternalSerializedItem_Struct); //int ItemCount = in->size / sizeof(InternalSerializedItem_Struct);
//
if (ItemCount == 0 || (in->size % sizeof(InternalSerializedItem_Struct)) != 0) { //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", // 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)); // opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(InternalSerializedItem_Struct));
//
delete in; // delete in;
//
return; // return;
} //}
//
InternalSerializedItem_Struct *eq = (InternalSerializedItem_Struct *)in->pBuffer; //InternalSerializedItem_Struct *eq = (InternalSerializedItem_Struct *)in->pBuffer;
//
in->pBuffer = new uchar[4]; //in->pBuffer = new uchar[4];
*(uint32 *)in->pBuffer = ItemCount; //*(uint32 *)in->pBuffer = ItemCount;
in->size = 4; //in->size = 4;
//
for (int r = 0; r < ItemCount; r++, eq++) { //for (int r = 0; r < ItemCount; r++, eq++) {
//
uint32 Length = 0; // uint32 Length = 0;
//
char* Serialized = SerializeItem((const ItemInst*)eq->inst, eq->slot_id, &Length, 0); // char* Serialized = SerializeItem((const ItemInst*)eq->inst, eq->slot_id, &Length, 0);
//
if (Serialized) { // if (Serialized) {
//
uchar *OldBuffer = in->pBuffer; // uchar *OldBuffer = in->pBuffer;
in->pBuffer = new uchar[in->size + Length]; // in->pBuffer = new uchar[in->size + Length];
memcpy(in->pBuffer, OldBuffer, in->size); // memcpy(in->pBuffer, OldBuffer, in->size);
//
safe_delete_array(OldBuffer); // safe_delete_array(OldBuffer);
//
memcpy(in->pBuffer + in->size, Serialized, Length); // memcpy(in->pBuffer + in->size, Serialized, Length);
in->size += Length; // in->size += Length;
//
safe_delete_array(Serialized); // safe_delete_array(Serialized);
} // }
else { // else {
Log.Out(Logs::General, Logs::Netcode, "[ERROR] Serialization failed on item slot %d during OP_CharInventory. Item skipped.", eq->slot_id); // Log.Out(Logs::General, Logs::Netcode, "[ERROR] Serialization failed on item slot %d during OP_CharInventory. Item skipped.", eq->slot_id);
} // }
} //}
//
delete[] __emu_buffer; //delete[] __emu_buffer;
//
//Log.LogDebugType(Logs::General, Logs::Netcode, "[ERROR] Sending inventory to client"); ////Log.LogDebugType(Logs::General, Logs::Netcode, "[ERROR] Sending inventory to client");
//Log.Hex(Logs::Netcode, in->pBuffer, in->size); ////Log.Hex(Logs::Netcode, in->pBuffer, in->size);
//
dest->FastQueuePacket(&in, ack_req); //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;
delete in;
*p = nullptr; //*p = nullptr;
//
if (in->size == 0) { //if (in->size == 0) {
//
in->size = 4; // in->size = 4;
//
in->pBuffer = new uchar[in->size]; // in->pBuffer = new uchar[in->size];
//
*((uint32 *)in->pBuffer) = 0; // *((uint32 *)in->pBuffer) = 0;
//
dest->FastQueuePacket(&in, ack_req); // dest->FastQueuePacket(&in, ack_req);
//
return; // return;
} //}
//
//store away the emu struct ////store away the emu struct
unsigned char *__emu_buffer = in->pBuffer; //unsigned char *__emu_buffer = in->pBuffer;
//
int ItemCount = in->size / sizeof(InternalSerializedItem_Struct); //int ItemCount = in->size / sizeof(InternalSerializedItem_Struct);
//
if (ItemCount == 0 || (in->size % sizeof(InternalSerializedItem_Struct)) != 0) { //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", // 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)); // opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(InternalSerializedItem_Struct));
//
delete in; // delete in;
return; // return;
} //}
//
InternalSerializedItem_Struct *eq = (InternalSerializedItem_Struct *)in->pBuffer; //InternalSerializedItem_Struct *eq = (InternalSerializedItem_Struct *)in->pBuffer;
in->pBuffer = new uchar[4]; //in->pBuffer = new uchar[4];
*(uint32 *)in->pBuffer = ItemCount; //*(uint32 *)in->pBuffer = ItemCount;
in->size = 4; //in->size = 4;
//
for (int r = 0; r < ItemCount; r++, eq++) { //for (int r = 0; r < ItemCount; r++, eq++) {
//
uint32 Length = 0; // uint32 Length = 0;
char* Serialized = SerializeItem((const ItemInst*)eq->inst, eq->slot_id, &Length, 0); // char* Serialized = SerializeItem((const ItemInst*)eq->inst, eq->slot_id, &Length, 0);
//
if (Serialized) { // if (Serialized) {
//
uchar *OldBuffer = in->pBuffer; // uchar *OldBuffer = in->pBuffer;
in->pBuffer = new uchar[in->size + Length]; // in->pBuffer = new uchar[in->size + Length];
memcpy(in->pBuffer, OldBuffer, in->size); // memcpy(in->pBuffer, OldBuffer, in->size);
//
safe_delete_array(OldBuffer); // safe_delete_array(OldBuffer);
//
memcpy(in->pBuffer + in->size, Serialized, Length); // memcpy(in->pBuffer + in->size, Serialized, Length);
in->size += Length; // in->size += Length;
//
safe_delete_array(Serialized); // safe_delete_array(Serialized);
//
} // }
else { // else {
Log.Out(Logs::General, Logs::Netcode, "[ERROR] Serialization failed on item slot %d during OP_CharInventory. Item skipped.", eq->slot_id); // Log.Out(Logs::General, Logs::Netcode, "[ERROR] Serialization failed on item slot %d during OP_CharInventory. Item skipped.", eq->slot_id);
} // }
} //}
//
delete[] __emu_buffer; //delete[] __emu_buffer;
//
//Log.LogDebugType(Logs::General, Logs::Netcode, "[ERROR] Sending inventory to client"); ////Log.LogDebugType(Logs::General, Logs::Netcode, "[ERROR] Sending inventory to client");
//Log.Hex(Logs::Netcode, in->pBuffer, in->size); ////Log.Hex(Logs::Netcode, in->pBuffer, in->size);
//
dest->FastQueuePacket(&in, ack_req); //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;
delete in;
*p = nullptr; //*p = nullptr;
//
if (in->size == 0) { //if (in->size == 0) {
in->size = 4; // in->size = 4;
in->pBuffer = new uchar[in->size]; // in->pBuffer = new uchar[in->size];
*((uint32 *)in->pBuffer) = 0; // *((uint32 *)in->pBuffer) = 0;
//
dest->FastQueuePacket(&in, ack_req); // dest->FastQueuePacket(&in, ack_req);
return; // return;
} //}
//
//store away the emu struct ////store away the emu struct
unsigned char *__emu_buffer = in->pBuffer; //unsigned char *__emu_buffer = in->pBuffer;
//
int ItemCount = in->size / sizeof(InternalSerializedItem_Struct); //int ItemCount = in->size / sizeof(InternalSerializedItem_Struct);
//
if (ItemCount == 0 || (in->size % sizeof(InternalSerializedItem_Struct)) != 0) { //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", // 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)); // opcodes->EmuToName(in->GetOpcode()), in->size, sizeof(InternalSerializedItem_Struct));
//
delete in; // delete in;
return; // return;
} //}
//
InternalSerializedItem_Struct *eq = (InternalSerializedItem_Struct *)in->pBuffer; //InternalSerializedItem_Struct *eq = (InternalSerializedItem_Struct *)in->pBuffer;
//
in->pBuffer = new uchar[4]; //in->pBuffer = new uchar[4];
*(uint32 *)in->pBuffer = ItemCount; //*(uint32 *)in->pBuffer = ItemCount;
in->size = 4; //in->size = 4;
//
for (int r = 0; r < ItemCount; r++, eq++) { //for (int r = 0; r < ItemCount; r++, eq++) {
//
uint32 Length = 0; // uint32 Length = 0;
//
char* Serialized = SerializeItem((const ItemInst*)eq->inst, eq->slot_id, &Length, 0); // char* Serialized = SerializeItem((const ItemInst*)eq->inst, eq->slot_id, &Length, 0);
//
if (Serialized) { // if (Serialized) {
uchar *OldBuffer = in->pBuffer; // uchar *OldBuffer = in->pBuffer;
//
in->pBuffer = new uchar[in->size + Length]; // in->pBuffer = new uchar[in->size + Length];
memcpy(in->pBuffer, OldBuffer, in->size); // memcpy(in->pBuffer, OldBuffer, in->size);
//
safe_delete_array(OldBuffer); // safe_delete_array(OldBuffer);
//
memcpy(in->pBuffer + in->size, Serialized, Length); // memcpy(in->pBuffer + in->size, Serialized, Length);
in->size += Length; // in->size += Length;
//
safe_delete_array(Serialized); // safe_delete_array(Serialized);
//
} // }
else { // else {
Log.Out(Logs::General, Logs::Netcode, "[ERROR] Serialization failed on item slot %d during OP_CharInventory. Item skipped.", eq->slot_id); // Log.Out(Logs::General, Logs::Netcode, "[ERROR] Serialization failed on item slot %d during OP_CharInventory. Item skipped.", eq->slot_id);
} // }
} //}
//
delete[] __emu_buffer; //delete[] __emu_buffer;
//
//Log.LogDebugType(Logs::General, Logs::Netcode, "[ERROR] Sending inventory to client"); ////Log.LogDebugType(Logs::General, Logs::Netcode, "[ERROR] Sending inventory to client");
//Log.Hex(Logs::Netcode, in->pBuffer, in->size); ////Log.Hex(Logs::Netcode, in->pBuffer, in->size);
//
dest->FastQueuePacket(&in, ack_req); //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 delete in;
unsigned char *__emu_buffer = in->pBuffer;
int itemcount = in->size / sizeof(InternalSerializedItem_Struct); ////store away the emu struct
if (itemcount == 0 || (in->size % sizeof(InternalSerializedItem_Struct)) != 0) { //unsigned char *__emu_buffer = in->pBuffer;
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; //int itemcount = in->size / sizeof(InternalSerializedItem_Struct);
return; //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));
InternalSerializedItem_Struct *eq = (InternalSerializedItem_Struct *)in->pBuffer; // delete in;
// return;
//do the transform... //}
int r; //InternalSerializedItem_Struct *eq = (InternalSerializedItem_Struct *)in->pBuffer;
std::string serial_string; //
for (r = 0; r < itemcount; r++, eq++) { ////do the transform...
uint32 length; //int r;
char *serialized = SerializeItem((const ItemInst*)eq->inst, eq->slot_id, &length, 0); //std::string serial_string;
if (serialized) { //for (r = 0; r < itemcount; r++, eq++) {
serial_string.append(serialized, length + 1); // uint32 length;
safe_delete_array(serialized); // char *serialized = SerializeItem((const ItemInst*)eq->inst, eq->slot_id, &length, 0);
} // if (serialized) {
else { // serial_string.append(serialized, length + 1);
Log.Out(Logs::General, Logs::Netcode, "[STRUCTS] Serialization failed on item slot %d during OP_CharInventory. Item skipped.", eq->slot_id); // 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()); //
//in->size = serial_string.length();
delete[] __emu_buffer; //in->pBuffer = new unsigned char[in->size];
//memcpy(in->pBuffer, serial_string.c_str(), serial_string.length());
dest->FastQueuePacket(&in, ack_req); //
//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;
delete in;
*p = nullptr;
//*p = nullptr;
if (in->size == 0) { //
//if (in->size == 0) {
in->size = 4; //
in->pBuffer = new uchar[in->size]; // in->size = 4;
*((uint32 *)in->pBuffer) = 0; // in->pBuffer = new uchar[in->size];
// *((uint32 *)in->pBuffer) = 0;
dest->FastQueuePacket(&in, ack_req); //
return; // dest->FastQueuePacket(&in, ack_req);
} // return;
//}
//store away the emu struct //
unsigned char *__emu_buffer = in->pBuffer; ////store away the emu struct
//unsigned char *__emu_buffer = in->pBuffer;
int ItemCount = in->size / sizeof(InternalSerializedItem_Struct); //
//int ItemCount = in->size / sizeof(InternalSerializedItem_Struct);
if (ItemCount == 0 || (in->size % sizeof(InternalSerializedItem_Struct)) != 0) { //
//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)); // 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; // delete in;
} // return;
//}
InternalSerializedItem_Struct *eq = (InternalSerializedItem_Struct *)in->pBuffer; //
//InternalSerializedItem_Struct *eq = (InternalSerializedItem_Struct *)in->pBuffer;
in->pBuffer = new uchar[4]; //
*(uint32 *)in->pBuffer = ItemCount; //in->pBuffer = new uchar[4];
in->size = 4; //*(uint32 *)in->pBuffer = ItemCount;
//in->size = 4;
for (int r = 0; r < ItemCount; r++, eq++) { //
//for (int r = 0; r < ItemCount; r++, eq++) {
uint32 Length = 0; //
char* Serialized = SerializeItem((const ItemInst*)eq->inst, eq->slot_id, &Length, 0); // uint32 Length = 0;
// char* Serialized = SerializeItem((const ItemInst*)eq->inst, eq->slot_id, &Length, 0);
if (Serialized) { //
// if (Serialized) {
uchar *OldBuffer = in->pBuffer; //
in->pBuffer = new uchar[in->size + Length]; // uchar *OldBuffer = in->pBuffer;
memcpy(in->pBuffer, OldBuffer, in->size); // in->pBuffer = new uchar[in->size + Length];
// memcpy(in->pBuffer, OldBuffer, in->size);
safe_delete_array(OldBuffer); //
// safe_delete_array(OldBuffer);
memcpy(in->pBuffer + in->size, Serialized, Length); //
in->size += Length; // memcpy(in->pBuffer + in->size, Serialized, Length);
// in->size += Length;
safe_delete_array(Serialized); //
} // 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); // 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; //
//delete[] __emu_buffer;
//Log.LogDebugType(Logs::General, Logs::Netcode, "[ERROR] Sending inventory to client"); //
//Log.Hex(Logs::Netcode, in->pBuffer, in->size); ////Log.LogDebugType(Logs::General, Logs::Netcode, "[ERROR] Sending inventory to client");
////Log.Hex(Logs::Netcode, in->pBuffer, in->size);
dest->FastQueuePacket(&in, ack_req); //
//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;