From ffc912b2f68fe76ca637ecf3376f1326bf4dbce8 Mon Sep 17 00:00:00 2001 From: dannuic Date: Thu, 23 Apr 2026 23:07:18 -0600 Subject: [PATCH] Validated channel messages --- common/patches/tob.cpp | 18 +++++++++++------- tob/opcodes.md | 2 +- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/common/patches/tob.cpp b/common/patches/tob.cpp index 39e5c5efc..2b781032c 100644 --- a/common/patches/tob.cpp +++ b/common/patches/tob.cpp @@ -389,8 +389,7 @@ namespace TOB VARSTRUCT_ENCODE_STRING(OutBuffer, emu->sender); VARSTRUCT_ENCODE_STRING(OutBuffer, emu->targetname); - VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, 0); // Unknown - VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, 0); // Unknown + VARSTRUCT_ENCODE_TYPE(uint64, OutBuffer, 0); // Unknown VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, emu->language); VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, emu->chan_num); VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, 0); // Unknown @@ -398,11 +397,13 @@ namespace TOB VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, emu->skill_in_language); VARSTRUCT_ENCODE_STRING(OutBuffer, new_message.c_str()); - VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, 0); // Unknown - VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, 0); // Unknown - VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, 0); // Unknown - VARSTRUCT_ENCODE_TYPE(uint16, OutBuffer, 0); // Unknown - VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, 0); // Unknown + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, 0); // Unknown + VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, 0);// Unknown + VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, 0);// Unknown + + VARSTRUCT_ENCODE_STRING(OutBuffer, ""); + VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, 0); // Unknown + VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, 0);// Unknown delete[] __emu_buffer; dest->FastQueuePacket(&in, ack_req); @@ -3640,10 +3641,13 @@ namespace TOB uint32 Skill = VARSTRUCT_DECODE_TYPE(uint32, InBuffer); + // this has a size limit of 11k in the client std::string old_message = InBuffer; std::string new_message; TOBToServerConvertLinks(new_message, old_message); + // there are 15 bytes after this, part of which is an unk string, check the ENCODE for the layout + __packet->size = sizeof(ChannelMessage_Struct) + new_message.length() + 1; __packet->pBuffer = new unsigned char[__packet->size]; ChannelMessage_Struct* emu = (ChannelMessage_Struct*)__packet->pBuffer; diff --git a/tob/opcodes.md b/tob/opcodes.md index 62db50a03..9c60dc50d 100644 --- a/tob/opcodes.md +++ b/tob/opcodes.md @@ -81,7 +81,7 @@ Below is a status list for the 450 opcodes we currently use on the server for th | `OP_CashReward` | 🟡 Unverified | | | | `OP_CastSpell` | 🟢 Verified | | | | `OP_ChangeSize` | 🟢 Verified | | | -| `OP_ChannelMessage` | 🟡 Unverified | | | +| `OP_ChannelMessage` | 🟢 Verified | | | | `OP_ChangePetName` | 🔴 Not-Set | | | | `OP_CharacterCreate` | 🟢 Verified | Sends heroic type, can be used for something? | | | `OP_CharacterCreateRequest` | 🟢 Verified | | |