From 974dbcd6ff5afca0497a4230967b8b94caf120e4 Mon Sep 17 00:00:00 2001 From: dannuic Date: Wed, 17 Jun 2026 22:22:09 -0600 Subject: [PATCH] Found and added task packets (#5101) --- .gitignore | 3 + common/base_packet.h | 8 + common/patches/tob.cpp | 410 ++++++++++++++++++ common/patches/tob_ops.h | 6 + common/patches/tob_structs.h | 80 ++++ tob/opcodes.md | 46 +- .../EQExtractor2/patch_April15-2013.conf | 2 +- .../EQExtractor2/patch_Aug04-2011.conf | 2 +- .../EQExtractor2/patch_August15-2012.conf | 2 +- .../EQExtractor2/patch_Dec10-2012.conf | 2 +- .../EQExtractor2/patch_Dec7-2010.conf | 2 +- .../EQExtractor2/patch_Feb11-2013.conf | 2 +- .../EQExtractor2/patch_Feb8-2011.conf | 2 +- .../EQExtractor2/patch_Jan16-2013.conf | 2 +- .../EQExtractor2/patch_July13-2012.conf | 2 +- .../EQExtractor2/patch_June25-2012.conf | 2 +- .../EQExtractor2/patch_Mar13-2013.conf | 2 +- .../EQExtractor2/patch_Mar15-2012.conf | 2 +- .../EQExtractor2/patch_March15-2011.conf | 2 +- .../EQExtractor2/patch_May12-2010.conf | 2 +- .../EQExtractor2/patch_May12-2011.conf | 2 +- .../EQExtractor2/patch_Nov17-2011.conf | 2 +- .../EQExtractor2/patch_Sep01-2010.conf | 2 +- .../EQExtractor2/patch_Sep22-2010.conf | 2 +- .../EQExtractor2/EQExtractor2/patch_SoD.conf | 2 +- .../patch_TestServer-Feb5-2013.conf | 2 +- .../patch_TestServer-Jan16-2013.conf | 2 +- utils/patches/opcodes.conf | 4 +- utils/patches/patch_RoF.conf | 2 +- utils/patches/patch_RoF2.conf | 2 +- utils/patches/patch_SoD.conf | 2 +- utils/patches/patch_SoF.conf | 2 +- utils/patches/patch_TOB.conf | 48 +- utils/patches/patch_Titanium.conf | 2 +- utils/patches/patch_UF.conf | 2 +- utils/scripts/opcode_scripts/opcodelist.txt | 2 +- utils/scripts/opcode_scripts/patch_NEW.conf | 2 +- utils/scripts/opcode_scripts/patch_OLD.conf | 2 +- 38 files changed, 586 insertions(+), 79 deletions(-) diff --git a/.gitignore b/.gitignore index 627d3c630..cefc293a2 100644 --- a/.gitignore +++ b/.gitignore @@ -69,3 +69,6 @@ compile_flags.txt # CMake Files cmake-build-relwithdebinfo/* skill-caps.diff + +# Analysis files +tob/packet_analysis diff --git a/common/base_packet.h b/common/base_packet.h index 94d8b7df4..edb72fa80 100644 --- a/common/base_packet.h +++ b/common/base_packet.h @@ -74,10 +74,18 @@ public: uint8 ReadUInt8() { uint8 value = *(uint8 *)(pBuffer + _rpos); _rpos += sizeof(uint8); return value; } uint8 ReadUInt8(uint32 Offset) const { uint8 value = *(uint8 *)(pBuffer + Offset); return value; } + int8 ReadSInt8() { int8 value = *(int8 *)(pBuffer + _rpos); _rpos += sizeof(int8); return value; } + int8 ReadSint8(uint32 Offset) const { int8 value = *(int8 *)(pBuffer + Offset); return value; } uint16 ReadUInt16() { uint16 value = *(uint16 *)(pBuffer + _rpos); _rpos += sizeof(uint16); return value; } uint16 ReadUInt16(uint32 Offset) const { uint16 value = *(uint16 *)(pBuffer + Offset); return value; } + int16 ReadSInt16() { int16 value = *(int16 *)(pBuffer + _rpos); _rpos += sizeof(int16); return value; } + int16 ReadSInt16(uint32 Offset) const { int16 value = *(int16 *)(pBuffer + Offset); return value; } uint32 ReadUInt32() { uint32 value = *(uint32 *)(pBuffer + _rpos); _rpos += sizeof(uint32); return value; } uint32 ReadUInt32(uint32 Offset) const { uint32 value = *(uint32 *)(pBuffer + Offset); return value; } + int32 ReadSInt32() { int32 value = *(int32 *)(pBuffer + _rpos); _rpos += sizeof(int32); return value; } + int32 ReadSint32(uint32 Offset) const { int32 value = *(int32 *)(pBuffer + Offset); return value; } + float ReadFloat() { float value = *(float *)(pBuffer + _rpos); _rpos += sizeof(float); return value; } + float ReadFloat(uint32 Offset) const { float value = *(float *)(pBuffer + Offset); return value; } void ReadString(char *str) { uint32 len = static_cast(strlen((char *)(pBuffer + _rpos))) + 1; memcpy(str, pBuffer + _rpos, len); _rpos += len; } void ReadString(std::string &str) { str = reinterpret_cast(pBuffer + _rpos); _rpos += str.length() + 1; } void ReadString(char *str, uint32 Offset, uint32 MaxLength) const; diff --git a/common/patches/tob.cpp b/common/patches/tob.cpp index efd1030fb..3a035b08b 100644 --- a/common/patches/tob.cpp +++ b/common/patches/tob.cpp @@ -3164,6 +3164,416 @@ namespace TOB FINISH_ENCODE(); } + ENCODE(OP_CompletedTasks) + { + EQApplicationPacket *in = *p; + *p = nullptr; + + uint32 count = in->ReadUInt32(); + uint32 out_size = sizeof(uint32); // count + + std::vector tasks; + tasks.reserve(count); + for (uint32 i = 0; i < count; ++i) { + structs::CompletedTask_Struct task; + task.task_id = in->ReadUInt32(); + out_size += sizeof(task.task_id); + in->ReadString(task.title); + out_size += task.title.size() + 1; + task.completed_time = in->ReadUInt32(); + out_size += sizeof(uint64); // zero-extended to uint64 + tasks.emplace_back(std::move(task)); + } + + SerializeBuffer buf(out_size); + buf.WriteUInt32(count); + for (const auto& task : tasks) { + buf.WriteUInt32(task.task_id); + buf.WriteString(task.title); + buf.WriteUInt64(static_cast(task.completed_time)); + } + + uchar *emu_buffer = in->pBuffer; + in->size = buf.size(); + in->pBuffer = new uint8[buf.size()]; + memcpy(in->pBuffer, buf.buffer(), buf.size()); + delete[] emu_buffer; + dest->FastQueuePacket(&in, ack_req); + } + + ENCODE(OP_TaskActivity) + { + EQApplicationPacket *in = *p; + *p = nullptr; + + // Short (25-byte) and reset (activity_type==0) packets are format-compatible + if (in->size <= 25) { + dest->FastQueuePacket(&in, ack_req); + return; + } + + structs::TaskActivity_Struct task; + task.task_slot_index = in->ReadUInt32(); + task.task_type = in->ReadUInt32(); + task.task_id = in->ReadUInt32(); + task.activity_id = in->ReadUInt32(); + task.list_group = in->ReadUInt32(); + task.activity_type = in->ReadSInt32(); + task.optional_byte = in->ReadUInt8(); + in->SetReadPosition(in->GetReadPosition() + sizeof(int32)); // skip request_type + in->ReadString(task.target_name); + in->ReadLengthString(task.item_list); + task.goal_count = in->ReadUInt32(); + in->ReadLengthString(task.skill_list); + in->ReadLengthString(task.spell_list); + in->ReadString(task.zones); // null-terminated in RoF+; TOB expects length-prefixed + task.dz_switch_id = in->ReadUInt32(); + in->ReadString(task.description_override); + task.done_count = in->ReadUInt32(); + task.flag = in->ReadUInt8(); + in->ReadString(task.zones2); + + uint32 out_size = 5 * sizeof(uint32) // task_slot_index..list_group + + sizeof(int32) // activity_type + + sizeof(uint8) // optional_byte + + task.target_name.size() + 1 + + sizeof(uint32) + task.item_list.size() + + sizeof(uint32) // goal_count + + sizeof(uint32) + task.skill_list.size() + + sizeof(uint32) + task.spell_list.size() + + sizeof(uint32) + task.zones.size() // length-prefixed + + 1 // empty string (new TOB field) + + sizeof(uint32) // dz_switch_id + + task.description_override.size() + 1 + + sizeof(uint32) // done_count + + sizeof(uint8) // flag + + task.zones2.size() + 1; + + SerializeBuffer buf(out_size); + buf.WriteUInt32(task.task_slot_index); + buf.WriteUInt32(task.task_type); + buf.WriteUInt32(task.task_id); + buf.WriteUInt32(task.activity_id); + buf.WriteUInt32(task.list_group); + buf.WriteInt32(task.activity_type); + buf.WriteUInt8(task.optional_byte); + buf.WriteString(task.target_name); + buf.WriteLengthString(task.item_list); + buf.WriteUInt32(task.goal_count); + buf.WriteLengthString(task.skill_list); + buf.WriteLengthString(task.spell_list); + buf.WriteLengthString(task.zones); // converted null-term → length-prefixed + buf.WriteString(""); // new TOB field + buf.WriteUInt32(task.dz_switch_id); + buf.WriteString(task.description_override); + buf.WriteUInt32(task.done_count); + buf.WriteUInt8(task.flag); + buf.WriteString(task.zones2); + + uchar *emu_buffer = in->pBuffer; + in->size = buf.size(); + in->pBuffer = new uint8[buf.size()]; + memcpy(in->pBuffer, buf.buffer(), buf.size()); + delete[] emu_buffer; + dest->FastQueuePacket(&in, ack_req); + } + + ENCODE(OP_TaskDescription) + { + EQApplicationPacket *in = *p; + *p = nullptr; + + structs::TaskDescription_Struct task; + task.sequence_number = in->ReadUInt32(); + task.task_id = in->ReadUInt32(); + task.open_window = in->ReadUInt8(); + task.task_type = in->ReadUInt32(); + task.reward_type = in->ReadUInt32(); + in->ReadString(task.title); + task.duration = in->ReadUInt32(); + in->SetReadPosition(in->GetReadPosition() + sizeof(uint32)); // skip dur_code (not in TOB wire format) + task.start_time = in->ReadUInt32(); + in->ReadString(task.description); + task.has_rewards = in->ReadUInt8(); + task.coin_reward = in->ReadUInt32(); + task.xp_reward = in->ReadUInt32(); + task.faction_reward = in->ReadUInt32(); + in->ReadString(task.reward_text); + in->ReadString(task.item_link); + task.points = in->ReadUInt32(); + task.has_reward_selection = in->ReadUInt8(); + + std::string new_item_link; + ServerToTOBConvertLinks(new_item_link, task.item_link); + + uint32 out_size = sizeof(uint32) + sizeof(uint32) + sizeof(uint8) + sizeof(uint32) + sizeof(uint32) // header + + sizeof(uint32) + task.title.size() // length-prefixed title + + sizeof(uint32) + sizeof(uint32) // duration, start_time + + sizeof(uint32) + task.description.size() // length-prefixed description + + sizeof(uint8) // has_rewards + + sizeof(uint8) // has_reward_selection + + 4 * sizeof(uint32) // player_levels + + sizeof(uint32) + task.reward_text.size(); // length-prefixed reward_text + + if (task.has_rewards) { + out_size += sizeof(uint32) // coin_reward + + sizeof(uint8) // xp_reward as flag + + sizeof(uint32) // faction_reward + + sizeof(uint32) // new unknown field + + sizeof(uint32) + new_item_link.size() // length-prefixed item_link + + sizeof(uint32); // points + } + + SerializeBuffer buf(out_size); + buf.WriteUInt32(task.sequence_number); + buf.WriteUInt32(task.task_id); + buf.WriteUInt8(task.open_window); + buf.WriteUInt32(task.task_type); + buf.WriteUInt32(task.reward_type); + buf.WriteLengthString(task.title); + buf.WriteUInt32(task.duration); + buf.WriteUInt32(task.start_time); + buf.WriteLengthString(task.description); + buf.WriteUInt8(task.has_rewards); + if (task.has_rewards) { + buf.WriteUInt32(task.coin_reward); + buf.WriteUInt8(task.xp_reward > 0 ? 1 : 0); + buf.WriteUInt32(task.faction_reward); + buf.WriteUInt32(0); // new field, no emu equivalent + buf.WriteLengthString(new_item_link); + buf.WriteUInt32(task.points); + } + buf.WriteUInt8(task.has_reward_selection); + buf.WriteUInt32(0); // player_level1 + buf.WriteUInt32(0); // player_level2 + buf.WriteUInt32(0); // player_level3 + buf.WriteUInt32(0); // player_level4 + buf.WriteLengthString(task.reward_text); + + uchar *emu_buffer = in->pBuffer; + in->size = buf.size(); + in->pBuffer = new uint8[buf.size()]; + memcpy(in->pBuffer, buf.buffer(), buf.size()); + delete[] emu_buffer; + dest->FastQueuePacket(&in, ack_req); + } + + ENCODE(OP_TaskHistoryReply) + { + EQApplicationPacket *in = *p; + *p = nullptr; + + in->SetReadPosition(0); + uint32 TaskIndex = in->ReadUInt32(); + uint32 ActivityCount = in->ReadUInt32(); + if (ActivityCount > 20) + ActivityCount = 20; + + struct Act { + uint32 type; + std::string target_name; + std::string item_list; + uint32 goal_count; + uint32 unknown04; + uint32 unknown08; + uint32 zone_id; + uint32 unknown16; + std::string desc; + }; + + std::vector acts; + acts.reserve(ActivityCount); + + for (uint32 i = 0; i < ActivityCount; ++i) { + Act a; + a.type = in->ReadUInt32(); + while (uint8 c = in->ReadUInt8()) a.target_name += c; + while (uint8 c = in->ReadUInt8()) a.item_list += c; + a.goal_count = in->ReadUInt32(); + a.unknown04 = in->ReadUInt32(); + a.unknown08 = in->ReadUInt32(); + a.zone_id = in->ReadUInt32(); + a.unknown16 = in->ReadUInt32(); + while (uint8 c = in->ReadUInt8()) a.desc += c; + acts.push_back(std::move(a)); + } + + // TOB wire format per activity (sub_1401841E0 @ 0x1401841E0): + // wire[1] uint32 ActivityType → act-1 + // wire[2] null-term target_name → act+0 (max 63 stored) + // wire[3] uint32 (CSB) GoalCount assumed → act+340 // TODO: confirm field order via live capture + // wire[4] uint32 (direct) ZoneID assumed → act+48 // TODO: confirm field order via live capture + // wire[5] uint32 (CSB) unknown → act+348 // TODO: identify field + // wire[6] uint32 (CSB) unknown → act+356 // TODO: identify field + // wire[7] null-term item_list → act+364 (CXStr, max 1023) + // wire[8] null-term unknown → act+64 // TODO: identify field; sending empty + // wire[9] uint32 (direct) unknown → act+51 // TODO: identify field + // wire[10] null-term description_override assumed → act+208 (max 127) // TODO: confirm + // wire[11] null-term unknown → act+128 // TODO: identify field; sending empty + uint32 OutSize = 8; + for (const auto& a : acts) { + OutSize += 4; // wire[1]: ActivityType + OutSize += a.target_name.size() + 1; // wire[2]: target_name + OutSize += 16; // wire[3-6]: 4x uint32 + OutSize += a.item_list.size() + 1; // wire[7]: item_list + OutSize += 1; // wire[8]: empty string + OutSize += 4; // wire[9]: uint32 + OutSize += a.desc.size() + 1; // wire[10]: description_override + OutSize += 1; // wire[11]: empty string + } + + auto outapp = new EQApplicationPacket(OP_TaskHistoryReply, OutSize); + outapp->WriteUInt32(TaskIndex); + outapp->WriteUInt32(static_cast(acts.size())); + + for (const auto& a : acts) { + outapp->WriteUInt32(a.type); // wire[1] + for (char c : a.target_name) outapp->WriteUInt8(c); + outapp->WriteUInt8(0); // wire[2] + outapp->WriteUInt32(a.goal_count); // wire[3] TODO: confirm order + outapp->WriteUInt32(a.zone_id); // wire[4] TODO: confirm order + outapp->WriteUInt32(0); // wire[5] TODO: identify + outapp->WriteUInt32(0); // wire[6] TODO: identify + for (char c : a.item_list) outapp->WriteUInt8(c); + outapp->WriteUInt8(0); // wire[7] + outapp->WriteUInt8(0); // wire[8] TODO: identify; sending empty + outapp->WriteUInt32(0); // wire[9] TODO: identify + for (char c : a.desc) outapp->WriteUInt8(c); + outapp->WriteUInt8(0); // wire[10] TODO: confirm desc here + outapp->WriteUInt8(0); // wire[11] TODO: identify; sending empty + } + + delete in; + dest->FastQueuePacket(&outapp, ack_req); + } + + ENCODE(OP_TaskSelectWindow) + { + EQApplicationPacket* in = *p; + *p = nullptr; + + // need to calculate the size of the buffer, which can only be done after reading all the strings stored + uint32 task_count = in->ReadUInt32(); + uint32 type = in->ReadUInt32(); + uint32 task_giver_id = in->ReadUInt32(); + + uint32 out_size = 3 * sizeof(uint32); // initial size is the header here + + std::vector tasks; + tasks.reserve(task_count); + for (int i = 0; i < task_count ; i++) { + structs::TaskSelectWindow_Struct task; + task.task_id = in->ReadUInt32(); + out_size += sizeof(task.task_id); + + task.reward_multiplier = in->ReadFloat(); + out_size += sizeof(task.reward_multiplier); + + task.duration = in->ReadUInt32(); + out_size += sizeof(task.duration); + + in->SetReadPosition(in->GetReadPosition() + sizeof(uint32)); // skip duration_code + + in->ReadString(task.title); + out_size += task.title.size() + 1; + + in->ReadString(task.description); + out_size += task.description.size() + 1; + + task.preview_enable = static_cast(in->ReadUInt8()); + out_size += sizeof(task.preview_enable); + + uint32 selector_count = in->ReadUInt32(); + out_size += sizeof(selector_count); + + std::vector selectors; + selectors.reserve(selector_count); + for (int j = 0; j < selector_count; j++) { + structs::TaskSelectWindowSelector_Struct selector; + selector.selector_id = in->ReadSInt32(); + out_size += sizeof(selector.selector_id); + + selector.activity_type = in->ReadSInt32(); + out_size += sizeof(selector.activity_type); + + in->SetReadPosition(in->GetReadPosition() + sizeof(int32)); // skip request_type + + in->ReadString(selector.target_name); + out_size += selector.target_name.size() + 1; + + in->ReadLengthString(selector.item_list); + out_size += sizeof(uint32) + selector.item_list.size(); + + selector.goal_count = in->ReadSInt32(); + out_size += sizeof(selector.goal_count); + + in->ReadLengthString(selector.skill_list); + out_size += sizeof(uint32) + selector.skill_list.size(); + + in->ReadLengthString(selector.spell_list); + out_size += sizeof(uint32) + selector.spell_list.size(); + + in->ReadString(selector.zones); + out_size += selector.zones.size() + 1; + + in->ReadString(selector.description_override); + out_size += selector.description_override.size() + 1; + + in->ReadString(selector.zones_internal); + out_size += selector.zones_internal.size() + 1; + + selectors.push_back(std::move(selector)); + } + + task.selectors = std::move(selectors); + tasks.push_back(std::move(task)); + } + + SerializeBuffer buf(out_size); + buf.WriteUInt32(task_count); + buf.WriteUInt32(type); + buf.WriteUInt32(task_giver_id); + + for (const auto& task : tasks) { + buf.WriteUInt32(task.task_id); + buf.WriteFloat(task.reward_multiplier); + buf.WriteUInt32(task.duration); + buf.WriteString(task.title); + buf.WriteString(task.description); + buf.WriteUInt8(task.preview_enable); + buf.WriteUInt32(task.selectors.size()); + for (const auto& selector : task.selectors) { + buf.WriteUInt32(selector.selector_id); + buf.WriteUInt32(selector.activity_type); + buf.WriteString(selector.target_name); + buf.WriteLengthString(selector.item_list); + buf.WriteUInt32(selector.goal_count); + buf.WriteLengthString(selector.skill_list); + buf.WriteLengthString(selector.spell_list); + buf.WriteString(selector.zones); + buf.WriteString(selector.description_override); + buf.WriteString(selector.zones_internal); + } + } + + // will need to delete this after we swap, or it will leak + uchar* emu_buffer = in->pBuffer; + + // swap into in + in->size = buf.size(); + in->pBuffer = new uint8[buf.size()]; + memcpy(in->pBuffer, buf.buffer(), buf.size()); + + delete[] emu_buffer; + + dest->FastQueuePacket(&in, ack_req); + } + + ENCODE(OP_SharedTaskSelectWindow) + { + ENCODE_FORWARD(OP_TaskSelectWindow); + } + ENCODE(OP_Track) { SETUP_VAR_ENCODE(Track_Struct); diff --git a/common/patches/tob_ops.h b/common/patches/tob_ops.h index c32c15094..848ee5ca6 100644 --- a/common/patches/tob_ops.h +++ b/common/patches/tob_ops.h @@ -15,6 +15,7 @@ E(OP_CharInventory) E(OP_Charm) E(OP_ClickObjectAction) E(OP_ClientUpdate) +E(OP_CompletedTasks) E(OP_Consider) E(OP_Damage) E(OP_Death) @@ -60,6 +61,7 @@ E(OP_SendMaxCharacters) E(OP_SendMembership) E(OP_SendMembershipDetails) E(OP_SendZonepoints) +E(OP_SharedTaskSelectWindow) E(OP_ShopPlayerBuy) E(OP_ShopPlayerSell) E(OP_ShopRequest) @@ -68,6 +70,10 @@ E(OP_SpecialMesg) E(OP_SpawnAppearance) E(OP_SpawnDoor) E(OP_Stun) +E(OP_TaskActivity) +E(OP_TaskDescription) +E(OP_TaskHistoryReply) +E(OP_TaskSelectWindow) E(OP_Track) E(OP_WearChange) E(OP_Weather) diff --git a/common/patches/tob_structs.h b/common/patches/tob_structs.h index 6b560a5c3..69b4c61db 100644 --- a/common/patches/tob_structs.h +++ b/common/patches/tob_structs.h @@ -1304,5 +1304,85 @@ namespace TOB { #pragma pack() + + // These task structs are not directly serialized because they have variable sized members. They are used + // as intermediate structs to deserialize server values + + struct CompletedTask_Struct + { + uint32 task_id; + std::string title; + uint32 completed_time; + }; + + struct TaskActivity_Struct + { + uint32 task_slot_index; + uint32 task_type; + uint32 task_id; + uint32 activity_id; + uint32 list_group; + int32 activity_type; + uint8 optional_byte; + std::string target_name; + std::string item_list; + uint32 goal_count; + std::string skill_list; + std::string spell_list; + std::string zones; + uint32 dz_switch_id; + std::string description_override; + uint32 done_count; + uint8 flag; + std::string zones2; + }; + + struct TaskDescription_Struct + { + uint32 sequence_number; + uint32 task_id; + uint8 open_window; + uint32 task_type; + uint32 reward_type; + std::string title; + uint32 duration; + uint32 start_time; + std::string description; + uint8 has_rewards; + uint32 coin_reward; + uint32 xp_reward; + uint32 faction_reward; + std::string reward_text; + std::string item_link; + uint32 points; + uint8 has_reward_selection; + }; + + struct TaskSelectWindowSelector_Struct + { + int32 selector_id; + int32 activity_type; + int32 request_type; // deprecated + std::string target_name; + std::string item_list; + int32 goal_count; + std::string skill_list; + std::string spell_list; + std::string zones; + std::string description_override; + std::string zones_internal; + }; + + struct TaskSelectWindow_Struct + { + uint32 task_id; + float reward_multiplier; + uint32 duration; + std::string title; + std::string description; + bool preview_enable; + std::vector selectors; + }; + }; //end namespace structs }; //end namespace tob diff --git a/tob/opcodes.md b/tob/opcodes.md index 9c5d8454f..38ad94325 100644 --- a/tob/opcodes.md +++ b/tob/opcodes.md @@ -11,7 +11,7 @@ Below is a status list for the 450 opcodes we currently use on the server for th |:----------------------------------|:--------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-----------| | `OP_AAAction` | 🟢 Verified | Client→Server only. 16-byte AA_Action struct (action/ability/target_id/exp_value) matches exactly across all 4 send sites. Passthrough correct. action=7 (set restore) and action=10 (shift-buy) unhandled by emu server by design. | | | `OP_AAExpUpdate` | 🟢 Verified | Server→Client only. Handler: `msg_altexpup` @ `0x1402087b0`. Dispatched via `cmp [mem], 4C3h` @ `0x1401e4219` (memory-form, not switch table). Encoder correctly scales experience ×100000/330 and zero-extends unspent uint16→uint32. All 3 fields confirmed from raw ASM. | | -| `OP_AcceptNewTask` | 🟠 Missing | | | +| `OP_AcceptNewTask` | 🟢 Verified | Client→Server only. Sent from `CTaskSelectWnd::WndNotification` @ `0x1405100a0` (hton @ `0x1405101ec`). 12-byte payload: task_type\|task_id\|task_master_id matches `AcceptNewTask_Struct` exactly (size=0xE). Types 0 and 2 use this opcode; type 1 uses shared-task opcode 0x5274. Passthrough correct. | | | `OP_AckPacket` | 🟢 Verified | Client→Server only. Sent from `CDisplay::SetViewActor` @ `0x1401a0b40` (hton @ `0x1401a0c9d`). 4-byte uint32 payload = spawn ID of newly viewed actor (0 if local player or no match). Server ignores payload on both zone and world paths. No encoder/decoder needed. Also used as `signature.ignore_eq_opcode` in zone-in detection. | | | `OP_Action` | 🟢 Verified | Server→Client only. Dispatched via `cmp [mem], 7D28h` @ `0x1401f4245`. Inline case block: constructs CUnSerializeBuffer, calls MissileHitInfo::Deserialize @ `0x1402024C0`. Encoder correct: spell/effect_flag widened, instrument_mod→float, effective_casting_level/unknown1/damage hardcoded to 0 (intentional). Field offsets confirmed from case block and init function. | | | `OP_Action2` | 🔴 Not-Set | | | @@ -55,7 +55,7 @@ Below is a status list for the 450 opcodes we currently use on the server for th | `OP_AutoAttack` | 🟢 Verified | C→S only. No struct, no decoder needed. Client sends bAutoAttack as uint32 (0/1) in 4-byte payload from DoPassageOfTime@0x1400EC3BD; server reads pBuffer[0]. Passthrough correct. | | | `OP_AutoAttack2` | 🟢 Verified | C→S only. Client sends uint32 auto-attack state (0/1) from DoPassageOfTime when bAutoAttack changes. Send @ 0x1400ec45f. No encoder/decoder needed; opcode_dispatch.h IN(uint32) correct. Handler stub. | | | `OP_AutoFire` | 🟢 Verified | C→S only. No S→C handler (IDA showed fallback case). Client sends 6-byte packet (2B opcode + 4B uint32 payload) from DoPassageOfTime @ 0x1400ec65a. No encoder/decoder needed; passthrough correct. | | -| `OP_AvaliableTask` | 🟠 Missing | | | +| `OP_AvailableTask` | 🟢 Verified | Same wire value as `OP_SharedTaskAddPlayer` (0x195C in TOB, 0x36E8 in RoF2). C→S only. EQEMu has no handler under this name; all handling is via `OP_SharedTaskAddPlayer`. No encoder/decoder needed. | | | `OP_Bandolier` | 🟠 Missing | | | | `OP_BankerChange` | 🟢 Verified | Inline case block @ 0x1401e6d98. Bank fields (0x10–0x1C) confirmed correct under passthrough; SetBankPlatinum/Gold/Silver/Copper called at matching offsets. No encoder needed. C→S: header-only click. | | | `OP_Barter` | 🟠 Missing | | | @@ -77,7 +77,7 @@ Below is a status list for the 450 opcodes we currently use on the server for th | `OP_CameraEffect` | 🟢 Verified | S→C only. Passthrough — Camera_Struct (8B: +0 uint32 duration, +4 float intensity). Inline case 0x1401e8431 reads directly, calls CCameraShakeManager::AddShake @ 0x140537F10. | | | `OP_Camp` | 🟢 Verified | Bidirectional, no encoder/decoder. C→S: empty (size 0) from `CEverQuest::Camp` @ `0x140267240`. S→C: 1 byte @ case `0x1401f9cc7` (cmp-dispatch); byte=0 starts countdown, byte≠0 cancels camp with AA warning. | | | `OP_CancelSneakHide` | 🟢 Verified | S→C only. Zero-byte signal, no struct/encoder/decoder. Handler `CEverQuest::CancelSneakHide` @ `0x1402678e0` (cmp-dispatch @ `0x1401e8c86`). Client responds with OP_Hide (0x4F10) + OP_SpawnAppearance. | | -| `OP_CancelTask` | 🟠 Missing | | | +| `OP_CancelTask` | 🟢 Verified | Bidirectional. C→S: DialogResponse@CTaskWnd (0x140513c0a, edx=0x254B). S→C: sub_140182B30@0x140182b30 -> ClearTask. Passthrough; struct unchanged. | | | `OP_CancelTrade` | 🟢 Verified | sub_140209C70 @ 0x140209c70 (cmp-dispatch). C→S field names inverted: fromid=trade target SpawnID, action=local SpawnID. No change needed. | | | `OP_CashReward` | 🟢 Verified | Passthrough. `sub_140209DB0` @ `0x140209DB0` (Pattern A). 4×uint32 matches `CashReward_Struct`. | | | `OP_CastSpell` | 🟢 Verified | C→S only (client ignores S→C). Send: `CharacterZoneClient::CastSpell` @ `0x1400d5350`, hton @ `0x1400d7e09`. Fixed decoder: `inventoryslot` now uses `TOBToServerSlot(TOBCastingInventorySlotToInventorySlot(eq->inventory_slot))`. | | @@ -107,7 +107,7 @@ Below is a status list for the 450 opcodes we currently use on the server for th | `OP_ColoredText` | 🟢 Verified | Passthrough; sub_140205060 @ 0x140205060; color @ +0x00, msg @ +0x04; newline-split, calls DisplayChatText | | | `OP_CombatAbility` | 🟢 Verified | C→S only passthrough. Client sends CombatAbility_Struct (m_target/m_atk/m_skill, 12 bytes) unchanged. S→C hits HWM fallback — server never sends this. Send @ sub_140246750 (0x140246750). | | | `OP_Command` | 🔴 Not-Set | | | -| `OP_CompletedTasks` | 🟠 Missing | | | +| `OP_CompletedTasks` | 🟢 Verified | Handler `sub_140182B30` case 29766 @ `0x1401e7845`. ENCODE added: per-entry `completed_time` zero-extended uint32→uint64 (`mov rax,[rdx+1]` reads QWORD; `add rdx,9`). No struct. S→C only. | | | `OP_ConfirmDelete` | 🟢 Verified | C→S only. Client sends 2-byte spawn_id from ProcessUpdateStats @ 0x140200010 when spawn not found locally. Server handler is a stub (returns immediately). Passthrough correct, no decoder needed. | | | `OP_Consent` | 🟢 Verified | C→S only. Client sends null-terminated player name from sub_140221550 @ 0x140221550 (/consent cmd). No real S→C handler (fallback case). Passthrough correct, struct matches wire format. | | | `OP_ConsentDeny` | 🟢 Verified | C→S only. `/deny` cmd. Send fn `sub_1402217E0` @ `0x1402217E0`. Passthrough — `Consent_Struct{char name[1]}` matches wire format. Not found in HandleWorldMessage (no S→C handler). | | @@ -514,19 +514,19 @@ Below is a status list for the 450 opcodes we currently use on the server for th | `OP_SetStartCity` | 🟠 Missing | | | | `OP_SetTitle` | 🟠 Missing | | | | `OP_SetTitleReply` | 🟠 Missing | | | -| `OP_SharedTaskMemberList` | 🟠 Missing | | | -| `OP_SharedTaskAddPlayer` | 🟠 Missing | | | -| `OP_SharedTaskRemovePlayer` | 🟠 Missing | | | -| `OP_SharedTaskMakeLeader` | 🟠 Missing | | | +| `OP_SharedTaskMemberList` | 🟢 Verified | TOB: 0x5CCC → cmp-dispatch @ 0x1401f3e48 → sub_140182B30 case 0x5CCC → builds 80-byte linked list, calls CTaskWnd::RefreshSharedTaskPlayerList. Passthrough. RoF2: 0x1E7D. | | +| `OP_SharedTaskAddPlayer` | 🟢 Verified | TOB: 0x195C. C→S send at sub_14022E840 (/taskaddplayer cmd, 0x14022E840) and CTaskWnd::WndNotification. 72-byte SharedTaskAddPlayer_Struct passthrough. field1/field2 always 0. RoF2: 0x36E8. | | +| `OP_SharedTaskRemovePlayer` | 🟢 Verified | TOB: 0x39C8. C→S send at sub_14022ECC0 (0x14022ECC0, /taskremoveplayer cmd) and CTaskWnd::WndNotification (0x1405166E0, GUI). 72-byte SharedTaskRemovePlayer_Struct passthrough. RoF2: 0x4865. | | +| `OP_SharedTaskMakeLeader` | 🟢 Verified | TOB: 0x5ECA. C→S send at sub_14022EF10 (0x14022EF10, /taskmakeleader cmd) and CTaskWnd::WndNotification (0x1405166E0, GUI). 72-byte SharedTaskMakeLeader_Struct passthrough. field1/field2 always 0. RoF2: 0x37F2. | | | `OP_SharedTaskMemberInvite` | 🔴 Not-Set | | | -| `OP_SharedTaskInvite` | 🟠 Missing | | | -| `OP_SharedTaskInviteResponse` | 🟠 Missing | | | -| `OP_SharedTaskAcceptNew` | 🟠 Missing | | | -| `OP_SharedTaskMemberChange` | 🟠 Missing | | | -| `OP_SharedTaskPlayerList` | 🟠 Missing | | | -| `OP_SharedTaskSelectWindow` | 🟠 Missing | | | -| `OP_SharedTaskQuit` | 🟠 Missing | | | -| `OP_TaskTimers` | 🟠 Missing | | | +| `OP_SharedTaskInvite` | 🟢 Verified | TOB: 0x31EA → cmp-dispatch @ 0x1401f36dc → sub_140182B30 case 12778. Stores invite_id, shows popup dialog (token 8934). Passthrough. RoF2: 0x3444. | | +| `OP_SharedTaskInviteResponse` | 🟢 Verified | TOB: 0x3159. C→S send in CTaskManager::DialogResponse (0x140182400) when dialog_id==0x31EA. 12-byte SharedTaskInviteResponse_Struct passthrough: {0, invite_id, accepted, pad[3]}. RoF2: 0x7582. | | +| `OP_SharedTaskAcceptNew` | 🟢 Verified | Client→Server. Sent from CTaskSelectWnd::WndNotification @ 0x1405100a0 (TOB 0x5274). 106-byte packet; first 20 bytes map to SharedTaskAccept_Struct correctly. No encoder/decoder. Passthrough correct. | | +| `OP_SharedTaskMemberChange` | 🟢 Verified | TOB: 0x7DCA → cmp-dispatch @ 0x1401f41c6 → sub_140182B30 case 32202 → sub_140183830: checks byte[8] flag, displays token 8549/8550. Passthrough. RoF2: 0x0119. | | +| `OP_SharedTaskPlayerList` | 🟢 Verified | C→S passthrough only. Send fn `sub_14022EE50` @ `0x14022EE50` sends opcode `0x01AB` + 8 zero bytes (10 bytes total). Server ignores payload; no encoder/decoder needed. | | +| `OP_SharedTaskSelectWindow` | 🟢 Verified | TOB: 0x233D → cmp-dispatch @ 0x1401F34C3 → direct call sub_14050F970(CTaskSelectWnd) + vtable+0x1C0 show. S→C. RoF2: 0x48A2. ENCODE_FORWARD(OP_TaskSelectWindow): same handler, same dropped fields. | | +| `OP_SharedTaskQuit` | 🟢 Verified | C→S passthrough only. Send fn `sub_14022F150` @ `0x14022F150` sends opcode `0x455A` + 14-byte payload (ignored by server). Server calls `CancelTask`. No encoder/decoder needed. | | +| `OP_TaskTimers` | 🟢 Verified | C→S passthrough only. Send fn `sub_14022F0A0` @ `0x14022F0A0` sends opcode `0x0975`, 2-byte packet (opcode only). Server calls `GetTaskState()->ListTaskTimers`. No encoder/decoder needed. | | | `OP_Shielding` | 🟠 Missing | | | | `OP_ShopDelItem` | 🟢 Verified | Passthrough. Handler `sub_14020FA30`@`0x14020FA30` → `sub_140476CF0`@`0x140476CF0`. Client reads no payload fields; packet arrival triggers merchant window refresh only. Dispatched via cmp/jz sub-base. | | | `OP_ShopEnd` | 🟢 Verified | Passthrough. S→C: inline case at 0x1401f6ff5; no body read, calls g_pMerchantWnd vtable[0x138](true) to close window. C→S: AboutToHide sends 8B (NPC spawn_id+player spawn_id); server uses INr (raw). | | @@ -562,13 +562,13 @@ Below is a status list for the 450 opcodes we currently use on the server for th | `OP_TargetHoTT` | 🟠 Missing | | | | `OP_TargetMouse` | 🟢 Verified | Passthrough. C→S only. Sends `uint32 new_target` (spawn_id from `[g_pTargetPlayer+0x168]`, 0 to un-target). 3 send sites: DoPassageOfTime, CTargetWnd ctor, CTargetWnd::Init. Matches `ClientTarget_Struct`. | | | `OP_TargetReject` | 🔴 Not-Set | | | -| `OP_TaskActivity` | 🟠 Missing | | | -| `OP_TaskActivityComplete` | 🟠 Missing | | | -| `OP_TaskDescription` | 🟠 Missing | | | -| `OP_TaskHistoryReply` | 🟠 Missing | | | -| `OP_TaskHistoryRequest` | 🟠 Missing | | | -| `OP_TaskRequestTimer` | 🟠 Missing | | | -| `OP_TaskSelectWindow` | 🟠 Missing | | | +| `OP_TaskActivity` | 🟢 Verified | TOB: 0x0B85 → sub_140182B30 case 2949 → CTaskManager::UpdateTaskElement. ENCODE added: strips WriteInt32(0) req_type, converts zones to length-prefixed, adds empty string for new TOB field. | | +| `OP_TaskActivityComplete` | 🟢 Verified | 0x131A → sub_140182B30 case 4890 @ 0x1401e7845. S→C only. Passthrough correct; struct unchanged (6×uint32=24B). Broadcasts task complete/fail text or stage-complete string. | | +| `OP_TaskDescription` | 🟢 Verified | 0x7F50 @ CTaskManager::UpdateTask(0x140184600); no dur_code; all strings length-prefixed; was crashing client with null-terminated WriteString | | +| `OP_TaskHistoryReply` | 🟢 Verified | TOB=0x50A3. S→C. Handler: sub_1401841E0 @ 0x1401841E0 via sub_140182B30 case 0x50A3. TOB wire format differs from RoF2: 5 null-term strings + 5 uint32s per activity (vs. RoF2 length-prefixed item_list + zone strings). ENCODE rewritten; uint32 field order (wire[3-6]) and extra strings (wire[8/11]) need live testing. | | +| `OP_TaskHistoryRequest` | 🟢 Verified | TOB=0x27D5. C→S passthrough. Send @ 0x1405168B9 in CTaskWnd::WndNotification. Wire: uint32 CurSel (6-byte packet). CTaskManager::GetQuestHistoryEntry present in TOB; feature not removed. No DECODE needed. | | +| `OP_TaskRequestTimer` | 🟢 Verified | 0x2C99 @ sub_140182B30 case 11417; two-level dispatch via CTaskManager; stores ms cooldown as abs deadline on LocalPC; passthrough only | | +| `OP_TaskSelectWindow` | 🟢 Verified | TOB: 0x0B2B → sub_140182B30 case 2859 → sub_14050F970(CTaskSelectWnd) + vtable+448 show. S→C. RoF2: 0x705B. ENCODE: drop duration_code per-task, drop request_type per-element. | | | `OP_Taunt` | 🟢 Verified | C→S passthrough. Client sends target spawn_id (uint32 at [g_pTargetPlayer+0x168]) matching ClientTarget_Struct. Send @ sub_140102DF0 (0x140102DF0). Pre-send: range/LOS/inanimate checks. | | | `OP_TestBuff` | 🟠 Missing | | | | `OP_TGB` | 🟠 Missing | | | diff --git a/utils/EQExtractor2/EQExtractor2/patch_April15-2013.conf b/utils/EQExtractor2/EQExtractor2/patch_April15-2013.conf index 98fa92c92..6e7e41316 100644 --- a/utils/EQExtractor2/EQExtractor2/patch_April15-2013.conf +++ b/utils/EQExtractor2/EQExtractor2/patch_April15-2013.conf @@ -536,7 +536,7 @@ OP_AcceptNewTask=0x5d0e OP_CancelTask=0x2f6c OP_TaskMemberList=0x16f5 # Was 0x1656 OP_OpenNewTasksWindow=0x065c # Was 0x11de -OP_AvaliableTask=0x5ed2 # Was 0x2377 +OP_AvailableTask=0x5ed2 # Was 0x2377 OP_TaskHistoryRequest=0x2da2 OP_TaskHistoryReply=0x2cc2 OP_DeclineAllTasks=0x0000 diff --git a/utils/EQExtractor2/EQExtractor2/patch_Aug04-2011.conf b/utils/EQExtractor2/EQExtractor2/patch_Aug04-2011.conf index 934194134..32bbe2c01 100644 --- a/utils/EQExtractor2/EQExtractor2/patch_Aug04-2011.conf +++ b/utils/EQExtractor2/EQExtractor2/patch_Aug04-2011.conf @@ -490,7 +490,7 @@ OP_LDoNOpen=0x0000 # OP_TaskActivityComplete=0x0000 # OP_TaskMemberList=0x0000 # OP_OpenNewTasksWindow=0x0000 # -OP_AvaliableTask=0x0000 # +OP_AvailableTask=0x0000 # OP_AcceptNewTask=0x0000 # OP_TaskHistoryRequest=0x0000 # OP_TaskHistoryReply=0x0000 # diff --git a/utils/EQExtractor2/EQExtractor2/patch_August15-2012.conf b/utils/EQExtractor2/EQExtractor2/patch_August15-2012.conf index f2c8c9566..e321cbcca 100644 --- a/utils/EQExtractor2/EQExtractor2/patch_August15-2012.conf +++ b/utils/EQExtractor2/EQExtractor2/patch_August15-2012.conf @@ -514,7 +514,7 @@ OP_LDoNOpen=0x0000 # OP_TaskActivityComplete=0x0000 # OP_TaskMemberList=0x0000 # OP_OpenNewTasksWindow=0x0000 # -OP_AvaliableTask=0x0000 # +OP_AvailableTask=0x0000 # OP_AcceptNewTask=0x0000 # OP_TaskHistoryRequest=0x0000 # OP_TaskHistoryReply=0x0000 # diff --git a/utils/EQExtractor2/EQExtractor2/patch_Dec10-2012.conf b/utils/EQExtractor2/EQExtractor2/patch_Dec10-2012.conf index 2a9e10ccc..cf64a025c 100644 --- a/utils/EQExtractor2/EQExtractor2/patch_Dec10-2012.conf +++ b/utils/EQExtractor2/EQExtractor2/patch_Dec10-2012.conf @@ -534,7 +534,7 @@ OP_AcceptNewTask=0x394d OP_CancelTask=0x0c7f OP_TaskMemberList=0x748e # Was 0x1656 OP_OpenNewTasksWindow=0x436c # Was 0x11de -OP_AvaliableTask=0x2bf8 # Was 0x2377 +OP_AvailableTask=0x2bf8 # Was 0x2377 OP_TaskHistoryRequest=0x6cf6 OP_TaskHistoryReply=0x25eb OP_DeclineAllTasks=0x0000 diff --git a/utils/EQExtractor2/EQExtractor2/patch_Dec7-2010.conf b/utils/EQExtractor2/EQExtractor2/patch_Dec7-2010.conf index 9c4334b8a..388cd4abd 100644 --- a/utils/EQExtractor2/EQExtractor2/patch_Dec7-2010.conf +++ b/utils/EQExtractor2/EQExtractor2/patch_Dec7-2010.conf @@ -490,7 +490,7 @@ OP_LDoNOpen=0x0000 # C OP_TaskActivityComplete=0x0000 # C OP_TaskMemberList=0x0000 # C OP_OpenNewTasksWindow=0x0000 # C -OP_AvaliableTask=0x0000 # C Mispelled? +OP_AvailableTask=0x0000 # C Mispelled? OP_AcceptNewTask=0x0000 # C OP_TaskHistoryRequest=0x0000 # C OP_TaskHistoryReply=0x0000 # C diff --git a/utils/EQExtractor2/EQExtractor2/patch_Feb11-2013.conf b/utils/EQExtractor2/EQExtractor2/patch_Feb11-2013.conf index cae71ac8b..5fe18f4ab 100644 --- a/utils/EQExtractor2/EQExtractor2/patch_Feb11-2013.conf +++ b/utils/EQExtractor2/EQExtractor2/patch_Feb11-2013.conf @@ -536,7 +536,7 @@ OP_AcceptNewTask=0x1bbf OP_CancelTask=0x590b OP_TaskMemberList=0x0e5c # Was 0x1656 OP_OpenNewTasksWindow=0x22ac # Was 0x11de -OP_AvaliableTask=0x12cd # Was 0x2377 +OP_AvailableTask=0x12cd # Was 0x2377 OP_TaskHistoryRequest=0x1489 OP_TaskHistoryReply=0x2d43 OP_DeclineAllTasks=0x0000 diff --git a/utils/EQExtractor2/EQExtractor2/patch_Feb8-2011.conf b/utils/EQExtractor2/EQExtractor2/patch_Feb8-2011.conf index 8212d2062..4a1a4b736 100644 --- a/utils/EQExtractor2/EQExtractor2/patch_Feb8-2011.conf +++ b/utils/EQExtractor2/EQExtractor2/patch_Feb8-2011.conf @@ -490,7 +490,7 @@ OP_LDoNOpen=0x0000 # C OP_TaskActivityComplete=0x0000 # C OP_TaskMemberList=0x0000 # C OP_OpenNewTasksWindow=0x0000 # C -OP_AvaliableTask=0x0000 # C Mispelled? +OP_AvailableTask=0x0000 # C Mispelled? OP_AcceptNewTask=0x0000 # C OP_TaskHistoryRequest=0x0000 # C OP_TaskHistoryReply=0x0000 # C diff --git a/utils/EQExtractor2/EQExtractor2/patch_Jan16-2013.conf b/utils/EQExtractor2/EQExtractor2/patch_Jan16-2013.conf index ffbd37c25..ff02fc5f5 100644 --- a/utils/EQExtractor2/EQExtractor2/patch_Jan16-2013.conf +++ b/utils/EQExtractor2/EQExtractor2/patch_Jan16-2013.conf @@ -536,7 +536,7 @@ OP_AcceptNewTask=0x0b03 OP_CancelTask=0x4c3f OP_TaskMemberList=0x2f78 # Was 0x1656 OP_OpenNewTasksWindow=0xd63f # Was 0x11de -OP_AvaliableTask=0x5f3e # Was 0x2377 +OP_AvailableTask=0x5f3e # Was 0x2377 OP_TaskHistoryRequest=0x03fe OP_TaskHistoryReply=0x2b9f OP_DeclineAllTasks=0x0000 diff --git a/utils/EQExtractor2/EQExtractor2/patch_July13-2012.conf b/utils/EQExtractor2/EQExtractor2/patch_July13-2012.conf index 8238d518b..a37bb9eca 100644 --- a/utils/EQExtractor2/EQExtractor2/patch_July13-2012.conf +++ b/utils/EQExtractor2/EQExtractor2/patch_July13-2012.conf @@ -514,7 +514,7 @@ OP_LDoNOpen=0x7c87 # OP_TaskActivityComplete=0x0000 # OP_TaskMemberList=0x0000 # OP_OpenNewTasksWindow=0x0000 # -OP_AvaliableTask=0x0000 # +OP_AvailableTask=0x0000 # OP_AcceptNewTask=0x0000 # OP_TaskHistoryRequest=0x6d1f # OP_TaskHistoryReply=0x189b # diff --git a/utils/EQExtractor2/EQExtractor2/patch_June25-2012.conf b/utils/EQExtractor2/EQExtractor2/patch_June25-2012.conf index 935bb4698..308d3993f 100644 --- a/utils/EQExtractor2/EQExtractor2/patch_June25-2012.conf +++ b/utils/EQExtractor2/EQExtractor2/patch_June25-2012.conf @@ -514,7 +514,7 @@ OP_LDoNOpen=0x7c87 # OP_TaskActivityComplete=0x0000 # OP_TaskMemberList=0x0000 # OP_OpenNewTasksWindow=0x0000 # -OP_AvaliableTask=0x0000 # +OP_AvailableTask=0x0000 # OP_AcceptNewTask=0x0000 # OP_TaskHistoryRequest=0x6d1f # OP_TaskHistoryReply=0x189b # diff --git a/utils/EQExtractor2/EQExtractor2/patch_Mar13-2013.conf b/utils/EQExtractor2/EQExtractor2/patch_Mar13-2013.conf index a337d8e8d..2a4c64b82 100644 --- a/utils/EQExtractor2/EQExtractor2/patch_Mar13-2013.conf +++ b/utils/EQExtractor2/EQExtractor2/patch_Mar13-2013.conf @@ -536,7 +536,7 @@ OP_AcceptNewTask=0x1e7a OP_CancelTask=0x1798 OP_TaskMemberList=0x4844 # Was 0x1656 OP_OpenNewTasksWindow=0x67b4 # Was 0x11de -OP_AvaliableTask=0x0a3f # Was 0x2377 +OP_AvailableTask=0x0a3f # Was 0x2377 OP_TaskHistoryRequest=0x4c34 OP_TaskHistoryReply=0x593e OP_DeclineAllTasks=0x0000 diff --git a/utils/EQExtractor2/EQExtractor2/patch_Mar15-2012.conf b/utils/EQExtractor2/EQExtractor2/patch_Mar15-2012.conf index de4efdb37..76cc14897 100644 --- a/utils/EQExtractor2/EQExtractor2/patch_Mar15-2012.conf +++ b/utils/EQExtractor2/EQExtractor2/patch_Mar15-2012.conf @@ -512,7 +512,7 @@ OP_LDoNOpen=0x7c87 # OP_TaskActivityComplete=0x0000 # OP_TaskMemberList=0x0000 # OP_OpenNewTasksWindow=0x0000 # -OP_AvaliableTask=0x0000 # +OP_AvailableTask=0x0000 # OP_AcceptNewTask=0x0000 # OP_TaskHistoryRequest=0x6d1f # OP_TaskHistoryReply=0x189b # diff --git a/utils/EQExtractor2/EQExtractor2/patch_March15-2011.conf b/utils/EQExtractor2/EQExtractor2/patch_March15-2011.conf index 9356c1857..8c777cffc 100644 --- a/utils/EQExtractor2/EQExtractor2/patch_March15-2011.conf +++ b/utils/EQExtractor2/EQExtractor2/patch_March15-2011.conf @@ -490,7 +490,7 @@ OP_LDoNOpen=0x0000 # C OP_TaskActivityComplete=0x0000 # C OP_TaskMemberList=0x0000 # C OP_OpenNewTasksWindow=0x0000 # C -OP_AvaliableTask=0x0000 # C Mispelled? +OP_AvailableTask=0x0000 # C Mispelled? OP_AcceptNewTask=0x0000 # C OP_TaskHistoryRequest=0x0000 # C OP_TaskHistoryReply=0x0000 # C diff --git a/utils/EQExtractor2/EQExtractor2/patch_May12-2010.conf b/utils/EQExtractor2/EQExtractor2/patch_May12-2010.conf index 59b75ca71..45d835958 100644 --- a/utils/EQExtractor2/EQExtractor2/patch_May12-2010.conf +++ b/utils/EQExtractor2/EQExtractor2/patch_May12-2010.conf @@ -490,7 +490,7 @@ OP_LDoNOpen=0x032b # C OP_TaskActivityComplete=0x5832 # C OP_TaskMemberList=0x66ba # C OP_OpenNewTasksWindow=0x98f6 # C -OP_AvaliableTask=0x6255 # C Mispelled? +OP_AvailableTask=0x6255 # C Mispelled? OP_AcceptNewTask=0x17d5 # C OP_TaskHistoryRequest=0x547c # C OP_TaskHistoryReply=0x4524 # C diff --git a/utils/EQExtractor2/EQExtractor2/patch_May12-2011.conf b/utils/EQExtractor2/EQExtractor2/patch_May12-2011.conf index 1367ea267..0bf61de61 100644 --- a/utils/EQExtractor2/EQExtractor2/patch_May12-2011.conf +++ b/utils/EQExtractor2/EQExtractor2/patch_May12-2011.conf @@ -490,7 +490,7 @@ OP_LDoNOpen=0x0000 # C OP_TaskActivityComplete=0x0000 # C OP_TaskMemberList=0x0000 # C OP_OpenNewTasksWindow=0x0000 # C -OP_AvaliableTask=0x0000 # C Mispelled? +OP_AvailableTask=0x0000 # C Mispelled? OP_AcceptNewTask=0x0000 # C OP_TaskHistoryRequest=0x0000 # C OP_TaskHistoryReply=0x0000 # C diff --git a/utils/EQExtractor2/EQExtractor2/patch_Nov17-2011.conf b/utils/EQExtractor2/EQExtractor2/patch_Nov17-2011.conf index a77eab374..c994fb210 100644 --- a/utils/EQExtractor2/EQExtractor2/patch_Nov17-2011.conf +++ b/utils/EQExtractor2/EQExtractor2/patch_Nov17-2011.conf @@ -481,7 +481,7 @@ OP_LDoNOpen=0x0000 # OP_TaskActivityComplete=0x0000 # OP_TaskMemberList=0x0000 # OP_OpenNewTasksWindow=0x0000 # -OP_AvaliableTask=0x0000 # +OP_AvailableTask=0x0000 # OP_AcceptNewTask=0x0000 # OP_TaskHistoryRequest=0x0000 # OP_TaskHistoryReply=0x0000 # diff --git a/utils/EQExtractor2/EQExtractor2/patch_Sep01-2010.conf b/utils/EQExtractor2/EQExtractor2/patch_Sep01-2010.conf index 913363212..f455a5a51 100644 --- a/utils/EQExtractor2/EQExtractor2/patch_Sep01-2010.conf +++ b/utils/EQExtractor2/EQExtractor2/patch_Sep01-2010.conf @@ -490,7 +490,7 @@ OP_LDoNOpen=0x0000 # C OP_TaskActivityComplete=0x0000 # C OP_TaskMemberList=0x0000 # C OP_OpenNewTasksWindow=0x0000 # C -OP_AvaliableTask=0x0000 # C Mispelled? +OP_AvailableTask=0x0000 # C Mispelled? OP_AcceptNewTask=0x0000 # C OP_TaskHistoryRequest=0x0000 # C OP_TaskHistoryReply=0x0000 # C diff --git a/utils/EQExtractor2/EQExtractor2/patch_Sep22-2010.conf b/utils/EQExtractor2/EQExtractor2/patch_Sep22-2010.conf index 5d921774f..a0e3bea5e 100644 --- a/utils/EQExtractor2/EQExtractor2/patch_Sep22-2010.conf +++ b/utils/EQExtractor2/EQExtractor2/patch_Sep22-2010.conf @@ -492,7 +492,7 @@ OP_LDoNOpen=0x0000 # C OP_TaskActivityComplete=0x0000 # C OP_TaskMemberList=0x0000 # C OP_OpenNewTasksWindow=0x0000 # C -OP_AvaliableTask=0x0000 # C Mispelled? +OP_AvailableTask=0x0000 # C Mispelled? OP_AcceptNewTask=0x0000 # C OP_TaskHistoryRequest=0x0000 # C OP_TaskHistoryReply=0x0000 # C diff --git a/utils/EQExtractor2/EQExtractor2/patch_SoD.conf b/utils/EQExtractor2/EQExtractor2/patch_SoD.conf index 599d94657..e0b337218 100644 --- a/utils/EQExtractor2/EQExtractor2/patch_SoD.conf +++ b/utils/EQExtractor2/EQExtractor2/patch_SoD.conf @@ -473,7 +473,7 @@ OP_LDoNOpen=0x6129 # C OP_TaskActivityComplete=0x4df0 # C OP_TaskMemberList=0x34ed # C OP_OpenNewTasksWindow=0x4dd5 # C -OP_AvaliableTask=0x2136 # C +OP_AvailableTask=0x2136 # C OP_AcceptNewTask=0x5832 # C OP_TaskHistoryRequest=0x29d7 # C OP_TaskHistoryReply=0x3d2a # C diff --git a/utils/EQExtractor2/EQExtractor2/patch_TestServer-Feb5-2013.conf b/utils/EQExtractor2/EQExtractor2/patch_TestServer-Feb5-2013.conf index b835930b7..b7100ac83 100644 --- a/utils/EQExtractor2/EQExtractor2/patch_TestServer-Feb5-2013.conf +++ b/utils/EQExtractor2/EQExtractor2/patch_TestServer-Feb5-2013.conf @@ -536,7 +536,7 @@ OP_AcceptNewTask=0x1c0f OP_CancelTask=0xb199 OP_TaskMemberList=0x4028 # Was 0x1656 OP_OpenNewTasksWindow=0x1e5b # Was 0x11de -OP_AvaliableTask=0x1138 # Was 0x2377 +OP_AvailableTask=0x1138 # Was 0x2377 OP_TaskHistoryRequest=0x2e9b OP_TaskHistoryReply=0x2adb OP_DeclineAllTasks=0x0000 diff --git a/utils/EQExtractor2/EQExtractor2/patch_TestServer-Jan16-2013.conf b/utils/EQExtractor2/EQExtractor2/patch_TestServer-Jan16-2013.conf index 62afc1735..41d55eaff 100644 --- a/utils/EQExtractor2/EQExtractor2/patch_TestServer-Jan16-2013.conf +++ b/utils/EQExtractor2/EQExtractor2/patch_TestServer-Jan16-2013.conf @@ -536,7 +536,7 @@ OP_AcceptNewTask=0x3d60 OP_CancelTask=0x26a8 OP_TaskMemberList=0x411e OP_OpenNewTasksWindow=0x2633 -OP_AvaliableTask=0x05cc +OP_AvailableTask=0x05cc OP_TaskHistoryRequest=0x72e1 OP_TaskHistoryReply=0x0c1e OP_DeclineAllTasks=0x0000 diff --git a/utils/patches/opcodes.conf b/utils/patches/opcodes.conf index 0469ce50e..d71b4dfa6 100644 --- a/utils/patches/opcodes.conf +++ b/utils/patches/opcodes.conf @@ -407,8 +407,8 @@ OP_CompletedTasks=0x76a2 # ShowEQ 10/27/05 OP_TaskDescription=0x5ef7 # ShowEQ 10/27/05 OP_TaskActivity=0x682d # ShowEQ 10/27/05 OP_TaskMemberList=0x0000 #not sure -OP_OpenNewTasksWindow=0x0000 #combined with OP_AvaliableTask I think -OP_AvaliableTask=0x0000 +OP_OpenNewTasksWindow=0x0000 #combined with OP_AvailableTask I think +OP_AvailableTask=0x0000 OP_AcceptNewTask=0x0000 OP_CancelTask=0x0000 OP_DeclineAllTasks=0x0000 #not sure, 12 bytes diff --git a/utils/patches/patch_RoF.conf b/utils/patches/patch_RoF.conf index c4def424a..70f4cdcf5 100644 --- a/utils/patches/patch_RoF.conf +++ b/utils/patches/patch_RoF.conf @@ -563,7 +563,7 @@ OP_CancelTask=0x0c7f OP_TaskMemberList=0x748e # Was 0x1656 OP_TaskSelectWindow=0x436c OP_SharedTaskSelectWindow=0x436c -OP_AvaliableTask=0x2bf8 # Was 0x2377 +OP_AvailableTask=0x2bf8 # Was 0x2377 OP_TaskHistoryRequest=0x6cf6 OP_TaskHistoryReply=0x25eb OP_DeclineAllTasks=0x0000 diff --git a/utils/patches/patch_RoF2.conf b/utils/patches/patch_RoF2.conf index bff232bf9..265b54cad 100644 --- a/utils/patches/patch_RoF2.conf +++ b/utils/patches/patch_RoF2.conf @@ -595,7 +595,7 @@ OP_CompletedTasks=0x4eba OP_TaskActivityComplete=0x5e19 OP_AcceptNewTask=0x0a23 OP_CancelTask=0x39f0 -OP_AvaliableTask=0x36e8 +OP_AvailableTask=0x36e8 OP_TaskHistoryRequest=0x5f1c OP_TaskHistoryReply=0x3d05 OP_DeclineAllTasks=0x0000 diff --git a/utils/patches/patch_SoD.conf b/utils/patches/patch_SoD.conf index da5ca33cf..1dadda25b 100644 --- a/utils/patches/patch_SoD.conf +++ b/utils/patches/patch_SoD.conf @@ -530,7 +530,7 @@ OP_LDoNOpen=0x6129 # C # Task packets OP_TaskActivityComplete=0x4df0 # C -OP_AvaliableTask=0x2136 # C +OP_AvailableTask=0x2136 # C OP_AcceptNewTask=0x5832 # C OP_TaskHistoryRequest=0x29d7 # C OP_TaskHistoryReply=0x3d2a # C diff --git a/utils/patches/patch_SoF.conf b/utils/patches/patch_SoF.conf index a523730d3..857178b17 100644 --- a/utils/patches/patch_SoF.conf +++ b/utils/patches/patch_SoF.conf @@ -501,7 +501,7 @@ OP_LDoNOpen=0x4b92 #Xinu 03/19/09 OP_TaskActivityComplete=0x7338 # OP_SharedTaskSelectWindow=0x17C3 OP_TaskSelectWindow=0x17C3 -OP_AvaliableTask=0x5d1d #Xinu 03/19/09 +OP_AvailableTask=0x5d1d #Xinu 03/19/09 OP_AcceptNewTask=0x66A8 # OP_TaskHistoryRequest=0x3035 # OP_TaskHistoryReply=0x3A60 # diff --git a/utils/patches/patch_TOB.conf b/utils/patches/patch_TOB.conf index 2274240af..cd48e294f 100644 --- a/utils/patches/patch_TOB.conf +++ b/utils/patches/patch_TOB.conf @@ -586,32 +586,32 @@ OP_LDoNPickLock=0x36ea OP_LDoNInspect=0x256a # Task packets -OP_TaskDescription=0x0000 -OP_TaskActivity=0x0000 -OP_CompletedTasks=0x0000 -OP_TaskActivityComplete=0x0000 -OP_AcceptNewTask=0x0000 -OP_CancelTask=0x0000 -OP_AvaliableTask=0x0000 -OP_TaskHistoryRequest=0x0000 -OP_TaskHistoryReply=0x0000 -OP_DeclineAllTasks=0x0000 -OP_TaskRequestTimer=0x0000 -OP_TaskSelectWindow=0x0000 +OP_TaskDescription=0x7f50 +OP_TaskActivity=0x0b85 +OP_CompletedTasks=0x7446 +OP_TaskActivityComplete=0x131a +OP_AcceptNewTask=0x7841 +OP_CancelTask=0x254b +OP_AvailableTask=0x195c # Same as OP_SharedTaskAddPlayer +OP_TaskHistoryRequest=0x27d5 +OP_TaskHistoryReply=0x50a3 +OP_DeclineAllTasks=0x0000 # Undefined in RoF2 +OP_TaskRequestTimer=0x2c99 +OP_TaskSelectWindow=0x0b2b # Shared Tasks -OP_SharedTaskMemberList=0x0000 # -OP_SharedTaskRemovePlayer=0x0000 # /taskremoveplayer -OP_SharedTaskAddPlayer=0x0000 # /taskaddplayer -OP_SharedTaskMakeLeader=0x0000 # /taskmakeleader -OP_SharedTaskInvite=0x0000 # Dialog window -OP_SharedTaskInviteResponse=0x0000 # Dialog window response -OP_SharedTaskAcceptNew=0x0000 # -OP_SharedTaskMemberChange=0x0000 # -OP_TaskTimers=0x0000 # /tasktimers -OP_SharedTaskQuit=0x0000 # /taskquit -OP_SharedTaskSelectWindow=0x0000 -OP_SharedTaskPlayerList=0x0000 # /taskplayerlist +OP_SharedTaskMemberList=0x5ccc # +OP_SharedTaskRemovePlayer=0x39c8 # /taskremoveplayer +OP_SharedTaskAddPlayer=0x195c # /taskaddplayer +OP_SharedTaskMakeLeader=0x5eca # /taskmakeleader +OP_SharedTaskInvite=0x31ea # Dialog window +OP_SharedTaskInviteResponse=0x3159 # Dialog window response +OP_SharedTaskAcceptNew=0x5274 # +OP_SharedTaskMemberChange=0x7dca # +OP_TaskTimers=0x0975 # /tasktimers +OP_SharedTaskQuit=0x455a # /taskquit +OP_SharedTaskSelectWindow=0x233d +OP_SharedTaskPlayerList=0x01ab # /taskplayerlist # Title opcodes OP_NewTitlesAvailable=0x0000 diff --git a/utils/patches/patch_Titanium.conf b/utils/patches/patch_Titanium.conf index 2181e1fe1..fc2d2c5a0 100644 --- a/utils/patches/patch_Titanium.conf +++ b/utils/patches/patch_Titanium.conf @@ -481,7 +481,7 @@ OP_CompletedTasks=0x76a2 # ShowEQ 10/27/05 OP_TaskDescription=0x5ef7 # ShowEQ 10/27/05 OP_TaskActivity=0x682d # ShowEQ 10/27/05 OP_TaskSelectWindow=0x5e7c -OP_AvaliableTask=0x0000 +OP_AvailableTask=0x0000 OP_AcceptNewTask=0x207f OP_TaskHistoryRequest=0x5df4 OP_TaskHistoryReply=0x397d diff --git a/utils/patches/patch_UF.conf b/utils/patches/patch_UF.conf index c3c916989..71b125d84 100644 --- a/utils/patches/patch_UF.conf +++ b/utils/patches/patch_UF.conf @@ -575,7 +575,7 @@ OP_LDoNInspect=0x0aaa # Task packets OP_TaskActivityComplete=0x5832 # C -OP_AvaliableTask=0x6255 # C Mispelled? +OP_AvailableTask=0x6255 # C Mispelled? OP_AcceptNewTask=0x17d5 # C OP_TaskHistoryRequest=0x547c # C OP_TaskHistoryReply=0x4524 # C diff --git a/utils/scripts/opcode_scripts/opcodelist.txt b/utils/scripts/opcode_scripts/opcodelist.txt index 6e324c40d..001f8132a 100644 --- a/utils/scripts/opcode_scripts/opcodelist.txt +++ b/utils/scripts/opcode_scripts/opcodelist.txt @@ -999,7 +999,7 @@ RoF2 Built May 10 2013 23:30:08 0x48a2 OP_OpenNewTasksWindow 0x3010 0x45db -0x36e8 OP_AvaliableTask +0x36e8 OP_AvailableTask 0x4865 0x322e 0x7582 diff --git a/utils/scripts/opcode_scripts/patch_NEW.conf b/utils/scripts/opcode_scripts/patch_NEW.conf index 37852598b..fc69b92d7 100644 --- a/utils/scripts/opcode_scripts/patch_NEW.conf +++ b/utils/scripts/opcode_scripts/patch_NEW.conf @@ -543,7 +543,7 @@ OP_AcceptNewTask=0x0a23 OP_CancelTask=0x39f0 OP_TaskMemberList=0x5727 OP_OpenNewTasksWindow=0x48a2 -OP_AvaliableTask=0x36e8 +OP_AvailableTask=0x36e8 OP_TaskHistoryRequest=0x5f1c OP_TaskHistoryReply=0x3d05 OP_DeclineAllTasks=0x0000 diff --git a/utils/scripts/opcode_scripts/patch_OLD.conf b/utils/scripts/opcode_scripts/patch_OLD.conf index 6ebb2df91..34de0fb0f 100644 --- a/utils/scripts/opcode_scripts/patch_OLD.conf +++ b/utils/scripts/opcode_scripts/patch_OLD.conf @@ -543,7 +543,7 @@ OP_AcceptNewTask=0x0a23 OP_CancelTask=0x08d3 OP_TaskMemberList=0x5727 OP_OpenNewTasksWindow=0x48a2 -OP_AvaliableTask=0x36e8 +OP_AvailableTask=0x36e8 OP_TaskHistoryRequest=0x5f1c OP_TaskHistoryReply=0x3d05 OP_DeclineAllTasks=0x0000