Found and added task packets (#5101)
Build / Linux (push) Waiting to run
Build / Windows (push) Waiting to run

This commit is contained in:
dannuic
2026-06-17 22:22:09 -06:00
committed by GitHub
parent dc559710ed
commit 974dbcd6ff
38 changed files with 586 additions and 79 deletions
+3
View File
@@ -69,3 +69,6 @@ compile_flags.txt
# CMake Files
cmake-build-relwithdebinfo/*
skill-caps.diff
# Analysis files
tob/packet_analysis
+8
View File
@@ -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<uint32>(strlen((char *)(pBuffer + _rpos))) + 1; memcpy(str, pBuffer + _rpos, len); _rpos += len; }
void ReadString(std::string &str) { str = reinterpret_cast<char *>(pBuffer + _rpos); _rpos += str.length() + 1; }
void ReadString(char *str, uint32 Offset, uint32 MaxLength) const;
+410
View File
@@ -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<structs::CompletedTask_Struct> 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<uint64>(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<Act> 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<uint32>(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<structs::TaskSelectWindow_Struct> 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<bool>(in->ReadUInt8());
out_size += sizeof(task.preview_enable);
uint32 selector_count = in->ReadUInt32();
out_size += sizeof(selector_count);
std::vector<structs::TaskSelectWindowSelector_Struct> 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);
+6
View File
@@ -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)
+80
View File
@@ -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<TaskSelectWindowSelector_Struct> selectors;
};
}; //end namespace structs
}; //end namespace tob
+23 -23
View File
@@ -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 (0x100x1C) 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 | | |
@@ -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
@@ -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 #
@@ -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 #
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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 #
@@ -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 #
@@ -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
@@ -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 #
@@ -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
@@ -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
@@ -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
@@ -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 #
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
+2 -2
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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 #
+24 -24
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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