mirror of
https://github.com/EQEmu/Server.git
synced 2026-04-15 21:12:25 +00:00
Fix up OP_OpenNewTasksWindow for older clients
This commit is contained in:
parent
6d60f619c0
commit
a7c1fad213
@ -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.
|
||||||
|
|||||||
@ -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.
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
141
zone/tasks.cpp
141
zone/tasks.cpp
@ -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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user