diff --git a/common/patches/tob.cpp b/common/patches/tob.cpp index 90529b045..64ef78c77 100644 --- a/common/patches/tob.cpp +++ b/common/patches/tob.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include "world/sof_char_create_data.h" @@ -217,19 +218,22 @@ namespace TOB ENCODE(OP_BlockedBuffs) { - ENCODE_LENGTH_EXACT(BlockedBuffs_Struct); - SETUP_DIRECT_ENCODE(BlockedBuffs_Struct, structs::BlockedBuffs_Struct); + // Blocked buffs are a major change. They are stored in a resizable array in TOB, so this sends size, then + // spells, then the final two bools -- see 0x140202750 + SETUP_VAR_ENCODE(BlockedBuffs_Struct); - for (uint32 i = 0; i < BLOCKED_BUFF_COUNT; ++i) - eq->SpellID[i] = emu->SpellID[i]; + // size is uint32 + count * int32 + uint8 + uint8 + uint32 sz = 6 + emu->Count * 4; + __packet->size = sz; + __packet->pBuffer = new unsigned char[sz]; + memset(__packet->pBuffer, 0, sz); - for (uint32 i = BLOCKED_BUFF_COUNT; i < structs::BLOCKED_BUFF_COUNT; ++i) - eq->SpellID[i] = -1; + __packet->WriteUInt32(emu->Count); + for (int i = 0; i < emu->Count; i++) + __packet->WriteSInt32(emu->SpellID[i]); - OUT(Count); - OUT(Pet); - OUT(Initialise); - OUT(Flags); + __packet->WriteUInt8(emu->Pet); + __packet->WriteUInt8(emu->Initialise); FINISH_ENCODE(); } @@ -981,6 +985,7 @@ namespace TOB ENCODE(OP_NewSpawn) { ENCODE_FORWARD(OP_ZoneSpawns); } ENCODE(OP_NewZone) { + // zoneHeader EQApplicationPacket* in = *p; *p = nullptr; @@ -2903,7 +2908,7 @@ namespace TOB buf.WriteString(new_message); - auto outapp = new EQApplicationPacket(OP_SpecialMesg, buf); + auto outapp = new EQApplicationPacket(OP_SpecialMesg, std::move(buf)); dest->FastQueuePacket(&outapp, ack_req); delete in; @@ -2934,14 +2939,14 @@ namespace TOB return; } - auto outapp = new EQApplicationPacket(OP_ChangeSize, sizeof(ChangeSize_Struct)); + auto outapp = new EQApplicationPacket(OP_ChangeSize, sizeof(structs::ChangeSize_Struct)); - ChangeSize_Struct* css = (ChangeSize_Struct*)outapp->pBuffer; + structs::ChangeSize_Struct* css = (structs::ChangeSize_Struct*)outapp->pBuffer; css->EntityID = sas->spawn_id; css->Size = (float)sas->parameter; - css->Unknown08 = 0; - css->Unknown12 = 1.0f; + css->CameraOffset = 0; + css->AnimationSpeedRelated = 1.0f; dest->FastQueuePacket(&outapp, ack_req); delete in; @@ -3574,18 +3579,28 @@ namespace TOB DECODE(OP_BlockedBuffs) { - DECODE_LENGTH_EXACT(structs::BlockedBuffs_Struct); - SETUP_DIRECT_DECODE(BlockedBuffs_Struct, structs::BlockedBuffs_Struct); + uint32 count = __packet->ReadUInt32(); + std::vector blocked_spell_ids; + blocked_spell_ids.reserve(count); + for (int i = 0; i < count; ++i) + blocked_spell_ids.push_back(static_cast(__packet->ReadUInt32())); - for (uint32 i = 0; i < BLOCKED_BUFF_COUNT; ++i) - emu->SpellID[i] = eq->SpellID[i]; + bool pet = __packet->ReadUInt8() == 1; + bool init = __packet->ReadUInt8() == 1; - IN(Count); - IN(Pet); - IN(Initialise); - IN(Flags); + __packet->SetReadPosition(0); // reset the packet read to pass it along - FINISH_DIRECT_DECODE(); + __packet->size = sizeof(BlockedBuffs_Struct); + __packet->pBuffer = new unsigned char[__packet->size]{}; + BlockedBuffs_Struct* emu = (BlockedBuffs_Struct*)__packet->pBuffer; + + memset(emu->SpellID, -1, sizeof(emu->SpellID)); + for (int i = 0; i < count; ++i) + emu->SpellID[i] = blocked_spell_ids[i]; + + emu->Count = count; + emu->Pet = pet; + emu->Initialise = init; } DECODE(OP_CastSpell) diff --git a/common/patches/tob_structs.h b/common/patches/tob_structs.h index 5f9803f3c..928e758e6 100644 --- a/common/patches/tob_structs.h +++ b/common/patches/tob_structs.h @@ -12,7 +12,7 @@ namespace TOB { static const uint32 MAX_PP_UNKNOWN_ABILITIES = 25; static const uint32 MAX_RECAST_TYPES = 25; static const uint32 MAX_ITEM_RECAST_TYPES = 100; - static const uint32 BLOCKED_BUFF_COUNT = 40; + static const uint32 BLOCKED_BUFF_COUNT = 60; // this might not be needed? static const uint32 BUFF_COUNT = 62; static const uint32 MAX_PP_LANGUAGE = 32; #pragma pack(1) @@ -274,7 +274,6 @@ namespace TOB { Unknown39, Unknown40, Unknown41, - Unknown42, Birthdate, EncounterLock }; @@ -288,6 +287,15 @@ namespace TOB { /*0024*/ }; + struct ChangeSize_Struct + { + /*00*/ uint32 EntityID; + /*04*/ float Size; + /*08*/ float CameraOffset; + /*12*/ float AnimationSpeedRelated; + /*16*/ + }; + struct Spawn_Struct_Bitfields { union { @@ -400,14 +408,14 @@ namespace TOB { /*056*/ float X; /*060*/ float Z; /*064*/ float Heading; - /*068*/ float DoorAngle; //not sure if this is actually a float; it might be a uint32 like DefaultDoorAngle + /*068*/ float DoorAngle; /*072*/ uint32 ScaleFactor; //rof2's size /*076*/ uint32 Unknown76; //client doesn't seem to read this /*080*/ uint8 Id; //doorid /*081*/ uint8 Type; //opentype /*082*/ uint8 State; //state_at_spawn /*083*/ uint8 DefaultState; //invert_state - /*084*/ int32 Param; //door_param + /*084*/ int32 Param; //door_param (spell id?) /*088*/ uint32 AdventureDoorId; /*092*/ uint32 DynDoorID; /*096*/ uint32 RealEstateDoorID; @@ -549,15 +557,6 @@ namespace TOB { /*024*/ }; - struct ChangeSize_Struct - { - /*00*/ uint32 EntityID; - /*04*/ float Size; - /*08*/ uint32 Unknown08; // Observed 0 - /*12*/ float Unknown12; // Observed 1.0f - /*16*/ - }; - struct SpawnHPUpdate_Struct { /*00*/ int16 spawn_id; @@ -837,15 +836,6 @@ namespace TOB { /*009*/ uint8 unknown009[3]; }; - struct BlockedBuffs_Struct - { - /*000*/ int32 SpellID[BLOCKED_BUFF_COUNT]; - /*120*/ uint32 Count; - /*124*/ uint8 Pet; - /*125*/ uint8 Initialise; - /*126*/ uint16 Flags; - }; - struct ZonePlayerToBind_Struct { //Same structure as the binds in PlayerProfile_Struct //Assembly calls the same function diff --git a/common/ruletypes.h b/common/ruletypes.h index fad7e2a96..131355c2c 100644 --- a/common/ruletypes.h +++ b/common/ruletypes.h @@ -349,7 +349,7 @@ RULE_STRING(World, MOTD, "", "Server MOTD sent on login, change from empty to ha RULE_STRING(World, Rules, "", "Server Rules, change from empty to have this be used instead of variables table 'rules' value, lines are pipe (|) separated, example: A|B|C") RULE_BOOL(World, EnableAutoLogin, false, "Enables or disables auto login of characters, allowing people to log characters in directly from loginserver to ingame") RULE_BOOL(World, EnablePVPRegions, true, "Enables or disables PVP Regions automatically setting your PVP flag") -RULE_STRING(World, SupportedClients, "RoF2", "Comma-delimited list of clients to restrict to. Supported values are Titanium | SoF | SoD | UF | RoF | RoF2. Example: Titanium,RoF2") +RULE_STRING(World, SupportedClients, "RoF2,TOB", "Comma-delimited list of clients to restrict to. Supported values are Titanium | SoF | SoD | UF | RoF | RoF2 | TOB. Example: Titanium,RoF2,TOB") RULE_STRING(World, CustomFilesKey, "", "Enable if the server requires custom files and sends a key to validate. Empty string to disable. Example: eqcustom_v1") RULE_STRING(World, CustomFilesUrl, "github.com/knervous/eqnexus/releases", "URL to display at character select if client is missing custom files") RULE_INT(World, CustomFilesAdminLevel, 20, "Admin level at which custom file key is not required when CustomFilesKey is specified") diff --git a/tob/opcodes.md b/tob/opcodes.md index 5337728e6..d21ad856f 100644 --- a/tob/opcodes.md +++ b/tob/opcodes.md @@ -6,631 +6,631 @@ Below is a status list for the 450 opcodes we currently use on the server for th ### World/Zone Opcode Implementation Status -| Opcode | Status | Notes | Working On | -|:----------------------------------|:--------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-----------| -| `OP_AAAction` | 🟡 Unverified | | | -| `OP_AAExpUpdate` | 🟡 Unverified | | | -| `OP_AcceptNewTask` | 🔴 Not-Set | | | -| `OP_AckPacket` | 🟢 Verified | | | -| `OP_Action` | 🟡 Unverified | | | -| `OP_Action2` | 🔴 Not-Set | | | -| `OP_AddNimbusEffect` | 🟡 Unverified | | | -| `OP_AdventureData` | 🔴 Not-Set | | | -| `OP_AdventureDetails` | 🔴 Not-Set | | | -| `OP_AdventureFinish` | 🔴 Not-Set | | | -| `OP_AdventureInfo` | 🔴 Not-Set | | | -| `OP_AdventureInfoRequest` | 🔴 Not-Set | | | -| `OP_AdventureLeaderboardReply` | 🔴 Not-Set | | | -| `OP_AdventureLeaderboardRequest` | 🔴 Not-Set | | | -| `OP_AdventureMerchantPurchase` | 🔴 Not-Set | | | -| `OP_AdventureMerchantRequest` | 🔴 Not-Set | | | -| `OP_AdventureMerchantResponse` | 🔴 Not-Set | | | -| `OP_AdventureMerchantSell` | 🔴 Not-Set | | | -| `OP_AdventurePointsUpdate` | 🔴 Not-Set | | | -| `OP_AdventureRequest` | 🔴 Not-Set | | | -| `OP_AdventureStatsReply` | 🔴 Not-Set | | | -| `OP_AdventureStatsRequest` | 🔴 Not-Set | | | -| `OP_AdventureUpdate` | 🔴 Not-Set | | | -| `OP_AggroMeterLockTarget` | 🔴 Not-Set | | | -| `OP_AggroMeterTargetInfo` | 🔴 Not-Set | | | -| `OP_AggroMeterUpdate` | 🔴 Not-Set | | | -| `OP_AltCurrency` | 🔴 Not-Set | | | -| `OP_AltCurrencyMerchantReply` | 🔴 Not-Set | | | -| `OP_AltCurrencyMerchantRequest` | 🔴 Not-Set | | | -| `OP_AltCurrencyPurchase` | 🔴 Not-Set | | | -| `OP_AltCurrencyReclaim` | 🔴 Not-Set | | | -| `OP_AltCurrencySell` | 🔴 Not-Set | | | -| `OP_AltCurrencySellSelection` | 🔴 Not-Set | | | -| `OP_Animation` | 🟡 Unverified | | | -| `OP_AnnoyingZoneUnknown` | 🔴 Not-Set | | | -| `OP_ApplyPoison` | 🟡 Unverified | | | -| `OP_ApproveName` | 🟡 Unverified | This takes multiple parameters from the client, and it can take multiple integer values from the server | | -| `OP_ApproveWorld` | 🔴 Not-Set | | | -| `OP_ApproveZone` | 🔴 Not-Set | | | -| `OP_Assist` | 🟡 Unverified | | | -| `OP_AssistGroup` | 🟡 Unverified | | | -| `OP_AugmentInfo` | 🟡 Unverified | | | -| `OP_AugmentItem` | 🟡 Unverified | | | -| `OP_AutoAttack` | 🟡 Unverified | | | -| `OP_AutoAttack2` | 🟡 Unverified | | | -| `OP_AutoFire` | 🟡 Unverified | | | -| `OP_Bandolier` | 🔴 Not-Set | | | -| `OP_BankerChange` | 🟡 Unverified | | | -| `OP_Barter` | 🔴 Not-Set | | | -| `OP_Bazaar` | 🔴 Not-Set | | | -| `OP_BazaarInspect` | 🔴 Not-Set | | | -| `OP_BazaarSearch` | 🔴 Not-Set | | | -| `OP_BecomeCorpse` | 🔴 Not-Set | | | -| `OP_BecomeTrader` | 🔴 Not-Set | | | -| `OP_Begging` | 🟡 Unverified | | | -| `OP_BeginCast` | 🟡 Unverified | | | -| `OP_Bind_Wound` | 🟡 Unverified | | | -| `OP_BlockedBuffs` | 🟡 Unverified | | | -| `OP_BoardBoat` | 🟡 Unverified | | | -| `OP_BookButton` | 🟡 Unverified | | | -| `OP_Buff` | 🟡 Unverified | | | -| `OP_BuffCreate` | 🟡 Unverified | | | -| `OP_BuffRemoveRequest` | 🟡 Unverified | | | -| `OP_Bug` | 🟡 Unverified | | | -| `OP_BuyerItems` | 🔴 Not-Set | | | -| `OP_CameraEffect` | 🟡 Unverified | | | -| `OP_Camp` | 🟡 Unverified | | | -| `OP_CancelSneakHide` | 🟡 Unverified | | | -| `OP_CancelTask` | 🔴 Not-Set | | | -| `OP_CancelTrade` | 🟡 Unverified | | | -| `OP_CashReward` | 🟡 Unverified | | | -| `OP_CastSpell` | 🟡 Unverified | | | -| `OP_ChangeSize` | 🟡 Unverified | | | -| `OP_ChannelMessage` | 🟡 Unverified | | | -| `OP_ChangePetName` | 🔴 Not-Set | | | -| `OP_CharacterCreate` | 🟢 Verified | Sends heroic type, can be used for something? | | -| `OP_CharacterCreateRequest` | 🟢 Verified | | | -| `OP_CharInventory` | 🟡 Unverified | | | -| `OP_Charm` | 🟡 Unverified | | | -| `OP_ChatMessage` | 🔴 Not-Set | | | -| `OP_ClearAA` | 🟡 Unverified | | | -| `OP_ClearBlockedBuffs` | 🟡 Unverified | | | -| `OP_ClearLeadershipAbilities` | 🔴 Not-Set | | | -| `OP_ClearNPCMarks` | 🔴 Not-Set | | | -| `OP_ClearObject` | 🟡 Unverified | | | -| `OP_ClearSurname` | 🔴 Not-Set | | | -| `OP_ClickDoor` | 🟡 Unverified | | | -| `OP_ClickObject` | 🟡 Unverified | | | -| `OP_ClickObjectAction` | 🟡 Unverified | | | -| `OP_ClientError` | 🔴 Not-Set | | | -| `OP_ClientReady` | 🟡 Unverified | | | -| `OP_ClientTimeStamp` | 🔴 Not-Set | | | -| `OP_ClientUpdate` | 🟡 Unverified | | | -| `OP_CloseContainer` | 🔴 Not-Set | | | -| `OP_CloseTributeMaster` | 🔴 Not-Set | | | -| `OP_ColoredText` | 🟡 Unverified | | | -| `OP_CombatAbility` | 🟡 Unverified | | | -| `OP_Command` | 🔴 Not-Set | | | -| `OP_CompletedTasks` | 🔴 Not-Set | | | -| `OP_ConfirmDelete` | 🟡 Unverified | | | -| `OP_Consent` | 🟡 Unverified | | | -| `OP_ConsentDeny` | 🟡 Unverified | | | -| `OP_ConsentResponse` | 🟡 Unverified | | | -| `OP_Consider` | 🟡 Unverified | | | -| `OP_ConsiderCorpse` | 🟡 Unverified | | | -| `OP_Consume` | 🟡 Unverified | | | -| `OP_ControlBoat` | 🟡 Unverified | | | -| `OP_CorpseDrag` | 🟡 Unverified | | | -| `OP_CorpseDrop` | 🟡 Unverified | | | -| `OP_CrashDump` | 🔴 Not-Set | | | -| `OP_CrystalCountUpdate` | 🔴 Not-Set | | | -| `OP_CrystalCreate` | 🔴 Not-Set | | | -| `OP_CrystalReclaim` | 🔴 Not-Set | | | -| `OP_CustomTitles` | 🔴 Not-Set | | | -| `OP_Damage` | 🟡 Unverified | | | -| `OP_Death` | 🟡 Unverified | | | -| `OP_DelegateAbility` | 🔴 Not-Set | | | -| `OP_DeleteCharacter` | 🟢 Verified | | | -| `OP_DeleteCharge` | 🟡 Unverified | | | -| `OP_DeleteItem` | 🟡 Unverified | | | -| `OP_DeletePetition` | 🔴 Not-Set | | | -| `OP_DeleteSpawn` | 🟡 Unverified | | | -| `OP_DeleteSpell` | 🟡 Unverified | | | -| `OP_DenyResponse` | 🟡 Unverified | | | -| `OP_Disarm` | 🟡 Unverified | | | -| `OP_DisarmTraps` | 🟡 Unverified | | | -| `OP_DisciplineTimer` | 🟡 Unverified | | | -| `OP_DisciplineUpdate` | 🟡 Unverified | | | -| `OP_DiscordMerchantInventory` | 🔴 Not-Set | | | -| `OP_DoGroupLeadershipAbility` | 🔴 Not-Set | | | -| `OP_DuelDecline` | 🔴 Not-Set | | | -| `OP_DuelAccept` | 🔴 Not-Set | | | -| `OP_DumpName` | 🔴 Not-Set | | | -| `OP_Dye` | 🔴 Not-Set | | | -| `OP_DynamicWall` | 🔴 Not-Set | | | -| `OP_DzAddPlayer` | 🔴 Not-Set | | | -| `OP_DzChooseZone` | 🔴 Not-Set | | | -| `OP_DzChooseZoneReply` | 🔴 Not-Set | | | -| `OP_DzCompass` | 🔴 Not-Set | | | -| `OP_DzExpeditionEndsWarning` | 🔴 Not-Set | | | -| `OP_DzExpeditionInfo` | 🔴 Not-Set | | | -| `OP_DzExpeditionInvite` | 🔴 Not-Set | | | -| `OP_DzExpeditionInviteResponse` | 🔴 Not-Set | | | -| `OP_DzExpeditionLockoutTimers` | 🔴 Not-Set | | | -| `OP_DzListTimers` | 🔴 Not-Set | | | -| `OP_DzMakeLeader` | 🔴 Not-Set | | | -| `OP_DzMemberList` | 🔴 Not-Set | | | -| `OP_DzMemberListName` | 🔴 Not-Set | | | -| `OP_DzMemberListStatus` | 🔴 Not-Set | | | -| `OP_DzPlayerList` | 🔴 Not-Set | | | -| `OP_DzQuit` | 🔴 Not-Set | | | -| `OP_DzRemovePlayer` | 🔴 Not-Set | | | -| `OP_DzSetLeaderName` | 🔴 Not-Set | | | -| `OP_DzSwapPlayer` | 🔴 Not-Set | | | -| `OP_Emote` | 🔴 Not-Set | | | -| `OP_EndLootRequest` | 🟡 Unverified | | | -| `OP_EnduranceUpdate` | 🔴 Not-Set | | | -| `OP_EnterChat` | 🔴 Not-Set | | | -| `OP_EnterWorld` | 🟢 Verified | | | -| `OP_EnvDamage` | 🟡 Unverified | | | -| `OP_EvolveItem` | 🔴 Not-Set | | | -| `OP_ExpansionInfo` | 🟢 Verified | Updated from u32 to u64 and works now | | -| `OP_ExpUpdate` | 🟡 Unverified | | | -| `OP_FaceChange` | 🔴 Not-Set | | | -| `OP_Feedback` | 🔴 Not-Set | | | -| `OP_FeignDeath` | 🟡 Unverified | | | -| `OP_FellowshipUpdate` | 🔴 Not-Set | | | -| `OP_FindPersonReply` | 🔴 Not-Set | | | -| `OP_FindPersonRequest` | 🔴 Not-Set | | | -| `OP_FinishTrade` | 🟡 Unverified | | | -| `OP_FinishWindow` | 🟡 Unverified | | | -| `OP_FinishWindow2` | 🟡 Unverified | | | -| `OP_Fishing` | 🟡 Unverified | | | -| `OP_Fling` | 🟡 Unverified | | | -| `OP_FloatListThing` | 🟢 Verified | Movement History. Sent from client, but emu doesn't use it so setting it as varified. Reference is 0x1402FFAD0 | | -| `OP_Forage` | 🟡 Unverified | | | -| `OP_ForceFindPerson` | 🔴 Not-Set | | | -| `OP_FormattedMessage` | 🟡 Unverified | | | -| `OP_FriendsWho` | 🟡 Unverified | | | -| `OP_GetGuildMOTD` | 🔴 Not-Set | | | -| `OP_GetGuildMOTDReply` | 🔴 Not-Set | | | -| `OP_GetGuildsList` | 🔴 Not-Set | | | -| `OP_GiveMoney` | 🔴 Not-Set | | | -| `OP_GMApproval` | 🔴 Not-Set | | | -| `OP_GMBecomeNPC` | 🔴 Not-Set | | | -| `OP_GMDelCorpse` | 🔴 Not-Set | | | -| `OP_GMEmoteZone` | 🔴 Not-Set | | | -| `OP_GMEndTraining` | 🟡 Unverified | | | -| `OP_GMEndTrainingResponse` | 🔴 Not-Set | | | -| `OP_GMFind` | 🔴 Not-Set | | | -| `OP_GMGoto` | 🔴 Not-Set | | | -| `OP_GMHideMe` | 🔴 Not-Set | | | -| `OP_GMKick` | 🔴 Not-Set | | | -| `OP_GMKill` | 🔴 Not-Set | | | -| `OP_GMLastName` | 🔴 Not-Set | | | -| `OP_GMNameChange` | 🔴 Not-Set | | | -| `OP_GMSearchCorpse` | 🔴 Not-Set | | | -| `OP_GMServers` | 🔴 Not-Set | | | -| `OP_GMSummon` | 🔴 Not-Set | | | -| `OP_GMToggle` | 🔴 Not-Set | | | -| `OP_GMTraining` | 🟡 Unverified | | | -| `OP_GMTrainSkill` | 🟡 Unverified | | | -| `OP_GMTrainSkillConfirm` | 🟡 Unverified | | | -| `OP_GMZoneRequest` | 🔴 Not-Set | | | -| `OP_GMZoneRequest2` | 🔴 Not-Set | | | -| `OP_GroundSpawn` | 🟡 Unverified | | | -| `OP_GroupAcknowledge` | 🔴 Not-Set | | | -| `OP_GroupCancelInvite` | 🔴 Not-Set | | | -| `OP_GroupDelete` | 🔴 Not-Set | | | -| `OP_GroupDisband` | 🟡 Unverified | | | -| `OP_GroupDisbandOther` | 🔴 Not-Set | | | -| `OP_GroupDisbandYou` | 🔴 Not-Set | | | -| `OP_GroupFollow` | 🔴 Not-Set | | | -| `OP_GroupFollow2` | 🔴 Not-Set | | | -| `OP_GroupInvite` | 🟡 Unverified | | | -| `OP_GroupInvite2` | 🔴 Not-Set | | | -| `OP_GroupLeaderChange` | 🔴 Not-Set | | | -| `OP_GroupLeadershipAAUpdate` | 🔴 Not-Set | | | -| `OP_GroupMakeLeader` | 🔴 Not-Set | | | -| `OP_GroupMentor` | 🔴 Not-Set | | | -| `OP_GroupRoles` | 🔴 Not-Set | | | -| `OP_GroupUpdate` | 🔴 Not-Set | | | -| `OP_GroupUpdateB` | 🔴 Not-Set | | | -| `OP_GroupUpdateLeaderAA` | 🔴 Not-Set | | | -| `OP_GuildBank` | 🔴 Not-Set | | | -| `OP_GuildBankItemList` | 🔴 Not-Set | | | -| `OP_GuildCreate` | 🔴 Not-Set | | | -| `OP_GuildDelete` | 🔴 Not-Set | | | -| `OP_GuildDeleteGuild` | 🔴 Not-Set | | | -| `OP_GuildDemote` | 🔴 Not-Set | | | -| `OP_GuildInvite` | 🔴 Not-Set | | | -| `OP_GuildInviteAccept` | 🔴 Not-Set | | | -| `OP_GuildLeader` | 🔴 Not-Set | | | -| `OP_GuildManageAdd` | 🔴 Not-Set | | | -| `OP_GuildManageBanker` | 🔴 Not-Set | | | -| `OP_GuildManageRemove` | 🔴 Not-Set | | | -| `OP_GuildManageStatus` | 🔴 Not-Set | | | -| `OP_GuildMemberLevelUpdate` | 🔴 Not-Set | | | -| `OP_GuildMemberList` | 🔴 Not-Set | | | -| `OP_GuildMemberUpdate` | 🔴 Not-Set | | | -| `OP_GuildMemberLevel` | 🔴 Not-Set | | | -| `OP_GuildMemberRankAltBanker` | 🔴 Not-Set | | | -| `OP_GuildMemberPublicNote` | 🔴 Not-Set | | | -| `OP_GuildMemberAdd` | 🔴 Not-Set | | | -| `OP_GuildMemberRename` | 🔴 Not-Set | | | -| `OP_GuildMemberDelete` | 🔴 Not-Set | | | -| `OP_GuildMemberDetails` | 🔴 Not-Set | | | -| `OP_GuildRenameGuild` | 🔴 Not-Set | | | -| `OP_GuildMOTD` | 🔴 Not-Set | | | -| `OP_GuildPeace` | 🔴 Not-Set | | | -| `OP_GuildPromote` | 🔴 Not-Set | | | -| `OP_GuildPublicNote` | 🔴 Not-Set | | | -| `OP_GuildRemove` | 🔴 Not-Set | | | -| `OP_GuildSelectTribute` | 🔴 Not-Set | | | -| `OP_GuildModifyBenefits` | 🔴 Not-Set | | | -| `OP_GuildTributeToggleReq` | 🔴 Not-Set | | | -| `OP_GuildTributeToggleReply` | 🔴 Not-Set | | | -| `OP_GuildOptInOut` | 🔴 Not-Set | | | -| `OP_GuildSaveActiveTributes` | 🔴 Not-Set | | | -| `OP_GuildSendActiveTributes` | 🔴 Not-Set | | | -| `OP_GuildTributeFavorAndTimer` | 🔴 Not-Set | | | -| `OP_GuildsList` | 🔴 Not-Set | | | -| `OP_GuildStatus` | 🔴 Not-Set | | | -| `OP_GuildTributeInfo` | 🔴 Not-Set | | | -| `OP_GuildUpdate` | 🔴 Not-Set | | | -| `OP_GuildTributeDonateItem` | 🔴 Not-Set | | | -| `OP_GuildTributeDonatePlat` | 🔴 Not-Set | | | -| `OP_GuildWar` | 🔴 Not-Set | | | -| `OP_Heartbeat` | 🔴 Not-Set | | | -| `OP_Hide` | 🟡 Unverified | | | -| `OP_HideCorpse` | 🟡 Unverified | | | -| `OP_HPUpdate` | 🟡 Unverified | | | -| `OP_Illusion` | 🟡 Unverified | | | -| `OP_IncreaseStats` | 🟡 Unverified | | | -| `OP_InitialHPUpdate` | 🔴 Not-Set | | | -| `OP_InitialMobHealth` | 🔴 Not-Set | | | -| `OP_InspectAnswer` | 🔴 Not-Set | | | -| `OP_InspectBuffs` | 🔴 Not-Set | | | -| `OP_InspectMessageUpdate` | 🔴 Not-Set | | | -| `OP_InspectRequest` | 🔴 Not-Set | | | -| `OP_InstillDoubt` | 🟡 Unverified | | | -| `OP_InterruptCast` | 🟡 Unverified | | | -| `OP_InvokeChangePetName` | 🔴 Not-Set | | | -| `OP_InvokeChangePetNameImmediate` | 🔴 Not-Set | | | -| `OP_InvokeNameChangeImmediate` | 🔴 Not-Set | | | -| `OP_InvokeNameChangeLazy` | 🔴 Not-Set | | | -| `OP_ItemLinkClick` | 🔴 Not-Set | | | -| `OP_ItemLinkResponse` | 🔴 Not-Set | | | -| `OP_ItemLinkText` | 🔴 Not-Set | | | -| `OP_ItemName` | 🔴 Not-Set | | | -| `OP_ItemPacket` | 🟡 Unverified | | | -| `OP_ItemPreview` | 🔴 Not-Set | | | -| `OP_ItemPreviewRequest` | 🔴 Not-Set | | | -| `OP_ItemRecastDelay` | 🟡 Unverified | | | -| `OP_ItemVerifyReply` | 🟡 Unverified | | | -| `OP_ItemVerifyRequest` | 🟡 Unverified | | | -| `OP_ItemViewUnknown` | 🔴 Not-Set | | | -| `OP_Jump` | 🟡 Unverified | | | -| `OP_KeyRing` | 🔴 Not-Set | | | -| `OP_KickPlayers` | 🟡 Unverified | | | -| `OP_KnowledgeBase` | 🔴 Not-Set | | | -| `OP_LDoNButton` | 🔴 Not-Set | | | -| `OP_LDoNDisarmTraps` | 🔴 Not-Set | | | -| `OP_LDoNInspect` | 🔴 Not-Set | | | -| `OP_LDoNOpen` | 🟡 Unverified | | | -| `OP_LDoNPickLock` | 🟡 Unverified | | | -| `OP_LDoNSenseTraps` | 🟡 Unverified | | | -| `OP_LeadershipExpToggle` | 🔴 Not-Set | | | -| `OP_LeadershipExpUpdate` | 🔴 Not-Set | | | -| `OP_LeaveAdventure` | 🔴 Not-Set | | | -| `OP_LeaveBoat` | 🟡 Unverified | | | -| `OP_LevelAppearance` | 🟡 Unverified | | | -| `OP_LevelUpdate` | 🟢 Verified | | | -| `OP_LFGAppearance` | 🔴 Not-Set | | | -| `OP_LFGCommand` | 🔴 Not-Set | | | -| `OP_LFGGetMatchesRequest` | 🔴 Not-Set | | | -| `OP_LFGGetMatchesResponse` | 🔴 Not-Set | | | -| `OP_LFGResponse` | 🔴 Not-Set | | | -| `OP_LFGuild` | 🔴 Not-Set | | | -| `OP_LFPCommand` | 🔴 Not-Set | | | -| `OP_LFPGetMatchesRequest` | 🔴 Not-Set | | | -| `OP_LFPGetMatchesResponse` | 🔴 Not-Set | | | -| `OP_LinkedReuse` | 🟡 Unverified | | | -| `OP_LoadSpellSet` | 🔴 Not-Set | | | -| `OP_LocInfo` | 🔴 Not-Set | | | -| `OP_LockoutTimerInfo` | 🔴 Not-Set | | | -| `OP_Login` | 🔴 Not-Set | | | -| `OP_LoginAccepted` | 🔴 Not-Set | | | -| `OP_LoginComplete` | 🔴 Not-Set | | | -| `OP_LoginExpansionPacketData` | 🔴 Not-Set | | | -| `OP_LoginUnknown1` | 🔴 Not-Set | | | -| `OP_LoginUnknown2` | 🔴 Not-Set | | | -| `OP_Logout` | 🟡 Unverified | | | -| `OP_LogoutReply` | 🔴 Not-Set | | | -| `OP_LogServer` | 🟢 Verified | Mostly unused values | | -| `OP_LootComplete` | 🟡 Unverified | | | -| `OP_LootItem` | 🟡 Unverified | | | -| `OP_LootRequest` | 🟡 Unverified | | | -| `OP_ManaChange` | 🟡 Unverified | | | -| `OP_ManaUpdate` | 🔴 Not-Set | | | -| `OP_MarkNPC` | 🔴 Not-Set | | | -| `OP_MarkRaidNPC` | 🔴 Not-Set | | | -| `OP_Marquee` | 🟡 Unverified | | | -| `OP_MemorizeSpell` | 🟡 Unverified | | | -| `OP_Mend` | 🟡 Unverified | | | -| `OP_MendHPUpdate` | 🔴 Not-Set | | | -| `OP_MercenaryAssign` | 🔴 Not-Set | | | -| `OP_MercenaryCommand` | 🔴 Not-Set | | | -| `OP_MercenaryDataRequest` | 🔴 Not-Set | | | -| `OP_MercenaryDataResponse` | 🔴 Not-Set | | | -| `OP_MercenaryDataUpdate` | 🔴 Not-Set | | | -| `OP_MercenaryDataUpdateRequest` | 🔴 Not-Set | | | -| `OP_MercenaryDismiss` | 🔴 Not-Set | | | -| `OP_MercenaryHire` | 🔴 Not-Set | | | -| `OP_MercenarySuspendRequest` | 🔴 Not-Set | | | -| `OP_MercenarySuspendResponse` | 🔴 Not-Set | | | -| `OP_MercenaryTimer` | 🔴 Not-Set | | | -| `OP_MercenaryTimerRequest` | 🔴 Not-Set | | | -| `OP_MercenaryUnknown1` | 🔴 Not-Set | | | -| `OP_MercenaryUnsuspendResponse` | 🔴 Not-Set | | | -| `OP_MerchantBulkItems` | 🔴 Not-Set | | | -| `OP_MobEnduranceUpdate` | 🔴 Not-Set | | | -| `OP_MobHealth` | 🟡 Unverified | | | -| `OP_MobManaUpdate` | 🔴 Not-Set | | | -| `OP_MobRename` | 🔴 Not-Set | | | -| `OP_MobUpdate` | 🔴 Not-Set | | | -| `OP_MoneyOnCorpse` | 🟡 Unverified | | | -| `OP_MoneyUpdate` | 🟡 Unverified | | | -| `OP_MOTD` | 🟢 Verified | | | -| `OP_MoveCoin` | 🟡 Unverified | | | -| `OP_MoveDoor` | 🟡 Unverified | | | -| `OP_MoveItem` | 🟡 Unverified | | | -| `OP_MoveMultipleItems` | 🟡 Unverified | | | -| `OP_MoveLogDisregard` | 🔴 Not-Set | | | -| `OP_MoveLogRequest` | 🔴 Not-Set | | | -| `OP_MultiLineMsg` | 🔴 Not-Set | | | -| `OP_NewSpawn` | 🟢 Verified | Deprecated in the client, already handled in emu | | -| `OP_NewTitlesAvailable` | 🔴 Not-Set | | | -| `OP_NewZone` | 🟢 Verified | | | -| `OP_NPCMoveUpdate` | 🔴 Not-Set | | | -| `OP_OnLevelMessage` | 🟡 Unverified | | | -| `OP_OpenContainer` | 🟡 Unverified | | | -| `OP_OpenDiscordMerchant` | 🔴 Not-Set | | | -| `OP_OpenGuildTributeMaster` | 🔴 Not-Set | | | -| `OP_OpenInventory` | 🔴 Not-Set | | | -| `OP_OpenTributeMaster` | 🔴 Not-Set | | | -| `OP_PDeletePetition` | 🔴 Not-Set | | | -| `OP_PetBuffWindow` | 🔴 Not-Set | | | -| `OP_PetCommands` | 🔴 Not-Set | | | -| `OP_PetCommandState` | 🔴 Not-Set | | | -| `OP_PetHoTT` | 🔴 Not-Set | | | -| `OP_Petition` | 🔴 Not-Set | | | -| `OP_PetitionBug` | 🔴 Not-Set | | | -| `OP_PetitionCheckIn` | 🔴 Not-Set | | | -| `OP_PetitionCheckout` | 🔴 Not-Set | | | -| `OP_PetitionCheckout2` | 🔴 Not-Set | | | -| `OP_PetitionDelete` | 🔴 Not-Set | | | -| `OP_PetitionQue` | 🔴 Not-Set | | | -| `OP_PetitionRefresh` | 🔴 Not-Set | | | -| `OP_PetitionResolve` | 🔴 Not-Set | | | -| `OP_PetitionSearch` | 🔴 Not-Set | | | -| `OP_PetitionSearchResults` | 🔴 Not-Set | | | -| `OP_PetitionSearchText` | 🔴 Not-Set | | | -| `OP_PetitionUnCheckout` | 🔴 Not-Set | | | -| `OP_PetitionUpdate` | 🔴 Not-Set | | | -| `OP_PickPocket` | 🟡 Unverified | | | -| `OP_PickZone` | 🔴 Not-Set | | | -| `OP_PickZoneWindow` | 🔴 Not-Set | | | -| `OP_PlayerProfile` | 🟢 Verified | | | -| `OP_PlayerStateAdd` | 🟡 Unverified | | | -| `OP_PlayerStateRemove` | 🟡 Unverified | | | -| `OP_PlayEverquestRequest` | 🔴 Not-Set | | | -| `OP_PlayEverquestResponse` | 🔴 Not-Set | | | -| `OP_PlayMP3` | 🟡 Unverified | | | -| `OP_Poll` | 🔴 Not-Set | | | -| `OP_PollResponse` | 🔴 Not-Set | | | -| `OP_PopupResponse` | 🟡 Unverified | | | -| `OP_PostEnterWorld` | 🟢 Verified | | | -| `OP_PotionBelt` | 🔴 Not-Set | | | -| `OP_PreLogoutReply` | 🔴 Not-Set | | | -| `OP_PurchaseLeadershipAA` | 🔴 Not-Set | | | -| `OP_PVPLeaderBoardDetailsReply` | 🔴 Not-Set | | | -| `OP_PVPLeaderBoardDetailsRequest` | 🔴 Not-Set | | | -| `OP_PVPLeaderBoardReply` | 🔴 Not-Set | | | -| `OP_PVPLeaderBoardRequest` | 🔴 Not-Set | | | -| `OP_PVPStats` | 🔴 Not-Set | | | -| `OP_QueryResponseThing` | 🔴 Not-Set | | | -| `OP_QueryUCSServerStatus` | 🟡 Unverified | | | -| `OP_RaidDelegateAbility` | 🔴 Not-Set | | | -| `OP_RaidClearNPCMarks` | 🔴 Not-Set | | | -| `OP_RaidInvite` | 🔴 Not-Set | | | -| `OP_RaidJoin` | 🔴 Not-Set | | | -| `OP_RaidUpdate` | 🔴 Not-Set | | | -| `OP_RandomNameGenerator` | 🟢 Verified | The client no longer sends this packet (random name generation is done entirely in the client). The client will still accept this packet to set name (emu doesn't do this, but it's always been supported) | | -| `OP_RandomReply` | 🟡 Unverified | | | -| `OP_RandomReq` | 🟡 Unverified | | | -| `OP_ReadBook` | 🟡 Unverified | | | -| `OP_RecipeAutoCombine` | 🟡 Unverified | | | -| `OP_RecipeDetails` | 🟡 Unverified | | | -| `OP_RecipeReply` | 🟡 Unverified | | | -| `OP_RecipesFavorite` | 🟡 Unverified | | | -| `OP_RecipesSearch` | 🟡 Unverified | | | -| `OP_ReclaimCrystals` | 🔴 Not-Set | | | -| `OP_ReloadUI` | 🔴 Not-Set | | | -| `OP_RemoveAllDoors` | 🟡 Unverified | | | -| `OP_RemoveBlockedBuffs` | 🟡 Unverified | | | -| `OP_RemoveNimbusEffect` | 🟡 Unverified | | | -| `OP_RemoveTrap` | 🔴 Not-Set | | | -| `OP_Report` | 🟡 Unverified | | | -| `OP_ReqClientSpawn` | 🟢 Verified | | | -| `OP_ReqNewZone` | 🟢 Verified | Client does not send this (in LS or TOB), but it does receive it. emu does not send it | | -| `OP_RequestClientZoneChange` | 🟢 Verified | parity with RoF2, there's a string that gets passed to teleport at the end that's not known | | -| `OP_RequestDuel` | 🔴 Not-Set | | | -| `OP_RequestGuildTributes` | 🔴 Not-Set | | | -| `OP_RequestKnowledgeBase` | 🔴 Not-Set | | | -| `OP_RequestTitles` | 🔴 Not-Set | | | -| `OP_RespawnWindow` | 🟡 Unverified | | | -| `OP_RespondAA` | 🟡 Unverified | | | -| `OP_RestState` | 🟡 Unverified | | | -| `OP_Rewind` | 🟡 Unverified | | | -| `OP_RezzAnswer` | 🔴 Not-Set | | | -| `OP_RezzComplete` | 🔴 Not-Set | | | -| `OP_RezzRequest` | 🔴 Not-Set | | | -| `OP_Sacrifice` | 🟡 Unverified | | | -| `OP_SafeFallSuccess` | 🟡 Unverified | | | -| `OP_SafePoint` | 🔴 Not-Set | | | -| `OP_Save` | 🟡 Unverified | | | -| `OP_SaveOnZoneReq` | 🟡 Unverified | | | -| `OP_SelectTribute` | 🔴 Not-Set | | | -| `OP_SendAAStats` | 🟡 Unverified | | | -| `OP_SendAATable` | 🟡 Unverified | | | -| `OP_SendCharInfo` | 🟢 Verified | | | -| `OP_SendExpZonein` | 🟡 Unverified | | | -| `OP_SendFindableNPCs` | 🔴 Not-Set | | | -| `OP_SendGuildTributes` | 🔴 Not-Set | | | -| `OP_SendLoginInfo` | 🟢 Verified | | | -| `OP_SendMaxCharacters` | 🟢 Verified | | | -| `OP_SendMembership` | 🟢 Verified | | | -| `OP_SendMembershipDetails` | 🟢 Verified | The struct is correct, will need reversing for actual option keys/values | | -| `OP_SendSystemStats` | 🔴 Not-Set | | | -| `OP_SendTitleList` | 🔴 Not-Set | | | -| `OP_SendTributes` | 🔴 Not-Set | | | -| `OP_SendZonepoints` | 🟡 Unverified | | | -| `OP_SenseHeading` | 🟡 Unverified | | | -| `OP_SenseTraps` | 🟡 Unverified | | | -| `OP_ServerListRequest` | 🔴 Not-Set | | | -| `OP_ServerListResponse` | 🔴 Not-Set | | | -| `OP_SessionReady` | 🔴 Not-Set | | | -| `OP_SetChatServer` | 🔴 Not-Set | | | -| `OP_SetChatServer2` | 🟢 Verified | | | -| `OP_SetFace` | 🔴 Not-Set | | | -| `OP_SetGroupTarget` | 🔴 Not-Set | | | -| `OP_SetGuildMOTD` | 🔴 Not-Set | | | -| `OP_SetGuildRank` | 🔴 Not-Set | | | -| `OP_SetRunMode` | 🟡 Unverified | | | -| `OP_SetServerFilter` | 🟡 Unverified | | | -| `OP_SetStartCity` | 🔴 Not-Set | | | -| `OP_SetTitle` | 🔴 Not-Set | | | -| `OP_SetTitleReply` | 🔴 Not-Set | | | -| `OP_SharedTaskMemberList` | 🔴 Not-Set | | | -| `OP_SharedTaskAddPlayer` | 🔴 Not-Set | | | -| `OP_SharedTaskRemovePlayer` | 🔴 Not-Set | | | -| `OP_SharedTaskMakeLeader` | 🔴 Not-Set | | | -| `OP_SharedTaskMemberInvite` | 🔴 Not-Set | | | -| `OP_SharedTaskInvite` | 🔴 Not-Set | | | -| `OP_SharedTaskInviteResponse` | 🔴 Not-Set | | | -| `OP_SharedTaskAcceptNew` | 🔴 Not-Set | | | -| `OP_SharedTaskMemberChange` | 🔴 Not-Set | | | -| `OP_SharedTaskPlayerList` | 🔴 Not-Set | | | -| `OP_SharedTaskSelectWindow` | 🔴 Not-Set | | | -| `OP_SharedTaskQuit` | 🔴 Not-Set | | | -| `OP_TaskTimers` | 🔴 Not-Set | | | -| `OP_Shielding` | 🔴 Not-Set | | | -| `OP_ShopDelItem` | 🟡 Unverified | | | -| `OP_ShopEnd` | 🟡 Unverified | | | -| `OP_ShopEndConfirm` | 🟡 Unverified | | | -| `OP_ShopItem` | 🔴 Not-Set | | | -| `OP_ShopPlayerBuy` | 🟡 Unverified | | | -| `OP_ShopPlayerSell` | 🟡 Unverified | | | -| `OP_ShopSendParcel` | 🟡 Unverified | | | -| `OP_ShopDeleteParcel` | 🟡 Unverified | | | -| `OP_ShopRespondParcel` | 🔴 Not-Set | | | -| `OP_ShopRetrieveParcel` | 🟡 Unverified | | | -| `OP_ShopParcelIcon` | 🟡 Unverified | | | -| `OP_ShopRequest` | 🟡 Unverified | | | -| `OP_SimpleMessage` | 🟡 Unverified | | | -| `OP_SkillUpdate` | 🟡 Unverified | | | -| `OP_Sneak` | 🟡 Unverified | | | -| `OP_Some3ByteHPUpdate` | 🔴 Not-Set | | | -| `OP_Some6ByteHPUpdate` | 🔴 Not-Set | | | -| `OP_SomeItemPacketMaybe` | 🔴 Not-Set | | | -| `OP_Sound` | 🟡 Unverified | | | -| `OP_SpawnAppearance` | 🟡 Unverified | | | -| `OP_SpawnDoor` | 🟡 Unverified | | | -| `OP_SpawnPositionUpdate` | 🔴 Not-Set | | | -| `OP_SpecialMesg` | 🟡 Unverified | | | -| `OP_SpellEffect` | 🟡 Unverified | | | -| `OP_Split` | 🟡 Unverified | | | -| `OP_Stamina` | 🟢 Verified | These values are 0-32k instead of 0-127 | | -| `OP_Stun` | 🟡 Unverified | | | -| `OP_Surname` | 🔴 Not-Set | | | -| `OP_SwapSpell` | 🟡 Unverified | | | -| `OP_SystemFingerprint` | 🔴 Not-Set | | | -| `OP_TargetBuffs` | 🔴 Not-Set | | | -| `OP_TargetCommand` | 🟡 Unverified | | | -| `OP_TargetHoTT` | 🔴 Not-Set | | | -| `OP_TargetMouse` | 🟡 Unverified | | | -| `OP_TargetReject` | 🔴 Not-Set | | | -| `OP_TaskActivity` | 🔴 Not-Set | | | -| `OP_TaskActivityComplete` | 🔴 Not-Set | | | -| `OP_TaskDescription` | 🔴 Not-Set | | | -| `OP_TaskHistoryReply` | 🔴 Not-Set | | | -| `OP_TaskHistoryRequest` | 🔴 Not-Set | | | -| `OP_TaskRequestTimer` | 🔴 Not-Set | | | -| `OP_TaskSelectWindow` | 🔴 Not-Set | | | -| `OP_Taunt` | 🟡 Unverified | | | -| `OP_TestBuff` | 🔴 Not-Set | | | -| `OP_TGB` | 🔴 Not-Set | | | -| `OP_TimeOfDay` | 🟢 Verified | | | -| `OP_Track` | 🟡 Unverified | | | -| `OP_TrackTarget` | 🟡 Unverified | | | -| `OP_TrackUnknown` | 🟡 Unverified | | | -| `OP_TradeAcceptClick` | 🟡 Unverified | | | -| `OP_TradeBusy` | 🟡 Unverified | | | -| `OP_TradeCoins` | 🟡 Unverified | | | -| `OP_TradeMoneyUpdate` | 🟡 Unverified | | | -| `OP_Trader` | 🔴 Not-Set | | | -| `OP_TraderBulkSend` | 🔴 Not-Set | | | -| `OP_TraderBuy` | 🔴 Not-Set | | | -| `OP_TraderDelItem` | 🔴 Not-Set | | | -| `OP_TradeRequest` | 🟡 Unverified | | | -| `OP_TradeRequestAck` | 🟡 Unverified | | | -| `OP_TraderItemUpdate` | 🔴 Not-Set | | | -| `OP_TraderShop` | 🔴 Not-Set | | | -| `OP_TradeSkillCombine` | 🟡 Unverified | | | -| `OP_TradeSkillRecipeInspect` | 🔴 Not-Set | | | -| `OP_Translocate` | 🟡 Unverified | | | -| `OP_TributeInfo` | 🔴 Not-Set | | | -| `OP_TributeItem` | 🔴 Not-Set | | | -| `OP_TributeMoney` | 🔴 Not-Set | | | -| `OP_TributeNPC` | 🔴 Not-Set | | | -| `OP_TributePointUpdate` | 🔴 Not-Set | | | -| `OP_TributeTimer` | 🔴 Not-Set | | | -| `OP_TributeToggle` | 🔴 Not-Set | | | -| `OP_TributeUpdate` | 🔴 Not-Set | | | -| `OP_Untargetable` | 🟡 Unverified | | | -| `OP_UpdateAA` | 🟡 Unverified | | | -| `OP_UpdateAura` | 🔴 Not-Set | | | -| `OP_UpdateLeadershipAA` | 🔴 Not-Set | | | -| `OP_VetClaimReply` | 🔴 Not-Set | | | -| `OP_VetClaimRequest` | 🔴 Not-Set | | | -| `OP_VetRewardsAvaliable` | 🔴 Not-Set | | | -| `OP_VoiceMacroIn` | 🟡 Unverified | | | -| `OP_VoiceMacroOut` | 🟡 Unverified | | | -| `OP_WeaponEquip1` | 🔴 Not-Set | | | -| `OP_WearChange` | 🟡 Unverified | | | -| `OP_Weather` | 🟡 Unverified | | | -| `OP_Weblink` | 🟡 Unverified | | | -| `OP_WhoAllRequest` | 🟡 Unverified | | | -| `OP_WhoAllResponse` | 🟡 Unverified | | | -| `OP_World_Client_CRC1` | 🟢 Verified | | | -| `OP_World_Client_CRC2` | 🟢 Verified | | | -| `OP_World_Client_CRC3` | 🟢 Verified | | | -| `OP_WorldClientReady` | 🟢 Verified | | | -| `OP_WorldComplete` | 🟢 Verified | | | -| `OP_WorldLogout` | 🔴 Not-Set | | | -| `OP_WorldObjectsSent` | 🟡 Unverified | | | -| `OP_WorldUnknown001` | 🟢 Verified | SetServerTime. emu doesn't currently send it so setting it to verified, but the reference is 0x140292550 | | -| `OP_XTargetAutoAddHaters` | 🔴 Not-Set | | | -| `OP_XTargetOpen` | 🔴 Not-Set | | | -| `OP_XTargetOpenResponse` | 🔴 Not-Set | | | -| `OP_XTargetRequest` | 🔴 Not-Set | | | -| `OP_XTargetResponse` | 🔴 Not-Set | | | -| `OP_YellForHelp` | 🟡 Unverified | | | -| `OP_ZoneChange` | 🟢 Verified | | | -| `OP_ZoneComplete` | 🔴 Not-Set | | | -| `OP_ZoneEntry` | 🟢 Verified | unknown fields in C->S struct are various CRCs, emu doesn't use them | | -| `OP_ZoneGuildList` | 🔴 Not-Set | | | -| `OP_ZoneInUnknown` | 🔴 Not-Set | | | -| `OP_ZonePlayerToBind` | 🟡 Unverified | | | -| `OP_ZoneServerInfo` | 🟢 Verified | | | -| `OP_ZoneServerReady` | 🔴 Not-Set | | | -| `OP_ZoneSpawns` | 🟢 Verified | This is deprecated in the client (and emu never sends it directly) | | -| `OP_ZoneUnavail` | 🟢 Verified | The client discards all content of this packet | | -| `OP_ResetAA` | 🟡 Unverified | | | -| `OP_UnderWorld` | 🟡 Unverified | | | +| Opcode | Status | Notes | Working On | +|:----------------------------------|:---------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-----------| +| `OP_AAAction` | 🟡 Unverified | | | +| `OP_AAExpUpdate` | 🟡 Unverified | | | +| `OP_AcceptNewTask` | 🔴 Not-Set | | | +| `OP_AckPacket` | 🟢 Verified | | | +| `OP_Action` | 🟡 Unverified | | | +| `OP_Action2` | 🔴 Not-Set | | | +| `OP_AddNimbusEffect` | 🟡 Unverified | | | +| `OP_AdventureData` | 🔴 Not-Set | | | +| `OP_AdventureDetails` | 🔴 Not-Set | | | +| `OP_AdventureFinish` | 🔴 Not-Set | | | +| `OP_AdventureInfo` | 🔴 Not-Set | | | +| `OP_AdventureInfoRequest` | 🔴 Not-Set | | | +| `OP_AdventureLeaderboardReply` | 🔴 Not-Set | | | +| `OP_AdventureLeaderboardRequest` | 🔴 Not-Set | | | +| `OP_AdventureMerchantPurchase` | 🔴 Not-Set | | | +| `OP_AdventureMerchantRequest` | 🔴 Not-Set | | | +| `OP_AdventureMerchantResponse` | 🔴 Not-Set | | | +| `OP_AdventureMerchantSell` | 🔴 Not-Set | | | +| `OP_AdventurePointsUpdate` | 🔴 Not-Set | | | +| `OP_AdventureRequest` | 🔴 Not-Set | | | +| `OP_AdventureStatsReply` | 🔴 Not-Set | | | +| `OP_AdventureStatsRequest` | 🔴 Not-Set | | | +| `OP_AdventureUpdate` | 🔴 Not-Set | | | +| `OP_AggroMeterLockTarget` | 🔴 Not-Set | | | +| `OP_AggroMeterTargetInfo` | 🔴 Not-Set | | | +| `OP_AggroMeterUpdate` | 🔴 Not-Set | | | +| `OP_AltCurrency` | 🔴 Not-Set | | | +| `OP_AltCurrencyMerchantReply` | 🔴 Not-Set | | | +| `OP_AltCurrencyMerchantRequest` | 🔴 Not-Set | | | +| `OP_AltCurrencyPurchase` | 🔴 Not-Set | | | +| `OP_AltCurrencyReclaim` | 🔴 Not-Set | | | +| `OP_AltCurrencySell` | 🔴 Not-Set | | | +| `OP_AltCurrencySellSelection` | 🔴 Not-Set | | | +| `OP_Animation` | 🟡 Unverified | | | +| `OP_AnnoyingZoneUnknown` | 🔴 Not-Set | | | +| `OP_ApplyPoison` | 🟡 Unverified | | | +| `OP_ApproveName` | 🟡 Unverified | This takes multiple parameters from the client, and it can take multiple integer values from the server | | +| `OP_ApproveWorld` | 🔴 Not-Set | | | +| `OP_ApproveZone` | 🔴 Not-Set | | | +| `OP_Assist` | 🟡 Unverified | | | +| `OP_AssistGroup` | 🟡 Unverified | | | +| `OP_AugmentInfo` | 🟡 Unverified | | | +| `OP_AugmentItem` | 🟡 Unverified | | | +| `OP_AutoAttack` | 🟡 Unverified | | | +| `OP_AutoAttack2` | 🟡 Unverified | | | +| `OP_AutoFire` | 🟡 Unverified | | | +| `OP_Bandolier` | 🔴 Not-Set | | | +| `OP_BankerChange` | 🟡 Unverified | | | +| `OP_Barter` | 🔴 Not-Set | | | +| `OP_Bazaar` | 🔴 Not-Set | | | +| `OP_BazaarInspect` | 🔴 Not-Set | | | +| `OP_BazaarSearch` | 🔴 Not-Set | | | +| `OP_BecomeCorpse` | 🔴 Not-Set | | | +| `OP_BecomeTrader` | 🔴 Not-Set | | | +| `OP_Begging` | 🟡 Unverified | | | +| `OP_BeginCast` | 🟡 Unverified | | | +| `OP_Bind_Wound` | 🟡 Unverified | | | +| `OP_BlockedBuffs` | 🟢 Verified | | | +| `OP_BoardBoat` | 🟡 Unverified | | | +| `OP_BookButton` | 🟡 Unverified | | | +| `OP_Buff` | 🟡 Unverified | | | +| `OP_BuffCreate` | 🟡 Unverified | | | +| `OP_BuffRemoveRequest` | 🟡 Unverified | | | +| `OP_Bug` | 🟡 Unverified | | | +| `OP_BuyerItems` | 🔴 Not-Set | | | +| `OP_CameraEffect` | 🟡 Unverified | | | +| `OP_Camp` | 🟡 Unverified | | | +| `OP_CancelSneakHide` | 🟡 Unverified | | | +| `OP_CancelTask` | 🔴 Not-Set | | | +| `OP_CancelTrade` | 🟡 Unverified | | | +| `OP_CashReward` | 🟡 Unverified | | | +| `OP_CastSpell` | 🟡 Unverified | | | +| `OP_ChangeSize` | 🟢 Verified | | | +| `OP_ChannelMessage` | 🟡 Unverified | | | +| `OP_ChangePetName` | 🔴 Not-Set | | | +| `OP_CharacterCreate` | 🟢 Verified | Sends heroic type, can be used for something? | | +| `OP_CharacterCreateRequest` | 🟢 Verified | | | +| `OP_CharInventory` | 🟡 Unverified | | | +| `OP_Charm` | 🟡 Unverified | | | +| `OP_ChatMessage` | 🔴 Not-Set | | | +| `OP_ClearAA` | 🟡 Unverified | | | +| `OP_ClearBlockedBuffs` | 🟢 Verified | | | +| `OP_ClearLeadershipAbilities` | 🔴 Not-Set | | | +| `OP_ClearNPCMarks` | 🔴 Not-Set | | | +| `OP_ClearObject` | 🟡 Unverified | | | +| `OP_ClearSurname` | 🔴 Not-Set | | | +| `OP_ClickDoor` | 🟡 Unverified | | | +| `OP_ClickObject` | 🟡 Unverified | | | +| `OP_ClickObjectAction` | 🟡 Unverified | | | +| `OP_ClientError` | 🔴 Not-Set | | | +| `OP_ClientReady` | 🟡 Unverified | | | +| `OP_ClientTimeStamp` | 🔴 Not-Set | | | +| `OP_ClientUpdate` | 🟡 Unverified | | | +| `OP_CloseContainer` | 🔴 Not-Set | | | +| `OP_CloseTributeMaster` | 🔴 Not-Set | | | +| `OP_ColoredText` | 🟡 Unverified | | | +| `OP_CombatAbility` | 🟡 Unverified | | | +| `OP_Command` | 🔴 Not-Set | | | +| `OP_CompletedTasks` | 🔴 Not-Set | | | +| `OP_ConfirmDelete` | 🟡 Unverified | | | +| `OP_Consent` | 🟡 Unverified | | | +| `OP_ConsentDeny` | 🟡 Unverified | | | +| `OP_ConsentResponse` | 🟡 Unverified | | | +| `OP_Consider` | 🟡 Unverified | | | +| `OP_ConsiderCorpse` | 🟡 Unverified | | | +| `OP_Consume` | 🟡 Unverified | | | +| `OP_ControlBoat` | 🟡 Unverified | | | +| `OP_CorpseDrag` | 🟡 Unverified | | | +| `OP_CorpseDrop` | 🟡 Unverified | | | +| `OP_CrashDump` | 🔴 Not-Set | | | +| `OP_CrystalCountUpdate` | 🔴 Not-Set | | | +| `OP_CrystalCreate` | 🔴 Not-Set | | | +| `OP_CrystalReclaim` | 🔴 Not-Set | | | +| `OP_CustomTitles` | 🔴 Not-Set | | | +| `OP_Damage` | 🟡 Unverified | | | +| `OP_Death` | 🟡 Unverified | | | +| `OP_DelegateAbility` | 🔴 Not-Set | | | +| `OP_DeleteCharacter` | 🟢 Verified | | | +| `OP_DeleteCharge` | 🟡 Unverified | | | +| `OP_DeleteItem` | 🟡 Unverified | | | +| `OP_DeletePetition` | 🔴 Not-Set | | | +| `OP_DeleteSpawn` | 🟡 Unverified | | | +| `OP_DeleteSpell` | 🟡 Unverified | | | +| `OP_DenyResponse` | 🟡 Unverified | | | +| `OP_Disarm` | 🟡 Unverified | | | +| `OP_DisarmTraps` | 🟡 Unverified | | | +| `OP_DisciplineTimer` | 🟡 Unverified | | | +| `OP_DisciplineUpdate` | 🟡 Unverified | | | +| `OP_DiscordMerchantInventory` | 🔴 Not-Set | | | +| `OP_DoGroupLeadershipAbility` | 🔴 Not-Set | | | +| `OP_DuelDecline` | 🔴 Not-Set | | | +| `OP_DuelAccept` | 🔴 Not-Set | | | +| `OP_DumpName` | 🔴 Not-Set | | | +| `OP_Dye` | 🔴 Not-Set | | | +| `OP_DynamicWall` | 🔴 Not-Set | | | +| `OP_DzAddPlayer` | 🔴 Not-Set | | | +| `OP_DzChooseZone` | 🔴 Not-Set | | | +| `OP_DzChooseZoneReply` | 🔴 Not-Set | | | +| `OP_DzCompass` | 🔴 Not-Set | | | +| `OP_DzExpeditionEndsWarning` | 🔴 Not-Set | | | +| `OP_DzExpeditionInfo` | 🔴 Not-Set | | | +| `OP_DzExpeditionInvite` | 🔴 Not-Set | | | +| `OP_DzExpeditionInviteResponse` | 🔴 Not-Set | | | +| `OP_DzExpeditionLockoutTimers` | 🔴 Not-Set | | | +| `OP_DzListTimers` | 🔴 Not-Set | | | +| `OP_DzMakeLeader` | 🔴 Not-Set | | | +| `OP_DzMemberList` | 🔴 Not-Set | | | +| `OP_DzMemberListName` | 🔴 Not-Set | | | +| `OP_DzMemberListStatus` | 🔴 Not-Set | | | +| `OP_DzPlayerList` | 🔴 Not-Set | | | +| `OP_DzQuit` | 🔴 Not-Set | | | +| `OP_DzRemovePlayer` | 🔴 Not-Set | | | +| `OP_DzSetLeaderName` | 🔴 Not-Set | | | +| `OP_DzSwapPlayer` | 🔴 Not-Set | | | +| `OP_Emote` | 🔴 Not-Set | | | +| `OP_EndLootRequest` | 🟡 Unverified | | | +| `OP_EnduranceUpdate` | 🔴 Not-Set | | | +| `OP_EnterChat` | 🔴 Not-Set | | | +| `OP_EnterWorld` | 🟢 Verified | | | +| `OP_EnvDamage` | 🟡 Unverified | | | +| `OP_EvolveItem` | 🔴 Not-Set | | | +| `OP_ExpansionInfo` | 🟢 Verified | Updated from u32 to u64 and works now | | +| `OP_ExpUpdate` | 🟡 Unverified | | | +| `OP_FaceChange` | 🔴 Not-Set | | | +| `OP_Feedback` | 🔴 Not-Set | | | +| `OP_FeignDeath` | 🟡 Unverified | | | +| `OP_FellowshipUpdate` | 🔴 Not-Set | | | +| `OP_FindPersonReply` | 🔴 Not-Set | | | +| `OP_FindPersonRequest` | 🔴 Not-Set | | | +| `OP_FinishTrade` | 🟡 Unverified | | | +| `OP_FinishWindow` | 🟡 Unverified | | | +| `OP_FinishWindow2` | 🟡 Unverified | | | +| `OP_Fishing` | 🟡 Unverified | | | +| `OP_Fling` | 🟡 Unverified | | | +| `OP_FloatListThing` | 🟢 Verified | Movement History. Sent from client, but emu doesn't use it so setting it as varified. Reference is 0x1402FFAD0 | | +| `OP_Forage` | 🟡 Unverified | | | +| `OP_ForceFindPerson` | 🔴 Not-Set | | | +| `OP_FormattedMessage` | 🟡 Unverified | | | +| `OP_FriendsWho` | 🟡 Unverified | | | +| `OP_GetGuildMOTD` | 🔴 Not-Set | | | +| `OP_GetGuildMOTDReply` | 🔴 Not-Set | | | +| `OP_GetGuildsList` | 🔴 Not-Set | | | +| `OP_GiveMoney` | 🔴 Not-Set | | | +| `OP_GMApproval` | 🔴 Not-Set | | | +| `OP_GMBecomeNPC` | 🔴 Not-Set | | | +| `OP_GMDelCorpse` | 🔴 Not-Set | | | +| `OP_GMEmoteZone` | 🔴 Not-Set | | | +| `OP_GMEndTraining` | 🟡 Unverified | | | +| `OP_GMEndTrainingResponse` | 🔴 Not-Set | | | +| `OP_GMFind` | 🔴 Not-Set | | | +| `OP_GMGoto` | 🔴 Not-Set | | | +| `OP_GMHideMe` | 🔴 Not-Set | | | +| `OP_GMKick` | 🔴 Not-Set | | | +| `OP_GMKill` | 🔴 Not-Set | | | +| `OP_GMLastName` | 🔴 Not-Set | | | +| `OP_GMNameChange` | 🔴 Not-Set | | | +| `OP_GMSearchCorpse` | 🔴 Not-Set | | | +| `OP_GMServers` | 🔴 Not-Set | | | +| `OP_GMSummon` | 🔴 Not-Set | | | +| `OP_GMToggle` | 🔴 Not-Set | | | +| `OP_GMTraining` | 🟡 Unverified | | | +| `OP_GMTrainSkill` | 🟡 Unverified | | | +| `OP_GMTrainSkillConfirm` | 🟡 Unverified | | | +| `OP_GMZoneRequest` | 🔴 Not-Set | | | +| `OP_GMZoneRequest2` | 🔴 Not-Set | | | +| `OP_GroundSpawn` | 🟢 Verified | | | +| `OP_GroupAcknowledge` | 🔴 Not-Set | | | +| `OP_GroupCancelInvite` | 🔴 Not-Set | | | +| `OP_GroupDelete` | 🔴 Not-Set | | | +| `OP_GroupDisband` | 🟡 Unverified | | | +| `OP_GroupDisbandOther` | 🔴 Not-Set | | | +| `OP_GroupDisbandYou` | 🔴 Not-Set | | | +| `OP_GroupFollow` | 🔴 Not-Set | | | +| `OP_GroupFollow2` | 🔴 Not-Set | | | +| `OP_GroupInvite` | 🟡 Unverified | | | +| `OP_GroupInvite2` | 🔴 Not-Set | | | +| `OP_GroupLeaderChange` | 🔴 Not-Set | | | +| `OP_GroupLeadershipAAUpdate` | 🔴 Not-Set | | | +| `OP_GroupMakeLeader` | 🔴 Not-Set | | | +| `OP_GroupMentor` | 🔴 Not-Set | | | +| `OP_GroupRoles` | 🔴 Not-Set | | | +| `OP_GroupUpdate` | 🔴 Not-Set | | | +| `OP_GroupUpdateB` | 🔴 Not-Set | | | +| `OP_GroupUpdateLeaderAA` | 🔴 Not-Set | | | +| `OP_GuildBank` | 🔴 Not-Set | | | +| `OP_GuildBankItemList` | 🔴 Not-Set | | | +| `OP_GuildCreate` | 🔴 Not-Set | | | +| `OP_GuildDelete` | 🔴 Not-Set | | | +| `OP_GuildDeleteGuild` | 🔴 Not-Set | | | +| `OP_GuildDemote` | 🔴 Not-Set | | | +| `OP_GuildInvite` | 🔴 Not-Set | | | +| `OP_GuildInviteAccept` | 🔴 Not-Set | | | +| `OP_GuildLeader` | 🔴 Not-Set | | | +| `OP_GuildManageAdd` | 🔴 Not-Set | | | +| `OP_GuildManageBanker` | 🔴 Not-Set | | | +| `OP_GuildManageRemove` | 🔴 Not-Set | | | +| `OP_GuildManageStatus` | 🔴 Not-Set | | | +| `OP_GuildMemberLevelUpdate` | 🔴 Not-Set | | | +| `OP_GuildMemberList` | 🔴 Not-Set | | | +| `OP_GuildMemberUpdate` | 🔴 Not-Set | | | +| `OP_GuildMemberLevel` | 🔴 Not-Set | | | +| `OP_GuildMemberRankAltBanker` | 🔴 Not-Set | | | +| `OP_GuildMemberPublicNote` | 🔴 Not-Set | | | +| `OP_GuildMemberAdd` | 🔴 Not-Set | | | +| `OP_GuildMemberRename` | 🔴 Not-Set | | | +| `OP_GuildMemberDelete` | 🔴 Not-Set | | | +| `OP_GuildMemberDetails` | 🔴 Not-Set | | | +| `OP_GuildRenameGuild` | 🔴 Not-Set | | | +| `OP_GuildMOTD` | 🔴 Not-Set | | | +| `OP_GuildPeace` | 🔴 Not-Set | | | +| `OP_GuildPromote` | 🔴 Not-Set | | | +| `OP_GuildPublicNote` | 🔴 Not-Set | | | +| `OP_GuildRemove` | 🔴 Not-Set | | | +| `OP_GuildSelectTribute` | 🔴 Not-Set | | | +| `OP_GuildModifyBenefits` | 🔴 Not-Set | | | +| `OP_GuildTributeToggleReq` | 🔴 Not-Set | | | +| `OP_GuildTributeToggleReply` | 🔴 Not-Set | | | +| `OP_GuildOptInOut` | 🔴 Not-Set | | | +| `OP_GuildSaveActiveTributes` | 🔴 Not-Set | | | +| `OP_GuildSendActiveTributes` | 🔴 Not-Set | | | +| `OP_GuildTributeFavorAndTimer` | 🔴 Not-Set | | | +| `OP_GuildsList` | 🔴 Not-Set | | | +| `OP_GuildStatus` | 🔴 Not-Set | | | +| `OP_GuildTributeInfo` | 🔴 Not-Set | | | +| `OP_GuildUpdate` | 🔴 Not-Set | | | +| `OP_GuildTributeDonateItem` | 🔴 Not-Set | | | +| `OP_GuildTributeDonatePlat` | 🔴 Not-Set | | | +| `OP_GuildWar` | 🔴 Not-Set | | | +| `OP_Heartbeat` | 🔴 Not-Set | | | +| `OP_Hide` | 🟡 Unverified | | | +| `OP_HideCorpse` | 🟡 Unverified | | | +| `OP_HPUpdate` | 🟡 Unverified | | | +| `OP_Illusion` | 🟡 Unverified | | | +| `OP_IncreaseStats` | 🟡 Unverified | | | +| `OP_InitialHPUpdate` | 🔴 Not-Set | | | +| `OP_InitialMobHealth` | 🔴 Not-Set | | | +| `OP_InspectAnswer` | 🔴 Not-Set | | | +| `OP_InspectBuffs` | 🔴 Not-Set | | | +| `OP_InspectMessageUpdate` | 🔴 Not-Set | | | +| `OP_InspectRequest` | 🔴 Not-Set | | | +| `OP_InstillDoubt` | 🟡 Unverified | | | +| `OP_InterruptCast` | 🟡 Unverified | | | +| `OP_InvokeChangePetName` | 🔴 Not-Set | | | +| `OP_InvokeChangePetNameImmediate` | 🔴 Not-Set | | | +| `OP_InvokeNameChangeImmediate` | 🔴 Not-Set | | | +| `OP_InvokeNameChangeLazy` | 🔴 Not-Set | | | +| `OP_ItemLinkClick` | 🔴 Not-Set | | | +| `OP_ItemLinkResponse` | 🔴 Not-Set | | | +| `OP_ItemLinkText` | 🔴 Not-Set | | | +| `OP_ItemName` | 🔴 Not-Set | | | +| `OP_ItemPacket` | 🟡 Unverified | | | +| `OP_ItemPreview` | 🔴 Not-Set | | | +| `OP_ItemPreviewRequest` | 🔴 Not-Set | | | +| `OP_ItemRecastDelay` | 🟡 Unverified | | | +| `OP_ItemVerifyReply` | 🟡 Unverified | | | +| `OP_ItemVerifyRequest` | 🟡 Unverified | | | +| `OP_ItemViewUnknown` | 🔴 Not-Set | | | +| `OP_Jump` | 🟡 Unverified | | | +| `OP_KeyRing` | 🔴 Not-Set | | | +| `OP_KickPlayers` | 🟡 Unverified | | | +| `OP_KnowledgeBase` | 🔴 Not-Set | | | +| `OP_LDoNButton` | 🔴 Not-Set | | | +| `OP_LDoNDisarmTraps` | 🔴 Not-Set | | | +| `OP_LDoNInspect` | 🔴 Not-Set | | | +| `OP_LDoNOpen` | 🟡 Unverified | | | +| `OP_LDoNPickLock` | 🟡 Unverified | | | +| `OP_LDoNSenseTraps` | 🟡 Unverified | | | +| `OP_LeadershipExpToggle` | 🔴 Not-Set | | | +| `OP_LeadershipExpUpdate` | 🔴 Not-Set | | | +| `OP_LeaveAdventure` | 🔴 Not-Set | | | +| `OP_LeaveBoat` | 🟡 Unverified | | | +| `OP_LevelAppearance` | 🟡 Unverified | | | +| `OP_LevelUpdate` | 🟢 Verified | | | +| `OP_LFGAppearance` | 🔴 Not-Set | | | +| `OP_LFGCommand` | 🔴 Not-Set | | | +| `OP_LFGGetMatchesRequest` | 🔴 Not-Set | | | +| `OP_LFGGetMatchesResponse` | 🔴 Not-Set | | | +| `OP_LFGResponse` | 🔴 Not-Set | | | +| `OP_LFGuild` | 🔴 Not-Set | | | +| `OP_LFPCommand` | 🔴 Not-Set | | | +| `OP_LFPGetMatchesRequest` | 🔴 Not-Set | | | +| `OP_LFPGetMatchesResponse` | 🔴 Not-Set | | | +| `OP_LinkedReuse` | 🟡 Unverified | | | +| `OP_LoadSpellSet` | 🔴 Not-Set | | | +| `OP_LocInfo` | 🔴 Not-Set | | | +| `OP_LockoutTimerInfo` | 🔴 Not-Set | | | +| `OP_Login` | 🔴 Not-Set | | | +| `OP_LoginAccepted` | 🔴 Not-Set | | | +| `OP_LoginComplete` | 🔴 Not-Set | | | +| `OP_LoginExpansionPacketData` | 🔴 Not-Set | | | +| `OP_LoginUnknown1` | 🔴 Not-Set | | | +| `OP_LoginUnknown2` | 🔴 Not-Set | | | +| `OP_Logout` | 🟡 Unverified | | | +| `OP_LogoutReply` | 🔴 Not-Set | | | +| `OP_LogServer` | 🟢 Verified | Mostly unused values | | +| `OP_LootComplete` | 🟡 Unverified | | | +| `OP_LootItem` | 🟡 Unverified | | | +| `OP_LootRequest` | 🟡 Unverified | | | +| `OP_ManaChange` | 🟡 Unverified | | | +| `OP_ManaUpdate` | 🔴 Not-Set | | | +| `OP_MarkNPC` | 🔴 Not-Set | | | +| `OP_MarkRaidNPC` | 🔴 Not-Set | | | +| `OP_Marquee` | 🟡 Unverified | | | +| `OP_MemorizeSpell` | 🟡 Unverified | | | +| `OP_Mend` | 🟡 Unverified | | | +| `OP_MendHPUpdate` | 🔴 Not-Set | | | +| `OP_MercenaryAssign` | 🔴 Not-Set | | | +| `OP_MercenaryCommand` | 🔴 Not-Set | | | +| `OP_MercenaryDataRequest` | 🔴 Not-Set | | | +| `OP_MercenaryDataResponse` | 🔴 Not-Set | | | +| `OP_MercenaryDataUpdate` | 🔴 Not-Set | | | +| `OP_MercenaryDataUpdateRequest` | 🔴 Not-Set | | | +| `OP_MercenaryDismiss` | 🔴 Not-Set | | | +| `OP_MercenaryHire` | 🔴 Not-Set | | | +| `OP_MercenarySuspendRequest` | 🔴 Not-Set | | | +| `OP_MercenarySuspendResponse` | 🔴 Not-Set | | | +| `OP_MercenaryTimer` | 🔴 Not-Set | | | +| `OP_MercenaryTimerRequest` | 🔴 Not-Set | | | +| `OP_MercenaryUnknown1` | 🔴 Not-Set | | | +| `OP_MercenaryUnsuspendResponse` | 🔴 Not-Set | | | +| `OP_MerchantBulkItems` | 🔴 Not-Set | | | +| `OP_MobEnduranceUpdate` | 🔴 Not-Set | | | +| `OP_MobHealth` | 🟡 Unverified | | | +| `OP_MobManaUpdate` | 🔴 Not-Set | | | +| `OP_MobRename` | 🔴 Not-Set | | | +| `OP_MobUpdate` | 🔴 Not-Set | | | +| `OP_MoneyOnCorpse` | 🟡 Unverified | | | +| `OP_MoneyUpdate` | 🟡 Unverified | | | +| `OP_MOTD` | 🟢 Verified | | | +| `OP_MoveCoin` | 🟡 Unverified | | | +| `OP_MoveDoor` | 🟡 Unverified | | | +| `OP_MoveItem` | 🟡 Unverified | | | +| `OP_MoveMultipleItems` | 🟡 Unverified | | | +| `OP_MoveLogDisregard` | 🔴 Not-Set | | | +| `OP_MoveLogRequest` | 🔴 Not-Set | | | +| `OP_MultiLineMsg` | 🔴 Not-Set | | | +| `OP_NewSpawn` | 🟢 Verified | Deprecated in the client, already handled in emu | | +| `OP_NewTitlesAvailable` | 🔴 Not-Set | | | +| `OP_NewZone` | 🟢 Verified | | | +| `OP_NPCMoveUpdate` | 🔴 Not-Set | | | +| `OP_OnLevelMessage` | 🟡 Unverified | | | +| `OP_OpenContainer` | 🟡 Unverified | | | +| `OP_OpenDiscordMerchant` | 🔴 Not-Set | | | +| `OP_OpenGuildTributeMaster` | 🔴 Not-Set | | | +| `OP_OpenInventory` | 🔴 Not-Set | | | +| `OP_OpenTributeMaster` | 🔴 Not-Set | | | +| `OP_PDeletePetition` | 🔴 Not-Set | | | +| `OP_PetBuffWindow` | 🔴 Not-Set | | | +| `OP_PetCommands` | 🔴 Not-Set | | | +| `OP_PetCommandState` | 🔴 Not-Set | | | +| `OP_PetHoTT` | 🔴 Not-Set | | | +| `OP_Petition` | 🔴 Not-Set | | | +| `OP_PetitionBug` | 🔴 Not-Set | | | +| `OP_PetitionCheckIn` | 🔴 Not-Set | | | +| `OP_PetitionCheckout` | 🔴 Not-Set | | | +| `OP_PetitionCheckout2` | 🔴 Not-Set | | | +| `OP_PetitionDelete` | 🔴 Not-Set | | | +| `OP_PetitionQue` | 🔴 Not-Set | | | +| `OP_PetitionRefresh` | 🔴 Not-Set | | | +| `OP_PetitionResolve` | 🔴 Not-Set | | | +| `OP_PetitionSearch` | 🔴 Not-Set | | | +| `OP_PetitionSearchResults` | 🔴 Not-Set | | | +| `OP_PetitionSearchText` | 🔴 Not-Set | | | +| `OP_PetitionUnCheckout` | 🔴 Not-Set | | | +| `OP_PetitionUpdate` | 🔴 Not-Set | | | +| `OP_PickPocket` | 🟡 Unverified | | | +| `OP_PickZone` | 🔴 Not-Set | | | +| `OP_PickZoneWindow` | 🔴 Not-Set | | | +| `OP_PlayerProfile` | 🟢 Verified | | | +| `OP_PlayerStateAdd` | 🟡 Unverified | | | +| `OP_PlayerStateRemove` | 🟡 Unverified | | | +| `OP_PlayEverquestRequest` | 🔴 Not-Set | | | +| `OP_PlayEverquestResponse` | 🔴 Not-Set | | | +| `OP_PlayMP3` | 🟡 Unverified | | | +| `OP_Poll` | 🔴 Not-Set | | | +| `OP_PollResponse` | 🔴 Not-Set | | | +| `OP_PopupResponse` | 🟡 Unverified | | | +| `OP_PostEnterWorld` | 🟢 Verified | | | +| `OP_PotionBelt` | 🔴 Not-Set | | | +| `OP_PreLogoutReply` | 🔴 Not-Set | | | +| `OP_PurchaseLeadershipAA` | 🔴 Not-Set | | | +| `OP_PVPLeaderBoardDetailsReply` | 🔴 Not-Set | | | +| `OP_PVPLeaderBoardDetailsRequest` | 🔴 Not-Set | | | +| `OP_PVPLeaderBoardReply` | 🔴 Not-Set | | | +| `OP_PVPLeaderBoardRequest` | 🔴 Not-Set | | | +| `OP_PVPStats` | 🔴 Not-Set | | | +| `OP_QueryResponseThing` | 🔴 Not-Set | | | +| `OP_QueryUCSServerStatus` | 🟡 Unverified | | | +| `OP_RaidDelegateAbility` | 🔴 Not-Set | | | +| `OP_RaidClearNPCMarks` | 🔴 Not-Set | | | +| `OP_RaidInvite` | 🔴 Not-Set | | | +| `OP_RaidJoin` | 🔴 Not-Set | | | +| `OP_RaidUpdate` | 🔴 Not-Set | | | +| `OP_RandomNameGenerator` | 🟢 Verified | The client no longer sends this packet (random name generation is done entirely in the client). The client will still accept this packet to set name (emu doesn't do this, but it's always been supported) | | +| `OP_RandomReply` | 🟡 Unverified | | | +| `OP_RandomReq` | 🟡 Unverified | | | +| `OP_ReadBook` | 🟡 Unverified | | | +| `OP_RecipeAutoCombine` | 🟡 Unverified | | | +| `OP_RecipeDetails` | 🟡 Unverified | | | +| `OP_RecipeReply` | 🟡 Unverified | | | +| `OP_RecipesFavorite` | 🟡 Unverified | | | +| `OP_RecipesSearch` | 🟡 Unverified | | | +| `OP_ReclaimCrystals` | 🔴 Not-Set | | | +| `OP_ReloadUI` | 🔴 Not-Set | | | +| `OP_RemoveAllDoors` | 🟡 Unverified | | | +| `OP_RemoveBlockedBuffs` | 🟢 Verified | | | +| `OP_RemoveNimbusEffect` | 🟡 Unverified | | | +| `OP_RemoveTrap` | 🔴 Not-Set | | | +| `OP_Report` | 🟡 Unverified | | | +| `OP_ReqClientSpawn` | 🟢 Verified | | | +| `OP_ReqNewZone` | 🟢 Verified | Client does not send this (in LS or TOB), but it does receive it. emu does not send it | | +| `OP_RequestClientZoneChange` | 🟢 Verified | parity with RoF2, there's a string that gets passed to teleport at the end that's not known | | +| `OP_RequestDuel` | 🔴 Not-Set | | | +| `OP_RequestGuildTributes` | 🔴 Not-Set | | | +| `OP_RequestKnowledgeBase` | 🔴 Not-Set | | | +| `OP_RequestTitles` | 🔴 Not-Set | | | +| `OP_RespawnWindow` | 🟡 Unverified | | | +| `OP_RespondAA` | 🟡 Unverified | | | +| `OP_RestState` | 🟡 Unverified | | | +| `OP_Rewind` | 🟡 Unverified | | | +| `OP_RezzAnswer` | 🔴 Not-Set | | | +| `OP_RezzComplete` | 🔴 Not-Set | | | +| `OP_RezzRequest` | 🔴 Not-Set | | | +| `OP_Sacrifice` | 🟡 Unverified | | | +| `OP_SafeFallSuccess` | 🟡 Unverified | | | +| `OP_SafePoint` | 🔴 Not-Set | | | +| `OP_Save` | 🟡 Unverified | | | +| `OP_SaveOnZoneReq` | 🟡 Unverified | | | +| `OP_SelectTribute` | 🔴 Not-Set | | | +| `OP_SendAAStats` | 🟡 Unverified | | | +| `OP_SendAATable` | 🟡 Unverified | | | +| `OP_SendCharInfo` | 🟢 Verified | | | +| `OP_SendExpZonein` | 🟡 Unverified | | | +| `OP_SendFindableNPCs` | 🔴 Not-Set | | | +| `OP_SendGuildTributes` | 🔴 Not-Set | | | +| `OP_SendLoginInfo` | 🟢 Verified | | | +| `OP_SendMaxCharacters` | 🟢 Verified | | | +| `OP_SendMembership` | 🟢 Verified | | | +| `OP_SendMembershipDetails` | 🟢 Verified | The struct is correct, will need reversing for actual option keys/values | | +| `OP_SendSystemStats` | 🔴 Not-Set | | | +| `OP_SendTitleList` | 🔴 Not-Set | | | +| `OP_SendTributes` | 🔴 Not-Set | | | +| `OP_SendZonepoints` | 🟢 Verified | | | +| `OP_SenseHeading` | 🟡 Unverified | | | +| `OP_SenseTraps` | 🟡 Unverified | | | +| `OP_ServerListRequest` | 🔴 Not-Set | | | +| `OP_ServerListResponse` | 🔴 Not-Set | | | +| `OP_SessionReady` | 🔴 Not-Set | | | +| `OP_SetChatServer` | 🔴 Not-Set | | | +| `OP_SetChatServer2` | 🟢 Verified | | | +| `OP_SetFace` | 🔴 Not-Set | | | +| `OP_SetGroupTarget` | 🔴 Not-Set | | | +| `OP_SetGuildMOTD` | 🔴 Not-Set | | | +| `OP_SetGuildRank` | 🔴 Not-Set | | | +| `OP_SetRunMode` | 🟡 Unverified | | | +| `OP_SetServerFilter` | 🟡 Unverified | | | +| `OP_SetStartCity` | 🔴 Not-Set | | | +| `OP_SetTitle` | 🔴 Not-Set | | | +| `OP_SetTitleReply` | 🔴 Not-Set | | | +| `OP_SharedTaskMemberList` | 🔴 Not-Set | | | +| `OP_SharedTaskAddPlayer` | 🔴 Not-Set | | | +| `OP_SharedTaskRemovePlayer` | 🔴 Not-Set | | | +| `OP_SharedTaskMakeLeader` | 🔴 Not-Set | | | +| `OP_SharedTaskMemberInvite` | 🔴 Not-Set | | | +| `OP_SharedTaskInvite` | 🔴 Not-Set | | | +| `OP_SharedTaskInviteResponse` | 🔴 Not-Set | | | +| `OP_SharedTaskAcceptNew` | 🔴 Not-Set | | | +| `OP_SharedTaskMemberChange` | 🔴 Not-Set | | | +| `OP_SharedTaskPlayerList` | 🔴 Not-Set | | | +| `OP_SharedTaskSelectWindow` | 🔴 Not-Set | | | +| `OP_SharedTaskQuit` | 🔴 Not-Set | | | +| `OP_TaskTimers` | 🔴 Not-Set | | | +| `OP_Shielding` | 🔴 Not-Set | | | +| `OP_ShopDelItem` | 🟡 Unverified | | | +| `OP_ShopEnd` | 🟡 Unverified | | | +| `OP_ShopEndConfirm` | 🟡 Unverified | | | +| `OP_ShopItem` | 🔴 Not-Set | | | +| `OP_ShopPlayerBuy` | 🟡 Unverified | | | +| `OP_ShopPlayerSell` | 🟡 Unverified | | | +| `OP_ShopSendParcel` | 🟡 Unverified | | | +| `OP_ShopDeleteParcel` | 🟡 Unverified | | | +| `OP_ShopRespondParcel` | 🔴 Not-Set | | | +| `OP_ShopRetrieveParcel` | 🟡 Unverified | | | +| `OP_ShopParcelIcon` | 🟡 Unverified | | | +| `OP_ShopRequest` | 🟡 Unverified | | | +| `OP_SimpleMessage` | 🟡 Unverified | | | +| `OP_SkillUpdate` | 🟡 Unverified | | | +| `OP_Sneak` | 🟡 Unverified | | | +| `OP_Some3ByteHPUpdate` | 🔴 Not-Set | | | +| `OP_Some6ByteHPUpdate` | 🔴 Not-Set | | | +| `OP_SomeItemPacketMaybe` | 🔴 Not-Set | | | +| `OP_Sound` | 🟡 Unverified | | | +| `OP_SpawnAppearance` | 🟢 Verified | | | +| `OP_SpawnDoor` | 🟢 Verified | | | +| `OP_SpawnPositionUpdate` | 🔴 Not-Set | | | +| `OP_SpecialMesg` | 🟡 Unverified | | | +| `OP_SpellEffect` | 🟡 Unverified | | | +| `OP_Split` | 🟡 Unverified | | | +| `OP_Stamina` | 🟢 Verified | These values are 0-32k instead of 0-127 | | +| `OP_Stun` | 🟡 Unverified | | | +| `OP_Surname` | 🔴 Not-Set | | | +| `OP_SwapSpell` | 🟡 Unverified | | | +| `OP_SystemFingerprint` | 🔴 Not-Set | | | +| `OP_TargetBuffs` | 🔴 Not-Set | | | +| `OP_TargetCommand` | 🟡 Unverified | | | +| `OP_TargetHoTT` | 🔴 Not-Set | | | +| `OP_TargetMouse` | 🟡 Unverified | | | +| `OP_TargetReject` | 🔴 Not-Set | | | +| `OP_TaskActivity` | 🔴 Not-Set | | | +| `OP_TaskActivityComplete` | 🔴 Not-Set | | | +| `OP_TaskDescription` | 🔴 Not-Set | | | +| `OP_TaskHistoryReply` | 🔴 Not-Set | | | +| `OP_TaskHistoryRequest` | 🔴 Not-Set | | | +| `OP_TaskRequestTimer` | 🔴 Not-Set | | | +| `OP_TaskSelectWindow` | 🔴 Not-Set | | | +| `OP_Taunt` | 🟡 Unverified | | | +| `OP_TestBuff` | 🔴 Not-Set | | | +| `OP_TGB` | 🔴 Not-Set | | | +| `OP_TimeOfDay` | 🟢 Verified | | | +| `OP_Track` | 🟡 Unverified | | | +| `OP_TrackTarget` | 🟡 Unverified | | | +| `OP_TrackUnknown` | 🟡 Unverified | | | +| `OP_TradeAcceptClick` | 🟡 Unverified | | | +| `OP_TradeBusy` | 🟡 Unverified | | | +| `OP_TradeCoins` | 🟡 Unverified | | | +| `OP_TradeMoneyUpdate` | 🟡 Unverified | | | +| `OP_Trader` | 🔴 Not-Set | | | +| `OP_TraderBulkSend` | 🔴 Not-Set | | | +| `OP_TraderBuy` | 🔴 Not-Set | | | +| `OP_TraderDelItem` | 🔴 Not-Set | | | +| `OP_TradeRequest` | 🟡 Unverified | | | +| `OP_TradeRequestAck` | 🟡 Unverified | | | +| `OP_TraderItemUpdate` | 🔴 Not-Set | | | +| `OP_TraderShop` | 🔴 Not-Set | | | +| `OP_TradeSkillCombine` | 🟡 Unverified | | | +| `OP_TradeSkillRecipeInspect` | 🔴 Not-Set | | | +| `OP_Translocate` | 🟡 Unverified | | | +| `OP_TributeInfo` | 🔴 Not-Set | | | +| `OP_TributeItem` | 🔴 Not-Set | | | +| `OP_TributeMoney` | 🔴 Not-Set | | | +| `OP_TributeNPC` | 🔴 Not-Set | | | +| `OP_TributePointUpdate` | 🔴 Not-Set | | | +| `OP_TributeTimer` | 🔴 Not-Set | | | +| `OP_TributeToggle` | 🔴 Not-Set | | | +| `OP_TributeUpdate` | 🔴 Not-Set | | | +| `OP_Untargetable` | 🟡 Unverified | | | +| `OP_UpdateAA` | 🟡 Unverified | | | +| `OP_UpdateAura` | 🔴 Not-Set | | | +| `OP_UpdateLeadershipAA` | 🔴 Not-Set | | | +| `OP_VetClaimReply` | 🔴 Not-Set | | | +| `OP_VetClaimRequest` | 🔴 Not-Set | | | +| `OP_VetRewardsAvaliable` | 🔴 Not-Set | | | +| `OP_VoiceMacroIn` | 🟡 Unverified | | | +| `OP_VoiceMacroOut` | 🟡 Unverified | | | +| `OP_WeaponEquip1` | 🔴 Not-Set | | | +| `OP_WearChange` | 🟡 Unverified | | | +| `OP_Weather` | 🟢 Verified | | | +| `OP_Weblink` | 🟡 Unverified | | | +| `OP_WhoAllRequest` | 🟡 Unverified | | | +| `OP_WhoAllResponse` | 🟡 Unverified | | | +| `OP_World_Client_CRC1` | 🟢 Verified | | | +| `OP_World_Client_CRC2` | 🟢 Verified | | | +| `OP_World_Client_CRC3` | 🟢 Verified | | | +| `OP_WorldClientReady` | 🟢 Verified | | | +| `OP_WorldComplete` | 🟢 Verified | | | +| `OP_WorldLogout` | 🔴 Not-Set | | | +| `OP_WorldObjectsSent` | 🟢 Verified | | | +| `OP_WorldUnknown001` | 🟢 Verified | SetServerTime. emu doesn't currently send it so setting it to verified, but the reference is 0x140292550 | | +| `OP_XTargetAutoAddHaters` | 🔴 Not-Set | | | +| `OP_XTargetOpen` | 🔴 Not-Set | | | +| `OP_XTargetOpenResponse` | 🔴 Not-Set | | | +| `OP_XTargetRequest` | 🔴 Not-Set | | | +| `OP_XTargetResponse` | 🔴 Not-Set | | | +| `OP_YellForHelp` | 🟡 Unverified | | | +| `OP_ZoneChange` | 🟢 Verified | | | +| `OP_ZoneComplete` | 🔴 Not-Set | | | +| `OP_ZoneEntry` | 🟢 Verified | unknown fields in C->S struct are various CRCs, emu doesn't use them | | +| `OP_ZoneGuildList` | 🔴 Not-Set | | | +| `OP_ZoneInUnknown` | 🔴 Not-Set | | | +| `OP_ZonePlayerToBind` | 🟡 Unverified | | | +| `OP_ZoneServerInfo` | 🟢 Verified | | | +| `OP_ZoneServerReady` | 🔴 Not-Set | | | +| `OP_ZoneSpawns` | 🟢 Verified | This is deprecated in the client (and emu never sends it directly) | | +| `OP_ZoneUnavail` | 🟢 Verified | The client discards all content of this packet | | +| `OP_ResetAA` | 🟡 Unverified | | | +| `OP_UnderWorld` | 🟡 Unverified | | |