mirror of
https://github.com/EQEmu/Server.git
synced 2026-06-18 20:08:21 +00:00
Found and added task packets (#5101)
This commit is contained in:
@@ -69,3 +69,6 @@ compile_flags.txt
|
||||
# CMake Files
|
||||
cmake-build-relwithdebinfo/*
|
||||
skill-caps.diff
|
||||
|
||||
# Analysis files
|
||||
tob/packet_analysis
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
@@ -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 | | |
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 #
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user