From bf8f70342b2c638689d368385713bb6b6a02a810 Mon Sep 17 00:00:00 2001 From: Uleat Date: Fri, 9 Jan 2015 17:56:46 -0500 Subject: [PATCH] Added text link translators for OP_FormattedMessage --- changelog.txt | 3 ++ common/patches/rof.cpp | 62 +++++++++++++++++++++++++++++--- common/patches/rof2.cpp | 62 +++++++++++++++++++++++++++++--- common/patches/rof2_ops.h | 1 + common/patches/rof_ops.h | 1 + common/patches/sod.cpp | 62 +++++++++++++++++++++++++++++--- common/patches/sod_ops.h | 1 + common/patches/sof.cpp | 62 +++++++++++++++++++++++++++++--- common/patches/sof_ops.h | 1 + common/patches/titanium.cpp | 64 +++++++++++++++++++++++++++++++--- common/patches/titanium_ops.h | 1 + common/patches/underfoot.cpp | 62 +++++++++++++++++++++++++++++--- common/patches/underfoot_ops.h | 1 + 13 files changed, 358 insertions(+), 25 deletions(-) diff --git a/changelog.txt b/changelog.txt index 0091a7583..8d9ab0ff9 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,8 @@ EQEMu Changelog (Started on Sept 24, 2003 15:50) ------------------------------------------------------- +== 01/09/2015 == +Uleat: Added text link translators for OP_FormattedMessage + == 01/08/2015 == Trevius: Added some extra checks and clean-up related to Groups and Mercenaries. diff --git a/common/patches/rof.cpp b/common/patches/rof.cpp index f65302c36..d915ae808 100644 --- a/common/patches/rof.cpp +++ b/common/patches/rof.cpp @@ -840,6 +840,50 @@ namespace RoF FINISH_ENCODE(); } + ENCODE(OP_FormattedMessage) + { + EQApplicationPacket *in = *p; + *p = nullptr; + + FormattedMessage_Struct *emu = (FormattedMessage_Struct *)in->pBuffer; + + unsigned char *__emu_buffer = in->pBuffer; + + uint32 old_message_size = in->size - sizeof(FormattedMessage_Struct); + std::string old_message_array[9]; + + char *old_message_ptr = (char *)__emu_buffer + sizeof(FormattedMessage_Struct); + + for (int i = 0; i < 9; ++i) { + old_message_array[i] = old_message_ptr; + old_message_ptr += old_message_array[i].length() + 1; + } + + uint32 new_message_size = 0; + std::string new_message_array[9]; + + for (int i = 0; i < 9; ++i) { + ServerToRoFTextLink(new_message_array[i], old_message_array[i]); + new_message_size += (new_message_array[i].length() + 1); + } + + in->size = sizeof(FormattedMessage_Struct) + new_message_size + 1; + in->pBuffer = new unsigned char[in->size]; + + char *OutBuffer = (char *)in->pBuffer; + + VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, emu->unknown0); + VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, emu->string_id); + VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, emu->type); + + for (int i = 0; i < 9; ++i) { VARSTRUCT_ENCODE_STRING(OutBuffer, new_message_array[i].c_str()); } + + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, 0); + + delete[] __emu_buffer; + dest->FastQueuePacket(&in, ack_req); + } + ENCODE(OP_GMLastName) { ENCODE_LENGTH_EXACT(GMLastName_Struct); @@ -3119,10 +3163,11 @@ namespace RoF std::string old_message = &emu->message[strlen(emu->sayer)]; std::string new_message; + ServerToRoFTextLink(new_message, old_message); //in->size = 3 + 4 + 4 + strlen(emu->sayer) + 1 + 12 + new_message.length() + 1; - in->size = 25 + strlen(emu->sayer) + new_message.length(); + in->size = strlen(emu->sayer) + new_message.length() + 25; in->pBuffer = new unsigned char[in->size]; char *OutBuffer = (char *)in->pBuffer; @@ -3136,9 +3181,18 @@ namespace RoF VARSTRUCT_ENCODE_STRING(OutBuffer, emu->sayer); - VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, 0); - VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, 0); - VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, 0); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[0]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[1]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[2]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[3]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[4]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[5]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[6]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[7]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[8]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[9]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[10]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[11]); VARSTRUCT_ENCODE_STRING(OutBuffer, new_message.c_str()); diff --git a/common/patches/rof2.cpp b/common/patches/rof2.cpp index 03d919dd8..dc6c60603 100644 --- a/common/patches/rof2.cpp +++ b/common/patches/rof2.cpp @@ -906,6 +906,50 @@ namespace RoF2 FINISH_ENCODE(); } + ENCODE(OP_FormattedMessage) + { + EQApplicationPacket *in = *p; + *p = nullptr; + + FormattedMessage_Struct *emu = (FormattedMessage_Struct *)in->pBuffer; + + unsigned char *__emu_buffer = in->pBuffer; + + uint32 old_message_size = in->size - sizeof(FormattedMessage_Struct); + std::string old_message_array[9]; + + char *old_message_ptr = (char *)__emu_buffer + sizeof(FormattedMessage_Struct); + + for (int i = 0; i < 9; ++i) { + old_message_array[i] = old_message_ptr; + old_message_ptr += old_message_array[i].length() + 1; + } + + uint32 new_message_size = 0; + std::string new_message_array[9]; + + for (int i = 0; i < 9; ++i) { + ServerToRoF2TextLink(new_message_array[i], old_message_array[i]); + new_message_size += (new_message_array[i].length() + 1); + } + + in->size = sizeof(FormattedMessage_Struct) + new_message_size + 1; + in->pBuffer = new unsigned char[in->size]; + + char *OutBuffer = (char *)in->pBuffer; + + VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, emu->unknown0); + VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, emu->string_id); + VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, emu->type); + + for (int i = 0; i < 9; ++i) { VARSTRUCT_ENCODE_STRING(OutBuffer, new_message_array[i].c_str()); } + + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, 0); + + delete[] __emu_buffer; + dest->FastQueuePacket(&in, ack_req); + } + ENCODE(OP_GMLastName) { ENCODE_LENGTH_EXACT(GMLastName_Struct); @@ -3185,10 +3229,11 @@ namespace RoF2 std::string old_message = &emu->message[strlen(emu->sayer)]; std::string new_message; + ServerToRoF2TextLink(new_message, old_message); //in->size = 3 + 4 + 4 + strlen(emu->sayer) + 1 + 12 + new_message.length() + 1; - in->size = 25 + strlen(emu->sayer) + new_message.length(); + in->size = strlen(emu->sayer) + new_message.length() + 25; in->pBuffer = new unsigned char[in->size]; char *OutBuffer = (char *)in->pBuffer; @@ -3202,9 +3247,18 @@ namespace RoF2 VARSTRUCT_ENCODE_STRING(OutBuffer, emu->sayer); - VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, 0); - VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, 0); - VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, 0); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[0]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[1]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[2]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[3]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[4]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[5]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[6]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[7]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[8]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[9]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[10]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[11]); VARSTRUCT_ENCODE_STRING(OutBuffer, new_message.c_str()); diff --git a/common/patches/rof2_ops.h b/common/patches/rof2_ops.h index 66b86d756..7b4e6b7d4 100644 --- a/common/patches/rof2_ops.h +++ b/common/patches/rof2_ops.h @@ -43,6 +43,7 @@ E(OP_DzJoinExpeditionConfirm) E(OP_DzLeaderStatus) E(OP_DzMemberList) E(OP_ExpansionInfo) +E(OP_FormattedMessage) E(OP_GMLastName) E(OP_GMTrainSkillConfirm) E(OP_GroundSpawn) diff --git a/common/patches/rof_ops.h b/common/patches/rof_ops.h index ef97dda99..8ce23e94a 100644 --- a/common/patches/rof_ops.h +++ b/common/patches/rof_ops.h @@ -32,6 +32,7 @@ E(OP_DzJoinExpeditionConfirm) E(OP_DzLeaderStatus) E(OP_DzMemberList) E(OP_ExpansionInfo) +E(OP_FormattedMessage) E(OP_GMLastName) E(OP_GMTrainSkillConfirm) E(OP_GroundSpawn) diff --git a/common/patches/sod.cpp b/common/patches/sod.cpp index 6982290c8..00ae9b3eb 100644 --- a/common/patches/sod.cpp +++ b/common/patches/sod.cpp @@ -609,6 +609,50 @@ namespace SoD FINISH_ENCODE(); } + ENCODE(OP_FormattedMessage) + { + EQApplicationPacket *in = *p; + *p = nullptr; + + FormattedMessage_Struct *emu = (FormattedMessage_Struct *)in->pBuffer; + + unsigned char *__emu_buffer = in->pBuffer; + + uint32 old_message_size = in->size - sizeof(FormattedMessage_Struct); + std::string old_message_array[9]; + + char *old_message_ptr = (char *)__emu_buffer + sizeof(FormattedMessage_Struct); + + for (int i = 0; i < 9; ++i) { + old_message_array[i] = old_message_ptr; + old_message_ptr += old_message_array[i].length() + 1; + } + + uint32 new_message_size = 0; + std::string new_message_array[9]; + + for (int i = 0; i < 9; ++i) { + ServerToSoDTextLink(new_message_array[i], old_message_array[i]); + new_message_size += (new_message_array[i].length() + 1); + } + + in->size = sizeof(FormattedMessage_Struct) + new_message_size + 1; + in->pBuffer = new unsigned char[in->size]; + + char *OutBuffer = (char *)in->pBuffer; + + VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, emu->unknown0); + VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, emu->string_id); + VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, emu->type); + + for (int i = 0; i < 9; ++i) { VARSTRUCT_ENCODE_STRING(OutBuffer, new_message_array[i].c_str()); } + + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, 0); + + delete[] __emu_buffer; + dest->FastQueuePacket(&in, ack_req); + } + ENCODE(OP_GroundSpawn) { ENCODE_LENGTH_EXACT(Object_Struct); @@ -2009,10 +2053,11 @@ namespace SoD std::string old_message = &emu->message[strlen(emu->sayer)]; std::string new_message; + ServerToSoDTextLink(new_message, old_message); //in->size = 3 + 4 + 4 + strlen(emu->sayer) + 1 + 12 + new_message.length() + 1; - in->size = 25 + strlen(emu->sayer) + new_message.length(); + in->size = strlen(emu->sayer) + new_message.length() + 25; in->pBuffer = new unsigned char[in->size]; char *OutBuffer = (char *)in->pBuffer; @@ -2026,9 +2071,18 @@ namespace SoD VARSTRUCT_ENCODE_STRING(OutBuffer, emu->sayer); - VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, 0); - VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, 0); - VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, 0); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[0]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[1]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[2]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[3]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[4]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[5]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[6]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[7]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[8]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[9]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[10]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[11]); VARSTRUCT_ENCODE_STRING(OutBuffer, new_message.c_str()); diff --git a/common/patches/sod_ops.h b/common/patches/sod_ops.h index 0a0a8a4d5..1eda944d0 100644 --- a/common/patches/sod_ops.h +++ b/common/patches/sod_ops.h @@ -23,6 +23,7 @@ E(OP_DzJoinExpeditionConfirm) E(OP_DzLeaderStatus) E(OP_DzMemberList) E(OP_ExpansionInfo) +E(OP_FormattedMessage) E(OP_GroundSpawn) E(OP_GroupCancelInvite) E(OP_GroupFollow) diff --git a/common/patches/sof.cpp b/common/patches/sof.cpp index 8405f9def..c503e2c5f 100644 --- a/common/patches/sof.cpp +++ b/common/patches/sof.cpp @@ -596,6 +596,50 @@ namespace SoF FINISH_ENCODE(); } + ENCODE(OP_FormattedMessage) + { + EQApplicationPacket *in = *p; + *p = nullptr; + + FormattedMessage_Struct *emu = (FormattedMessage_Struct *)in->pBuffer; + + unsigned char *__emu_buffer = in->pBuffer; + + uint32 old_message_size = in->size - sizeof(FormattedMessage_Struct); + std::string old_message_array[9]; + + char *old_message_ptr = (char *)__emu_buffer + sizeof(FormattedMessage_Struct); + + for (int i = 0; i < 9; ++i) { + old_message_array[i] = old_message_ptr; + old_message_ptr += old_message_array[i].length() + 1; + } + + uint32 new_message_size = 0; + std::string new_message_array[9]; + + for (int i = 0; i < 9; ++i) { + ServerToSoFTextLink(new_message_array[i], old_message_array[i]); + new_message_size += (new_message_array[i].length() + 1); + } + + in->size = sizeof(FormattedMessage_Struct) + new_message_size + 1; + in->pBuffer = new unsigned char[in->size]; + + char *OutBuffer = (char *)in->pBuffer; + + VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, emu->unknown0); + VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, emu->string_id); + VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, emu->type); + + for (int i = 0; i < 9; ++i) { VARSTRUCT_ENCODE_STRING(OutBuffer, new_message_array[i].c_str()); } + + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, 0); + + delete[] __emu_buffer; + dest->FastQueuePacket(&in, ack_req); + } + ENCODE(OP_GroundSpawn) { ENCODE_LENGTH_EXACT(Object_Struct); @@ -1655,10 +1699,11 @@ namespace SoF std::string old_message = &emu->message[strlen(emu->sayer)]; std::string new_message; + ServerToSoFTextLink(new_message, old_message); //in->size = 3 + 4 + 4 + strlen(emu->sayer) + 1 + 12 + new_message.length() + 1; - in->size = 25 + strlen(emu->sayer) + new_message.length(); + in->size = strlen(emu->sayer) + new_message.length() + 25; in->pBuffer = new unsigned char[in->size]; char *OutBuffer = (char *)in->pBuffer; @@ -1672,9 +1717,18 @@ namespace SoF VARSTRUCT_ENCODE_STRING(OutBuffer, emu->sayer); - VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, 0); - VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, 0); - VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, 0); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[0]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[1]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[2]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[3]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[4]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[5]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[6]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[7]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[8]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[9]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[10]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[11]); VARSTRUCT_ENCODE_STRING(OutBuffer, new_message.c_str()); diff --git a/common/patches/sof_ops.h b/common/patches/sof_ops.h index 9cfd400e3..df58cffa8 100644 --- a/common/patches/sof_ops.h +++ b/common/patches/sof_ops.h @@ -24,6 +24,7 @@ E(OP_DzJoinExpeditionConfirm) E(OP_DzLeaderStatus) E(OP_DzMemberList) E(OP_ExpansionInfo) +E(OP_FormattedMessage) E(OP_GroundSpawn) E(OP_GuildMemberList) E(OP_Illusion) diff --git a/common/patches/titanium.cpp b/common/patches/titanium.cpp index f40c0266c..97be94693 100644 --- a/common/patches/titanium.cpp +++ b/common/patches/titanium.cpp @@ -455,6 +455,50 @@ namespace Titanium FINISH_ENCODE(); } + ENCODE(OP_FormattedMessage) + { + EQApplicationPacket *in = *p; + *p = nullptr; + + FormattedMessage_Struct *emu = (FormattedMessage_Struct *)in->pBuffer; + + unsigned char *__emu_buffer = in->pBuffer; + + uint32 old_message_size = in->size - sizeof(FormattedMessage_Struct); + std::string old_message_array[9]; + + char *old_message_ptr = (char *)__emu_buffer + sizeof(FormattedMessage_Struct); + + for (int i = 0; i < 9; ++i) { + old_message_array[i] = old_message_ptr; + old_message_ptr += old_message_array[i].length() + 1; + } + + uint32 new_message_size = 0; + std::string new_message_array[9]; + + for (int i = 0; i < 9; ++i) { + ServerToTitaniumTextLink(new_message_array[i], old_message_array[i]); + new_message_size += (new_message_array[i].length() + 1); + } + + in->size = sizeof(FormattedMessage_Struct) + new_message_size + 1; + in->pBuffer = new unsigned char[in->size]; + + char *OutBuffer = (char *)in->pBuffer; + + VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, emu->unknown0); + VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, emu->string_id); + VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, emu->type); + + for (int i = 0; i < 9; ++i) { VARSTRUCT_ENCODE_STRING(OutBuffer, new_message_array[i].c_str()); } + + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, 0); + + delete[] __emu_buffer; + dest->FastQueuePacket(&in, ack_req); + } + ENCODE(OP_GuildMemberList) { //consume the packet @@ -1117,10 +1161,11 @@ namespace Titanium std::string old_message = &emu->message[strlen(emu->sayer)]; std::string new_message; + ServerToTitaniumTextLink(new_message, old_message); //in->size = 3 + 4 + 4 + strlen(emu->sayer) + 1 + 12 + new_message.length() + 1; - in->size = 25 + strlen(emu->sayer) + new_message.length(); + in->size = strlen(emu->sayer) + new_message.length() + 25; in->pBuffer = new unsigned char[in->size]; char *OutBuffer = (char *)in->pBuffer; @@ -1134,12 +1179,21 @@ namespace Titanium VARSTRUCT_ENCODE_STRING(OutBuffer, emu->sayer); - VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, 0); - VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, 0); - VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, 0); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[0]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[1]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[2]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[3]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[4]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[5]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[6]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[7]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[8]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[9]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[10]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[11]); VARSTRUCT_ENCODE_STRING(OutBuffer, new_message.c_str()); - + delete[] __emu_buffer; dest->FastQueuePacket(&in, ack_req); } diff --git a/common/patches/titanium_ops.h b/common/patches/titanium_ops.h index 4ddcae630..ad3723ab6 100644 --- a/common/patches/titanium_ops.h +++ b/common/patches/titanium_ops.h @@ -16,6 +16,7 @@ E(OP_DzExpeditionList) E(OP_DzJoinExpeditionConfirm) E(OP_DzLeaderStatus) E(OP_DzMemberList) +E(OP_FormattedMessage) E(OP_GuildMemberLevelUpdate) E(OP_GuildMemberList) E(OP_Illusion) diff --git a/common/patches/underfoot.cpp b/common/patches/underfoot.cpp index 1ebd8dc8d..e6c081823 100644 --- a/common/patches/underfoot.cpp +++ b/common/patches/underfoot.cpp @@ -753,6 +753,50 @@ namespace Underfoot FINISH_ENCODE(); } + ENCODE(OP_FormattedMessage) + { + EQApplicationPacket *in = *p; + *p = nullptr; + + FormattedMessage_Struct *emu = (FormattedMessage_Struct *)in->pBuffer; + + unsigned char *__emu_buffer = in->pBuffer; + + uint32 old_message_size = in->size - sizeof(FormattedMessage_Struct); + std::string old_message_array[9]; + + char *old_message_ptr = (char *)__emu_buffer + sizeof(FormattedMessage_Struct); + + for (int i = 0; i < 9; ++i) { + old_message_array[i] = old_message_ptr; + old_message_ptr += old_message_array[i].length() + 1; + } + + uint32 new_message_size = 0; + std::string new_message_array[9]; + + for (int i = 0; i < 9; ++i) { + ServerToUnderfootTextLink(new_message_array[i], old_message_array[i]); + new_message_size += (new_message_array[i].length() + 1); + } + + in->size = sizeof(FormattedMessage_Struct) + new_message_size + 1; + in->pBuffer = new unsigned char[in->size]; + + char *OutBuffer = (char *)in->pBuffer; + + VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, emu->unknown0); + VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, emu->string_id); + VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, emu->type); + + for (int i = 0; i < 9; ++i) { VARSTRUCT_ENCODE_STRING(OutBuffer, new_message_array[i].c_str()); } + + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, 0); + + delete[] __emu_buffer; + dest->FastQueuePacket(&in, ack_req); + } + ENCODE(OP_GroundSpawn) { // We are not encoding the spawn_id field here, or a size but it doesn't appear to matter. @@ -2320,10 +2364,11 @@ namespace Underfoot std::string old_message = &emu->message[strlen(emu->sayer)]; std::string new_message; + ServerToUnderfootTextLink(new_message, old_message); //in->size = 3 + 4 + 4 + strlen(emu->sayer) + 1 + 12 + new_message.length() + 1; - in->size = 25 + strlen(emu->sayer) + new_message.length(); + in->size = strlen(emu->sayer) + new_message.length() + 25; in->pBuffer = new unsigned char[in->size]; char *OutBuffer = (char *)in->pBuffer; @@ -2337,9 +2382,18 @@ namespace Underfoot VARSTRUCT_ENCODE_STRING(OutBuffer, emu->sayer); - VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, 0); - VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, 0); - VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, 0); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[0]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[1]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[2]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[3]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[4]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[5]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[6]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[7]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[8]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[9]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[10]); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, emu->unknown12[11]); VARSTRUCT_ENCODE_STRING(OutBuffer, new_message.c_str()); diff --git a/common/patches/underfoot_ops.h b/common/patches/underfoot_ops.h index 61f4f1c0f..2f0f8ba94 100644 --- a/common/patches/underfoot_ops.h +++ b/common/patches/underfoot_ops.h @@ -26,6 +26,7 @@ E(OP_DzJoinExpeditionConfirm) E(OP_DzLeaderStatus) E(OP_DzMemberList) E(OP_ExpansionInfo) +E(OP_FormattedMessage) E(OP_GroundSpawn) E(OP_GroupCancelInvite) E(OP_GroupFollow)