Fix up OP_OpenNewTasksWindow for older clients

This commit is contained in:
Michael Cook (mackal) 2018-07-04 01:57:54 -04:00
parent 6d60f619c0
commit a7c1fad213
11 changed files with 49 additions and 656 deletions

View File

@ -1863,120 +1863,6 @@ namespace RoF
FINISH_ENCODE(); FINISH_ENCODE();
} }
/*
ENCODE(OP_OpenNewTasksWindow)
{
AvailableTaskHeader_Struct* __emu_AvailableTaskHeader;
AvailableTaskData1_Struct* __emu_AvailableTaskData1;
AvailableTaskData2_Struct* __emu_AvailableTaskData2;
AvailableTaskTrailer_Struct* __emu_AvailableTaskTrailer;
structs::AvailableTaskHeader_Struct* __eq_AvailableTaskHeader;
structs::AvailableTaskData1_Struct* __eq_AvailableTaskData1;
structs::AvailableTaskData2_Struct* __eq_AvailableTaskData2;
structs::AvailableTaskTrailer_Struct* __eq_AvailableTaskTrailer;
EQApplicationPacket *in = *p;
*p = nullptr;
unsigned char *__emu_buffer = in->pBuffer;
__emu_AvailableTaskHeader = (AvailableTaskHeader_Struct*)__emu_buffer;
// For each task, SoF has an extra uint32 and what appears to be space for a null terminated string.
//
in->size = in->size + (__emu_AvailableTaskHeader->TaskCount * 5);
in->pBuffer = new unsigned char[in->size];
unsigned char *__eq_buffer = in->pBuffer;
__eq_AvailableTaskHeader = (structs::AvailableTaskHeader_Struct*)__eq_buffer;
char *__eq_ptr, *__emu_Ptr;
// Copy Header
//
//
__eq_AvailableTaskHeader->TaskCount = __emu_AvailableTaskHeader->TaskCount;
__eq_AvailableTaskHeader->unknown1 = __emu_AvailableTaskHeader->unknown1;
__eq_AvailableTaskHeader->TaskGiver = __emu_AvailableTaskHeader->TaskGiver;
__emu_Ptr = (char *) __emu_AvailableTaskHeader + sizeof(AvailableTaskHeader_Struct);
__eq_ptr = (char *) __eq_AvailableTaskHeader + sizeof(structs::AvailableTaskHeader_Struct);
for(uint32 i=0; i<__emu_AvailableTaskHeader->TaskCount; i++) {
__emu_AvailableTaskData1 = (AvailableTaskData1_Struct*)__emu_Ptr;
__eq_AvailableTaskData1 = (structs::AvailableTaskData1_Struct*)__eq_ptr;
__eq_AvailableTaskData1->TaskID = __emu_AvailableTaskData1->TaskID;
// This next unknown seems to affect the colour of the task title. 0x3f80000 is what I have seen
// in RoF packets. Changing it to 0x3f000000 makes the title red.
__eq_AvailableTaskData1->unknown1 = 0x3f800000;
__eq_AvailableTaskData1->TimeLimit = __emu_AvailableTaskData1->TimeLimit;
__eq_AvailableTaskData1->unknown2 = __emu_AvailableTaskData1->unknown2;
__emu_Ptr += sizeof(AvailableTaskData1_Struct);
__eq_ptr += sizeof(structs::AvailableTaskData1_Struct);
strcpy(__eq_ptr, __emu_Ptr); // Title
__emu_Ptr += strlen(__emu_Ptr) + 1;
__eq_ptr += strlen(__eq_ptr) + 1;
strcpy(__eq_ptr, __emu_Ptr); // Description
__emu_Ptr += strlen(__emu_Ptr) + 1;
__eq_ptr += strlen(__eq_ptr) + 1;
__eq_ptr[0] = 0;
__eq_ptr += strlen(__eq_ptr) + 1;
__emu_AvailableTaskData2 = (AvailableTaskData2_Struct*)__emu_Ptr;
__eq_AvailableTaskData2 = (structs::AvailableTaskData2_Struct*)__eq_ptr;
__eq_AvailableTaskData2->unknown1 = __emu_AvailableTaskData2->unknown1;
__eq_AvailableTaskData2->unknown2 = __emu_AvailableTaskData2->unknown2;
__eq_AvailableTaskData2->unknown3 = __emu_AvailableTaskData2->unknown3;
__eq_AvailableTaskData2->unknown4 = __emu_AvailableTaskData2->unknown4;
__emu_Ptr += sizeof(AvailableTaskData2_Struct);
__eq_ptr += sizeof(structs::AvailableTaskData2_Struct);
strcpy(__eq_ptr, __emu_Ptr); // Unknown string
__emu_Ptr += strlen(__emu_Ptr) + 1;
__eq_ptr += strlen(__eq_ptr) + 1;
strcpy(__eq_ptr, __emu_Ptr); // Unknown string
__emu_Ptr += strlen(__emu_Ptr) + 1;
__eq_ptr += strlen(__eq_ptr) + 1;
__emu_AvailableTaskTrailer = (AvailableTaskTrailer_Struct*)__emu_Ptr;
__eq_AvailableTaskTrailer = (structs::AvailableTaskTrailer_Struct*)__eq_ptr;
__eq_AvailableTaskTrailer->ItemCount = __emu_AvailableTaskTrailer->ItemCount;
__eq_AvailableTaskTrailer->unknown1 = __emu_AvailableTaskTrailer->unknown1;
__eq_AvailableTaskTrailer->unknown2 = __emu_AvailableTaskTrailer->unknown2;
__eq_AvailableTaskTrailer->StartZone = __emu_AvailableTaskTrailer->StartZone;
__emu_Ptr += sizeof(AvailableTaskTrailer_Struct);
__eq_ptr += sizeof(structs::AvailableTaskTrailer_Struct);
strcpy(__eq_ptr, __emu_Ptr); // Unknown string
__emu_Ptr += strlen(__emu_Ptr) + 1;
__eq_ptr += strlen(__eq_ptr) + 1;
}
delete[] __emu_buffer;
dest->FastQueuePacket(&in, ack_req);
}
*/
ENCODE(OP_PetBuffWindow) ENCODE(OP_PetBuffWindow)
{ {
// The format of the RoF packet is identical to the OP_BuffCreate packet. // The format of the RoF packet is identical to the OP_BuffCreate packet.

View File

@ -1940,120 +1940,6 @@ namespace RoF2
FINISH_ENCODE(); FINISH_ENCODE();
} }
/*
ENCODE(OP_OpenNewTasksWindow)
{
AvailableTaskHeader_Struct* __emu_AvailableTaskHeader;
AvailableTaskData1_Struct* __emu_AvailableTaskData1;
AvailableTaskData2_Struct* __emu_AvailableTaskData2;
AvailableTaskTrailer_Struct* __emu_AvailableTaskTrailer;
structs::AvailableTaskHeader_Struct* __eq_AvailableTaskHeader;
structs::AvailableTaskData1_Struct* __eq_AvailableTaskData1;
structs::AvailableTaskData2_Struct* __eq_AvailableTaskData2;
structs::AvailableTaskTrailer_Struct* __eq_AvailableTaskTrailer;
EQApplicationPacket *in = *p;
*p = nullptr;
unsigned char *__emu_buffer = in->pBuffer;
__emu_AvailableTaskHeader = (AvailableTaskHeader_Struct*)__emu_buffer;
// For each task, SoF has an extra uint32 and what appears to be space for a null terminated string.
//
in->size = in->size + (__emu_AvailableTaskHeader->TaskCount * 5);
in->pBuffer = new unsigned char[in->size];
unsigned char *__eq_buffer = in->pBuffer;
__eq_AvailableTaskHeader = (structs::AvailableTaskHeader_Struct*)__eq_buffer;
char *__eq_ptr, *__emu_Ptr;
// Copy Header
//
//
__eq_AvailableTaskHeader->TaskCount = __emu_AvailableTaskHeader->TaskCount;
__eq_AvailableTaskHeader->unknown1 = __emu_AvailableTaskHeader->unknown1;
__eq_AvailableTaskHeader->TaskGiver = __emu_AvailableTaskHeader->TaskGiver;
__emu_Ptr = (char *) __emu_AvailableTaskHeader + sizeof(AvailableTaskHeader_Struct);
__eq_ptr = (char *) __eq_AvailableTaskHeader + sizeof(structs::AvailableTaskHeader_Struct);
for(uint32 i=0; i<__emu_AvailableTaskHeader->TaskCount; i++) {
__emu_AvailableTaskData1 = (AvailableTaskData1_Struct*)__emu_Ptr;
__eq_AvailableTaskData1 = (structs::AvailableTaskData1_Struct*)__eq_ptr;
__eq_AvailableTaskData1->TaskID = __emu_AvailableTaskData1->TaskID;
// This next unknown seems to affect the colour of the task title. 0x3f80000 is what I have seen
// in RoF2 packets. Changing it to 0x3f000000 makes the title red.
__eq_AvailableTaskData1->unknown1 = 0x3f800000;
__eq_AvailableTaskData1->TimeLimit = __emu_AvailableTaskData1->TimeLimit;
__eq_AvailableTaskData1->unknown2 = __emu_AvailableTaskData1->unknown2;
__emu_Ptr += sizeof(AvailableTaskData1_Struct);
__eq_ptr += sizeof(structs::AvailableTaskData1_Struct);
strcpy(__eq_ptr, __emu_Ptr); // Title
__emu_Ptr += strlen(__emu_Ptr) + 1;
__eq_ptr += strlen(__eq_ptr) + 1;
strcpy(__eq_ptr, __emu_Ptr); // Description
__emu_Ptr += strlen(__emu_Ptr) + 1;
__eq_ptr += strlen(__eq_ptr) + 1;
__eq_ptr[0] = 0;
__eq_ptr += strlen(__eq_ptr) + 1;
__emu_AvailableTaskData2 = (AvailableTaskData2_Struct*)__emu_Ptr;
__eq_AvailableTaskData2 = (structs::AvailableTaskData2_Struct*)__eq_ptr;
__eq_AvailableTaskData2->unknown1 = __emu_AvailableTaskData2->unknown1;
__eq_AvailableTaskData2->unknown2 = __emu_AvailableTaskData2->unknown2;
__eq_AvailableTaskData2->unknown3 = __emu_AvailableTaskData2->unknown3;
__eq_AvailableTaskData2->unknown4 = __emu_AvailableTaskData2->unknown4;
__emu_Ptr += sizeof(AvailableTaskData2_Struct);
__eq_ptr += sizeof(structs::AvailableTaskData2_Struct);
strcpy(__eq_ptr, __emu_Ptr); // Unknown string
__emu_Ptr += strlen(__emu_Ptr) + 1;
__eq_ptr += strlen(__eq_ptr) + 1;
strcpy(__eq_ptr, __emu_Ptr); // Unknown string
__emu_Ptr += strlen(__emu_Ptr) + 1;
__eq_ptr += strlen(__eq_ptr) + 1;
__emu_AvailableTaskTrailer = (AvailableTaskTrailer_Struct*)__emu_Ptr;
__eq_AvailableTaskTrailer = (structs::AvailableTaskTrailer_Struct*)__eq_ptr;
__eq_AvailableTaskTrailer->ItemCount = __emu_AvailableTaskTrailer->ItemCount;
__eq_AvailableTaskTrailer->unknown1 = __emu_AvailableTaskTrailer->unknown1;
__eq_AvailableTaskTrailer->unknown2 = __emu_AvailableTaskTrailer->unknown2;
__eq_AvailableTaskTrailer->StartZone = __emu_AvailableTaskTrailer->StartZone;
__emu_Ptr += sizeof(AvailableTaskTrailer_Struct);
__eq_ptr += sizeof(structs::AvailableTaskTrailer_Struct);
strcpy(__eq_ptr, __emu_Ptr); // Unknown string
__emu_Ptr += strlen(__emu_Ptr) + 1;
__eq_ptr += strlen(__eq_ptr) + 1;
}
delete[] __emu_buffer;
dest->FastQueuePacket(&in, ack_req);
}
*/
ENCODE(OP_PetBuffWindow) ENCODE(OP_PetBuffWindow)
{ {
// The format of the RoF2 packet is identical to the OP_BuffCreate packet. // The format of the RoF2 packet is identical to the OP_BuffCreate packet.

View File

@ -98,7 +98,6 @@ E(OP_MoveItem)
E(OP_NewSpawn) E(OP_NewSpawn)
E(OP_NewZone) E(OP_NewZone)
E(OP_OnLevelMessage) E(OP_OnLevelMessage)
//E(OP_OpenNewTasksWindow)
E(OP_PetBuffWindow) E(OP_PetBuffWindow)
E(OP_PlayerProfile) E(OP_PlayerProfile)
E(OP_RaidJoin) E(OP_RaidJoin)

View File

@ -83,7 +83,6 @@ E(OP_MoveItem)
E(OP_NewSpawn) E(OP_NewSpawn)
E(OP_NewZone) E(OP_NewZone)
E(OP_OnLevelMessage) E(OP_OnLevelMessage)
//E(OP_OpenNewTasksWindow)
E(OP_PetBuffWindow) E(OP_PetBuffWindow)
E(OP_PlayerProfile) E(OP_PlayerProfile)
E(OP_RaidJoin) E(OP_RaidJoin)

View File

@ -1383,114 +1383,6 @@ namespace SoD
FINISH_ENCODE(); FINISH_ENCODE();
} }
ENCODE(OP_OpenNewTasksWindow)
{
AvailableTaskHeader_Struct* __emu_AvailableTaskHeader;
AvailableTaskData1_Struct* __emu_AvailableTaskData1;
AvailableTaskData2_Struct* __emu_AvailableTaskData2;
AvailableTaskTrailer_Struct* __emu_AvailableTaskTrailer;
structs::AvailableTaskHeader_Struct* __eq_AvailableTaskHeader;
structs::AvailableTaskData1_Struct* __eq_AvailableTaskData1;
structs::AvailableTaskData2_Struct* __eq_AvailableTaskData2;
structs::AvailableTaskTrailer_Struct* __eq_AvailableTaskTrailer;
EQApplicationPacket *in = *p;
*p = nullptr;
unsigned char *__emu_buffer = in->pBuffer;
__emu_AvailableTaskHeader = (AvailableTaskHeader_Struct*)__emu_buffer;
// For each task, SoF has an extra uint32 and what appears to be space for a null terminated string.
//
in->size = in->size + (__emu_AvailableTaskHeader->TaskCount * 5);
in->pBuffer = new unsigned char[in->size];
unsigned char *__eq_buffer = in->pBuffer;
__eq_AvailableTaskHeader = (structs::AvailableTaskHeader_Struct*)__eq_buffer;
char *__eq_ptr, *__emu_Ptr;
// Copy Header
//
//
__eq_AvailableTaskHeader->TaskCount = __emu_AvailableTaskHeader->TaskCount;
__eq_AvailableTaskHeader->unknown1 = __emu_AvailableTaskHeader->unknown1;
__eq_AvailableTaskHeader->TaskGiver = __emu_AvailableTaskHeader->TaskGiver;
__emu_Ptr = (char *)__emu_AvailableTaskHeader + sizeof(AvailableTaskHeader_Struct);
__eq_ptr = (char *)__eq_AvailableTaskHeader + sizeof(structs::AvailableTaskHeader_Struct);
for (uint32 i = 0; i<__emu_AvailableTaskHeader->TaskCount; i++) {
__emu_AvailableTaskData1 = (AvailableTaskData1_Struct*)__emu_Ptr;
__eq_AvailableTaskData1 = (structs::AvailableTaskData1_Struct*)__eq_ptr;
__eq_AvailableTaskData1->TaskID = __emu_AvailableTaskData1->TaskID;
// This next unknown seems to affect the colour of the task title. 0x3f80000 is what I have seen
// in Live packets. Changing it to 0x3f000000 makes the title red.
__eq_AvailableTaskData1->unknown1 = 0x3f800000;
__eq_AvailableTaskData1->TimeLimit = __emu_AvailableTaskData1->TimeLimit;
__eq_AvailableTaskData1->unknown2 = __emu_AvailableTaskData1->unknown2;
__emu_Ptr += sizeof(AvailableTaskData1_Struct);
__eq_ptr += sizeof(structs::AvailableTaskData1_Struct);
strcpy(__eq_ptr, __emu_Ptr); // Title
__emu_Ptr += strlen(__emu_Ptr) + 1;
__eq_ptr += strlen(__eq_ptr) + 1;
strcpy(__eq_ptr, __emu_Ptr); // Description
__emu_Ptr += strlen(__emu_Ptr) + 1;
__eq_ptr += strlen(__eq_ptr) + 1;
__eq_ptr[0] = 0;
__eq_ptr += strlen(__eq_ptr) + 1;
__emu_AvailableTaskData2 = (AvailableTaskData2_Struct*)__emu_Ptr;
__eq_AvailableTaskData2 = (structs::AvailableTaskData2_Struct*)__eq_ptr;
__eq_AvailableTaskData2->unknown1 = __emu_AvailableTaskData2->unknown1;
__eq_AvailableTaskData2->unknown2 = __emu_AvailableTaskData2->unknown2;
__eq_AvailableTaskData2->unknown3 = __emu_AvailableTaskData2->unknown3;
__eq_AvailableTaskData2->unknown4 = __emu_AvailableTaskData2->unknown4;
__emu_Ptr += sizeof(AvailableTaskData2_Struct);
__eq_ptr += sizeof(structs::AvailableTaskData2_Struct);
strcpy(__eq_ptr, __emu_Ptr); // Unknown string
__emu_Ptr += strlen(__emu_Ptr) + 1;
__eq_ptr += strlen(__eq_ptr) + 1;
strcpy(__eq_ptr, __emu_Ptr); // Unknown string
__emu_Ptr += strlen(__emu_Ptr) + 1;
__eq_ptr += strlen(__eq_ptr) + 1;
__emu_AvailableTaskTrailer = (AvailableTaskTrailer_Struct*)__emu_Ptr;
__eq_AvailableTaskTrailer = (structs::AvailableTaskTrailer_Struct*)__eq_ptr;
__eq_AvailableTaskTrailer->ItemCount = __emu_AvailableTaskTrailer->ItemCount;
__eq_AvailableTaskTrailer->unknown1 = __emu_AvailableTaskTrailer->unknown1;
__eq_AvailableTaskTrailer->unknown2 = __emu_AvailableTaskTrailer->unknown2;
__eq_AvailableTaskTrailer->StartZone = __emu_AvailableTaskTrailer->StartZone;
__emu_Ptr += sizeof(AvailableTaskTrailer_Struct);
__eq_ptr += sizeof(structs::AvailableTaskTrailer_Struct);
strcpy(__eq_ptr, __emu_Ptr); // Unknown string
__emu_Ptr += strlen(__emu_Ptr) + 1;
__eq_ptr += strlen(__eq_ptr) + 1;
}
delete[] __emu_buffer;
dest->FastQueuePacket(&in, ack_req);
}
ENCODE(OP_PetBuffWindow) ENCODE(OP_PetBuffWindow)
{ {
EQApplicationPacket *in = *p; EQApplicationPacket *in = *p;

View File

@ -67,7 +67,6 @@ E(OP_MoveItem)
E(OP_NewSpawn) E(OP_NewSpawn)
E(OP_NewZone) E(OP_NewZone)
E(OP_OnLevelMessage) E(OP_OnLevelMessage)
E(OP_OpenNewTasksWindow)
E(OP_PetBuffWindow) E(OP_PetBuffWindow)
E(OP_PlayerProfile) E(OP_PlayerProfile)
E(OP_RaidJoin) E(OP_RaidJoin)

View File

@ -1060,118 +1060,6 @@ namespace SoF
FINISH_ENCODE(); FINISH_ENCODE();
} }
ENCODE(OP_OpenNewTasksWindow)
{
AvailableTaskHeader_Struct* __emu_AvailableTaskHeader;
AvailableTaskData1_Struct* __emu_AvailableTaskData1;
AvailableTaskData2_Struct* __emu_AvailableTaskData2;
AvailableTaskTrailer_Struct* __emu_AvailableTaskTrailer;
structs::AvailableTaskHeader_Struct* __eq_AvailableTaskHeader;
structs::AvailableTaskData1_Struct* __eq_AvailableTaskData1;
structs::AvailableTaskData2_Struct* __eq_AvailableTaskData2;
structs::AvailableTaskTrailer_Struct* __eq_AvailableTaskTrailer;
EQApplicationPacket *in = *p;
*p = nullptr;
unsigned char *__emu_buffer = in->pBuffer;
__emu_AvailableTaskHeader = (AvailableTaskHeader_Struct*)__emu_buffer;
// For each task, SoF has an extra uint32 and what appears to be space for a null terminated string.
//
in->size = in->size + (__emu_AvailableTaskHeader->TaskCount * 5);
in->pBuffer = new unsigned char[in->size];
unsigned char *__eq_buffer = in->pBuffer;
__eq_AvailableTaskHeader = (structs::AvailableTaskHeader_Struct*)__eq_buffer;
char *__eq_ptr, *__emu_Ptr;
// Copy Header
//
//
__eq_AvailableTaskHeader->TaskCount = __emu_AvailableTaskHeader->TaskCount;
__eq_AvailableTaskHeader->unknown1 = __emu_AvailableTaskHeader->unknown1;
__eq_AvailableTaskHeader->TaskGiver = __emu_AvailableTaskHeader->TaskGiver;
__emu_Ptr = (char *)__emu_AvailableTaskHeader + sizeof(AvailableTaskHeader_Struct);
__eq_ptr = (char *)__eq_AvailableTaskHeader + sizeof(structs::AvailableTaskHeader_Struct);
for (uint32 i = 0; i<__emu_AvailableTaskHeader->TaskCount; i++) {
__emu_AvailableTaskData1 = (AvailableTaskData1_Struct*)__emu_Ptr;
__eq_AvailableTaskData1 = (structs::AvailableTaskData1_Struct*)__eq_ptr;
__eq_AvailableTaskData1->TaskID = __emu_AvailableTaskData1->TaskID;
// This next unknown seems to affect the colour of the task title. 0x3f80000 is what I have seen
// in Live packets. Changing it to 0x3f000000 makes the title red.
__eq_AvailableTaskData1->unknown1 = 0x3f800000;
__eq_AvailableTaskData1->TimeLimit = __emu_AvailableTaskData1->TimeLimit;
__eq_AvailableTaskData1->unknown2 = __emu_AvailableTaskData1->unknown2;
__emu_Ptr += sizeof(AvailableTaskData1_Struct);
__eq_ptr += sizeof(structs::AvailableTaskData1_Struct);
strcpy(__eq_ptr, __emu_Ptr); // Title
__emu_Ptr += strlen(__emu_Ptr) + 1;
__eq_ptr += strlen(__eq_ptr) + 1;
strcpy(__eq_ptr, __emu_Ptr); // Description
__emu_Ptr += strlen(__emu_Ptr) + 1;
__eq_ptr += strlen(__eq_ptr) + 1;
__eq_ptr[0] = 0;
__eq_ptr += strlen(__eq_ptr) + 1;
__emu_AvailableTaskData2 = (AvailableTaskData2_Struct*)__emu_Ptr;
__eq_AvailableTaskData2 = (structs::AvailableTaskData2_Struct*)__eq_ptr;
__eq_AvailableTaskData2->unknown1 = __emu_AvailableTaskData2->unknown1;
__eq_AvailableTaskData2->unknown2 = __emu_AvailableTaskData2->unknown2;
__eq_AvailableTaskData2->unknown3 = __emu_AvailableTaskData2->unknown3;
__eq_AvailableTaskData2->unknown4 = __emu_AvailableTaskData2->unknown4;
__emu_Ptr += sizeof(AvailableTaskData2_Struct);
__eq_ptr += sizeof(structs::AvailableTaskData2_Struct);
strcpy(__eq_ptr, __emu_Ptr); // Unknown string
__emu_Ptr += strlen(__emu_Ptr) + 1;
__eq_ptr += strlen(__eq_ptr) + 1;
strcpy(__eq_ptr, __emu_Ptr); // Unknown string
__emu_Ptr += strlen(__emu_Ptr) + 1;
__eq_ptr += strlen(__eq_ptr) + 1;
__emu_AvailableTaskTrailer = (AvailableTaskTrailer_Struct*)__emu_Ptr;
__eq_AvailableTaskTrailer = (structs::AvailableTaskTrailer_Struct*)__eq_ptr;
__eq_AvailableTaskTrailer->ItemCount = __emu_AvailableTaskTrailer->ItemCount;
__eq_AvailableTaskTrailer->unknown1 = __emu_AvailableTaskTrailer->unknown1;
__eq_AvailableTaskTrailer->unknown2 = __emu_AvailableTaskTrailer->unknown2;
__eq_AvailableTaskTrailer->StartZone = __emu_AvailableTaskTrailer->StartZone;
__emu_Ptr += sizeof(AvailableTaskTrailer_Struct);
__eq_ptr += sizeof(structs::AvailableTaskTrailer_Struct);
strcpy(__eq_ptr, __emu_Ptr); // Unknown string
__emu_Ptr += strlen(__emu_Ptr) + 1;
__eq_ptr += strlen(__eq_ptr) + 1;
}
delete[] __emu_buffer;
dest->FastQueuePacket(&in, ack_req);
}
ENCODE(OP_PetBuffWindow) ENCODE(OP_PetBuffWindow)
{ {
ENCODE_LENGTH_EXACT(PetBuff_Struct); ENCODE_LENGTH_EXACT(PetBuff_Struct);

View File

@ -62,7 +62,6 @@ E(OP_MoveItem)
E(OP_NewSpawn) E(OP_NewSpawn)
E(OP_NewZone) E(OP_NewZone)
E(OP_OnLevelMessage) E(OP_OnLevelMessage)
E(OP_OpenNewTasksWindow)
E(OP_PetBuffWindow) E(OP_PetBuffWindow)
E(OP_PlayerProfile) E(OP_PlayerProfile)
E(OP_RaidJoin) E(OP_RaidJoin)

View File

@ -1609,117 +1609,6 @@ namespace UF
FINISH_ENCODE(); FINISH_ENCODE();
} }
ENCODE(OP_OpenNewTasksWindow)
{
AvailableTaskHeader_Struct* __emu_AvailableTaskHeader;
AvailableTaskData1_Struct* __emu_AvailableTaskData1;
AvailableTaskData2_Struct* __emu_AvailableTaskData2;
AvailableTaskTrailer_Struct* __emu_AvailableTaskTrailer;
structs::AvailableTaskHeader_Struct* __eq_AvailableTaskHeader;
structs::AvailableTaskData1_Struct* __eq_AvailableTaskData1;
structs::AvailableTaskData2_Struct* __eq_AvailableTaskData2;
structs::AvailableTaskTrailer_Struct* __eq_AvailableTaskTrailer;
EQApplicationPacket *in = *p;
*p = nullptr;
unsigned char *__emu_buffer = in->pBuffer;
__emu_AvailableTaskHeader = (AvailableTaskHeader_Struct*)__emu_buffer;
// For each task, SoF has an extra uint32 and what appears to be space for a null terminated string.
//
in->size = in->size + (__emu_AvailableTaskHeader->TaskCount * 5);
in->pBuffer = new unsigned char[in->size];
unsigned char *__eq_buffer = in->pBuffer;
__eq_AvailableTaskHeader = (structs::AvailableTaskHeader_Struct*)__eq_buffer;
char *__eq_ptr, *__emu_Ptr;
// Copy Header
//
//
__eq_AvailableTaskHeader->TaskCount = __emu_AvailableTaskHeader->TaskCount;
__eq_AvailableTaskHeader->unknown1 = __emu_AvailableTaskHeader->unknown1;
__eq_AvailableTaskHeader->TaskGiver = __emu_AvailableTaskHeader->TaskGiver;
__emu_Ptr = (char *)__emu_AvailableTaskHeader + sizeof(AvailableTaskHeader_Struct);
__eq_ptr = (char *)__eq_AvailableTaskHeader + sizeof(structs::AvailableTaskHeader_Struct);
for (uint32 i = 0; i<__emu_AvailableTaskHeader->TaskCount; i++) {
__emu_AvailableTaskData1 = (AvailableTaskData1_Struct*)__emu_Ptr;
__eq_AvailableTaskData1 = (structs::AvailableTaskData1_Struct*)__eq_ptr;
__eq_AvailableTaskData1->TaskID = __emu_AvailableTaskData1->TaskID;
// This next unknown seems to affect the colour of the task title. 0x3f80000 is what I have seen
// in Underfoot packets. Changing it to 0x3f000000 makes the title red.
__eq_AvailableTaskData1->unknown1 = 0x3f800000;
__eq_AvailableTaskData1->TimeLimit = __emu_AvailableTaskData1->TimeLimit;
__eq_AvailableTaskData1->unknown2 = __emu_AvailableTaskData1->unknown2;
__emu_Ptr += sizeof(AvailableTaskData1_Struct);
__eq_ptr += sizeof(structs::AvailableTaskData1_Struct);
strcpy(__eq_ptr, __emu_Ptr); // Title
__emu_Ptr += strlen(__emu_Ptr) + 1;
__eq_ptr += strlen(__eq_ptr) + 1;
strcpy(__eq_ptr, __emu_Ptr); // Description
__emu_Ptr += strlen(__emu_Ptr) + 1;
__eq_ptr += strlen(__eq_ptr) + 1;
__eq_ptr[0] = 0;
__eq_ptr += strlen(__eq_ptr) + 1;
__emu_AvailableTaskData2 = (AvailableTaskData2_Struct*)__emu_Ptr;
__eq_AvailableTaskData2 = (structs::AvailableTaskData2_Struct*)__eq_ptr;
__eq_AvailableTaskData2->unknown1 = __emu_AvailableTaskData2->unknown1;
__eq_AvailableTaskData2->unknown2 = __emu_AvailableTaskData2->unknown2;
__eq_AvailableTaskData2->unknown3 = __emu_AvailableTaskData2->unknown3;
__eq_AvailableTaskData2->unknown4 = __emu_AvailableTaskData2->unknown4;
__emu_Ptr += sizeof(AvailableTaskData2_Struct);
__eq_ptr += sizeof(structs::AvailableTaskData2_Struct);
strcpy(__eq_ptr, __emu_Ptr); // Unknown string
__emu_Ptr += strlen(__emu_Ptr) + 1;
__eq_ptr += strlen(__eq_ptr) + 1;
strcpy(__eq_ptr, __emu_Ptr); // Unknown string
__emu_Ptr += strlen(__emu_Ptr) + 1;
__eq_ptr += strlen(__eq_ptr) + 1;
__emu_AvailableTaskTrailer = (AvailableTaskTrailer_Struct*)__emu_Ptr;
__eq_AvailableTaskTrailer = (structs::AvailableTaskTrailer_Struct*)__eq_ptr;
__eq_AvailableTaskTrailer->ItemCount = __emu_AvailableTaskTrailer->ItemCount;
__eq_AvailableTaskTrailer->unknown1 = __emu_AvailableTaskTrailer->unknown1;
__eq_AvailableTaskTrailer->unknown2 = __emu_AvailableTaskTrailer->unknown2;
__eq_AvailableTaskTrailer->StartZone = __emu_AvailableTaskTrailer->StartZone;
__emu_Ptr += sizeof(AvailableTaskTrailer_Struct);
__eq_ptr += sizeof(structs::AvailableTaskTrailer_Struct);
strcpy(__eq_ptr, __emu_Ptr); // Unknown string
__emu_Ptr += strlen(__emu_Ptr) + 1;
__eq_ptr += strlen(__eq_ptr) + 1;
}
delete[] __emu_buffer;
dest->FastQueuePacket(&in, ack_req);
}
ENCODE(OP_PetBuffWindow) ENCODE(OP_PetBuffWindow)
{ {
EQApplicationPacket *in = *p; EQApplicationPacket *in = *p;

View File

@ -72,7 +72,6 @@ E(OP_MoveItem)
E(OP_NewSpawn) E(OP_NewSpawn)
E(OP_NewZone) E(OP_NewZone)
E(OP_OnLevelMessage) E(OP_OnLevelMessage)
E(OP_OpenNewTasksWindow)
E(OP_PetBuffWindow) E(OP_PetBuffWindow)
E(OP_PlayerProfile) E(OP_PlayerProfile)
E(OP_RaidJoin) E(OP_RaidJoin)

View File

@ -1036,121 +1036,78 @@ void TaskManager::SendTaskSelector(Client *c, Mob *mob, int TaskCount, int *Task
} }
// Titanium OpCode: 0x5e7c // Titanium OpCode: 0x5e7c
Log(Logs::General, Logs::Tasks, "[UPDATE] TaskSelector for %i Tasks", TaskCount); Log(Logs::General, Logs::Tasks, "[UPDATE] TaskSelector for %i Tasks", TaskCount);
char *Ptr;
int PlayerLevel = c->GetLevel(); int PlayerLevel = c->GetLevel();
AvailableTaskHeader_Struct* AvailableTaskHeader;
AvailableTaskData1_Struct* AvailableTaskData1;
AvailableTaskData2_Struct* AvailableTaskData2;
AvailableTaskTrailer_Struct* AvailableTaskTrailer;
// Check if any of the tasks exist // Check if any of the tasks exist
for (int i = 0; i < TaskCount; i++) {
if (Tasks[TaskList[i]] != nullptr)
for(int i=0; i<TaskCount; i++) { break;
if(Tasks[TaskList[i]] != nullptr) break;
} }
// FIXME: The 10 and 5 values in this calculation are to account for the string "ABCD" we are putting in 3 times.
//
// Calculate how big the packet needs to be pased on the number of tasks and the
// size of the variable length strings.
int PacketLength = sizeof(AvailableTaskHeader_Struct);
int ValidTasks = 0; int ValidTasks = 0;
for(int i=0; i<TaskCount; i++) { for (int i = 0; i < TaskCount; i++) {
if (!AppropriateLevel(TaskList[i], PlayerLevel))
if(!AppropriateLevel(TaskList[i], PlayerLevel)) continue; continue;
if (c->IsTaskActive(TaskList[i]))
if(c->IsTaskActive(TaskList[i])) continue; continue;
if (!IsTaskRepeatable(TaskList[i]) && c->IsTaskCompleted(TaskList[i]))
if(!IsTaskRepeatable(TaskList[i]) && c->IsTaskCompleted(TaskList[i])) continue; continue;
ValidTasks++; ValidTasks++;
PacketLength = PacketLength + sizeof(AvailableTaskData1_Struct) + Tasks[TaskList[i]]->Title.size() + 1 +
Tasks[TaskList[i]]->Description.size() + 1 + sizeof(AvailableTaskData2_Struct) + 10 +
sizeof(AvailableTaskTrailer_Struct) + 5;
} }
if(ValidTasks == 0) return; if (ValidTasks == 0)
return;
auto outapp = new EQApplicationPacket(OP_OpenNewTasksWindow, PacketLength); SerializeBuffer buf(50 * ValidTasks);
AvailableTaskHeader = (AvailableTaskHeader_Struct*)outapp->pBuffer;
AvailableTaskHeader->TaskCount = ValidTasks; buf.WriteUInt32(ValidTasks);
buf.WriteUInt32(2); // task type, live doesn't let you send more than one type, but we do?
buf.WriteUInt32(mob->GetID());
// unknown1 is always 2 in the packets I have ssen. It may be a 'Task Type'. Given that the for (int i = 0; i < TaskCount; i++) {
// task system was apparently first introduced for LDoN missions, type 1 may be for missions. if (!AppropriateLevel(TaskList[i], PlayerLevel))
// continue;
AvailableTaskHeader->unknown1 = 2; if (c->IsTaskActive(TaskList[i]))
AvailableTaskHeader->TaskGiver = mob->GetID(); continue;
if (!IsTaskRepeatable(TaskList[i]) && c->IsTaskCompleted(TaskList[i]))
continue;
Ptr = (char *) AvailableTaskHeader + sizeof(AvailableTaskHeader_Struct); buf.WriteUInt32(TaskList[i]); // TaskID
if (c->ClientVersion() != EQEmu::versions::ClientVersion::Titanium)
buf.WriteFloat(1.0f); // affects color, difficulty?
buf.WriteUInt32(Tasks[TaskList[i]]->Duration);
buf.WriteUInt32(static_cast<int>(Tasks[TaskList[i]]->dur_code));
for(int i=0; i<TaskCount;i++) { buf.WriteString(Tasks[TaskList[i]]->Title); // max 64 with null
buf.WriteString(Tasks[TaskList[i]]->Description); // max 4000 with null
if(!AppropriateLevel(TaskList[i], PlayerLevel)) continue; if (c->ClientVersion() != EQEmu::versions::ClientVersion::Titanium)
buf.WriteUInt8(0); // Has reward set flag
if(c->IsTaskActive(TaskList[i])) continue; buf.WriteUInt32(Tasks[TaskList[i]]->ActivityCount);
if(!IsTaskRepeatable(TaskList[i]) && c->IsTaskCompleted(TaskList[i])) continue; for (int j = 0; j < Tasks[TaskList[i]]->ActivityCount; ++j) {
buf.WriteUInt32(j); // ActivityNumber
auto &activity = Tasks[TaskList[i]]->Activity[j];
buf.WriteUInt32(activity.Type);
buf.WriteUInt32(0); // solo, group, raid?
buf.WriteString(activity.target_name); // max length 64, "target name" so like loot x foo from bar (this is bar)
AvailableTaskData1 = (AvailableTaskData1_Struct*)Ptr; buf.WriteString(activity.item_list); // max length 64 in these clients
AvailableTaskData1->TaskID = TaskList[i]; buf.WriteUInt32(activity.GoalCount);
AvailableTaskData1->TimeLimit = Tasks[TaskList[i]]->Duration; buf.WriteInt32(activity.skill_id);
buf.WriteInt32(activity.spell_id);
AvailableTaskData1->unknown2 = static_cast<int>(Tasks[TaskList[i]]->dur_code); // guess buf.WriteInt32(activity.ZoneID);
buf.WriteString(activity.desc_override);
Ptr = (char *)AvailableTaskData1 + sizeof(AvailableTaskData1_Struct); }
sprintf(Ptr, "%s", Tasks[TaskList[i]]->Title.c_str());
Ptr = Ptr + strlen(Ptr) + 1;
sprintf(Ptr, "%s", Tasks[TaskList[i]]->Description.c_str());
Ptr = Ptr + strlen(Ptr) + 1;
AvailableTaskData2 = (AvailableTaskData2_Struct*)Ptr;
AvailableTaskData2->unknown1 = 1;
AvailableTaskData2->unknown2 = 0;
AvailableTaskData2->unknown3 = 1;
AvailableTaskData2->unknown4 = 0;
Ptr = (char *)AvailableTaskData2 + sizeof(AvailableTaskData2_Struct);
// FIXME: In live packets, these two strings appear to be the same as the Text1 and Text2
// strings from the first activity in the task, however the task chooser/selector
// does not appear to make use of them.
sprintf(Ptr, "ABCD");
Ptr = Ptr + strlen(Ptr) + 1;
sprintf(Ptr, "ABCD");
Ptr = Ptr + strlen(Ptr) + 1;
AvailableTaskTrailer = (AvailableTaskTrailer_Struct*)Ptr;
// The name of this ItemCount field may be incorrect, but 1 works.
AvailableTaskTrailer->ItemCount = 1;
AvailableTaskTrailer->unknown1 = 0xFFFFFFFF;
AvailableTaskTrailer->unknown2 = 0xFFFFFFFF;
AvailableTaskTrailer->StartZone = Tasks[TaskList[i]]->StartZone;
Ptr = (char *)AvailableTaskTrailer + sizeof(AvailableTaskTrailer_Struct);
// In some packets, this next string looks like a short task summary, however it doesn't
// appear anywhere in the client window.
sprintf(Ptr, "ABCD");
Ptr = Ptr + strlen(Ptr) + 1;
} }
auto outapp = new EQApplicationPacket(OP_OpenNewTasksWindow, buf.buffer(), buf.length());
c->QueuePacket(outapp); c->QueuePacket(outapp);
safe_delete(outapp); safe_delete(outapp);
@ -1205,8 +1162,8 @@ void TaskManager::SendTaskSelectorNew(Client *c, Mob *mob, int TaskCount, int *T
buf.WriteUInt32(Tasks[TaskList[i]]->Duration); buf.WriteUInt32(Tasks[TaskList[i]]->Duration);
buf.WriteUInt32(static_cast<int>(Tasks[TaskList[i]]->dur_code)); // 1 = Short, 2 = Medium, 3 = Long, anything else Unlimited buf.WriteUInt32(static_cast<int>(Tasks[TaskList[i]]->dur_code)); // 1 = Short, 2 = Medium, 3 = Long, anything else Unlimited
buf.WriteString(Tasks[TaskList[i]]->Title.c_str()); // max 64 with null buf.WriteString(Tasks[TaskList[i]]->Title); // max 64 with null
buf.WriteString(Tasks[TaskList[i]]->Description.c_str()); // max 4000 with null buf.WriteString(Tasks[TaskList[i]]->Description); // max 4000 with null
buf.WriteUInt8(0); // Has reward set flag buf.WriteUInt8(0); // Has reward set flag
buf.WriteUInt32(Tasks[TaskList[i]]->ActivityCount); // ActivityCount buf.WriteUInt32(Tasks[TaskList[i]]->ActivityCount); // ActivityCount