svn -> git Migration

This commit is contained in:
KimLS
2013-02-16 16:14:39 -08:00
parent 88c9715fb0
commit da7347f76f
1174 changed files with 445622 additions and 0 deletions
+20
View File
@@ -0,0 +1,20 @@
Microsoft Visual Studio Solution File, Format Version 11.00
# Visual C# Express 2010
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EQExtractor2", "EQExtractor2\EQExtractor2.csproj", "{621904C6-9028-439C-A0E6-1F856C88D238}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x86 = Debug|x86
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{621904C6-9028-439C-A0E6-1F856C88D238}.Debug|x86.ActiveCfg = Debug|x86
{621904C6-9028-439C-A0E6-1F856C88D238}.Debug|x86.Build.0 = Debug|x86
{621904C6-9028-439C-A0E6-1F856C88D238}.Release|x86.ActiveCfg = Release|x86
{621904C6-9028-439C-A0E6-1F856C88D238}.Release|x86.Build.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
@@ -0,0 +1,310 @@
EQExtractor2 Changelog. All changes since the 1.0 release.
==02/13/2013==
Derision: Added decoder to support packet dumps from current Live client. SQL generation NOT SUPPORTED YET.
Derision: Added boolean to patch decoders to indicate if they support SQL generation or not.
==02/10/2013==
Derision: Added decoder to support packet dumps from for the current Test Server client. SQL generation not tested.
==01/30/2013==
Derision: Added support in netcode for fragmented Client->Server packets.
==01/28/2013==
Derision: Added decoder to support packet dumps from for the current Test Server client. SQL generation not tested.
==01/25/2013==
Derision: Updated .conf files for RoF and current live client (Thanks Trevius).
==01/18/2013==
Derision: Added support for January 16 2013 client (with help from posts on the SEQ boards).
==12/18/2012==
Derision: Fixed crash when generating SQL for a spawn that is a destructible object that has no 'bodytype' field.
==12/17/2012==
Derision: Support for December 10 2012 client.
==08/22/2012==
Derision: Changed Base1/Base2 in AA dump to signed Int32
==08/17/2012==
Derision: Support for August 15 2012 client.
==07/19/2012==
Derision: Support for July 13 2012 client.
==06/30/2012==
Derision: Support for June 25 2012 client.
==03/24/2012==
Derision: Corrected spawn packet parsing per post by Razzle on ShowEQ forums.
==03/19/2012==
Derision: Support for March 15 2012 client. Credit to fransick and Newby on the ShowEQ forums for the PP and most of the opcode changes.
==12/03/2011==
Derision: Support for November 17 2011 client.
Derision: Added checkbox on SQL generation form to include invisible NPCs (race 127), default is false.
==08/06/2011==
Derision: Support for August 04 2011 client (currently on test).
==05/25/2011==
Derision: Support for May 24 2011 client.
==05/16/2011==
Derision: Fixed DumpAA option for May 12 client. There are two new uint32s in the SendAATable struct, one after Current Level and one after SpellType.
==05/15/2011==
Derision: Support for May 12 2011 client. Based on info by posters on the ShowEQ forums.
==03/21/2011==
Derision: Support for March 15 2011 client
==02/10/2011==
Derision: Support for Feb 8 2011 client
Derision: Corrected Identifier for Feb 8 2011 patch
Derision: Corrected OP_SendAATable for Feb 8 2011 patch
==01/29/2011==
Derision: Doors with opentype 57 are no longer automatically changed to type 58.
Derision: Handling of opcodes with zero low-byte (e.g. 0x4200).
Derision: Band-aid for crash when parsing OP_ZoneEntry for player with Otherdata & 0x01 set.
==12/25/2010==
Derision: Heading appears to be multiplied by 2 in ZonePoint packets.
==12/21/2010==
Derision: OP_SendFindableNPCS
==12/08/2010==
Derision: Added support for client Dec 7 2010 14:04:53
==11/22/2010==
Derision: Netcode fix highlighted by live patch supplied by robregen.
Derision: Handled spawns with otherdata & 2 set the same as otherdata & 1 (destructable object data present), based on live patch supplied
by robregen.
==10/23/2010==
Derision: Support for 20th October Live patch.
==09/23/2010==
Derision: Support for 22nd September Test Server client. Don't think I have OP_ShopEnd correct.
==09/17/2010==
Derision: Passed packet direction to Explorers.
==09/11/2010==
Derision: Identified a few more 'Area' IDs for the new Item slot numbering system.
Derision: Explorer methods are now called with the packet payload as a ByteStream rather than byte[]
==09/10/2010==
Derision: Addded ability to call 'Explorer' methods during Packet Dump for use while figuring out packet formats.
==09/08/2010==
Derision: Moved item packet decode into a separate method.
==09/03/2010==
Derision: Added support for version currently on test server (seems like a lot of opcodes have changed values).
Derision: Fixed item Quantity field for Sep 1 patch. Fixed typo in patch .conf file
Derision: Debug text box now resizes with it's parent form.
==08/29/2010==
Derision: Added handling of unencapsulated application packets with flags which were previously being interpreted as unknown opcodes.
(Seems to only have affects position update packets).
Derision: Construct grids from both OP_NPCMoveUpdate and OP_MobUpdate packets. Previously, if OP_NPCMoveUpdate packets were sent for a mob,
i.e. high-resolution updates, any OP_MobUpdate packets for that mob where ignored.
Derision: Added facility in Options to specify a file to write low level netcode debug information to.
Derision: Decoded Crypto flag from OP_SessionRequest to identify and ignore compressed UCS stream.
Derision: Added error checking when opening netcode debug file.
==08/27/2010==
Derision: Redesigned the UI. Use the menu bar, or the following shortcuts:
Ctrl-L Load .PCAP file
Ctrl-S Generate SQL
Ctrl-P Dump Packets
Ctrl-V View Packets
Ctrl-A Dump AA
Ctrl-D Show Debug Window (hidden by default. Change in Options).
Ctrl-O Set Options (these settings persist across sessions).
Derision: Added the ability to disable removal of redundant waypoints.
Derision: Added an option to only generate SQL for spawns whose name contains a given string.
Derision: Added optional timestamps to packet dump. Added capture date to SQL output.
Derision: Fixed crash when Debug log was closed rather than just hidden.
==07/16/2010==
Derision: Replaced HexDump method with a considerably faster version.
==07/14/2010==
Derision: Renamed PatchTestJune242010Decoder to PatchJuly132010Decoder.
Derision: Updated patch_May12-2010.conf with current EQEmu patch_Live.conf. Updated version number to 2.0.5
==06/26/2010==
Derision: Removed the need to duplicate certain methods when deriving a new decoder.
Derision: Moved patch specific variable setting (PPLength, Name etc.) into the decoder constructor
==06/25/2010==
Derision: Added support for current Test Server version (only PP length appears to have changed, no OPCode changes).
==06/12/2010==
Derision: Updated version to 2.0 SVN
Derision: Fixed a bug in GenerateZoneSQL where it was using the ZoneID from the NewZone packet rather than from the PP.
------------------------------------------------------------------------------------------------------------
==06/11/2010==
More refactoring. Should be possible to support .pcaps generated from mulitple client versions.
Refactoring and cleanup about as done as I can be bothered to before releasing the source :)
Merchant items that have a quantity other than -1 (mostly player sold items) are included in the SQL, but commented out.
==06/10/2010==
More refactoring.
==06/08/2010==
More refactoring.
Began to move code that may change with EQClient patch versions out into a separate class to allow easier handling of new patches.
==06/07/2010==
Changed GenerateSpawnsSQL to use BitConverter instead of memory streams;
Refactored some code.
Initial implementation of ByteStream class.
==06/06/2010==
For doors of opentype 57 and 58 (ports), the destination zone and coordinates are populated in the doors table, if a matching
zone point exists with the door param of that door. Doortype 57 is also changed to 58 if a matching zp is found.
Processing a capture file which was started while already in a zone and then zoning *should* now process packets for the
second zone correctly.
Released as version 1.9
==06/05/2010==
Reset expected sequence numbers when switching streams.
==06/05/2010==
Permalocked onto stream using C->S OP_ZoneEntry to reduce chance of multi-boxing messing the collect up.
Version clause is appended to query when updating existing npc_types.
Selecting the update existing npc types option will automatically uncheck all other options.
Reworked texture/helm parsing, so hopefully NPCs should look as close as possible to live now (as close as we can without having textures for each armor slot in npc_types).
Added 'experimental option to add texture colors to npc_types_tint so that different armor slots can have different colors.
Released as version 1.8
-------------------------------
==06/04/2010==
Fixed bug introduced in v1.6 that broke merchant SQL generation.
Gender is now updated for existing npc_types.
Guard races are now included when updating existing npc_types.
Obtained the ZoneID number from the Player Profile instead of the NewZone_Struct.
Released as version 1.7
-------------------------------
==06/03/2010==
The zone long name should no longer be truncated at 32 characters.
Apostrophes in the zone long name are escaped, i.e. Dranik's Hollows should be Dranik\'s Hollows.
The 'Update Existing NPC Types' option is now available. If selected, the following columns:
texture, helmtexture, size, face, luclin_hairstyle, luclin_haircolor, luclin_eyecolor, luclin_eyecolor2, luclin_beardcolor,
luclin_beard, drakkin_heritage, drakkin_tattoo, drakkin_details, armortint_red, armortint_green, armortint_blue,
d_meele_texture1, d_meele_texture2, findable
will be updated for existing rows in the npc_types table that meet the following criteria:
Their ID falls within the range specified.
The NPC is a playable race (Race <= 12 || Race == 128 || Race == 130 || Race == 330 || Race == 522)
The NPC name is unique in the sense that only one NPC with the given first name was seen in the packet collect.
Released as version 1.6
==06/02/2010==
Implemented in 1.5 but not mentioned in changelog: Player mounts no longer included in SQL.
----------------------
==06/02/2010==
Fixed bug which caused the first spawn to always be skipped.
Update generated for fog_density column in zone table.
Populated Drakkin specific fields in npc_types.
Did some work on updating existing npc_types but left it disabled until an issue is resolved.
Released as version 1.5
==06/01/2010==
Changed doors and object/ground spawn extractors to use Bitconverter instead of memory streams.
==05/31/2010==
If zone config and/or zone points are selected, the generated SQL will no longer be commented out.
---------------------------------
==05/31/2010==
Populated Melee texture columns.
For playable races, equip_chest2 is set based on the equipped chest item, if one is equipped.
Set armour tint columns based on the colour field for the chest slot.
The starting IDs for database inserts are now set as variables at the top of the SQL:
Note the Door ID has changed meaning. Instead of being the value for the id column in the doors table,
it is now the base value for the doorid column. The id column will just use the next autoincrement id.
If the version number is none-zero, The base doorid = Version * 1000 and all other insert IDs are
set to ZoneID * 1000 + (Version * 100).
If the version number is none-zero, deletes for npc_types and the spawn tables will only be generated from
the starting InsertID to starting ID + 99.
Moved the Version NumericUpDown control to before the InsertID textboxes as changing the version will
auto-change the InsertIDs.
Corrected a bug where IT10805 objects were flagged as ovens instead of brew barrels.
Added checkboxes (default unchecked) for zone config (fog, safe point, etc) and zone points.
Released as version 1.4
------------------------------------
==05/30/2010==
Added ZonePoint SQL generation.
Added generation of SQL to update zone table.
Obtained ZoneID from the OP_NewZone packet instead of from a lookup table.
Set findable column in npc_types based on OP_SendFindableNPCs packets from server.
Added Version field to UI which is used to populate the version column in the doors, npc_types, spawn2, ground_spawns and object tables.
Released as version 1.1
-------------------------------------------
Added apostrophes around short name in zone UPDATE statement.
Added Dump AA button to dump AA info.
FogDensity is reported along with the other OP_NewZone stuff
Released as version 1.2
-------------------------------------------
Fixed bug where incorrect Insert IDs were being using for spawngroups
Version 1.3
-------------------------------------------
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,217 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
<ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{621904C6-9028-439C-A0E6-1F856C88D238}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>EQExtractor2</RootNamespace>
<AssemblyName>EQExtractor2</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkProfile>
</TargetFrameworkProfile>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<PlatformTarget>x86</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
<PlatformTarget>x86</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<StartupObject />
</PropertyGroup>
<ItemGroup>
<Reference Include="PacketDotNet">
<HintPath>.\PacketDotNet.dll</HintPath>
</Reference>
<Reference Include="SharpPcap">
<HintPath>.\SharpPcap.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
<Reference Include="zlib.net">
<HintPath>.\zlib.net.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="GenerateSQLForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="GenerateSQLForm.Designer.cs">
<DependentUpon>GenerateSQLForm.cs</DependentUpon>
</Compile>
<Compile Include="LogForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="LogForm.Designer.cs">
<DependentUpon>LogForm.cs</DependentUpon>
</Compile>
<Compile Include="OpcodeManager.cs" />
<Compile Include="PatchAug04-2011.cs" />
<Compile Include="PatchAugust15-2012.cs" />
<Compile Include="PatchDec7-2010.cs" />
<Compile Include="PatchDecember10-2012.cs" />
<Compile Include="PatchFeb8-2011.cs" />
<Compile Include="PatchFebruary11-2013.cs" />
<Compile Include="PatchGeneric.cs" />
<Compile Include="EQApplicationLayer.cs" />
<Compile Include="EQPacket.cs" />
<Compile Include="EQExtractor2Form1.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="EQExtractor2Form1.Designer.cs">
<DependentUpon>EQExtractor2Form1.cs</DependentUpon>
</Compile>
<Compile Include="InternalTypes.cs" />
<Compile Include="PatchJanuary16-2013.cs" />
<Compile Include="PatchJuly13-2012.cs" />
<Compile Include="PatchJune25-2012.cs" />
<Compile Include="PatchMar15-2012.cs" />
<Compile Include="PatchMarch15-2011.cs" />
<Compile Include="PatchMay12-2010.cs" />
<Compile Include="PatchMay12-2011.cs" />
<Compile Include="PatchMay24-2011.cs" />
<Compile Include="PatchNov17-2011.cs" />
<Compile Include="PatchOct20-2010.cs" />
<Compile Include="PatchSoD.cs" />
<Compile Include="PatchJuly13-2010.cs" />
<Compile Include="PatchTestSep1-2010.cs" />
<Compile Include="PatchTestSep22-2010.cs" />
<Compile Include="PatchTestServerFebruary5-2013.cs" />
<Compile Include="PatchTestServerJanuary16-2013.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="UserOptions.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="UserOptions.Designer.cs">
<DependentUpon>UserOptions.cs</DependentUpon>
</Compile>
<Compile Include="Utils.cs" />
<EmbeddedResource Include="EQExtractor2Form1.resx">
<DependentUpon>EQExtractor2Form1.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="GenerateSQLForm.resx">
<DependentUpon>GenerateSQLForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="LogForm.resx">
<DependentUpon>LogForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<EmbeddedResource Include="UserOptions.resx">
<DependentUpon>UserOptions.cs</DependentUpon>
</EmbeddedResource>
<None Include="app.config" />
<None Include="patch_Aug04-2011.conf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="patch_August15-2012.conf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="patch_Dec10-2012.conf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="patch_Dec7-2010.conf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="patch_Feb11-2013.conf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="patch_Feb8-2011.conf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="patch_Jan16-2013.conf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="patch_July13-2012.conf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="patch_June25-2012.conf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="patch_Mar15-2012.conf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="patch_March15-2011.conf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="patch_May12-2011.conf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="patch_Nov17-2011.conf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="patch_Sep01-2010.conf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="patch_May12-2010.conf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="patch_Sep22-2010.conf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="patch_SoD.conf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="patch_TestServer-Feb5-2013.conf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="patch_TestServer-Jan16-2013.conf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<ItemGroup>
<Content Include="ChangeLog.txt" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
@@ -0,0 +1,280 @@
namespace EQExtractor2
{
partial class EQExtractor2Form1
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.InputFileOpenDialog = new System.Windows.Forms.OpenFileDialog();
this.PacketDumpFileDialog = new System.Windows.Forms.SaveFileDialog();
this.ProgressBar = new System.Windows.Forms.ProgressBar();
this.mainMenu1 = new System.Windows.Forms.MainMenu(this.components);
this.menuFile = new System.Windows.Forms.MenuItem();
this.menuLoadPCAP = new System.Windows.Forms.MenuItem();
this.menuGenerateSQL = new System.Windows.Forms.MenuItem();
this.menuPacketDump = new System.Windows.Forms.MenuItem();
this.menuDumpAAs = new System.Windows.Forms.MenuItem();
this.menuViewPackets = new System.Windows.Forms.MenuItem();
this.menuExit = new System.Windows.Forms.MenuItem();
this.menuView = new System.Windows.Forms.MenuItem();
this.menuViewDebugLog = new System.Windows.Forms.MenuItem();
this.menuOptions = new System.Windows.Forms.MenuItem();
this.label1 = new System.Windows.Forms.Label();
this.ClientVersionLabel = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.PacketCountLabel = new System.Windows.Forms.Label();
this.ZoneLabelText = new System.Windows.Forms.Label();
this.ZoneLabel = new System.Windows.Forms.Label();
this.statusStrip1 = new System.Windows.Forms.StatusStrip();
this.StatusBar = new System.Windows.Forms.ToolStripStatusLabel();
this.statusStrip1.SuspendLayout();
this.SuspendLayout();
//
// InputFileOpenDialog
//
this.InputFileOpenDialog.Filter = "Capture Files (*.pcap)|*.pcap|All files (*.*)|*.*";
//
// PacketDumpFileDialog
//
this.PacketDumpFileDialog.Filter = "Text Files (*.txt)|*.txt|All files (*.*)|*.*";
this.PacketDumpFileDialog.Title = "Dump Packets To File";
//
// ProgressBar
//
this.ProgressBar.Location = new System.Drawing.Point(2, 78);
this.ProgressBar.Name = "ProgressBar";
this.ProgressBar.Size = new System.Drawing.Size(627, 23);
this.ProgressBar.TabIndex = 35;
this.ProgressBar.Visible = false;
//
// mainMenu1
//
this.mainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.menuFile,
this.menuView});
//
// menuFile
//
this.menuFile.Index = 0;
this.menuFile.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.menuLoadPCAP,
this.menuGenerateSQL,
this.menuPacketDump,
this.menuDumpAAs,
this.menuViewPackets,
this.menuExit});
this.menuFile.Text = "File";
//
// menuLoadPCAP
//
this.menuLoadPCAP.Index = 0;
this.menuLoadPCAP.Shortcut = System.Windows.Forms.Shortcut.CtrlL;
this.menuLoadPCAP.Text = "Load PCAP";
this.menuLoadPCAP.Click += new System.EventHandler(this.menuLoadPCAP_Click);
//
// menuGenerateSQL
//
this.menuGenerateSQL.Enabled = false;
this.menuGenerateSQL.Index = 1;
this.menuGenerateSQL.Shortcut = System.Windows.Forms.Shortcut.CtrlS;
this.menuGenerateSQL.Text = "Generate SQL";
this.menuGenerateSQL.Click += new System.EventHandler(this.menuGenerateSQL_Click);
//
// menuPacketDump
//
this.menuPacketDump.Enabled = false;
this.menuPacketDump.Index = 2;
this.menuPacketDump.Shortcut = System.Windows.Forms.Shortcut.CtrlP;
this.menuPacketDump.Text = "Packet Dump";
this.menuPacketDump.Click += new System.EventHandler(this.menuPacketDump_Click);
//
// menuDumpAAs
//
this.menuDumpAAs.Enabled = false;
this.menuDumpAAs.Index = 3;
this.menuDumpAAs.Shortcut = System.Windows.Forms.Shortcut.CtrlA;
this.menuDumpAAs.Text = "Dump AAs";
this.menuDumpAAs.Click += new System.EventHandler(this.menuDumpAAs_Click);
//
// menuViewPackets
//
this.menuViewPackets.Enabled = false;
this.menuViewPackets.Index = 4;
this.menuViewPackets.Shortcut = System.Windows.Forms.Shortcut.CtrlV;
this.menuViewPackets.Text = "View Packets";
this.menuViewPackets.Click += new System.EventHandler(this.menuViewPackets_Click);
//
// menuExit
//
this.menuExit.Index = 5;
this.menuExit.Text = "Exit";
this.menuExit.Click += new System.EventHandler(this.menuExit_Click);
//
// menuView
//
this.menuView.Index = 1;
this.menuView.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.menuViewDebugLog,
this.menuOptions});
this.menuView.Text = "View";
this.menuView.Popup += new System.EventHandler(this.menuView_Popup);
//
// menuViewDebugLog
//
this.menuViewDebugLog.Index = 0;
this.menuViewDebugLog.Shortcut = System.Windows.Forms.Shortcut.CtrlD;
this.menuViewDebugLog.Text = "Debug Log";
this.menuViewDebugLog.Click += new System.EventHandler(this.menuViewDebugLog_Click);
//
// menuOptions
//
this.menuOptions.Index = 1;
this.menuOptions.Shortcut = System.Windows.Forms.Shortcut.CtrlO;
this.menuOptions.Text = "Options";
this.menuOptions.Click += new System.EventHandler(this.menuOptions_Click);
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(12, 9);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(92, 13);
this.label1.TabIndex = 36;
this.label1.Text = "EQ Client Version:";
//
// ClientVersionLabel
//
this.ClientVersionLabel.AutoSize = true;
this.ClientVersionLabel.Location = new System.Drawing.Point(116, 9);
this.ClientVersionLabel.Name = "ClientVersionLabel";
this.ClientVersionLabel.Size = new System.Drawing.Size(166, 13);
this.ClientVersionLabel.TabIndex = 37;
this.ClientVersionLabel.Text = ".PCAP file not loaded. Press Ctrl-L";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(55, 37);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(49, 13);
this.label2.TabIndex = 38;
this.label2.Text = "Packets:";
//
// PacketCountLabel
//
this.PacketCountLabel.AutoSize = true;
this.PacketCountLabel.Location = new System.Drawing.Point(116, 37);
this.PacketCountLabel.Name = "PacketCountLabel";
this.PacketCountLabel.Size = new System.Drawing.Size(145, 13);
this.PacketCountLabel.TabIndex = 39;
this.PacketCountLabel.Text = " ";
//
// ZoneLabelText
//
this.ZoneLabelText.AutoSize = true;
this.ZoneLabelText.Location = new System.Drawing.Point(72, 62);
this.ZoneLabelText.Name = "ZoneLabelText";
this.ZoneLabelText.Size = new System.Drawing.Size(32, 13);
this.ZoneLabelText.TabIndex = 40;
this.ZoneLabelText.Text = "Zone";
//
// ZoneLabel
//
this.ZoneLabel.AutoSize = true;
this.ZoneLabel.Location = new System.Drawing.Point(116, 62);
this.ZoneLabel.Name = "ZoneLabel";
this.ZoneLabel.Size = new System.Drawing.Size(145, 13);
this.ZoneLabel.TabIndex = 41;
this.ZoneLabel.Text = " ";
//
// statusStrip1
//
this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.StatusBar});
this.statusStrip1.Location = new System.Drawing.Point(0, 104);
this.statusStrip1.Name = "statusStrip1";
this.statusStrip1.Size = new System.Drawing.Size(633, 22);
this.statusStrip1.TabIndex = 42;
this.statusStrip1.Text = "statusStrip1";
//
// StatusBar
//
this.StatusBar.Name = "StatusBar";
this.StatusBar.Size = new System.Drawing.Size(209, 17);
this.StatusBar.Text = "Ready. Press Ctrl-L to load a .PCAP file";
//
// EQExtractor2Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(633, 126);
this.Controls.Add(this.statusStrip1);
this.Controls.Add(this.ZoneLabel);
this.Controls.Add(this.ZoneLabelText);
this.Controls.Add(this.PacketCountLabel);
this.Controls.Add(this.label2);
this.Controls.Add(this.ClientVersionLabel);
this.Controls.Add(this.label1);
this.Controls.Add(this.ProgressBar);
this.Menu = this.mainMenu1;
this.Name = "EQExtractor2Form1";
this.Text = "EQExtractor2";
this.Load += new System.EventHandler(this.EQExtractor2Form1_Load);
this.statusStrip1.ResumeLayout(false);
this.statusStrip1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.OpenFileDialog InputFileOpenDialog;
private System.Windows.Forms.SaveFileDialog PacketDumpFileDialog;
private System.Windows.Forms.ProgressBar ProgressBar;
private System.Windows.Forms.MainMenu mainMenu1;
private System.Windows.Forms.MenuItem menuFile;
private System.Windows.Forms.MenuItem menuLoadPCAP;
private System.Windows.Forms.MenuItem menuGenerateSQL;
private System.Windows.Forms.MenuItem menuPacketDump;
private System.Windows.Forms.MenuItem menuDumpAAs;
private System.Windows.Forms.MenuItem menuExit;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label ClientVersionLabel;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label PacketCountLabel;
private System.Windows.Forms.Label ZoneLabelText;
private System.Windows.Forms.Label ZoneLabel;
private System.Windows.Forms.MenuItem menuView;
private System.Windows.Forms.MenuItem menuViewDebugLog;
private System.Windows.Forms.StatusStrip statusStrip1;
private System.Windows.Forms.ToolStripStatusLabel StatusBar;
private System.Windows.Forms.MenuItem menuViewPackets;
private System.Windows.Forms.MenuItem menuOptions;
}
}
@@ -0,0 +1,559 @@
//
// Copyright (C) 2001-2010 EQEMu Development Team (http://eqemulator.net). Distributed under GPL version 2.
//
//
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using SharpPcap;
using EQApplicationLayer;
namespace EQExtractor2
{
public partial class EQExtractor2Form1 : Form
{
string Version = "EQExtractor2 Version 2.6.0 SVN";
static int PacketsSeen = 0;
static long BytesRead = 0;
static long CaptureFileSize = 0;
string ZoneName;
string SpawnNameFilter = "";
bool CoalesceWaypoints = true;
GenerateSQLForm SQLForm = new GenerateSQLForm();
LogForm DebugLog = new LogForm();
UserOptions Options = new UserOptions();
StreamWriter SQLStream;
StreamWriter PacketDebugStream;
EQStreamProcessor StreamProcessor;
public EQExtractor2Form1()
{
InitializeComponent();
DisplayUsageInfo();
Options.PacketDumpViewerProgram.Text = Properties.Settings.Default.TextFileViewer;
Options.ShowDebugWindowOnStartup.Checked = Properties.Settings.Default.ShowDebugWindowOnStartup;
Options.ShowTimeStamps.Checked = Properties.Settings.Default.DumpTimeStamps;
}
public void Log(string Message)
{
DebugLog.ConsoleWindow.Items.Add(Message);
DebugLog.ConsoleWindow.SelectedIndex = DebugLog.ConsoleWindow.Items.Count - 1;
Application.DoEvents();
}
private void device_OnPacketArrival(object sender, SharpPcap.CaptureEventArgs e)
{
if (e.Packet.LinkLayerType == PacketDotNet.LinkLayers.Ethernet)
{
PacketDotNet.Packet packet;
long TotalPacketSize = e.Packet.Data.Length;
BytesRead += TotalPacketSize;
++PacketsSeen;
if ((PacketsSeen > 0) && ((PacketsSeen % 10000) == 0))
{
DebugLog.ConsoleWindow.SelectedIndex = DebugLog.ConsoleWindow.Items.Count - 1;
int Progress = (int)((float)BytesRead / (float)CaptureFileSize * 100);
ProgressBar.Value = Progress;
Application.DoEvents();
}
try
{
packet = PacketDotNet.Packet.ParsePacket(e.Packet);
}
catch
{
return;
}
var ethernetPacket = (PacketDotNet.EthernetPacket)packet;
var udpPacket = PacketDotNet.UdpPacket.GetEncapsulated(packet);
if (udpPacket != null)
{
var ipPacket = (PacketDotNet.IpPacket)udpPacket.ParentPacket;
System.Net.IPAddress srcIp = ipPacket.SourceAddress;
System.Net.IPAddress dstIp = ipPacket.DestinationAddress;
byte[] Payload = udpPacket.PayloadData;
Int32 l = udpPacket.Length - udpPacket.Header.GetLength(0);
if (l > 0)
{
Array.Resize(ref Payload, l);
StreamProcessor.ProcessPacket(srcIp, dstIp, udpPacket.SourcePort, udpPacket.DestinationPort, Payload, packet.Timeval.Date);
}
}
}
}
public void WriteSQL(string Message)
{
SQLStream.WriteLine(Message);
}
public void PacketDebugLogger(string Message)
{
PacketDebugStream.WriteLine(Message);
}
private void DisableAllControls()
{
foreach (Control c in this.Controls)
{
if ((c is Button) || (c is TextBox) || (c is MaskedTextBox) || (c is CheckBox))
c.Enabled = false;
}
}
private void EnableAllControls()
{
foreach (Control c in this.Controls)
c.Enabled = true;
menuGenerateSQL.Enabled = StreamProcessor.StreamRecognised() && StreamProcessor.SupportsSQLGeneration();
menuDumpAAs.Enabled = StreamProcessor.StreamRecognised();
}
private void menuLoadPCAP_Click(object sender, EventArgs e)
{
if (InputFileOpenDialog.ShowDialog() != DialogResult.OK)
return;
menuGenerateSQL.Enabled = false;
menuPacketDump.Enabled = false;
menuViewPackets.Enabled = false;
menuDumpAAs.Enabled = false;
SharpPcap.OfflinePcapDevice device;
try
{
string CapFile = InputFileOpenDialog.FileName;
device = new SharpPcap.OfflinePcapDevice(CapFile);
device.Open();
}
catch
{
StatusBar.Text = "Error: File does not exist or not in .pcap format.";
Log("Error: File does not exist or not in .pcap format.");
return;
}
StreamProcessor = new EQStreamProcessor();
if (!StreamProcessor.Init(Application.StartupPath, this.Log))
{
Log("Fatal error initialising Stream Processor. No decoders could be initialised (mostly likely misplaced patch_XXXX.conf files.");
StatusBar.Text = "Fatal error initialising Stream Processor. No decoders could be initialised (mostly likely misplaced patch_XXXX.conf files.";
return;
}
if (Options.EQPacketDebugFilename.Text.Length > 0)
{
try
{
PacketDebugStream = new StreamWriter(Options.EQPacketDebugFilename.Text);
StreamProcessor.Packets.SetDebugLogHandler(PacketDebugLogger);
}
catch
{
Log("Failed to open netcode debug file for writing.");
Options.EQPacketDebugFilename.Text = "";
StreamProcessor.Packets.SetDebugLogHandler(null);
}
}
else
StreamProcessor.Packets.SetDebugLogHandler(null);
StatusBar.Text = "Reading packets from " + InputFileOpenDialog.FileName + ". Please wait...";
device.OnPacketArrival +=
new PacketArrivalEventHandler(device_OnPacketArrival);
BytesRead = 0;
PacketsSeen = 0;
DebugLog.ConsoleWindow.Items.Add("-- Capturing from '" + InputFileOpenDialog.FileName);
ProgressBar.Value = 0;
ProgressBar.Show();
menuFile.Enabled = false;
CaptureFileSize = device.FileSize;
device.Capture();
device.Close();
Log("End of file reached. Processed " + PacketsSeen + " packets and " + BytesRead + " bytes.");
ProgressBar.Hide();
if (Options.EQPacketDebugFilename.Text.Length > 0)
PacketDebugStream.Close();
PacketCountLabel.Text = PacketsSeen.ToString();
if (StreamProcessor.Packets.ErrorsInStream)
Log("There were errors encountered in the packet stream. Data may be incomplete.");
DebugLog.ConsoleWindow.SelectedIndex = DebugLog.ConsoleWindow.Items.Count - 1;
menuFile.Enabled = true;
StreamProcessor.PCAPFileReadFinished();
menuPacketDump.Enabled = true;
menuViewPackets.Enabled = true;
Log("Stream recognised as " + StreamProcessor.GetDecoderVersion());
int PPLength = StreamProcessor.VerifyPlayerProfile();
ClientVersionLabel.Text = StreamProcessor.GetDecoderVersion();
if (PPLength == 0)
{
Log("Unable to find player profile packet, or packet not of correct size.");
menuDumpAAs.Enabled = false;
menuGenerateSQL.Enabled = false;
ClientVersionLabel.ForeColor = Color.Red;
ZoneLabel.Text = "";
PacketCountLabel.Text = "";
StatusBar.Text = "Unrecognised EQ Client Version. Press Ctrl-P to dump, or Ctrl-V to view packets.";
return;
}
else
{
ClientVersionLabel.ForeColor = Color.Green;
Log("Found player profile packet of the expected length (" + PPLength + ").");
if(StreamProcessor.SupportsSQLGeneration())
StatusBar.Text = "Client version recognised. Press Ctrl-S to Generate SQL";
else
StatusBar.Text = "Client version recognised. *SQL GENERATION NOT SUPPORTED FOR THIS CLIENT*";
}
ZoneName = StreamProcessor.GetZoneName();
UInt32 ZoneNumber = StreamProcessor.GetZoneNumber();
Log("Zonename is " + StreamProcessor.GetZoneName());
Log("Zone number is " + ZoneNumber);
ZoneLabel.Text = StreamProcessor.GetZoneLongName() + " [" + StreamProcessor.GetZoneName() + "] (" + ZoneNumber.ToString() + ")";
SQLForm.ZoneIDTextBox.Text = ZoneNumber.ToString();
SQLForm.ZoneIDTextBox.Enabled = true;
SQLForm.DoorsTextBox.Enabled = true;
SQLForm.NPCTypesTextBox.Enabled = true;
SQLForm.SpawnEntryTextBox.Enabled = true;
SQLForm.SpawnGroupTextBox.Enabled = true;
SQLForm.Spawn2TextBox.Enabled = true;
SQLForm.GridTextBox.Enabled = true;
SQLForm.ObjectTextBox.Enabled = true;
SQLForm.GroundSpawnTextBox.Enabled = true;
SQLForm.MerchantTextBox.Enabled = true;
SQLForm.VersionSelector.Enabled = true;
menuGenerateSQL.Enabled = StreamProcessor.SupportsSQLGeneration();
menuPacketDump.Enabled = true;
menuViewPackets.Enabled = true;
menuDumpAAs.Enabled = true;
SQLForm.RecalculateBaseInsertIDs();
StreamProcessor.GenerateZonePointList();
}
private void menuGenerateSQL_Click(object sender, EventArgs e)
{
if (SQLForm.ShowDialog() != DialogResult.OK)
return;
string SQLFile = SQLForm.FileName;
try
{
SQLStream = new StreamWriter(SQLFile);
}
catch
{
Log("Unable to open file " + SQLFile + " for writing.");
StatusBar.Text = "Unable to open file " + SQLFile + " for writing.";
return;
}
UInt32 SpawnDBID = Convert.ToUInt32(SQLForm.NPCTypesTextBox.Text);
UInt32 SpawnGroupID = Convert.ToUInt32(SQLForm.SpawnGroupTextBox.Text);
UInt32 SpawnEntryID = Convert.ToUInt32(SQLForm.SpawnEntryTextBox.Text);
UInt32 Spawn2ID = Convert.ToUInt32(SQLForm.Spawn2TextBox.Text);
UInt32 GridDBID = Convert.ToUInt32(SQLForm.GridTextBox.Text);
UInt32 MerchantDBID = Convert.ToUInt32(SQLForm.MerchantTextBox.Text);
int DoorDBID = Convert.ToInt32(SQLForm.DoorsTextBox.Text);
UInt32 GroundSpawnDBID = Convert.ToUInt32(SQLForm.GroundSpawnTextBox.Text);
UInt32 ObjectDBID = Convert.ToUInt32(SQLForm.ObjectTextBox.Text);
UInt32 ZoneID = Convert.ToUInt32(SQLForm.ZoneIDTextBox.Text);
SpawnNameFilter = SQLForm.SpawnNameFilter.Text;
CoalesceWaypoints = SQLForm.CoalesceWaypoints.Checked;
WriteSQL("-- SQL created by " + Version);
WriteSQL("--");
WriteSQL("-- Using Decoder: " + StreamProcessor.GetDecoderVersion());
WriteSQL("--");
WriteSQL("-- Packets captured on " + StreamProcessor.GetCaptureStartTime().ToString());
WriteSQL("--");
WriteSQL("-- Change these variables if required");
WriteSQL("--");
WriteSQL("set @StartingNPCTypeID = " + SpawnDBID + ";");
WriteSQL("set @StartingSpawnGroupID = " + SpawnGroupID + ";");
WriteSQL("set @StartingSpawnEntryID = " + SpawnEntryID + ";");
WriteSQL("set @StartingSpawn2ID = " + Spawn2ID + ";");
WriteSQL("set @StartingGridID = " + GridDBID + ";");
WriteSQL("set @StartingMerchantID = " + MerchantDBID + ";");
WriteSQL("set @BaseDoorID = " + DoorDBID + ";");
WriteSQL("set @StartingGroundSpawnID = " + GroundSpawnDBID + ";");
WriteSQL("set @StartingObjectID = " + ObjectDBID + ";");
WriteSQL("--");
WriteSQL("--");
if (SQLForm.ZoneCheckBox.Checked)
StreamProcessor.GenerateZoneSQL(this.WriteSQL);
if (SQLForm.ZonePointCheckBox.Checked)
StreamProcessor.GenerateZonePointSQL(ZoneName, this.WriteSQL);
UInt32 SpawnVersion = (UInt32)SQLForm.VersionSelector.Value;
if (SQLForm.DoorCheckBox.Checked)
{
Log("Starting to generate SQL for Doors.");
StreamProcessor.GenerateDoorsSQL(ZoneName, DoorDBID, SpawnVersion, this.WriteSQL);
Log("Finished generating SQL for Doors.");
}
Log("Starting to generate SQL for Spawns and/or Grids.");
StreamProcessor.GenerateSpawnSQL(SQLForm.SpawnCheckBox.Checked, SQLForm.GridCheckBox.Checked, SQLForm.MerchantCheckBox.Checked, ZoneName, ZoneID, SpawnVersion, SQLForm.UpdateExistingNPCTypesCheckbox.Checked, SQLForm.NPCTypesTintCheckBox.Checked, SpawnNameFilter, CoalesceWaypoints, SQLForm.InvisibleMenCheckBox.Checked, this.WriteSQL);
Log("Finished generating SQL for Spawns and/or Grids.");
if (SQLForm.GroundSpawnCheckBox.Checked || SQLForm.ObjectCheckBox.Checked)
{
Log("Starting to generate SQL for Ground Spawns and/or Objects.");
StreamProcessor.GenerateObjectSQL(SQLForm.GroundSpawnCheckBox.Checked, SQLForm.ObjectCheckBox.Checked, SpawnVersion, this.WriteSQL);
Log("Finished generating SQL for Ground Spawns and/or Objects.");
}
StatusBar.Text = "SQL written to " + SQLFile;
SQLStream.Close();
}
private void menuPacketDump_Click(object sender, EventArgs e)
{
if (PacketDumpFileDialog.ShowDialog() == DialogResult.OK)
{
StatusBar.Text = "Packet dump in progress. Please wait...";
Log("Packets dump in progress...");
DisableAllControls();
Application.DoEvents();
if (StreamProcessor.DumpPackets(PacketDumpFileDialog.FileName, Properties.Settings.Default.DumpTimeStamps))
{
StatusBar.Text = "Packets dumped successfully.";
Log("Packets dumped successfully.");
}
else
{
StatusBar.Text = "Packet dump failed.";
Log("Packet dump failed.");
}
EnableAllControls();
}
}
private void menuDumpAAs_Click(object sender, EventArgs e)
{
if (PacketDumpFileDialog.ShowDialog() == DialogResult.OK)
{
Log("AA dump in progress...");
DisableAllControls();
if (StreamProcessor.DumpAAs(PacketDumpFileDialog.FileName))
{
StatusBar.Text = "AAs dumped successfully.";
Log("AAs dumped successfully.");
}
else
{
StatusBar.Text = "AA dumped failed.";
Log("AA dump failed.");
}
EnableAllControls();
}
}
private void menuExit_Click(object sender, EventArgs e)
{
Close();
}
private void menuViewDebugLog_Click(object sender, EventArgs e)
{
menuViewDebugLog.Checked = DebugLog.Visible;
if (!menuViewDebugLog.Checked)
{
menuViewDebugLog.Checked = true;
ShowDebugLog();
}
else
{
menuViewDebugLog.Checked = false;
DebugLog.Hide();
}
}
private void menuViewPackets_Click(object sender, EventArgs e)
{
DisableAllControls();
Application.DoEvents();
string TextFileViewer = Properties.Settings.Default.TextFileViewer;
string TempFileName = Path.GetTempFileName();
if (StreamProcessor.DumpPackets(TempFileName, Properties.Settings.Default.DumpTimeStamps))
{
try
{
System.Diagnostics.Process.Start(TextFileViewer, TempFileName);
}
catch
{
StatusBar.Text = "Unable to launch " + TextFileViewer;
}
}
else
{
StatusBar.Text = "Unexpected error while generating temporary file.";
}
EnableAllControls();
}
private void EQExtractor2Form1_Load(object sender, EventArgs e)
{
if (Properties.Settings.Default.ShowDebugWindowOnStartup)
{
ShowDebugLog();
}
}
private void DisplayUsageInfo()
{
#if DEBUG
Version += " (Debug Build)";
#else
Version += " (Release Build)";
#endif
Text = Version;
Log(Version + " Initialised.");
Log("");
Log("Instructions:");
Log("Generate a .pcap file using Wireshark. To do this, park a character in the zone you want to collect in.");
Log("Camp to character select. Start Wireshark capturing. Zone your character in and just sit around for a");
Log("while, or go and inspect merchant inventories if you want to collect those. When finished, stop the");
Log("Wireshark capture and save it (File/Save As).");
Log("");
Log("Load the .pcap file into this program by pressing Ctrl-L.");
Log("To generate SQL, press Ctrl-S and select the check boxes and set the starting SQL INSERT IDs as required.");
Log("Review the generated SQL before sourcing as DELETEs are auto-generated.");
Log("Press Ctrl-V to view packets, or Ctrl-D to dump them to a text file.");
Log("");
}
private void menuOptions_Click(object sender, EventArgs e)
{
DialogResult d = Options.ShowDialog();
if (d == DialogResult.OK)
{
Properties.Settings.Default.TextFileViewer = Options.PacketDumpViewerProgram.Text;
Properties.Settings.Default.ShowDebugWindowOnStartup = Options.ShowDebugWindowOnStartup.Checked;
Properties.Settings.Default.DumpTimeStamps = Options.ShowTimeStamps.Checked;
Properties.Settings.Default.Save();
if (Properties.Settings.Default.ShowDebugWindowOnStartup)
{
if (!DebugLog.Visible)
ShowDebugLog();
}
else
{
if (DebugLog.Visible)
{
DebugLog.Hide();
menuViewDebugLog.Checked = false;
}
}
}
else
{
Options.PacketDumpViewerProgram.Text = Properties.Settings.Default.TextFileViewer;
Options.ShowDebugWindowOnStartup.Checked = Properties.Settings.Default.ShowDebugWindowOnStartup;
Options.ShowTimeStamps.Checked = Properties.Settings.Default.DumpTimeStamps;
}
}
private void ShowDebugLog()
{
DebugLog.Left = this.Location.X;
DebugLog.Top = this.Location.Y + this.Height;
DebugLog.Show();
menuViewDebugLog.Checked = true;
this.Focus();
}
private void menuView_Popup(object sender, EventArgs e)
{
menuViewDebugLog.Checked = DebugLog.Visible;
}
}
}
@@ -0,0 +1,132 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="InputFileOpenDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="PacketDumpFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>308, 17</value>
</metadata>
<metadata name="mainMenu1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>580, 17</value>
</metadata>
<metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>697, 17</value>
</metadata>
</root>
+902
View File
@@ -0,0 +1,902 @@
//
// Copyright (C) 2001-2010 EQEMu Development Team (http://eqemulator.net). Distributed under GPL version 2.
//
//
// This is the netcode for turning SOE protocol packets into EQ Application Packets
//
using System;
using System.Text;
using System.IO;
using System.Collections.Generic;
using zlib;
using MyUtils;
using EQExtractor2.Patches;
using EQExtractor2.OpCodes;
using EQApplicationLayer;
namespace EQPacket
{
public enum PacketDirection {ClientToServer, ServerToClient, Unknown };
public class EQApplicationPacket
{
public EQApplicationPacket(System.Net.IPAddress srcIp, System.Net.IPAddress dstIp, ushort srcPort, ushort dstPort, int OpCode, int BufferSize, byte[] Source, int Offset, PacketDirection Direction, DateTime PacketTime)
{
this.OpCode = OpCode;
this.Direction = Direction;
this.PacketTime = PacketTime;
if (BufferSize < 0)
{
//Log("OPCode " + OpCode.ToString("x") + ", Buffer Size " + BufferSize + " Buffer Size < 0 !");
return;
}
Buffer = new byte[BufferSize];
Array.Copy(Source, Offset, Buffer, 0, BufferSize);
}
public byte[] Buffer;
public int OpCode;
public PacketDirection Direction;
public DateTime PacketTime;
public bool Locked = false;
}
public class PacketManager
{
bool DEBUG = false;
bool DUMPPACKETS = false;
private void Debug(string Message)
{
if (DebugLogger != null)
DebugLogger(Message);
}
public bool ErrorsInStream = false;
const UInt32 OP_SessionRequest = 0x0001;
const UInt32 OP_SessionResponse = 0x0002;
const UInt32 OP_Combined = 0x0003;
const UInt32 OP_Packet = 0x0009;
const UInt32 OP_Fragment = 0x000d;
const UInt32 OP_OutOfOrderAck = 0x0011;
const UInt32 OP_Ack = 0x0015;
private bool PermaLocked = false;
private bool Identified = false;
private int[] FragmentSeq = {-1, -1};
private int[] FragmentedPacketSize = {0, 0};
private int[] FragmentedBytesCollected = {0, 0};
private byte[][] Fragments = new byte [2][];
private System.Net.IPAddress ServerIP;
private ushort ServerPort = 0;
private int ExpectedServerSEQ = 0;
private System.Net.IPAddress ClientIP;
private ushort ClientPort = 0;
private int ExpectedClientSEQ = 0;
private ushort CryptoFlag = 0;
StreamIdentifier Identifier = null;
public DateTime LastPacketTime = DateTime.Now;
public List<EQApplicationPacket> PacketList = new List<EQApplicationPacket>();
LogHandler Logger = null;
LogHandler DebugLogger = null;
public void SetLogHandler(LogHandler Logger)
{
this.Logger = Logger;
}
public void SetDebugLogHandler(LogHandler Logger)
{
this.DebugLogger = Logger;
DEBUG = (Logger != null);
DUMPPACKETS = (Logger != null);
}
void Log(string Message)
{
if(Logger != null)
Logger(Message);
}
public delegate IdentificationStatus StreamIdentifier(int OPCode, int Size, PacketDirection Direction);
public void SetVersionIdentifierMethod(StreamIdentifier Identifier)
{
this.Identifier = Identifier;
}
public void AddPacket(EQApplicationPacket Packet)
{
#pragma warning disable 0162
if (DUMPPACKETS)
{
Debug("[OPCode: 0x" + Packet.OpCode.ToString("x") + "] [Size: " + Packet.Buffer.Length + "]");
Debug(Utils.HexDump(Packet.Buffer));
}
#pragma warning restore 0162
Packet.Locked = PermaLocked;
PacketList.Add(Packet);
}
private struct CacheEntry
{
public int Seq;
public PacketDirection Direction;
public byte[] Payload;
public DateTime PacketTime;
public bool SubPacket;
public CacheEntry(int inSeq, PacketDirection inDirection, byte[] inPayload, DateTime inPacketTime, bool inSubPacket)
{
Seq = inSeq;
Direction = inDirection;
Payload = inPayload;
PacketTime = inPacketTime;
SubPacket = inSubPacket;
}
}
private List<CacheEntry> Cache = new List<CacheEntry>();
private void AddToCache(int Seq, PacketDirection Direction, byte[] Payload, DateTime PacketTime, bool SubPacket)
{
if(DEBUG)
Debug("Adding packet with Seq " + Seq + " to cache.");
foreach(CacheEntry Existing in Cache)
{
if((Existing.Direction == Direction) && (Existing.Seq == Seq))
return;
}
CacheEntry ce = new CacheEntry(Seq, Direction, Payload, PacketTime, SubPacket);
Cache.Add(ce);
}
private bool CacheEmpty()
{
return (Cache.Count == 0);
}
public void DumpCache()
{
Log("Cache has " + Cache.Count + " elements.");
for (int i = 0; i < Cache.Count; ++i)
{
string Direction;
if (Cache[i].Direction == PacketDirection.ClientToServer)
Direction = "Client to Server";
else if (Cache[i].Direction == PacketDirection.ServerToClient)
Direction = "Server to Client";
else
Direction = "Unknown";
Log("Cache Entry Seq " + Cache[i].Seq + ", Direction:" + Direction);
}
}
private int FindCacheEntry(int Seq, PacketDirection Direction)
{
for(int i = 0; i < Cache.Count; ++i)
{
CacheEntry ce = Cache[i];
if ((ce.Seq == Seq) && (ce.Direction == Direction))
return i;
}
return -1;
}
private void ProcessCache()
{
int CacheElement;
CacheElement = FindCacheEntry(GetExpectedSeq(PacketDirection.ServerToClient), PacketDirection.ServerToClient);
while ( CacheElement >= 0)
{
if (DEBUG)
Debug("Processing packet with seq " + Cache[CacheElement].Seq + " from cache.");
ProcessPacket(ServerIP, ClientIP, ServerPort, ClientPort, Cache[CacheElement].Payload, Cache[CacheElement].PacketTime, Cache[CacheElement].SubPacket, true);
Cache.RemoveRange(CacheElement, 1);
if (DEBUG)
Debug("Cache now has " + Cache.Count + " elements.");
CacheElement = FindCacheEntry(GetExpectedSeq(PacketDirection.ServerToClient), PacketDirection.ServerToClient);
}
CacheElement = FindCacheEntry(GetExpectedSeq(PacketDirection.ClientToServer), PacketDirection.ClientToServer);
while (CacheElement >= 0)
{
ProcessPacket(ClientIP, ServerIP, ClientPort, ServerPort, Cache[CacheElement].Payload, Cache[CacheElement].PacketTime, Cache[CacheElement].SubPacket, true);
Cache.RemoveRange(CacheElement, 1);
CacheElement = FindCacheEntry(GetExpectedSeq(PacketDirection.ServerToClient), PacketDirection.ServerToClient);
}
}
private PacketDirection GetDirection(System.Net.IPAddress srcIp, System.Net.IPAddress dstIp, ushort srcPort, ushort dstPort)
{
if ((srcIp.Equals(ServerIP)) && (srcPort == ServerPort) && (dstIp.Equals(ClientIP)) && (dstPort == ClientPort))
return PacketDirection.ServerToClient;
if ((srcIp.Equals(ClientIP)) && (srcPort == ClientPort) && (dstIp.Equals(ServerIP)) && (dstPort == ServerPort))
return PacketDirection.ClientToServer;
return PacketDirection.Unknown;
}
private int GetExpectedSeq(PacketDirection Direction)
{
if (Direction == PacketDirection.ClientToServer)
return ExpectedClientSEQ;
else if (Direction == PacketDirection.ServerToClient)
return ExpectedServerSEQ;
return 0;
}
private void AdvanceSeq(PacketDirection Direction)
{
if (Direction == PacketDirection.ClientToServer)
++ExpectedClientSEQ;
else if (Direction == PacketDirection.ServerToClient)
++ExpectedServerSEQ;
}
public void ProcessPacket(System.Net.IPAddress srcIp, System.Net.IPAddress dstIp, ushort srcPort, ushort dstPort, byte[] Payload, DateTime PacketTime, bool SubPacket, bool Cached)
{
byte Flags = 0x00;
UInt32 OpCode = (UInt32)(Payload[0] * 256 + Payload[1]);
PacketDirection Direction = GetDirection(srcIp, dstIp, srcPort, dstPort);
if ((Direction == PacketDirection.Unknown) && (OpCode != OP_SessionRequest))
return;
// Check if this is a UCS connection and if so, skip packets until we see another OP_SessionRequest
if (((CryptoFlag & 4) > 0) && (OpCode != OP_SessionRequest))
return;
if (Direction == PacketDirection.ClientToServer)
Debug("Client -> Server");
else
Debug("Server -> Client");
Debug("Delta: " + (PacketTime - LastPacketTime));
TimeSpan Elapsed = PacketTime - LastPacketTime;
//if (Elapsed.Seconds > 1)
// Debug("*** More than 1 second elapsed ***");
LastPacketTime = PacketTime;
switch (OpCode)
{
case OP_SessionRequest:
{
if (PermaLocked)
break;
ClientIP = srcIp;
ClientPort = srcPort;
ServerIP = dstIp;
ServerPort = dstPort;
Log("-- Locked onto EQ Stream. Client IP " + srcIp + ":" + srcPort + " Server IP " + dstIp + ":" + dstPort);
ExpectedClientSEQ = 0;
ExpectedServerSEQ = 0;
CryptoFlag = 0;
break;
}
case OP_SessionResponse:
{
CryptoFlag = (ushort)(Payload[11] + (Payload[12] * 256));
Log("Stream Crypto Flag is 0x" + CryptoFlag.ToString("x4"));
break;
}
case OP_Combined:
{
if (DEBUG)
{
Debug("OP_Combined, Direction " + (Direction == PacketDirection.ClientToServer ? "Client->Server" : "Server->Client"));
Debug(Utils.HexDump(Payload));
}
byte[] Uncompressed;
if (!SubPacket && (Payload[2] == 0x5a))
{
Uncompressed = DecompressPacket(Payload, 3);
}
else if (!SubPacket && (Payload[2] == 0xa5))
{
Uncompressed = new byte[Payload.Length - 3];
Array.Copy(Payload, 3, Uncompressed, 0, Payload.Length - 3);
}
else
{
Uncompressed = new byte[Payload.Length - 2];
Array.Copy(Payload, 2, Uncompressed, 0, Payload.Length - 2);
}
int BufferPosition = 0;
while (BufferPosition < Uncompressed.Length - 2)
{
int SubPacketSize = Uncompressed[BufferPosition++];
byte[] NewPacket = new byte[SubPacketSize];
Array.Copy(Uncompressed, BufferPosition, NewPacket, 0, SubPacketSize);
BufferPosition += SubPacketSize;
ProcessPacket(srcIp, dstIp, srcPort, dstPort, NewPacket, PacketTime, true, Cached);
}
break;
}
case OP_Packet:
{
if (DEBUG)
Debug("OP_Packet, Subpacket = "+ SubPacket);
byte[] Uncompressed;
if (!SubPacket && (Payload[2] == 0x5a))
{
if (DEBUG)
Debug("Compressed");
Uncompressed = DecompressPacket(Payload, 3);
}
else if (!SubPacket && (Payload[2] == 0xa5))
{
if (DEBUG)
Debug("0xa5");
Uncompressed = new byte[Payload.Length - 5];
Array.Copy(Payload, 3, Uncompressed, 0, Payload.Length - 5);
}
else
{
if (DEBUG)
Debug("Uncompressed");
Uncompressed = new byte[Payload.Length - 2];
Array.Copy(Payload, 2, Uncompressed, 0, Payload.Length - 2);
}
if (DEBUG)
{
//Debug("Raw payload is:");
//Debug(Utils.HexDump(Payload));
//Debug("Uncompressed data is:");
//Debug(Utils.HexDump(Uncompressed));
}
int Seq = Uncompressed[0] * 256 + Uncompressed[1];
Debug("Seq is " + Seq + " Expected " + GetExpectedSeq(Direction));
if (Seq != GetExpectedSeq(Direction))
{
if (Seq > GetExpectedSeq(Direction))
{
if ((Seq - GetExpectedSeq(Direction) < 1000))
AddToCache(Seq, Direction, Payload, PacketTime, SubPacket);
else
{
Log("Giving up on seeing expected fragment.");
ErrorsInStream = true;
FragmentSeq[(int)Direction] = -1;
AdvanceSeq(Direction);
}
}
break;
}
else
AdvanceSeq(Direction);
bool Multi = ((Uncompressed[2] == 0x00) && (Uncompressed[3] == 0x19));
if (Multi)
{
int BufferPosition = 4;
while (BufferPosition < (Uncompressed.Length - 2))
{
int Size = 0;
if (Uncompressed[BufferPosition] == 0xff)
{
if (Uncompressed[BufferPosition + 1] == 0x01)
Size = 256 + Uncompressed[BufferPosition + 2];
else
Size = Uncompressed[BufferPosition + 2];
BufferPosition += 3;
}
else
Size = Uncompressed[BufferPosition++];
int OpCodeBytes = 2;
int AppOpCode = Uncompressed[BufferPosition++];
if (AppOpCode == 0)
{
++BufferPosition;
OpCodeBytes = 3;
}
AppOpCode += (Uncompressed[BufferPosition++] * 256);
ProcessAppPacket(srcIp, dstIp, srcPort, dstPort, AppOpCode, Size - OpCodeBytes, Uncompressed, BufferPosition, Direction, PacketTime);
BufferPosition = BufferPosition + (Size - OpCodeBytes);
}
}
else
{
int BufferPosition = 2;
int OpCodeBytes = 2;
int AppOpCode = Uncompressed[BufferPosition++];
if (AppOpCode == 0)
{
++BufferPosition;
OpCodeBytes = 3;
}
AppOpCode += (Uncompressed[BufferPosition++] * 256);
ProcessAppPacket(srcIp, dstIp, srcPort, dstPort, AppOpCode, Uncompressed.Length - (2 + OpCodeBytes), Uncompressed, BufferPosition, Direction, PacketTime);
}
break;
}
case OP_Fragment:
{
if (DEBUG)
{
Debug("OP_Fragment");
Debug("Raw Data");
Debug(Utils.HexDump(Payload));
}
byte[] Uncompressed;
if (!SubPacket && (Payload[2] == 0x5a))
{
if (DEBUG)
Debug("Compressed");
Uncompressed = DecompressPacket(Payload, 3);
}
else if (!SubPacket && (Payload[2] == 0xa5))
{
if (DEBUG)
Debug("0xa5");
Uncompressed = new byte[Payload.Length - 5];
Array.Copy(Payload, 3, Uncompressed, 0, Payload.Length - 5);
}
else
{
Uncompressed = new byte[Payload.Length - 2];
Array.Copy(Payload, 2, Uncompressed, 0, Payload.Length - 2);
}
if (DEBUG)
{
Debug("Uncompressed data.");
Debug(Utils.HexDump(Uncompressed));
}
if (FragmentSeq[(int)Direction] == -1)
{
if (DEBUG)
Debug("First fragment.");
FragmentSeq[(int)Direction] = (Uncompressed[0] * 256) + Uncompressed[1];
if (DEBUG)
Debug("FragmentSeq is " + FragmentSeq[(int)Direction] + " Expecting " + GetExpectedSeq(Direction));
if (FragmentSeq[(int)Direction] != GetExpectedSeq(Direction))
{
if (FragmentSeq[(int)Direction] > GetExpectedSeq(Direction))
{
if((FragmentSeq[(int)Direction] - GetExpectedSeq(Direction)) < 1000)
AddToCache(FragmentSeq[(int)Direction], Direction, Payload, PacketTime, SubPacket);
else
{
Log("Giving up on seeing expected fragment.");
ErrorsInStream = true;
FragmentSeq[(int)Direction] = -1;
AdvanceSeq(Direction);
}
}
FragmentSeq[(int)Direction] = -1;
break;
}
else
AdvanceSeq(Direction);
FragmentedPacketSize[(int)Direction] = Uncompressed[2] * 0x1000000 + Uncompressed[3] * 0x10000 + Uncompressed[4] * 0x100 + Uncompressed[5];
if((FragmentedPacketSize[(int)Direction] == 0) || (FragmentedPacketSize[(int)Direction] > 1000000))
{
if (DEBUG)
Debug("Got a fragmented packet of size " + FragmentedPacketSize[(int)Direction] + ". Discarding.");
ErrorsInStream = true;
FragmentSeq[(int)Direction] = -1;
break;
}
FragmentedBytesCollected[(int)Direction] = Uncompressed.Length - 6;
if (DEBUG)
Debug("Total packet size is " + FragmentedPacketSize[(int)Direction]);
if((Uncompressed.Length - 6) > FragmentedPacketSize[(int)Direction])
{
Log("Mangled fragment.");
ErrorsInStream = true;
FragmentSeq[(int)Direction] = -1;
break;
}
Fragments[(int)Direction] = new byte[FragmentedPacketSize[(int)Direction]];
if (DEBUG)
Debug("Copying " + (Uncompressed.Length - 6) + " bytes to Fragments starting at index 0");
Array.Copy(Uncompressed, 6, Fragments[(int)Direction], 0, Uncompressed.Length - 6);
}
else
{
int LastSeq = FragmentSeq[(int)Direction];
FragmentSeq[(int)Direction] = (Uncompressed[0] * 256) + Uncompressed[1];
if (DEBUG)
Debug("FragmentSeq is " + FragmentSeq[(int)Direction] + ". Expecting " + GetExpectedSeq(Direction));
if (FragmentSeq[(int)Direction] != GetExpectedSeq(Direction))
{
if (FragmentSeq[(int)Direction] > GetExpectedSeq(Direction))
{
if ((FragmentSeq[(int)Direction] - GetExpectedSeq(Direction)) < 1000)
AddToCache(FragmentSeq[(int)Direction], Direction, Payload, PacketTime, SubPacket);
else
{
Log("Giving up on seeing expected fragment.");
ErrorsInStream = true;
AdvanceSeq(Direction);
FragmentSeq[(int)Direction] = -1;
}
}
break;
}
else
AdvanceSeq(Direction);
if (DEBUG)
Debug("Copying " + (Uncompressed.Length - 2) + " bytes from Uncompressed to Fragments starting at " + FragmentedBytesCollected[(int)Direction]);
if ((Uncompressed.Length - 2) > (Fragments[(int)Direction].Length - FragmentedBytesCollected[(int)Direction]))
{
Log("Mangled fragment. Discarding.");
ErrorsInStream = true;
FragmentSeq[(int)Direction] = -1;
break;
}
Array.Copy(Uncompressed, 2, Fragments[(int)Direction], FragmentedBytesCollected[(int)Direction], Uncompressed.Length - 2);
FragmentedBytesCollected[(int)Direction] += Uncompressed.Length - 2;
if (FragmentedBytesCollected[(int)Direction] == FragmentedPacketSize[(int)Direction])
{
if (DEBUG)
Debug("Got whole packet.");
if ((Fragments[(int)Direction][0] == 0x00) && (Fragments[1][(int)Direction] == 0x019))
{
if (DEBUG)
Debug("Multi packet.");
int BufferPosition = 2;
while (BufferPosition < Fragments[(int)Direction].Length)
{
int Size = 0;
if (Fragments[(int)Direction][BufferPosition] == 0xff)
{
if (Fragments[(int)Direction][BufferPosition + 1] == 0x01)
Size = 256 + Fragments[(int)Direction][BufferPosition + 2];
else
Size = Fragments[(int)Direction][BufferPosition + 2];
BufferPosition += 3;
}
else
Size = Fragments[(int)Direction][BufferPosition++];
int OpCodeBytes = 2;
int AppOpCode = Fragments[(int)Direction][BufferPosition++];
if (AppOpCode == 0)
{
++BufferPosition;
OpCodeBytes = 3;
}
AppOpCode += (Fragments[(int)Direction][BufferPosition++] * 256);
ProcessAppPacket(srcIp, dstIp, srcPort, dstPort, AppOpCode, Size - OpCodeBytes, Fragments[(int)Direction], BufferPosition, Direction, PacketTime);
BufferPosition = BufferPosition + (Size - OpCodeBytes);
}
}
else
{
int BufferPosition = 0;
int OpCodeBytes = 2;
int AppOpCode = Fragments[(int)Direction][BufferPosition++];
if (AppOpCode == 0)
{
++BufferPosition;
OpCodeBytes = 3;
}
AppOpCode += (Fragments[(int)Direction][BufferPosition++] * 256);
byte[] NewPacket = new byte[Fragments[(int)Direction].Length - OpCodeBytes];
Array.Copy(Fragments[(int)Direction], BufferPosition, NewPacket, 0, Fragments[(int)Direction].Length - OpCodeBytes);
ProcessAppPacket(srcIp, dstIp, srcPort, dstPort, AppOpCode, NewPacket.Length, NewPacket, 0, Direction, PacketTime);
}
if (DEBUG)
Debug("Reseting FragmentSeq to -1");
FragmentSeq[(int)Direction] = -1;
}
}
break;
}
case OP_OutOfOrderAck:
{
int Seq = Payload[2] * 256 + Payload[3];
if (DEBUG)
Debug("OP_OutOfOrder " + Seq);
break;
}
case OP_Ack:
{
int Seq;
if(Payload.Length > 4)
Seq = Payload[3] * 256 + Payload[4];
else
Seq = Payload[2] * 256 + Payload[3];
string DirectionString;
if(Direction == PacketDirection.ClientToServer)
DirectionString = "Client to Server";
else
DirectionString = "Server to Client";
if (DEBUG)
{
Debug("OP_Ack, Seq " + Seq + " " + DirectionString);
Debug(Utils.HexDump(Payload));
}
break;
}
default:
if (OpCode > 0xff)
{
if (DEBUG)
{
Debug("Unencapsulated EQ Application OpCode. Subpacket is " + SubPacket.ToString());
Debug("--- Raw payload ---");
Debug(Utils.HexDump(Payload));
Debug("-------------------");
}
int AppOpCode;
byte[] NewPacket;
if (SubPacket)
{
AppOpCode = Payload[1] * 256 + Payload[0];
NewPacket = new byte[Payload.Length - 2];
Array.Copy(Payload, 2, NewPacket, 0, Payload.Length - 2);
}
else
{
// This packet has a flag byte between the first and second bytes of the opcode, and also a CRC
Flags = Payload[1];
if (Flags == 0x5a)
{
if(DEBUG)
Debug("Compressed unencapsulated packet.");
byte[] NewPayload = new byte[Payload.Length - 4];
Array.Copy(Payload, 2, NewPayload, 0, Payload.Length - 4);
byte[] Uncompressed = DecompressPacket(NewPayload, 0);
if (DEBUG)
{
Debug("Uncompressed Payload:");
Debug(Utils.HexDump(Uncompressed));
}
// Opcode is first byte of compressed payload and first byte of uncompressed data
AppOpCode = Uncompressed[0] * 256 + Payload[0];
NewPacket = new byte[Uncompressed.Length - 1];
Array.Copy(Uncompressed, 1, NewPacket, 0, Uncompressed.Length - 1);
}
else
{
AppOpCode = Payload[2] * 256 + Payload[0];
NewPacket = new byte[Payload.Length - 5];
Array.Copy(Payload, 3, NewPacket, 0, Payload.Length - 5);
}
}
ProcessAppPacket(srcIp, dstIp, srcPort, dstPort, AppOpCode, NewPacket.Length, NewPacket, 0, Direction, PacketTime);
}
else
{
if (DEBUG)
{
Debug("OP_Unknown (" + OpCode.ToString("x") + ")");
Debug(Utils.HexDump(Payload));
}
}
break;
}
if (!Cached && !CacheEmpty())
ProcessCache();
}
public void ProcessAppPacket(System.Net.IPAddress srcIp, System.Net.IPAddress dstIp, ushort srcPort, ushort dstPort, int InOpCode, int BufferSize, byte[] Source, int Offset, PacketDirection Direction, DateTime PacketTime)
{
EQApplicationPacket app = new EQApplicationPacket(srcIp, dstIp, srcPort, dstPort, InOpCode, BufferSize, Source, Offset, Direction, PacketTime);
if (!Identified)
{
IdentificationStatus TempStatus = Identifier(InOpCode, BufferSize, Direction);
if (!PermaLocked && (TempStatus > IdentificationStatus.No))
{
Log("-- Permalocking to this stream.");
PermaLocked = true;
}
Identified = (TempStatus == IdentificationStatus.Yes);
}
AddPacket(app);
}
public byte[] DecompressPacket(byte[] Payload, int Offset)
{
MemoryStream ms = new MemoryStream(Payload.GetUpperBound(0) - Offset);
ms.Write(Payload, Offset, Payload.GetUpperBound(0) - Offset);
ms.Seek(0, System.IO.SeekOrigin.Begin);
ZInputStream zs = new ZInputStream(ms);
int UncompressedSize;
byte[] Uncompressed = new byte[4096];
try
{
UncompressedSize = zs.read(Uncompressed, 0, 4096);
}
catch
{
if(DEBUG)
Debug("DECOMPRESSION FAILURE");
Array.Copy(Payload, Offset - 1, Uncompressed, 0, Payload.Length - (Offset - 1));
UncompressedSize = Payload.Length - (Offset - 1);
}
zs.Close();
zs.Dispose();
ms.Close();
ms.Dispose();
Array.Resize(ref Uncompressed, UncompressedSize);
return Uncompressed;
}
}
}
@@ -0,0 +1,625 @@
namespace EQExtractor2
{
partial class GenerateSQLForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.MerchantTextBox = new System.Windows.Forms.MaskedTextBox();
this.MerchantLabel = new System.Windows.Forms.Label();
this.GroundSpawnTextBox = new System.Windows.Forms.MaskedTextBox();
this.GroundSpawnLabel = new System.Windows.Forms.Label();
this.ObjectTextBox = new System.Windows.Forms.MaskedTextBox();
this.label1 = new System.Windows.Forms.Label();
this.GridTextBox = new System.Windows.Forms.MaskedTextBox();
this.GridLabel = new System.Windows.Forms.Label();
this.Spawn2TextBox = new System.Windows.Forms.MaskedTextBox();
this.Spawn2Label = new System.Windows.Forms.Label();
this.SpawnEntryTextBox = new System.Windows.Forms.MaskedTextBox();
this.SpawnEntryLabel = new System.Windows.Forms.Label();
this.SpawnGroupTextBox = new System.Windows.Forms.MaskedTextBox();
this.SpawnGroupLabel = new System.Windows.Forms.Label();
this.NPCTypesTextBox = new System.Windows.Forms.MaskedTextBox();
this.label3 = new System.Windows.Forms.Label();
this.DoorsTextBox = new System.Windows.Forms.MaskedTextBox();
this.DoorsLabel = new System.Windows.Forms.Label();
this.VersionSelector = new System.Windows.Forms.NumericUpDown();
this.VersionLabel = new System.Windows.Forms.Label();
this.label4 = new System.Windows.Forms.Label();
this.ZoneIDTextBox = new System.Windows.Forms.MaskedTextBox();
this.groupBox2 = new System.Windows.Forms.GroupBox();
this.NPCTypesTintCheckBox = new System.Windows.Forms.CheckBox();
this.UpdateExistingNPCTypesCheckbox = new System.Windows.Forms.CheckBox();
this.ZonePointCheckBox = new System.Windows.Forms.CheckBox();
this.ZoneCheckBox = new System.Windows.Forms.CheckBox();
this.MerchantCheckBox = new System.Windows.Forms.CheckBox();
this.GroundSpawnCheckBox = new System.Windows.Forms.CheckBox();
this.ObjectCheckBox = new System.Windows.Forms.CheckBox();
this.GridCheckBox = new System.Windows.Forms.CheckBox();
this.SpawnCheckBox = new System.Windows.Forms.CheckBox();
this.DoorCheckBox = new System.Windows.Forms.CheckBox();
this.SQLFileDialog = new System.Windows.Forms.SaveFileDialog();
this.GenerateSQLButton = new System.Windows.Forms.Button();
this.SQLCancelButton = new System.Windows.Forms.Button();
this.MiscOptions = new System.Windows.Forms.GroupBox();
this.SpawnNameFilter = new System.Windows.Forms.TextBox();
this.label2 = new System.Windows.Forms.Label();
this.CoalesceWaypoints = new System.Windows.Forms.CheckBox();
this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
this.InvisibleMenCheckBox = new System.Windows.Forms.CheckBox();
this.groupBox1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.VersionSelector)).BeginInit();
this.groupBox2.SuspendLayout();
this.MiscOptions.SuspendLayout();
this.SuspendLayout();
//
// groupBox1
//
this.groupBox1.Controls.Add(this.MerchantTextBox);
this.groupBox1.Controls.Add(this.MerchantLabel);
this.groupBox1.Controls.Add(this.GroundSpawnTextBox);
this.groupBox1.Controls.Add(this.GroundSpawnLabel);
this.groupBox1.Controls.Add(this.ObjectTextBox);
this.groupBox1.Controls.Add(this.label1);
this.groupBox1.Controls.Add(this.GridTextBox);
this.groupBox1.Controls.Add(this.GridLabel);
this.groupBox1.Controls.Add(this.Spawn2TextBox);
this.groupBox1.Controls.Add(this.Spawn2Label);
this.groupBox1.Controls.Add(this.SpawnEntryTextBox);
this.groupBox1.Controls.Add(this.SpawnEntryLabel);
this.groupBox1.Controls.Add(this.SpawnGroupTextBox);
this.groupBox1.Controls.Add(this.SpawnGroupLabel);
this.groupBox1.Controls.Add(this.NPCTypesTextBox);
this.groupBox1.Controls.Add(this.label3);
this.groupBox1.Controls.Add(this.DoorsTextBox);
this.groupBox1.Controls.Add(this.DoorsLabel);
this.groupBox1.Controls.Add(this.VersionSelector);
this.groupBox1.Controls.Add(this.VersionLabel);
this.groupBox1.Controls.Add(this.label4);
this.groupBox1.Controls.Add(this.ZoneIDTextBox);
this.groupBox1.Location = new System.Drawing.Point(12, 12);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(262, 345);
this.groupBox1.TabIndex = 0;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "Insert IDs";
//
// MerchantTextBox
//
this.MerchantTextBox.Enabled = false;
this.MerchantTextBox.HidePromptOnLeave = true;
this.MerchantTextBox.Location = new System.Drawing.Point(107, 302);
this.MerchantTextBox.Mask = "0000000000";
this.MerchantTextBox.Name = "MerchantTextBox";
this.MerchantTextBox.PromptChar = ' ';
this.MerchantTextBox.Size = new System.Drawing.Size(61, 20);
this.MerchantTextBox.TabIndex = 34;
//
// MerchantLabel
//
this.MerchantLabel.AutoSize = true;
this.MerchantLabel.Location = new System.Drawing.Point(14, 306);
this.MerchantLabel.Name = "MerchantLabel";
this.MerchantLabel.Size = new System.Drawing.Size(76, 13);
this.MerchantLabel.TabIndex = 33;
this.MerchantLabel.Text = "Merchant Lists";
//
// GroundSpawnTextBox
//
this.GroundSpawnTextBox.Enabled = false;
this.GroundSpawnTextBox.HidePromptOnLeave = true;
this.GroundSpawnTextBox.Location = new System.Drawing.Point(107, 274);
this.GroundSpawnTextBox.Mask = "0000000000";
this.GroundSpawnTextBox.Name = "GroundSpawnTextBox";
this.GroundSpawnTextBox.PromptChar = ' ';
this.GroundSpawnTextBox.Size = new System.Drawing.Size(61, 20);
this.GroundSpawnTextBox.TabIndex = 32;
//
// GroundSpawnLabel
//
this.GroundSpawnLabel.AutoSize = true;
this.GroundSpawnLabel.Location = new System.Drawing.Point(7, 278);
this.GroundSpawnLabel.Name = "GroundSpawnLabel";
this.GroundSpawnLabel.Size = new System.Drawing.Size(83, 13);
this.GroundSpawnLabel.TabIndex = 31;
this.GroundSpawnLabel.Text = "Ground Spawns";
//
// ObjectTextBox
//
this.ObjectTextBox.Enabled = false;
this.ObjectTextBox.HidePromptOnLeave = true;
this.ObjectTextBox.Location = new System.Drawing.Point(107, 246);
this.ObjectTextBox.Mask = "0000000000";
this.ObjectTextBox.Name = "ObjectTextBox";
this.ObjectTextBox.PromptChar = ' ';
this.ObjectTextBox.Size = new System.Drawing.Size(61, 20);
this.ObjectTextBox.TabIndex = 30;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(47, 250);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(43, 13);
this.label1.TabIndex = 29;
this.label1.Text = "Objects";
//
// GridTextBox
//
this.GridTextBox.Enabled = false;
this.GridTextBox.HidePromptOnLeave = true;
this.GridTextBox.Location = new System.Drawing.Point(107, 218);
this.GridTextBox.Mask = "0000000000";
this.GridTextBox.Name = "GridTextBox";
this.GridTextBox.PromptChar = ' ';
this.GridTextBox.Size = new System.Drawing.Size(61, 20);
this.GridTextBox.TabIndex = 28;
//
// GridLabel
//
this.GridLabel.AutoSize = true;
this.GridLabel.Location = new System.Drawing.Point(59, 222);
this.GridLabel.Name = "GridLabel";
this.GridLabel.Size = new System.Drawing.Size(31, 13);
this.GridLabel.TabIndex = 27;
this.GridLabel.Text = "Grids";
//
// Spawn2TextBox
//
this.Spawn2TextBox.Enabled = false;
this.Spawn2TextBox.HidePromptOnLeave = true;
this.Spawn2TextBox.Location = new System.Drawing.Point(107, 190);
this.Spawn2TextBox.Mask = "0000000000";
this.Spawn2TextBox.Name = "Spawn2TextBox";
this.Spawn2TextBox.PromptChar = ' ';
this.Spawn2TextBox.Size = new System.Drawing.Size(61, 20);
this.Spawn2TextBox.TabIndex = 26;
//
// Spawn2Label
//
this.Spawn2Label.AutoSize = true;
this.Spawn2Label.Location = new System.Drawing.Point(44, 194);
this.Spawn2Label.Name = "Spawn2Label";
this.Spawn2Label.Size = new System.Drawing.Size(46, 13);
this.Spawn2Label.TabIndex = 25;
this.Spawn2Label.Text = "Spawn2";
//
// SpawnEntryTextBox
//
this.SpawnEntryTextBox.Enabled = false;
this.SpawnEntryTextBox.HidePromptOnLeave = true;
this.SpawnEntryTextBox.Location = new System.Drawing.Point(107, 162);
this.SpawnEntryTextBox.Mask = "0000000000";
this.SpawnEntryTextBox.Name = "SpawnEntryTextBox";
this.SpawnEntryTextBox.PromptChar = ' ';
this.SpawnEntryTextBox.Size = new System.Drawing.Size(61, 20);
this.SpawnEntryTextBox.TabIndex = 24;
//
// SpawnEntryLabel
//
this.SpawnEntryLabel.AutoSize = true;
this.SpawnEntryLabel.Location = new System.Drawing.Point(26, 166);
this.SpawnEntryLabel.Name = "SpawnEntryLabel";
this.SpawnEntryLabel.Size = new System.Drawing.Size(64, 13);
this.SpawnEntryLabel.TabIndex = 23;
this.SpawnEntryLabel.Text = "SpawnEntry";
//
// SpawnGroupTextBox
//
this.SpawnGroupTextBox.Enabled = false;
this.SpawnGroupTextBox.HidePromptOnLeave = true;
this.SpawnGroupTextBox.Location = new System.Drawing.Point(107, 134);
this.SpawnGroupTextBox.Mask = "0000000000";
this.SpawnGroupTextBox.Name = "SpawnGroupTextBox";
this.SpawnGroupTextBox.PromptChar = ' ';
this.SpawnGroupTextBox.Size = new System.Drawing.Size(61, 20);
this.SpawnGroupTextBox.TabIndex = 22;
//
// SpawnGroupLabel
//
this.SpawnGroupLabel.AutoSize = true;
this.SpawnGroupLabel.Location = new System.Drawing.Point(21, 138);
this.SpawnGroupLabel.Name = "SpawnGroupLabel";
this.SpawnGroupLabel.Size = new System.Drawing.Size(69, 13);
this.SpawnGroupLabel.TabIndex = 21;
this.SpawnGroupLabel.Text = "SpawnGroup";
//
// NPCTypesTextBox
//
this.NPCTypesTextBox.Enabled = false;
this.NPCTypesTextBox.HidePromptOnLeave = true;
this.NPCTypesTextBox.Location = new System.Drawing.Point(107, 106);
this.NPCTypesTextBox.Mask = "0000000000";
this.NPCTypesTextBox.Name = "NPCTypesTextBox";
this.NPCTypesTextBox.PromptChar = ' ';
this.NPCTypesTextBox.Size = new System.Drawing.Size(61, 20);
this.NPCTypesTextBox.TabIndex = 20;
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(32, 110);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(58, 13);
this.label3.TabIndex = 19;
this.label3.Text = "NPCTypes";
//
// DoorsTextBox
//
this.DoorsTextBox.Enabled = false;
this.DoorsTextBox.HidePromptOnLeave = true;
this.DoorsTextBox.Location = new System.Drawing.Point(107, 78);
this.DoorsTextBox.Mask = "0000000000";
this.DoorsTextBox.Name = "DoorsTextBox";
this.DoorsTextBox.PromptChar = ' ';
this.DoorsTextBox.Size = new System.Drawing.Size(61, 20);
this.DoorsTextBox.TabIndex = 18;
//
// DoorsLabel
//
this.DoorsLabel.AutoSize = true;
this.DoorsLabel.Location = new System.Drawing.Point(55, 82);
this.DoorsLabel.Name = "DoorsLabel";
this.DoorsLabel.Size = new System.Drawing.Size(35, 13);
this.DoorsLabel.TabIndex = 17;
this.DoorsLabel.Text = "Doors";
//
// VersionSelector
//
this.VersionSelector.Enabled = false;
this.VersionSelector.Location = new System.Drawing.Point(107, 50);
this.VersionSelector.Maximum = new decimal(new int[] {
999,
0,
0,
0});
this.VersionSelector.Name = "VersionSelector";
this.VersionSelector.Size = new System.Drawing.Size(39, 20);
this.VersionSelector.TabIndex = 16;
this.VersionSelector.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
this.VersionSelector.ValueChanged += new System.EventHandler(this.VersionSelector_ValueChanged);
//
// VersionLabel
//
this.VersionLabel.AutoSize = true;
this.VersionLabel.Location = new System.Drawing.Point(48, 54);
this.VersionLabel.Name = "VersionLabel";
this.VersionLabel.Size = new System.Drawing.Size(42, 13);
this.VersionLabel.TabIndex = 15;
this.VersionLabel.Text = "Version";
//
// label4
//
this.label4.AutoSize = true;
this.label4.Location = new System.Drawing.Point(44, 26);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(46, 13);
this.label4.TabIndex = 14;
this.label4.Text = "ZoneID:";
//
// ZoneIDTextBox
//
this.ZoneIDTextBox.Enabled = false;
this.ZoneIDTextBox.HidePromptOnLeave = true;
this.ZoneIDTextBox.Location = new System.Drawing.Point(107, 22);
this.ZoneIDTextBox.Mask = "0000000";
this.ZoneIDTextBox.Name = "ZoneIDTextBox";
this.ZoneIDTextBox.PromptChar = ' ';
this.ZoneIDTextBox.Size = new System.Drawing.Size(100, 20);
this.ZoneIDTextBox.TabIndex = 13;
this.ZoneIDTextBox.Validated += new System.EventHandler(this.ZoneIDTextBox_Validated);
//
// groupBox2
//
this.groupBox2.Controls.Add(this.InvisibleMenCheckBox);
this.groupBox2.Controls.Add(this.NPCTypesTintCheckBox);
this.groupBox2.Controls.Add(this.UpdateExistingNPCTypesCheckbox);
this.groupBox2.Controls.Add(this.ZonePointCheckBox);
this.groupBox2.Controls.Add(this.ZoneCheckBox);
this.groupBox2.Controls.Add(this.MerchantCheckBox);
this.groupBox2.Controls.Add(this.GroundSpawnCheckBox);
this.groupBox2.Controls.Add(this.ObjectCheckBox);
this.groupBox2.Controls.Add(this.GridCheckBox);
this.groupBox2.Controls.Add(this.SpawnCheckBox);
this.groupBox2.Controls.Add(this.DoorCheckBox);
this.groupBox2.Location = new System.Drawing.Point(298, 12);
this.groupBox2.Name = "groupBox2";
this.groupBox2.Size = new System.Drawing.Size(200, 345);
this.groupBox2.TabIndex = 1;
this.groupBox2.TabStop = false;
this.groupBox2.Text = "Include";
//
// NPCTypesTintCheckBox
//
this.NPCTypesTintCheckBox.AutoSize = true;
this.NPCTypesTintCheckBox.Location = new System.Drawing.Point(24, 233);
this.NPCTypesTintCheckBox.Name = "NPCTypesTintCheckBox";
this.NPCTypesTintCheckBox.Size = new System.Drawing.Size(117, 17);
this.NPCTypesTintCheckBox.TabIndex = 42;
this.NPCTypesTintCheckBox.Text = "Use npc_types_tint";
this.toolTip1.SetToolTip(this.NPCTypesTintCheckBox, "Uses the npc_types_tint table instead of the tint columns in the npc_types table." +
"");
this.NPCTypesTintCheckBox.UseVisualStyleBackColor = true;
//
// UpdateExistingNPCTypesCheckbox
//
this.UpdateExistingNPCTypesCheckbox.AutoSize = true;
this.UpdateExistingNPCTypesCheckbox.Location = new System.Drawing.Point(24, 210);
this.UpdateExistingNPCTypesCheckbox.Name = "UpdateExistingNPCTypesCheckbox";
this.UpdateExistingNPCTypesCheckbox.Size = new System.Drawing.Size(152, 17);
this.UpdateExistingNPCTypesCheckbox.TabIndex = 41;
this.UpdateExistingNPCTypesCheckbox.Text = "Update existing NPC types";
this.UpdateExistingNPCTypesCheckbox.UseVisualStyleBackColor = true;
this.UpdateExistingNPCTypesCheckbox.CheckedChanged += new System.EventHandler(this.UpdateExistingNPCTypesCheckbox_CheckedChanged);
//
// ZonePointCheckBox
//
this.ZonePointCheckBox.AutoSize = true;
this.ZonePointCheckBox.Checked = true;
this.ZonePointCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.ZonePointCheckBox.Location = new System.Drawing.Point(24, 187);
this.ZonePointCheckBox.Name = "ZonePointCheckBox";
this.ZonePointCheckBox.Size = new System.Drawing.Size(83, 17);
this.ZonePointCheckBox.TabIndex = 40;
this.ZonePointCheckBox.Text = "Zone Points";
this.ZonePointCheckBox.UseVisualStyleBackColor = true;
//
// ZoneCheckBox
//
this.ZoneCheckBox.AutoSize = true;
this.ZoneCheckBox.Checked = true;
this.ZoneCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.ZoneCheckBox.Location = new System.Drawing.Point(24, 164);
this.ZoneCheckBox.Name = "ZoneCheckBox";
this.ZoneCheckBox.Size = new System.Drawing.Size(84, 17);
this.ZoneCheckBox.TabIndex = 39;
this.ZoneCheckBox.Text = "Zone Config";
this.ZoneCheckBox.UseVisualStyleBackColor = true;
//
// MerchantCheckBox
//
this.MerchantCheckBox.AutoSize = true;
this.MerchantCheckBox.Checked = true;
this.MerchantCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.MerchantCheckBox.Location = new System.Drawing.Point(24, 141);
this.MerchantCheckBox.Name = "MerchantCheckBox";
this.MerchantCheckBox.Size = new System.Drawing.Size(95, 17);
this.MerchantCheckBox.TabIndex = 38;
this.MerchantCheckBox.Text = "Merchant Lists";
this.MerchantCheckBox.UseVisualStyleBackColor = true;
//
// GroundSpawnCheckBox
//
this.GroundSpawnCheckBox.AutoSize = true;
this.GroundSpawnCheckBox.Checked = true;
this.GroundSpawnCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.GroundSpawnCheckBox.Location = new System.Drawing.Point(24, 118);
this.GroundSpawnCheckBox.Name = "GroundSpawnCheckBox";
this.GroundSpawnCheckBox.Size = new System.Drawing.Size(102, 17);
this.GroundSpawnCheckBox.TabIndex = 9;
this.GroundSpawnCheckBox.Text = "Ground Spawns";
this.GroundSpawnCheckBox.UseVisualStyleBackColor = true;
//
// ObjectCheckBox
//
this.ObjectCheckBox.AutoSize = true;
this.ObjectCheckBox.Checked = true;
this.ObjectCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.ObjectCheckBox.Location = new System.Drawing.Point(24, 95);
this.ObjectCheckBox.Name = "ObjectCheckBox";
this.ObjectCheckBox.Size = new System.Drawing.Size(62, 17);
this.ObjectCheckBox.TabIndex = 8;
this.ObjectCheckBox.Text = "Objects";
this.ObjectCheckBox.UseVisualStyleBackColor = true;
//
// GridCheckBox
//
this.GridCheckBox.AutoSize = true;
this.GridCheckBox.Checked = true;
this.GridCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.GridCheckBox.Location = new System.Drawing.Point(24, 72);
this.GridCheckBox.Name = "GridCheckBox";
this.GridCheckBox.Size = new System.Drawing.Size(50, 17);
this.GridCheckBox.TabIndex = 7;
this.GridCheckBox.Text = "Grids";
this.GridCheckBox.UseVisualStyleBackColor = true;
//
// SpawnCheckBox
//
this.SpawnCheckBox.AutoSize = true;
this.SpawnCheckBox.Checked = true;
this.SpawnCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.SpawnCheckBox.Location = new System.Drawing.Point(24, 49);
this.SpawnCheckBox.Name = "SpawnCheckBox";
this.SpawnCheckBox.Size = new System.Drawing.Size(64, 17);
this.SpawnCheckBox.TabIndex = 5;
this.SpawnCheckBox.Text = "Spawns";
this.SpawnCheckBox.UseVisualStyleBackColor = true;
this.SpawnCheckBox.CheckedChanged += new System.EventHandler(this.SpawnCheckBox_CheckedChanged);
//
// DoorCheckBox
//
this.DoorCheckBox.AutoSize = true;
this.DoorCheckBox.Checked = true;
this.DoorCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
this.DoorCheckBox.Location = new System.Drawing.Point(24, 26);
this.DoorCheckBox.Name = "DoorCheckBox";
this.DoorCheckBox.Size = new System.Drawing.Size(54, 17);
this.DoorCheckBox.TabIndex = 4;
this.DoorCheckBox.Text = "Doors";
this.DoorCheckBox.UseVisualStyleBackColor = true;
//
// SQLFileDialog
//
this.SQLFileDialog.Filter = "SQL Files (*.sql)|*.sql|Text Files (*.txt)|*.txt|All files (*.*)|*.*";
this.SQLFileDialog.Title = "Generate SQL and Save As";
//
// GenerateSQLButton
//
this.GenerateSQLButton.Location = new System.Drawing.Point(126, 474);
this.GenerateSQLButton.Name = "GenerateSQLButton";
this.GenerateSQLButton.Size = new System.Drawing.Size(100, 27);
this.GenerateSQLButton.TabIndex = 3;
this.GenerateSQLButton.Text = "Generate SQL";
this.GenerateSQLButton.UseVisualStyleBackColor = true;
this.GenerateSQLButton.Click += new System.EventHandler(this.GenerateSQLButton_Click);
//
// SQLCancelButton
//
this.SQLCancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.SQLCancelButton.Location = new System.Drawing.Point(305, 474);
this.SQLCancelButton.Name = "SQLCancelButton";
this.SQLCancelButton.Size = new System.Drawing.Size(100, 27);
this.SQLCancelButton.TabIndex = 4;
this.SQLCancelButton.Text = "Cancel";
this.SQLCancelButton.UseVisualStyleBackColor = true;
this.SQLCancelButton.Click += new System.EventHandler(this.SQLCancelButton_Click);
//
// MiscOptions
//
this.MiscOptions.Controls.Add(this.SpawnNameFilter);
this.MiscOptions.Controls.Add(this.label2);
this.MiscOptions.Controls.Add(this.CoalesceWaypoints);
this.MiscOptions.Location = new System.Drawing.Point(12, 368);
this.MiscOptions.Name = "MiscOptions";
this.MiscOptions.Size = new System.Drawing.Size(486, 76);
this.MiscOptions.TabIndex = 2;
this.MiscOptions.TabStop = false;
this.MiscOptions.Text = "Misc. Options";
//
// SpawnNameFilter
//
this.SpawnNameFilter.Location = new System.Drawing.Point(229, 46);
this.SpawnNameFilter.Name = "SpawnNameFilter";
this.SpawnNameFilter.Size = new System.Drawing.Size(209, 20);
this.SpawnNameFilter.TabIndex = 5;
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(14, 49);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(209, 13);
this.label2.TabIndex = 4;
this.label2.Text = "Only include spawns that contain the string";
//
// CoalesceWaypoints
//
this.CoalesceWaypoints.AutoSize = true;
this.CoalesceWaypoints.Checked = true;
this.CoalesceWaypoints.CheckState = System.Windows.Forms.CheckState.Checked;
this.CoalesceWaypoints.Location = new System.Drawing.Point(17, 19);
this.CoalesceWaypoints.Name = "CoalesceWaypoints";
this.CoalesceWaypoints.Size = new System.Drawing.Size(184, 17);
this.CoalesceWaypoints.TabIndex = 3;
this.CoalesceWaypoints.Text = "Automatically coalesce waypoints";
this.toolTip1.SetToolTip(this.CoalesceWaypoints, "Remove redundant waypoints from generated SQL");
this.CoalesceWaypoints.UseVisualStyleBackColor = true;
//
// InvisibleMenCheckBox
//
this.InvisibleMenCheckBox.AutoSize = true;
this.InvisibleMenCheckBox.Location = new System.Drawing.Point(24, 256);
this.InvisibleMenCheckBox.Name = "InvisibleMenCheckBox";
this.InvisibleMenCheckBox.Size = new System.Drawing.Size(126, 17);
this.InvisibleMenCheckBox.TabIndex = 43;
this.InvisibleMenCheckBox.Text = "Include Invisible Men";
this.toolTip1.SetToolTip(this.InvisibleMenCheckBox, "Includes Race 127 NPCs");
this.InvisibleMenCheckBox.UseVisualStyleBackColor = true;
//
// GenerateSQLForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.SQLCancelButton;
this.ClientSize = new System.Drawing.Size(514, 513);
this.Controls.Add(this.MiscOptions);
this.Controls.Add(this.SQLCancelButton);
this.Controls.Add(this.GenerateSQLButton);
this.Controls.Add(this.groupBox2);
this.Controls.Add(this.groupBox1);
this.Name = "GenerateSQLForm";
this.Text = "Generate SQL";
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.VersionSelector)).EndInit();
this.groupBox2.ResumeLayout(false);
this.groupBox2.PerformLayout();
this.MiscOptions.ResumeLayout(false);
this.MiscOptions.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.GroupBox groupBox2;
private System.Windows.Forms.Label VersionLabel;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.Label DoorsLabel;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label SpawnGroupLabel;
private System.Windows.Forms.Label SpawnEntryLabel;
private System.Windows.Forms.Label Spawn2Label;
private System.Windows.Forms.Label GridLabel;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label GroundSpawnLabel;
private System.Windows.Forms.Label MerchantLabel;
public System.Windows.Forms.NumericUpDown VersionSelector;
public System.Windows.Forms.MaskedTextBox ZoneIDTextBox;
public System.Windows.Forms.MaskedTextBox DoorsTextBox;
public System.Windows.Forms.MaskedTextBox NPCTypesTextBox;
public System.Windows.Forms.MaskedTextBox SpawnGroupTextBox;
public System.Windows.Forms.MaskedTextBox SpawnEntryTextBox;
public System.Windows.Forms.MaskedTextBox Spawn2TextBox;
public System.Windows.Forms.MaskedTextBox GridTextBox;
public System.Windows.Forms.MaskedTextBox ObjectTextBox;
public System.Windows.Forms.MaskedTextBox GroundSpawnTextBox;
public System.Windows.Forms.MaskedTextBox MerchantTextBox;
public System.Windows.Forms.CheckBox SpawnCheckBox;
public System.Windows.Forms.CheckBox DoorCheckBox;
public System.Windows.Forms.CheckBox GroundSpawnCheckBox;
public System.Windows.Forms.CheckBox ObjectCheckBox;
public System.Windows.Forms.CheckBox GridCheckBox;
public System.Windows.Forms.CheckBox ZonePointCheckBox;
public System.Windows.Forms.CheckBox ZoneCheckBox;
public System.Windows.Forms.CheckBox MerchantCheckBox;
public System.Windows.Forms.CheckBox NPCTypesTintCheckBox;
public System.Windows.Forms.CheckBox UpdateExistingNPCTypesCheckbox;
private System.Windows.Forms.SaveFileDialog SQLFileDialog;
private System.Windows.Forms.Button GenerateSQLButton;
private System.Windows.Forms.Button SQLCancelButton;
private System.Windows.Forms.GroupBox MiscOptions;
public System.Windows.Forms.CheckBox CoalesceWaypoints;
public System.Windows.Forms.TextBox SpawnNameFilter;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.ToolTip toolTip1;
public System.Windows.Forms.CheckBox InvisibleMenCheckBox;
}
}
@@ -0,0 +1,103 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace EQExtractor2
{
public partial class GenerateSQLForm : Form
{
public string FileName = "";
public GenerateSQLForm()
{
InitializeComponent();
}
public void RecalculateBaseInsertIDs()
{
UInt32 ZoneNumber = Convert.ToUInt32(ZoneIDTextBox.Text);
NPCTypesTextBox.Text = ((ZoneNumber * 1000) + (VersionSelector.Value * 100)).ToString();
SpawnEntryTextBox.Text = NPCTypesTextBox.Text;
SpawnGroupTextBox.Text = NPCTypesTextBox.Text;
Spawn2TextBox.Text = NPCTypesTextBox.Text;
GridTextBox.Text = NPCTypesTextBox.Text;
ObjectTextBox.Text = NPCTypesTextBox.Text;
GroundSpawnTextBox.Text = NPCTypesTextBox.Text;
MerchantTextBox.Text = NPCTypesTextBox.Text;
DoorsTextBox.Text = ((VersionSelector.Value * 1000)).ToString();
}
private void VersionSelector_ValueChanged(object sender, EventArgs e)
{
RecalculateBaseInsertIDs();
}
private void ZoneIDTextBox_Validated(object sender, EventArgs e)
{
RecalculateBaseInsertIDs();
}
private void SpawnCheckBox_CheckedChanged(object sender, EventArgs e)
{
if (!SpawnCheckBox.Checked)
{
GridCheckBox.Checked = false;
GridCheckBox.Enabled = false;
}
else
GridCheckBox.Enabled = true;
}
private void UpdateExistingNPCTypesCheckbox_CheckedChanged(object sender, EventArgs e)
{
if (UpdateExistingNPCTypesCheckbox.Checked)
{
SpawnCheckBox.Checked = false;
SpawnCheckBox.Enabled = false;
GridCheckBox.Checked = false;
GridCheckBox.Enabled = false;
MerchantCheckBox.Checked = false;
MerchantCheckBox.Enabled = false;
ZoneCheckBox.Checked = false;
ZonePointCheckBox.Checked = false;
GridCheckBox.Checked = false;
DoorCheckBox.Checked = false;
ObjectCheckBox.Checked = false;
GroundSpawnCheckBox.Checked = false;
}
else
{
SpawnCheckBox.Enabled = true;
GridCheckBox.Enabled = true;
MerchantCheckBox.Enabled = true;
}
}
private void GenerateSQLButton_Click(object sender, EventArgs e)
{
if (SQLFileDialog.ShowDialog() == DialogResult.OK)
{
FileName = SQLFileDialog.FileName;
this.DialogResult = DialogResult.OK;
//Close();
//return;
}
}
private void SQLCancelButton_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Cancel;
}
}
}
@@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="toolTip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>580, 17</value>
</metadata>
<metadata name="SQLFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
</root>
@@ -0,0 +1,691 @@
//
// Copyright (C) 2001-2010 EQEMu Development Team (http://eqemulator.net). Distributed under GPL version 2.
//
//
using System;
using System.Collections.Generic;
namespace EQExtractor2.InternalTypes
{
class Constants
{
public const UInt32 MATERIAL_HEAD = 0;
public const UInt32 MATERIAL_CHEST = 1;
public const UInt32 MATERIAL_PRIMARY = 7;
public const UInt32 MATERIAL_SECONDARY = 8;
}
class GroundSpawnStruct
{
public UInt32 DropID;
public string Name;
public UInt16 ZoneID;
public UInt16 InstanceID;
public float Heading;
public float y;
public float x;
public float z;
public UInt32 ObjectType;
}
public class NewZoneStruct
{
public NewZoneStruct()
{
FogRed = new byte[4];
FogGreen = new byte[4];
FogBlue = new byte[4];
FogMinClip = new float[4];
FogMaxClip = new float[4];
}
public string ShortName;
public string LongName;
public byte Type;
public byte[] FogRed;
public byte[] FogGreen;
public byte[] FogBlue;
public float[] FogMinClip;
public float[] FogMaxClip;
public float Gravity;
public byte TimeType;
public byte Sky;
public float ZEM;
public float SafeY;
public float SafeX;
public float SafeZ;
public float MinZ;
public float MaxZ;
public float UnderWorld;
public float MinClip;
public float MaxClip;
public string ShortName2;
public UInt16 ZoneID;
public UInt16 InstanceID;
public byte FallDamage;
public float FogDensity;
}
public class ZoneEntryStruct
{
public ZoneEntryStruct()
{
SlotColour = new UInt32[9];
Equipment = new UInt32[9];
}
public string SpawnName;
public UInt32 SpawnID;
public bool Findable;
public Byte Level;
public Byte IsNPC;
public uint Showname;
public uint TargetableWithHotkey;
public uint Targetable;
public uint ShowHelm;
public uint Gender;
public byte OtherData;
public string DestructableString1;
public string DestructableString2;
public string DestructableString3;
public UInt32 DestructableUnk1;
public UInt32 DestructableUnk2;
public UInt32 DestructableID1;
public UInt32 DestructableID2;
public UInt32 DestructableID3;
public UInt32 DestructableID4;
public UInt32 DestructableUnk3;
public UInt32 DestructableUnk4;
public UInt32 DestructableUnk5;
public UInt32 DestructableUnk6;
public UInt32 DestructableUnk7;
public UInt32 DestructableUnk8;
public UInt32 DestructableUnk9;
public byte DestructableByte;
public float Size;
public byte Face;
public float WalkSpeed;
public float RunSpeed;
public UInt32 Race;
public byte PropCount;
public UInt32 BodyType;
public byte HairColor;
public byte BeardColor;
public byte EyeColor1;
public byte EyeColor2;
public byte HairStyle;
public byte Beard;
public UInt32 DrakkinHeritage;
public UInt32 DrakkinTattoo;
public UInt32 DrakkinDetails;
public UInt32 Deity;
public byte Class;
public byte EquipChest2;
public byte Helm;
public string LastName;
public UInt32 PetOwnerID;
public float YPos;
public float Heading;
public float XPos;
public float ZPos;
public UInt32[] SlotColour;
public byte ArmorTintRed;
public byte ArmorTintGreen;
public byte ArmorTintBlue;
public UInt32 MeleeTexture1;
public UInt32 MeleeTexture2;
public UInt32[] Equipment;
public string Title;
public string Suffix;
public byte IsMercenary;
public UInt32 Padding5;
public UInt32 Padding7;
public UInt32 Padding26;
}
public class NPCSpawn
{
public NPCSpawn(UInt32 SpawnID, UInt32 Spawn2DBID, UInt32 NPCTypeID, string Name)
{
this.SpawnID = SpawnID;
this.Spawn2DBID = Spawn2DBID;
this.NPCTypeID = NPCTypeID;
this.Name = Name;
}
public bool DoesHaveHighResWaypoints()
{
return HasHighResWaypoints;
}
public void SetHasHighResWaypoints()
{
HasHighResWaypoints = true;
}
public void AddWaypoint(Position p, bool HighRes)
{
Waypoints.Add(p);
if (HighRes)
HasHighResWaypoints = true;
}
public UInt32 SpawnID;
public UInt32 Spawn2DBID;
public UInt32 NPCTypeID;
public string Name;
bool HasHighResWaypoints = false;
public List<Position> Waypoints = new List<Position>();
}
public class NPCTypeList
{
List<NPCType> _NPCTypeList = new List<NPCType>();
public void AddNPCType(NPCType NewNPC)
{
_NPCTypeList.Add(NewNPC);
}
public List<NPCType> GetUniqueSpawns()
{
foreach (NPCType n in _NPCTypeList)
{
if (NPCType.IsPlayableRace(n.Race) || NPCType.IsGuardRace(n.Race))
n.Unique = true;
else
n.Unique = false;
}
for (int i = 0; i < _NPCTypeList.Count; ++i)
{
for (int j = 0; j < _NPCTypeList.Count; ++j)
{
if ((i != j) && (_NPCTypeList[i].Name == _NPCTypeList[j].Name))
{
_NPCTypeList[i].Unique = false;
}
}
}
List<NPCType> Results = new List<NPCType>();
foreach (NPCType n in _NPCTypeList)
if (n.Unique)
Results.Add(n);
return Results;
}
public UInt32 FindNPCType(string Name, Byte Level, uint Gender, float Size, Byte Face, float WalkSpeed, float RunSpeed, UInt32 Race,
UInt32 BodyType, Byte HairColor, Byte BeardColor, Byte EyeColor1, Byte EyeColor2, Byte HairStyle, Byte Beard,
UInt32 DrakkinHeritage, UInt32 DrakkinTattoo, UInt32 DrakkinDetails, UInt32 Deity, Byte Class, Byte EquipChest2,
Byte Helm, string LastName)
{
foreach (NPCType n in _NPCTypeList)
{
if (n.Name != Name)
continue;
if (n.Level != Level)
continue;
if (n.Gender != Gender)
continue;
if (n.Size != Size)
continue;
if (n.Face != Face)
continue;
if (n.WalkSpeed != WalkSpeed)
continue;
if (n.RunSpeed != RunSpeed)
continue;
if (n.Race != Race)
continue;
if (n.BodyType != BodyType)
continue;
if (n.HairColor != HairColor)
continue;
if (n.BeardColor != BeardColor)
continue;
if (n.EyeColor1 != EyeColor1)
continue;
if (n.EyeColor2 != EyeColor2)
continue;
if (n.HairStyle != HairStyle)
continue;
if (n.Beard != Beard)
continue;
if (n.DrakkinHeritage != DrakkinHeritage)
continue;
if (n.DrakkinTattoo != DrakkinTattoo)
continue;
if (n.DrakkinDetails != DrakkinDetails)
continue;
if (n.Deity != Deity)
continue;
if (n.Class != Class)
continue;
if (n.EquipChest2 != EquipChest2)
continue;
if (n.Helm != Helm)
continue;
if (n.LastName != LastName)
continue;
//Console.WriteLine("Found NPCType already in list, returning {0}", n.DBID);
return n.DBID;
}
return 0;
}
}
public class NPCSpawnList
{
public List<NPCSpawn> _NPCSpawnList = new List<NPCSpawn>();
public NPCSpawn GetNPC(UInt32 SpawnID)
{
foreach (NPCSpawn s in _NPCSpawnList)
{
if (s.SpawnID == SpawnID)
return s;
}
return null;
}
public bool DoesHaveHighResWaypoints(UInt32 SpawnID)
{
foreach (NPCSpawn s in _NPCSpawnList)
{
if (s.SpawnID == SpawnID)
{
if (s.DoesHaveHighResWaypoints())
return true;
else
return false;
}
}
return false;
}
public void AddNPCSpawn(UInt32 DBID, UInt32 SpawnID, UInt32 NPCTypeID, string Name)
{
NPCSpawn NewSpawn = new NPCSpawn(DBID, SpawnID, NPCTypeID, Name);
_NPCSpawnList.Add(NewSpawn);
}
public void AddWaypoint(UInt32 SpawnID, Position p, bool HighRes)
{
foreach (NPCSpawn n in _NPCSpawnList)
{
if (n.SpawnID == SpawnID)
{
n.AddWaypoint(p, HighRes);
return;
}
}
}
}
public struct ZonePoint
{
public ZonePoint(UInt32 Number, UInt16 ZoneID, UInt16 Instance, float x, float y, float z,
float TargetX, float TargetY, float TargetZ, float Heading, UInt32 TargetZoneID)
{
this.Number = Number;
this.ZoneID = ZoneID;
this.Instance = Instance;
this.x = x;
this.y = y;
this.z = z;
this.TargetX = TargetX;
this.TargetY = TargetY;
this.TargetZ = TargetZ;
this.Heading = Heading;
this.TargetZoneID = TargetZoneID;
}
public UInt32 Number;
public UInt16 ZoneID;
public UInt16 Instance;
public float x;
public float y;
public float z;
public float TargetX;
public float TargetY;
public float TargetZ;
public float Heading;
public UInt32 TargetZoneID;
};
struct Item
{
public UInt32 StackSize;
public UInt32 Slot;
public UInt32 MerchantSlot;
public UInt32 Price;
public Int32 Quantity;
public string Name;
public string Lore;
public string IDFile;
public UInt32 ID;
};
struct MerchantItem
{
public MerchantItem(UInt32 ItemID, string Name, UInt32 Slot, int Quantity)
{
this.ItemID = ItemID;
this.Name = Name;
this.Slot = Slot;
this.Quantity = Quantity;
}
public UInt32 ItemID;
public string Name;
public UInt32 Slot;
public int Quantity;
}
struct Merchant
{
public Merchant(UInt32 SpawnID)
{
this.SpawnID = SpawnID;
this.Items = new List<MerchantItem>();
}
public UInt32 SpawnID;
public List<MerchantItem> Items;
}
public class NPCType
{
public NPCType(UInt32 DBID, string Name, Byte Level, uint Gender, float Size, Byte Face, float WalkSpeed, float RunSpeed, UInt32 Race,
UInt32 BodyType, Byte HairColor, Byte BeardColor, Byte EyeColor1, Byte EyeColor2, Byte HairStyle, Byte Beard,
UInt32 DrakkinHeritage, UInt32 DrakkinTattoo, UInt32 DrakkinDetails, UInt32 Deity, Byte Class, Byte EquipChest2,
Byte Helm, string LastName, bool Findable, UInt32 MeleeTexture1, UInt32 MeleeTexture2,
UInt32 ArmorTintRed, UInt32 ArmorTintGreen, UInt32 ArmorTintBlue, UInt32[] SlotColour)
{
this.DBID = DBID;
this.Name = Name;
this.Level = Level;
this.Gender = Gender;
this.Size = Size;
this.Face = Face;
this.WalkSpeed = WalkSpeed;
this.RunSpeed = RunSpeed;
this.Race = Race;
this.BodyType = BodyType;
this.HairColor = HairColor;
this.BeardColor = BeardColor;
this.EyeColor1 = EyeColor1;
this.EyeColor2 = EyeColor2;
this.HairStyle = HairStyle;
this.Beard = Beard;
this.DrakkinHeritage = DrakkinHeritage;
this.DrakkinTattoo = DrakkinTattoo;
this.DrakkinDetails = DrakkinDetails;
this.Deity = Deity;
this.Class = Class;
this.EquipChest2 = EquipChest2;
this.Helm = Helm;
this.LastName = LastName;
this.Findable = Findable;
this.MeleeTexture1 = MeleeTexture1;
this.MeleeTexture2 = MeleeTexture2;
this.ArmorTintRed = ArmorTintRed;
this.ArmorTintGreen = ArmorTintGreen;
this.ArmorTintBlue = ArmorTintBlue;
this.SlotColour = SlotColour;
this.Unique = true;
}
public static bool IsPlayableRace(UInt32 Race)
{
if (Race <= 12 || Race == 128 || Race == 130 || Race == 330 || Race == 522)
return true;
return false;
}
static UInt32[] GuardRaces = { 44, 67, 71, 77, 78, 81, 90, 92, 93, 94, 106, 112, 139, 183, 239 };
public static bool IsGuardRace(UInt32 Race)
{
if (Array.IndexOf(GuardRaces, Race) >= 0)
return true;
return false;
}
public static bool IsMount(string Name)
{
if (Name.IndexOf("`s_Mount") >= 0)
return true;
return false;
}
public UInt32 DBID;
public string Name = "";
public Byte Level = 0;
public uint Gender = 0;
public float Size = 0;
public Byte Face = 0;
public float WalkSpeed = 0;
public float RunSpeed = 0;
public UInt32 Race = 0;
public UInt32 BodyType = 0;
public Byte HairColor = 0;
public Byte BeardColor = 0;
public Byte EyeColor1 = 0;
public Byte EyeColor2 = 0;
public Byte HairStyle = 0;
public Byte Beard = 0;
public UInt32 DrakkinHeritage = 0;
public UInt32 DrakkinTattoo = 0;
public UInt32 DrakkinDetails = 0;
public UInt32 Deity = 0;
public Byte Class = 0;
public Byte EquipChest2 = 0;
public Byte Helm = 0;
public string LastName = "";
public bool Findable = false;
public UInt32 MeleeTexture1 = 0;
public UInt32 MeleeTexture2 = 0;
public UInt32 ArmorTintRed = 0;
public UInt32 ArmorTintGreen = 0;
public UInt32 ArmorTintBlue = 0;
public UInt32[] SlotColour;
public bool Unique = true;
}
public class Position
{
public Position()
{
}
public Position(float x, float y, float z, float heading, DateTime TimeStamp)
{
this.x = x;
this.y = y;
this.z = z;
this.heading = heading;
this.TimeStamp = TimeStamp;
}
public double Distance(Position p)
{
float XDiff = this.x - p.x;
float YDiff = this.y - p.y;
return Math.Sqrt((XDiff * XDiff) + (YDiff * YDiff));
}
public float x, y, z, heading;
public DateTime TimeStamp;
}
public class PositionUpdate
{
public PositionUpdate()
{
p = new Position();
}
public UInt32 SpawnID;
public Position p;
public bool HighRes;
}
public class ExplorerSpawnRecord
{
public ExplorerSpawnRecord(UInt32 ID, string Name)
{
this.ID = ID;
this.Name = Name;
}
public UInt32 ID;
public string Name;
}
public class Door
{
public Door(string Name, float YPos, float XPos, float ZPos, float Heading, UInt32 Incline, Int32 Size, Byte ID, Byte OpenType,
Byte StateAtSpawn, Byte InvertState, Int32 DoorParam, string DestZone, float DestX, float DestY, float DestZ,
float DestHeading)
{
this.Name = Name;
this.YPos = YPos;
this.XPos = XPos;
this.ZPos = ZPos;
this.Heading = Heading;
this.Incline = Incline;
this.Size = Size;
this.ID = ID;
this.OpenType = OpenType;
this.StateAtSpawn = StateAtSpawn;
this.InvertState = InvertState;
this.DoorParam = DoorParam;
this.DestZone = DestZone;
this.DestX = DestX;
this.DestY = DestY;
this.DestZ = DestZ;
this.DestHeading = DestHeading;
}
public string Name;
public float YPos;
public float XPos;
public float ZPos;
public float Heading;
public UInt32 Incline;
public Int32 Size;
public Byte ID;
public Byte OpenType;
public Byte StateAtSpawn;
public Byte InvertState;
public Int32 DoorParam;
public string DestZone;
public float DestX;
public float DestY;
public float DestZ;
public float DestHeading;
}
class MerchantManager
{
public bool AddMerchant(UInt32 SpawnID)
{
foreach (Merchant m in MerchantList)
{
if (m.SpawnID == SpawnID)
return false;
}
Merchant nm = new Merchant(SpawnID);
MerchantList.Add(nm);
return true;
}
public int FindMerchant(UInt32 SpawnID)
{
for (int i = 0; i < MerchantList.Count; ++i)
{
if (MerchantList[i].SpawnID == SpawnID)
return i;
}
return -1;
}
public bool AddMerchantItem(UInt32 SpawnID, UInt32 ItemID, string Name, UInt32 Slot, int Quantity)
{
int i = FindMerchant(SpawnID);
if (i < 0)
return false;
for (int j = 0; j < MerchantList[i].Items.Count; ++j)
if (MerchantList[i].Items[j].ItemID == ItemID)
return false;
MerchantItem NewItem = new MerchantItem(ItemID, Name, Slot, Quantity);
MerchantList[i].Items.Add(NewItem);
return true;
}
public List<Merchant> MerchantList = new List<Merchant>();
}
}
+67
View File
@@ -0,0 +1,67 @@
namespace EQExtractor2
{
partial class LogForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.ConsoleWindow = new System.Windows.Forms.ListBox();
this.SuspendLayout();
//
// ConsoleWindow
//
this.ConsoleWindow.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.ConsoleWindow.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.ConsoleWindow.FormattingEnabled = true;
this.ConsoleWindow.HorizontalScrollbar = true;
this.ConsoleWindow.ItemHeight = 14;
this.ConsoleWindow.Location = new System.Drawing.Point(12, 12);
this.ConsoleWindow.Name = "ConsoleWindow";
this.ConsoleWindow.Size = new System.Drawing.Size(938, 326);
this.ConsoleWindow.TabIndex = 35;
//
// LogForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(962, 355);
this.Controls.Add(this.ConsoleWindow);
this.Name = "LogForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
this.Text = "EQExtractor2 Debug Log";
this.Closing += new System.ComponentModel.CancelEventHandler(this.LogForm_FormClosing);
this.ResumeLayout(false);
}
#endregion
public System.Windows.Forms.ListBox ConsoleWindow;
}
}
@@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace EQExtractor2
{
public partial class LogForm : Form
{
public LogForm()
{
InitializeComponent();
}
private void LogForm_FormClosing(Object sender, System.ComponentModel.CancelEventArgs e)
{
e.Cancel = true;
this.Hide();
}
}
}
@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>
@@ -0,0 +1,161 @@
//
// Copyright (C) 2001-2010 EQEMu Development Team (http://eqemulator.net). Distributed under GPL version 2.
//
//
using System;
using System.IO;
using System.Collections.Generic;
using EQPacket;
using MyUtils;
namespace EQExtractor2.OpCodes
{
public class OpCode
{
public UInt32 Value;
public string Name;
public ExplorerMethod Explorer;
public UInt32 Count;
public OpCode(string inName, UInt32 inValue)
{
Name = inName;
Value = inValue;
Explorer = null;
Count = 0;
}
}
public delegate void ExplorerMethod(StreamWriter OutputStream, ByteStream Buffer, PacketDirection Direction);
public class OpCodeManager
{
public List<OpCode> OpCodeList = new List<OpCode>();
public bool Init(string ConfFile, ref string ErrorMessage)
{
StreamReader sr;
string PatchFile = ConfFile;
try
{
sr = new StreamReader(PatchFile);
}
catch
{
ErrorMessage = "Unable to open opcode file " + PatchFile;
return false;
}
string Line;
while ((Line = sr.ReadLine()) != null)
{
if (Line.Length == 0)
continue;
if (Line[0] == '#')
continue;
int EqualsSign = Line.IndexOf("=");
if (EqualsSign < 0)
continue;
string OPCodeName = Line.Substring(0, EqualsSign);
string OPCodeValue = Line.Substring(EqualsSign + 1, 6);
UInt32 OPCodeNumber = 0;
try
{
OPCodeNumber = Convert.ToUInt32(OPCodeValue, 16);
}
catch
{
ErrorMessage = "Malformed OPCode value for " + OPCodeName;
OPCodeNumber = 0;
}
if (OPCodeNumber > 0)
AddOpCode(OPCodeName, OPCodeNumber);
}
return true;
}
public void AddOpCode(string OpCodeName, UInt32 OpCodeValue)
{
OpCode NewOpCode = new OpCode(OpCodeName, OpCodeValue);
OpCodeList.Add(NewOpCode);
}
public string OpCodeToName(int OpCodeValue)
{
foreach (OpCode oc in OpCodeList)
{
if (oc.Value == OpCodeValue)
return oc.Name;
}
return "OP_Unknown";
}
public OpCode GetOpCodeByNumber(int OpCodeValue)
{
foreach (OpCode oc in OpCodeList)
{
if (oc.Value == OpCodeValue)
return oc;
}
return null;
}
public UInt32 OpCodeNameToNumber(string Name)
{
foreach (OpCode oc in OpCodeList)
{
if (oc.Name == Name)
return oc.Value;
}
return 0;
}
public void ResetCounts()
{
foreach (OpCode oc in OpCodeList)
oc.Count = 0;
}
public void RegisterExplorer(string Name, ExplorerMethod Explorer)
{
foreach (OpCode oc in OpCodeList)
{
if (oc.Name == Name)
{
oc.Explorer = Explorer;
return;
}
}
}
public void UnRegisterExplorer(string Name)
{
// Designed to be used when a decoder wants to use some of it's base classes explorers, but some need to be UnRegistered
// as they are incompatible with the current patch version.
// i.e.
// base.RegisterExplorers();
// UnRegisterExplorer("OP_NotCompatible");
//
foreach (OpCode oc in OpCodeList)
{
if (oc.Name == Name)
{
oc.Explorer = null;
return;
}
}
}
}
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,112 @@
using System;
using System.IO;
using System.Collections.Generic;
using EQExtractor2.InternalTypes;
using EQExtractor2.OpCodes;
using EQPacket;
using MyUtils;
namespace EQExtractor2.Patches
{
class PatchAug042011Decoder : PatchMay242011Decoder
{
public PatchAug042011Decoder()
{
Version = "EQ Client Build Date August 04 2011.";
ExpectedPPLength = 28496;
PPZoneIDOffset = 21164;
PatchConfFileName = "patch_Aug04-2011.conf";
}
public override void RegisterExplorers()
{
//OpManager.RegisterExplorer("OP_MercenaryDataResponse", ExploreMercenaryDataResponse);
}
public void ExploreMercenaryDataResponse(StreamWriter OutputStream, ByteStream Buffer, PacketDirection Direction)
{
UInt32 TypeCount = Buffer.ReadUInt32();
//OutputStream.WriteLine("Type Count: {0}\r\n", TypeCount);
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Number of Types (Journeyman and Apprentice in this case\r\n", TypeCount);
for (int i = 0; i < TypeCount; ++i)
{
UInt32 TypeDBStringID = Buffer.ReadUInt32();
//OutputStream.WriteLine(" Type {0} DBStringID {1}", i, TypeDBStringID);
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // DBStringID for Type {1}", TypeDBStringID, i);
}
UInt32 Count2 = Buffer.ReadUInt32();
//OutputStream.WriteLine(" Count 2 is {0}", Count2);
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Count of Sub-types that follow", Count2);
for (int i = 0; i < Count2; ++i)
{
int Offset = Buffer.GetPosition();
UInt32 Unknown1 = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Unknown", Unknown1);
UInt32 DBStringID1 = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // DBStringID of Type", DBStringID1);
UInt32 DBStringID2 = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // DBStringID of Sub-Type", DBStringID2);
UInt32 PurchaseCost = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Purchase Cost", PurchaseCost);
UInt32 UpkeepCost = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Upkeep Cost", UpkeepCost);
UInt32 Unknown2 = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Unknown", Unknown2);
UInt32 Unknown3 = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Unknown", Unknown3);
UInt32 Unknown4 = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Unknown", Unknown4);
byte Unknown5 = Buffer.ReadByte();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint8, Buffer, {0}); // Unknown", Unknown5);
UInt32 Unknown6 = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Unknown", Unknown6);
UInt32 Unknown7 = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Unknown", Unknown7);
UInt32 Unknown8 = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Unknown", Unknown8);
UInt32 StanceCount = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Number of Stances for this Merc", StanceCount);
UInt32 Unknown10 = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Unknown", Unknown10);
byte Unknown11 = Buffer.ReadByte();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint8, Buffer, {0}); // Unknown", Unknown11);
//OutputStream.WriteLine(" Offset: {5} Unknown1: {0} DBStrings: {1} {2} Purchase: {3} Upkeep: {4}\r\n", Unknown1, DBStringID1, DBStringID2,
// PurchaseCost, UpkeepCost, Offset);
//OutputStream.WriteLine(" Unknowns: {0} {1} {2} {3} {4} {5} {6} {7} {8}\r\n",
// Unknown2, Unknown3, Unknown4, Unknown5, Unknown6, Unknown7, Unknown8, Unknown10, Unknown11);
//OutputStream.WriteLine(" Stance Count: {0}", StanceCount);
for (int j = 0; j < StanceCount; ++j)
{
UInt32 StanceNum = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Stance Number", StanceNum);
UInt32 StanceType = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Stance DBStringID (1 = Passive, 2 = Balanced etc.", StanceType);
//OutputStream.WriteLine(" {0}: {1}", StanceNum, StanceType);
}
OutputStream.WriteLine("");
}
OutputStream.WriteLine("\r\nBuffer position at end is {0}", Buffer.GetPosition());
OutputStream.WriteLine("");
}
}
}
@@ -0,0 +1,46 @@
using System;
using System.IO;
using System.Collections.Generic;
using EQExtractor2.InternalTypes;
using EQExtractor2.OpCodes;
using EQPacket;
using MyUtils;
namespace EQExtractor2.Patches
{
class PatchAugust152012Decoder : PatchJuly132012Decoder
{
public PatchAugust152012Decoder()
{
Version = "EQ Client Build Date August 15 2012.";
ExpectedPPLength = 33904;
PPZoneIDOffset = 26572;
PatchConfFileName = "patch_August15-2012.conf";
}
override public Item DecodeItemPacket(byte[] PacketBuffer)
{
ByteStream Buffer = new ByteStream(PacketBuffer);
Item NewItem = new Item();
Buffer.SetPosition(30);
NewItem.MerchantSlot = Buffer.ReadByte();
NewItem.Price = Buffer.ReadUInt32();
Buffer.SkipBytes(5);
NewItem.Quantity = Buffer.ReadInt32();
Buffer.SetPosition(109);
// 109
NewItem.Name = Buffer.ReadString(true);
NewItem.Lore = Buffer.ReadString(true);
NewItem.IDFile = Buffer.ReadString(true);
Buffer.SkipBytes(1);
NewItem.ID = Buffer.ReadUInt32();
return NewItem;
}
}
}
@@ -0,0 +1,57 @@
using System;
using System.IO;
using System.Collections.Generic;
using EQExtractor2.InternalTypes;
using EQExtractor2.OpCodes;
using EQPacket;
using MyUtils;
namespace EQExtractor2.Patches
{
class PatchDec072010Decoder : PatchOct202010Decoder
{
public PatchDec072010Decoder()
{
Version = "EQ Client Build Date December 7 2010.";
PatchConfFileName = "patch_Dec7-2010.conf";
}
override public IdentificationStatus Identify(int OpCode, int Size, PacketDirection Direction)
{
if ((OpCode == OpManager.OpCodeNameToNumber("OP_ZoneEntry")) && (Direction == PacketDirection.ClientToServer))
return IdentificationStatus.Tentative;
if ((OpCode == OpManager.OpCodeNameToNumber("OP_SendAATable")) && (Direction == PacketDirection.ServerToClient) &&
(Size == 120))
return IdentificationStatus.Yes;
return IdentificationStatus.No;
}
public override void RegisterExplorers()
{
//OpManager.RegisterExplorer("OP_ClientUpdate", ExploreClientUpdate);
}
public void ExploreClientUpdate(StreamWriter OutputStream, ByteStream Buffer, PacketDirection Direction)
{
UInt16 SpawnID = Buffer.ReadUInt16();
Buffer.SkipBytes(6);
float x = Buffer.ReadSingle();
float y = Buffer.ReadSingle();
Buffer.SkipBytes(12);
float z = Buffer.ReadSingle();
Buffer.SkipBytes(4);
UInt32 Temp = Buffer.ReadUInt32();
Temp = Temp & 0x3FFFFF;
Temp = Temp >> 10;
float heading = Utils.EQ19ToFloat((Int32)(Temp));
OutputStream.WriteLine("Loc: {0}, {1}, {2} Heading: {3}", x, y, z, heading);
OutputStream.WriteLine("");
}
}
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,63 @@
using System;
using System.IO;
using System.Collections.Generic;
using EQExtractor2.InternalTypes;
using EQExtractor2.OpCodes;
using EQPacket;
using MyUtils;
namespace EQExtractor2.Patches
{
class PatchFeb082011Decoder : PatchDec072010Decoder
{
public PatchFeb082011Decoder()
{
Version = "EQ Client Build Date February 8 2011.";
PatchConfFileName = "patch_Feb8-2011.conf";
ExpectedPPLength = 28176;
PPZoneIDOffset = 20844;
}
override public IdentificationStatus Identify(int OpCode, int Size, PacketDirection Direction)
{
if ((OpCode == OpManager.OpCodeNameToNumber("OP_ZoneEntry")) && (Direction == PacketDirection.ClientToServer))
{
IDStatus = IdentificationStatus.Tentative;
return IdentificationStatus.Tentative;
}
if (IDStatus != IdentificationStatus.Tentative)
return IdentificationStatus.No;
if ((OpCode == OpManager.OpCodeNameToNumber("OP_PlayerProfile")) && (Direction == PacketDirection.ServerToClient) &&
(Size == ExpectedPPLength))
return IdentificationStatus.Yes;
return IdentificationStatus.No;
}
override public Item DecodeItemPacket(byte[] PacketBuffer)
{
ByteStream Buffer = new ByteStream(PacketBuffer);
Item NewItem = new Item();
Buffer.SetPosition(30);
NewItem.MerchantSlot = Buffer.ReadByte(); // 13
NewItem.Price = Buffer.ReadUInt32(); // 14
Buffer.SkipBytes(5);
NewItem.Quantity = Buffer.ReadInt32(); // 23
Buffer.SetPosition(97);
NewItem.Name = Buffer.ReadString(true);
NewItem.Lore = Buffer.ReadString(true);
NewItem.IDFile = Buffer.ReadString(true);
Buffer.SkipBytes(1);
NewItem.ID = Buffer.ReadUInt32();
return NewItem;
}
}
}
@@ -0,0 +1,23 @@
using System;
using System.IO;
using System.Diagnostics;
using System.Collections.Generic;
using EQExtractor2.InternalTypes;
using EQExtractor2.OpCodes;
using EQPacket;
using MyUtils;
namespace EQExtractor2.Patches
{
class PatchFebruary112013Decoder : PatchJanuary162013Decoder
{
public PatchFebruary112013Decoder()
{
Version = "EQ Client Build Date February 11 2013.";
PatchConfFileName = "patch_Feb11-2013.conf";
SupportsSQLGeneration = false;
}
}
}
@@ -0,0 +1,307 @@
using System;
using System.IO;
using System.Collections.Generic;
using EQExtractor2.InternalTypes;
using EQExtractor2.OpCodes;
using EQPacket;
using MyUtils;
namespace EQExtractor2.Patches
{
public enum IdentificationStatus { No, Tentative, Yes };
class PatchSpecficDecoder
{
protected class PacketToMatch
{
public String OPCodeName;
public PacketDirection Direction;
public Int32 RequiredSize;
public bool VersionMatched;
};
public PatchSpecficDecoder()
{
Version = "Unsupported Client Version";
ExpectedPPLength = 0;
PPZoneIDOffset = 0;
PatchConfFileName = "";
IDStatus = IdentificationStatus.No;
SupportsSQLGeneration = true;
}
public string GetVersion()
{
return Version;
}
virtual public bool UnsupportedVersion()
{
return ExpectedPPLength == 0;
}
virtual public bool Init(string ConfDirectory, ref string ErrorMessage)
{
OpManager = new OpCodeManager();
return false;
}
virtual public IdentificationStatus Identify(int OpCode, int Size, PacketDirection Direction)
{
return IdentificationStatus.No;
}
virtual public List<Door> GetDoors()
{
List<Door> DoorList = new List<Door>();
return DoorList;
}
virtual public UInt16 GetZoneNumber()
{
return 0;
}
virtual public int VerifyPlayerProfile()
{
return 0;
}
virtual public MerchantManager GetMerchantData(NPCSpawnList NPCSL)
{
return null;
}
virtual public Item DecodeItemPacket(byte[] PacketBuffer)
{
Item NewItem = new Item();
return NewItem;
}
virtual public List<ZonePoint> GetZonePointList()
{
List<ZonePoint> ZonePointList = new List<ZonePoint>();
return ZonePointList;
}
virtual public NewZoneStruct GetZoneData()
{
NewZoneStruct NewZone = new NewZoneStruct();
return NewZone;
}
virtual public List<ZoneEntryStruct> GetSpawns()
{
List<ZoneEntryStruct> ZoneSpawns = new List<ZoneEntryStruct>();
return ZoneSpawns;
}
virtual public List<PositionUpdate> GetHighResolutionMovementUpdates()
{
List<PositionUpdate> Updates = new List<PositionUpdate>();
return Updates;
}
virtual public List<PositionUpdate> GetLowResolutionMovementUpdates()
{
List<PositionUpdate> Updates = new List<PositionUpdate>();
return Updates;
}
virtual public List<PositionUpdate> GetAllMovementUpdates()
{
List<PositionUpdate> Updates = new List<PositionUpdate>();
return Updates;
}
virtual public PositionUpdate Decode_OP_NPCMoveUpdate(byte[] UpdatePacket)
{
PositionUpdate PosUpdate = new PositionUpdate();
return PosUpdate;
}
virtual public PositionUpdate Decode_OP_MobUpdate(byte[] MobUpdatePacket)
{
PositionUpdate PosUpdate = new PositionUpdate();
return PosUpdate;
}
virtual public List<PositionUpdate> GetClientMovementUpdates()
{
List<PositionUpdate> Updates = new List<PositionUpdate>();
return Updates;
}
virtual public List<GroundSpawnStruct> GetGroundSpawns()
{
List<GroundSpawnStruct> GroundSpawns = new List<GroundSpawnStruct>();
return GroundSpawns;
}
virtual public List<UInt32> GetFindableSpawns()
{
List<UInt32> FindableSpawnList = new List<UInt32>();
return FindableSpawnList;
}
virtual public string GetZoneName()
{
return "";
}
virtual public bool DumpAAs(string FileName)
{
return false;
}
public void GivePackets(PacketManager pm)
{
Packets = pm;
}
virtual public void RegisterExplorers()
{
}
public List<byte[]> GetPacketsOfType(string OpCodeName, PacketDirection Direction)
{
List<byte[]> ReturnList = new List<byte[]>();
if (OpManager == null)
return ReturnList;
UInt32 OpCodeNumber = OpManager.OpCodeNameToNumber(OpCodeName);
foreach (EQApplicationPacket app in Packets.PacketList)
{
if ((app.OpCode == OpCodeNumber) && (app.Direction == Direction) && (app.Locked))
ReturnList.Add(app.Buffer);
}
return ReturnList;
}
public DateTime GetCaptureStartTime()
{
if (Packets.PacketList.Count > 0)
{
return Packets.PacketList[0].PacketTime;
}
return DateTime.MinValue;
}
public bool DumpPackets(string FileName, bool ShowTimeStamps)
{
StreamWriter PacketDumpStream;
try
{
PacketDumpStream = new StreamWriter(FileName);
}
catch
{
return false;
}
string Direction = "";
foreach (EQApplicationPacket p in Packets.PacketList)
{
if(ShowTimeStamps)
PacketDumpStream.WriteLine(p.PacketTime.ToString());
if (p.Direction == PacketDirection.ServerToClient)
Direction = "[Server->Client]";
else
Direction = "[Client->Server]";
OpCode oc = OpManager.GetOpCodeByNumber(p.OpCode);
string OpCodeName = (oc != null) ? oc.Name : "OP_Unknown";
PacketDumpStream.WriteLine("[OPCode: 0x" + p.OpCode.ToString("x4") + "] " + OpCodeName + " " + Direction + " [Size: " + p.Buffer.Length + "]");
PacketDumpStream.WriteLine(Utils.HexDump(p.Buffer));
if ((oc != null) && (oc.Explorer != null))
oc.Explorer(PacketDumpStream, new ByteStream(p.Buffer), p.Direction);
}
PacketDumpStream.Close();
return true;
}
public int PacketTypeCountByName(string OPCodeName)
{
UInt32 OpCodeNumber = OpManager.OpCodeNameToNumber(OPCodeName);
int Count = 0;
foreach (EQApplicationPacket app in Packets.PacketList)
{
if (app.OpCode == OpCodeNumber)
++Count;
}
return Count;
}
protected void AddExplorerSpawn(UInt32 ID, string Name)
{
ExplorerSpawnRecord e = new ExplorerSpawnRecord(ID, Name);
ExplorerSpawns.Add(e);
}
protected string FindExplorerSpawn(UInt32 ID)
{
foreach(ExplorerSpawnRecord s in ExplorerSpawns)
{
if (s.ID == ID)
return s.Name;
}
return "";
}
protected PacketManager Packets;
public OpCodeManager OpManager;
protected string Version;
protected int ExpectedPPLength;
protected int PPZoneIDOffset;
protected string PatchConfFileName;
protected PacketToMatch[] PacketsToMatch;
protected UInt32 WaitingForPacket;
protected IdentificationStatus IDStatus;
private List<ExplorerSpawnRecord> ExplorerSpawns = new List<ExplorerSpawnRecord>();
public bool SupportsSQLGeneration;
}
}
@@ -0,0 +1,467 @@
using System;
using System.IO;
using System.Diagnostics;
using System.Collections.Generic;
using EQExtractor2.InternalTypes;
using EQExtractor2.OpCodes;
using EQPacket;
using MyUtils;
namespace EQExtractor2.Patches
{
class PatchJanuary162013Decoder : PatchDecember102012Decoder
{
public PatchJanuary162013Decoder()
{
Version = "EQ Client Build Date January 16 2013.";
PatchConfFileName = "patch_Jan16-2013.conf";
}
override public List<ZoneEntryStruct> GetSpawns()
{
List<ZoneEntryStruct> ZoneSpawns = new List<ZoneEntryStruct>();
List<byte[]> SpawnPackets = GetPacketsOfType("OP_ZoneEntry", PacketDirection.ServerToClient);
foreach (byte[] SpawnPacket in SpawnPackets)
{
ZoneEntryStruct NewSpawn = new ZoneEntryStruct();
ByteStream Buffer = new ByteStream(SpawnPacket);
NewSpawn.SpawnName = Buffer.ReadString(true);
NewSpawn.SpawnName = Utils.MakeCleanName(NewSpawn.SpawnName);
NewSpawn.SpawnID = Buffer.ReadUInt32();
NewSpawn.Level = Buffer.ReadByte();
float UnkSize = Buffer.ReadSingle();
NewSpawn.IsNPC = Buffer.ReadByte();
UInt32 Bitfield = Buffer.ReadUInt32();
NewSpawn.Gender = (Bitfield & 3);
Byte OtherData = Buffer.ReadByte();
Buffer.SkipBytes(8); // Skip 8 unknown bytes
NewSpawn.DestructableString1 = "";
NewSpawn.DestructableString2 = "";
NewSpawn.DestructableString3 = "";
if ((NewSpawn.IsNPC > 0) && ((OtherData & 1) > 0))
{
// Destructable Objects
NewSpawn.DestructableString1 = Buffer.ReadString(false);
NewSpawn.DestructableString2 = Buffer.ReadString(false);
NewSpawn.DestructableString3 = Buffer.ReadString(false);
Buffer.SkipBytes(53);
}
if ((OtherData & 4) > 0)
{
// Auras
Buffer.ReadString(false);
Buffer.ReadString(false);
Buffer.SkipBytes(54);
}
NewSpawn.PropCount = Buffer.ReadByte();
if (NewSpawn.PropCount > 0)
NewSpawn.BodyType = Buffer.ReadUInt32();
else
NewSpawn.BodyType = 0;
for (int j = 1; j < NewSpawn.PropCount; ++j)
Buffer.SkipBytes(4);
Buffer.SkipBytes(1); // Skip HP %
NewSpawn.HairColor = Buffer.ReadByte();
NewSpawn.BeardColor = Buffer.ReadByte();
NewSpawn.EyeColor1 = Buffer.ReadByte();
NewSpawn.EyeColor2 = Buffer.ReadByte();
NewSpawn.HairStyle = Buffer.ReadByte();
NewSpawn.Beard = Buffer.ReadByte();
NewSpawn.DrakkinHeritage = Buffer.ReadUInt32();
NewSpawn.DrakkinTattoo = Buffer.ReadUInt32();
NewSpawn.DrakkinDetails = Buffer.ReadUInt32();
NewSpawn.EquipChest2 = Buffer.ReadByte();
bool UseWorn = (NewSpawn.EquipChest2 == 255);
Buffer.SkipBytes(2); // 2 Unknown bytes;
NewSpawn.Helm = Buffer.ReadByte();
NewSpawn.Size = Buffer.ReadSingle();
NewSpawn.Face = Buffer.ReadByte();
NewSpawn.WalkSpeed = Buffer.ReadSingle();
NewSpawn.RunSpeed = Buffer.ReadSingle();
NewSpawn.Race = Buffer.ReadUInt32();
Buffer.SkipBytes(1); // Skip Holding
NewSpawn.Deity = Buffer.ReadUInt32();
Buffer.SkipBytes(8); // Skip GuildID and GuildRank
NewSpawn.Class = Buffer.ReadByte();
Buffer.SkipBytes(4); // Skip PVP, Standstate, Light, Flymode
NewSpawn.LastName = Buffer.ReadString(true);
Buffer.SkipBytes(6);
NewSpawn.PetOwnerID = Buffer.ReadUInt32();
Buffer.SkipBytes(25);
NewSpawn.MeleeTexture1 = 0;
NewSpawn.MeleeTexture2 = 0;
if ((NewSpawn.IsNPC == 0) || NPCType.IsPlayableRace(NewSpawn.Race))
{
for (int ColourSlot = 0; ColourSlot < 9; ++ColourSlot)
NewSpawn.SlotColour[ColourSlot] = Buffer.ReadUInt32();
for (int i = 0; i < 9; ++i)
{
NewSpawn.Equipment[i] = Buffer.ReadUInt32();
UInt32 Equip3 = Buffer.ReadUInt32();
UInt32 Equip2 = Buffer.ReadUInt32();
UInt32 Equip1 = Buffer.ReadUInt32();
UInt32 Equip0 = Buffer.ReadUInt32();
}
if (NewSpawn.Equipment[Constants.MATERIAL_CHEST] > 0)
{
NewSpawn.EquipChest2 = (byte)NewSpawn.Equipment[Constants.MATERIAL_CHEST];
}
NewSpawn.ArmorTintRed = (byte)((NewSpawn.SlotColour[Constants.MATERIAL_CHEST] >> 16) & 0xff);
NewSpawn.ArmorTintGreen = (byte)((NewSpawn.SlotColour[Constants.MATERIAL_CHEST] >> 8) & 0xff);
NewSpawn.ArmorTintBlue = (byte)(NewSpawn.SlotColour[Constants.MATERIAL_CHEST] & 0xff);
if (NewSpawn.Equipment[Constants.MATERIAL_PRIMARY] > 0)
NewSpawn.MeleeTexture1 = NewSpawn.Equipment[Constants.MATERIAL_PRIMARY];
if (NewSpawn.Equipment[Constants.MATERIAL_SECONDARY] > 0)
NewSpawn.MeleeTexture2 = NewSpawn.Equipment[Constants.MATERIAL_SECONDARY];
if (UseWorn)
NewSpawn.Helm = (byte)NewSpawn.Equipment[Constants.MATERIAL_HEAD];
else
NewSpawn.Helm = 0;
}
else
{
// Non playable race
Buffer.SkipBytes(20);
NewSpawn.MeleeTexture1 = Buffer.ReadUInt32();
Buffer.SkipBytes(16);
NewSpawn.MeleeTexture2 = Buffer.ReadUInt32();
Buffer.SkipBytes(16);
}
if (NewSpawn.EquipChest2 == 255)
NewSpawn.EquipChest2 = 0;
if (NewSpawn.Helm == 255)
NewSpawn.Helm = 0;
UInt32 Position1 = Buffer.ReadUInt32();
UInt32 Position2 = Buffer.ReadUInt32();
UInt32 Position3 = Buffer.ReadUInt32();
UInt32 Position4 = Buffer.ReadUInt32();
UInt32 Position5 = Buffer.ReadUInt32();
NewSpawn.YPos = Utils.EQ19ToFloat((Int32)((Position4 >> 13) & 0x7FFFF));
NewSpawn.ZPos = Utils.EQ19ToFloat((Int32)(Position5 >> 10) & 0x7FFFF);
NewSpawn.XPos = Utils.EQ19ToFloat((Int32)(Position2 >> 10) & 0x7FFFF);
NewSpawn.Heading = Utils.EQ19ToFloat((Int32)(Position3) & 0xFFF);
if ((OtherData & 16) > 0)
{
NewSpawn.Title = Buffer.ReadString(false);
}
if ((OtherData & 32) > 0)
{
NewSpawn.Suffix = Buffer.ReadString(false);
}
// unknowns
Buffer.SkipBytes(8);
NewSpawn.IsMercenary = Buffer.ReadByte();
Buffer.SkipBytes(54);
Debug.Assert(Buffer.GetPosition() == Buffer.Length(), "Length mismatch while parsing zone spawns");
ZoneSpawns.Add(NewSpawn);
}
return ZoneSpawns;
}
public override void RegisterExplorers()
{
//OpManager.RegisterExplorer("OP_ZoneEntry", ExploreZoneEntry);
//OpManager.RegisterExplorer("OP_NPCMoveUpdate", ExploreNPCMoveUpdate);
//OpManager.RegisterExplorer("OP_MobUpdate", ExploreMobUpdate);
}
public void ExploreNPCMoveUpdate(StreamWriter OutputStream, ByteStream Buffer, PacketDirection Direction)
{
PositionUpdate PosUpdate;
PosUpdate = Decode_OP_NPCMoveUpdate(Buffer.Buffer);
OutputStream.WriteLine("SpawnID: {0}, X = {1}, Y = {2}, Z = {3}, Heading = {4}", PosUpdate.SpawnID, PosUpdate.p.x, PosUpdate.p.y, PosUpdate.p.z, PosUpdate.p.heading);
}
public void ExploreMobUpdate(StreamWriter OutputStream, ByteStream Buffer, PacketDirection Direction)
{
PositionUpdate PosUpdate;
PosUpdate = Decode_OP_MobUpdate(Buffer.Buffer);
OutputStream.WriteLine("SpawnID: {0}, X = {1}, Y = {2}, Z = {3}, Heading = {4}", PosUpdate.SpawnID, PosUpdate.p.x, PosUpdate.p.y, PosUpdate.p.z, PosUpdate.p.heading);
}
public void ExploreZoneEntry(StreamWriter OutputStream, ByteStream Buffer, PacketDirection Direction)
{
if (Direction != PacketDirection.ServerToClient)
return;
string FirstName = Buffer.ReadString(false);
OutputStream.WriteLine("Name = {0}", FirstName);
UInt32 SpawnID = Buffer.ReadUInt32();
OutputStream.WriteLine("SpawnID = {0}", SpawnID);
byte Level = Buffer.ReadByte();
OutputStream.WriteLine("Level = {0}", Level);
Buffer.SkipBytes(4);
byte IsNPC = Buffer.ReadByte();
OutputStream.WriteLine("IsNPC = {0}", IsNPC);
UInt32 Bitfield = Buffer.ReadUInt32();
OutputStream.WriteLine("Name: {0}, Bitfield: {1}", FirstName, Convert.ToString(Bitfield, 2));
byte OtherData = Buffer.ReadByte();
OutputStream.WriteLine("OtherData = {0}", OtherData);
Buffer.SkipBytes(8);
if ((OtherData & 1) > 0)
{
OutputStream.WriteLine("OD: {0}", Buffer.ReadString(false));
OutputStream.WriteLine("OD: {0}", Buffer.ReadString(false));
OutputStream.WriteLine("OD: {0}", Buffer.ReadString(false));
Buffer.SkipBytes(53);
}
if ((OtherData & 4) > 0)
{
OutputStream.WriteLine("Aura: {0}", Buffer.ReadString(false));
OutputStream.WriteLine("Aura: {0}", Buffer.ReadString(false));
Buffer.SkipBytes(54);
}
byte Properties = Buffer.ReadByte();
OutputStream.WriteLine("Properties = {0}, Offset now {1}", Properties, Buffer.GetPosition());
UInt32 BodyType = 0;
if (Properties > 0)
BodyType = Buffer.ReadUInt32();
OutputStream.WriteLine("Bodytype = {0}", BodyType);
if (Properties != 1)
OutputStream.WriteLine("XXXX Properties is {0}", Properties);
for (int i = 1; i < Properties; ++i)
OutputStream.WriteLine(" Prop: {0}", Buffer.ReadUInt32());
OutputStream.WriteLine("Position is now {0}", Buffer.GetPosition());
byte HP = Buffer.ReadByte();
byte HairColor = Buffer.ReadByte();
byte BeardColor = Buffer.ReadByte();
byte Eye1 = Buffer.ReadByte();
byte Eye2 = Buffer.ReadByte();
byte HairStyle = Buffer.ReadByte();
byte BeardStyle = Buffer.ReadByte();
OutputStream.WriteLine("Beardstyle is {0}", BeardStyle);
Buffer.SkipBytes(12); // Drakkin stuff
byte EquipChest2 = Buffer.ReadByte();
Buffer.SkipBytes(2);
byte Helm = Buffer.ReadByte();
float Size = Buffer.ReadSingle();
byte Face = Buffer.ReadByte();
float WalkSpeed = Buffer.ReadSingle();
float RunSpeed = Buffer.ReadSingle();
UInt32 Race = Buffer.ReadUInt32();
OutputStream.WriteLine("Size: {0}, Face: {1}, Walkspeed: {2}, RunSpeed: {3}, Race: {4}", Size, Face, WalkSpeed, RunSpeed, Race);
Buffer.SkipBytes(18);
Buffer.ReadString(false);
Buffer.SkipBytes(35);
if ((IsNPC == 0) || NPCType.IsPlayableRace(Race))
{
for (int ColourSlot = 0; ColourSlot < 9; ++ColourSlot)
OutputStream.WriteLine("Color {0} is {1}", ColourSlot, Buffer.ReadUInt32());
for (int i = 0; i < 9; ++i)
{
UInt32 Equip3 = Buffer.ReadUInt32();
UInt32 Equipx = Buffer.ReadUInt32();
UInt32 Equip2 = Buffer.ReadUInt32();
UInt32 Equip1 = Buffer.ReadUInt32();
UInt32 Equip0 = Buffer.ReadUInt32();
OutputStream.WriteLine("Equip slot {0}: 0,1,2,x,3 is {1}, {2}, {3}, {4}, {5}", i,
Equip0, Equip1, Equip2, Equipx, Equip3);
}
}
else
{
// Non playable race
// Melee Texture 1 is 20 bytes in
// Melee Texture 1 is 40 bytes in
// This whole segment is 28 + 24 + 8 = 60
// Skip 20, Read m1, skip 16, read m2, skip 16
/*
OutputStream.WriteLine("None playable race, offset now {0}", Buffer.GetPosition());
Buffer.SkipBytes(28);
UInt32 MeleeTexture1 = Buffer.ReadUInt32();
Buffer.SkipBytes(12);
UInt32 MeleeTexture2 = Buffer.ReadUInt32();
Buffer.SkipBytes(12);
*/
OutputStream.WriteLine("None playable race, offset now {0}", Buffer.GetPosition());
Buffer.SkipBytes(20);
UInt32 MeleeTexture1 = Buffer.ReadUInt32();
Buffer.SkipBytes(16);
UInt32 MeleeTexture2 = Buffer.ReadUInt32();
Buffer.SkipBytes(16);
}
OutputStream.WriteLine("Position starts at offset {0}", Buffer.GetPosition());
UInt32 Position1 = Buffer.ReadUInt32();
UInt32 Position2 = Buffer.ReadUInt32();
UInt32 Position3 = Buffer.ReadUInt32();
UInt32 Position4 = Buffer.ReadUInt32();
UInt32 Position5 = Buffer.ReadUInt32();
float YPos = Utils.EQ19ToFloat((Int32)((Position4 >> 13) & 0x7FFFF));
float ZPos = Utils.EQ19ToFloat((Int32)(Position5 >> 10) & 0x7FFFF);
float XPos = Utils.EQ19ToFloat((Int32)(Position2 >> 10) & 0x7FFFF);
//float Heading = Utils.EQ19ToFloat((Int32)(Position1 >> 13) & 0x3FF);
//float Heading = Utils.EQ19ToFloat((Int32)(Position2) & 0x3FF);
float Heading = Utils.EQ19ToFloat((Int32)(Position3) & 0x3FF);
//for(int i = 0; i < 32; ++i)
// OutputStream.WriteLine("Pos3 << {0} = {1}", i, Utils.EQ19ToFloat((Int32)(Position3 >> i) & 0x3FF));
OutputStream.WriteLine("(X,Y,Z) = {0}, {1}, {2}, Heading = {3}", XPos, YPos, ZPos, Heading);
if ((OtherData & 16) > 1)
OutputStream.WriteLine("Title: {0}", Buffer.ReadString(false));
if ((OtherData & 32) > 1)
OutputStream.WriteLine("Suffix: {0}", Buffer.ReadString(false));
Buffer.SkipBytes(8);
byte IsMerc = Buffer.ReadByte();
OutputStream.WriteLine("IsMerc: {0}", IsMerc);
Buffer.SkipBytes(54);
OutputStream.WriteLine("Buffer Length: {0}, Current Position: {1}", Buffer.Length(), Buffer.GetPosition());
if (Buffer.Length() != Buffer.GetPosition())
OutputStream.WriteLine("PARSE ERROR");
OutputStream.WriteLine("");
}
}
}
@@ -0,0 +1,143 @@
//
// Copyright (C) 2001-2010 EQEMu Development Team (http://eqemulator.net). Distributed under GPL version 2.
//
//
using System;
using System.IO;
using System.Collections.Generic;
using EQExtractor2.InternalTypes;
using EQExtractor2.OpCodes;
using EQPacket;
using MyUtils;
namespace EQExtractor2.Patches
{
class PatchJuly132010Decoder : PatchMay122010Decoder
{
public PatchJuly132010Decoder()
{
Version = "EQ Client Build Date July 13 2010. (Including Test Server June 24 to July 8 2010).";
ExpectedPPLength = 26640;
}
public override void RegisterExplorers()
{
base.RegisterExplorers();
//OpManager.RegisterExplorer("OP_ZoneEntry", ExploreZoneEntry);
//OpManager.RegisterExplorer("OP_CastSpell", ExploreCastSpell);
//OpManager.RegisterExplorer("OP_SpawnAppearance", ExploreSpawnAppearance);
//OpManager.RegisterExplorer("OP_ItemPacket", ExploreItemPacket);
}
public void ExploreItemPacket(StreamWriter OutputStream, ByteStream Buffer, PacketDirection Direction)
{
UInt32 StackSize = Buffer.ReadUInt32();
Buffer.SkipBytes(4);
UInt32 Slot = Buffer.ReadUInt32();
UInt32 MerchantSlot = Buffer.ReadUInt32();
UInt32 Price = Buffer.ReadUInt32();
Int32 Quantity = Buffer.ReadInt32();
Buffer.SetPosition(68);
string Name = Buffer.ReadString(true);
OutputStream.WriteLine("Item: {0} at Slot: {1}", Name, Slot);
}
public void ExploreCastSpell(StreamWriter OutputStream, ByteStream Buffer, PacketDirection Direction)
{
UInt32 Slot = Buffer.ReadUInt32();
UInt32 SpellID = Buffer.ReadUInt32();
OutputStream.WriteLine("Casting spell {0} from slot {1}", SpellID, Slot);
OutputStream.WriteLine("");
}
public void ExploreMercenaryDataResponse(StreamWriter OutputStream, ByteStream Buffer, PacketDirection Direction)
{
UInt32 TypeCount = Buffer.ReadUInt32();
//OutputStream.WriteLine("Type Count: {0}\r\n", TypeCount);
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Number of Types (Journeyman and Apprentice in this case\r\n", TypeCount);
for (int i = 0; i < TypeCount; ++i)
{
UInt32 TypeDBStringID = Buffer.ReadUInt32();
//OutputStream.WriteLine(" Type {0} DBStringID {1}", i, TypeDBStringID);
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // DBStringID for Type {1}", TypeDBStringID, i);
}
UInt32 Count2 = Buffer.ReadUInt32();
//OutputStream.WriteLine(" Count 2 is {0}", Count2);
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Count of Sub-types that follow", Count2);
for (int i = 0; i < Count2; ++i)
{
int Offset = Buffer.GetPosition();
UInt32 Unknown1 = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Unknown", Unknown1);
UInt32 DBStringID1 = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // DBStringID of Type", DBStringID1);
UInt32 DBStringID2 = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // DBStringID of Sub-Type", DBStringID2);
UInt32 PurchaseCost = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Purchase Cost", PurchaseCost);
UInt32 UpkeepCost = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Upkeep Cost", UpkeepCost);
UInt32 Unknown2 = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Unknown", Unknown2);
UInt32 Unknown3 = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Unknown", Unknown3);
UInt32 Unknown4 = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Unknown", Unknown4);
byte Unknown5 = Buffer.ReadByte();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint8, Buffer, {0}); // Unknown", Unknown5);
UInt32 Unknown6 = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Unknown", Unknown6);
UInt32 Unknown7 = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Unknown", Unknown7);
UInt32 Unknown8 = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Unknown", Unknown8);
UInt32 StanceCount = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Number of Stances for this Merc", StanceCount);
UInt32 Unknown10 = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Unknown", Unknown10);
byte Unknown11 = Buffer.ReadByte();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint8, Buffer, {0}); // Unknown", Unknown11);
//OutputStream.WriteLine(" Offset: {5} Unknown1: {0} DBStrings: {1} {2} Purchase: {3} Upkeep: {4}\r\n", Unknown1, DBStringID1, DBStringID2,
// PurchaseCost, UpkeepCost, Offset);
//OutputStream.WriteLine(" Unknowns: {0} {1} {2} {3} {4} {5} {6} {7} {8}\r\n",
// Unknown2, Unknown3, Unknown4, Unknown5, Unknown6, Unknown7, Unknown8, Unknown10, Unknown11);
//OutputStream.WriteLine(" Stance Count: {0}", StanceCount);
for (int j = 0; j < StanceCount; ++j)
{
UInt32 StanceNum = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Stance Number", StanceNum);
UInt32 StanceType = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Stance DBStringID (1 = Passive, 2 = Balanced etc.", StanceType);
//OutputStream.WriteLine(" {0}: {1}", StanceNum, StanceType);
}
OutputStream.WriteLine("");
}
OutputStream.WriteLine("\r\nBuffer position at end is {0}", Buffer.GetPosition());
OutputStream.WriteLine("");
}
}
}
@@ -0,0 +1,24 @@
using System;
using System.IO;
using System.Collections.Generic;
using EQExtractor2.InternalTypes;
using EQExtractor2.OpCodes;
using EQPacket;
using MyUtils;
namespace EQExtractor2.Patches
{
class PatchJuly132012Decoder : PatchJune252012Decoder
{
public PatchJuly132012Decoder()
{
Version = "EQ Client Build Date July 13 2012.";
ExpectedPPLength = 33784;
PPZoneIDOffset = 26452;
PatchConfFileName = "patch_July13-2012.conf";
}
}
}
@@ -0,0 +1,20 @@
using System;
using System.IO;
using System.Collections.Generic;
using EQExtractor2.InternalTypes;
using EQExtractor2.OpCodes;
using EQPacket;
using MyUtils;
namespace EQExtractor2.Patches
{
class PatchJune252012Decoder : PatchMar152012Decoder
{
public PatchJune252012Decoder()
{
Version = "EQ Client Build Date June 25 2012.";
PatchConfFileName = "patch_June25-2012.conf";
}
}
}
@@ -0,0 +1,458 @@
using System;
using System.IO;
using System.Collections.Generic;
using EQExtractor2.InternalTypes;
using EQExtractor2.OpCodes;
using EQPacket;
using MyUtils;
namespace EQExtractor2.Patches
{
class PatchMar152012Decoder : PatchNov172011Decoder
{
public PatchMar152012Decoder()
{
Version = "EQ Client Build Date March 15 2012.";
ExpectedPPLength = 29688;
PPZoneIDOffset = 22356;
PatchConfFileName = "patch_Mar15-2012.conf";
}
public override void RegisterExplorers()
{
//OpManager.RegisterExplorer("OP_ZoneEntry", ExploreZoneEntry);
}
public void ExploreZoneEntry(StreamWriter OutputStream, ByteStream Buffer, PacketDirection Direction)
{
if (Direction != PacketDirection.ServerToClient)
return;
string SpawnName = Buffer.ReadString(true);
UInt32 SpawnID = Buffer.ReadUInt32();
byte Level = Buffer.ReadByte();
float UnkSize = Buffer.ReadSingle();
byte IsNPC = Buffer.ReadByte();
UInt32 Bitfield = Buffer.ReadUInt32();
/*
NewSpawn.Showname = (Bitfield >> 28) & 1;
NewSpawn.TargetableWithHotkey = (Bitfield >> 27) & 1;
NewSpawn.Targetable = (Bitfield >> 26) & 1;
NewSpawn.ShowHelm = (Bitfield >> 24) & 1;
NewSpawn.Gender = (Bitfield >> 20) & 3;
NewSpawn.Padding5 = (Bitfield >> 4) & 1;
NewSpawn.Padding7 = (Bitfield >> 6) & 2047;
NewSpawn.Padding26 = (Bitfield >> 25) & 1;
*/
Byte OtherData = Buffer.ReadByte();
Buffer.SkipBytes(8); // Skip 8 unknown bytes
//NewSpawn.DestructableString1 = "";
//NewSpawn.DestructableString2 = "";
//NewSpawn.DestructableString3 = "";
if ((IsNPC > 0) && ((OtherData & 3) > 0))
{
// Destructable Objects. Not handled yet
//
//SQLOut(String.Format("-- OBJECT FOUND SpawnID {0}", SpawnID.ToString("x")));
Buffer.ReadString(false);
Buffer.ReadString(false);
Buffer.ReadString(false);
Buffer.ReadUInt32();
Buffer.ReadUInt32();
Buffer.ReadUInt32();
Buffer.ReadUInt32();
Buffer.ReadUInt32();
Buffer.ReadUInt32();
Buffer.ReadUInt32();
Buffer.ReadUInt32();
Buffer.ReadUInt32();
Buffer.ReadUInt32();
Buffer.ReadUInt32();
Buffer.ReadUInt32();
Buffer.ReadUInt32();
Buffer.ReadByte();
}
OutputStream.WriteLine("Size starts at offset {0}", Buffer.GetPosition());
float Size = Buffer.ReadSingle();
byte Face = Buffer.ReadByte();
float WalkSpeed = Buffer.ReadSingle();
float RunSpeed = Buffer.ReadSingle();
UInt32 Race = Buffer.ReadUInt32();
byte PropCount = Buffer.ReadByte();
UInt32 BodyType = 0;
if (PropCount >= 1)
{
BodyType = Buffer.ReadUInt32();
for (int j = 1; j < PropCount; ++j)
Buffer.SkipBytes(4);
}
Buffer.SkipBytes(1); // Skip HP %
byte HairColor = Buffer.ReadByte();
byte BeardColor = Buffer.ReadByte();
byte EyeColor1 = Buffer.ReadByte();
byte EyeColor2 = Buffer.ReadByte();
byte HairStyle = Buffer.ReadByte();
byte Beard = Buffer.ReadByte();
UInt32 DrakkinHeritage = Buffer.ReadUInt32();
UInt32 DrakkinTattoo = Buffer.ReadUInt32();
UInt32 DrakkinDetails = Buffer.ReadUInt32();
Buffer.SkipBytes(1); // Skip Holding
UInt32 Deity = Buffer.ReadUInt32();
Buffer.SkipBytes(8); // Skip GuildID and GuildRank
byte Class = Buffer.ReadByte();
Buffer.SkipBytes(4); // Skip PVP, Standstate, Light, Flymode
byte EquipChest2 = Buffer.ReadByte();
bool UseWorn = (EquipChest2 == 255);
Buffer.SkipBytes(2); // 2 Unknown bytes;
byte Helm = Buffer.ReadByte();
string LastName = Buffer.ReadString(true);
Buffer.SkipBytes(5); // AATitle + unknown byte
UInt32 PetOwnerID = Buffer.ReadUInt32();
Buffer.SkipBytes(26); // Unknown byte + 6 unknown uint32
OutputStream.WriteLine("Position starts at offset {0}", Buffer.GetPosition());
UInt32 Position1 = Buffer.ReadUInt32();
UInt32 Position2 = Buffer.ReadUInt32();
UInt32 Position3 = Buffer.ReadUInt32();
UInt32 Position4 = Buffer.ReadUInt32();
UInt32 Position5 = Buffer.ReadUInt32();
float YPos = Utils.EQ19ToFloat((Int32)(Position3 & 0x7FFFF));
float Heading = Utils.EQ19ToFloat((Int32)(Position4 & 0xFFF));
float XPos = Utils.EQ19ToFloat((Int32)(Position4 >> 12) & 0x7FFFF);
float ZPos = Utils.EQ19ToFloat((Int32)(Position5 & 0x7FFFF));
OutputStream.WriteLine("(X,Y,Z) = {0}, {1}, {2}, Heading = {3}", XPos, YPos, ZPos, Heading);
if (NPCType.IsPlayableRace(Race))
{
for (int ColourSlot = 0; ColourSlot < 9; ++ColourSlot)
OutputStream.WriteLine("Color {0} is {1}", ColourSlot, Buffer.ReadUInt32());
}
OutputStream.WriteLine("");
}
override public List<ZoneEntryStruct> GetSpawns()
{
List<ZoneEntryStruct> ZoneSpawns = new List<ZoneEntryStruct>();
List<byte[]> SpawnPackets = GetPacketsOfType("OP_ZoneEntry", PacketDirection.ServerToClient);
foreach (byte[] SpawnPacket in SpawnPackets)
{
ZoneEntryStruct NewSpawn = new ZoneEntryStruct();
ByteStream Buffer = new ByteStream(SpawnPacket);
NewSpawn.SpawnName = Buffer.ReadString(true);
NewSpawn.SpawnName = Utils.MakeCleanName(NewSpawn.SpawnName);
NewSpawn.SpawnID = Buffer.ReadUInt32();
NewSpawn.Level = Buffer.ReadByte();
float UnkSize = Buffer.ReadSingle();
NewSpawn.IsNPC = Buffer.ReadByte();
UInt32 Bitfield = Buffer.ReadUInt32();
NewSpawn.Showname = (Bitfield >> 28) & 1;
NewSpawn.TargetableWithHotkey = (Bitfield >> 27) & 1;
NewSpawn.Targetable = (Bitfield >> 26) & 1;
NewSpawn.ShowHelm = (Bitfield >> 24) & 1;
NewSpawn.Gender = (Bitfield >> 20) & 3;
NewSpawn.Padding5 = (Bitfield >> 4) & 1;
NewSpawn.Padding7 = (Bitfield >> 6) & 2047;
NewSpawn.Padding26 = (Bitfield >> 25) & 1;
Byte OtherData = Buffer.ReadByte();
Buffer.SkipBytes(8); // Skip 8 unknown bytes
NewSpawn.DestructableString1 = "";
NewSpawn.DestructableString2 = "";
NewSpawn.DestructableString3 = "";
if ((NewSpawn.IsNPC > 0) && ((OtherData & 3) > 0))
{
// Destructable Objects. Not handled yet
//
//SQLOut(String.Format("-- OBJECT FOUND SpawnID {0}", SpawnID.ToString("x")));
NewSpawn.DestructableString1 = Buffer.ReadString(false);
NewSpawn.DestructableString2 = Buffer.ReadString(false);
NewSpawn.DestructableString3 = Buffer.ReadString(false);
NewSpawn.DestructableUnk1 = Buffer.ReadUInt32();
NewSpawn.DestructableUnk2 = Buffer.ReadUInt32();
NewSpawn.DestructableID1 = Buffer.ReadUInt32();
NewSpawn.DestructableID2 = Buffer.ReadUInt32();
NewSpawn.DestructableID3 = Buffer.ReadUInt32();
NewSpawn.DestructableID4 = Buffer.ReadUInt32();
NewSpawn.DestructableUnk3 = Buffer.ReadUInt32();
NewSpawn.DestructableUnk4 = Buffer.ReadUInt32();
NewSpawn.DestructableUnk5 = Buffer.ReadUInt32();
NewSpawn.DestructableUnk6 = Buffer.ReadUInt32();
NewSpawn.DestructableUnk7 = Buffer.ReadUInt32();
NewSpawn.DestructableUnk8 = Buffer.ReadUInt32();
NewSpawn.DestructableUnk9 = Buffer.ReadUInt32();
NewSpawn.DestructableByte = Buffer.ReadByte();
//SQLOut(String.Format("-- DES: {0,8:x} {1,8:x} {2,8:d} {3,8:d} {4,8:d} {5,8:d} {6,8:x} {7,8:x} {8,8:x} {9,8:x} {10,8:x} {11,8:x} {12,8:x} {13,2:x} {14} {15} {16}",
// DestructableUnk1, DestructableUnk2, DestructableID1, DestructableID2, DestructableID3, DestructableID4,
// DestructableUnk3, DestructableUnk4, DestructableUnk5, DestructableUnk6, DestructableUnk7, DestructableUnk8,
// DestructableUnk9, DestructableByte, DestructableString1, DestructableString2, DestructableString3));
}
NewSpawn.Size = Buffer.ReadSingle();
NewSpawn.Face = Buffer.ReadByte();
NewSpawn.WalkSpeed = Buffer.ReadSingle();
NewSpawn.RunSpeed = Buffer.ReadSingle();
NewSpawn.Race = Buffer.ReadUInt32();
NewSpawn.PropCount = Buffer.ReadByte();
NewSpawn.BodyType = 0;
if (NewSpawn.PropCount >= 1)
{
NewSpawn.BodyType = Buffer.ReadUInt32();
for (int j = 1; j < NewSpawn.PropCount; ++j)
Buffer.SkipBytes(4);
}
Buffer.SkipBytes(1); // Skip HP %
NewSpawn.HairColor = Buffer.ReadByte();
NewSpawn.BeardColor = Buffer.ReadByte();
NewSpawn.EyeColor1 = Buffer.ReadByte();
NewSpawn.EyeColor2 = Buffer.ReadByte();
NewSpawn.HairStyle = Buffer.ReadByte();
NewSpawn.Beard = Buffer.ReadByte();
NewSpawn.DrakkinHeritage = Buffer.ReadUInt32();
NewSpawn.DrakkinTattoo = Buffer.ReadUInt32();
NewSpawn.DrakkinDetails = Buffer.ReadUInt32();
Buffer.SkipBytes(1); // Skip Holding
NewSpawn.Deity = Buffer.ReadUInt32();
Buffer.SkipBytes(8); // Skip GuildID and GuildRank
NewSpawn.Class = Buffer.ReadByte();
Buffer.SkipBytes(4); // Skip PVP, Standstate, Light, Flymode
NewSpawn.EquipChest2 = Buffer.ReadByte();
bool UseWorn = (NewSpawn.EquipChest2 == 255);
Buffer.SkipBytes(2); // 2 Unknown bytes;
NewSpawn.Helm = Buffer.ReadByte();
NewSpawn.LastName = Buffer.ReadString(true);
Buffer.SkipBytes(5); // AATitle + unknown byte
NewSpawn.PetOwnerID = Buffer.ReadUInt32();
Buffer.SkipBytes(26); // Unknown byte + 6 unknown uint32
UInt32 Position1 = Buffer.ReadUInt32();
UInt32 Position2 = Buffer.ReadUInt32();
UInt32 Position3 = Buffer.ReadUInt32();
UInt32 Position4 = Buffer.ReadUInt32();
UInt32 Position5 = Buffer.ReadUInt32();
NewSpawn.YPos = Utils.EQ19ToFloat((Int32)(Position3 & 0x7FFFF));
NewSpawn.Heading = Utils.EQ19ToFloat((Int32)(Position4 & 0xFFF));
NewSpawn.XPos = Utils.EQ19ToFloat((Int32)(Position4 >> 12) & 0x7FFFF);
NewSpawn.ZPos = Utils.EQ19ToFloat((Int32)(Position5 & 0x7FFFF));
NewSpawn.MeleeTexture1 = 0;
NewSpawn.MeleeTexture2 = 0;
if (NPCType.IsPlayableRace(NewSpawn.Race))
{
for (int ColourSlot = 0; ColourSlot < 9; ++ColourSlot)
NewSpawn.SlotColour[ColourSlot] = Buffer.ReadUInt32();
for (int i = 0; i < 9; ++i)
{
NewSpawn.Equipment[i] = Buffer.ReadUInt32();
UInt32 Equip2 = Buffer.ReadUInt32();
UInt32 Equip1 = Buffer.ReadUInt32();
UInt32 Equip0 = Buffer.ReadUInt32();
}
if (NewSpawn.Equipment[Constants.MATERIAL_CHEST] > 0)
{
NewSpawn.EquipChest2 = (byte)NewSpawn.Equipment[Constants.MATERIAL_CHEST];
}
NewSpawn.ArmorTintRed = (byte)((NewSpawn.SlotColour[Constants.MATERIAL_CHEST] >> 16) & 0xff);
NewSpawn.ArmorTintGreen = (byte)((NewSpawn.SlotColour[Constants.MATERIAL_CHEST] >> 8) & 0xff);
NewSpawn.ArmorTintBlue = (byte)(NewSpawn.SlotColour[Constants.MATERIAL_CHEST] & 0xff);
if (NewSpawn.Equipment[Constants.MATERIAL_PRIMARY] > 0)
NewSpawn.MeleeTexture1 = NewSpawn.Equipment[Constants.MATERIAL_PRIMARY];
if (NewSpawn.Equipment[Constants.MATERIAL_SECONDARY] > 0)
NewSpawn.MeleeTexture2 = NewSpawn.Equipment[Constants.MATERIAL_SECONDARY];
if (UseWorn)
NewSpawn.Helm = (byte)NewSpawn.Equipment[Constants.MATERIAL_HEAD];
else
NewSpawn.Helm = 0;
}
else
{
// Non playable race
Buffer.SkipBytes(16);
NewSpawn.MeleeTexture1 = Buffer.ReadUInt32();
Buffer.SkipBytes(12);
NewSpawn.MeleeTexture2 = Buffer.ReadUInt32();
Buffer.SkipBytes(12);
}
if (NewSpawn.EquipChest2 == 255)
NewSpawn.EquipChest2 = 0;
if (NewSpawn.Helm == 255)
NewSpawn.Helm = 0;
if ((OtherData & 4) > 0)
{
NewSpawn.Title = Buffer.ReadString(false);
}
if ((OtherData & 8) > 0)
{
NewSpawn.Suffix = Buffer.ReadString(false);
}
// unknowns
Buffer.SkipBytes(8);
NewSpawn.IsMercenary = Buffer.ReadByte();
ZoneSpawns.Add(NewSpawn);
}
return ZoneSpawns;
}
}
}
@@ -0,0 +1,24 @@
using System;
using System.IO;
using System.Collections.Generic;
using EQExtractor2.InternalTypes;
using EQExtractor2.OpCodes;
using EQPacket;
using MyUtils;
namespace EQExtractor2.Patches
{
class PatchMarch152011Decoder : PatchFeb082011Decoder
{
public PatchMarch152011Decoder()
{
Version = "EQ Client Build Date March 2011.";
PatchConfFileName = "patch_March15-2011.conf";
ExpectedPPLength = 28536;
PPZoneIDOffset = 21204;
}
}
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,296 @@
using System;
using System.IO;
using System.Collections.Generic;
using EQExtractor2.InternalTypes;
using EQExtractor2.OpCodes;
using EQPacket;
using MyUtils;
namespace EQExtractor2.Patches
{
class PatchMay122011Decoder : PatchMarch152011Decoder
{
public PatchMay122011Decoder()
{
Version = "EQ Client Build Date May 12 2011.";
PatchConfFileName = "patch_May12-2011.conf";
ExpectedPPLength = 28536;
PPZoneIDOffset = 21204;
}
override public PositionUpdate Decode_OP_NPCMoveUpdate(byte[] UpdatePacket)
{
PositionUpdate PosUpdate = new PositionUpdate();
BitStream bs = new BitStream(UpdatePacket, (uint)UpdatePacket.Length);
PosUpdate.SpawnID = bs.readUInt(16);
UInt32 Unknown = bs.readUInt(16);
UInt32 VFlags = bs.readUInt(6);
PosUpdate.p.y = (float)bs.readInt(19) / (float)(1 << 3);
PosUpdate.p.x = (float)bs.readInt(19) / (float)(1 << 3);
PosUpdate.p.z = (float)bs.readInt(19) / (float)(1 << 3);
PosUpdate.p.heading = (float)bs.readInt(12) / (float)(1 << 3);
PosUpdate.HighRes = true;
return PosUpdate;
}
override public PositionUpdate Decode_OP_MobUpdate(byte[] MobUpdatePacket)
{
PositionUpdate PosUpdate = new PositionUpdate();
ByteStream Buffer = new ByteStream(MobUpdatePacket);
PosUpdate.SpawnID = Buffer.ReadUInt16();
Buffer.SkipBytes(2);
UInt32 Word1 = Buffer.ReadUInt32();
UInt32 Word2 = Buffer.ReadUInt32();
UInt16 Word3 = Buffer.ReadUInt16();
PosUpdate.p.y = Utils.EQ19ToFloat((Int32)(Word1 & 0x7FFFF));
// Z is in the top 13 bits of Word1 and the bottom 6 of Word2
UInt32 ZPart1 = Word1 >> 19; // ZPart1 now has low order bits of Z in bottom 13 bits
UInt32 ZPart2 = Word2 & 0x3F; // ZPart2 now has high order bits of Z in bottom 6 bits
ZPart2 = ZPart2 << 13;
PosUpdate.p.z = Utils.EQ19ToFloat((Int32)(ZPart1 | ZPart2));
PosUpdate.p.x = Utils.EQ19ToFloat((Int32)(Word2 >> 6) & 0x7FFFF);
PosUpdate.p.heading = Utils.EQ19ToFloat((Int32)(Word3 & 0xFFF));
PosUpdate.HighRes = false;
return PosUpdate;
}
override public List<ZonePoint> GetZonePointList()
{
List<ZonePoint> ZonePointList = new List<ZonePoint>();
List<byte[]> ZonePointPackets = GetPacketsOfType("OP_SendZonepoints", PacketDirection.ServerToClient);
if (ZonePointPackets.Count < 1)
{
return ZonePointList;
}
// Assume there is only 1 packet and process the first one.
ByteStream Buffer = new ByteStream(ZonePointPackets[0]);
UInt32 Entries = Buffer.ReadUInt32();
if (Entries == 0)
return ZonePointList;
float x, y, z, Heading;
UInt32 Number;
UInt16 ZoneID, Instance;
ZonePointList = new List<ZonePoint>();
for (int i = 0; i < Entries; ++i)
{
Number = Buffer.ReadUInt32();
y = Buffer.ReadSingle();
x = Buffer.ReadSingle();
z = Buffer.ReadSingle();
Heading = Buffer.ReadSingle();
if (Heading != 999)
Heading = Heading / 2;
ZoneID = Buffer.ReadUInt16();
Instance = Buffer.ReadUInt16();
Buffer.SkipBytes(8); // Skip the last UInt32
ZonePoint NewZonePoint = new ZonePoint(Number, ZoneID, Instance, x, y, z, x, y, z, Heading, ZoneID);
ZonePointList.Add(NewZonePoint);
}
return ZonePointList;
}
override public bool DumpAAs(string FileName)
{
List<byte[]> AAPackets = GetPacketsOfType("OP_SendAATable", PacketDirection.ServerToClient);
if (AAPackets.Count < 1)
return false;
StreamWriter OutputFile;
try
{
OutputFile = new StreamWriter(FileName);
}
catch
{
return false;
}
OutputFile.WriteLine("-- There are " + AAPackets.Count + " OP_SendAATable packets.");
OutputFile.WriteLine("");
foreach (byte[] Packet in AAPackets)
{
UInt32 AAID = BitConverter.ToUInt32(Packet, 0);
UInt32 Unknown004 = BitConverter.ToUInt32(Packet, 4);
UInt32 HotKeySID = BitConverter.ToUInt32(Packet, 5);
UInt32 HotKeySID2 = BitConverter.ToUInt32(Packet, 9);
UInt32 TitleSID = BitConverter.ToUInt32(Packet, 13);
UInt32 DescSID = BitConverter.ToUInt32(Packet, 17);
UInt32 ClassType = BitConverter.ToUInt32(Packet, 21);
UInt32 Cost = BitConverter.ToUInt32(Packet, 25);
UInt32 Seq = BitConverter.ToUInt32(Packet, 29);
UInt32 CurrentLevel = BitConverter.ToUInt32(Packet, 33);
UInt32 Unknown037 = BitConverter.ToUInt32(Packet, 37);
UInt32 PrereqSkill = BitConverter.ToUInt32(Packet, 41);
UInt32 PrereqMinpoints = BitConverter.ToUInt32(Packet, 45);
UInt32 Type = BitConverter.ToUInt32(Packet, 49);
UInt32 SpellID = BitConverter.ToUInt32(Packet, 53);
UInt32 Unknown057 = BitConverter.ToUInt32(Packet, 57);
UInt32 SpellType = BitConverter.ToUInt32(Packet, 61);
UInt32 SpellRefresh = BitConverter.ToUInt32(Packet, 65);
UInt16 Classes = BitConverter.ToUInt16(Packet, 69);
UInt16 Berserker = BitConverter.ToUInt16(Packet, 71);
UInt32 MaxLevel = BitConverter.ToUInt32(Packet, 73);
UInt32 LastID = BitConverter.ToUInt32(Packet, 77);
UInt32 NextID = BitConverter.ToUInt32(Packet, 81);
UInt32 Cost2 = BitConverter.ToUInt32(Packet, 85);
UInt32 AAExpansion = BitConverter.ToUInt32(Packet, 96);
UInt32 SpecialCategory = BitConverter.ToUInt32(Packet, 100);
UInt32 TotalAbilities = BitConverter.ToUInt32(Packet, 108);
OutputFile.WriteLine(String.Format("AAID: {0}", AAID));
OutputFile.WriteLine(" Unknown004:\t" + Unknown004);
OutputFile.WriteLine(" HotkeySID:\t" + HotKeySID);
OutputFile.WriteLine(" HotkeySID2:\t" + HotKeySID2);
OutputFile.WriteLine(" TitleSID:\t" + TitleSID);
OutputFile.WriteLine(" DescSID:\t" + DescSID);
OutputFile.WriteLine(" ClassType:\t" + ClassType);
OutputFile.WriteLine(" Cost:\t\t" + Cost);
OutputFile.WriteLine(" Seq:\t\t" + Seq);
OutputFile.WriteLine(" CurrentLevel:\t" + CurrentLevel);
OutputFile.WriteLine(" Unknown037:\t" + Unknown037);
OutputFile.WriteLine(" PrereqSkill:\t" + PrereqSkill);
OutputFile.WriteLine(" PrereqMinPt:\t" + PrereqMinpoints);
OutputFile.WriteLine(" Type:\t\t" + Type);
OutputFile.WriteLine(" SpellID:\t" + SpellID);
OutputFile.WriteLine(" Unknown057:\t" + Unknown057);
OutputFile.WriteLine(" SpellType:\t" + SpellType);
OutputFile.WriteLine(" SpellRefresh:\t" + SpellRefresh);
OutputFile.WriteLine(" Classes:\t" + Classes);
OutputFile.WriteLine(" Berserker:\t" + Berserker);
OutputFile.WriteLine(" MaxLevel:\t" + MaxLevel);
OutputFile.WriteLine(" LastID:\t" + LastID);
OutputFile.WriteLine(" NextID:\t" + NextID);
OutputFile.WriteLine(" Cost2:\t\t" + Cost2);
OutputFile.WriteLine(" AAExpansion:\t" + AAExpansion);
OutputFile.WriteLine(" SpecialCat:\t" + SpecialCategory);
OutputFile.WriteLine("");
OutputFile.WriteLine(" TotalAbilities:\t" + TotalAbilities);
OutputFile.WriteLine("");
for (int i = 0; i < TotalAbilities; ++i)
{
UInt32 Ability = BitConverter.ToUInt32(Packet, 112 + (i * 16));
Int32 Base1 = BitConverter.ToInt32(Packet, 116 + (i * 16));
Int32 Base2 = BitConverter.ToInt32(Packet, 120 + (i * 16));
UInt32 Slot = BitConverter.ToUInt32(Packet, 124 + (i * 16));
OutputFile.WriteLine(String.Format(" Ability:\t{0}\tBase1:\t{1}\tBase2:\t{2}\tSlot:\t{3}", Ability, Base1, Base2, Slot));
}
OutputFile.WriteLine("");
}
OutputFile.Close();
return true;
}
public override void RegisterExplorers()
{
//base.RegisterExplorers();
//OpManager.RegisterExplorer("OP_SpawnDoor", ExploreSpawnDoor);
}
public void ExploreSpawnDoor(StreamWriter OutputStream, ByteStream Buffer, PacketDirection Direction)
{
uint DoorCount = Buffer.Length() / 96;
OutputStream.WriteLine("Door Count: {0}", DoorCount);
for (int d = 0; d < DoorCount; ++d)
{
string DoorName = Buffer.ReadFixedLengthString(32, false);
float YPos = Buffer.ReadSingle();
float XPos = Buffer.ReadSingle();
float ZPos = Buffer.ReadSingle();
float Heading = Buffer.ReadSingle();
UInt32 Incline = Buffer.ReadUInt32();
Int32 Size = Buffer.ReadInt32();
Buffer.SkipBytes(4); // Skip Unknown
Byte DoorID = Buffer.ReadByte();
Byte OpenType = Buffer.ReadByte();
Byte StateAtSpawn = Buffer.ReadByte();
Byte InvertState = Buffer.ReadByte();
Int32 DoorParam = Buffer.ReadInt32();
OutputStream.WriteLine(" Name: {0} ID: {1} OT: {2} SAS: {3} IS: {4} DP: {5}",
DoorName, DoorID, OpenType, StateAtSpawn, InvertState, DoorParam);
// Skip past the trailing unknowns in the door struct, moving to the next door in the packet.
Buffer.SkipBytes(28);
}
}
}
}
@@ -0,0 +1,22 @@
using System;
using System.IO;
using System.Collections.Generic;
using EQExtractor2.InternalTypes;
using EQExtractor2.OpCodes;
using EQPacket;
using MyUtils;
namespace EQExtractor2.Patches
{
class PatchMay242011Decoder : PatchMay122011Decoder
{
public PatchMay242011Decoder()
{
Version = "EQ Client Build Date May 24 2011.";
ExpectedPPLength = 28856;
PPZoneIDOffset = 21524;
}
}
}
@@ -0,0 +1,456 @@
using System;
using System.IO;
using System.Collections.Generic;
using EQExtractor2.InternalTypes;
using EQExtractor2.OpCodes;
using EQPacket;
using MyUtils;
namespace EQExtractor2.Patches
{
class PatchNov172011Decoder : PatchAug042011Decoder
{
public PatchNov172011Decoder()
{
Version = "EQ Client Build Date November 17 2011.";
ExpectedPPLength = 29560;
PPZoneIDOffset = 22228;
PatchConfFileName = "patch_Nov17-2011.conf";
}
override public List<ZoneEntryStruct> GetSpawns()
{
List<ZoneEntryStruct> ZoneSpawns = new List<ZoneEntryStruct>();
List<byte[]> SpawnPackets = GetPacketsOfType("OP_ZoneEntry", PacketDirection.ServerToClient);
foreach (byte[] SpawnPacket in SpawnPackets)
{
ZoneEntryStruct NewSpawn = new ZoneEntryStruct();
ByteStream Buffer = new ByteStream(SpawnPacket);
NewSpawn.SpawnName = Buffer.ReadString(true);
NewSpawn.SpawnName = Utils.MakeCleanName(NewSpawn.SpawnName);
NewSpawn.SpawnID = Buffer.ReadUInt32();
NewSpawn.Level = Buffer.ReadByte();
float UnkSize = Buffer.ReadSingle();
NewSpawn.IsNPC = Buffer.ReadByte();
UInt32 Bitfield = Buffer.ReadUInt32();
NewSpawn.Showname = (Bitfield >> 28) & 1;
NewSpawn.TargetableWithHotkey = (Bitfield >> 27) & 1;
NewSpawn.Targetable = (Bitfield >> 26) & 1;
NewSpawn.ShowHelm = (Bitfield >> 24) & 1;
NewSpawn.Gender = (Bitfield >> 20) & 3;
NewSpawn.Padding5 = (Bitfield >> 4) & 1;
NewSpawn.Padding7 = (Bitfield >> 6) & 2047;
NewSpawn.Padding26 = (Bitfield >> 25) & 1;
Byte OtherData = Buffer.ReadByte();
Buffer.SkipBytes(8); // Skip 8 unknown bytes
NewSpawn.DestructableString1 = "";
NewSpawn.DestructableString2 = "";
NewSpawn.DestructableString3 = "";
if ((NewSpawn.IsNPC == 1) && ((OtherData & 3) > 0))
{
// Destructable Objects. Not handled yet
//
//SQLOut(String.Format("-- OBJECT FOUND SpawnID {0}", SpawnID.ToString("x")));
NewSpawn.DestructableString1 = Buffer.ReadString(false);
NewSpawn.DestructableString2 = Buffer.ReadString(false);
NewSpawn.DestructableString3 = Buffer.ReadString(false);
NewSpawn.DestructableUnk1 = Buffer.ReadUInt32();
NewSpawn.DestructableUnk2 = Buffer.ReadUInt32();
NewSpawn.DestructableID1 = Buffer.ReadUInt32();
NewSpawn.DestructableID2 = Buffer.ReadUInt32();
NewSpawn.DestructableID3 = Buffer.ReadUInt32();
NewSpawn.DestructableID4 = Buffer.ReadUInt32();
NewSpawn.DestructableUnk3 = Buffer.ReadUInt32();
NewSpawn.DestructableUnk4 = Buffer.ReadUInt32();
NewSpawn.DestructableUnk5 = Buffer.ReadUInt32();
NewSpawn.DestructableUnk6 = Buffer.ReadUInt32();
NewSpawn.DestructableUnk7 = Buffer.ReadUInt32();
NewSpawn.DestructableUnk8 = Buffer.ReadUInt32();
NewSpawn.DestructableUnk9 = Buffer.ReadUInt32();
NewSpawn.DestructableByte = Buffer.ReadByte();
//SQLOut(String.Format("-- DES: {0,8:x} {1,8:x} {2,8:d} {3,8:d} {4,8:d} {5,8:d} {6,8:x} {7,8:x} {8,8:x} {9,8:x} {10,8:x} {11,8:x} {12,8:x} {13,2:x} {14} {15} {16}",
// DestructableUnk1, DestructableUnk2, DestructableID1, DestructableID2, DestructableID3, DestructableID4,
// DestructableUnk3, DestructableUnk4, DestructableUnk5, DestructableUnk6, DestructableUnk7, DestructableUnk8,
// DestructableUnk9, DestructableByte, DestructableString1, DestructableString2, DestructableString3));
}
NewSpawn.Size = Buffer.ReadSingle();
NewSpawn.Face = Buffer.ReadByte();
NewSpawn.WalkSpeed = Buffer.ReadSingle();
NewSpawn.RunSpeed = Buffer.ReadSingle();
NewSpawn.Race = Buffer.ReadUInt32();
NewSpawn.PropCount = Buffer.ReadByte();
NewSpawn.BodyType = 0;
if (NewSpawn.PropCount >= 1)
{
NewSpawn.BodyType = Buffer.ReadUInt32();
for (int j = 1; j < NewSpawn.PropCount; ++j)
Buffer.SkipBytes(4);
}
Buffer.SkipBytes(1); // Skip HP %
NewSpawn.HairColor = Buffer.ReadByte();
NewSpawn.BeardColor = Buffer.ReadByte();
NewSpawn.EyeColor1 = Buffer.ReadByte();
NewSpawn.EyeColor2 = Buffer.ReadByte();
NewSpawn.HairStyle = Buffer.ReadByte();
NewSpawn.Beard = Buffer.ReadByte();
NewSpawn.DrakkinHeritage = Buffer.ReadUInt32();
NewSpawn.DrakkinTattoo = Buffer.ReadUInt32();
NewSpawn.DrakkinDetails = Buffer.ReadUInt32();
Buffer.SkipBytes(1); // Skip Holding
NewSpawn.Deity = Buffer.ReadUInt32();
Buffer.SkipBytes(8); // Skip GuildID and GuildRank
NewSpawn.Class = Buffer.ReadByte();
Buffer.SkipBytes(4); // Skip PVP, Standstate, Light, Flymode
NewSpawn.EquipChest2 = Buffer.ReadByte();
bool UseWorn = (NewSpawn.EquipChest2 == 255);
Buffer.SkipBytes(2); // 2 Unknown bytes;
NewSpawn.Helm = Buffer.ReadByte();
NewSpawn.LastName = Buffer.ReadString(false);
Buffer.SkipBytes(5); // AATitle + unknown byte
NewSpawn.PetOwnerID = Buffer.ReadUInt32();
Buffer.SkipBytes(26); // Unknown byte + 6 unknown uint32
UInt32 Position1 = Buffer.ReadUInt32();
UInt32 Position2 = Buffer.ReadUInt32();
UInt32 Position3 = Buffer.ReadUInt32();
UInt32 Position4 = Buffer.ReadUInt32();
UInt32 Position5 = Buffer.ReadUInt32();
NewSpawn.YPos = Utils.EQ19ToFloat((Int32)(Position3 & 0x7FFFF));
NewSpawn.Heading = Utils.EQ19ToFloat((Int32)(Position4 & 0xFFF));
NewSpawn.XPos = Utils.EQ19ToFloat((Int32)(Position4 >> 12) & 0x7FFFF);
NewSpawn.ZPos = Utils.EQ19ToFloat((Int32)(Position5 & 0x7FFFF));
for (int ColourSlot = 0; ColourSlot < 9; ++ColourSlot)
NewSpawn.SlotColour[ColourSlot] = Buffer.ReadUInt32();
NewSpawn.MeleeTexture1 = 0;
NewSpawn.MeleeTexture2 = 0;
if (NPCType.IsPlayableRace(NewSpawn.Race))
{
for (int i = 0; i < 9; ++i)
{
NewSpawn.Equipment[i] = Buffer.ReadUInt32();
UInt32 Equip1 = Buffer.ReadUInt32();
UInt32 Equip0 = Buffer.ReadUInt32();
}
if (NewSpawn.Equipment[Constants.MATERIAL_CHEST] > 0)
{
NewSpawn.EquipChest2 = (byte)NewSpawn.Equipment[Constants.MATERIAL_CHEST];
}
NewSpawn.ArmorTintRed = (byte)((NewSpawn.SlotColour[Constants.MATERIAL_CHEST] >> 16) & 0xff);
NewSpawn.ArmorTintGreen = (byte)((NewSpawn.SlotColour[Constants.MATERIAL_CHEST] >> 8) & 0xff);
NewSpawn.ArmorTintBlue = (byte)(NewSpawn.SlotColour[Constants.MATERIAL_CHEST] & 0xff);
if (NewSpawn.Equipment[Constants.MATERIAL_PRIMARY] > 0)
NewSpawn.MeleeTexture1 = NewSpawn.Equipment[Constants.MATERIAL_PRIMARY];
if (NewSpawn.Equipment[Constants.MATERIAL_SECONDARY] > 0)
NewSpawn.MeleeTexture2 = NewSpawn.Equipment[Constants.MATERIAL_SECONDARY];
if (UseWorn)
NewSpawn.Helm = (byte)NewSpawn.Equipment[Constants.MATERIAL_HEAD];
else
NewSpawn.Helm = 0;
}
else
{
// Non playable race
NewSpawn.MeleeTexture1 = NewSpawn.SlotColour[3];
NewSpawn.MeleeTexture2 = NewSpawn.SlotColour[6];
}
if (NewSpawn.EquipChest2 == 255)
NewSpawn.EquipChest2 = 0;
if (NewSpawn.Helm == 255)
NewSpawn.Helm = 0;
if ((OtherData & 4) > 0)
{
NewSpawn.Title = Buffer.ReadString(false);
}
if ((OtherData & 8) > 0)
{
NewSpawn.Suffix = Buffer.ReadString(false);
}
// unknowns
Buffer.SkipBytes(8);
NewSpawn.IsMercenary = Buffer.ReadByte();
ZoneSpawns.Add(NewSpawn);
}
return ZoneSpawns;
}
public override void RegisterExplorers()
{
//base.RegisterExplorers();
//OpManager.RegisterExplorer("OP_NPCMoveUpdate", ExploreNPCMoveUpdate);
//OpManager.RegisterExplorer("OP_MobUpdate", ExploreMobUpdate);
}
public void ExploreNPCMoveUpdate(StreamWriter OutputStream, ByteStream Buffer, PacketDirection Direction)
{
BitStream bs = new BitStream(Buffer.Buffer, Buffer.Length());
UInt32 SpawnID = bs.readUInt(16);
UInt32 Unknown = bs.readUInt(16);
UInt32 VFlags = bs.readUInt(6);
float y = (float)bs.readInt(19) / (float)(1 << 3);
float x = (float)bs.readInt(19) / (float)(1 << 3);
float z = (float)bs.readInt(19) / (float)(1 << 3);
float heading = (float)bs.readInt(12) / (float)(1 << 3);
OutputStream.WriteLine("Spawn: {0} Flags: {1}, XYZ: {2}, {3}, {4}, Heading: {5}", SpawnID, VFlags, x, y, z, heading);
}
public void ExploreMobUpdate(StreamWriter OutputStream, ByteStream Buffer, PacketDirection Direction)
{
UInt32 SpawnID = Buffer.ReadUInt16();
Buffer.SkipBytes(2);
UInt32 Word1 = Buffer.ReadUInt32();
UInt32 Word2 = Buffer.ReadUInt32();
UInt16 Word3 = Buffer.ReadUInt16();
float y = Utils.EQ19ToFloat((Int32)(Word1 & 0x7FFFF));
// Z is in the top 13 bits of Word1 and the bottom 6 of Word2
UInt32 ZPart1 = Word1 >> 19; // ZPart1 now has low order bits of Z in bottom 13 bits
UInt32 ZPart2 = Word2 & 0x3F; // ZPart2 now has high order bits of Z in bottom 6 bits
ZPart2 = ZPart2 << 13;
float z = Utils.EQ19ToFloat((Int32)(ZPart1 | ZPart2));
float x = Utils.EQ19ToFloat((Int32)(Word2 >> 6) & 0x7FFFF);
float heading = Utils.EQ19ToFloat((Int32)(Word3 & 0xFFF));
OutputStream.WriteLine("Spawn: {0} XYZ: {1}, {2}, {3}, Heading: {4}", SpawnID, x, y, z, heading);
}
override public bool DumpAAs(string FileName)
{
List<byte[]> AAPackets = GetPacketsOfType("OP_SendAATable", PacketDirection.ServerToClient);
if (AAPackets.Count < 1)
return false;
StreamWriter OutputFile;
try
{
OutputFile = new StreamWriter(FileName);
}
catch
{
return false;
}
OutputFile.WriteLine("-- There are " + AAPackets.Count + " OP_SendAATable packets.");
OutputFile.WriteLine("");
foreach (byte[] Packet in AAPackets)
{
ByteStream Buffer = new ByteStream(Packet);
UInt32 AAID = Buffer.ReadUInt32();
byte Unknown004 = Buffer.ReadByte();
UInt32 HotKeySID = Buffer.ReadUInt32();
UInt32 HotKeySID2 = Buffer.ReadUInt32();
UInt32 TitleSID = Buffer.ReadUInt32();
UInt32 DescSID = Buffer.ReadUInt32();
UInt32 ClassType = Buffer.ReadUInt32();
UInt32 Cost = Buffer.ReadUInt32();
UInt32 Seq = Buffer.ReadUInt32();
UInt32 CurrentLevel = Buffer.ReadUInt32();
UInt32 PreReqSkillCount = Buffer.ReadUInt32();
UInt32 [] PreReqSkills = new UInt32[PreReqSkillCount];
for(int i = 0; i < PreReqSkillCount; ++i)
PreReqSkills[i] = Buffer.ReadUInt32(); // The SEQ value of the AA packet containing the pre-req AA
UInt32 PreReqMinPointCount = Buffer.ReadUInt32();
UInt32[] PreReqMinPoints = new UInt32[PreReqMinPointCount];
for (int i = 0; i < PreReqMinPointCount; ++i)
PreReqMinPoints[i] = Buffer.ReadUInt32();
UInt32 Type = Buffer.ReadUInt32();
UInt32 SpellID = Buffer.ReadUInt32();
UInt32 Unknown057 = Buffer.ReadUInt32();
UInt32 SpellType = Buffer.ReadUInt32();
UInt32 SpellRefresh = Buffer.ReadUInt32();
UInt16 Classes = Buffer.ReadUInt16();
UInt16 Berserker = Buffer.ReadUInt16();
UInt32 MaxLevel = Buffer.ReadUInt32();
UInt32 LastID = Buffer.ReadUInt32();
UInt32 NextID = Buffer.ReadUInt32();
UInt32 Cost2 = Buffer.ReadUInt32();
Buffer.SkipBytes(7);
UInt32 AAExpansion = Buffer.ReadUInt32();
UInt32 SpecialCategory = Buffer.ReadUInt32();
Buffer.SkipBytes(4);
UInt32 TotalAbilities = Buffer.ReadUInt32();
OutputFile.WriteLine(String.Format("AAID: {0}", AAID));
OutputFile.WriteLine(" Unknown004:\t" + Unknown004);
OutputFile.WriteLine(" HotkeySID:\t" + HotKeySID);
OutputFile.WriteLine(" HotkeySID2:\t" + HotKeySID2);
OutputFile.WriteLine(" TitleSID:\t" + TitleSID);
OutputFile.WriteLine(" DescSID:\t" + DescSID);
OutputFile.WriteLine(" ClassType:\t" + ClassType);
OutputFile.WriteLine(" Cost:\t\t" + Cost);
OutputFile.WriteLine(" Seq:\t\t" + Seq);
OutputFile.WriteLine(" CurrentLevel:\t" + CurrentLevel);
OutputFile.Write(" PreReqSkills (SEQs):\t");
for (int i = 0; i < PreReqSkillCount; ++i)
OutputFile.Write("{0} ", PreReqSkills[i]);
OutputFile.WriteLine("");
OutputFile.Write(" PreReqSkills MinPoints:\t");
for (int i = 0; i < PreReqMinPointCount; ++i)
OutputFile.Write("{0} ", PreReqMinPoints[i]);
OutputFile.WriteLine("");
OutputFile.WriteLine(" Type:\t\t" + Type);
OutputFile.WriteLine(" SpellID:\t" + SpellID);
OutputFile.WriteLine(" Unknown057:\t" + Unknown057);
OutputFile.WriteLine(" SpellType:\t" + SpellType);
OutputFile.WriteLine(" SpellRefresh:\t" + SpellRefresh);
OutputFile.WriteLine(" Classes:\t" + Classes);
OutputFile.WriteLine(" Berserker:\t" + Berserker);
OutputFile.WriteLine(" MaxLevel:\t" + MaxLevel);
OutputFile.WriteLine(" LastID:\t" + LastID);
OutputFile.WriteLine(" NextID:\t" + NextID);
OutputFile.WriteLine(" Cost2:\t\t" + Cost2);
OutputFile.WriteLine(" AAExpansion:\t" + AAExpansion);
OutputFile.WriteLine(" SpecialCat:\t" + SpecialCategory);
OutputFile.WriteLine("");
OutputFile.WriteLine(" TotalAbilities:\t" + TotalAbilities);
OutputFile.WriteLine("");
for (int i = 0; i < TotalAbilities; ++i)
{
UInt32 Ability = Buffer.ReadUInt32();
Int32 Base1 = Buffer.ReadInt32();
Int32 Base2 = Buffer.ReadInt32();
UInt32 Slot = Buffer.ReadUInt32();
OutputFile.WriteLine(String.Format(" Ability:\t{0}\tBase1:\t{1}\tBase2:\t{2}\tSlot:\t{3}", Ability, Base1, Base2, Slot));
}
OutputFile.WriteLine("");
}
OutputFile.Close();
return true;
}
}
}
@@ -0,0 +1,22 @@
using System;
using System.IO;
using System.Collections.Generic;
using EQExtractor2.InternalTypes;
using EQExtractor2.OpCodes;
using EQPacket;
using MyUtils;
namespace EQExtractor2.Patches
{
class PatchOct202010Decoder : PatchTestSep222010Decoder
{
public PatchOct202010Decoder()
{
Version = "EQ Client Build Date October 20 2010.";
ExpectedPPLength = 27816;
PPZoneIDOffset = 20484;
}
}
}
+991
View File
@@ -0,0 +1,991 @@
//
// Copyright (C) 2001-2010 EQEMu Development Team (http://eqemulator.net). Distributed under GPL version 2.
//
//
//
// IMPORTANT NOTE: This decoder for SoD was developed purely as a cursory test of the multi-patch support and is not guaranteed
// to be 100% correct.
//
//
using System;
using System.IO;
using System.Collections.Generic;
using EQExtractor2.InternalTypes;
using EQExtractor2.OpCodes;
using EQPacket;
using MyUtils;
namespace EQExtractor2.Patches
{
class PatchSoD : PatchSpecficDecoder
{
public PatchSoD()
{
Version = "Seeds of Destruction";
PatchConfFileName = "patch_SoD.conf";
ExpectedPPLength = 23488;
PPZoneIDOffset = 16452;
}
override public bool Init(string ConfDirectory, ref string ErrorMessage)
{
OpManager = new OpCodeManager();
if (!OpManager.Init(ConfDirectory + "\\" + PatchConfFileName, ref ErrorMessage))
return false;
RegisterExplorers();
return true;
}
override public IdentificationStatus Identify(int OpCode, int Size, PacketDirection Direction)
{
if ((OpCode == OpManager.OpCodeNameToNumber("OP_ZoneEntry")) && (Direction == PacketDirection.ClientToServer))
return IdentificationStatus.Tentative;
if ((OpCode == OpManager.OpCodeNameToNumber("OP_PlayerProfile")) && (Direction == PacketDirection.ServerToClient) &&
(Size == ExpectedPPLength))
return IdentificationStatus.Yes;
return IdentificationStatus.No;
}
override public int VerifyPlayerProfile()
{
List<byte[]> PlayerProfilePacket = GetPacketsOfType("OP_PlayerProfile", PacketDirection.ServerToClient);
if (PlayerProfilePacket.Count == 0)
{
return 0;
}
else
{
if (PlayerProfilePacket[0].Length != ExpectedPPLength)
{
return 0;
}
}
return ExpectedPPLength;
}
override public UInt16 GetZoneNumber()
{
List<byte[]> PlayerProfilePacket = GetPacketsOfType("OP_PlayerProfile", PacketDirection.ServerToClient);
if (PlayerProfilePacket.Count == 0)
{
return 0;
}
else
{
if (PlayerProfilePacket[0].Length != ExpectedPPLength)
{
return 0;
}
}
return BitConverter.ToUInt16(PlayerProfilePacket[0], PPZoneIDOffset);
}
override public List<Door> GetDoors()
{
List<Door> DoorList = new List<Door>();
List<byte[]> SpawnDoorPacket = GetPacketsOfType("OP_SpawnDoor", PacketDirection.ServerToClient);
if ((SpawnDoorPacket.Count == 0) || (SpawnDoorPacket[0].Length == 0))
return DoorList;
int DoorCount = SpawnDoorPacket[0].Length / 92;
ByteStream Buffer = new ByteStream(SpawnDoorPacket[0]);
for (int d = 0; d < DoorCount; ++d)
{
string DoorName = Buffer.ReadFixedLengthString(32, false);
float YPos = Buffer.ReadSingle();
float XPos = Buffer.ReadSingle();
float ZPos = Buffer.ReadSingle();
float Heading = Buffer.ReadSingle();
UInt32 Incline = Buffer.ReadUInt32();
Int32 Size = Buffer.ReadInt32();
Buffer.SkipBytes(4); // Skip Unknown
Byte DoorID = Buffer.ReadByte();
Byte OpenType = Buffer.ReadByte();
Byte StateAtSpawn = Buffer.ReadByte();
Byte InvertState = Buffer.ReadByte();
Int32 DoorParam = Buffer.ReadInt32();
// Skip past the trailing unknowns in the door struct, moving to the next door in the packet.
Buffer.SkipBytes(24);
string DestZone = "NONE";
Door NewDoor = new Door(DoorName, YPos, XPos, ZPos, Heading, Incline, Size, DoorID, OpenType, StateAtSpawn, InvertState,
DoorParam, DestZone, 0, 0, 0, 0);
DoorList.Add(NewDoor);
}
return DoorList;
}
override public MerchantManager GetMerchantData(NPCSpawnList NPCSL)
{
List<EQApplicationPacket> PacketList = Packets.PacketList;
UInt32 OP_ShopRequest = OpManager.OpCodeNameToNumber("OP_ShopRequest");
UInt32 OP_ShopEnd = OpManager.OpCodeNameToNumber("OP_ShopEnd");
UInt32 OP_ItemPacket = OpManager.OpCodeNameToNumber("OP_ItemPacket");
MerchantManager mm = new MerchantManager();
for (int i = 0; i < PacketList.Count; ++i)
{
EQApplicationPacket p = PacketList[i];
if ((p.Direction == PacketDirection.ServerToClient) && (p.OpCode == OP_ShopRequest))
{
ByteStream Buffer = new ByteStream(p.Buffer);
UInt32 MerchantSpawnID = Buffer.ReadUInt32();
NPCSpawn npc = NPCSL.GetNPC(MerchantSpawnID);
UInt32 NPCTypeID;
if (npc != null)
NPCTypeID = npc.NPCTypeID;
else
NPCTypeID = 0;
mm.AddMerchant(MerchantSpawnID);
for (int j = i + 1; j < PacketList.Count; ++j)
{
p = PacketList[j];
if (p.OpCode == OP_ShopEnd)
break;
if (p.OpCode == OP_ItemPacket)
{
Buffer = new ByteStream(p.Buffer);
UInt32 StackSize = Buffer.ReadUInt32();
Buffer.SkipBytes(4);
UInt32 Slot = Buffer.ReadUInt32();
UInt32 MerchantSlot = Buffer.ReadUInt32();
UInt32 Price = Buffer.ReadUInt32();
Int32 Quantity = Buffer.ReadInt32();
Buffer.SetPosition(68); // Point to item name
string ItemName = Buffer.ReadString(true);
string Lore = Buffer.ReadString(true);
string IDFile = Buffer.ReadString(true);
UInt32 ItemID = Buffer.ReadUInt32();
//if (Quantity == -1)
mm.AddMerchantItem(MerchantSpawnID, ItemID, ItemName, MerchantSlot, Quantity);
}
}
}
}
return mm;
}
override public List<ZonePoint> GetZonePointList()
{
List<ZonePoint> ZonePointList = new List<ZonePoint>();
List<byte[]> ZonePointPackets = GetPacketsOfType("OP_SendZonepoints", PacketDirection.ServerToClient);
if (ZonePointPackets.Count < 1)
{
ZonePointList = null;
return ZonePointList;
}
// Assume there is only 1 packet and process the first one.
ByteStream Buffer = new ByteStream(ZonePointPackets[0]);
UInt32 Entries = Buffer.ReadUInt32();
if (Entries == 0)
return ZonePointList;
float x, y, z, Heading;
UInt32 Number;
UInt16 ZoneID, Instance;
ZonePointList = new List<ZonePoint>();
for (int i = 0; i < Entries; ++i)
{
Number = Buffer.ReadUInt32();
y = Buffer.ReadSingle();
x = Buffer.ReadSingle();
z = Buffer.ReadSingle();
Heading = Buffer.ReadSingle();
if (Heading != 999)
Heading = Heading / 2;
ZoneID = Buffer.ReadUInt16();
Instance = Buffer.ReadUInt16();
//Buffer.SkipBytes(4); // Skip the last UInt32
ZonePoint NewZonePoint = new ZonePoint(Number, ZoneID, Instance, x, y, z, x, y, z, Heading, ZoneID);
ZonePointList.Add(NewZonePoint);
}
return ZonePointList;
}
override public NewZoneStruct GetZoneData()
{
NewZoneStruct NewZone = new NewZoneStruct();
List<byte[]> ZonePackets = GetPacketsOfType("OP_NewZone", PacketDirection.ServerToClient);
if (ZonePackets.Count < 1)
return NewZone;
// Assume there is only 1 packet and process the first one.
ByteStream Buffer = new ByteStream(ZonePackets[0]);
string CharName = Buffer.ReadFixedLengthString(64, false);
NewZone.ShortName = Buffer.ReadFixedLengthString(32, false);
Buffer.SkipBytes(96); // Skip Unknown
NewZone.LongName = Buffer.ReadFixedLengthString(278, true);
NewZone.Type = Buffer.ReadByte();
NewZone.FogRed = Buffer.ReadBytes(4);
NewZone.FogGreen = Buffer.ReadBytes(4);
NewZone.FogBlue = Buffer.ReadBytes(4);
Buffer.SkipBytes(1); // Unknown
for (int i = 0; i < 4; ++i)
NewZone.FogMinClip[i] = Buffer.ReadSingle();
for (int i = 0; i < 4; ++i)
NewZone.FogMaxClip[i] = Buffer.ReadSingle();
NewZone.Gravity = Buffer.ReadSingle();
NewZone.TimeType = Buffer.ReadByte();
Buffer.SkipBytes(49); // Unknown
NewZone.Sky = Buffer.ReadByte();
Buffer.SkipBytes(13); // Unknown
NewZone.ZEM = Buffer.ReadSingle();
NewZone.SafeY = Buffer.ReadSingle();
NewZone.SafeX = Buffer.ReadSingle();
NewZone.SafeZ = Buffer.ReadSingle();
NewZone.MinZ = Buffer.ReadSingle();
NewZone.MaxZ = Buffer.ReadSingle();
NewZone.UnderWorld = Buffer.ReadSingle();
NewZone.MinClip = Buffer.ReadSingle();
NewZone.MaxClip = Buffer.ReadSingle();
Buffer.SkipBytes(84); // Unknown
NewZone.ShortName2 = Buffer.ReadFixedLengthString(96, false);
Buffer.SkipBytes(52); // Unknown
NewZone.ZoneID = Buffer.ReadUInt16();
NewZone.InstanceID = Buffer.ReadUInt16();
Buffer.SkipBytes(38); // Unknown
NewZone.FallDamage = Buffer.ReadByte();
Buffer.SkipBytes(21); // Unknown
NewZone.FogDensity = Buffer.ReadSingle();
// Everything else after this point in the packet is unknown.
return NewZone;
}
override public List<ZoneEntryStruct> GetSpawns()
{
List<ZoneEntryStruct> ZoneSpawns = new List<ZoneEntryStruct>();
List<byte[]> SpawnPackets = GetPacketsOfType("OP_ZoneEntry", PacketDirection.ServerToClient);
foreach (byte[] SpawnPacket in SpawnPackets)
{
ZoneEntryStruct NewSpawn = new ZoneEntryStruct();
ByteStream Buffer = new ByteStream(SpawnPacket);
NewSpawn.SpawnName = Buffer.ReadString(true);
NewSpawn.SpawnName = Utils.MakeCleanName(NewSpawn.SpawnName);
NewSpawn.SpawnID = Buffer.ReadUInt32();
NewSpawn.Level = Buffer.ReadByte();
float UnkSize = Buffer.ReadSingle();
NewSpawn.IsNPC = Buffer.ReadByte();
UInt32 Bitfield = Buffer.ReadUInt32();
NewSpawn.Showname = (Bitfield >> 28) & 1;
NewSpawn.TargetableWithHotkey = (Bitfield >> 27) & 1;
NewSpawn.Targetable = (Bitfield >> 26) & 1;
NewSpawn.ShowHelm = (Bitfield >> 24) & 1;
NewSpawn.Gender = (Bitfield >> 20) & 3;
Byte OtherData = Buffer.ReadByte();
Buffer.SkipBytes(8); // Skip 8 unknown bytes
NewSpawn.DestructableString1 = "";
NewSpawn.DestructableString2 = "";
NewSpawn.DestructableString3 = "";
if ((OtherData & 1) > 0)
{
//SQLOut(String.Format("-- OBJECT FOUND SpawnID {0}", SpawnID.ToString("x")));
//Console.WriteLine("Otherdata is {0} Skipping Stuff.", OtherData.ToString("x"));
NewSpawn.DestructableString1 = Buffer.ReadString(false);
NewSpawn.DestructableString2 = Buffer.ReadString(false);
NewSpawn.DestructableString3 = Buffer.ReadString(false);
NewSpawn.DestructableUnk1 = Buffer.ReadUInt32();
NewSpawn.DestructableUnk2 = Buffer.ReadUInt32();
NewSpawn.DestructableID1 = Buffer.ReadUInt32();
NewSpawn.DestructableID2 = Buffer.ReadUInt32();
NewSpawn.DestructableID3 = Buffer.ReadUInt32();
NewSpawn.DestructableID4 = Buffer.ReadUInt32();
NewSpawn.DestructableUnk3 = Buffer.ReadUInt32();
NewSpawn.DestructableUnk4 = Buffer.ReadUInt32();
NewSpawn.DestructableUnk5 = Buffer.ReadUInt32();
NewSpawn.DestructableUnk6 = Buffer.ReadUInt32();
NewSpawn.DestructableUnk7 = Buffer.ReadUInt32();
NewSpawn.DestructableUnk8 = Buffer.ReadUInt32();
NewSpawn.DestructableUnk9 = Buffer.ReadUInt32();
NewSpawn.DestructableByte = Buffer.ReadByte();
//SQLOut(String.Format("-- DES: {0,8:x} {1,8:x} {2,8:d} {3,8:d} {4,8:d} {5,8:d} {6,8:x} {7,8:x} {8,8:x} {9,8:x} {10,8:x} {11,8:x} {12,8:x} {13,2:x} {14} {15} {16}",
// DestructableUnk1, DestructableUnk2, DestructableID1, DestructableID2, DestructableID3, DestructableID4,
// DestructableUnk3, DestructableUnk4, DestructableUnk5, DestructableUnk6, DestructableUnk7, DestructableUnk8,
// DestructableUnk9, DestructableByte, DestructableString1, DestructableString2, DestructableString3));
}
NewSpawn.Size = Buffer.ReadSingle();
NewSpawn.Face = Buffer.ReadByte();
NewSpawn.WalkSpeed = Buffer.ReadSingle();
NewSpawn.RunSpeed = Buffer.ReadSingle();
NewSpawn.Race = Buffer.ReadUInt32();
NewSpawn.PropCount = Buffer.ReadByte();
NewSpawn.BodyType = 0;
if (NewSpawn.PropCount >= 1)
{
NewSpawn.BodyType = Buffer.ReadUInt32();
for (int j = 1; j < NewSpawn.PropCount; ++j)
Buffer.SkipBytes(4);
}
Buffer.SkipBytes(1); // Skip HP %
NewSpawn.HairColor = Buffer.ReadByte();
NewSpawn.BeardColor = Buffer.ReadByte();
NewSpawn.EyeColor1 = Buffer.ReadByte();
NewSpawn.EyeColor2 = Buffer.ReadByte();
NewSpawn.HairStyle = Buffer.ReadByte();
NewSpawn.Beard = Buffer.ReadByte();
NewSpawn.DrakkinHeritage = Buffer.ReadUInt32();
NewSpawn.DrakkinTattoo = Buffer.ReadUInt32();
NewSpawn.DrakkinDetails = Buffer.ReadUInt32();
Buffer.SkipBytes(1); // Skip Holding
NewSpawn.Deity = Buffer.ReadUInt32();
Buffer.SkipBytes(8); // Skip GuildID and GuildRank
NewSpawn.Class = Buffer.ReadByte();
Buffer.SkipBytes(4); // Skip PVP, Standstate, Light, Flymode
NewSpawn.EquipChest2 = Buffer.ReadByte();
bool UseWorn = (NewSpawn.EquipChest2 == 255);
Buffer.SkipBytes(2); // 2 Unknown bytes;
NewSpawn.Helm = Buffer.ReadByte();
NewSpawn.LastName = Buffer.ReadString(false);
Buffer.SkipBytes(5); // AATitle + unknown byte
NewSpawn.PetOwnerID = Buffer.ReadUInt32();
Buffer.SkipBytes(25); // Unknown byte + 6 unknown uint32
UInt32 Position1 = Buffer.ReadUInt32();
UInt32 Position2 = Buffer.ReadUInt32();
UInt32 Position3 = Buffer.ReadUInt32();
UInt32 Position4 = Buffer.ReadUInt32();
UInt32 Position5 = Buffer.ReadUInt32();
NewSpawn.YPos = Utils.EQ19ToFloat((Int32)(Position3 & 0x7FFFF));
NewSpawn.Heading = Utils.EQ19ToFloat((Int32)(Position4 & 0xFFF));
NewSpawn.XPos = Utils.EQ19ToFloat((Int32)(Position4 >> 12) & 0x7FFFF);
NewSpawn.ZPos = Utils.EQ19ToFloat((Int32)(Position5 & 0x7FFFF));
for (int ColourSlot = 0; ColourSlot < 9; ++ColourSlot)
NewSpawn.SlotColour[ColourSlot] = Buffer.ReadUInt32();
NewSpawn.MeleeTexture1 = 0;
NewSpawn.MeleeTexture2 = 0;
if (NPCType.IsPlayableRace(NewSpawn.Race))
{
for (int i = 0; i < 9; ++i)
{
NewSpawn.Equipment[i] = Buffer.ReadUInt32();
UInt32 Equip1 = Buffer.ReadUInt32();
UInt32 Equip0 = Buffer.ReadUInt32();
}
if (NewSpawn.Equipment[Constants.MATERIAL_CHEST] > 0)
{
NewSpawn.EquipChest2 = (byte)NewSpawn.Equipment[Constants.MATERIAL_CHEST];
}
NewSpawn.ArmorTintRed = (byte)((NewSpawn.SlotColour[Constants.MATERIAL_CHEST] >> 16) & 0xff);
NewSpawn.ArmorTintGreen = (byte)((NewSpawn.SlotColour[Constants.MATERIAL_CHEST] >> 8) & 0xff);
NewSpawn.ArmorTintBlue = (byte)(NewSpawn.SlotColour[Constants.MATERIAL_CHEST] & 0xff);
if (NewSpawn.Equipment[Constants.MATERIAL_PRIMARY] > 0)
NewSpawn.MeleeTexture1 = NewSpawn.Equipment[Constants.MATERIAL_PRIMARY];
if (NewSpawn.Equipment[Constants.MATERIAL_SECONDARY] > 0)
NewSpawn.MeleeTexture2 = NewSpawn.Equipment[Constants.MATERIAL_SECONDARY];
if (UseWorn)
NewSpawn.Helm = (byte)NewSpawn.Equipment[Constants.MATERIAL_HEAD];
else
NewSpawn.Helm = 0;
}
else
{
// Non playable race
NewSpawn.MeleeTexture1 = NewSpawn.SlotColour[3];
NewSpawn.MeleeTexture2 = NewSpawn.SlotColour[6];
}
if (NewSpawn.EquipChest2 == 255)
NewSpawn.EquipChest2 = 0;
if (NewSpawn.Helm == 255)
NewSpawn.Helm = 0;
if ((OtherData & 4) > 0)
{
NewSpawn.Title = Buffer.ReadString(false);
}
if ((OtherData & 8) > 0)
{
NewSpawn.Suffix = Buffer.ReadString(false);
}
// unknowns
Buffer.SkipBytes(8);
NewSpawn.IsMercenary = Buffer.ReadByte();
ZoneSpawns.Add(NewSpawn);
}
return ZoneSpawns;
}
override public List<PositionUpdate> GetHighResolutionMovementUpdates()
{
List<PositionUpdate> Updates = new List<PositionUpdate>();
List<byte[]> UpdatePackets = GetPacketsOfType("OP_NPCMoveUpdate", PacketDirection.ServerToClient);
foreach (byte[] UpdatePacket in UpdatePackets)
{
PositionUpdate PosUpdate = new PositionUpdate();
BitStream bs = new BitStream(UpdatePacket, 13);
PosUpdate.SpawnID = bs.readUInt(16);
UInt32 VFlags = bs.readUInt(6);
PosUpdate.p.y = (float)bs.readInt(19) / (float)(1 << 3);
PosUpdate.p.x = (float)bs.readInt(19) / (float)(1 << 3);
PosUpdate.p.z = (float)bs.readInt(19) / (float)(1 << 3);
PosUpdate.p.heading = (float)bs.readInt(12) / (float)(1 << 3);
Updates.Add(PosUpdate);
}
return Updates;
}
override public List<PositionUpdate> GetLowResolutionMovementUpdates()
{
List<PositionUpdate> Updates = new List<PositionUpdate>();
List<byte[]> UpdatePackets = GetPacketsOfType("OP_MobUpdate", PacketDirection.ServerToClient);
foreach (byte[] MobUpdatePacket in UpdatePackets)
{
PositionUpdate PosUpdate = new PositionUpdate();
ByteStream Buffer = new ByteStream(MobUpdatePacket);
PosUpdate.SpawnID = Buffer.ReadUInt16();
UInt32 Word1 = Buffer.ReadUInt32();
UInt32 Word2 = Buffer.ReadUInt32();
UInt16 Word3 = Buffer.ReadUInt16();
PosUpdate.p.y = Utils.EQ19ToFloat((Int32)(Word1 & 0x7FFFF));
// Z is in the top 13 bits of Word1 and the bottom 6 of Word2
UInt32 ZPart1 = Word1 >> 19; // ZPart1 now has low order bits of Z in bottom 13 bits
UInt32 ZPart2 = Word2 & 0x3F; // ZPart2 now has low order bits of Z in bottom 6 bits
ZPart2 = ZPart2 << 13;
PosUpdate.p.z = Utils.EQ19ToFloat((Int32)(ZPart1 | ZPart2));
PosUpdate.p.x = Utils.EQ19ToFloat((Int32)(Word2 >> 6) & 0x7FFFF);
PosUpdate.p.heading = Utils.EQ19ToFloat((Int32)(Word3 & 0xFFF));
Updates.Add(PosUpdate);
}
return Updates;
}
override public List<GroundSpawnStruct> GetGroundSpawns()
{
List<GroundSpawnStruct> GroundSpawns = new List<GroundSpawnStruct>();
List<byte[]> GroundSpawnPackets = GetPacketsOfType("OP_GroundSpawn", PacketDirection.ServerToClient);
foreach (byte[] GroundSpawnPacket in GroundSpawnPackets)
{
GroundSpawnStruct GroundSpawn = new GroundSpawnStruct();
ByteStream Buffer = new ByteStream(GroundSpawnPacket);
Buffer.SkipBytes(12);
GroundSpawn.DropID = Buffer.ReadUInt32();
GroundSpawn.ZoneID = Buffer.ReadUInt16();
GroundSpawn.InstanceID = Buffer.ReadUInt16();
Buffer.SkipBytes(8);
GroundSpawn.Heading = Buffer.ReadSingle();
Buffer.SkipBytes(12);
GroundSpawn.z = Buffer.ReadSingle();
GroundSpawn.x = Buffer.ReadSingle();
GroundSpawn.y = Buffer.ReadSingle();
GroundSpawn.Name = Buffer.ReadFixedLengthString(16, false);
Buffer.SkipBytes(20);
GroundSpawn.ObjectType = Buffer.ReadUInt32();
GroundSpawns.Add(GroundSpawn);
}
return GroundSpawns;
}
override public List<UInt32> GetFindableSpawns()
{
List<UInt32> FindableSpawnList = new List<UInt32>();
List<byte[]> FindablePackets = GetPacketsOfType("OP_SendFindableNPCs", PacketDirection.ServerToClient);
if (FindablePackets.Count < 1)
return FindableSpawnList;
foreach (byte[] Packet in FindablePackets)
{
if (BitConverter.ToUInt32(Packet, 0) == 0)
FindableSpawnList.Add(BitConverter.ToUInt32(Packet, 4));
}
return FindableSpawnList;
}
override public string GetZoneName()
{
List<byte[]> NewZonePacket = GetPacketsOfType("OP_NewZone", PacketDirection.ServerToClient);
if (NewZonePacket.Count != 1)
return "";
return Utils.ReadNullTerminatedString(NewZonePacket[0], 704, 96, false);
}
public override void RegisterExplorers()
{
OpManager.RegisterExplorer("OP_ZoneEntry", ExploreZoneEntry);
//OpManager.RegisterExplorer("OP_RespawnWindow", ExploreRespawnWindow);
//OpManager.RegisterExplorer("OP_ZonePlayerToBind", ExploreZonePlayerToBind);
//OpManager.RegisterExplorer("OP_RequestClientZoneChange", ExploreRequestClientZoneChange);
//OpManager.RegisterExplorer("OP_DeleteSpawn", ExploreDeleteSpawn);
OpManager.RegisterExplorer("OP_HPUpdate", ExploreHPUpdate);
}
public void ExploreZoneEntry(StreamWriter OutputStream, ByteStream Buffer, PacketDirection Direction)
{
if (Direction != PacketDirection.ServerToClient)
return;
string Name = Buffer.ReadString(false);
UInt32 SpawnID = Buffer.ReadUInt32();
byte Level = Buffer.ReadByte();
Buffer.SkipBytes(4);
bool IsNPC = (Buffer.ReadByte() != 0);
UInt32 Bitfield = Buffer.ReadUInt32();
string DestructableString1;
string DestructableString2;
string DestructableString3;
UInt32 DestructableUnk1;
UInt32 DestructableUnk2;
UInt32 DestructableID1;
UInt32 DestructableID2;
UInt32 DestructableID3;
UInt32 DestructableID4;
UInt32 DestructableUnk3;
UInt32 DestructableUnk4;
UInt32 DestructableUnk5;
UInt32 DestructableUnk6;
UInt32 DestructableUnk7;
UInt32 DestructableUnk8;
UInt32 DestructableUnk9;
byte DestructableByte;
Byte OtherData = Buffer.ReadByte();
Buffer.SkipBytes(8); // Skip 8 unknown bytes
DestructableString1 = "";
DestructableString2 = "";
DestructableString3 = "";
OutputStream.WriteLine("Spawn Name: {0} ID: {1} Level: {2} {3}\r\n", Name, SpawnID, Level, IsNPC ? "NPC" : "Player");
if ((OtherData & 1) > 0)
{
// Destructable Objects.
DestructableString1 = Buffer.ReadString(false);
DestructableString2 = Buffer.ReadString(false);
DestructableString3 = Buffer.ReadString(false);
DestructableUnk1 = Buffer.ReadUInt32();
DestructableUnk2 = Buffer.ReadUInt32();
DestructableID1 = Buffer.ReadUInt32();
DestructableID2 = Buffer.ReadUInt32();
DestructableID3 = Buffer.ReadUInt32();
DestructableID4 = Buffer.ReadUInt32();
DestructableUnk3 = Buffer.ReadUInt32();
DestructableUnk4 = Buffer.ReadUInt32();
DestructableUnk5 = Buffer.ReadUInt32();
DestructableUnk6 = Buffer.ReadUInt32();
DestructableUnk7 = Buffer.ReadUInt32();
DestructableUnk8 = Buffer.ReadUInt32();
DestructableUnk9 = Buffer.ReadUInt32();
DestructableByte = Buffer.ReadByte();
OutputStream.WriteLine("DESTRUCTABLE OBJECT:\r\n");
OutputStream.WriteLine(" String1: {0}", DestructableString1);
OutputStream.WriteLine(" String2: {0}", DestructableString2);
OutputStream.WriteLine(" String3: {0}\r\n", DestructableString3);
OutputStream.WriteLine(" Unk1: {0,8:x} Unk2: {1,8:x}\r\n ID1 : {2,8:x} ID2 : {3,8:x} ID3 : {4,8:x} ID4 : {5,8:x}\r\n Unk3: {6,8:x} Unk4: {7,8:x} Unk5: {8,8:x} Unk6: {9,8:x}\r\n Unk7: {10,8:x} Unk8: {11,8:x} Unk9: {12,8:x}\r\n UnkByte: {13,2:x}",
DestructableUnk1, DestructableUnk2, DestructableID1, DestructableID2, DestructableID3, DestructableID4,
DestructableUnk3, DestructableUnk4, DestructableUnk5, DestructableUnk6, DestructableUnk7, DestructableUnk8,
DestructableUnk9, DestructableByte);
}
Buffer.SkipBytes(17);
byte PropCount = Buffer.ReadByte();
if (PropCount >= 1)
{
Buffer.SkipBytes(4);
for (int j = 1; j < PropCount; ++j)
Buffer.SkipBytes(4);
}
byte HP = Buffer.ReadByte();
OutputStream.WriteLine("HP% is {0}\r\n", HP);
AddExplorerSpawn(SpawnID, Name);
}
public void ExploreHPUpdate(StreamWriter OutputStream, ByteStream Buffer, PacketDirection Direction)
{
UInt32 CurrentHP = Buffer.ReadUInt32();
Int32 MaxHP = Buffer.ReadInt32();
UInt16 SpawnID = Buffer.ReadUInt16();
string SpawnName = FindExplorerSpawn(SpawnID);
OutputStream.WriteLine("Spawn {0} {1} Current HP: {2} Max HP: {3}", SpawnID, SpawnName, CurrentHP, MaxHP);
OutputStream.WriteLine("");
}
override public bool DumpAAs(string FileName)
{
List<byte[]> AAPackets = GetPacketsOfType("OP_SendAATable", PacketDirection.ServerToClient);
if (AAPackets.Count < 1)
return false;
StreamWriter OutputFile;
try
{
OutputFile = new StreamWriter(FileName);
}
catch
{
return false;
}
OutputFile.WriteLine("-- There are " + AAPackets.Count + " OP_SendAATable packets.");
OutputFile.WriteLine("");
foreach (byte[] Packet in AAPackets)
{
UInt32 AAID = BitConverter.ToUInt32(Packet, 0);
UInt32 Unknown004 = BitConverter.ToUInt32(Packet, 4);
UInt32 HotKeySID = BitConverter.ToUInt32(Packet, 5);
UInt32 HotKeySID2 = BitConverter.ToUInt32(Packet, 9);
UInt32 TitleSID = BitConverter.ToUInt32(Packet, 13);
UInt32 DescSID = BitConverter.ToUInt32(Packet, 17);
UInt32 ClassType = BitConverter.ToUInt32(Packet, 21);
UInt32 Cost = BitConverter.ToUInt32(Packet, 25);
UInt32 Seq = BitConverter.ToUInt32(Packet, 29);
UInt32 CurrentLevel = BitConverter.ToUInt32(Packet, 33);
UInt32 PrereqSkill = BitConverter.ToUInt32(Packet, 37);
UInt32 PrereqMinpoints = BitConverter.ToUInt32(Packet, 41);
UInt32 Type = BitConverter.ToUInt32(Packet, 45);
UInt32 SpellID = BitConverter.ToUInt32(Packet, 49);
UInt32 SpellType = BitConverter.ToUInt32(Packet, 53);
UInt32 SpellRefresh = BitConverter.ToUInt32(Packet, 57);
UInt16 Classes = BitConverter.ToUInt16(Packet, 61);
UInt16 Berserker = BitConverter.ToUInt16(Packet, 63);
UInt32 MaxLevel = BitConverter.ToUInt32(Packet, 65);
UInt32 LastID = BitConverter.ToUInt32(Packet, 69);
UInt32 NextID = BitConverter.ToUInt32(Packet, 73);
UInt32 Cost2 = BitConverter.ToUInt32(Packet, 77);
UInt32 AAExpansion = BitConverter.ToUInt32(Packet, 88);
UInt32 SpecialCategory = BitConverter.ToUInt32(Packet, 92);
UInt32 TotalAbilities = BitConverter.ToUInt32(Packet, 100);
OutputFile.WriteLine(String.Format("AAID: {0}", AAID));
OutputFile.WriteLine(" Unknown004:\t" + Unknown004);
OutputFile.WriteLine(" HotkeySID:\t" + HotKeySID);
OutputFile.WriteLine(" HotkeySID2:\t" + HotKeySID2);
OutputFile.WriteLine(" TitleSID:\t" + TitleSID);
OutputFile.WriteLine(" DescSID:\t" + DescSID);
OutputFile.WriteLine(" ClassType:\t" + ClassType);
OutputFile.WriteLine(" Cost:\t\t" + Cost);
OutputFile.WriteLine(" Seq:\t\t" + Seq);
OutputFile.WriteLine(" CurrentLevel:\t" + CurrentLevel);
OutputFile.WriteLine(" PrereqSkill:\t" + PrereqSkill);
OutputFile.WriteLine(" PrereqMinPt:\t" + PrereqMinpoints);
OutputFile.WriteLine(" Type:\t\t" + Type);
OutputFile.WriteLine(" SpellID:\t" + SpellID);
OutputFile.WriteLine(" SpellType:\t" + SpellType);
OutputFile.WriteLine(" SpellRefresh:\t" + SpellRefresh);
OutputFile.WriteLine(" Classes:\t" + Classes);
OutputFile.WriteLine(" Berserker:\t" + Berserker);
OutputFile.WriteLine(" MaxLevel:\t" + MaxLevel);
OutputFile.WriteLine(" LastID:\t" + LastID);
OutputFile.WriteLine(" NextID:\t" + NextID);
OutputFile.WriteLine(" Cost2:\t\t" + Cost2);
OutputFile.WriteLine(" AAExpansion:\t" + AAExpansion);
OutputFile.WriteLine(" SpecialCat:\t" + SpecialCategory);
OutputFile.WriteLine("");
OutputFile.WriteLine(" TotalAbilities:\t" + TotalAbilities);
OutputFile.WriteLine("");
for (int i = 0; i < TotalAbilities; ++i)
{
UInt32 Ability = BitConverter.ToUInt32(Packet, 104 + (i * 16));
Int32 Base1 = BitConverter.ToInt32(Packet, 108 + (i * 16));
Int32 Base2 = BitConverter.ToInt32(Packet, 112 + (i * 16));
UInt32 Slot = BitConverter.ToUInt32(Packet, 116 + (i * 16));
OutputFile.WriteLine(String.Format(" Ability:\t{0}\tBase1:\t{1}\tBase2:\t{2}\tSlot:\t{3}", Ability, Base1, Base2, Slot));
}
OutputFile.WriteLine("");
}
OutputFile.Close();
return true;
}
}
}
@@ -0,0 +1,341 @@
//
// Copyright (C) 2001-2010 EQEMu Development Team (http://eqemulator.net). Distributed under GPL version 2.
//
//
using System;
using System.IO;
using System.Collections.Generic;
using EQExtractor2.InternalTypes;
using EQExtractor2.OpCodes;
using EQPacket;
using MyUtils;
namespace EQExtractor2.Patches
{
class PatchTestSep012010Decoder : PatchJuly132010Decoder
{
public PatchTestSep012010Decoder()
{
Version = "EQ Client Build Date Test Server September 1 2010.";
PatchConfFileName = "patch_Sep01-2010.conf";
}
override public IdentificationStatus Identify(int OpCode, int Size, PacketDirection Direction)
{
if((OpCode == OpManager.OpCodeNameToNumber("OP_ZoneEntry")) && (Direction == PacketDirection.ClientToServer))
return IdentificationStatus.Yes;
return IdentificationStatus.No;
}
override public Item DecodeItemPacket(byte[] PacketBuffer)
{
ByteStream Buffer = new ByteStream(PacketBuffer);
Item NewItem = new Item();
NewItem.StackSize = Buffer.ReadUInt32(); // 00
Buffer.SkipBytes(4);
NewItem.Slot = Buffer.ReadUInt32(); // 08
Buffer.SkipBytes(1);
NewItem.MerchantSlot = Buffer.ReadByte(); // 13
NewItem.Price = Buffer.ReadUInt32(); // 14
Buffer.SkipBytes(5);
NewItem.Quantity = Buffer.ReadInt32(); // 23
Buffer.SetPosition(71);
NewItem.Name = Buffer.ReadString(true);
NewItem.Lore = Buffer.ReadString(true);
NewItem.IDFile = Buffer.ReadString(true);
NewItem.ID = Buffer.ReadUInt32();
return NewItem;
}
public override void RegisterExplorers()
{
base.RegisterExplorers();
//OpManager.RegisterExplorer("OP_CharInventory", ExploreCharInventoryPacket);
//OpManager.RegisterExplorer("OP_ItemPacket", ExploreItemPacket);
//OpManager.RegisterExplorer("OP_MercenaryPurchaseWindow", ExploreMercenaryPurchaseWindow);
}
public void ExploreCharInventoryPacket(StreamWriter OutputStream, ByteStream Buffer, PacketDirection Direction)
{
UInt32 ItemCount = Buffer.ReadUInt32();
OutputStream.WriteLine("There are {0} items in the inventory.\r\n", ItemCount );
for (int i = 0; i < ItemCount; ++i)
{
ExploreSubItem(OutputStream, ref Buffer);
}
OutputStream.WriteLine("");
}
public void ExploreItemPacket(StreamWriter OutputStream, ByteStream Buffer, PacketDirection Direction)
{
Buffer.SkipBytes(4); // Skip type field.
ExploreSubItem(OutputStream, ref Buffer);
OutputStream.WriteLine("");
}
void ExploreSubItem(StreamWriter OutputStream, ref ByteStream Buffer)
{
Buffer.SkipBytes(8);
byte Area = Buffer.ReadByte();
UInt16 MainSlot = Buffer.ReadUInt16();
Int16 SubSlot = Buffer.ReadInt16();
Buffer.SkipBytes(54);
string Name = Buffer.ReadString(true);
if (SubSlot >= 0)
OutputStream.Write(" ");
string AreaName = "Unknown";
switch (Area)
{
case 0:
AreaName = "Personal Inventory";
break;
case 1:
AreaName = "Bank";
break;
case 2:
AreaName = "Shared Bank";
break;
case 6:
AreaName = "Personal Tribute";
break;
case 7:
AreaName = "Guild Tribute";
break;
case 8:
AreaName = "Merchant";
break;
}
OutputStream.WriteLine("Area: {0} {1} Main Slot {2,2} Sub Slot {3,3} Name {4}", Area, AreaName.PadRight(20), MainSlot, SubSlot, Name);
Buffer.ReadString(true); // Lore
Buffer.ReadString(true); // IDFile
//Buffer.SkipBytes(236); // Item Body Struct
UInt32 ID = Buffer.ReadUInt32();
byte Weight = Buffer.ReadByte();
byte NoRent = Buffer.ReadByte();
byte NoDrop = Buffer.ReadByte();
byte Attune = Buffer.ReadByte();
byte Size = Buffer.ReadByte();
OutputStream.WriteLine(" ID: {0} Weight: {1} NoRent: {2} NoDrop: {3} Attune {4} Size {5}", ID, Weight, NoRent, NoDrop, Attune, Size);
UInt32 Slots = Buffer.ReadUInt32();
UInt32 Price = Buffer.ReadUInt32();
UInt32 Icon = Buffer.ReadUInt32();
Buffer.SkipBytes(2);
UInt32 BenefitFlags = Buffer.ReadUInt32();
byte Tradeskills = Buffer.ReadByte();
OutputStream.WriteLine(" Slots: {0} Price: {1} Icon: {2} BenefitFlags {3} Tradeskills: {4}", Slots, Price, Icon, BenefitFlags, Tradeskills);
byte CR = Buffer.ReadByte();
byte DR = Buffer.ReadByte();
byte PR = Buffer.ReadByte();
byte MR = Buffer.ReadByte();
byte FR = Buffer.ReadByte();
byte SVC = Buffer.ReadByte();
OutputStream.WriteLine(" CR: {0} DR: {1} PR: {2} MR: {3} FR: {4} SVC: {5}", CR, DR, PR, MR, FR, SVC);
byte AStr = Buffer.ReadByte();
byte ASta = Buffer.ReadByte();
byte AAgi = Buffer.ReadByte();
byte ADex = Buffer.ReadByte();
byte ACha = Buffer.ReadByte();
byte AInt = Buffer.ReadByte();
byte AWis = Buffer.ReadByte();
OutputStream.WriteLine(" AStr: {0} ASta: {1} AAgi: {2} ADex: {3} ACha: {4} AInt: {5} AWis: {6}", AStr, ASta, AAgi, ADex, ACha, AInt, AWis);
Int32 HP = Buffer.ReadInt32();
Int32 Mana = Buffer.ReadInt32();
UInt32 Endurance = Buffer.ReadUInt32();
Int32 AC = Buffer.ReadInt32();
Int32 Regen = Buffer.ReadInt32();
Int32 ManaRegen = Buffer.ReadInt32();
Int32 EndRegen = Buffer.ReadInt32();
UInt32 Classes = Buffer.ReadUInt32();
UInt32 Races = Buffer.ReadUInt32();
UInt32 Deity = Buffer.ReadUInt32();
Int32 SkillModValue = Buffer.ReadInt32();
Buffer.SkipBytes(4);
UInt32 SkillModType = Buffer.ReadUInt32();
UInt32 BaneDamageRace = Buffer.ReadUInt32();
UInt32 BaneDamageBody = Buffer.ReadUInt32();
UInt32 BaneDamageRaceAmount = Buffer.ReadUInt32();
Int32 BaneDamageAmount = Buffer.ReadInt32();
byte Magic = Buffer.ReadByte();
Int32 CastTime = Buffer.ReadInt32();
UInt32 ReqLevel = Buffer.ReadUInt32();
UInt32 RecLevel = Buffer.ReadUInt32();
UInt32 ReqSkill = Buffer.ReadUInt32();
UInt32 BardType = Buffer.ReadUInt32();
Int32 BardValue = Buffer.ReadInt32();
byte Light = Buffer.ReadByte();
byte Delay = Buffer.ReadByte();
byte ElemDamageAmount = Buffer.ReadByte();
byte ElemDamageType = Buffer.ReadByte();
byte Range = Buffer.ReadByte();
UInt32 Damage = Buffer.ReadUInt32();
UInt32 Color = Buffer.ReadUInt32();
byte ItemType = Buffer.ReadByte();
UInt32 Material = Buffer.ReadUInt32();
Buffer.SkipBytes(4);
UInt32 EliteMaterial = Buffer.ReadUInt32();
float SellRate = Buffer.ReadSingle();
Int32 CombatEffects = Buffer.ReadInt32();
Int32 Shielding = Buffer.ReadInt32();
Int32 StunResist = Buffer.ReadInt32();
Int32 StrikeThrough = Buffer.ReadInt32();
Int32 ExtraDamageSkill = Buffer.ReadInt32();
Int32 ExtraDamageAmount = Buffer.ReadInt32();
Int32 SpellShield = Buffer.ReadInt32();
Int32 Avoidance = Buffer.ReadInt32();
Int32 Accuracy = Buffer.ReadInt32();
UInt32 CharmFileID = Buffer.ReadUInt32();
UInt32 FactionMod1 = Buffer.ReadUInt32();
Int32 FactionAmount1 = Buffer.ReadInt32();
UInt32 FactionMod2 = Buffer.ReadUInt32();
Int32 FactionAmount2 = Buffer.ReadInt32();
UInt32 FactionMod3 = Buffer.ReadUInt32();
Int32 FactionAmount3 = Buffer.ReadInt32();
UInt32 FactionMod4 = Buffer.ReadUInt32();
Int32 FactionAmount4 = Buffer.ReadInt32();
Buffer.ReadString(true); // Charm File
Buffer.SkipBytes(64); // Item Secondary Body Struct
Buffer.ReadString(true); // Filename
Buffer.SkipBytes(76); // Item Tertiary Body Struct
Buffer.SkipBytes(30); // Click Effect Struct
Buffer.ReadString(true); // Clickname
Buffer.SkipBytes(4); // clickunk7
Buffer.SkipBytes(30); // Proc Effect Struct
Buffer.ReadString(true); // Proc Name
Buffer.SkipBytes(4); // unknown5
Buffer.SkipBytes(30); // Worn Effect Struct
Buffer.ReadString(true); // Worn Name
Buffer.SkipBytes(4); // unknown6
Buffer.SkipBytes(30); // Worn Effect Struct
Buffer.ReadString(true); // Worn Name
Buffer.SkipBytes(4); // unknown6
Buffer.SkipBytes(30); // Worn Effect Struct
Buffer.ReadString(true); // Worn Name
Buffer.SkipBytes(4); // unknown6
Buffer.SkipBytes(30); // Worn Effect Struct
Buffer.ReadString(true); // Worn Name
Buffer.SkipBytes(4); // unknown6
Buffer.SkipBytes(103); // Item Quaternary Body Struct - 4 (we want to read the SubLength field at the end)
UInt32 SubLengths = Buffer.ReadUInt32();
for (int i = 0; i < SubLengths; ++i)
{
Buffer.SkipBytes(4);
ExploreSubItem(OutputStream, ref Buffer);
}
}
public void ExploreMercenaryPurchaseWindow(StreamWriter OutputStream, ByteStream Buffer, PacketDirection Direction)
{
UInt32 TypeCount = Buffer.ReadUInt32();
//OutputStream.WriteLine("Type Count: {0}\r\n", TypeCount);
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Number of Types (Journeyman and Apprentice in this case\r\n", TypeCount);
for (int i = 0; i < TypeCount; ++i)
{
UInt32 TypeDBStringID = Buffer.ReadUInt32();
//OutputStream.WriteLine(" Type {0} DBStringID {1}", i, TypeDBStringID);
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // DBStringID for Type {1}", TypeDBStringID, i);
}
UInt32 Count2 = Buffer.ReadUInt32();
//OutputStream.WriteLine(" Count 2 is {0}", Count2);
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Count of Sub-types that follow", Count2);
for (int i = 0; i < Count2; ++i)
{
int Offset = Buffer.GetPosition();
UInt32 Unknown1 = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Unknown", Unknown1);
UInt32 DBStringID1 = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // DBStringID of Type", DBStringID1);
UInt32 DBStringID2 = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // DBStringID of Sub-Type", DBStringID2);
UInt32 PurchaseCost = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Purchase Cost", PurchaseCost);
UInt32 UpkeepCost = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Upkeep Cost", UpkeepCost);
UInt32 Unknown2 = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Unknown", Unknown2);
UInt32 Unknown3 = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Unknown", Unknown3);
UInt32 Unknown4 = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Unknown", Unknown4);
byte Unknown5 = Buffer.ReadByte();
//OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint8, Buffer, {0}); // Unknown", Unknown5);
UInt32 Unknown6 = Buffer.ReadUInt32();
//OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Unknown", Unknown6);
UInt32 Unknown7 = Buffer.ReadUInt32();
//OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Unknown", Unknown7);
UInt32 Unknown8 = Buffer.ReadUInt32();
//OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Unknown", Unknown8);
UInt32 StanceCount = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Number of Stances for this Merc", StanceCount);
UInt32 Unknown10 = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Unknown", Unknown10);
byte Unknown11 = Buffer.ReadByte();
//OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint8, Buffer, {0}); // Unknown", Unknown11);
//OutputStream.WriteLine(" Offset: {5} Unknown1: {0} DBStrings: {1} {2} Purchase: {3} Upkeep: {4}\r\n", Unknown1, DBStringID1, DBStringID2,
// PurchaseCost, UpkeepCost, Offset);
//OutputStream.WriteLine(" Unknowns: {0} {1} {2} {3} {4} {5} {6} {7} {8}\r\n",
// Unknown2, Unknown3, Unknown4, Unknown5, Unknown6, Unknown7, Unknown8, Unknown10, Unknown11);
//OutputStream.WriteLine(" Stance Count: {0}", StanceCount);
for (int j = 0; j < StanceCount; ++j)
{
UInt32 StanceNum = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Stance Number", StanceNum);
UInt32 StanceType = Buffer.ReadUInt32();
OutputStream.WriteLine("VARSTRUCT_ENCODE_TYPE(uint32, Buffer, {0}); // Stance DBStringID (1 = Passive, 2 = Balanced etc.", StanceType);
//OutputStream.WriteLine(" {0}: {1}", StanceNum, StanceType);
}
OutputStream.WriteLine("");
}
OutputStream.WriteLine("\r\nBuffer position at end is {0}", Buffer.GetPosition());
OutputStream.WriteLine("");
}
}
}
@@ -0,0 +1,349 @@
using System;
using System.IO;
using System.Collections.Generic;
using EQExtractor2.InternalTypes;
using EQExtractor2.OpCodes;
using EQPacket;
using MyUtils;
namespace EQExtractor2.Patches
{
class PatchTestSep222010Decoder : PatchTestSep012010Decoder
{
public PatchTestSep222010Decoder()
{
Version = "EQ Client Build Date Test Server September 22 2010.";
PatchConfFileName = "patch_Sep22-2010.conf";
ExpectedPPLength = 26728;
}
override public IdentificationStatus Identify(int OpCode, int Size, PacketDirection Direction)
{
if ((OpCode == OpManager.OpCodeNameToNumber("OP_ZoneEntry")) && (Direction == PacketDirection.ClientToServer))
return IdentificationStatus.Tentative;
if ((OpCode == OpManager.OpCodeNameToNumber("OP_PlayerProfile")) && (Direction == PacketDirection.ServerToClient) &&
(Size == ExpectedPPLength))
return IdentificationStatus.Yes;
return IdentificationStatus.No;
}
override public List<Door> GetDoors()
{
List<Door> DoorList = new List<Door>();
List<byte[]> SpawnDoorPacket = GetPacketsOfType("OP_SpawnDoor", PacketDirection.ServerToClient);
if ((SpawnDoorPacket.Count == 0) || (SpawnDoorPacket[0].Length == 0))
return DoorList;
int DoorCount = SpawnDoorPacket[0].Length / 96;
ByteStream Buffer = new ByteStream(SpawnDoorPacket[0]);
for (int d = 0; d < DoorCount; ++d)
{
string DoorName = Buffer.ReadFixedLengthString(32, false);
float YPos = Buffer.ReadSingle();
float XPos = Buffer.ReadSingle();
float ZPos = Buffer.ReadSingle();
float Heading = Buffer.ReadSingle();
UInt32 Incline = Buffer.ReadUInt32();
Int32 Size = Buffer.ReadInt32();
Buffer.SkipBytes(4); // Skip Unknown
Byte DoorID = Buffer.ReadByte();
Byte OpenType = Buffer.ReadByte();
Byte StateAtSpawn = Buffer.ReadByte();
Byte InvertState = Buffer.ReadByte();
Int32 DoorParam = Buffer.ReadInt32();
// Skip past the trailing unknowns in the door struct, moving to the next door in the packet.
Buffer.SkipBytes(28);
string DestZone = "NONE";
Door NewDoor = new Door(DoorName, YPos, XPos, ZPos, Heading, Incline, Size, DoorID, OpenType, StateAtSpawn, InvertState,
DoorParam, DestZone, 0, 0, 0, 0);
DoorList.Add(NewDoor);
}
return DoorList;
}
override public Item DecodeItemPacket(byte[] PacketBuffer)
{
ByteStream Buffer = new ByteStream(PacketBuffer);
Item NewItem = new Item();
//NewItem.StackSize = Buffer.ReadUInt32(); // 00
//Buffer.SkipBytes(4);
//NewItem.Slot = Buffer.ReadUInt32(); // 08
//Buffer.SkipBytes(1);
Buffer.SetPosition(30);
NewItem.MerchantSlot = Buffer.ReadByte(); // 13
NewItem.Price = Buffer.ReadUInt32(); // 14
Buffer.SkipBytes(5);
NewItem.Quantity = Buffer.ReadInt32(); // 23
Buffer.SetPosition(96);
NewItem.Name = Buffer.ReadString(true);
NewItem.Lore = Buffer.ReadString(true);
NewItem.IDFile = Buffer.ReadString(true);
NewItem.ID = Buffer.ReadUInt32();
return NewItem;
}
public override void RegisterExplorers()
{
base.RegisterExplorers();
//OpManager.RegisterExplorer("OP_CharInventory", ExploreCharInventoryPacket);
//OpManager.RegisterExplorer("OP_ItemPacket", ExploreItemPacket);
}
public void ExploreCharInventoryPacket(StreamWriter OutputStream, ByteStream Buffer, PacketDirection Direction)
{
UInt32 ItemCount = Buffer.ReadUInt32();
OutputStream.WriteLine("There are {0} items in the inventory.\r\n", ItemCount);
for (int i = 0; i < ItemCount; ++i)
{
ExploreSubItem(OutputStream, ref Buffer);
}
OutputStream.WriteLine("");
}
public void ExploreItemPacket(StreamWriter OutputStream, ByteStream Buffer, PacketDirection Direction)
{
Buffer.SkipBytes(4); // Skip type field.
ExploreSubItem(OutputStream, ref Buffer);
OutputStream.WriteLine("");
}
void ExploreSubItem(StreamWriter OutputStream, ref ByteStream Buffer)
{
Buffer.SkipBytes(17);
Buffer.SkipBytes(8);
byte Area = Buffer.ReadByte();
UInt16 MainSlot = Buffer.ReadUInt16();
Int16 SubSlot = Buffer.ReadInt16();
Buffer.SkipBytes(62);
string Name = Buffer.ReadString(true);
if (SubSlot >= 0)
OutputStream.Write(" ");
string AreaName = "Unknown";
switch (Area)
{
case 0:
AreaName = "Personal Inventory";
break;
case 1:
AreaName = "Bank";
break;
case 2:
AreaName = "Shared Bank";
break;
case 6:
AreaName = "Personal Tribute";
break;
case 7:
AreaName = "Guild Tribute";
break;
case 8:
AreaName = "Merchant";
break;
}
OutputStream.WriteLine("Area: {0} {1} Main Slot {2,2} Sub Slot {3,3} Name {4}", Area, AreaName.PadRight(20), MainSlot, SubSlot, Name);
Buffer.ReadString(true); // Lore
Buffer.ReadString(true); // IDFile
//Buffer.SkipBytes(236); // Item Body Struct
UInt32 ID = Buffer.ReadUInt32();
byte Weight = Buffer.ReadByte();
Buffer.SkipBytes(3);
byte NoRent = Buffer.ReadByte();
byte NoDrop = Buffer.ReadByte();
byte Attune = Buffer.ReadByte();
byte Size = Buffer.ReadByte();
OutputStream.WriteLine(" ID: {0} Weight: {1} NoRent: {2} NoDrop: {3} Attune {4} Size {5}", ID, Weight, NoRent, NoDrop, Attune, Size);
UInt32 Slots = Buffer.ReadUInt32();
UInt32 Price = Buffer.ReadUInt32();
UInt32 Icon = Buffer.ReadUInt32();
Buffer.SkipBytes(2);
UInt32 BenefitFlags = Buffer.ReadUInt32();
byte Tradeskills = Buffer.ReadByte();
OutputStream.WriteLine(" Slots: {0} Price: {1} Icon: {2} BenefitFlags {3} Tradeskills: {4}", Slots, Price, Icon, BenefitFlags, Tradeskills);
byte CR = Buffer.ReadByte();
byte DR = Buffer.ReadByte();
byte PR = Buffer.ReadByte();
byte MR = Buffer.ReadByte();
byte FR = Buffer.ReadByte();
byte SVC = Buffer.ReadByte();
OutputStream.WriteLine(" CR: {0} DR: {1} PR: {2} MR: {3} FR: {4} SVC: {5}", CR, DR, PR, MR, FR, SVC);
byte AStr = Buffer.ReadByte();
byte ASta = Buffer.ReadByte();
byte AAgi = Buffer.ReadByte();
byte ADex = Buffer.ReadByte();
byte ACha = Buffer.ReadByte();
byte AInt = Buffer.ReadByte();
byte AWis = Buffer.ReadByte();
OutputStream.WriteLine(" AStr: {0} ASta: {1} AAgi: {2} ADex: {3} ACha: {4} AInt: {5} AWis: {6}", AStr, ASta, AAgi, ADex, ACha, AInt, AWis);
Int32 HP = Buffer.ReadInt32();
Int32 Mana = Buffer.ReadInt32();
UInt32 Endurance = Buffer.ReadUInt32();
Int32 AC = Buffer.ReadInt32();
Int32 Regen = Buffer.ReadInt32();
Int32 ManaRegen = Buffer.ReadInt32();
Int32 EndRegen = Buffer.ReadInt32();
UInt32 Classes = Buffer.ReadUInt32();
UInt32 Races = Buffer.ReadUInt32();
UInt32 Deity = Buffer.ReadUInt32();
Int32 SkillModValue = Buffer.ReadInt32();
Buffer.SkipBytes(4);
UInt32 SkillModType = Buffer.ReadUInt32();
UInt32 BaneDamageRace = Buffer.ReadUInt32();
UInt32 BaneDamageBody = Buffer.ReadUInt32();
UInt32 BaneDamageRaceAmount = Buffer.ReadUInt32();
Int32 BaneDamageAmount = Buffer.ReadInt32();
byte Magic = Buffer.ReadByte();
Int32 CastTime = Buffer.ReadInt32();
UInt32 ReqLevel = Buffer.ReadUInt32();
UInt32 RecLevel = Buffer.ReadUInt32();
UInt32 ReqSkill = Buffer.ReadUInt32();
UInt32 BardType = Buffer.ReadUInt32();
Int32 BardValue = Buffer.ReadInt32();
byte Light = Buffer.ReadByte();
byte Delay = Buffer.ReadByte();
byte ElemDamageAmount = Buffer.ReadByte();
byte ElemDamageType = Buffer.ReadByte();
byte Range = Buffer.ReadByte();
UInt32 Damage = Buffer.ReadUInt32();
UInt32 Color = Buffer.ReadUInt32();
byte ItemType = Buffer.ReadByte();
UInt32 Material = Buffer.ReadUInt32();
Buffer.SkipBytes(4);
UInt32 EliteMaterial = Buffer.ReadUInt32();
float SellRate = Buffer.ReadSingle();
Int32 CombatEffects = Buffer.ReadInt32();
Int32 Shielding = Buffer.ReadInt32();
Int32 StunResist = Buffer.ReadInt32();
Int32 StrikeThrough = Buffer.ReadInt32();
Int32 ExtraDamageSkill = Buffer.ReadInt32();
Int32 ExtraDamageAmount = Buffer.ReadInt32();
Int32 SpellShield = Buffer.ReadInt32();
Int32 Avoidance = Buffer.ReadInt32();
Int32 Accuracy = Buffer.ReadInt32();
UInt32 CharmFileID = Buffer.ReadUInt32();
UInt32 FactionMod1 = Buffer.ReadUInt32();
Int32 FactionAmount1 = Buffer.ReadInt32();
UInt32 FactionMod2 = Buffer.ReadUInt32();
Int32 FactionAmount2 = Buffer.ReadInt32();
UInt32 FactionMod3 = Buffer.ReadUInt32();
Int32 FactionAmount3 = Buffer.ReadInt32();
UInt32 FactionMod4 = Buffer.ReadUInt32();
Int32 FactionAmount4 = Buffer.ReadInt32();
Buffer.ReadString(true); // Charm File
//Buffer.SkipBytes(64); // Item Secondary Body Struct
UInt32 AugType = Buffer.ReadUInt32();
UInt32 AugRestrict = Buffer.ReadUInt32();
Buffer.SkipBytes(30); // Augslot stuff
UInt32 LDONPointType = Buffer.ReadUInt32();
UInt32 LDONTheme = Buffer.ReadUInt32();
UInt32 LDONPrice = Buffer.ReadUInt32();
UInt32 LDONSellBackRate = Buffer.ReadUInt32();
UInt32 LDONSold = Buffer.ReadUInt32();
byte BagType = Buffer.ReadByte();
byte BagSlots = Buffer.ReadByte();
byte BagSize = Buffer.ReadByte();
byte BagWeightReduction = Buffer.ReadByte();
byte Book = Buffer.ReadByte();
byte BookType = Buffer.ReadByte();
OutputStream.WriteLine("\r\n BagType: {0} BagSlots: {1} BagSize: {2} BagWR: {3}", BagType, BagSlots, BagSize, BagWeightReduction);
Buffer.ReadString(true); // Filename
Buffer.SkipBytes(76); // Item Tertiary Body Struct
Buffer.SkipBytes(30); // Click Effect Struct
Buffer.ReadString(true); // Clickname
Buffer.SkipBytes(4); // clickunk7
Buffer.SkipBytes(30); // Proc Effect Struct
Buffer.ReadString(true); // Proc Name
Buffer.SkipBytes(4); // unknown5
Buffer.SkipBytes(30); // Worn Effect Struct
Buffer.ReadString(true); // Worn Name
Buffer.SkipBytes(4); // unknown6
Buffer.SkipBytes(30); // Worn Effect Struct
Buffer.ReadString(true); // Worn Name
Buffer.SkipBytes(4); // unknown6
Buffer.SkipBytes(30); // Worn Effect Struct
Buffer.ReadString(true); // Worn Name
Buffer.SkipBytes(4); // unknown6
Buffer.SkipBytes(30); // Worn Effect Struct
Buffer.ReadString(true); // Worn Name
Buffer.SkipBytes(4); // unknown6
Buffer.SkipBytes(103); // Item Quaternary Body Struct - 4 (we want to read the SubLength field at the end)
Buffer.SkipBytes(57); // HoT
OutputStream.WriteLine(" Reading sublengths from offset {0}", Buffer.GetPosition());
UInt32 SubLengths = Buffer.ReadUInt32();
for (int i = 0; i < SubLengths; ++i)
{
Buffer.SkipBytes(4);
ExploreSubItem(OutputStream, ref Buffer);
}
OutputStream.WriteLine("");
}
}
}
@@ -0,0 +1,23 @@
using System;
using System.IO;
using System.Diagnostics;
using System.Collections.Generic;
using EQExtractor2.InternalTypes;
using EQExtractor2.OpCodes;
using EQPacket;
using MyUtils;
namespace EQExtractor2.Patches
{
class PatchTestServerFebruary52013Decoder : PatchJanuary162013Decoder
{
public PatchTestServerFebruary52013Decoder()
{
Version = "EQ Client Build Date Test Server February 5 2013.";
PatchConfFileName = "patch_TestServer-Feb5-2013.conf";
SupportsSQLGeneration = false;
}
}
}
@@ -0,0 +1,23 @@
using System;
using System.IO;
using System.Diagnostics;
using System.Collections.Generic;
using EQExtractor2.InternalTypes;
using EQExtractor2.OpCodes;
using EQPacket;
using MyUtils;
namespace EQExtractor2.Patches
{
class PatchTestServerJanuary162013Decoder : PatchJanuary162013Decoder
{
public PatchTestServerJanuary162013Decoder()
{
Version = "EQ Client Build Date Test Server January 16 2013.";
PatchConfFileName = "patch_TestServer-Jan16-2013.conf";
SupportsSQLGeneration = false;
}
}
}
@@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace EQExtractor2
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new EQExtractor2Form1());
}
}
}
@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("EQExtractor2")]
[assembly: AssemblyDescription("EQExtractor2")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("EQEmu Team")]
[assembly: AssemblyProduct("EQExtractor2")]
[assembly: AssemblyCopyright("Copyright © EQEmu Team 2010")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("31d666b6-5caf-47af-b8a7-b74ce016c77d")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("2.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
@@ -0,0 +1,63 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.1
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace EQExtractor2.Properties {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("EQExtractor2.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
}
}
@@ -0,0 +1,117 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>
@@ -0,0 +1,62 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.1
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace EQExtractor2.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("notepad.exe")]
public string TextFileViewer {
get {
return ((string)(this["TextFileViewer"]));
}
set {
this["TextFileViewer"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool ShowDebugWindowOnStartup {
get {
return ((bool)(this["ShowDebugWindowOnStartup"]));
}
set {
this["ShowDebugWindowOnStartup"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool DumpTimeStamps {
get {
return ((bool)(this["DumpTimeStamps"]));
}
set {
this["DumpTimeStamps"] = value;
}
}
}
}
@@ -0,0 +1,15 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="EQExtractor2.Properties" GeneratedClassName="Settings">
<Profiles />
<Settings>
<Setting Name="TextFileViewer" Type="System.String" Scope="User">
<Value Profile="(Default)">notepad.exe</Value>
</Setting>
<Setting Name="ShowDebugWindowOnStartup" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="DumpTimeStamps" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
</Settings>
</SettingsFile>
File diff suppressed because it is too large Load Diff
+153
View File
@@ -0,0 +1,153 @@
namespace EQExtractor2
{
partial class UserOptions
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.label1 = new System.Windows.Forms.Label();
this.PacketDumpViewerProgram = new System.Windows.Forms.TextBox();
this.ShowDebugWindowOnStartup = new System.Windows.Forms.CheckBox();
this.ShowTimeStamps = new System.Windows.Forms.CheckBox();
this.OptionsOKButton = new System.Windows.Forms.Button();
this.OptionsCancelButton = new System.Windows.Forms.Button();
this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
this.EQPacketDebugFilename = new System.Windows.Forms.TextBox();
this.label2 = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(12, 9);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(107, 13);
this.label1.TabIndex = 0;
this.label1.Text = "Packet Dump Viewer";
//
// PacketDumpViewerProgram
//
this.PacketDumpViewerProgram.Location = new System.Drawing.Point(125, 6);
this.PacketDumpViewerProgram.Name = "PacketDumpViewerProgram";
this.PacketDumpViewerProgram.Size = new System.Drawing.Size(390, 20);
this.PacketDumpViewerProgram.TabIndex = 1;
this.toolTip1.SetToolTip(this.PacketDumpViewerProgram, "If not using notepad/wordpad include the full path, e.g. C:\\Program Files (x86)\\N" +
"otepad++\\notepad++.exe");
//
// ShowDebugWindowOnStartup
//
this.ShowDebugWindowOnStartup.AutoSize = true;
this.ShowDebugWindowOnStartup.Location = new System.Drawing.Point(15, 61);
this.ShowDebugWindowOnStartup.Name = "ShowDebugWindowOnStartup";
this.ShowDebugWindowOnStartup.Size = new System.Drawing.Size(184, 17);
this.ShowDebugWindowOnStartup.TabIndex = 2;
this.ShowDebugWindowOnStartup.Text = "Show Debug Window On Startup";
this.ShowDebugWindowOnStartup.UseVisualStyleBackColor = true;
//
// ShowTimeStamps
//
this.ShowTimeStamps.AutoSize = true;
this.ShowTimeStamps.Location = new System.Drawing.Point(15, 84);
this.ShowTimeStamps.Name = "ShowTimeStamps";
this.ShowTimeStamps.Size = new System.Drawing.Size(205, 17);
this.ShowTimeStamps.TabIndex = 3;
this.ShowTimeStamps.Text = "Include Time Stamps In Packet Dump";
this.ShowTimeStamps.UseVisualStyleBackColor = true;
//
// OptionsOKButton
//
this.OptionsOKButton.Location = new System.Drawing.Point(125, 122);
this.OptionsOKButton.Name = "OptionsOKButton";
this.OptionsOKButton.Size = new System.Drawing.Size(75, 23);
this.OptionsOKButton.TabIndex = 4;
this.OptionsOKButton.Text = "OK";
this.OptionsOKButton.UseVisualStyleBackColor = true;
this.OptionsOKButton.Click += new System.EventHandler(this.OptionsOKButton_Click);
//
// OptionsCancelButton
//
this.OptionsCancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.OptionsCancelButton.Location = new System.Drawing.Point(332, 122);
this.OptionsCancelButton.Name = "OptionsCancelButton";
this.OptionsCancelButton.Size = new System.Drawing.Size(75, 23);
this.OptionsCancelButton.TabIndex = 5;
this.OptionsCancelButton.Text = "Cancel";
this.OptionsCancelButton.UseVisualStyleBackColor = true;
this.OptionsCancelButton.Click += new System.EventHandler(this.OptionsCancelButton_Click);
//
// EQPacketDebugFilename
//
this.EQPacketDebugFilename.Location = new System.Drawing.Point(125, 32);
this.EQPacketDebugFilename.Name = "EQPacketDebugFilename";
this.EQPacketDebugFilename.Size = new System.Drawing.Size(390, 20);
this.EQPacketDebugFilename.TabIndex = 7;
this.toolTip1.SetToolTip(this.EQPacketDebugFilename, "Output file for low level netcode debugging");
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(12, 35);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(83, 13);
this.label2.TabIndex = 6;
this.label2.Text = "Netcode Debug";
this.toolTip1.SetToolTip(this.label2, "Output file for low level netcode debugging");
//
// UserOptions
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.OptionsCancelButton;
this.ClientSize = new System.Drawing.Size(527, 166);
this.Controls.Add(this.EQPacketDebugFilename);
this.Controls.Add(this.label2);
this.Controls.Add(this.OptionsCancelButton);
this.Controls.Add(this.OptionsOKButton);
this.Controls.Add(this.ShowTimeStamps);
this.Controls.Add(this.ShowDebugWindowOnStartup);
this.Controls.Add(this.PacketDumpViewerProgram);
this.Controls.Add(this.label1);
this.Name = "UserOptions";
this.Text = "Options";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Button OptionsOKButton;
private System.Windows.Forms.Button OptionsCancelButton;
public System.Windows.Forms.TextBox PacketDumpViewerProgram;
public System.Windows.Forms.CheckBox ShowDebugWindowOnStartup;
public System.Windows.Forms.CheckBox ShowTimeStamps;
private System.Windows.Forms.ToolTip toolTip1;
public System.Windows.Forms.TextBox EQPacketDebugFilename;
private System.Windows.Forms.Label label2;
}
}
@@ -0,0 +1,29 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace EQExtractor2
{
public partial class UserOptions : Form
{
public UserOptions()
{
InitializeComponent();
}
private void OptionsOKButton_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.OK;
}
private void OptionsCancelButton_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.Cancel;
}
}
}
@@ -0,0 +1,123 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="toolTip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
</root>
+314
View File
@@ -0,0 +1,314 @@
//
// The BitStream class is a direct C# translation of the class of the same name in the ShowEQ source, so the following
// Copyright notice applies to that:
//
// ShowEQ Distributed under GPL
// http://www.sourceforge.net/projects/seq
//
// Copyright 2004 Zaphod (dohpaz@users.sourceforge.net).
//
// -----------------------------------------------------------
//
// All other code:
//
// Copyright (C) 2001-2010 EQEMu Development Team (http://eqemulator.net). Distributed under GPL version 2.
//
//
using System;
using System.Text;
namespace MyUtils
{
public class ByteStream
{
public ByteStream(byte[] NewBuffer)
{
Buffer = NewBuffer;
BufferPointer = 0;
}
public uint Length()
{
return (uint)Buffer.Length;
}
public UInt32 ReadUInt32()
{
UInt32 Value = BitConverter.ToUInt32(Buffer, BufferPointer);
BufferPointer += 4;
return Value;
}
public Int32 ReadInt32()
{
Int32 Value = BitConverter.ToInt32(Buffer, BufferPointer);
BufferPointer += 4;
return Value;
}
public float ReadSingle()
{
float Value = BitConverter.ToSingle(Buffer, BufferPointer);
BufferPointer += 4;
return Value;
}
public UInt16 ReadUInt16()
{
UInt16 Value = BitConverter.ToUInt16(Buffer, BufferPointer);
BufferPointer += 2;
return Value;
}
public Int16 ReadInt16()
{
Int16 Value = BitConverter.ToInt16(Buffer, BufferPointer);
BufferPointer += 2;
return Value;
}
public byte ReadByte()
{
return Buffer[BufferPointer++];
}
public byte[] ReadBytes(int Count)
{
byte[] Slice = new byte[Count];
Array.Copy(Buffer, BufferPointer, Slice, 0, Count);
BufferPointer += Count;
return Slice;
}
public void SkipBytes(int Count)
{
BufferPointer += Count;
}
public string ReadString(bool Escape)
{
string Result = "";
while(Buffer[BufferPointer] != 0)
{
if (Escape && ((char)Buffer[BufferPointer] == '\''))
Result += '\\';
Result += (char)Buffer[BufferPointer++];
}
++BufferPointer;
return Result;
}
public string ReadFixedLengthString(int Length, bool Escape)
{
int StartingPosition = BufferPointer;
string Result = "";
while (Buffer[BufferPointer] != 0)
{
if (Escape && ((char)Buffer[BufferPointer] == '\''))
Result += '\\';
Result += (char)Buffer[BufferPointer++];
}
BufferPointer = StartingPosition + Length;
return Result;
}
public void SetPosition(int NewPosition)
{
BufferPointer = NewPosition;
}
public int GetPosition()
{
return BufferPointer;
}
public byte[] Buffer;
int BufferPointer;
}
class BitStream
{
public BitStream(byte[] Data, UInt32 Length)
{
m_data = Data;
TotalBits = Length * 8;
Reset();
}
public void Reset()
{
CurrentBit = 0;
}
public UInt32 readUInt(int bitCount)
{
// Make sure we have the bits first.
if (CurrentBit + bitCount > TotalBits)
{
return 0;
}
UInt32 currentByte = (CurrentBit >> 3);
UInt32 Out = 0;
// Partial bytes in the lead and end. Full bytes in the middle.
Int32 leadPartialBitCount = 8 - ((Int32)CurrentBit % 8);
UInt32 middleByteCount;
Int32 tailPartialBitCount;
if (leadPartialBitCount == 8)
{
// Lead partial is a byte. So just put it in the middle.
leadPartialBitCount = 0;
}
if (leadPartialBitCount > bitCount)
{
// All the bits we need are in the lead partial. Note that when
// the lead partial is byte aligned, this won't process it. Instead
// it will be handled by the tailPartialBitCount.
Out = m_data[currentByte] & (((UInt32)1 << leadPartialBitCount) - 1);
CurrentBit += (UInt32)bitCount;
return Out >> (leadPartialBitCount - bitCount);
}
else
{
// Spanning multiple bytes. leadPartialBitCount is correct.
// Calculate middle and tail.
middleByteCount = ((UInt32)bitCount - (UInt32)leadPartialBitCount) / 8;
tailPartialBitCount =
bitCount - ((Int32)leadPartialBitCount + (Int32)middleByteCount*8);
}
if (leadPartialBitCount > 0)
{
// Pull in partial from the lead byte
Out |= m_data[currentByte] & (UInt32)((1 << leadPartialBitCount) - 1);
currentByte++;
}
// Middle
for (int i=0; i<middleByteCount; i++)
{
Out = (Out << 8) | m_data[currentByte];
currentByte++;
}
// And the end.
if (tailPartialBitCount > 0)
{
Out = (UInt32)((Out << tailPartialBitCount) |
(m_data[currentByte] >> (8 - tailPartialBitCount)));
}
// Update the current bit
CurrentBit += (UInt32)bitCount;
return Out;
}
public Int32 readInt(Int32 bitCount)
{
// Sign
UInt32 sign = readUInt(1);
Int32 retval = (Int32)readUInt(bitCount - 1);
return retval * ((sign == 1) ? -1 : 1);
}
private byte[] m_data;
private UInt32 TotalBits;
private UInt32 CurrentBit;
}
class Utils
{
public static string HexDump(byte[] bytes)
{
StringBuilder Dump = new StringBuilder();
string Hex = "", Ascii = "";
int Offset = 0, i = 0, Length = bytes.Length;
while (i < Length)
{
Hex += bytes[i].ToString("x2") + " ";
Ascii += (((bytes[i] >= 32) && (bytes[i] <= 126)) ? ((char)bytes[i]).ToString() : ".");
if (((++i % 16) == 0) || (i == Length))
{
Dump.AppendFormat("{0:000} | {1} | {2}\r\n", Offset, Hex.PadRight(48), Ascii);
Hex = Ascii = "";
Offset = i;
}
}
return Dump.ToString();
}
public static string ReadNullTerminatedString(byte[] Buffer, int Offset, int MaxSize, bool Escape)
{
string Result = "";
for (int i = 0; i < MaxSize && Buffer[Offset + i] != 0; ++i)
{
if(Escape && ((char)Buffer[Offset + i] == '\''))
Result += '\\';
Result += (char)Buffer[Offset + i];
}
return Result;
}
public static string MakeCleanName(string Name)
{
StringBuilder CleanName = new StringBuilder();
foreach(char c in Name)
if(!Char.IsDigit(c))
CleanName.Append(c);
return CleanName.ToString();
}
public static float EQ19ToFloat(Int32 EQ19Value)
{
if ((EQ19Value & 0x40000) > 0)
EQ19Value = -(0x7FFFF - EQ19Value + 1);
return (float)EQ19Value / (float)(1 << 3);
}
}
}
@@ -0,0 +1,21 @@
<?xml version="1.0"?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="EQExtractor2.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup><userSettings>
<EQExtractor2.Properties.Settings>
<setting name="TextFileViewer" serializeAs="String">
<value>notepad.exe</value>
</setting>
<setting name="ShowDebugWindowOnStartup" serializeAs="String">
<value>False</value>
</setting>
<setting name="DumpTimeStamps" serializeAs="String">
<value>False</value>
</setting>
</EQExtractor2.Properties.Settings>
</userSettings>
</configuration>
@@ -0,0 +1,616 @@
# ShowEQ Import Notes:
# ZERO THE FILE first
# perl -pi -e 's/0x0000a-fA-F]{4}/0x0000/g' opcodes.conf
# Unknown Mapping:
# OP_Action2 -> OP_Damage
# OP_EnvDamage -> OP_Damage ---> might have been a one time mistake
# Name Differences:
# OP_CancelInvite -> OP_GroupCancelInvite
# OP_GMFind -> OP_FindPersonRequest
# OP_CommonMessage -> OP_ChannelMessage
OP_Unknown=0x0000
OP_ExploreUnknown=0x0000 # used for unknown explorer
# V = Verified correct
# C = Most likely correct
# U = Unsure, but should be correct or close
# world packets
# Required to reach Char Select:
OP_SendLoginInfo=0x5d32 #
OP_ApproveWorld=0x1f87 #
OP_LogServer=0x44ae #
OP_SendCharInfo=0x1513 #
OP_ExpansionInfo=0x1771 #
OP_GuildsList=0x5b0b #
OP_EnterWorld=0x1190 #
OP_PostEnterWorld=0x4d5c #
OP_World_Client_CRC1=0x4552 #
OP_World_Client_CRC2=0x3e50 #
OP_SendSpellChecksum=0x0000 #
OP_SendSkillCapsChecksum=0x0000 #
# Character Select Related:
OP_DeleteCharacter=0x0000 #
OP_CharacterCreateRequest=0x0000 #
OP_CharacterCreate=0x0000 #
OP_RandomNameGenerator=0x0000 #
OP_ApproveName=0x0000 #
OP_MOTD=0x097f #
OP_SetChatServer=0x0360 #
OP_SetChatServer2=0x4399 #
OP_ZoneServerInfo=0x710e #
OP_WorldComplete=0x3aef #
OP_WorldUnknown001=0x0000 #
OP_FloatListThing=0x33f2 #
# Reasons for Disconnect:
OP_ZoneUnavail=0x66e4 # This is not the right opcode. Produces a 'Your character is inaccessible' message.
OP_WorldClientReady=0x3f24 #
OP_CharacterStillInZone=0x0000 #
OP_WorldChecksumFailure=0x0000 #
OP_WorldLoginFailed=0x0000 #
OP_WorldLogout=0x0000 #
OP_WorldLevelTooHigh=0x0000 #
OP_CharInacessable=0x0000 #
OP_UserCompInfo=0x0000 #
# OP_SendExeChecksum=0x0000 #
# OP_SendBaseDataChecksum=0x0000 #
# Zone in opcodes
OP_AckPacket=0x3594 #
OP_ZoneEntry=0x02d6 #
OP_ReqNewZone=0x1c36 #
OP_NewZone=0x0254 #
OP_ZoneSpawns=0x0000 #
OP_PlayerProfile=0x6022 #
OP_TimeOfDay=0x6015 #
OP_LevelUpdate=0x0000 #
OP_Stamina=0x0000 #
OP_RequestClientZoneChange=0x18ea #
OP_ZoneChange=0x5bd9 #
OP_LockoutTimerInfo=0x0000 #
OP_ZoneServerReady=0x0000 #
OP_ZoneInUnknown=0x0000 #
OP_LogoutReply=0x0000 #
OP_PreLogoutReply=0x0000 #
# Required to fully log in
OP_SpawnAppearance=0x1a58 #
OP_TributeUpdate=0x4895 #
OP_TributeTimer=0x0000 #
OP_TaskDescription=0x0000 #
OP_TaskActivity=0x0000 #
OP_CompletedTasks=0x0000 #
OP_Weather=0x4658 #
OP_SendAATable=0x1d99 #
OP_UpdateAA=0x0000 #
OP_RespondAA=0x0000 #
OP_ReqClientSpawn=0x47e7 #
OP_SpawnDoor=0x6cfe #
OP_GroundSpawn=0x442a #
OP_SendZonepoints=0x5851 #
OP_SendAAStats=0x0000 #
OP_WorldObjectsSent=0x7b73 #
OP_BlockedBuffs=0x664a #
OP_SendExpZonein=0x54e8 #
OP_SendTributes=0x0000 #
OP_TributeInfo=0x0000 #
OP_SendGuildTributes=0x0000 #
OP_AAExpUpdate=0x0000 #
OP_ExpUpdate=0x0000 #
OP_HPUpdate=0x6967 # Was 0x6967 - Causing crash ?
OP_ManaChange=0x0000 #
OP_TGB=0x0000 #
OP_SpecialMesg=0x156c #
OP_GuildMemberList=0x51bc #
OP_GuildMOTD=0x0000 #
OP_CharInventory=0x307d #
OP_WearChange=0x0000 #
OP_ClientUpdate=0x7062 #
OP_ClientReady=0x6cdc #
OP_SetServerFilter=0x0000 #
# Guild Opcodes
OP_GetGuildMOTD=0x0000 #
OP_GetGuildMOTDReply=0x0000 #
OP_GuildMemberUpdate=0x0000 #
OP_GuildInvite=0x0000 #
OP_GuildRemove=0x0000 #
OP_GuildPeace=0x0000 #
OP_SetGuildMOTD=0x0000 #
OP_GuildList=0x5b0b #
OP_GuildWar=0x0000 #
OP_GuildLeader=0x0000 #
OP_GuildDelete=0x0000 #
OP_GuildInviteAccept=0x0000 #
OP_GuildDemote=0x0000 #
OP_GuildPublicNote=0x0000 #
OP_GuildManageBanker=0x0000 #
OP_GuildBank=0x0000 #
OP_SetGuildRank=0x0000 #
OP_GuildUpdateURLAndChannel=0x0000 #
OP_GuildMemberLevelUpdate=0x0000 #
OP_ZoneGuildList=0x0000 #
OP_GetGuildsList=0x0000 #
# OP_GuildManageRemove=0x0000 #
# OP_GuildManageAdd=0x0000 #
# OP_GuildManageStatus=0x0000 #
# GM/guide opcodes
OP_GMServers=0x0000 #
OP_GMBecomeNPC=0x0000 #
OP_GMZoneRequest=0x6f79 #
OP_GMZoneRequest2=0x02d6 #
OP_GMGoto=0x0000 #
OP_GMSearchCorpse=0x0000 #
OP_GMHideMe=0x0000 #
OP_GMDelCorpse=0x0000 #
OP_GMApproval=0x0000 #
OP_GMToggle=0x0000 #
OP_GMSummon=0x0000 #
OP_GMEmoteZone=0x0000 #
OP_GMEmoteWorld=0x0000 #
OP_GMFind=0x0000 #
OP_GMKick=0x0000 #
OP_GMKill=0x0000 #
OP_GMNameChange=0x0000 #
OP_GMLastName=0x0000 #
OP_InspectAnswer=0x0000 #
OP_BeginCast=0x0d5a #
OP_BuffFadeMsg=0x50c2 #
OP_ConsentResponse=0x0000 #
OP_MemorizeSpell=0x0000 #
OP_SwapSpell=0x0000 #
OP_CastSpell=0x7286 #
OP_Consider=0x0000 #
OP_FormattedMessage=0x32c6 #
OP_SimpleMessage=0x0000 # C 0x0000
OP_Buff=0x0000 #
OP_Illusion=0x0000 #
OP_MoneyOnCorpse=0x0000 #
OP_RandomReply=0x0000 #
OP_DenyResponse=0x0000 #
OP_SkillUpdate=0x0000 #
OP_GMTrainSkillConfirm=0x0000 #
OP_RandomReq=0x0000 #
OP_Death=0x49b6 #
OP_Bind_Wound=0x0000 #
OP_GMTraining=0x0000 #
OP_GMEndTraining=0x0000 #
OP_GMTrainSkill=0x0000 #
OP_Animation=0x3ea4 # Was 0x0000
OP_Begging=0x0000 #
OP_Consent=0x0000 #
OP_ConsentDeny=0x0000 #
OP_AutoFire=0x0000 #
OP_PetCommands=0x0000 #
OP_DeleteSpell=0x0000 #
OP_Surname=0x0000 #
OP_ClearSurname=0x0000 #
OP_FaceChange=0x0000 #
OP_SenseHeading=0x0000 #
OP_Action=0x4200 # 0x4200
OP_ConsiderCorpse=0x0000 #
OP_HideCorpse=0x0000 #
OP_Bug=0x0000 #
OP_Feedback=0x0000 #
OP_Report=0x0000 #
OP_Damage=0x7519 #
OP_ChannelMessage=0x2e79 #
OP_Assist=0x0000 #
OP_AssistGroup=0x0000 #
OP_MoveCoin=0x0000 #
OP_ZonePlayerToBind=0x0000 #
OP_KeyRing=0x0000 #
OP_WhoAllRequest=0x0000 #
OP_WhoAllResponse=0x0000 #
OP_FriendsWho=0x0000 #
OP_ConfirmDelete=0x0000 #
OP_Logout=0x517b #
OP_Rewind=0x0000 #
OP_TargetCommand=0x0000 #
OP_InspectRequest=0x0000 #
OP_Hide=0x0000 #
OP_Jump=0x0000 #
OP_Camp=0x0a1d # Was 0x1436
OP_Emote=0x0000 #
OP_SetRunMode=0x0000 #
OP_BankerChange=0x0000 #
OP_TargetMouse=0x5f5e #
OP_MobHealth=0x0000 #
OP_InitialMobHealth=0x0000 #
OP_TargetHoTT=0x0000 #
OP_TargetBuffs=0x0000 #
OP_BuffCreate=0x0000
OP_DeleteSpawn=0x725a #
OP_AutoAttack=0x1df9 #
OP_AutoAttack2=0x0000 #
OP_Consume=0x0000 #
OP_MoveItem=0x0000 #
OP_DeleteItem=0x0000 #
OP_DeleteCharge=0x0000 #
OP_ItemPacket=0x7c87 #
OP_ItemLinkResponse=0x0000 #
OP_ItemLinkClick=0x0000 #
OP_NewSpawn=0x0000 #
OP_Track=0x0000 #
OP_TrackTarget=0x0000 #
OP_TrackUnknown=0x0000 #
OP_ClickDoor=0x3154 #
OP_MoveDoor=0x470e #
OP_EnvDamage=0x0000 #
OP_BoardBoat=0x0000 #
OP_Forage=0x0000 #
OP_LeaveBoat=0x0000 #
OP_ControlBoat=0x0000 #
OP_SafeFallSuccess=0x0000 #
OP_RezzComplete=0x0000 #
OP_RezzRequest=0x0000 #
OP_RezzAnswer=0x0000 #
OP_Shielding=0x0000 #
OP_RequestDuel=0x0000 #
OP_MobRename=0x0000 #
OP_AugmentItem=0x0000 #
OP_WeaponEquip1=0x0000 #
OP_WeaponEquip2=0x0000 #
OP_WeaponUnequip2=0x0000 #
OP_ApplyPoison=0x0000 #
OP_Save=0x1436 #
OP_TestBuff=0x0000 #
OP_CustomTitles=0x0000 #
OP_Split=0x0000 #
OP_YellForHelp=0x0000 #
OP_LoadSpellSet=0x0000 #
OP_Bandolier=0x0000 #
OP_PotionBelt=0x0000 #
OP_DuelResponse=0x0000 #
OP_DuelResponse2=0x0000 #
OP_SaveOnZoneReq=0x2913 #
OP_ReadBook=0x0000 #
OP_Dye=0x0000 #
OP_InterruptCast=0x0000 #
OP_AAAction=0x0000 #
OP_LeadershipExpToggle=0x0000 #
OP_LeadershipExpUpdate=0x0000 #
OP_PurchaseLeadershipAA=0x0000 #
OP_UpdateLeadershipAA=0x0000 #
OP_MarkNPC=0x0000 #
OP_ClearNPCMarks=0x0000 #
OP_DoGroupLeadershipAbility=0x0000 #
OP_GroupLeadershipAAUpdate=0x0000 #
OP_DelegateAbility=0x0000 #
OP_SetGroupTarget=0x0000 #
OP_Charm=0x0000 #
OP_Stun=0x0000 #
OP_SendFindableNPCs=0x0786 #
OP_FindPersonRequest=0x0000 #
OP_FindPersonReply=0x0000 #
OP_Sound=0x0000 #
OP_PetBuffWindow=0x0000 #
OP_LevelAppearance=0x0000 #
OP_Translocate=0x0000 #
OP_Sacrifice=0x0000 #
OP_PopupResponse=0x0000 #
OP_OnLevelMessage=0x0000 #
OP_AugmentInfo=0x0000 #
OP_Petition=0x0000 #
OP_SomeItemPacketMaybe=0x4200 #
OP_SomeItemPacketMaybe=0x0000 #
OP_PVPStats=0x0000 #
OP_PVPLeaderBoardRequest=0x0000 #
OP_PVPLeaderBoardReply=0x0000 #
OP_PVPLeaderBoardDetailsRequest=0x0000 #
OP_PVPLeaderBoardDetailsReply=0x0000 #
OP_RestState=0x0000 #
OP_RespawnWindow=0x0000 #
OP_DisciplineTimer=0x0000 #
OP_LDoNButton=0x0000 #
OP_SetStartCity=0x0000 #
OP_VoiceMacroIn=0x0000 #
OP_VoiceMacroOut=0x0000 #
OP_ItemViewUnknown=0x0000 #
OP_VetRewardsAvaliable=0x0000 #
OP_VetClaimRequest=0x0000 #
OP_VetClaimReply=0x0000 #
OP_CrystalCountUpdate=0x0000 #
OP_DisciplineUpdate=0x0000 #
OP_BecomeCorpse=0x0000 #
OP_Action2=0x0000 #
OP_MobUpdate=0x4656 #
OP_NPCMoveUpdate=0x38e0 #
OP_CameraEffect=0x0000 #
OP_SpellEffect=0x0000 #
OP_DzQuit=0x0000
OP_DzListTimers=0x0000
OP_DzAddPlayer=0x0000
OP_DzRemovePlayer=0x0000
OP_DzSwapPlayer=0x0000
OP_DzMakeLeader=0x0000
OP_DzPlayerList=0x0000
OP_DzJoinExpeditionConfirm=0x0000
OP_DzJoinExpeditionReply=0x0000
OP_DzExpeditionInfo=0x0000
OP_DzMemberStatus=0x0000
OP_DzLeaderStatus=0x0000
OP_DzExpeditionEndsWarning=0x0000
OP_DzExpeditionList=0x0000
OP_DzMemberList=0x0000
OP_DzCompass=0x0000
OP_DzChooseZone=0x0000
# New Opcodes
OP_SpawnPositionUpdate=0x0000 #
OP_ManaUpdate=0x0ff4 #
OP_EnduranceUpdate=0x0000 #
OP_MobManaUpdate=0x1912 #
OP_MobEnduranceUpdate=0x0000 #
# Looting
OP_LootRequest=0x0000 #
OP_EndLootRequest=0x0000 #
OP_LootItem=0x0000 #
OP_LootComplete=0x0000 #
# bazaar trader stuff stuff:
OP_BazaarSearch=0x0000 #
OP_TraderDelItem=0x0000 #
OP_BecomeTrader=0x0000 #
OP_TraderShop=0x0000 #
OP_Trader=0x0000 #
OP_TraderBuy=0x0000 #
OP_Barter=0x0000 #
OP_ShopItem=0x0000 #
OP_BazaarInspect=0x0000 #
OP_Bazaar=0x0000 #
OP_TraderItemUpdate=0x0000 #
# pc/npc trading
OP_TradeRequest=0x0000 #
OP_TradeAcceptClick=0x0000 #
OP_TradeRequestAck=0x0000 #
OP_TradeCoins=0x0000 #
OP_FinishTrade=0x0000 #
OP_CancelTrade=0x0000 #
OP_TradeMoneyUpdate=0x0000 #
OP_MoneyUpdate=0x0000 #
OP_TradeBusy=0x0000 #
# Sent after canceling trade or after closing tradeskill object
OP_FinishWindow=0x0000 #
OP_FinishWindow2=0x0000 #
# Sent on Live for what seems to be item existance verification
# Ex. Before Right Click Effect happens from items
OP_ItemVerifyRequest=0x0000 #
OP_ItemVerifyReply=0x0000 #
# merchant crap
OP_ShopPlayerSell=0x0000 #
OP_ShopRequest=0x58c5 #
OP_ShopEnd=0x3753 #
OP_ShopEndConfirm=0x0000 #
OP_ShopPlayerBuy=0x0000 #
OP_ShopDelItem=0x0000 #
# tradeskill stuff:
OP_ClickObject=0x0000 #
OP_ClickObjectAction=0x0000 #
OP_ClearObject=0x0000 #
OP_RecipeDetails=0x0000 #
OP_RecipesFavorite=0x0000 #
OP_RecipesSearch=0x0000 #
OP_RecipeReply=0x0000 #
OP_RecipeAutoCombine=0x0000 #
OP_TradeSkillCombine=0x0000 #
# Tribute Packets:
OP_OpenGuildTributeMaster=0x0000 #
OP_OpenTributeMaster=0x0000 #
OP_SelectTribute=0x0000 #
OP_TributeItem=0x0000 #
OP_TributeMoney=0x0000 #
OP_TributeToggle=0x0000 #
OP_TributePointUpdate=0x0000 #
OP_TributeNPC=0x0000 #
OP_GuildTributeInfo=0x0000 #
OP_OpenTributeReply=0x0000 #
# OP_GuildTributeStatus=0x0000 #
# Adventure packets:
OP_LeaveAdventure=0x0000 #
OP_AdventureFinish=0x0000 #
OP_AdventureInfoRequest=0x0000 #
OP_AdventureInfo=0x0000 #
OP_AdventureRequest=0x0000 #
OP_AdventureDetails=0x0000 #
OP_AdventureData=0x0000 #
OP_AdventureUpdate=0x0000 #
OP_AdventureMerchantRequest=0x0000 #
OP_AdventureMerchantResponse=0x0000 #
OP_AdventureMerchantPurchase=0x0000 #
OP_AdventureMerchantSell=0x0000 #
OP_AdventurePointsUpdate=0x0000 #
OP_AdventureStatsRequest=0x0000 #
OP_AdventureStatsReply=0x0000 #
OP_AdventureLeaderboardRequest=0x0000 #
OP_AdventureLeaderboardReply=0x0000 #
# Group Opcodes
OP_GroupDisband=0x0000 #
OP_GroupInvite=0x0000 #
OP_GroupFollow=0x0000 #
OP_GroupUpdate=0x0000 #
OP_GroupUpdateB=0x0000 #
OP_GroupCancelInvite=0x0000 #
OP_GroupAcknowledge=0x0000 #
OP_GroupDelete=0x0000 #
OP_CancelInvite=0x0000 #
OP_GroupFollow2=0x0000 #
OP_GroupInvite2=0x0000 #
OP_GroupDisbandYou=0x0000 #
OP_GroupDisbandOther=0x0000 #
OP_GroupLeaderChange=0x0000 #
OP_GroupRoles=0x0000 #
# LFG/LFP Opcodes
OP_LFGCommand=0x0000 #
OP_LFGGetMatchesRequest=0x0000 #
OP_LFGGetMatchesResponse=0x0000 #
OP_LFPGetMatchesRequest=0x0000 #
OP_LFPGetMatchesResponse=0x0000 #
OP_LFPCommand=0x0000 #
OP_LFGAppearance=0x0000 #
OP_LFGResponse=0x0000 #
# Raid Opcodes
OP_RaidInvite=0x0000 #
OP_RaidUpdate=0x0000 #
OP_RaidJoin=0x0000 #
# Button-push commands
OP_Taunt=0x0000 #
OP_CombatAbility=0x0000 #
OP_SenseTraps=0x0000 #
OP_PickPocket=0x0000 #
OP_DisarmTraps=0x0000 #
OP_Disarm=0x0000 #
OP_Sneak=0x0000 #
OP_Fishing=0x0000 #
OP_InstillDoubt=0x0000 #
OP_FeignDeath=0x0000 #
OP_Mend=0x0000 #
OP_LDoNOpen=0x0000 #
# Task packets
OP_TaskActivityComplete=0x0000 #
OP_TaskMemberList=0x0000 #
OP_OpenNewTasksWindow=0x0000 #
OP_AvaliableTask=0x0000 #
OP_AcceptNewTask=0x0000 #
OP_TaskHistoryRequest=0x0000 #
OP_TaskHistoryReply=0x0000 #
OP_CancelTask=0x0000 #
OP_DeclineAllTasks=0x0000 #
# Title opcodes
OP_NewTitlesAvailable=0x0000 #
OP_RequestTitles=0x0000 #
OP_SendTitleList=0x0000 #
OP_SetTitle=0x0000 #
OP_SetTitleReply=0x0000 #
# mail opcodes
OP_Command=0x0000 #
OP_MailboxHeader=0x0000 #
OP_MailHeader=0x0000 #
OP_MailBody=0x0000 #
OP_NewMail=0x0000 #
OP_SentConfirm=0x0000 #
# # # # # # # # # # # Below this point should not be needed # # # # # # # # # # #
# This section are all unknown in Titanium
OP_ForceFindPerson=0x0000 #
OP_LocInfo=0x0000 #
OP_ReloadUI=0x0000 #
OP_ItemName=0x0000 #
OP_ItemLinkText=0x0000 #
OP_MultiLineMsg=0x0000 #
OP_MendHPUpdate=0x0000 #
OP_TargetReject=0x0000 #
OP_SafePoint=0x0000 #
OP_IncreaseStats=0x0000 #
OP_ApproveZone=0x0000 #
OP_ZoneComplete=0x0000 #
OP_ClientError=0x0000 #
OP_DumpName=0x0000 #
OP_Heartbeat=0x0000 #
OP_CrashDump=0x0000 #
OP_LoginComplete=0x0000 #
# discovered opcodes not yet used:
OP_PickLockSuccess=0x0000 #
OP_PlayMP3=0x0000 #
OP_ReclaimCrystals=0x0000 #
OP_DynamicWall=0x0000 #
OP_OpenDiscordMerchant=0x0000 #
OP_DiscordMerchantInventory=0x0000 #
OP_GiveMoney=0x0000 #
OP_RequestKnowledgeBase=0x0000 #
OP_KnowledgeBase=0x0000 #
OP_SlashAdventure=0x0000 # /adventure
OP_BecomePVPPrompt=0x0000 #
OP_MoveLogRequest=0x0000 # gone I think
OP_MoveLogDisregard=0x0000 # gone I think
# named unknowns, to make looking for real unknown easier
OP_AnnoyingZoneUnknown=0x0000 #
OP_Some6ByteHPUpdate=0x0000 # seems to happen when you target group members
OP_QueryResponseThing=0x0000 #
# realityincarnate: these are just here to stop annoying several thousand byte packet dumps
#OP_LoginUnknown1=0x0000 # U OP_SendSpellChecksum
#OP_LoginUnknown2=0x0000 # U OP_SendSkillCapsChecksum
# Petition Opcodes
OP_PetitionSearch=0x0000 # search term for petition
OP_PetitionSearchResults=0x0000 # (list of?) matches from search
OP_PetitionSearchText=0x0000 # text results of search
OP_PetitionUpdate=0x0000 #
OP_PetitionCheckout=0x0000 #
OP_PetitionCheckIn=0x0000 #
OP_PetitionQue=0x0000 #
OP_PetitionUnCheckout=0x0000 #
OP_PetitionDelete=0x0000 #
OP_DeletePetition=0x0000 #
OP_PetitionResolve=0x0000 #
OP_PDeletePetition=0x0000 #
OP_PetitionBug=0x0000 #
OP_PetitionRefresh=0x0000 #
OP_PetitionCheckout2=0x0000 #
OP_PetitionViewPetition=0x0000 #
# Login opcodes
OP_SessionReady=0x0000 #
OP_Login=0x0000 #
OP_ServerListRequest=0x0000 #
OP_PlayEverquestRequest=0x0000 #
OP_PlayEverquestResponse=0x0000 #
OP_ChatMessage=0x0000 #
OP_LoginAccepted=0x0000 #
OP_ServerListResponse=0x0000 #
OP_Poll=0x0000 #
OP_EnterChat=0x0000 #
OP_PollResponse=0x0000 #
# raw opcodes
OP_RAWSessionRequest=0x0000 #
OP_RAWSessionResponse=0x0000 #
OP_RAWCombined=0x0000 #
OP_RAWSessionDisconnect=0x0000 #
OP_RAWKeepAlive=0x0000 #
OP_RAWSessionStatRequest=0x0000 #
OP_RAWSessionStatResponse=0x0000 #
OP_RAWPacket=0x0000 #
OP_RAWFragment=0x0000 #
OP_RAWOutOfOrderAck=0x0000 #
OP_RAWAck=0x0000 #
OP_RAWAppCombined=0x0000 #
OP_RAWOutOfSession=0x0000 #
# we need to document the differences between these packets to make identifying them easier
OP_Some3ByteHPUpdate=0x0000 # initial HP update for mobs
OP_InitialHPUpdate=0x0000 #
OP_MercenaryDataRequest=0x367f
OP_MercenaryDataResponse=0x6a9b
OP_MercenaryHire=0x3671
OP_MercenaryAssign=0x4be6
OP_MercenaryTimer=0x6364
OP_MercenaryUnknown1=0x2ef8
@@ -0,0 +1,633 @@
# OPCodes not used by EQExtractor2 are most likely not correct.
#
# ShowEQ Import Notes:
# ZERO THE FILE first
# perl -pi -e 's/0x[0-9a-fA-F]{4}/0x0000/g' opcodes.conf
# Unknown Mapping:
# OP_Action2 -> OP_Damage
# OP_EnvDamage -> OP_Damage ---> might have been a one time mistake
# Name Differences:
# OP_CancelInvite -> OP_GroupCancelInvite
# OP_GMFind -> OP_FindPersonRequest
# OP_CommonMessage -> OP_ChannelMessage
OP_Unknown=0x0000
OP_ExploreUnknown=0x0000 # used for unknown explorer
# V = Verified correct
# C = Most likely correct
# U = Unsure, but should be correct or close
# world packets
# Required to reach Char Select:
OP_SendLoginInfo=0x0000 #
OP_ApproveWorld=0x0000 #
OP_LogServer=0x0000 #
OP_SendCharInfo=0x0000 #
OP_ExpansionInfo=0x0000 #
OP_GuildsList=0x0000 #
OP_EnterWorld=0x0000 #
OP_PostEnterWorld=0x0000 #
OP_World_Client_CRC1=0x0000 #
OP_World_Client_CRC2=0x0000 #
OP_SendSpellChecksum=0x0000 #
OP_SendSkillCapsChecksum=0x0000 #
# Character Select Related:
OP_DeleteCharacter=0x0000 #
OP_CharacterCreateRequest=0x0000 #
OP_CharacterCreate=0x0000 #
OP_RandomNameGenerator=0x0000 #
OP_ApproveName=0x0000 #
OP_MOTD=0x0000 #
OP_SetChatServer=0x0000 #
OP_SetChatServer2=0x0000 #
OP_ZoneServerInfo=0x0000 #
OP_WorldComplete=0x0000 #
OP_WorldUnknown001=0x0000 #
OP_FloatListThing=0x0000 #
# Reasons for Disconnect:
OP_ZoneUnavail=0x0000 #
OP_WorldClientReady=0x0000 # Testing VoA 0x3f24
OP_CharacterStillInZone=0x0000 #
OP_WorldChecksumFailure=0x0000 #
OP_WorldLoginFailed=0x0000 #
OP_WorldLogout=0x0000 #
OP_WorldLevelTooHigh=0x0000 #
OP_CharInacessable=0x0000 #
OP_UserCompInfo=0x0000 #
# OP_SendExeChecksum=0x0000 #
# OP_SendBaseDataChecksum=0x0000 #
# Zone in opcodes
OP_AckPacket=0x3594 #
OP_ZoneEntry=0x4938 #
OP_ReqNewZone=0x0000 #
OP_NewZone=0x3401 #
OP_ZoneSpawns=0x0000 #
OP_PlayerProfile=0x078e #
OP_TimeOfDay=0x0000 #
OP_LevelUpdate=0x0000 #
OP_Stamina=0x0000 #
OP_RequestClientZoneChange=0x0000 #
OP_ZoneChange=0x0000 #
OP_LockoutTimerInfo=0x0000 #
OP_ZoneServerReady=0x0000 #
OP_ZoneInUnknown=0x0000 #
OP_LogoutReply=0x0000 #
OP_PreLogoutReply=0x0000 #
# Required to fully log in
OP_SpawnAppearance=0x0000 #
OP_ChangeSize=0x0000 #
OP_TributeUpdate=0x0000 #
OP_TributeTimer=0x0000 # Testing VoA 0x1525
OP_TaskDescription=0x0000 #
OP_TaskActivity=0x0000 #
OP_CompletedTasks=0x0000 #
OP_Weather=0x0000 #
OP_SendAATable=0x40e8 # Testing VoA 0x6a7e
OP_UpdateAA=0x0000 # Testing VoA 0x5363
OP_RespondAA=0x0000 # Testing VoA 0x0643 or maybe 0x7bf6
OP_ReqClientSpawn=0x0000 #
OP_SpawnDoor=0x0e71 #
OP_GroundSpawn=0x6618 #
OP_SendZonepoints=0x0c54 #
OP_SendAAStats=0x0000 #
OP_WorldObjectsSent=0x0000 #
OP_BlockedBuffs=0x0000 #
OP_RemoveBlockedBuffs=0x0000 #
OP_ClearBlockedBuffs=0x0000 #
OP_SendExpZonein=0x0000 #
OP_SendTributes=0x0000 #
OP_TributeInfo=0x0000 #
OP_SendGuildTributes=0x0000 #
OP_AAExpUpdate=0x0000 #
OP_ExpUpdate=0x0000 # Testing VoA 0x0555
OP_HPUpdate=0x0000 #
OP_ManaChange=0x0000 #
OP_TGB=0x0000 #
OP_SpecialMesg=0x0000 #
OP_GuildMemberList=0x0000 #
OP_GuildMOTD=0x0000 # Testing VoA 0x0a1d
OP_CharInventory=0x0000 # Testing VoA 0x6cfe
OP_WearChange=0x0000 #
OP_ClientUpdate=0x0000 #
OP_ClientReady=0x0000 #
OP_SetServerFilter=0x0000 #
# Guild Opcodes
OP_GetGuildMOTD=0x0000 #
OP_GetGuildMOTDReply=0x0000 #
OP_GuildMemberUpdate=0x0000 #
OP_GuildInvite=0x0000 #
OP_GuildRemove=0x0000 #
OP_GuildPeace=0x0000 #
OP_SetGuildMOTD=0x0000 #
OP_GuildList=0x0000 #
OP_GuildWar=0x0000 #
OP_GuildLeader=0x0000 #
OP_GuildDelete=0x0000 #
OP_GuildInviteAccept=0x0000 #
OP_GuildDemote=0x0000 #
OP_GuildPublicNote=0x0000 #
OP_GuildManageBanker=0x0000 #
OP_GuildBank=0x0000 #
OP_SetGuildRank=0x0000 #
OP_GuildUpdateURLAndChannel=0x0000 #
OP_GuildMemberLevelUpdate=0x0000 #
OP_ZoneGuildList=0x0000 #
OP_GetGuildsList=0x0000 #
OP_GuildStatus=0x0000 #
OP_GuildCreate=0x0000 #
# OP_GuildManageRemove=0x0000 #
# OP_GuildManageAdd=0x0000 #
# OP_GuildManageStatus=0x0000 #
# GM/guide opcodes
OP_GMServers=0x0000 #
OP_GMBecomeNPC=0x0000 #
OP_GMZoneRequest=0x0000 #
OP_GMZoneRequest2=0x0000 #
OP_GMGoto=0x0000 #
OP_GMSearchCorpse=0x0000 #
OP_GMHideMe=0x0000 #
OP_GMDelCorpse=0x0000 #
OP_GMApproval=0x0000 #
OP_GMToggle=0x0000 #
OP_GMSummon=0x0000 #
OP_GMEmoteZone=0x0000 #
OP_GMEmoteWorld=0x0000 #
OP_GMFind=0x0000 #
OP_GMKick=0x0000 #
OP_GMKill=0x0000 #
OP_GMNameChange=0x0000 #
OP_GMLastName=0x0000 #
OP_InspectAnswer=0x0000 #
OP_BeginCast=0x0000 #
OP_BuffFadeMsg=0x0000 #
OP_ConsentResponse=0x0000 #
OP_MemorizeSpell=0x0000 #
OP_SwapSpell=0x0000 #
OP_CastSpell=0x0000 #
OP_Consider=0x0000 #
OP_FormattedMessage=0x0000 #
OP_SimpleMessage=0x0000 #
OP_Buff=0x0000 #
OP_Illusion=0x0000 #
OP_MoneyOnCorpse=0x0000 #
OP_RandomReply=0x0000 #
OP_DenyResponse=0x0000 #
OP_SkillUpdate=0x0000 #
OP_GMTrainSkillConfirm=0x0000 #
OP_RandomReq=0x0000 #
OP_Death=0x0000 #
OP_Bind_Wound=0x0000 #
OP_GMTraining=0x0000 #
OP_GMEndTraining=0x0000 #
OP_GMTrainSkill=0x0000 #
OP_Animation=0x0000 #
OP_Begging=0x0000 #
OP_Consent=0x0000 #
OP_ConsentDeny=0x0000 #
OP_AutoFire=0x0000 #
OP_PetCommands=0x0000 #
OP_DeleteSpell=0x0000 #
OP_Surname=0x0000 #
OP_ClearSurname=0x0000 #
OP_FaceChange=0x0000 #
OP_SenseHeading=0x0000 #
OP_Action=0x0000 #
OP_ConsiderCorpse=0x0000 #
OP_HideCorpse=0x0000 #
OP_CorpseDrag=0x0000 #
OP_CorpseDrop=0x0000 #
OP_Bug=0x0000 #
OP_Feedback=0x0000 #
OP_Report=0x0000 #
OP_Damage=0x0000 #
OP_ChannelMessage=0x0000 #
OP_Assist=0x0000 #
OP_AssistGroup=0x0000 #
OP_MoveCoin=0x0000 #
OP_ZonePlayerToBind=0x0000 #
OP_KeyRing=0x0000 #
OP_WhoAllRequest=0x0000 #
OP_WhoAllResponse=0x0000 #
OP_FriendsWho=0x0000 #
OP_ConfirmDelete=0x0000 #
OP_Logout=0x0000 #
OP_Rewind=0x0000 #
OP_TargetCommand=0x0000 #
OP_InspectRequest=0x0000 #
OP_Hide=0x0000 #
OP_Jump=0x0000 #
OP_Camp=0x0000 #
OP_Emote=0x0000 #
OP_SetRunMode=0x0000 #
OP_BankerChange=0x0000 #
OP_TargetMouse=0x0000 #
OP_MobHealth=0x0000 #
OP_InitialMobHealth=0x0000 #
OP_TargetHoTT=0x0000 #
OP_TargetBuffs=0x0000 #
OP_BuffCreate=0x0000 #
OP_BuffRemoveRequest=0x0000
OP_DeleteSpawn=0x0000 #
OP_AutoAttack=0x0000 #
OP_AutoAttack2=0x0000 #
OP_Consume=0x0000 #
OP_MoveItem=0x0000 #
OP_DeleteItem=0x0000 #
OP_DeleteCharge=0x0000 #
OP_ItemPacket=0x38b0 #
OP_ItemLinkResponse=0x0000 #
OP_ItemLinkClick=0x0000 #
OP_NewSpawn=0x0000 #
OP_Track=0x0000 #
OP_TrackTarget=0x0000 #
OP_TrackUnknown=0x0000 #
OP_ClickDoor=0x0000 #
OP_MoveDoor=0x0000 #
OP_RemoveAllDoors=0x0000 #
OP_EnvDamage=0x0000 #
OP_BoardBoat=0x0000 #
OP_Forage=0x0000 #
OP_LeaveBoat=0x0000 #
OP_ControlBoat=0x0000 #
OP_SafeFallSuccess=0x0000 #
OP_RezzComplete=0x0000 #
OP_RezzRequest=0x0000 #
OP_RezzAnswer=0x0000 #
OP_Shielding=0x0000 #
OP_RequestDuel=0x0000 #
OP_MobRename=0x0000 #
OP_AugmentItem=0x0000 #
OP_WeaponEquip1=0x0000 #
OP_WeaponEquip2=0x0000 #
OP_WeaponUnequip2=0x0000 #
OP_ApplyPoison=0x0000 #
OP_Save=0x0000 #
OP_TestBuff=0x0000 #
OP_CustomTitles=0x0000 #
OP_Split=0x0000 #
OP_YellForHelp=0x0000 #
OP_LoadSpellSet=0x0000 #
OP_Bandolier=0x0000 #
OP_PotionBelt=0x0000 #
OP_DuelResponse=0x0000 #
OP_DuelResponse2=0x0000 #
OP_SaveOnZoneReq=0x0000 #
OP_ReadBook=0x0000 #
OP_Dye=0x0000 #
OP_InterruptCast=0x0000 #
OP_AAAction=0x0000 #
OP_LeadershipExpToggle=0x0000 #
OP_LeadershipExpUpdate=0x0000 #
OP_PurchaseLeadershipAA=0x0000 #
OP_UpdateLeadershipAA=0x0000 #
OP_MarkNPC=0x0000 #
OP_ClearNPCMarks=0x0000 #
OP_DoGroupLeadershipAbility=0x0000 #
OP_GroupLeadershipAAUpdate=0x0000 #
OP_DelegateAbility=0x0000 #
OP_SetGroupTarget=0x0000 #
OP_Charm=0x0000 #
OP_Stun=0x0000 #
OP_SendFindableNPCs=0x6c36 #
OP_FindPersonRequest=0x0000 #
OP_FindPersonReply=0x0000 #
OP_Sound=0x0000 #
OP_PetBuffWindow=0x0000 #
OP_LevelAppearance=0x0000 #
OP_Translocate=0x0000 #
OP_Sacrifice=0x0000 #
OP_PopupResponse=0x0000 #
OP_OnLevelMessage=0x0000 #
OP_AugmentInfo=0x0000 #
OP_Petition=0x0000 #
OP_SomeItemPacketMaybe=0x0000 #
OP_PVPStats=0x0000 #
OP_PVPLeaderBoardRequest=0x0000 #
OP_PVPLeaderBoardReply=0x0000 #
OP_PVPLeaderBoardDetailsRequest=0x0000 #
OP_PVPLeaderBoardDetailsReply=0x0000 #
OP_RestState=0x0000 #
OP_RespawnWindow=0x0000 #
OP_DisciplineTimer=0x0000 #
OP_LDoNButton=0x0000 #
OP_SetStartCity=0x0000 #
OP_VoiceMacroIn=0x0000 #
OP_VoiceMacroOut=0x0000 #
OP_ItemViewUnknown=0x0000 #
OP_VetRewardsAvaliable=0x0000 #
OP_VetClaimRequest=0x0000 #
OP_VetClaimReply=0x0000 #
OP_CrystalCountUpdate=0x0000 #
OP_DisciplineUpdate=0x0000 #
OP_BecomeCorpse=0x0000 #
OP_Action2=0x0000 #
OP_MobUpdate=0x68da #
OP_NPCMoveUpdate=0x226b #
OP_CameraEffect=0x0000 #
OP_SpellEffect=0x0000 #
OP_RemoveNimbusEffect=0x0000 #
OP_AltCurrency=0x0000
OP_AltCurrencyMerchantRequest=0x0000
OP_AltCurrencyMerchantReply=0x0000
OP_AltCurrencyPurchase=0x0000
OP_AltCurrencySell=0x0000
OP_AltCurrencySellSelection=0x0000
OP_AltCurrencyReclaim=0x0000
OP_CrystalReclaim=0x0000
OP_CrystalCreate=0x0000
OP_Untargetable=0x0000
OP_IncreaseStats=0x0000
OP_DzQuit=0x0000
OP_DzListTimers=0x0000
OP_DzAddPlayer=0x0000
OP_DzRemovePlayer=0x0000
OP_DzSwapPlayer=0x0000
OP_DzMakeLeader=0x0000
OP_DzPlayerList=0x0000
OP_DzJoinExpeditionConfirm=0x0000
OP_DzJoinExpeditionReply=0x0000
OP_DzExpeditionInfo=0x0000
OP_DzMemberStatus=0x0000
OP_DzLeaderStatus=0x0000
OP_DzExpeditionEndsWarning=0x0000
OP_DzExpeditionList=0x0000
OP_DzMemberList=0x0000
OP_DzCompass=0x0000
OP_DzChooseZone=0x0000
# New Opcodes
OP_SpawnPositionUpdate=0x0000 #
OP_ManaUpdate=0x0000 #
OP_EnduranceUpdate=0x0000 #
OP_MobManaUpdate=0x0000 #
OP_MobEnduranceUpdate=0x0000 #
# Looting
OP_LootRequest=0x0000 #
OP_EndLootRequest=0x0000 #
OP_LootItem=0x0000 #
OP_LootComplete=0x0000 #
# bazaar trader stuff stuff:
OP_BazaarSearch=0x0000 #
OP_TraderDelItem=0x0000 #
OP_BecomeTrader=0x0000 #
OP_TraderShop=0x0000 #
OP_Trader=0x0000 #
OP_TraderBuy=0x0000 #
OP_Barter=0x0000 #
OP_ShopItem=0x0000 #
OP_BazaarInspect=0x0000 #
OP_Bazaar=0x0000 #
OP_TraderItemUpdate=0x0000 #
# pc/npc trading
OP_TradeRequest=0x0000 #
OP_TradeAcceptClick=0x0000 #
OP_TradeRequestAck=0x0000 #
OP_TradeCoins=0x0000 #
OP_FinishTrade=0x0000 #
OP_CancelTrade=0x0000 #
OP_TradeMoneyUpdate=0x0000 #
OP_MoneyUpdate=0x0000 #
OP_TradeBusy=0x0000 #
# Sent after canceling trade or after closing tradeskill object
OP_FinishWindow=0x0000 #
OP_FinishWindow2=0x0000 #
# Sent on Live for what seems to be item existance verification
# Ex. Before Right Click Effect happens from items
OP_ItemVerifyRequest=0x0000 #
OP_ItemVerifyReply=0x0000 #
# merchant crap
OP_ShopPlayerSell=0x0000 #
OP_ShopRequest=0x5f0d #
OP_ShopEnd=0x537c #
OP_ShopEndConfirm=0x0000 #
OP_ShopPlayerBuy=0x0000 #
OP_ShopDelItem=0x0000 #
# tradeskill stuff:
OP_ClickObject=0x0000 #
OP_ClickObjectAction=0x0000 #
OP_ClearObject=0x0000 #
OP_RecipeDetails=0x0000 #
OP_RecipesFavorite=0x0000 #
OP_RecipesSearch=0x0000 #
OP_RecipeReply=0x0000 #
OP_RecipeAutoCombine=0x0000 #
OP_TradeSkillCombine=0x0000 #
# Tribute Packets:
OP_OpenGuildTributeMaster=0x0000 #
OP_OpenTributeMaster=0x0000 #
OP_SelectTribute=0x0000 #
OP_TributeItem=0x0000 #
OP_TributeMoney=0x0000 #
OP_TributeToggle=0x0000 #
OP_TributePointUpdate=0x0000 #
OP_TributeNPC=0x0000 #
OP_GuildTributeInfo=0x0000 #
OP_OpenTributeReply=0x0000 #
# OP_GuildTributeStatus=0x0000 #
# Adventure packets:
OP_LeaveAdventure=0x0000 #
OP_AdventureFinish=0x0000 #
OP_AdventureInfoRequest=0x0000 #
OP_AdventureInfo=0x0000 #
OP_AdventureRequest=0x0000 #
OP_AdventureDetails=0x0000 #
OP_AdventureData=0x0000 #
OP_AdventureUpdate=0x0000 #
OP_AdventureMerchantRequest=0x0000 #
OP_AdventureMerchantResponse=0x0000 #
OP_AdventureMerchantPurchase=0x0000 #
OP_AdventureMerchantSell=0x0000 #
OP_AdventurePointsUpdate=0x0000 #
OP_AdventureStatsRequest=0x0000 #
OP_AdventureStatsReply=0x0000 #
OP_AdventureLeaderboardRequest=0x0000 #
OP_AdventureLeaderboardReply=0x0000 #
# Group Opcodes
OP_GroupDisband=0x0000 #
OP_GroupInvite=0x0000 #
OP_GroupFollow=0x0000 #
OP_GroupUpdate=0x0000 #
OP_GroupUpdateB=0x0000 #
OP_GroupCancelInvite=0x0000 #
OP_GroupAcknowledge=0x0000 #
OP_GroupDelete=0x0000 #
OP_CancelInvite=0x0000 #
OP_GroupFollow2=0x0000 #
OP_GroupInvite2=0x0000 #
OP_GroupDisbandYou=0x0000 #
OP_GroupDisbandOther=0x0000 #
OP_GroupLeaderChange=0x0000 #
OP_GroupRoles=0x0000 #
OP_GroupMakeLeader=0x0000
# LFG/LFP Opcodes
OP_LFGCommand=0x0000 #
OP_LFGGetMatchesRequest=0x0000 #
OP_LFGGetMatchesResponse=0x0000 #
OP_LFPGetMatchesRequest=0x0000 #
OP_LFPGetMatchesResponse=0x0000 #
OP_LFPCommand=0x0000 #
OP_LFGAppearance=0x0000 #
OP_LFGResponse=0x0000 #
# Raid Opcodes
OP_RaidInvite=0x0000 #
OP_RaidUpdate=0x0000 # Testing VoA 0x0c08
OP_RaidJoin=0x0000 #
# Button-push commands
OP_Taunt=0x0000 #
OP_CombatAbility=0x0000 #
OP_SenseTraps=0x0000 #
OP_PickPocket=0x0000 #
OP_DisarmTraps=0x0000 #
OP_Disarm=0x0000 #
OP_Sneak=0x0000 #
OP_Fishing=0x0000 #
OP_InstillDoubt=0x0000 #
OP_FeignDeath=0x0000 #
OP_Mend=0x0000 #
OP_LDoNOpen=0x0000 #
# Task packets
OP_TaskActivityComplete=0x0000 #
OP_TaskMemberList=0x0000 #
OP_OpenNewTasksWindow=0x0000 #
OP_AvaliableTask=0x0000 #
OP_AcceptNewTask=0x0000 #
OP_TaskHistoryRequest=0x0000 #
OP_TaskHistoryReply=0x0000 #
OP_CancelTask=0x0000 #
OP_DeclineAllTasks=0x0000 #
# Title opcodes
OP_NewTitlesAvailable=0x0000 #
OP_RequestTitles=0x0000 #
OP_SendTitleList=0x0000 #
OP_SetTitle=0x0000 #
OP_SetTitleReply=0x0000 #
# mail opcodes
OP_Command=0x0000 #
OP_MailboxHeader=0x0000 #
OP_MailHeader=0x0000 #
OP_MailBody=0x0000 #
OP_NewMail=0x0000 #
OP_SentConfirm=0x0000 #
# # # # # # # # # # # Below this point should not be needed # # # # # # # # # # #
# This section are all unknown in Titanium
OP_ForceFindPerson=0x0000 #
OP_LocInfo=0x0000 #
OP_ReloadUI=0x0000 #
OP_ItemName=0x0000 #
OP_ItemLinkText=0x0000 #
OP_MultiLineMsg=0x0000 #
OP_MendHPUpdate=0x0000 #
OP_TargetReject=0x0000 #
OP_SafePoint=0x0000 #
OP_ApproveZone=0x0000 #
OP_ZoneComplete=0x0000 #
OP_ClientError=0x0000 #
OP_DumpName=0x0000 #
OP_Heartbeat=0x0000 #
OP_CrashDump=0x0000 #
OP_LoginComplete=0x0000 #
# discovered opcodes not yet used:
OP_PickLockSuccess=0x0000 #
OP_PlayMP3=0x0000 #
OP_ReclaimCrystals=0x0000 #
OP_DynamicWall=0x0000 #
OP_OpenDiscordMerchant=0x0000 #
OP_DiscordMerchantInventory=0x0000 #
OP_GiveMoney=0x0000 #
OP_RequestKnowledgeBase=0x0000 #
OP_KnowledgeBase=0x0000 #
OP_SlashAdventure=0x0000 # /adventure
OP_BecomePVPPrompt=0x0000 #
OP_MoveLogRequest=0x0000 # gone I think
OP_MoveLogDisregard=0x0000 # gone I think
# named unknowns, to make looking for real unknown easier
OP_AnnoyingZoneUnknown=0x0000 #
OP_Some6ByteHPUpdate=0x0000 # seems to happen when you target group members
OP_QueryResponseThing=0x0000 #
# realityincarnate: these are just here to stop annoying several thousand byte packet dumps
#OP_LoginUnknown1=0x0000 # U OP_SendSpellChecksum
#OP_LoginUnknown2=0x0000 # U OP_SendSkillCapsChecksum
# Petition Opcodes
OP_PetitionSearch=0x0000 # search term for petition
OP_PetitionSearchResults=0x0000 # (list of?) matches from search
OP_PetitionSearchText=0x0000 # text results of search
OP_PetitionUpdate=0x0000 #
OP_PetitionCheckout=0x0000 #
OP_PetitionCheckIn=0x0000 #
OP_PetitionQue=0x0000 #
OP_PetitionUnCheckout=0x0000 #
OP_PetitionDelete=0x0000 #
OP_DeletePetition=0x0000 #
OP_PetitionResolve=0x0000 #
OP_PDeletePetition=0x0000 #
OP_PetitionBug=0x0000 #
OP_PetitionRefresh=0x0000 #
OP_PetitionCheckout2=0x0000 #
OP_PetitionViewPetition=0x0000 #
# Login opcodes
OP_SessionReady=0x0000 #
OP_Login=0x0000 #
OP_ServerListRequest=0x0000 #
OP_PlayEverquestRequest=0x0000 #
OP_PlayEverquestResponse=0x0000 #
OP_ChatMessage=0x0000 #
OP_LoginAccepted=0x0000 #
OP_ServerListResponse=0x0000 #
OP_Poll=0x0000 #
OP_EnterChat=0x0000 #
OP_PollResponse=0x0000 #
# raw opcodes
OP_RAWSessionRequest=0x0000 #
OP_RAWSessionResponse=0x0000 #
OP_RAWCombined=0x0000 #
OP_RAWSessionDisconnect=0x0000 #
OP_RAWKeepAlive=0x0000 #
OP_RAWSessionStatRequest=0x0000 #
OP_RAWSessionStatResponse=0x0000 #
OP_RAWPacket=0x0000 #
OP_RAWFragment=0x0000 #
OP_RAWOutOfOrderAck=0x0000 #
OP_RAWAck=0x0000 #
OP_RAWAppCombined=0x0000 #
OP_RAWOutOfSession=0x0000 #
# we need to document the differences between these packets to make identifying them easier
OP_Some3ByteHPUpdate=0x0000 # initial HP update for mobs
OP_InitialHPUpdate=0x0000 #
@@ -0,0 +1,651 @@
# ShowEQ Import Notes:
# ZERO THE FILE first
# perl -pi -e 's/0x[0-9a-fA-F]{4}/0x0000/g' opcodes.conf
# Unknown Mapping:
# OP_Action2 -> OP_Damage
# OP_EnvDamage -> OP_Damage ---> might have been a one time mistake
# Name Differences:
# OP_CancelInvite -> OP_GroupCancelInvite
# OP_GMFind -> OP_FindPersonRequest
# OP_CommonMessage -> OP_ChannelMessage
OP_Unknown=0x0000
OP_ExploreUnknown=0x0000 used for unknown explorer
# world packets
# Required to reach Char Select:
OP_SendLoginInfo=0x11b6
OP_ApproveWorld=0x7e47
OP_LogServer=0x19ab
OP_SendCharInfo=0x06a2
OP_ExpansionInfo=0x711a
OP_GuildsList=0x2d38
OP_EnterWorld=0x57c3
OP_PostEnterWorld=0x0c3d
OP_World_Client_CRC1=0x0044
OP_World_Client_CRC2=0x26df
OP_SendSpellChecksum=0x0000
OP_SendSkillCapsChecksum=0x0000
# Character Select Related:
OP_SendMaxCharacters=0x5349
OP_SendMembership=0x03b2
OP_SendMembershipDetails=0x0b1f
OP_CharacterCreateRequest=0x006b
OP_CharacterCreate=0x0afc
OP_DeleteCharacter=0x0ab4
OP_RandomNameGenerator=0x4453
OP_ApproveName=0x213a
OP_MOTD=0x1ae3
OP_SetChatServer=0x2a81
OP_SetChatServer2=0x4099
OP_ZoneServerInfo=0x49d9
OP_WorldComplete=0x12d4
OP_WorldUnknown001=0x6be3
OP_FloatListThing=0x7a19
# Reasons for Disconnect:
OP_ZoneUnavail=0x6281
OP_WorldClientReady=0x43b0
OP_CharacterStillInZone=0x0000
OP_WorldChecksumFailure=0x0000
OP_WorldLoginFailed=0x0000
OP_WorldLogout=0x0000
OP_WorldLevelTooHigh=0x0000
OP_CharInacessable=0x0000
OP_UserCompInfo=0x0000
OP_SendExeChecksum=0x0000
OP_SendBaseDataChecksum=0x0000
# Zone in opcodes
OP_AckPacket=0x47a6
OP_ZoneEntry=0x1665
OP_ReqNewZone=0x3dec
OP_NewZone=0x7fff
OP_ZoneSpawns=0x0980
OP_PlayerProfile=0x46bb
OP_TimeOfDay=0x3be2
OP_LevelUpdate=0x7ce0
OP_Stamina=0x1949
OP_RequestClientZoneChange=0x647a
OP_ZoneChange=0x1eb4
OP_LockoutTimerInfo=0x0000
OP_ZoneServerReady=0x0000
OP_ZoneInUnknown=0x0000
OP_LogoutReply=0x0000
OP_PreLogoutReply=0x0000
# Required to fully log in
OP_SpawnAppearance=0x7360
OP_ChangeSize=0x355c
OP_TributeUpdate=0x2691
OP_TributeTimer=0x3294
OP_SendTributes=0x0a1c
OP_SendGuildTributes=0x1781
OP_TributeInfo=0x5dd2
OP_Weather=0x0bd7
OP_ReqClientSpawn=0x5a4f
OP_SpawnDoor=0x7b6c
OP_GroundSpawn=0x4286
OP_SendZonepoints=0x7922
OP_BlockedBuffs=0x5a71
OP_RemoveBlockedBuffs=0x78ba
OP_ClearBlockedBuffs=0x5d3c
OP_WorldObjectsSent=0x7fa8
OP_SendExpZonein=0x25ab
OP_SendAATable=0x7791
OP_RespondAA=0x379d
OP_UpdateAA=0x504f
OP_SendAAStats=0x3d1c
OP_AAExpUpdate=0x25c5
OP_ExpUpdate=0x47e3
OP_HPUpdate=0x07b8
OP_ManaChange=0x1e3b
OP_TGB=0x10a6
OP_SpecialMesg=0x362c
OP_GuildMemberList=0x4053
OP_GuildMOTD=0x0561
OP_CharInventory=0x786e
OP_WearChange=0x1ad3
OP_ClientUpdate=0x455d
OP_ClientReady=0x3f83 # 0x422d
OP_SetServerFilter=0x5b27
# Guild Opcodes - Disabled until crashes are resolved in RoF
OP_GetGuildMOTD=0x7ba3 # Was 0x35dc
OP_GetGuildMOTDReply=0x42a2 # Was 0x4586
OP_GuildMemberUpdate=0x0048 # Was 0x5643
OP_GuildInvite=0x5f8e
OP_GuildRemove=0x296d
OP_GuildPeace=0x17eb
OP_SetGuildMOTD=0x44d0
OP_GuildList=0x2d38
OP_GuildWar=0x395a
OP_GuildLeader=0x7c6f
OP_GuildDelete=0x241b
OP_GuildInviteAccept=0x78a5
OP_GuildDemote=0x3100
OP_GuildPublicNote=0x3c2c
OP_GuildManageBanker=0x096d # Was 0x0737
OP_GuildBank=0x2ab0 # Was 0x10c3
OP_SetGuildRank=0x3599
OP_GuildUpdateURLAndChannel=0x7851
OP_GuildStatus=0x25a5
OP_GuildCreate=0xd2d1 # or maybe 0x086e
OP_GuildMemberLevelUpdate=0x0000 # Unused?
OP_ZoneGuildList=0x0000 # Unused?
OP_GetGuildsList=0x0000 # Unused?
OP_LFGuild=0x0000
OP_GuildManageRemove=0x0000
OP_GuildManageAdd=0x0000
OP_GuildManageStatus=0x0000
# GM/Guide Opcodes
OP_GMServers=0x2612
OP_GMBecomeNPC=0x5201
OP_GMZoneRequest=0x69e5
OP_GMZoneRequest2=0x65d6
OP_GMGoto=0x0345
OP_GMSearchCorpse=0x5bed
OP_GMHideMe=0x4c65
OP_GMDelCorpse=0x6034
OP_GMApproval=0x0e37
OP_GMToggle=0x1276
OP_GMSummon=0x0655 # Was 0x684f
OP_GMEmoteZone=0x1b39 # Was 0x0655
OP_GMEmoteWorld=0x1f8c # Was 0x1935
OP_GMFind=0x6160
OP_GMKick=0x5646
OP_GMKill=0x507e
OP_GMNameChange=0x4434 # Was 0x51f7
OP_GMLastName=0x3077 # Was 0x4dd7
# Misc Opcodes
OP_InspectRequest=0x23f1
OP_InspectAnswer=0x5794
OP_InspectMessageUpdate=0x3064
OP_BeginCast=0x17ff
OP_BuffFadeMsg=0x41cb
OP_ConsentResponse=0x183d
OP_MemorizeSpell=0x2fac
OP_SwapSpell=0x4736
OP_CastSpell=0x1cb5
OP_Consider=0x4d8d
OP_FormattedMessage=0x6afe
OP_SimpleMessage=0x02a5
OP_Buff=0x08ed
OP_Illusion=0x6c43
OP_MoneyOnCorpse=0x1837
OP_RandomReply=0x6525
OP_DenyResponse=0x344a
OP_SkillUpdate=0x52c6
OP_GMTrainSkillConfirm=0x35cc # 0x3960
OP_RandomReq=0x59db
OP_Death=0x3a65
OP_GMTraining=0x6e8f
OP_GMEndTraining=0x7ffe
OP_GMTrainSkill=0x444c
OP_Animation=0x5e0c
OP_Begging=0x54ac
OP_Consent=0x400e
OP_ConsentDeny=0x34c1
OP_AutoFire=0x314e
OP_PetCommands=0x0093
OP_DeleteSpell=0x05dc
OP_Surname=0x1a87
OP_ClearSurname=0x17b6
OP_FaceChange=0x5b06
OP_SenseHeading=0x46c8
OP_Action=0x0ea7
OP_ConsiderCorpse=0x06c5
OP_HideCorpse=0x3c4b
OP_CorpseDrag=0x0be7
OP_CorpseDrop=0xdf77
OP_Bug=0x0c07
OP_Feedback=0x45ca
OP_Report=0x6d94
OP_Damage=0x5428
OP_ChannelMessage=0x33bc
OP_Assist=0x4cd1
OP_AssistGroup=0x63df
OP_MoveCoin=0x765a
OP_ZonePlayerToBind=0x7f99
OP_KeyRing=0x04ba
OP_WhoAllRequest=0x78eb
OP_WhoAllResponse=0x3393
OP_FriendsWho=0x3dac
OP_ConfirmDelete=0x78e0
OP_Logout=0x64bd
OP_Rewind=0x5521
OP_TargetCommand=0x000a
OP_Hide=0x2da1
OP_Jump=0x1d47
OP_Camp=0x41cd
OP_Emote=0x37fd
OP_SetRunMode=0x2ce6
OP_BankerChange=0x4e20
OP_TargetMouse=0x0e25
OP_MobHealth=0x218d
OP_InitialMobHealth=0x0000 # Unused?
OP_TargetHoTT=0x3af5
OP_XTargetResponse=0x7f64
OP_XTargetRequest=0x6753
OP_XTargetAutoAddHaters=0x5f51
OP_TargetBuffs=0x1c71
OP_BuffCreate=0x71f5
OP_BuffRemoveRequest=0x7efd
OP_DeleteSpawn=0x3b06
OP_AutoAttack=0x0d14
OP_AutoAttack2=0x3912
OP_Consume=0x4692
OP_MoveItem=0x62a2
OP_DeleteItem=0x3eb5
OP_DeleteCharge=0x2d5b
OP_ItemPacket=0x5e0e
OP_ItemLinkResponse=0x2fdb
OP_ItemLinkClick=0x0353
OP_ItemPreview=0x05cf
OP_NewSpawn=0x3f5b
OP_Track=0x7d43
OP_TrackTarget=0x4c42
OP_TrackUnknown=0x2395
OP_ClickDoor=0x7cc0
OP_MoveDoor=0x5611
OP_RemoveAllDoors=0x39c9
OP_EnvDamage=0x52e9
OP_BoardBoat=0x2731
OP_Forage=0x416d
OP_LeaveBoat=0x6cc1
OP_ControlBoat=0x4aa0
OP_SafeFallSuccess=0x6d27
OP_RezzComplete=0x3297
OP_RezzRequest=0x521b
OP_RezzAnswer=0x004e
OP_Shielding=0x17d9
OP_RequestDuel=0x1ea9
OP_MobRename=0x5040
OP_AugmentItem=0x1627 # Was 0x37cb
OP_WeaponEquip1=0x35c3
OP_WeaponEquip2=0x012f # Was 0x6022
OP_WeaponUnequip2=0x1076 # Was 0x0110
OP_ApplyPoison=0x1499
OP_Save=0x2e6f
OP_TestBuff=0x046e # Was 0x3772
OP_CustomTitles=0x471a
OP_Split=0x269e
OP_YellForHelp=0x0017
OP_LoadSpellSet=0x38b4
OP_Bandolier=0x2b6f
OP_PotionBelt=0x2d1b # Was 0x4d3b
OP_DuelResponse=0x0dee
OP_DuelResponse2=0x5e04
OP_SaveOnZoneReq=0x36b1
OP_ReadBook=0x383c
OP_Dye=0x62d8
OP_InterruptCast=0x7470
OP_AAAction=0x719a
OP_LeadershipExpToggle=0x3ea6
OP_LeadershipExpUpdate=0x6922
OP_PurchaseLeadershipAA=0x1962
OP_UpdateLeadershipAA=0x56aa
OP_MarkNPC=0x2d9f
OP_ClearNPCMarks=0x0d2d
OP_DelegateAbility=0x7820
OP_SetGroupTarget=0x118a
OP_Charm=0x7118
OP_Stun=0x53c0
OP_SendFindableNPCs=0x34c3
OP_FindPersonRequest=0x2f3b
OP_FindPersonReply=0x44f7
OP_Sound=0x3cec
OP_PetBuffWindow=0x7197
OP_LevelAppearance=0x7c4d
OP_Translocate=0x6f01
OP_Sacrifice=0x76ab
OP_PopupResponse=0x2fa1
OP_OnLevelMessage=0x09cd
OP_AugmentInfo=0x7812
OP_Petition=0x2885
OP_SomeItemPacketMaybe=0x11a0
OP_PVPStats=0x3034 # Unsure
OP_PVPLeaderBoardRequest=0x1bce
OP_PVPLeaderBoardReply=0x3e78
OP_PVPLeaderBoardDetailsRequest=0x46f4
OP_PVPLeaderBoardDetailsReply=0x6a60
OP_RestState=0x3ad5
OP_RespawnWindow=0x7767
OP_LDoNButton=0x596e
OP_SetStartCity=0x7936 # Was 0x2d1b
OP_VoiceMacroIn=0x202e
OP_VoiceMacroOut=0x3920
OP_ItemViewUnknown=0x0b64
OP_VetRewardsAvaliable=0x05d9
OP_VetClaimRequest=0xcdde
OP_VetClaimReply=0x361b
OP_DisciplineUpdate=0x2483 # Was 0x2f05
OP_DisciplineTimer=0x4933 # Was 0x5e3f
OP_BecomeCorpse=0x0000 # Unused?
OP_Action2=0x0000 # Unused?
OP_MobUpdate=0x6b5a
OP_NPCMoveUpdate=0x5bd9
OP_CameraEffect=0x5712
OP_SpellEffect=0x72b6
OP_RemoveNimbusEffect=0x3ba7
OP_AltCurrency=0x8fcb
OP_AltCurrencyMerchantRequest=0x7e3e
OP_AltCurrencyMerchantReply=0x0b60
OP_AltCurrencyPurchase=0x74a8
OP_AltCurrencySell=0x3167
OP_AltCurrencySellSelection=0x3c47
OP_AltCurrencyReclaim=0x46ed
OP_CrystalCountUpdate=0x5a82 # Was 0x3f60
OP_CrystalCreate=0x7616 # Was 0x5a82
OP_CrystalReclaim=0x73db # Was 0x7616
OP_Untargetable=0x7717
OP_IncreaseStats=0x0711
OP_Weblink=0x7cce
#OP_OpenInventory=0x0000 # Likely does not exist in RoF -U
OP_OpenContainer=0x654f
OP_DzQuit=0x5fc8
OP_DzListTimers=0x67b9
OP_DzAddPlayer=0x5ca2
OP_DzRemovePlayer=0x0dc1
OP_DzSwapPlayer=0x4995
OP_DzMakeLeader=0x17b2
OP_DzPlayerList=0x1aff
OP_DzJoinExpeditionConfirm=0x30df
OP_DzJoinExpeditionReply=0x15d4
OP_DzExpeditionInfo=0x3861
OP_DzExpeditionList=0x0b3b
OP_DzMemberStatus=0x26c2
OP_DzLeaderStatus=0x4021
OP_DzExpeditionEndsWarning=0x32eb
OP_DzMemberList=0x348f
OP_DzCompass=0x0e01 # Was 0x4f09
OP_DzChooseZone=0x0000 # Maybe 0x29d6
# New Opcodes
OP_SpawnPositionUpdate=0x0000 # Actually OP_MobUpdate ?
OP_ManaUpdate=0x6675
OP_EnduranceUpdate=0x71fb
OP_MobManaUpdate=0x48b5
OP_MobEnduranceUpdate=0x7cb5
# Mercenary Opcodes
OP_MercenaryDataUpdateRequest=0x6774
OP_MercenaryDataUpdate=0x5a7c
OP_MercenaryDataRequest=0x612e
OP_MercenaryDataResponse=0x0768
OP_MercenaryHire=0x18ba
OP_MercenaryDismiss=0x7ff4
OP_MercenaryTimerRequest=0x4326
OP_MercenaryUnknown1=0x7db4
OP_MercenaryCommand=0x7b21
OP_MercenarySuspendRequest=0x61b3
OP_MercenarySuspendResponse=0x5975
# Looting
OP_LootRequest=0x43a7
OP_EndLootRequest=0x3d8c
OP_LootItem=0x515b
OP_LootComplete=0x256d
# bazaar trader stuff:
OP_BazaarSearch=0x2ad2
OP_TraderDelItem=0x63c8
OP_BecomeTrader=0x74bc
OP_TraderShop=0x0a5e
OP_Trader=0x6790
OP_TraderBuy=0x0000
OP_Barter=0x6854
OP_ShopItem=0x0000
OP_BazaarInspect=0x0000
OP_Bazaar=0x0000
OP_TraderItemUpdate=0x0000
# pc/npc trading
OP_TradeRequest=0x5f9e
OP_TradeAcceptClick=0x13db
OP_TradeRequestAck=0x6852
OP_TradeCoins=0x584d
OP_FinishTrade=0x3fbf
OP_CancelTrade=0x0234
OP_TradeMoneyUpdate=0x65f6
OP_MoneyUpdate=0x6e42
OP_TradeBusy=0x7c6d
# Sent after canceling trade or after closing tradeskill object
OP_FinishWindow=0x1939
OP_FinishWindow2=0x68df
# Sent on Live for what seems to be item existance verification
# Ex. Before Right Click Effect happens from items
OP_ItemVerifyRequest=0x2c0c
OP_ItemVerifyReply=0x40de
# merchant stuff
OP_ShopPlayerSell=0x6b4d
OP_ShopRequest=0x16ba
OP_ShopEnd=0x0d07
OP_ShopEndConfirm=0x1860
OP_ShopPlayerBuy=0x3bab
OP_ShopDelItem=0x509c
# tradeskill stuff:
OP_ClickObject=0x7992
OP_ClickObjectAction=0x5507
OP_ClearObject=0x2ead
OP_RecipeDetails=0x7ad0
OP_RecipesFavorite=0x6960
OP_RecipesSearch=0x30f7
OP_RecipeReply=0x544e
OP_RecipeAutoCombine=0x46a4
OP_TradeSkillCombine=0x7447
# Tribute Packets:
OP_OpenGuildTributeMaster=0x107b
OP_OpenTributeMaster=0x6fed # Was 0x40f5
OP_SelectTribute=0x5513
OP_TributeItem=0x105b
OP_TributeMoney=0x4b6d # Was 0x6fed
OP_TributeToggle=0x1f50
OP_TributePointUpdate=0x01ec
OP_TributeNPC=0x0000
OP_GuildTributeInfo=0x0000
OP_OpenTributeReply=0x0000
OP_GuildTributeStatus=0x0000
# Adventure packets:
OP_LeaveAdventure=0x18b3
OP_AdventureFinish=0x3d8b
OP_AdventureInfoRequest=0x38db
OP_AdventureInfo=0x1036
OP_AdventureRequest=0x325c
OP_AdventureDetails=0x4975
OP_AdventureData=0x729b
OP_AdventureUpdate=0x2df4
OP_AdventureMerchantRequest=0x2aa0 # Was 654d
OP_AdventureMerchantResponse=0x5aed # Was 7949
OP_AdventureMerchantPurchase=0x725e # Was 155a
OP_AdventureMerchantSell=0x7882 # Was 389c
OP_AdventurePointsUpdate=0x37cb # Was 7589
OP_AdventureStatsRequest=0x68c2
OP_AdventureStatsReply=0x62fa
OP_AdventureLeaderboardRequest=0x577a
OP_AdventureLeaderboardReply=0x2533
# Group Opcodes
OP_GroupDisband=0x1ed0
OP_GroupInvite=0x1602
OP_GroupFollow=0x2789
OP_GroupUpdate=0x0ba4
OP_GroupUpdateB=0x5a07
OP_GroupCancelInvite=0x2b26
OP_GroupAcknowledge=0x5fae
OP_GroupDelete=0x33ca
OP_CancelInvite=0x2b26
OP_GroupFollow2=0x4964
OP_GroupInvite2=0x6e80
OP_GroupDisbandYou=0x623d
OP_GroupDisbandOther=0x74fa
OP_GroupLeaderChange=0x46fc
OP_GroupRoles=0x047c
OP_GroupMakeLeader=0x4129
OP_DoGroupLeadershipAbility=0x17d7
OP_GroupLeadershipAAUpdate=0x6567
# LFG/LFP Opcodes
OP_LFGCommand=0x4463
OP_LFGGetMatchesRequest=0x1373
OP_LFGGetMatchesResponse=0x31d8
OP_LFPGetMatchesRequest=0x7fd9
OP_LFPGetMatchesResponse=0x4111
OP_LFPCommand=0x6e8b
OP_LFGAppearance=0x0000
OP_LFGResponse=0x0000
# Raid Opcodes
OP_RaidInvite=0x1bd1
OP_RaidUpdate=0x548e
OP_RaidJoin=0x0000
# Button-push commands
OP_Taunt=0x0af6
OP_CombatAbility=0x6e4c
OP_SenseTraps=0x7462 # Was 0x2ee0
OP_PickPocket=0x047b
OP_DisarmTraps=0x0000
OP_Disarm=0x70a9
OP_Sneak=0x62f4
OP_Fishing=0x53c2
OP_InstillDoubt=0x63a5
OP_FeignDeath=0x677d
OP_Mend=0x324f
OP_Bind_Wound=0x585d
OP_LDoNOpen=0x3567
# Task packets
OP_TaskDescription=0x2294
OP_TaskActivity=0x7181
OP_CompletedTasks=0x9495
OP_TaskActivityComplete=0x71cd
OP_AcceptNewTask=0x394d
OP_CancelTask=0x0c7f
OP_TaskMemberList=0x748e # Was 0x1656
OP_OpenNewTasksWindow=0x436c # Was 0x11de
OP_AvaliableTask=0x2bf8 # Was 0x2377
OP_TaskHistoryRequest=0x6cf6
OP_TaskHistoryReply=0x25eb
OP_DeclineAllTasks=0x0000
# Title opcodes
OP_NewTitlesAvailable=0x45d1
OP_RequestTitles=0x1b5a
OP_SendTitleList=0x0d64
OP_SetTitle=0x0bfc
OP_SetTitleReply=0x7e20
# mail opcodes
OP_Command=0x0000
OP_MailboxHeader=0x0000
OP_MailHeader=0x0000
OP_MailBody=0x0000
OP_NewMail=0x0000
OP_SentConfirm=0x0000
########### Below this point should not be needed ###########
# This section are all unknown in Titanium
OP_ForceFindPerson=0x0000
OP_LocInfo=0x0000
OP_ReloadUI=0x0000
OP_ItemName=0x0000
OP_ItemLinkText=0x0000
OP_MultiLineMsg=0x0000
OP_MendHPUpdate=0x0000
OP_TargetReject=0x0000
OP_SafePoint=0x0000
OP_ApproveZone=0x0000
OP_ZoneComplete=0x0000
OP_ClientError=0x0000
OP_DumpName=0x0000
OP_Heartbeat=0x0000
OP_CrashDump=0x0000
OP_LoginComplete=0x0000
# discovered opcodes not yet used:
OP_PickLockSuccess=0x0000
OP_PlayMP3=0x0000
OP_ReclaimCrystals=0x0000
OP_DynamicWall=0x0000
OP_OpenDiscordMerchant=0x0000
OP_DiscordMerchantInventory=0x0000
OP_GiveMoney=0x0000
OP_RequestKnowledgeBase=0x0000
OP_KnowledgeBase=0x0000
OP_SlashAdventure=0x0000 # /adventure
OP_BecomePVPPrompt=0x0000
OP_MoveLogRequest=0x0000 # gone I think
OP_MoveLogDisregard=0x0000 # gone I think
# named unknowns, to make looking for real unknown easier
OP_AnnoyingZoneUnknown=0x0000
OP_Some6ByteHPUpdate=0x0000 seems to happen when you target group members
OP_QueryResponseThing=0x0000
# realityincarnate: these are just here to stop annoying several thousand byte packet dumps
#OP_LoginUnknown1=0x46d3 # OP_SendSpellChecksum
#OP_LoginUnknown2=0x040b # OP_SendSkillCapsChecksum
# Petition Opcodes
OP_PetitionSearch=0x0000 search term for petition
OP_PetitionSearchResults=0x0000 (list of?) matches from search
OP_PetitionSearchText=0x0000 text results of search
OP_PetitionUpdate=0x0000
OP_PetitionCheckout=0x0000
OP_PetitionCheckIn=0x0000
OP_PetitionQue=0x0000
OP_PetitionUnCheckout=0x0000
OP_PetitionDelete=0x0000
OP_DeletePetition=0x0000
OP_PetitionResolve=0x0000
OP_PDeletePetition=0x0000
OP_PetitionBug=0x0000
OP_PetitionRefresh=0x0000
OP_PetitionCheckout2=0x0000
OP_PetitionViewPetition=0x0000
# Login opcodes
OP_SessionReady=0x0000
OP_Login=0x0000
OP_ServerListRequest=0x0000
OP_PlayEverquestRequest=0x0000
OP_PlayEverquestResponse=0x0000
OP_ChatMessage=0x0000
OP_LoginAccepted=0x0000
OP_ServerListResponse=0x0000
OP_Poll=0x0000
OP_EnterChat=0x0000
OP_PollResponse=0x0000
# raw opcodes
OP_RAWSessionRequest=0x0000
OP_RAWSessionResponse=0x0000
OP_RAWCombined=0x0000
OP_RAWSessionDisconnect=0x0000
OP_RAWKeepAlive=0x0000
OP_RAWSessionStatRequest=0x0000
OP_RAWSessionStatResponse=0x0000
OP_RAWPacket=0x0000
OP_RAWFragment=0x0000
OP_RAWOutOfOrderAck=0x0000
OP_RAWAck=0x0000
OP_RAWAppCombined=0x0000
OP_RAWOutOfSession=0x0000
# we need to document the differences between these packets to make identifying them easier
OP_Some3ByteHPUpdate=0x0000 # initial HP update for mobs
OP_InitialHPUpdate=0x0000
@@ -0,0 +1,611 @@
# ShowEQ Import Notes:
# ZERO THE FILE first
# perl -pi -e 's/0x0000a-fA-F]{4}/0x0000/g' opcodes.conf
# Unknown Mapping:
# OP_Action2 -> OP_Damage
# OP_EnvDamage -> OP_Damage ---> might have been a one time mistake
# Name Differences:
# OP_CancelInvite -> OP_GroupCancelInvite
# OP_GMFind -> OP_FindPersonRequest
# OP_CommonMessage -> OP_ChannelMessage
OP_Unknown=0x0000
OP_ExploreUnknown=0x0000 # used for unknown explorer
# V = Verified correct
# C = Most likely correct
# U = Unsure, but should be correct or close
# world packets
# Required to reach Char Select:
OP_SendLoginInfo=0x6893 # was 0x2683
OP_ApproveWorld=0x115a # was 0x28a7
OP_LogServer=0x701f # was 0x224f
OP_SendCharInfo=0x1b85 # was 0x2c27
OP_ExpansionInfo=0x1771 # Same
OP_GuildsList=0x5b0b # Same
OP_EnterWorld=0x3288 # was 0x4f60
OP_PostEnterWorld=0x2f2c # was 0x570c
OP_World_Client_CRC1=0x0000 # C
OP_World_Client_CRC2=0x0000 # C
OP_SendSpellChecksum=0x0000 # C
OP_SendSkillCapsChecksum=0x0000 # C
# Character Select Related:
OP_DeleteCharacter=0x0000 # C
OP_CharacterCreateRequest=0x0000 # C
OP_CharacterCreate=0x0000 # C
OP_RandomNameGenerator=0x0000 # C 0x0000
OP_ApproveName=0x0000 # C
OP_MOTD=0x7312 # C 0x0000
OP_SetChatServer=0x698a #
OP_SetChatServer2=0x0000 # Not sent any more ?
OP_ZoneServerInfo=0x0479 # was 0x03cc
OP_WorldComplete=0x0d98 #
OP_WorldUnknown001=0x0000 # C 0x0000
OP_FloatListThing=0x0000 # V
# Reasons for Disconnect:
OP_ZoneUnavail=0x0000 # C 0x0000
OP_WorldClientReady=0x399b # C 0x0000
OP_CharacterStillInZone=0x0000 #
OP_WorldChecksumFailure=0x0000 #
OP_WorldLoginFailed=0x0000 #
OP_WorldLogout=0x0000 #
OP_WorldLevelTooHigh=0x0000 #
OP_CharInacessable=0x0000 #
OP_UserCompInfo=0x0000 #
# OP_SendExeChecksum=0x0000 #
# OP_SendBaseDataChecksum=0x0000 #
# Zone in opcodes
OP_AckPacket=0x3594 # was 0x3594
OP_ZoneEntry=0x002b # was 0x538f
OP_ReqNewZone=0x5ca5 # was 0x5ca5
OP_NewZone=0x0254 # was 0x0254
OP_ZoneSpawns=0x0000 # ?
OP_PlayerProfile=0x6022 # was 0x6022
OP_TimeOfDay=0x6015 # was 0x6015
OP_LevelUpdate=0x0000 # V
OP_Stamina=0x0000 # V
OP_RequestClientZoneChange=0x3fd2 # was 0x4178
OP_ZoneChange=0x0b93 # was 0x4a61
OP_LockoutTimerInfo=0x0000 #
OP_ZoneServerReady=0x0000 #
OP_ZoneInUnknown=0x0000 #
OP_LogoutReply=0x0000 #
OP_PreLogoutReply=0x0000 #
# Required to fully log in
OP_SpawnAppearance=0x7b64 # V
OP_TributeUpdate=0x4895 #
OP_TributeTimer=0x0000 # C
OP_TaskDescription=0x0000 # C
OP_TaskActivity=0x0000 # C
OP_CompletedTasks=0x0000 # C 0x0000
OP_Weather=0x7ce4 # was 0x0ed5
OP_SendAATable=0x466c #
OP_UpdateAA=0x0000 # V
OP_RespondAA=0x0000 # C 0x0000
OP_ReqClientSpawn=0x54e8 # was 0x6618
OP_SpawnDoor=0x6cfe #
OP_GroundSpawn=0x5f0d # was 0x5f0d
OP_SendZonepoints=0x5f51 # was 0x0ff4
OP_SendAAStats=0x0000 # C
OP_WorldObjectsSent=0x7b73 # was 0x7b73
OP_BlockedBuffs=0x664a # was 0x4027
OP_SendExpZonein=0x2c27 # was 0x1436
OP_SendTributes=0x0000 # V
OP_TributeInfo=0x0000 # V
OP_SendGuildTributes=0x0000 # C 0x0000
OP_AAExpUpdate=0x0000 # V
OP_ExpUpdate=0x0000 # V
OP_HPUpdate=0x0000 # V
OP_ManaChange=0x0000 # C
OP_TGB=0x0000 # C
OP_SpecialMesg=0x3bf5 # was 0x14ff
OP_GuildMemberList=0x0000 # C
OP_GuildMOTD=0x0000 # V
OP_CharInventory=0x307d #
OP_WearChange=0x0000 # V
OP_ClientUpdate=0x7062 # was 0x7062
OP_ClientReady=0x6cdc # was 0x6cdc
OP_SetServerFilter=0x0000 # V
# Guild Opcodes
OP_GetGuildMOTD=0x0000 # C
OP_GetGuildMOTDReply=0x0000 # C
OP_GuildMemberUpdate=0x0000 # C
OP_GuildInvite=0x0000 # C
OP_GuildRemove=0x0000 # C
OP_GuildPeace=0x0000 # C
OP_SetGuildMOTD=0x0000 # C
OP_GuildList=0x0000 # C
OP_GuildWar=0x0000 # C
OP_GuildLeader=0x0000 # C
OP_GuildDelete=0x0000 # C
OP_GuildInviteAccept=0x0000 # C
OP_GuildDemote=0x0000 # C
OP_GuildPublicNote=0x0000 # C
OP_GuildManageBanker=0x0000 # C
OP_GuildBank=0x0000 # C
OP_SetGuildRank=0x0000 # C
OP_GuildUpdateURLAndChannel=0x0000 # C
OP_GuildMemberLevelUpdate=0x0000 #
OP_ZoneGuildList=0x0000 #
OP_GetGuildsList=0x0000 #
# OP_GuildManageRemove=0x0000 #
# OP_GuildManageAdd=0x0000 #
# OP_GuildManageStatus=0x0000 #
# GM/guide opcodes
OP_GMServers=0x0000 # C
OP_GMBecomeNPC=0x0000 # C
OP_GMZoneRequest=0x6f79 # was 0x18ea
OP_GMZoneRequest2=0x02d6 # was 0x3ad9
OP_GMGoto=0x0000 # C
OP_GMSearchCorpse=0x0000 # C
OP_GMHideMe=0x0000 # C
OP_GMDelCorpse=0x0000 # C
OP_GMApproval=0x0000 # C
OP_GMToggle=0x0000 # C 0x0000
OP_GMSummon=0x0000 # C
OP_GMEmoteZone=0x0000 # C
OP_GMEmoteWorld=0x0000 # C
OP_GMFind=0x0000 # C
OP_GMKick=0x0000 # C
OP_GMKill=0x0000 # C
OP_GMNameChange=0x0000 # C
OP_GMLastName=0x0000 # C
OP_InspectAnswer=0x0000 # C
OP_BeginCast=0x0000 # C
OP_BuffFadeMsg=0x50c2 # C
OP_ConsentResponse=0x0000 # C
OP_MemorizeSpell=0x0000 # C
OP_SwapSpell=0x0000 # C
OP_CastSpell=0x7286 # C
OP_Consider=0x0000 # C
OP_FormattedMessage=0x0000 # C
OP_SimpleMessage=0x0000 # C 0x0000
OP_Buff=0x0000 # C
OP_Illusion=0x0000 # C
OP_MoneyOnCorpse=0x0000 # C
OP_RandomReply=0x0000 # C
OP_DenyResponse=0x0000 # C
OP_SkillUpdate=0x0000 # C
OP_GMTrainSkillConfirm=0x0000 # C
OP_RandomReq=0x0000 # C
OP_Death=0x0000 # C
OP_Bind_Wound=0x0000 # C
OP_GMTraining=0x0000 # C
OP_GMEndTraining=0x0000 # C
OP_GMTrainSkill=0x0000 # C
OP_Animation=0x0000 # Was 0x0000
OP_Begging=0x0000 # C
OP_Consent=0x0000 # C
OP_ConsentDeny=0x0000 # C
OP_AutoFire=0x0000 # C
OP_PetCommands=0x0000 # C
OP_DeleteSpell=0x0000 # C
OP_Surname=0x0000 # C
OP_ClearSurname=0x0000 # C
OP_FaceChange=0x0000 # C
OP_SenseHeading=0x0000 # C
OP_Action=0x1513 # C
OP_ConsiderCorpse=0x0000 # C
OP_HideCorpse=0x0000 # C 0x0000
OP_Bug=0x0000 # C
OP_Feedback=0x0000 # C
OP_Report=0x0000 # C
OP_Damage=0x7519 # C or OP_Action2?
OP_ChannelMessage=0x2e79 # was 0x2e79
OP_Assist=0x0000 # C
OP_AssistGroup=0x0000 # C
OP_MoveCoin=0x0000 # C
OP_ZonePlayerToBind=0x0000 # C
OP_KeyRing=0x0000 # C
OP_WhoAllRequest=0x0000 # C
OP_WhoAllResponse=0x0000 # C
OP_FriendsWho=0x0000 # C
OP_ConfirmDelete=0x0000 # V
OP_Logout=0x44ae # was 0x64ec
OP_Rewind=0x0000 # C
OP_TargetCommand=0x0000 # C Was 0x0000
OP_InspectRequest=0x0000 # C
OP_Hide=0x0000 # C
OP_Jump=0x0000 # C
OP_Camp=0x42ef # C
OP_Emote=0x0000 # C
OP_SetRunMode=0x0000 # C
OP_BankerChange=0x0000 # C
OP_TargetMouse=0x36f8 # C 0x0000
OP_MobHealth=0x0000 # C
OP_InitialMobHealth=0x0000 # C
OP_TargetHoTT=0x0000 # C
OP_TargetBuffs=0x0000 # C
OP_BuffCreate=0x6bfb # V
OP_DeleteSpawn=0x7434 # was 0x7434
OP_AutoAttack=0x0000 # C
OP_AutoAttack2=0x0000 # C
OP_Consume=0x0000 # V
OP_MoveItem=0x0000 # C
OP_DeleteItem=0x0000 # C
OP_DeleteCharge=0x0000 # C
OP_ItemPacket=0x7c87 #
OP_ItemLinkResponse=0x0000 # C
OP_ItemLinkClick=0x0000 # C
OP_NewSpawn=0x0000 # C
OP_Track=0x0000 # C
OP_TrackTarget=0x0000 # C
OP_TrackUnknown=0x0000 # C
OP_ClickDoor=0x470e # was 0x4f1f
OP_MoveDoor=0x48f9 # was 0x1516
OP_EnvDamage=0x0000 # C
OP_BoardBoat=0x0000 # C
OP_Forage=0x0000 # C
OP_LeaveBoat=0x0000 # C
OP_ControlBoat=0x0000 # C
OP_SafeFallSuccess=0x0000 # C
OP_RezzComplete=0x0000 # C
OP_RezzRequest=0x0000 # C
OP_RezzAnswer=0x0000 # C
OP_Shielding=0x0000 # C
OP_RequestDuel=0x0000 # C
OP_MobRename=0x0000 # C
OP_AugmentItem=0x0000 # C
OP_WeaponEquip1=0x0000 # C
OP_WeaponEquip2=0x0000 # C
OP_WeaponUnequip2=0x0000 # C
OP_ApplyPoison=0x0000 # C
OP_Save=0x0000 # C
OP_TestBuff=0x0000 # C
OP_CustomTitles=0x0000 # C
OP_Split=0x0000 # C
OP_YellForHelp=0x0000 # C
OP_LoadSpellSet=0x0000 # C
OP_Bandolier=0x0000 # C
OP_PotionBelt=0x0000 # C
OP_DuelResponse=0x0000 # C
OP_DuelResponse2=0x0000 # C
OP_SaveOnZoneReq=0x2913 # was 0x2913
OP_ReadBook=0x0000 # C
OP_Dye=0x0000 # C
OP_InterruptCast=0x0000 # C
OP_AAAction=0x0000 # C
OP_LeadershipExpToggle=0x0000 # C
OP_LeadershipExpUpdate=0x0000 # C
OP_PurchaseLeadershipAA=0x0000 # C
OP_UpdateLeadershipAA=0x0000 # C
OP_MarkNPC=0x0000 # C
OP_ClearNPCMarks=0x0000 # C
OP_DoGroupLeadershipAbility=0x0000 # C
OP_GroupLeadershipAAUpdate=0x0000 # C
OP_DelegateAbility=0x0000 # C
OP_SetGroupTarget=0x0000 # C
OP_Charm=0x0000 # C
OP_Stun=0x0000 # C
OP_SendFindableNPCs=0x49f6 # C
OP_FindPersonRequest=0x0000 # C
OP_FindPersonReply=0x0000 # C
OP_Sound=0x0000 # C
OP_PetBuffWindow=0x0000 # C
OP_LevelAppearance=0x0000 # C
OP_Translocate=0x0000 # C
OP_Sacrifice=0x0000 # C
OP_PopupResponse=0x0000 # C
OP_OnLevelMessage=0x0000 # C
OP_AugmentInfo=0x0000 # C
OP_Petition=0x0000 # C
OP_SomeItemPacketMaybe=0x4200 # C
OP_SomeItemPacketMaybe=0x0000 # C
OP_PVPStats=0x0000 # C
OP_PVPLeaderBoardRequest=0x0000 # C
OP_PVPLeaderBoardReply=0x0000 # C
OP_PVPLeaderBoardDetailsRequest=0x0000 # C
OP_PVPLeaderBoardDetailsReply=0x0000 # C
OP_RestState=0x0000 # C
OP_RespawnWindow=0x0000 # C
OP_DisciplineTimer=0x0000 # C
OP_LDoNButton=0x0000 # C
OP_SetStartCity=0x0000 # C
OP_VoiceMacroIn=0x0000 # C
OP_VoiceMacroOut=0x0000 # C
OP_ItemViewUnknown=0x0000 # C
OP_VetRewardsAvaliable=0x0000 # C Mispelled?
OP_VetClaimRequest=0x0000 # C
OP_VetClaimReply=0x0000 # C
OP_CrystalCountUpdate=0x0000 # C
OP_DisciplineUpdate=0x0000 #
OP_BecomeCorpse=0x0000 #
OP_Action2=0x0000 # C OP_Damage?
OP_MobUpdate=0x4656 # was 0x4656
OP_NPCMoveUpdate=0x5bad #
OP_CameraEffect=0x0000 # V
OP_SpellEffect=0x0000 # V
OP_DzQuit=0x0000
OP_DzListTimers=0x0000
OP_DzAddPlayer=0x0000
OP_DzRemovePlayer=0x0000
OP_DzSwapPlayer=0x0000
OP_DzMakeLeader=0x0000
OP_DzPlayerList=0x0000
OP_DzJoinExpeditionConfirm=0x0000
OP_DzJoinExpeditionReply=0x0000
OP_DzExpeditionInfo=0x0000
OP_DzMemberStatus=0x0000
OP_DzLeaderStatus=0x0000
OP_DzExpeditionEndsWarning=0x0000
OP_DzExpeditionList=0x0000
OP_DzMemberList=0x0000
OP_DzCompass=0x0000
OP_DzChooseZone=0x0000
# New Opcodes
OP_SpawnPositionUpdate=0x0000 # C
OP_ManaUpdate=0x0000 # C
OP_EnduranceUpdate=0x0000 # C
OP_MobManaUpdate=0x0000 # C
OP_MobEnduranceUpdate=0x0000 # C
# Looting
OP_LootRequest=0x0000 # C
OP_EndLootRequest=0x0000 # C
OP_LootItem=0x0000 # C
OP_LootComplete=0x0000 # C
# bazaar trader stuff stuff:
OP_BazaarSearch=0x0000 # C
OP_TraderDelItem=0x0000 # C
OP_BecomeTrader=0x0000 # C
OP_TraderShop=0x0000 # C
OP_Trader=0x0000 # C
OP_TraderBuy=0x0000 # C
OP_Barter=0x0000 # C
OP_ShopItem=0x0000 #
OP_BazaarInspect=0x0000 #
OP_Bazaar=0x0000 #
OP_TraderItemUpdate=0x0000 #
# pc/npc trading
OP_TradeRequest=0x0000 # C
OP_TradeAcceptClick=0x0000 # C
OP_TradeRequestAck=0x0000 # C
OP_TradeCoins=0x0000 # C
OP_FinishTrade=0x0000 # C
OP_CancelTrade=0x0000 # C
OP_TradeMoneyUpdate=0x0000 # C
OP_MoneyUpdate=0x0000 # C
OP_TradeBusy=0x0000 # C
# Sent after canceling trade or after closing tradeskill object
OP_FinishWindow=0x0000 # C
OP_FinishWindow2=0x0000 # C
# Sent on Live for what seems to be item existance verification
# Ex. Before Right Click Effect happens from items
OP_ItemVerifyRequest=0x0000 # C
OP_ItemVerifyReply=0x0000 # C
# merchant crap
OP_ShopPlayerSell=0x0000 # C
OP_ShopRequest=0x1044 # was 0x1044
OP_ShopEnd=0x3753 # was 0x3753
OP_ShopEndConfirm=0x0000 # C
OP_ShopPlayerBuy=0x0000 # C
OP_ShopDelItem=0x0000 # C
# tradeskill stuff:
OP_ClickObject=0x0000 # V
OP_ClickObjectAction=0x0000 # V
OP_ClearObject=0x0000 # C
OP_RecipeDetails=0x0000 # C
OP_RecipesFavorite=0x0000 # C
OP_RecipesSearch=0x0000 # C
OP_RecipeReply=0x0000 # C
OP_RecipeAutoCombine=0x0000 # C
OP_TradeSkillCombine=0x0000 # C
# Tribute Packets:
OP_OpenGuildTributeMaster=0x0000 # C
OP_OpenTributeMaster=0x0000 # C
OP_SelectTribute=0x0000 # C
OP_TributeItem=0x0000 # C
OP_TributeMoney=0x0000 # C
OP_TributeToggle=0x0000 # C
OP_TributePointUpdate=0x0000 # C
OP_TributeNPC=0x0000 #
OP_GuildTributeInfo=0x0000 #
OP_OpenTributeReply=0x0000 #
# OP_GuildTributeStatus=0x0000 #
# Adventure packets:
OP_LeaveAdventure=0x0000 # C
OP_AdventureFinish=0x0000 # C
OP_AdventureInfoRequest=0x0000 # C
OP_AdventureInfo=0x0000 # C
OP_AdventureRequest=0x0000 # C
OP_AdventureDetails=0x0000 # C
OP_AdventureData=0x0000 # C
OP_AdventureUpdate=0x0000 # C
OP_AdventureMerchantRequest=0x0000 # C
OP_AdventureMerchantResponse=0x0000 # C
OP_AdventureMerchantPurchase=0x0000 # C
OP_AdventureMerchantSell=0x0000 # C
OP_AdventurePointsUpdate=0x0000 # C
OP_AdventureStatsRequest=0x0000 # C
OP_AdventureStatsReply=0x0000 # C
OP_AdventureLeaderboardRequest=0x0000 # C
OP_AdventureLeaderboardReply=0x0000 # C
# Group Opcodes
OP_GroupDisband=0x0000 # C
OP_GroupInvite=0x0000 # C
OP_GroupFollow=0x0000 # C
OP_GroupUpdate=0x0000 # C
OP_GroupUpdateB=0x0000 # C
OP_GroupCancelInvite=0x0000 # C - Same as OP_CancelInvite?
OP_GroupAcknowledge=0x0000 # C
OP_GroupDelete=0x0000 #
OP_CancelInvite=0x0000 # C
OP_GroupFollow2=0x0000 # C
OP_GroupInvite2=0x0000 # C
OP_GroupDisbandYou=0x0000 # C
OP_GroupDisbandOther=0x0000 # C
OP_GroupLeaderChange=0x0000 # C
OP_GroupRoles=0x0000 # C
# LFG/LFP Opcodes
OP_LFGCommand=0x0000 # C
OP_LFGGetMatchesRequest=0x0000 # C
OP_LFGGetMatchesResponse=0x0000 # C
OP_LFPGetMatchesRequest=0x0000 # C
OP_LFPGetMatchesResponse=0x0000 # C
OP_LFPCommand=0x0000 # C
OP_LFGAppearance=0x0000 #
OP_LFGResponse=0x0000 #
# Raid Opcodes
OP_RaidInvite=0x0000 # C
OP_RaidUpdate=0x0000 # C
OP_RaidJoin=0x0000 #
# Button-push commands
OP_Taunt=0x0000 # C
OP_CombatAbility=0x0000 # C
OP_SenseTraps=0x0000 # C
OP_PickPocket=0x0000 # C
OP_DisarmTraps=0x0000 #
OP_Disarm=0x0000 # C
OP_Sneak=0x0000 # C
OP_Fishing=0x0000 # C
OP_InstillDoubt=0x0000 # C
OP_FeignDeath=0x0000 # C
OP_Mend=0x0000 # C
OP_LDoNOpen=0x0000 # C
# Task packets
OP_TaskActivityComplete=0x0000 # C
OP_TaskMemberList=0x0000 # C
OP_OpenNewTasksWindow=0x0000 # C
OP_AvaliableTask=0x0000 # C Mispelled?
OP_AcceptNewTask=0x0000 # C
OP_TaskHistoryRequest=0x0000 # C
OP_TaskHistoryReply=0x0000 # C
OP_CancelTask=0x0000 # C
OP_DeclineAllTasks=0x0000 #
# Title opcodes
OP_NewTitlesAvailable=0x0000 # C
OP_RequestTitles=0x0000 # C
OP_SendTitleList=0x0000 # C
OP_SetTitle=0x0000 # C
OP_SetTitleReply=0x0000 # C
# mail opcodes
OP_Command=0x0000 #
OP_MailboxHeader=0x0000 #
OP_MailHeader=0x0000 #
OP_MailBody=0x0000 #
OP_NewMail=0x0000 #
OP_SentConfirm=0x0000 #
# # # # # # # # # # # Below this point should not be needed # # # # # # # # # # #
# This section are all unknown in Titanium
OP_ForceFindPerson=0x0000 #
OP_LocInfo=0x0000 #
OP_ReloadUI=0x0000 #
OP_ItemName=0x0000 #
OP_ItemLinkText=0x0000 #
OP_MultiLineMsg=0x0000 #
OP_MendHPUpdate=0x0000 #
OP_TargetReject=0x0000 #
OP_SafePoint=0x0000 #
OP_IncreaseStats=0x0000 #
OP_ApproveZone=0x0000 #
OP_ZoneComplete=0x0000 #
OP_ClientError=0x0000 #
OP_DumpName=0x0000 #
OP_Heartbeat=0x0000 #
OP_CrashDump=0x0000 #
OP_LoginComplete=0x0000 #
# discovered opcodes not yet used:
OP_PickLockSuccess=0x0000 #
OP_PlayMP3=0x0000 #
OP_ReclaimCrystals=0x0000 #
OP_DynamicWall=0x0000 #
OP_OpenDiscordMerchant=0x0000 #
OP_DiscordMerchantInventory=0x0000 #
OP_GiveMoney=0x0000 #
OP_RequestKnowledgeBase=0x0000 #
OP_KnowledgeBase=0x0000 #
OP_SlashAdventure=0x0000 # /adventure
OP_BecomePVPPrompt=0x0000 #
OP_MoveLogRequest=0x0000 # gone I think
OP_MoveLogDisregard=0x0000 # gone I think
# named unknowns, to make looking for real unknown easier
OP_AnnoyingZoneUnknown=0x0000 #
OP_Some6ByteHPUpdate=0x0000 # seems to happen when you target group members
OP_QueryResponseThing=0x0000 #
# realityincarnate: these are just here to stop annoying several thousand byte packet dumps
#OP_LoginUnknown1=0x0000 # U OP_SendSpellChecksum
#OP_LoginUnknown2=0x0000 # U OP_SendSkillCapsChecksum
# Petition Opcodes
OP_PetitionSearch=0x0000 # search term for petition
OP_PetitionSearchResults=0x0000 # (list of?) matches from search
OP_PetitionSearchText=0x0000 # text results of search
OP_PetitionUpdate=0x0000 #
OP_PetitionCheckout=0x0000 #
OP_PetitionCheckIn=0x0000 #
OP_PetitionQue=0x0000 #
OP_PetitionUnCheckout=0x0000 #
OP_PetitionDelete=0x0000 #
OP_DeletePetition=0x0000 #
OP_PetitionResolve=0x0000 #
OP_PDeletePetition=0x0000 #
OP_PetitionBug=0x0000 #
OP_PetitionRefresh=0x0000 #
OP_PetitionCheckout2=0x0000 #
OP_PetitionViewPetition=0x0000 #
# Login opcodes
OP_SessionReady=0x0000 #
OP_Login=0x0000 #
OP_ServerListRequest=0x0000 #
OP_PlayEverquestRequest=0x0000 #
OP_PlayEverquestResponse=0x0000 #
OP_ChatMessage=0x0000 #
OP_LoginAccepted=0x0000 #
OP_ServerListResponse=0x0000 #
OP_Poll=0x0000 #
OP_EnterChat=0x0000 #
OP_PollResponse=0x0000 #
# raw opcodes
OP_RAWSessionRequest=0x0000 #
OP_RAWSessionResponse=0x0000 #
OP_RAWCombined=0x0000 #
OP_RAWSessionDisconnect=0x0000 #
OP_RAWKeepAlive=0x0000 #
OP_RAWSessionStatRequest=0x0000 #
OP_RAWSessionStatResponse=0x0000 #
OP_RAWPacket=0x0000 #
OP_RAWFragment=0x0000 #
OP_RAWOutOfOrderAck=0x0000 #
OP_RAWAck=0x0000 #
OP_RAWAppCombined=0x0000 #
OP_RAWOutOfSession=0x0000 #
# we need to document the differences between these packets to make identifying them easier
OP_Some3ByteHPUpdate=0x0000 # initial HP update for mobs
OP_InitialHPUpdate=0x0000 #
OP_OPCode2511=0x2511
@@ -0,0 +1,653 @@
# ShowEQ Import Notes:
# ZERO THE FILE first
# perl -pi -e 's/0x[0-9a-fA-F]{4}/0x0000/g' opcodes.conf
# Unknown Mapping:
# OP_Action2 -> OP_Damage
# OP_EnvDamage -> OP_Damage ---> might have been a one time mistake
# Name Differences:
# OP_CancelInvite -> OP_GroupCancelInvite
# OP_GMFind -> OP_FindPersonRequest
# OP_CommonMessage -> OP_ChannelMessage
OP_Unknown=0x0000
OP_ExploreUnknown=0x0000 used for unknown explorer
# world packets
# Required to reach Char Select:
OP_SendLoginInfo=0x5e9e
OP_ApproveWorld=0x5a47
OP_LogServer=0x0c30
OP_SendCharInfo=0x03cc
OP_ExpansionInfo=0x3c7a
OP_GuildsList=0x12bc
OP_EnterWorld=0x74de
OP_PostEnterWorld=0x6e03
OP_World_Client_CRC1=0x2625
OP_World_Client_CRC2=0x0799
OP_SendSpellChecksum=0x0000
OP_SendSkillCapsChecksum=0x0000
# Character Select Related:
OP_SendMaxCharacters=0x11be
OP_SendMembership=0x76f8
OP_SendMembershipDetails=0x7475
OP_CharacterCreateRequest=0x37c2
OP_CharacterCreate=0x56aa
OP_DeleteCharacter=0x4572
OP_RandomNameGenerator=0x045b
OP_ApproveName=0x077e
OP_MOTD=0x4c33
OP_SetChatServer=0x5b4c
OP_SetChatServer2=0x70b3
OP_ZoneServerInfo=0x559f
OP_WorldComplete=0x0d7c
OP_WorldUnknown001=0x0b85
OP_FloatListThing=0x15f4
# Reasons for Disconnect:
OP_ZoneUnavail=0x4a6f
OP_WorldClientReady=0x27f4
OP_CharacterStillInZone=0x0000
OP_WorldChecksumFailure=0x0000
OP_WorldLoginFailed=0x0000
OP_WorldLogout=0x0000
OP_WorldLevelTooHigh=0x0000
OP_CharInacessable=0x0000
OP_UserCompInfo=0x0000
OP_SendExeChecksum=0x0000
OP_SendBaseDataChecksum=0x0000
# Zone in opcodes
OP_AckPacket=0x5ee8
OP_ZoneEntry=0x2cbe
OP_ReqNewZone=0x724c
OP_NewZone=0x082d
OP_ZoneSpawns=0x173c
OP_PlayerProfile=0x6725
OP_TimeOfDay=0x2d98
OP_LevelUpdate=0x698e
OP_Stamina=0x54fb
OP_RequestClientZoneChange=0x029d
OP_ZoneChange=0x499e
OP_LockoutTimerInfo=0x0000
OP_ZoneServerReady=0x0000
OP_ZoneInUnknown=0x0000
OP_LogoutReply=0x0000
OP_PreLogoutReply=0x0000
# Required to fully log in
OP_SpawnAppearance=0x6087
OP_ChangeSize=0x0aad
OP_TributeUpdate=0x5026
OP_TributeTimer=0x2027
OP_SendTributes=0x38ef
OP_SendGuildTributes=0x115f
OP_TributeInfo=0x7097
OP_Weather=0x1a00
OP_ReqClientSpawn=0x6cd1
OP_SpawnDoor=0x0e70
OP_GroundSpawn=0x11ef
OP_SendZonepoints=0x0a1d
OP_BlockedBuffs=0x6095
OP_RemoveBlockedBuffs=0x02cc
OP_ClearBlockedBuffs=0x1b26
OP_WorldObjectsSent=0x3f13
OP_SendExpZonein=0x7303
OP_SendAATable=0x6b93
OP_RespondAA=0x5a5c
OP_UpdateAA=0x1820
OP_SendAAStats=0x6c5d
OP_AAExpUpdate=0x0eae
OP_ExpUpdate=0x7814
OP_HPUpdate=0x069e
OP_ManaChange=0x0a79
OP_TGB=0x2f0a
OP_SpecialMesg=0x7d12
OP_GuildMemberList=0x210b
OP_GuildMOTD=0x7864
OP_CharInventory=0x4cd2
OP_WearChange=0x6a1a
OP_ClientUpdate=0x6cc2
OP_ClientReady=0x2bd4 # 0x422d
OP_SetServerFilter=0x59ab
# Guild Opcodes - Disabled until crashes are resolved in RoF
OP_GetGuildMOTD=0x58dd # Was 0x35dc
OP_GetGuildMOTDReply=0x45d5 # Was 0x4586
OP_GuildMemberUpdate=0x6719 # Was 0x5643
OP_GuildInvite=0x37d8
OP_GuildRemove=0x0e16
OP_GuildPeace=0x25c1
OP_SetGuildMOTD=0x0b26
OP_GuildList=0x0000
OP_GuildWar=0x56fd
OP_GuildLeader=0x38cf
OP_GuildDelete=0x7135
OP_GuildInviteAccept=0x3277
OP_GuildDemote=0x3798
OP_GuildPublicNote=0x36e2
OP_GuildManageBanker=0x3ff3 # Was 0x0737
OP_GuildBank=0x372e # Was 0x10c3
OP_SetGuildRank=0x3d22
OP_GuildUpdateURLAndChannel=0x6f0c
OP_GuildStatus=0x423b
OP_GuildCreate=0x057e # or maybe 0x086e
OP_GuildMemberLevelUpdate=0x0000 # Unused?
OP_ZoneGuildList=0x0000 # Unused?
OP_GetGuildsList=0x0000 # Unused?
OP_LFGuild=0x0000
OP_GuildManageRemove=0x0000
OP_GuildManageAdd=0x0000
OP_GuildManageStatus=0x0000
# GM/Guide Opcodes
OP_GMServers=0x362a
OP_GMBecomeNPC=0x783b
OP_GMZoneRequest=0x6028
OP_GMZoneRequest2=0x4cc5
OP_GMGoto=0x4234
OP_GMSearchCorpse=0x0ac5
OP_GMHideMe=0x39a2
OP_GMDelCorpse=0x2885
OP_GMApproval=0x5e62
OP_GMToggle=0x1c2c
OP_GMSummon=0x1b2a # Was 0x684f
OP_GMEmoteZone=0x54da # Was 0x0655
OP_GMEmoteWorld=0x32ee # Was 0x1935
OP_GMFind=0x3f2c
OP_GMKick=0x4bd5
OP_GMKill=0x2591
OP_GMNameChange=0x1e00 # Was 0x4434
OP_GMLastName=0x0c17 # Was 0x3077
# Misc Opcodes
OP_InspectRequest=0x5440
OP_InspectAnswer=0x31e3
OP_InspectMessageUpdate=0x351a
OP_BeginCast=0x0b2b
OP_BuffFadeMsg=0x0076
OP_ConsentResponse=0x7903
OP_MemorizeSpell=0x5dbc
OP_SwapSpell=0x2642
OP_CastSpell=0x0e18
OP_Consider=0x0fcd
OP_FormattedMessage=0x748e
OP_SimpleMessage=0x3ecd
OP_Buff=0x1a9b
OP_Illusion=0x359a
OP_MoneyOnCorpse=0x1107
OP_RandomReply=0x5cc5
OP_DenyResponse=0x3c2d
OP_SkillUpdate=0x7eb4
OP_GMTrainSkillConfirm=0x157c # 0x3960
OP_RandomReq=0x4fd0
OP_Death=0x62bd
OP_GMTraining=0x6f12
OP_GMEndTraining=0x6f0a
OP_GMTrainSkill=0x2082
OP_Animation=0x62f1
OP_Begging=0x1a49
OP_Consent=0x5b9e
OP_ConsentDeny=0x56ae
OP_AutoFire=0x479d
OP_PetCommands=0x46a0
OP_DeleteSpell=0x27da
OP_Surname=0x5dd0
OP_ClearSurname=0x5900
OP_FaceChange=0x474e
OP_SenseHeading=0x2a34
OP_Action=0x16a5
OP_ConsiderCorpse=0x1683
OP_HideCorpse=0x1102
OP_CorpseDrag=0x32cc
OP_CorpseDrop=0x1224
OP_Bug=0x41ac
OP_Feedback=0x3c4a
OP_Report=0x1b2f
OP_Damage=0x1375
OP_ChannelMessage=0x0cf4
OP_Assist=0x50c5
OP_AssistGroup=0x7f67
OP_MoveCoin=0x6928
OP_ZonePlayerToBind=0x5a82
OP_KeyRing=0x566e
OP_WhoAllRequest=0x0033
OP_WhoAllResponse=0x68f6
OP_FriendsWho=0x5988
OP_ConfirmDelete=0x51d3
OP_Logout=0x627f
OP_Rewind=0x29c7
OP_TargetCommand=0x6952
OP_Hide=0x5d4d
OP_Jump=0x7611
OP_Camp=0x4863
OP_Emote=0x0bff
OP_SetRunMode=0x26b3
OP_BankerChange=0x36a6
OP_TargetMouse=0x02f7
OP_MobHealth=0x217a
OP_InitialMobHealth=0x0000 # Unused?
OP_TargetHoTT=0x1fd6
OP_XTargetResponse=0x6d47
OP_XTargetRequest=0x2603
OP_XTargetAutoAddHaters=0x5fe3
OP_TargetBuffs=0x4c77
OP_BuffCreate=0x20ee
OP_BuffRemoveRequest=0x7ca3
OP_DeleteSpawn=0x0ead
OP_AutoAttack=0x12fb
OP_AutoAttack2=0x1763
OP_Consume=0x6aa6
OP_MoveItem=0x68a2
OP_DeleteItem=0x46c4
OP_DeleteCharge=0x6933
OP_ItemPacket=0x5ae8
OP_ItemLinkResponse=0x2d88
OP_ItemLinkClick=0x7404
OP_ItemPreview=0x198c
OP_NewSpawn=0x56e9
OP_Track=0x3089
OP_TrackTarget=0x31d4
OP_TrackUnknown=0x50b2
OP_ClickDoor=0x0cc4
OP_MoveDoor=0x3162
OP_RemoveAllDoors=0x0712
OP_EnvDamage=0x4a49
OP_BoardBoat=0x10b0
OP_Forage=0x02ed
OP_LeaveBoat=0x398e
OP_ControlBoat=0x1793
OP_SafeFallSuccess=0x1c7e
OP_RezzComplete=0x62d6
OP_RezzRequest=0x095b
OP_RezzAnswer=0x4b2c
OP_Shielding=0x2b69
OP_RequestDuel=0x24d4
OP_MobRename=0x7658
OP_AugmentItem=0x7ba5 # Was 0x37cb
OP_WeaponEquip1=0x34bc
OP_WeaponEquip2=0x6f7e # Was 0x6022
OP_WeaponUnequip2=0x1343 # Was 0x0110
OP_ApplyPoison=0x7d23
OP_Save=0x27d9
OP_TestBuff=0x61f9 # Was 0x3772
OP_CustomTitles=0x475f
OP_Split=0x5e9a
OP_YellForHelp=0x0696
OP_LoadSpellSet=0x6208
OP_Bandolier=0x7cf8
OP_PotionBelt=0x3cf9 # Was 0x4d3b
OP_DuelResponse=0x4f58
OP_DuelResponse2=0x3455
OP_SaveOnZoneReq=0x0070
OP_ReadBook=0x25b0
OP_Dye=0x11a8
OP_InterruptCast=0x14b2
OP_AAAction=0x183b
OP_LeadershipExpToggle=0x75b0
OP_LeadershipExpUpdate=0x0e8f
OP_PurchaseLeadershipAA=0x4269
OP_UpdateLeadershipAA=0x4fc0
OP_MarkNPC=0x13d3
OP_ClearNPCMarks=0x1593
OP_DelegateAbility=0x100f
OP_SetGroupTarget=0x2de8
OP_Charm=0x5978
OP_Stun=0x04bd
OP_SendFindableNPCs=0x7b8a
OP_FindPersonRequest=0x5d79
OP_FindPersonReply=0x2b23
OP_Sound=0x03fa
OP_PetBuffWindow=0x1e1c
OP_LevelAppearance=0x0442
OP_Translocate=0x2e84
OP_Sacrifice=0x0d88
OP_PopupResponse=0x04f7
OP_OnLevelMessage=0x6a6b
OP_AugmentInfo=0x1fce
OP_Petition=0x152e
OP_SomeItemPacketMaybe=0x6ce8
OP_PVPStats=0x125a # Unsure
OP_PVPLeaderBoardRequest=0x673e
OP_PVPLeaderBoardReply=0x66fd
OP_PVPLeaderBoardDetailsRequest=0x6bbf
OP_PVPLeaderBoardDetailsReply=0x78bd
OP_RestState=0x0812
OP_RespawnWindow=0x3594
OP_LDoNButton=0x1071
OP_SetStartCity=0x2f81 # Was 0x2d1b
OP_VoiceMacroIn=0x7ed5
OP_VoiceMacroOut=0x72ed
OP_ItemViewUnknown=0x1915
OP_VetRewardsAvaliable=0xbdf1
OP_VetClaimRequest=0x1711
OP_VetClaimReply=0x7497
OP_DisciplineUpdate=0x594d # Was 0x2f05
OP_DisciplineTimer=0x2dab # Was 0x5e3f
OP_BecomeCorpse=0x0000 # Unused?
OP_Action2=0x0000 # Unused?
OP_MobUpdate=0x282a
OP_NPCMoveUpdate=0x7342
OP_CameraEffect=0x1cee
OP_SpellEffect=0x2a61
OP_RemoveNimbusEffect=0x4f63
OP_AltCurrency=0x0852
OP_AltCurrencyMerchantRequest=0x2efc
OP_AltCurrencyMerchantReply=0x13fb
OP_AltCurrencyPurchase=0x3e5a
OP_AltCurrencySell=0x24b3
OP_AltCurrencySellSelection=0x0019
OP_AltCurrencyReclaim=0x7f65
OP_CrystalCountUpdate=0x0a13 # Was 0x3f60
OP_CrystalCreate=0x1e17 # Was 0x5a82
OP_CrystalReclaim=0x22f6 # Was 0x7616
OP_Untargetable=0x46e0
OP_IncreaseStats=0x598c
OP_Weblink=0x6f7f
#OP_OpenInventory=0x0000 # Likely does not exist in RoF -U
OP_OpenContainer=0x0000
OP_DzQuit=0x4839
OP_DzListTimers=0x0e73
OP_DzAddPlayer=0x3b05
OP_DzRemovePlayer=0x68e7
OP_DzSwapPlayer=0x75ee
OP_DzMakeLeader=0x7703
OP_DzPlayerList=0x76bb
OP_DzJoinExpeditionConfirm=0x3c5b
OP_DzJoinExpeditionReply=0x7410
OP_DzExpeditionInfo=0x6ba0
OP_DzExpeditionList=0x1d95
OP_DzMemberStatus=0x23b6
OP_DzLeaderStatus=0x6835
OP_DzExpeditionEndsWarning=0x75ea
OP_DzMemberList=0x1a45
OP_DzCompass=0x188f # Was 0x4f09
OP_DzChooseZone=0x0000 # Maybe 0x29d6
# New Opcodes
OP_SpawnPositionUpdate=0x0000 # Actually OP_MobUpdate ?
OP_ManaUpdate=0x0396
OP_EnduranceUpdate=0x7b61
OP_MobManaUpdate=0x0247
OP_MobEnduranceUpdate=0x7902
# Mercenary Opcodes
OP_MercenaryDataUpdateRequest=0x65fc
OP_MercenaryDataUpdate=0x23de
OP_MercenaryDataRequest=0x306a
OP_MercenaryDataResponse=0xbdb8
OP_MercenaryHire=0x0453
OP_MercenaryDismiss=0x3cfc
OP_MercenaryTimerRequest=0x1357
OP_MercenaryTimer=0x54f5
OP_MercenaryUnknown1=0x319c
OP_MercenaryCommand=0x6d04
OP_MercenarySuspendRequest=0x3a36
OP_MercenarySuspendResponse=0x4f8a
OP_MercenaryUnsuspendResponse=0x295a
# Looting
OP_LootRequest=0x27fb
OP_EndLootRequest=0x29e7
OP_LootItem=0x1aea
OP_LootComplete=0x917c
# bazaar trader stuff:
OP_BazaarSearch=0x4fa8
OP_TraderDelItem=0x0000
OP_BecomeTrader=0x6a33
OP_TraderShop=0x1faa
OP_Trader=0x27c6 # Was 0x6790
OP_TraderBuy=0x0000
OP_Barter=0x760c
OP_ShopItem=0x0000
OP_BazaarInspect=0x0000
OP_Bazaar=0x0000
OP_TraderItemUpdate=0x0000
# pc/npc trading
OP_TradeRequest=0x0b3f
OP_TradeAcceptClick=0x1ac5
OP_TradeRequestAck=0x3aa1
OP_TradeCoins=0x0ef7
OP_FinishTrade=0x0e46
OP_CancelTrade=0x7edb
OP_TradeMoneyUpdate=0x3755
OP_MoneyUpdate=0x325f
OP_TradeBusy=0x31c2
# Sent after canceling trade or after closing tradeskill object
OP_FinishWindow=0x3b51
OP_FinishWindow2=0x0f8e
# Sent on Live for what seems to be item existance verification
# Ex. Before Right Click Effect happens from items
OP_ItemVerifyRequest=0x6089
OP_ItemVerifyReply=0x73fc
# merchant stuff
OP_ShopPlayerSell=0x1456
OP_ShopRequest=0x1799
OP_ShopEnd=0x1a56
OP_ShopEndConfirm=0x5628
OP_ShopPlayerBuy=0xad00
OP_ShopDelItem=0x4420
# tradeskill stuff:
OP_ClickObject=0x7f78
OP_ClickObjectAction=0x7283
OP_ClearObject=0x10ea
OP_RecipeDetails=0x2251
OP_RecipesFavorite=0x1665
OP_RecipesSearch=0x11d6
OP_RecipeReply=0x1045
OP_RecipeAutoCombine=0x588f
OP_TradeSkillCombine=0x556b
# Tribute Packets:
OP_OpenGuildTributeMaster=0x57e4
OP_OpenTributeMaster=0x472d # Was 0x40f5
OP_SelectTribute=0x75e3
OP_TributeItem=0x5789
OP_TributeMoney=0x7d50 # Was 0x6fed
OP_TributeToggle=0x0e59
OP_TributePointUpdate=0x0dff
OP_TributeNPC=0x0000
OP_GuildTributeInfo=0x0000
OP_OpenTributeReply=0x0000
OP_GuildTributeStatus=0x0000
# Adventure packets:
OP_LeaveAdventure=0x7d78
OP_AdventureFinish=0x2ddc
OP_AdventureInfoRequest=0x1780
OP_AdventureInfo=0x099a
OP_AdventureRequest=0x101b
OP_AdventureDetails=0x3a56
OP_AdventureData=0x18d0
OP_AdventureUpdate=0x255c
OP_AdventureMerchantRequest=0x4383 # Was 654d
OP_AdventureMerchantResponse=0x0975 # Was 7949
OP_AdventureMerchantPurchase=0x2681 # Was 155a
OP_AdventureMerchantSell=0x0529 # Was 389c
OP_AdventurePointsUpdate=0x75cb # Was 7589
OP_AdventureStatsRequest=0x7451
OP_AdventureStatsReply=0x1595
OP_AdventureLeaderboardRequest=0x1099
OP_AdventureLeaderboardReply=0x1f56
# Group Opcodes
OP_GroupDisband=0x351e
OP_GroupInvite=0x7cd7
OP_GroupFollow=0x352b
OP_GroupUpdate=0x2244
OP_GroupUpdateB=0x20d5
OP_GroupCancelInvite=0x0000
OP_GroupAcknowledge=0x3391
OP_GroupDelete=0x3e4c
OP_CancelInvite=0x5e6d
OP_GroupFollow2=0x63b4
OP_GroupInvite2=0x33e8
OP_GroupDisbandYou=0x79d6
OP_GroupDisbandOther=0x65c0
OP_GroupLeaderChange=0x626d
OP_GroupRoles=0x3438
OP_GroupMakeLeader=0x3188
OP_DoGroupLeadershipAbility=0x302d
OP_GroupLeadershipAAUpdate=0x71bd
# LFG/LFP Opcodes
OP_LFGCommand=0x4fed
OP_LFGGetMatchesRequest=0x236c
OP_LFGGetMatchesResponse=0x18fb
OP_LFPGetMatchesRequest=0x1a28
OP_LFPGetMatchesResponse=0x5daa
OP_LFPCommand=0x6751
OP_LFGAppearance=0x0000
OP_LFGResponse=0x0000
# Raid Opcodes
OP_RaidInvite=0x7383
OP_RaidUpdate=0x0594
OP_RaidJoin=0x0000
# Button-push commands
OP_Taunt=0x56df
OP_CombatAbility=0x31f9
OP_SenseTraps=0x555b # Was 0x2ee0
OP_PickPocket=0x3f61
OP_DisarmTraps=0x0000
OP_Disarm=0x0efe
OP_Sneak=0x4631
OP_Fishing=0x46e3
OP_InstillDoubt=0x2980
OP_FeignDeath=0x6a76
OP_Mend=0x54fe
OP_Bind_Wound=0x5066
OP_LDoNOpen=0x0173
# Task packets
OP_TaskDescription=0x0736
OP_TaskActivity=0x74a1
OP_CompletedTasks=0x7392
OP_TaskActivityComplete=0x44a6
OP_AcceptNewTask=0x1bbf
OP_CancelTask=0x590b
OP_TaskMemberList=0x0e5c # Was 0x1656
OP_OpenNewTasksWindow=0x22ac # Was 0x11de
OP_AvaliableTask=0x12cd # Was 0x2377
OP_TaskHistoryRequest=0x1489
OP_TaskHistoryReply=0x2d43
OP_DeclineAllTasks=0x0000
# Title opcodes
OP_NewTitlesAvailable=0x21d0
OP_RequestTitles=0x6b48
OP_SendTitleList=0x6af1
OP_SetTitle=0x6d7b
OP_SetTitleReply=0x41ef
# mail opcodes
OP_Command=0x0000
OP_MailboxHeader=0x0000
OP_MailHeader=0x0000
OP_MailBody=0x0000
OP_NewMail=0x0000
OP_SentConfirm=0x0000
########### Below this point should not be needed ###########
# This section are all unknown in Titanium
OP_ForceFindPerson=0x0000
OP_LocInfo=0x0000
OP_ReloadUI=0x0000
OP_ItemName=0x0000
OP_ItemLinkText=0x0000
OP_MultiLineMsg=0x0000
OP_MendHPUpdate=0x0000
OP_TargetReject=0x0000
OP_SafePoint=0x0000
OP_ApproveZone=0x0000
OP_ZoneComplete=0x0000
OP_ClientError=0x0000
OP_DumpName=0x0000
OP_Heartbeat=0x0000
OP_CrashDump=0x0000
OP_LoginComplete=0x0000
# discovered opcodes not yet used:
OP_PickLockSuccess=0x0000
OP_PlayMP3=0x0000
OP_ReclaimCrystals=0x0000
OP_DynamicWall=0x0000
OP_OpenDiscordMerchant=0x0000
OP_DiscordMerchantInventory=0x0000
OP_GiveMoney=0x0000
OP_RequestKnowledgeBase=0x0000
OP_KnowledgeBase=0x0000
OP_SlashAdventure=0x0000 # /adventure
OP_BecomePVPPrompt=0x0000
OP_MoveLogRequest=0x0000 # gone I think
OP_MoveLogDisregard=0x0000 # gone I think
# named unknowns, to make looking for real unknown easier
OP_AnnoyingZoneUnknown=0x0000
OP_Some6ByteHPUpdate=0x0000 seems to happen when you target group members
OP_QueryResponseThing=0x0000
# realityincarnate: these are just here to stop annoying several thousand byte packet dumps
#OP_LoginUnknown1=0x46d3 # OP_SendSpellChecksum
#OP_LoginUnknown2=0x040b # OP_SendSkillCapsChecksum
# Petition Opcodes
OP_PetitionSearch=0x0000 search term for petition
OP_PetitionSearchResults=0x0000 (list of?) matches from search
OP_PetitionSearchText=0x0000 text results of search
OP_PetitionUpdate=0x0000
OP_PetitionCheckout=0x0000
OP_PetitionCheckIn=0x0000
OP_PetitionQue=0x0000
OP_PetitionUnCheckout=0x0000
OP_PetitionDelete=0x0000
OP_DeletePetition=0x0000
OP_PetitionResolve=0x0000
OP_PDeletePetition=0x0000
OP_PetitionBug=0x0000
OP_PetitionRefresh=0x0000
OP_PetitionCheckout2=0x0000
OP_PetitionViewPetition=0x0000
# Login opcodes
OP_SessionReady=0x0000
OP_Login=0x0000
OP_ServerListRequest=0x0000
OP_PlayEverquestRequest=0x0000
OP_PlayEverquestResponse=0x0000
OP_ChatMessage=0x0000
OP_LoginAccepted=0x0000
OP_ServerListResponse=0x0000
OP_Poll=0x0000
OP_EnterChat=0x0000
OP_PollResponse=0x0000
# raw opcodes
OP_RAWSessionRequest=0x0000
OP_RAWSessionResponse=0x0000
OP_RAWCombined=0x0000
OP_RAWSessionDisconnect=0x0000
OP_RAWKeepAlive=0x0000
OP_RAWSessionStatRequest=0x0000
OP_RAWSessionStatResponse=0x0000
OP_RAWPacket=0x0000
OP_RAWFragment=0x0000
OP_RAWOutOfOrderAck=0x0000
OP_RAWAck=0x0000
OP_RAWAppCombined=0x0000
OP_RAWOutOfSession=0x0000
# we need to document the differences between these packets to make identifying them easier
OP_Some3ByteHPUpdate=0x0000 # initial HP update for mobs
OP_InitialHPUpdate=0x0000
@@ -0,0 +1,611 @@
# ShowEQ Import Notes:
# ZERO THE FILE first
# perl -pi -e 's/0x0000a-fA-F]{4}/0x0000/g' opcodes.conf
# Unknown Mapping:
# OP_Action2 -> OP_Damage
# OP_EnvDamage -> OP_Damage ---> might have been a one time mistake
# Name Differences:
# OP_CancelInvite -> OP_GroupCancelInvite
# OP_GMFind -> OP_FindPersonRequest
# OP_CommonMessage -> OP_ChannelMessage
OP_Unknown=0x0000
OP_ExploreUnknown=0x0000 # used for unknown explorer
# V = Verified correct
# C = Most likely correct
# U = Unsure, but should be correct or close
# world packets
# Required to reach Char Select:
OP_SendLoginInfo=0x6893 # was 0x2683
OP_ApproveWorld=0x115a # was 0x28a7
OP_LogServer=0x701f # was 0x224f
OP_SendCharInfo=0x1b85 # was 0x2c27
OP_ExpansionInfo=0x1771 # Same
OP_GuildsList=0x5b0b # Same
OP_EnterWorld=0x3288 # was 0x4f60
OP_PostEnterWorld=0x2f2c # was 0x570c
OP_World_Client_CRC1=0x0000 # C
OP_World_Client_CRC2=0x0000 # C
OP_SendSpellChecksum=0x0000 # C
OP_SendSkillCapsChecksum=0x0000 # C
# Character Select Related:
OP_DeleteCharacter=0x0000 # C
OP_CharacterCreateRequest=0x0000 # C
OP_CharacterCreate=0x0000 # C
OP_RandomNameGenerator=0x0000 # C 0x0000
OP_ApproveName=0x0000 # C
OP_MOTD=0x7312 # C 0x0000
OP_SetChatServer=0x698a #
OP_SetChatServer2=0x0000 # Not sent any more ?
OP_ZoneServerInfo=0x0479 # was 0x03cc
OP_WorldComplete=0x510c #
OP_WorldUnknown001=0x0000 # C 0x0000
OP_FloatListThing=0x0000 # V
# Reasons for Disconnect:
OP_ZoneUnavail=0x0000 # C 0x0000
OP_WorldClientReady=0x399b # C 0x0000
OP_CharacterStillInZone=0x0000 #
OP_WorldChecksumFailure=0x0000 #
OP_WorldLoginFailed=0x0000 #
OP_WorldLogout=0x0000 #
OP_WorldLevelTooHigh=0x0000 #
OP_CharInacessable=0x0000 #
OP_UserCompInfo=0x0000 #
# OP_SendExeChecksum=0x0000 #
# OP_SendBaseDataChecksum=0x0000 #
# Zone in opcodes
OP_AckPacket=0x3594 # was 0x3594
OP_ZoneEntry=0x002b # was 0x538f
OP_ReqNewZone=0x5ca5 # was 0x5ca5
OP_NewZone=0x0254 # was 0x0254
OP_ZoneSpawns=0x0000 # ?
OP_PlayerProfile=0x6022 # was 0x6022
OP_TimeOfDay=0x6015 # was 0x6015
OP_LevelUpdate=0x0000 # V
OP_Stamina=0x0000 # V
OP_RequestClientZoneChange=0x3fd2 # was 0x4178
OP_ZoneChange=0x0b93 # was 0x4a61
OP_LockoutTimerInfo=0x0000 #
OP_ZoneServerReady=0x0000 #
OP_ZoneInUnknown=0x0000 #
OP_LogoutReply=0x0000 #
OP_PreLogoutReply=0x0000 #
# Required to fully log in
OP_SpawnAppearance=0x7b64 # V
OP_TributeUpdate=0x4895 #
OP_TributeTimer=0x0000 # C
OP_TaskDescription=0x0000 # C
OP_TaskActivity=0x0000 # C
OP_CompletedTasks=0x0000 # C 0x0000
OP_Weather=0x7ce4 # was 0x0ed5
OP_SendAATable=0x1b26 #
OP_UpdateAA=0x0000 # V
OP_RespondAA=0x0000 # C 0x0000
OP_ReqClientSpawn=0x54e8 # was 0x6618
OP_SpawnDoor=0x4849 #
OP_GroundSpawn=0x5f0d # was 0x5f0d
OP_SendZonepoints=0x5f51 # was 0x0ff4
OP_SendAAStats=0x0000 # C
OP_WorldObjectsSent=0x7b73 # was 0x7b73
OP_BlockedBuffs=0x664a # was 0x4027
OP_SendExpZonein=0x2c27 # was 0x1436
OP_SendTributes=0x0000 # V
OP_TributeInfo=0x0000 # V
OP_SendGuildTributes=0x0000 # C 0x0000
OP_AAExpUpdate=0x0000 # V
OP_ExpUpdate=0x0000 # V
OP_HPUpdate=0x0000 # V
OP_ManaChange=0x0000 # C
OP_TGB=0x0000 # C
OP_SpecialMesg=0x3bf5 # was 0x14ff
OP_GuildMemberList=0x0000 # C
OP_GuildMOTD=0x0000 # V
OP_CharInventory=0x465e #
OP_WearChange=0x0000 # V
OP_ClientUpdate=0x7062 # was 0x7062
OP_ClientReady=0x6cdc # was 0x6cdc
OP_SetServerFilter=0x0000 # V
# Guild Opcodes
OP_GetGuildMOTD=0x0000 # C
OP_GetGuildMOTDReply=0x0000 # C
OP_GuildMemberUpdate=0x0000 # C
OP_GuildInvite=0x0000 # C
OP_GuildRemove=0x0000 # C
OP_GuildPeace=0x0000 # C
OP_SetGuildMOTD=0x0000 # C
OP_GuildList=0x0000 # C
OP_GuildWar=0x0000 # C
OP_GuildLeader=0x0000 # C
OP_GuildDelete=0x0000 # C
OP_GuildInviteAccept=0x0000 # C
OP_GuildDemote=0x0000 # C
OP_GuildPublicNote=0x0000 # C
OP_GuildManageBanker=0x0000 # C
OP_GuildBank=0x0000 # C
OP_SetGuildRank=0x0000 # C
OP_GuildUpdateURLAndChannel=0x0000 # C
OP_GuildMemberLevelUpdate=0x0000 #
OP_ZoneGuildList=0x0000 #
OP_GetGuildsList=0x0000 #
# OP_GuildManageRemove=0x0000 #
# OP_GuildManageAdd=0x0000 #
# OP_GuildManageStatus=0x0000 #
# GM/guide opcodes
OP_GMServers=0x0000 # C
OP_GMBecomeNPC=0x0000 # C
OP_GMZoneRequest=0x6f79 # was 0x18ea
OP_GMZoneRequest2=0x02d6 # was 0x3ad9
OP_GMGoto=0x0000 # C
OP_GMSearchCorpse=0x0000 # C
OP_GMHideMe=0x0000 # C
OP_GMDelCorpse=0x0000 # C
OP_GMApproval=0x0000 # C
OP_GMToggle=0x0000 # C 0x0000
OP_GMSummon=0x0000 # C
OP_GMEmoteZone=0x0000 # C
OP_GMEmoteWorld=0x0000 # C
OP_GMFind=0x0000 # C
OP_GMKick=0x0000 # C
OP_GMKill=0x0000 # C
OP_GMNameChange=0x0000 # C
OP_GMLastName=0x0000 # C
OP_InspectAnswer=0x0000 # C
OP_BeginCast=0x0000 # C
OP_BuffFadeMsg=0x50c2 # C
OP_ConsentResponse=0x0000 # C
OP_MemorizeSpell=0x0000 # C
OP_SwapSpell=0x0000 # C
OP_CastSpell=0x7286 # C
OP_Consider=0x0000 # C
OP_FormattedMessage=0x0000 # C
OP_SimpleMessage=0x0000 # C 0x0000
OP_Buff=0x0000 # C
OP_Illusion=0x0000 # C
OP_MoneyOnCorpse=0x0000 # C
OP_RandomReply=0x0000 # C
OP_DenyResponse=0x0000 # C
OP_SkillUpdate=0x0000 # C
OP_GMTrainSkillConfirm=0x0000 # C
OP_RandomReq=0x0000 # C
OP_Death=0x0000 # C
OP_Bind_Wound=0x0000 # C
OP_GMTraining=0x0000 # C
OP_GMEndTraining=0x0000 # C
OP_GMTrainSkill=0x0000 # C
OP_Animation=0x0000 # Was 0x0000
OP_Begging=0x0000 # C
OP_Consent=0x0000 # C
OP_ConsentDeny=0x0000 # C
OP_AutoFire=0x0000 # C
OP_PetCommands=0x0000 # C
OP_DeleteSpell=0x0000 # C
OP_Surname=0x0000 # C
OP_ClearSurname=0x0000 # C
OP_FaceChange=0x0000 # C
OP_SenseHeading=0x0000 # C
OP_Action=0x1513 # C
OP_ConsiderCorpse=0x0000 # C
OP_HideCorpse=0x0000 # C 0x0000
OP_Bug=0x0000 # C
OP_Feedback=0x0000 # C
OP_Report=0x0000 # C
OP_Damage=0x7519 # C or OP_Action2?
OP_ChannelMessage=0x2e79 # was 0x2e79
OP_Assist=0x0000 # C
OP_AssistGroup=0x0000 # C
OP_MoveCoin=0x0000 # C
OP_ZonePlayerToBind=0x0000 # C
OP_KeyRing=0x0000 # C
OP_WhoAllRequest=0x0000 # C
OP_WhoAllResponse=0x0000 # C
OP_FriendsWho=0x0000 # C
OP_ConfirmDelete=0x0000 # V
OP_Logout=0x44ae # was 0x64ec
OP_Rewind=0x0000 # C
OP_TargetCommand=0x0000 # C Was 0x0000
OP_InspectRequest=0x0000 # C
OP_Hide=0x0000 # C
OP_Jump=0x0000 # C
OP_Camp=0x42ef # C
OP_Emote=0x0000 # C
OP_SetRunMode=0x0000 # C
OP_BankerChange=0x0000 # C
OP_TargetMouse=0x36f8 # C 0x0000
OP_MobHealth=0x0000 # C
OP_InitialMobHealth=0x0000 # C
OP_TargetHoTT=0x0000 # C
OP_TargetBuffs=0x0000 # C
OP_BuffCreate=0x6bfb # V
OP_DeleteSpawn=0x7434 # was 0x7434
OP_AutoAttack=0x0000 # C
OP_AutoAttack2=0x0000 # C
OP_Consume=0x0000 # V
OP_MoveItem=0x0000 # C
OP_DeleteItem=0x0000 # C
OP_DeleteCharge=0x0000 # C
OP_ItemPacket=0x35b2 #
OP_ItemLinkResponse=0x0000 # C
OP_ItemLinkClick=0x0000 # C
OP_NewSpawn=0x0000 # C
OP_Track=0x0000 # C
OP_TrackTarget=0x0000 # C
OP_TrackUnknown=0x0000 # C
OP_ClickDoor=0x470e # was 0x4f1f
OP_MoveDoor=0x48f9 # was 0x1516
OP_EnvDamage=0x0000 # C
OP_BoardBoat=0x0000 # C
OP_Forage=0x0000 # C
OP_LeaveBoat=0x0000 # C
OP_ControlBoat=0x0000 # C
OP_SafeFallSuccess=0x0000 # C
OP_RezzComplete=0x0000 # C
OP_RezzRequest=0x0000 # C
OP_RezzAnswer=0x0000 # C
OP_Shielding=0x0000 # C
OP_RequestDuel=0x0000 # C
OP_MobRename=0x0000 # C
OP_AugmentItem=0x0000 # C
OP_WeaponEquip1=0x0000 # C
OP_WeaponEquip2=0x0000 # C
OP_WeaponUnequip2=0x0000 # C
OP_ApplyPoison=0x0000 # C
OP_Save=0x0000 # C
OP_TestBuff=0x0000 # C
OP_CustomTitles=0x0000 # C
OP_Split=0x0000 # C
OP_YellForHelp=0x0000 # C
OP_LoadSpellSet=0x0000 # C
OP_Bandolier=0x0000 # C
OP_PotionBelt=0x0000 # C
OP_DuelResponse=0x0000 # C
OP_DuelResponse2=0x0000 # C
OP_SaveOnZoneReq=0x2913 # was 0x2913
OP_ReadBook=0x0000 # C
OP_Dye=0x0000 # C
OP_InterruptCast=0x0000 # C
OP_AAAction=0x0000 # C
OP_LeadershipExpToggle=0x0000 # C
OP_LeadershipExpUpdate=0x0000 # C
OP_PurchaseLeadershipAA=0x0000 # C
OP_UpdateLeadershipAA=0x0000 # C
OP_MarkNPC=0x0000 # C
OP_ClearNPCMarks=0x0000 # C
OP_DoGroupLeadershipAbility=0x0000 # C
OP_GroupLeadershipAAUpdate=0x0000 # C
OP_DelegateAbility=0x0000 # C
OP_SetGroupTarget=0x0000 # C
OP_Charm=0x0000 # C
OP_Stun=0x0000 # C
OP_SendFindableNPCs=0x7eeb # C
OP_FindPersonRequest=0x0000 # C
OP_FindPersonReply=0x0000 # C
OP_Sound=0x0000 # C
OP_PetBuffWindow=0x0000 # C
OP_LevelAppearance=0x0000 # C
OP_Translocate=0x0000 # C
OP_Sacrifice=0x0000 # C
OP_PopupResponse=0x0000 # C
OP_OnLevelMessage=0x0000 # C
OP_AugmentInfo=0x0000 # C
OP_Petition=0x0000 # C
OP_SomeItemPacketMaybe=0x4200 # C
OP_SomeItemPacketMaybe=0x0000 # C
OP_PVPStats=0x0000 # C
OP_PVPLeaderBoardRequest=0x0000 # C
OP_PVPLeaderBoardReply=0x0000 # C
OP_PVPLeaderBoardDetailsRequest=0x0000 # C
OP_PVPLeaderBoardDetailsReply=0x0000 # C
OP_RestState=0x0000 # C
OP_RespawnWindow=0x0000 # C
OP_DisciplineTimer=0x0000 # C
OP_LDoNButton=0x0000 # C
OP_SetStartCity=0x0000 # C
OP_VoiceMacroIn=0x0000 # C
OP_VoiceMacroOut=0x0000 # C
OP_ItemViewUnknown=0x0000 # C
OP_VetRewardsAvaliable=0x0000 # C Mispelled?
OP_VetClaimRequest=0x0000 # C
OP_VetClaimReply=0x0000 # C
OP_CrystalCountUpdate=0x0000 # C
OP_DisciplineUpdate=0x0000 #
OP_BecomeCorpse=0x0000 #
OP_Action2=0x0000 # C OP_Damage?
OP_MobUpdate=0x4656 # was 0x4656
OP_NPCMoveUpdate=0x5d24 #
OP_CameraEffect=0x0000 # V
OP_SpellEffect=0x0000 # V
OP_DzQuit=0x0000
OP_DzListTimers=0x0000
OP_DzAddPlayer=0x0000
OP_DzRemovePlayer=0x0000
OP_DzSwapPlayer=0x0000
OP_DzMakeLeader=0x0000
OP_DzPlayerList=0x0000
OP_DzJoinExpeditionConfirm=0x0000
OP_DzJoinExpeditionReply=0x0000
OP_DzExpeditionInfo=0x0000
OP_DzMemberStatus=0x0000
OP_DzLeaderStatus=0x0000
OP_DzExpeditionEndsWarning=0x0000
OP_DzExpeditionList=0x0000
OP_DzMemberList=0x0000
OP_DzCompass=0x0000
OP_DzChooseZone=0x0000
# New Opcodes
OP_SpawnPositionUpdate=0x0000 # C
OP_ManaUpdate=0x0000 # C
OP_EnduranceUpdate=0x0000 # C
OP_MobManaUpdate=0x0000 # C
OP_MobEnduranceUpdate=0x0000 # C
# Looting
OP_LootRequest=0x0000 # C
OP_EndLootRequest=0x0000 # C
OP_LootItem=0x0000 # C
OP_LootComplete=0x0000 # C
# bazaar trader stuff stuff:
OP_BazaarSearch=0x0000 # C
OP_TraderDelItem=0x0000 # C
OP_BecomeTrader=0x0000 # C
OP_TraderShop=0x0000 # C
OP_Trader=0x0000 # C
OP_TraderBuy=0x0000 # C
OP_Barter=0x0000 # C
OP_ShopItem=0x0000 #
OP_BazaarInspect=0x0000 #
OP_Bazaar=0x0000 #
OP_TraderItemUpdate=0x0000 #
# pc/npc trading
OP_TradeRequest=0x0000 # C
OP_TradeAcceptClick=0x0000 # C
OP_TradeRequestAck=0x0000 # C
OP_TradeCoins=0x0000 # C
OP_FinishTrade=0x0000 # C
OP_CancelTrade=0x0000 # C
OP_TradeMoneyUpdate=0x0000 # C
OP_MoneyUpdate=0x0000 # C
OP_TradeBusy=0x0000 # C
# Sent after canceling trade or after closing tradeskill object
OP_FinishWindow=0x0000 # C
OP_FinishWindow2=0x0000 # C
# Sent on Live for what seems to be item existance verification
# Ex. Before Right Click Effect happens from items
OP_ItemVerifyRequest=0x0000 # C
OP_ItemVerifyReply=0x0000 # C
# merchant crap
OP_ShopPlayerSell=0x0000 # C
OP_ShopRequest=0x1044 # was 0x1044
OP_ShopEnd=0x3753 # was 0x3753
OP_ShopEndConfirm=0x0000 # C
OP_ShopPlayerBuy=0x0000 # C
OP_ShopDelItem=0x0000 # C
# tradeskill stuff:
OP_ClickObject=0x0000 # V
OP_ClickObjectAction=0x0000 # V
OP_ClearObject=0x0000 # C
OP_RecipeDetails=0x0000 # C
OP_RecipesFavorite=0x0000 # C
OP_RecipesSearch=0x0000 # C
OP_RecipeReply=0x0000 # C
OP_RecipeAutoCombine=0x0000 # C
OP_TradeSkillCombine=0x0000 # C
# Tribute Packets:
OP_OpenGuildTributeMaster=0x0000 # C
OP_OpenTributeMaster=0x0000 # C
OP_SelectTribute=0x0000 # C
OP_TributeItem=0x0000 # C
OP_TributeMoney=0x0000 # C
OP_TributeToggle=0x0000 # C
OP_TributePointUpdate=0x0000 # C
OP_TributeNPC=0x0000 #
OP_GuildTributeInfo=0x0000 #
OP_OpenTributeReply=0x0000 #
# OP_GuildTributeStatus=0x0000 #
# Adventure packets:
OP_LeaveAdventure=0x0000 # C
OP_AdventureFinish=0x0000 # C
OP_AdventureInfoRequest=0x0000 # C
OP_AdventureInfo=0x0000 # C
OP_AdventureRequest=0x0000 # C
OP_AdventureDetails=0x0000 # C
OP_AdventureData=0x0000 # C
OP_AdventureUpdate=0x0000 # C
OP_AdventureMerchantRequest=0x0000 # C
OP_AdventureMerchantResponse=0x0000 # C
OP_AdventureMerchantPurchase=0x0000 # C
OP_AdventureMerchantSell=0x0000 # C
OP_AdventurePointsUpdate=0x0000 # C
OP_AdventureStatsRequest=0x0000 # C
OP_AdventureStatsReply=0x0000 # C
OP_AdventureLeaderboardRequest=0x0000 # C
OP_AdventureLeaderboardReply=0x0000 # C
# Group Opcodes
OP_GroupDisband=0x0000 # C
OP_GroupInvite=0x0000 # C
OP_GroupFollow=0x0000 # C
OP_GroupUpdate=0x0000 # C
OP_GroupUpdateB=0x0000 # C
OP_GroupCancelInvite=0x0000 # C - Same as OP_CancelInvite?
OP_GroupAcknowledge=0x0000 # C
OP_GroupDelete=0x0000 #
OP_CancelInvite=0x0000 # C
OP_GroupFollow2=0x0000 # C
OP_GroupInvite2=0x0000 # C
OP_GroupDisbandYou=0x0000 # C
OP_GroupDisbandOther=0x0000 # C
OP_GroupLeaderChange=0x0000 # C
OP_GroupRoles=0x0000 # C
# LFG/LFP Opcodes
OP_LFGCommand=0x0000 # C
OP_LFGGetMatchesRequest=0x0000 # C
OP_LFGGetMatchesResponse=0x0000 # C
OP_LFPGetMatchesRequest=0x0000 # C
OP_LFPGetMatchesResponse=0x0000 # C
OP_LFPCommand=0x0000 # C
OP_LFGAppearance=0x0000 #
OP_LFGResponse=0x0000 #
# Raid Opcodes
OP_RaidInvite=0x0000 # C
OP_RaidUpdate=0x0000 # C
OP_RaidJoin=0x0000 #
# Button-push commands
OP_Taunt=0x0000 # C
OP_CombatAbility=0x0000 # C
OP_SenseTraps=0x0000 # C
OP_PickPocket=0x0000 # C
OP_DisarmTraps=0x0000 #
OP_Disarm=0x0000 # C
OP_Sneak=0x0000 # C
OP_Fishing=0x0000 # C
OP_InstillDoubt=0x0000 # C
OP_FeignDeath=0x0000 # C
OP_Mend=0x0000 # C
OP_LDoNOpen=0x0000 # C
# Task packets
OP_TaskActivityComplete=0x0000 # C
OP_TaskMemberList=0x0000 # C
OP_OpenNewTasksWindow=0x0000 # C
OP_AvaliableTask=0x0000 # C Mispelled?
OP_AcceptNewTask=0x0000 # C
OP_TaskHistoryRequest=0x0000 # C
OP_TaskHistoryReply=0x0000 # C
OP_CancelTask=0x0000 # C
OP_DeclineAllTasks=0x0000 #
# Title opcodes
OP_NewTitlesAvailable=0x0000 # C
OP_RequestTitles=0x0000 # C
OP_SendTitleList=0x0000 # C
OP_SetTitle=0x0000 # C
OP_SetTitleReply=0x0000 # C
# mail opcodes
OP_Command=0x0000 #
OP_MailboxHeader=0x0000 #
OP_MailHeader=0x0000 #
OP_MailBody=0x0000 #
OP_NewMail=0x0000 #
OP_SentConfirm=0x0000 #
# # # # # # # # # # # Below this point should not be needed # # # # # # # # # # #
# This section are all unknown in Titanium
OP_ForceFindPerson=0x0000 #
OP_LocInfo=0x0000 #
OP_ReloadUI=0x0000 #
OP_ItemName=0x0000 #
OP_ItemLinkText=0x0000 #
OP_MultiLineMsg=0x0000 #
OP_MendHPUpdate=0x0000 #
OP_TargetReject=0x0000 #
OP_SafePoint=0x0000 #
OP_IncreaseStats=0x0000 #
OP_ApproveZone=0x0000 #
OP_ZoneComplete=0x0000 #
OP_ClientError=0x0000 #
OP_DumpName=0x0000 #
OP_Heartbeat=0x0000 #
OP_CrashDump=0x0000 #
OP_LoginComplete=0x0000 #
# discovered opcodes not yet used:
OP_PickLockSuccess=0x0000 #
OP_PlayMP3=0x0000 #
OP_ReclaimCrystals=0x0000 #
OP_DynamicWall=0x0000 #
OP_OpenDiscordMerchant=0x0000 #
OP_DiscordMerchantInventory=0x0000 #
OP_GiveMoney=0x0000 #
OP_RequestKnowledgeBase=0x0000 #
OP_KnowledgeBase=0x0000 #
OP_SlashAdventure=0x0000 # /adventure
OP_BecomePVPPrompt=0x0000 #
OP_MoveLogRequest=0x0000 # gone I think
OP_MoveLogDisregard=0x0000 # gone I think
# named unknowns, to make looking for real unknown easier
OP_AnnoyingZoneUnknown=0x0000 #
OP_Some6ByteHPUpdate=0x0000 # seems to happen when you target group members
OP_QueryResponseThing=0x0000 #
# realityincarnate: these are just here to stop annoying several thousand byte packet dumps
#OP_LoginUnknown1=0x0000 # U OP_SendSpellChecksum
#OP_LoginUnknown2=0x0000 # U OP_SendSkillCapsChecksum
# Petition Opcodes
OP_PetitionSearch=0x0000 # search term for petition
OP_PetitionSearchResults=0x0000 # (list of?) matches from search
OP_PetitionSearchText=0x0000 # text results of search
OP_PetitionUpdate=0x0000 #
OP_PetitionCheckout=0x0000 #
OP_PetitionCheckIn=0x0000 #
OP_PetitionQue=0x0000 #
OP_PetitionUnCheckout=0x0000 #
OP_PetitionDelete=0x0000 #
OP_DeletePetition=0x0000 #
OP_PetitionResolve=0x0000 #
OP_PDeletePetition=0x0000 #
OP_PetitionBug=0x0000 #
OP_PetitionRefresh=0x0000 #
OP_PetitionCheckout2=0x0000 #
OP_PetitionViewPetition=0x0000 #
# Login opcodes
OP_SessionReady=0x0000 #
OP_Login=0x0000 #
OP_ServerListRequest=0x0000 #
OP_PlayEverquestRequest=0x0000 #
OP_PlayEverquestResponse=0x0000 #
OP_ChatMessage=0x0000 #
OP_LoginAccepted=0x0000 #
OP_ServerListResponse=0x0000 #
OP_Poll=0x0000 #
OP_EnterChat=0x0000 #
OP_PollResponse=0x0000 #
# raw opcodes
OP_RAWSessionRequest=0x0000 #
OP_RAWSessionResponse=0x0000 #
OP_RAWCombined=0x0000 #
OP_RAWSessionDisconnect=0x0000 #
OP_RAWKeepAlive=0x0000 #
OP_RAWSessionStatRequest=0x0000 #
OP_RAWSessionStatResponse=0x0000 #
OP_RAWPacket=0x0000 #
OP_RAWFragment=0x0000 #
OP_RAWOutOfOrderAck=0x0000 #
OP_RAWAck=0x0000 #
OP_RAWAppCombined=0x0000 #
OP_RAWOutOfSession=0x0000 #
# we need to document the differences between these packets to make identifying them easier
OP_Some3ByteHPUpdate=0x0000 # initial HP update for mobs
OP_InitialHPUpdate=0x0000 #
OP_OPCode2511=0x2511
@@ -0,0 +1,653 @@
# ShowEQ Import Notes:
# ZERO THE FILE first
# perl -pi -e 's/0x[0-9a-fA-F]{4}/0x0000/g' opcodes.conf
# Unknown Mapping:
# OP_Action2 -> OP_Damage
# OP_EnvDamage -> OP_Damage ---> might have been a one time mistake
# Name Differences:
# OP_CancelInvite -> OP_GroupCancelInvite
# OP_GMFind -> OP_FindPersonRequest
# OP_CommonMessage -> OP_ChannelMessage
OP_Unknown=0x0000
OP_ExploreUnknown=0x0000 used for unknown explorer
# world packets
# Required to reach Char Select:
OP_SendLoginInfo=0x7b72
OP_ApproveWorld=0x11fe
OP_LogServer=0x055d
OP_SendCharInfo=0x58ca
OP_ExpansionInfo=0x323b
OP_GuildsList=0x5c3a
OP_EnterWorld=0x4e2b
OP_PostEnterWorld=0x3931
OP_World_Client_CRC1=0x67bb
OP_World_Client_CRC2=0x08ea
OP_SendSpellChecksum=0x0000
OP_SendSkillCapsChecksum=0x0000
# Character Select Related:
OP_SendMaxCharacters=0x2960
OP_SendMembership=0x46d8
OP_SendMembershipDetails=0x1af8
OP_CharacterCreateRequest=0x1a95
OP_CharacterCreate=0x74c4
OP_DeleteCharacter=0x63ba
OP_RandomNameGenerator=0x0528
OP_ApproveName=0x5ae0
OP_MOTD=0x5cc4
OP_SetChatServer=0x07c6
OP_SetChatServer2=0x421b
OP_ZoneServerInfo=0x1cfa
OP_WorldComplete=0x06f2
OP_WorldUnknown001=0x39de
OP_FloatListThing=0x62d2
# Reasons for Disconnect:
OP_ZoneUnavail=0x5047
OP_WorldClientReady=0x0b02
OP_CharacterStillInZone=0x0000
OP_WorldChecksumFailure=0x0000
OP_WorldLoginFailed=0x0000
OP_WorldLogout=0x0000
OP_WorldLevelTooHigh=0x0000
OP_CharInacessable=0x0000
OP_UserCompInfo=0x0000
OP_SendExeChecksum=0x0000
OP_SendBaseDataChecksum=0x0000
# Zone in opcodes
OP_AckPacket=0x08d6
OP_ZoneEntry=0x60a8
OP_ReqNewZone=0x0010
OP_NewZone=0x18cd
OP_ZoneSpawns=0x20da
OP_PlayerProfile=0x5772
OP_TimeOfDay=0x5824
OP_LevelUpdate=0x427d
OP_Stamina=0x4932
OP_RequestClientZoneChange=0x70f9
OP_ZoneChange=0xb646
OP_LockoutTimerInfo=0x0000
OP_ZoneServerReady=0x0000
OP_ZoneInUnknown=0x0000
OP_LogoutReply=0x0000
OP_PreLogoutReply=0x0000
# Required to fully log in
OP_SpawnAppearance=0x201a
OP_ChangeSize=0x27b3
OP_TributeUpdate=0x42e0
OP_TributeTimer=0x5008
OP_SendTributes=0x3cca
OP_SendGuildTributes=0x36e4
OP_TributeInfo=0xde3a
OP_Weather=0x7fca
OP_ReqClientSpawn=0x0ed4
OP_SpawnDoor=0x31ed
OP_GroundSpawn=0x56b2
OP_SendZonepoints=0x0d72
OP_BlockedBuffs=0x2b96
OP_RemoveBlockedBuffs=0x1702
OP_ClearBlockedBuffs=0x53eb
OP_WorldObjectsSent=0x59c9
OP_SendExpZonein=0x17b6
OP_SendAATable=0x7017
OP_RespondAA=0x4f1a
OP_UpdateAA=0x7eb4
OP_SendAAStats=0x46af
OP_AAExpUpdate=0x4212
OP_ExpUpdate=0x4ecc
OP_HPUpdate=0x65e7
OP_ManaChange=0x7d4d
OP_TGB=0x32ec
OP_SpecialMesg=0x7d26
OP_GuildMemberList=0x183b
OP_GuildMOTD=0x5531
OP_CharInventory=0x44db
OP_WearChange=0x32fb
OP_ClientUpdate=0x0be5
OP_ClientReady=0x7aa4 # 0x422d
OP_SetServerFilter=0x7958
# Guild Opcodes - Disabled until crashes are resolved in RoF
OP_GetGuildMOTD=0x7332 # Was 0x35dc
OP_GetGuildMOTDReply=0x74dd # Was 0x4586
OP_GuildMemberUpdate=0x24da # Was 0x5643
OP_GuildInvite=0x15e1
OP_GuildRemove=0x45ae
OP_GuildPeace=0x01fc
OP_SetGuildMOTD=0x4467
OP_GuildList=0x0000
OP_GuildWar=0x2ab7
OP_GuildLeader=0x0b1a
OP_GuildDelete=0x16ff
OP_GuildInviteAccept=0x2fe8
OP_GuildDemote=0x52de
OP_GuildPublicNote=0x3838
OP_GuildManageBanker=0x0116 # Was 0x0737
OP_GuildBank=0x2c0e # Was 0x10c3
OP_SetGuildRank=0x3894
OP_GuildUpdateURLAndChannel=0x11b1
OP_GuildStatus=0x3002
OP_GuildCreate=0x1246 # or maybe 0x086e
OP_GuildMemberLevelUpdate=0x0000 # Unused?
OP_ZoneGuildList=0x0000 # Unused?
OP_GetGuildsList=0x0000 # Unused?
OP_LFGuild=0x0000
OP_GuildManageRemove=0x0000
OP_GuildManageAdd=0x0000
OP_GuildManageStatus=0x0000
# GM/Guide Opcodes
OP_GMServers=0x6c9b
OP_GMBecomeNPC=0x5efb
OP_GMZoneRequest=0x05db
OP_GMZoneRequest2=0x0b6f
OP_GMGoto=0x4cf4
OP_GMSearchCorpse=0x7628
OP_GMHideMe=0x0f7c
OP_GMDelCorpse=0x6175
OP_GMApproval=0x2151
OP_GMToggle=0x352d
OP_GMSummon=0x62f8 # Was 0x684f
OP_GMEmoteZone=0x5833 # Was 0x0655
OP_GMEmoteWorld=0x2643 # Was 0x1935
OP_GMFind=0x3450
OP_GMKick=0x6dd9
OP_GMKill=0x5501
OP_GMNameChange=0x7202 # Was 0x51f7
OP_GMLastName=0x72c5 # Was 0x4dd7
# Misc Opcodes
OP_InspectRequest=0x0853
OP_InspectAnswer=0x3d94
OP_InspectMessageUpdate=0x1562
OP_BeginCast=0x7ec6
OP_BuffFadeMsg=0x193a
OP_ConsentResponse=0x130b
OP_MemorizeSpell=0x72a0
OP_SwapSpell=0x30c2
OP_CastSpell=0x6bd3
OP_Consider=0x1184
OP_FormattedMessage=0x1bc4
OP_SimpleMessage=0x4926
OP_Buff=0x3526
OP_Illusion=0x02e6
OP_MoneyOnCorpse=0x2a0f
OP_RandomReply=0x0b4b
OP_DenyResponse=0x414c
OP_SkillUpdate=0x2389
OP_GMTrainSkillConfirm=0x1eb6 # 0x3960
OP_RandomReq=0x5d57
OP_Death=0x2c22
OP_GMTraining=0x7e86
OP_GMEndTraining=0x0fcc
OP_GMTrainSkill=0x4478
OP_Animation=0x26b3
OP_Begging=0x1185
OP_Consent=0x3292
OP_ConsentDeny=0x722b
OP_AutoFire=0x03eb
OP_PetCommands=0x4e66
OP_DeleteSpell=0x7dc1
OP_Surname=0x3388
OP_ClearSurname=0x31d9
OP_FaceChange=0x2729
OP_SenseHeading=0x3b65
OP_Action=0x31b6
OP_ConsiderCorpse=0x1837
OP_HideCorpse=0x177c
OP_CorpseDrag=0x4bc7
OP_CorpseDrop=0x4857
OP_Bug=0x7866
OP_Feedback=0x240f
OP_Report=0x15bb
OP_Damage=0x4598
OP_ChannelMessage=0x7aba
OP_Assist=0x454e
OP_AssistGroup=0x8a9a
OP_MoveCoin=0x7944
OP_ZonePlayerToBind=0x1698
OP_KeyRing=0x07da
OP_WhoAllRequest=0x037d
OP_WhoAllResponse=0x72e8
OP_FriendsWho=0x4640
OP_ConfirmDelete=0x594e
OP_Logout=0x4739
OP_Rewind=0x21b8
OP_TargetCommand=0x717e
OP_Hide=0x6d0d
OP_Jump=0x7c8d
OP_Camp=0x6958
OP_Emote=0x50d6
OP_SetRunMode=0x20fd
OP_BankerChange=0x1d10
OP_TargetMouse=0x0a2d
OP_MobHealth=0x05c3
OP_InitialMobHealth=0x0000 # Unused?
OP_TargetHoTT=0x43ec
OP_XTargetResponse=0x18c5
OP_XTargetRequest=0x47bc
OP_XTargetAutoAddHaters=0x48f8
OP_TargetBuffs=0x0a99
OP_BuffCreate=0x1cc2
OP_BuffRemoveRequest=0x1338
OP_DeleteSpawn=0x781f
OP_AutoAttack=0x1740
OP_AutoAttack2=0x78de
OP_Consume=0x678e
OP_MoveItem=0x76c9
OP_DeleteItem=0x1362
OP_DeleteCharge=0x1721
OP_ItemPacket=0x82a7
OP_ItemLinkResponse=0x636e
OP_ItemLinkClick=0x234b
OP_ItemPreview=0x504d
OP_NewSpawn=0x3aa6
OP_Track=0x01d5
OP_TrackTarget=0x1bb5
OP_TrackUnknown=0x5c41
OP_ClickDoor=0x07be
OP_MoveDoor=0x45fe
OP_RemoveAllDoors=0x60cd
OP_EnvDamage=0x0518
OP_BoardBoat=0x3097
OP_Forage=0x0ec5
OP_LeaveBoat=0x1180
OP_ControlBoat=0x6e81
OP_SafeFallSuccess=0x4cb2
OP_RezzComplete=0x2cb3
OP_RezzRequest=0x375e
OP_RezzAnswer=0x71c2
OP_Shielding=0x75a5
OP_RequestDuel=0x17ab
OP_MobRename=0x6ebb
OP_AugmentItem=0x3b4b # Was 0x37cb
OP_WeaponEquip1=0x7480
OP_WeaponEquip2=0x6f55 # Was 0x6022
OP_WeaponUnequip2=0x1d1e # Was 0x0110
OP_ApplyPoison=0x3a21
OP_Save=0x296a
OP_TestBuff=0x3296 # Was 0x3772
OP_CustomTitles=0x26eb
OP_Split=0x1ee0
OP_YellForHelp=0x4c55
OP_LoadSpellSet=0x0994
OP_Bandolier=0x6d0e
OP_PotionBelt=0x0e8e # Was 0x4d3b
OP_DuelResponse=0x6f44
OP_DuelResponse2=0x4868
OP_SaveOnZoneReq=0x317d
OP_ReadBook=0x5671
OP_Dye=0x0b0d
OP_InterruptCast=0x6adf
OP_AAAction=0x7d94
OP_LeadershipExpToggle=0x7a6b
OP_LeadershipExpUpdate=0x1499
OP_PurchaseLeadershipAA=0x15aa
OP_UpdateLeadershipAA=0x0bcd
OP_MarkNPC=0x08d3
OP_ClearNPCMarks=0x7bb8
OP_DelegateAbility=0x2bb5
OP_SetGroupTarget=0x49f2
OP_Charm=0x7bea
OP_Stun=0x7f7e
OP_SendFindableNPCs=0x5de1
OP_FindPersonRequest=0x4150
OP_FindPersonReply=0x65f0
OP_Sound=0x797b
OP_PetBuffWindow=0x12cd
OP_LevelAppearance=0x34b9
OP_Translocate=0x7121
OP_Sacrifice=0x609b
OP_PopupResponse=0x3c2d
OP_OnLevelMessage=0x0648
OP_AugmentInfo=0x0000
OP_Petition=0x4aad
OP_SomeItemPacketMaybe=0x1334
OP_PVPStats=0x51fd # Unsure
OP_PVPLeaderBoardRequest=0x38cc
OP_PVPLeaderBoardReply=0x2ac0
OP_PVPLeaderBoardDetailsRequest=0x4efd
OP_PVPLeaderBoardDetailsReply=0x4497
OP_RestState=0x7496
OP_RespawnWindow=0x2e76
OP_LDoNButton=0x1589
OP_SetStartCity=0x17d5 # Was 0x2d1b
OP_VoiceMacroIn=0x31f8
OP_VoiceMacroOut=0x7f45
OP_ItemViewUnknown=0x1aca
OP_VetRewardsAvaliable=0x786e
OP_VetClaimRequest=0x380d
OP_VetClaimReply=0x5899
OP_DisciplineUpdate=0x47a9 # Was 0x2f05
OP_DisciplineTimer=0x6394 # Was 0x5e3f
OP_BecomeCorpse=0x0000 # Unused?
OP_Action2=0x0000 # Unused?
OP_MobUpdate=0x142c
OP_NPCMoveUpdate=0x4788
OP_CameraEffect=0x3056
OP_SpellEffect=0x4d15
OP_RemoveNimbusEffect=0x1455
OP_AltCurrency=0x2044
OP_AltCurrencyMerchantRequest=0x0fc1
OP_AltCurrencyMerchantReply=0x57ee
OP_AltCurrencyPurchase=0x13bf
OP_AltCurrencySell=0x41c3
OP_AltCurrencySellSelection=0x0a3a
OP_AltCurrencyReclaim=0x4097
OP_CrystalCountUpdate=0x5307 # Was 0x3f60
OP_CrystalCreate=0x6668 # Was 0x5a82
OP_CrystalReclaim=0x00de # Was 0x7616
OP_Untargetable=0x3210
OP_IncreaseStats=0x5148
OP_Weblink=0x5e65
#OP_OpenInventory=0x0000 # Likely does not exist in RoF -U
OP_OpenContainer=0x0000
OP_DzQuit=0x7514
OP_DzListTimers=0x572d
OP_DzAddPlayer=0x5aab
OP_DzRemovePlayer=0x4e78
OP_DzSwapPlayer=0x14a4
OP_DzMakeLeader=0x15d7
OP_DzPlayerList=0x2dcd
OP_DzJoinExpeditionConfirm=0x0f30
OP_DzJoinExpeditionReply=0x3b67
OP_DzExpeditionInfo=0x24be
OP_DzExpeditionList=0x1ce9
OP_DzMemberStatus=0x1bfc
OP_DzLeaderStatus=0x04bf
OP_DzExpeditionEndsWarning=0x5dea
OP_DzMemberList=0x2ef6
OP_DzCompass=0x331d # Was 0x4f09
OP_DzChooseZone=0x0000 # Maybe 0x29d6
# New Opcodes
OP_SpawnPositionUpdate=0x0000 # Actually OP_MobUpdate ?
OP_ManaUpdate=0x089f
OP_EnduranceUpdate=0x3a7c
OP_MobManaUpdate=0x1013
OP_MobEnduranceUpdate=0x68a5
# Mercenary Opcodes
OP_MercenaryDataUpdateRequest=0x1919
OP_MercenaryDataUpdate=0x27a5
OP_MercenaryDataRequest=0x6278
OP_MercenaryDataResponse=0x5c06
OP_MercenaryHire=0x18f9
OP_MercenaryDismiss=0x9d9a
OP_MercenaryTimerRequest=0x39a1
OP_MercenaryTimer=0x6f9e
OP_MercenaryUnknown1=0x6e0e
OP_MercenaryCommand=0x564f
OP_MercenarySuspendRequest=0x1d98
OP_MercenarySuspendResponse=0x205c
OP_MercenaryUnsuspendResponse=0x4ab4
# Looting
OP_LootRequest=0x760c
OP_EndLootRequest=0x0c45
OP_LootItem=0x29e8
OP_LootComplete=0x2dc2
# bazaar trader stuff:
OP_BazaarSearch=0x37a5
OP_TraderDelItem=0x0000
OP_BecomeTrader=0x7d0b
OP_TraderShop=0x5137
OP_Trader=0x7e2b
OP_TraderBuy=0x0000
OP_Barter=0x0e48
OP_ShopItem=0x0000
OP_BazaarInspect=0x0000
OP_Bazaar=0x0000
OP_TraderItemUpdate=0x0000
# pc/npc trading
OP_TradeRequest=0x743e
OP_TradeAcceptClick=0x262a
OP_TradeRequestAck=0x02b0
OP_TradeCoins=0x2eef
OP_FinishTrade=0x22b6
OP_CancelTrade=0x4cd1
OP_TradeMoneyUpdate=0x6d8c
OP_MoneyUpdate=0x4ae9
OP_TradeBusy=0x7dcf
# Sent after canceling trade or after closing tradeskill object
OP_FinishWindow=0x16fb
OP_FinishWindow2=0x6c2b
# Sent on Live for what seems to be item existance verification
# Ex. Before Right Click Effect happens from items
OP_ItemVerifyRequest=0x2e3a
OP_ItemVerifyReply=0x3b26
# merchant stuff
OP_ShopPlayerSell=0x51fb
OP_ShopRequest=0x49f3
OP_ShopEnd=0x36ac
OP_ShopEndConfirm=0x6b28
OP_ShopPlayerBuy=0x639e
OP_ShopDelItem=0x19fd
# tradeskill stuff:
OP_ClickObject=0x607d
OP_ClickObjectAction=0x553d
OP_ClearObject=0x0e78
OP_RecipeDetails=0x59b7
OP_RecipesFavorite=0x56b5
OP_RecipesSearch=0x0000
OP_RecipeReply=0x57c9
OP_RecipeAutoCombine=0x7cc0
OP_TradeSkillCombine=0x1f0f
# Tribute Packets:
OP_OpenGuildTributeMaster=0x31a7
OP_OpenTributeMaster=0x0212 # Was 0x40f5
OP_SelectTribute=0x7604
OP_TributeItem=0x72bc
OP_TributeMoney=0x7415 # Was 0x6fed
OP_TributeToggle=0x3046
OP_TributePointUpdate=0x7203
OP_TributeNPC=0x0000
OP_GuildTributeInfo=0x0000
OP_OpenTributeReply=0x0000
OP_GuildTributeStatus=0x0000
# Adventure packets:
OP_LeaveAdventure=0x18f7
OP_AdventureFinish=0x29ea
OP_AdventureInfoRequest=0x26a5
OP_AdventureInfo=0x51f0
OP_AdventureRequest=0x3eae
OP_AdventureDetails=0x44e5
OP_AdventureData=0x22cf
OP_AdventureUpdate=0x5a41
OP_AdventureMerchantRequest=0x2c46 # Was 654d
OP_AdventureMerchantResponse=0x8000 # Was 7949
OP_AdventureMerchantPurchase=0x7ee6 # Was 155a
OP_AdventureMerchantSell=0x4faa # Was 389c
OP_AdventurePointsUpdate=0x30c0 # Was 7589
OP_AdventureStatsRequest=0x730a
OP_AdventureStatsReply=0x3f32
OP_AdventureLeaderboardRequest=0x1f8a
OP_AdventureLeaderboardReply=0x37f3
# Group Opcodes
OP_GroupDisband=0x559d
OP_GroupInvite=0x3877
OP_GroupFollow=0x7842
OP_GroupUpdate=0x35cc
OP_GroupUpdateB=0x2aca
OP_GroupCancelInvite=0x0000
OP_GroupAcknowledge=0x7b5a
OP_GroupDelete=0x7102
OP_CancelInvite=0x1afc
OP_GroupFollow2=0x269f
OP_GroupInvite2=0x4b77
OP_GroupDisbandYou=0x23eb
OP_GroupDisbandOther=0x7862
OP_GroupLeaderChange=0x07d8
OP_GroupRoles=0x139a
OP_GroupMakeLeader=0x7056
OP_DoGroupLeadershipAbility=0x6637
OP_GroupLeadershipAAUpdate=0x0400
# LFG/LFP Opcodes
OP_LFGCommand=0x6b5a
OP_LFGGetMatchesRequest=0x3153
OP_LFGGetMatchesResponse=0x1ed6
OP_LFPGetMatchesRequest=0x5de8
OP_LFPGetMatchesResponse=0x62bc
OP_LFPCommand=0x403e
OP_LFGAppearance=0x0000
OP_LFGResponse=0x0000
# Raid Opcodes
OP_RaidInvite=0x3ab1
OP_RaidUpdate=0x20a4
OP_RaidJoin=0x0000
# Button-push commands
OP_Taunt=0x01ed
OP_CombatAbility=0x1f8e
OP_SenseTraps=0x5ccf # Was 0x2ee0
OP_PickPocket=0x7876
OP_DisarmTraps=0x0000
OP_Disarm=0x4422
OP_Sneak=0x117d
OP_Fishing=0x0cbd
OP_InstillDoubt=0x0734
OP_FeignDeath=0x2321
OP_Mend=0x5651
OP_Bind_Wound=0x4ab2
OP_LDoNOpen=0x1dfc
# Task packets
OP_TaskDescription=0x5c2a
OP_TaskActivity=0x902b
OP_CompletedTasks=0x2a6f
OP_TaskActivityComplete=0x2459
OP_AcceptNewTask=0x0b03
OP_CancelTask=0x4c3f
OP_TaskMemberList=0x2f78 # Was 0x1656
OP_OpenNewTasksWindow=0xd63f # Was 0x11de
OP_AvaliableTask=0x5f3e # Was 0x2377
OP_TaskHistoryRequest=0x03fe
OP_TaskHistoryReply=0x2b9f
OP_DeclineAllTasks=0x0000
# Title opcodes
OP_NewTitlesAvailable=0x7c32
OP_RequestTitles=0x1c5f
OP_SendTitleList=0x0d6c
OP_SetTitle=0x7660
OP_SetTitleReply=0x5525
# mail opcodes
OP_Command=0x0000
OP_MailboxHeader=0x0000
OP_MailHeader=0x0000
OP_MailBody=0x0000
OP_NewMail=0x0000
OP_SentConfirm=0x0000
########### Below this point should not be needed ###########
# This section are all unknown in Titanium
OP_ForceFindPerson=0x0000
OP_LocInfo=0x0000
OP_ReloadUI=0x0000
OP_ItemName=0x0000
OP_ItemLinkText=0x0000
OP_MultiLineMsg=0x0000
OP_MendHPUpdate=0x0000
OP_TargetReject=0x0000
OP_SafePoint=0x0000
OP_ApproveZone=0x0000
OP_ZoneComplete=0x0000
OP_ClientError=0x0000
OP_DumpName=0x0000
OP_Heartbeat=0x0000
OP_CrashDump=0x0000
OP_LoginComplete=0x0000
# discovered opcodes not yet used:
OP_PickLockSuccess=0x0000
OP_PlayMP3=0x0000
OP_ReclaimCrystals=0x0000
OP_DynamicWall=0x0000
OP_OpenDiscordMerchant=0x0000
OP_DiscordMerchantInventory=0x0000
OP_GiveMoney=0x0000
OP_RequestKnowledgeBase=0x0000
OP_KnowledgeBase=0x0000
OP_SlashAdventure=0x0000 # /adventure
OP_BecomePVPPrompt=0x0000
OP_MoveLogRequest=0x0000 # gone I think
OP_MoveLogDisregard=0x0000 # gone I think
# named unknowns, to make looking for real unknown easier
OP_AnnoyingZoneUnknown=0x0000
OP_Some6ByteHPUpdate=0x0000 seems to happen when you target group members
OP_QueryResponseThing=0x0000
# realityincarnate: these are just here to stop annoying several thousand byte packet dumps
#OP_LoginUnknown1=0x46d3 # OP_SendSpellChecksum
#OP_LoginUnknown2=0x040b # OP_SendSkillCapsChecksum
# Petition Opcodes
OP_PetitionSearch=0x0000 search term for petition
OP_PetitionSearchResults=0x0000 (list of?) matches from search
OP_PetitionSearchText=0x0000 text results of search
OP_PetitionUpdate=0x0000
OP_PetitionCheckout=0x0000
OP_PetitionCheckIn=0x0000
OP_PetitionQue=0x0000
OP_PetitionUnCheckout=0x0000
OP_PetitionDelete=0x0000
OP_DeletePetition=0x0000
OP_PetitionResolve=0x0000
OP_PDeletePetition=0x0000
OP_PetitionBug=0x0000
OP_PetitionRefresh=0x0000
OP_PetitionCheckout2=0x0000
OP_PetitionViewPetition=0x0000
# Login opcodes
OP_SessionReady=0x0000
OP_Login=0x0000
OP_ServerListRequest=0x0000
OP_PlayEverquestRequest=0x0000
OP_PlayEverquestResponse=0x0000
OP_ChatMessage=0x0000
OP_LoginAccepted=0x0000
OP_ServerListResponse=0x0000
OP_Poll=0x0000
OP_EnterChat=0x0000
OP_PollResponse=0x0000
# raw opcodes
OP_RAWSessionRequest=0x0000
OP_RAWSessionResponse=0x0000
OP_RAWCombined=0x0000
OP_RAWSessionDisconnect=0x0000
OP_RAWKeepAlive=0x0000
OP_RAWSessionStatRequest=0x0000
OP_RAWSessionStatResponse=0x0000
OP_RAWPacket=0x0000
OP_RAWFragment=0x0000
OP_RAWOutOfOrderAck=0x0000
OP_RAWAck=0x0000
OP_RAWAppCombined=0x0000
OP_RAWOutOfSession=0x0000
# we need to document the differences between these packets to make identifying them easier
OP_Some3ByteHPUpdate=0x0000 # initial HP update for mobs
OP_InitialHPUpdate=0x0000
@@ -0,0 +1,633 @@
# OPCodes not used by EQExtractor2 are most likely not correct.
#
# ShowEQ Import Notes:
# ZERO THE FILE first
# perl -pi -e 's/0x[0-9a-fA-F]{4}/0x0000/g' opcodes.conf
# Unknown Mapping:
# OP_Action2 -> OP_Damage
# OP_EnvDamage -> OP_Damage ---> might have been a one time mistake
# Name Differences:
# OP_CancelInvite -> OP_GroupCancelInvite
# OP_GMFind -> OP_FindPersonRequest
# OP_CommonMessage -> OP_ChannelMessage
OP_Unknown=0x0000
OP_ExploreUnknown=0x0000 # used for unknown explorer
# V = Verified correct
# C = Most likely correct
# U = Unsure, but should be correct or close
# world packets
# Required to reach Char Select:
OP_SendLoginInfo=0x4d5c #
OP_ApproveWorld=0x655c #
OP_LogServer=0x1497 #
OP_SendCharInfo=0x7f9e #
OP_ExpansionInfo=0x2c8f #
OP_GuildsList=0x5b0b #
OP_EnterWorld=0x710e #
OP_PostEnterWorld=0x7930 #
OP_World_Client_CRC1=0x7ce4 #
OP_World_Client_CRC2=0x7705 #
OP_SendSpellChecksum=0x0000 #
OP_SendSkillCapsChecksum=0x0000 #
# Character Select Related:
OP_DeleteCharacter=0x5ca5 #
OP_CharacterCreateRequest=0x4eba #
OP_CharacterCreate=0x3237 #
OP_RandomNameGenerator=0x26aa #
OP_ApproveName=0x3154 #
OP_MOTD=0x0b80 #
OP_SetChatServer=0x2c38 #
OP_SetChatServer2=0x441c #
OP_ZoneServerInfo=0x16f5 #
OP_WorldComplete=0x6c63 #
OP_WorldUnknown001=0x4274 #
OP_FloatListThing=0x1910 #
# Reasons for Disconnect:
OP_ZoneUnavail=0x20bc #
OP_WorldClientReady=0x0b89 # Testing VoA 0x3f24
OP_CharacterStillInZone=0x0000 #
OP_WorldChecksumFailure=0x0000 #
OP_WorldLoginFailed=0x0000 #
OP_WorldLogout=0x0000 #
OP_WorldLevelTooHigh=0x0000 #
OP_CharInacessable=0x0000 #
OP_UserCompInfo=0x0000 #
# OP_SendExeChecksum=0x0000 #
# OP_SendBaseDataChecksum=0x0000 #
# Zone in opcodes
OP_AckPacket=0x3594 #
OP_ZoneEntry=0x6087 #
OP_ReqNewZone=0x0000 #
OP_NewZone=0x51ae #
OP_ZoneSpawns=0x5f5e #
OP_PlayerProfile=0x537c #
OP_TimeOfDay=0x6015 #
OP_LevelUpdate=0x6e1c #
OP_Stamina=0x7686 #
OP_RequestClientZoneChange=0x224f #
OP_ZoneChange=0x28c8 #
OP_LockoutTimerInfo=0x0000 #
OP_ZoneServerReady=0x0000 #
OP_ZoneInUnknown=0x0000 #
OP_LogoutReply=0x0000 #
OP_PreLogoutReply=0x0000 #
# Required to fully log in
OP_SpawnAppearance=0x3f55 #
OP_ChangeSize=0x0000 #
OP_TributeUpdate=0x0000 #
OP_TributeTimer=0x0000 # Testing VoA 0x1525
OP_TaskDescription=0x2e4f #
OP_TaskActivity=0x512b #
OP_CompletedTasks=0x3141 #
OP_Weather=0x3e50 #
OP_SendAATable=0x6db5 # Testing VoA 0x6a7e
OP_UpdateAA=0x5363 # Testing VoA 0x5363
OP_RespondAA=0x7bf6 # Testing VoA 0x0643 or maybe 0x7bf6
OP_ReqClientSpawn=0x2c27 #
OP_SpawnDoor=0x3604 #
OP_GroundSpawn=0x1436 #
OP_SendZonepoints=0x13da #
OP_SendAAStats=0x4e22 #
OP_WorldObjectsSent=0x7b73 #
OP_BlockedBuffs=0x1681 #
OP_RemoveBlockedBuffs=0x6a86 #
OP_ClearBlockedBuffs=0x7ae1 #
OP_SendExpZonein=0x0f14 #
OP_SendTributes=0x010d #
OP_TributeInfo=0x047c #
OP_SendGuildTributes=0x0000 #
OP_AAExpUpdate=0x1318 #
OP_ExpUpdate=0x221a # Testing VoA 0x0555
OP_HPUpdate=0x2369 #
OP_ManaChange=0x3887 #
OP_TGB=0x3672 #
OP_SpecialMesg=0x039d #
OP_GuildMemberList=0x51bc #
OP_GuildMOTD=0x0a1d # Testing VoA 0x0a1d
OP_CharInventory=0x6cfe # Testing VoA 0x6cfe
OP_WearChange=0x1a58 #
OP_ClientUpdate=0x7062 #
OP_ClientReady=0x1272 #
OP_SetServerFilter=0x053a #
# Guild Opcodes
OP_GetGuildMOTD=0x3415 #
OP_GetGuildMOTDReply=0x709d #
OP_GuildMemberUpdate=0x589f #
OP_GuildInvite=0x5488 #
OP_GuildRemove=0x47d3 #
OP_GuildPeace=0x1d22 #
OP_SetGuildMOTD=0x5f85 #
OP_GuildList=0x0000 #
OP_GuildWar=0x0598 #
OP_GuildLeader=0x67c8 #
OP_GuildDelete=0x230e #
OP_GuildInviteAccept=0x2b5a #
OP_GuildDemote=0x1899 #
OP_GuildPublicNote=0x2dbd #
OP_GuildManageBanker=0x0000 #
OP_GuildBank=0x0000 #
OP_SetGuildRank=0x4ffe #
OP_GuildUpdateURLAndChannel=0x03d1 #
OP_GuildMemberLevelUpdate=0x0000 #
OP_ZoneGuildList=0x0000 #
OP_GetGuildsList=0x0000 #
OP_GuildStatus=0x6916 #
OP_GuildCreate=0x0000 #
# OP_GuildManageRemove=0x0000 #
# OP_GuildManageAdd=0x0000 #
# OP_GuildManageStatus=0x0000 #
# GM/guide opcodes
OP_GMServers=0x6989 #
OP_GMBecomeNPC=0x7093 #
OP_GMZoneRequest=0x701f #
OP_GMZoneRequest2=0x01 #
OP_GMGoto=0x15a1 #
OP_GMSearchCorpse=0x2bff #
OP_GMHideMe=0x7e4d #
OP_GMDelCorpse=0x072f #
OP_GMApproval=0x481f #
OP_GMToggle=0x2042 #
OP_GMSummon=0x6e47 #
OP_GMEmoteZone=0x307d #
OP_GMEmoteWorld=0x0c2d #
OP_GMFind=0x6e27 #
OP_GMKick=0x5a56 #
OP_GMKill=0x51fe #
OP_GMNameChange=0x0000 #
OP_GMLastName=0x1055 #
OP_InspectAnswer=0x0c54 #
OP_BeginCast=0x0d5a #
OP_BuffFadeMsg=0x1b8a #
OP_ConsentResponse=0x35c6 #
OP_MemorizeSpell=0x569e #
OP_SwapSpell=0x28a7 #
OP_CastSpell=0x8543 #
OP_Consider=0x70c6 #
OP_FormattedMessage=0x4675 #
OP_SimpleMessage=0x0698 #
OP_Buff=0x4658 #
OP_Illusion=0x10b7 #
OP_MoneyOnCorpse=0x4074 #
OP_RandomReply=0x07fb #
OP_DenyResponse=0x0370 #
OP_SkillUpdate=0x7f01 #
OP_GMTrainSkillConfirm=0x0000 #
OP_RandomReq=0x303e #
OP_Death=0x6685 #
OP_Bind_Wound=0x7b64 #
OP_GMTraining=0x5960 #
OP_GMEndTraining=0x4a61 #
OP_GMTrainSkill=0x4885 #
OP_Animation=0x0b93 #
OP_Begging=0x0ca5 #
OP_Consent=0x6bb9 #
OP_ConsentDeny=0x6b7f #
OP_AutoFire=0x23fc #
OP_PetCommands=0x7312 #
OP_DeleteSpell=0x0142 #
OP_Surname=0x777c #
OP_ClearSurname=0x0000 #
OP_FaceChange=0x0507 #
OP_SenseHeading=0x1dad #
OP_Action=0x1b85 #
OP_ConsiderCorpse=0x0e94 #
OP_HideCorpse=0x0000 #
OP_CorpseDrag=0x0000 #
OP_CorpseDrop=0x0000 #
OP_Bug=0x3365 #
OP_Feedback=0x52b5 #
OP_Report=0x211a #
OP_Damage=0x45d6 #
OP_ChannelMessage=0x2e79 #
OP_Assist=0x5658 #
OP_AssistGroup=0x43bc #
OP_MoveCoin=0x1418 #
OP_ZonePlayerToBind=0x2480 #
OP_KeyRing=0x3b85 #
OP_WhoAllRequest=0x177a #
OP_WhoAllResponse=0x15de #
OP_FriendsWho=0x73d6 #
OP_ConfirmDelete=0x604d #
OP_Logout=0x6275 #
OP_Rewind=0x09e3 #
OP_TargetCommand=0x3088 #
OP_InspectRequest=0x0000 #
OP_Hide=0x2913 #
OP_Jump=0x243b #
OP_Camp=0x3cd6 #
OP_Emote=0x0000 #
OP_SetRunMode=0x59c3 #
OP_BankerChange=0x0000 #
OP_TargetMouse=0x3edc #
OP_MobHealth=0x5cb0 #
OP_InitialMobHealth=0x0000 #
OP_TargetHoTT=0x460e #
OP_TargetBuffs=0x7c24 #
OP_BuffCreate=0x0c98 #
OP_BuffRemoveRequest=0x3567
OP_DeleteSpawn=0x3164 #
OP_AutoAttack=0x2257 #
OP_AutoAttack2=0x0000 #
OP_Consume=0x2ee2 #
OP_MoveItem=0x2963 #
OP_DeleteItem=0x7547 #
OP_DeleteCharge=0x6a90 #
OP_ItemPacket=0x38b0 #
OP_ItemLinkResponse=0x6948 #
OP_ItemLinkClick=0x3c66 #
OP_NewSpawn=0x016c #
OP_Track=0x2444 #
OP_TrackTarget=0x538f #
OP_TrackUnknown=0x10fa #
OP_ClickDoor=0x48f9 #
OP_MoveDoor=0x231f #
OP_RemoveAllDoors=0x24a3 #
OP_EnvDamage=0x2730 #
OP_BoardBoat=0x50c2 #
OP_Forage=0x3c02 #
OP_LeaveBoat=0x569a #
OP_ControlBoat=0x2641 #
OP_SafeFallSuccess=0x1dc6 #
OP_RezzComplete=0x7108 #
OP_RezzRequest=0x66c5 #
OP_RezzAnswer=0x71eb #
OP_Shielding=0x7598 #
OP_RequestDuel=0x0e71 #
OP_MobRename=0x6884 #
OP_AugmentItem=0x4cc6 #
OP_WeaponEquip1=0x11bc #
OP_WeaponEquip2=0x2121 #
OP_WeaponUnequip2=0x7b87 #
OP_ApplyPoison=0x3582 #
OP_Save=0x47e7 #
OP_TestBuff=0x712b #
OP_CustomTitles=0x6ade #
OP_Split=0x3a18 #
OP_YellForHelp=0x1f87 #
OP_LoadSpellSet=0x440f #
OP_Bandolier=0x3ad1 #
OP_PotionBelt=0x7b7f #
OP_DuelResponse=0x1df9 #
OP_DuelResponse2=0x36f8 #
OP_SaveOnZoneReq=0x5408 #
OP_ReadBook=0x41b5 #
OP_Dye=0x32c6 #
OP_InterruptCast=0x7706 #
OP_AAAction=0x55dd #
OP_LeadershipExpToggle=0x69d0 #
OP_LeadershipExpUpdate=0x3703 #
OP_PurchaseLeadershipAA=0x6e58 #
OP_UpdateLeadershipAA=0x0297 #
OP_MarkNPC=0x6b9e #
OP_ClearNPCMarks=0x074f #
OP_DoGroupLeadershipAbility=0x0000 #
OP_GroupLeadershipAAUpdate=0x0000 #
OP_DelegateAbility=0x105b #
OP_SetGroupTarget=0x42c7 #
OP_Charm=0x17f7 #
OP_Stun=0x41a6 #
OP_SendFindableNPCs=0x50c1 #
OP_FindPersonRequest=0x19a8 #
OP_FindPersonReply=0x7e45 #
OP_Sound=0x2d1d #
OP_PetBuffWindow=0x4895 #
OP_LevelAppearance=0x78b9 #
OP_Translocate=0x42ef #
OP_Sacrifice=0x2dc6 #
OP_PopupResponse=0x0000 #
OP_OnLevelMessage=0x0000 #
OP_AugmentInfo=0x0000 #
OP_Petition=0x31d1 #
OP_SomeItemPacketMaybe=0x1513 #
OP_PVPStats=0x0000 #
OP_PVPLeaderBoardRequest=0x0000 #
OP_PVPLeaderBoardReply=0x0000 #
OP_PVPLeaderBoardDetailsRequest=0x0000 #
OP_PVPLeaderBoardDetailsReply=0x0000 #
OP_RestState=0x0000 #
OP_RespawnWindow=0x435b #
OP_DisciplineTimer=0x74ca #
OP_LDoNButton=0x597d #
OP_SetStartCity=0x179d #
OP_VoiceMacroIn=0x0fce #
OP_VoiceMacroOut=0x1c36 #
OP_ItemViewUnknown=0x0000 #
OP_VetRewardsAvaliable=0x3637 #
OP_VetClaimRequest=0x032b #
OP_VetClaimReply=0x7b6e #
OP_CrystalCountUpdate=0x0000 #
OP_DisciplineUpdate=0x0d8d #
OP_BecomeCorpse=0x0000 #
OP_Action2=0x0000 #
OP_MobUpdate=0x5a05 #
OP_NPCMoveUpdate=0x5a4c #
OP_CameraEffect=0x6812 #
OP_SpellEffect=0x0989 #
OP_RemoveNimbusEffect=0x0000 #
OP_AltCurrency=0x2536
OP_AltCurrencyMerchantRequest=0x5aac
OP_AltCurrencyMerchantReply=0x17c7
OP_AltCurrencyPurchase=0x6efe
OP_AltCurrencySell=0x32d9
OP_AltCurrencySellSelection=0x7eac
OP_AltCurrencyReclaim=0x1560
OP_CrystalReclaim=0x0000
OP_CrystalCreate=0x0000
OP_Untargetable=0x101e
OP_IncreaseStats=0x3fdc
OP_DzQuit=0x0000
OP_DzListTimers=0x0000
OP_DzAddPlayer=0x0000
OP_DzRemovePlayer=0x0000
OP_DzSwapPlayer=0x0000
OP_DzMakeLeader=0x0000
OP_DzPlayerList=0x0000
OP_DzJoinExpeditionConfirm=0x0000
OP_DzJoinExpeditionReply=0x0000
OP_DzExpeditionInfo=0x0000
OP_DzMemberStatus=0x0000
OP_DzLeaderStatus=0x0000
OP_DzExpeditionEndsWarning=0x0000
OP_DzExpeditionList=0x0000
OP_DzMemberList=0x0000
OP_DzCompass=0x0000
OP_DzChooseZone=0x0000
# New Opcodes
OP_SpawnPositionUpdate=0x0000 #
OP_ManaUpdate=0x7c94 #
OP_EnduranceUpdate=0x5851 #
OP_MobManaUpdate=0x4d27 #
OP_MobEnduranceUpdate=0x190c #
# Looting
OP_LootRequest=0x1d85 #
OP_EndLootRequest=0x0bc #
OP_LootItem=0x5bd9 #
OP_LootComplete=0x4ca1 #
# bazaar trader stuff stuff:
OP_BazaarSearch=0x2881 #
OP_TraderDelItem=0x0000 #
OP_BecomeTrader=0x358a #
OP_TraderShop=0x49f4 #
OP_Trader=0x058c #
OP_TraderBuy=0x783c #
OP_Barter=0x766f #
OP_ShopItem=0x0000 #
OP_BazaarInspect=0x0000 #
OP_Bazaar=0x0000 #
OP_TraderItemUpdate=0x0000 #
# pc/npc trading
OP_TradeRequest=0x0c24 #
OP_TradeAcceptClick=0x064a #
OP_TradeRequestAck=0x606a #
OP_TradeCoins=0x0149 #
OP_FinishTrade=0x3ff6 #
OP_CancelTrade=0x527e #
OP_TradeMoneyUpdate=0x1ebb #
OP_MoneyUpdate=0x528f #
OP_TradeBusy=0x2c03 #
# Sent after canceling trade or after closing tradeskill object
OP_FinishWindow=0x3c27 #
OP_FinishWindow2=0x2c6d #
# Sent on Live for what seems to be item existance verification
# Ex. Before Right Click Effect happens from items
OP_ItemVerifyRequest=0x0000 #
OP_ItemVerifyReply=0x0000 #
# merchant crap
OP_ShopPlayerSell=0x0b27 #
OP_ShopRequest=0x33e5 #
OP_ShopEnd=0x2244 #
OP_ShopEndConfirm=0x4762 #
OP_ShopPlayerBuy=0x436a #
OP_ShopDelItem=0x537c #
# tradeskill stuff:
OP_ClickObject=0x5f0d #
OP_ClickObjectAction=0x29df #
OP_ClearObject=0x38d1 #
OP_RecipeDetails=0x068 #
OP_RecipesFavorite=0x0000 #
OP_RecipesSearch=0x0239 #
OP_RecipeReply=0x1ecf #
OP_RecipeAutoCombine=0x66bf #
OP_TradeSkillCombine=0x4212 #
# Tribute Packets:
OP_OpenGuildTributeMaster=0x0000 #
OP_OpenTributeMaster=0x3ba3 #
OP_SelectTribute=0x314f #
OP_TributeItem=0x0000 #
OP_TributeMoney=0x1772 #
OP_TributeToggle=0x0000 #
OP_TributePointUpdate=0x0000 #
OP_TributeNPC=0x0000 #
OP_GuildTributeInfo=0x0000 #
OP_OpenTributeReply=0x0000 #
# OP_GuildTributeStatus=0x0000 #
# Adventure packets:
OP_LeaveAdventure=0x771f #
OP_AdventureFinish=0x3168 #
OP_AdventureInfoRequest=0x05d8 #
OP_AdventureInfo=0x164b #
OP_AdventureRequest=0x3a75 #
OP_AdventureDetails=0x05 #
OP_AdventureData=0x21df #
OP_AdventureUpdate=0x6129 #
OP_AdventureMerchantRequest=0x0000 #
OP_AdventureMerchantResponse=0x0000 #
OP_AdventureMerchantPurchase=0x0000 #
OP_AdventureMerchantSell=0x0000 #
OP_AdventurePointsUpdate=0x7d05 #
OP_AdventureStatsRequest=0x0000 #
OP_AdventureStatsReply=0x15a7 #
OP_AdventureLeaderboardRequest=0x0000 #
OP_AdventureLeaderboardReply=0x6bfb #
# Group Opcodes
OP_GroupDisband=0x4200 #
OP_GroupInvite=0x3288 #
OP_GroupFollow=0x1190 #
OP_GroupUpdate=0x0000 #
OP_GroupUpdateB=0x0000 #
OP_GroupCancelInvite=0x0000 #
OP_GroupAcknowledge=0x0000 #
OP_GroupDelete=0x0000 #
OP_CancelInvite=0x132f #
OP_GroupFollow2=0x3519 #
OP_GroupInvite2=0x083b #
OP_GroupDisbandYou=0x0000 #
OP_GroupDisbandOther=0x0000 #
OP_GroupLeaderChange=0x0000 #
OP_GroupRoles=0x0000 #
OP_GroupMakeLeader=0x0000
# LFG/LFP Opcodes
OP_LFGCommand=0x457d #
OP_LFGGetMatchesRequest=0x49e7 #
OP_LFGGetMatchesResponse=0x4817 #
OP_LFPGetMatchesRequest=0x5fc7 #
OP_LFPGetMatchesResponse=0x3d0c #
OP_LFPCommand=0x20c6 #
OP_LFGAppearance=0x0000 #
OP_LFGResponse=0x0000 #
# Raid Opcodes
OP_RaidInvite=0x550f #
OP_RaidUpdate=0x0000 # Testing VoA 0x0c08
OP_RaidJoin=0x0000 #
# Button-push commands
OP_Taunt=0x732c #
OP_CombatAbility=0x16a5 #
OP_SenseTraps=0x416b #
OP_PickPocket=0x13bd #
OP_DisarmTraps=0x0000 #
OP_Disarm=0x6def #
OP_Sneak=0x6eff #
OP_Fishing=0x0555 #
OP_InstillDoubt=0x4acf #
OP_FeignDeath=0x6145 #
OP_Mend=0x7fbc #
OP_LDoNOpen=0x7c87 #
# Task packets
OP_TaskActivityComplete=0x0000 #
OP_TaskMemberList=0x0000 #
OP_OpenNewTasksWindow=0x0000 #
OP_AvaliableTask=0x0000 #
OP_AcceptNewTask=0x0000 #
OP_TaskHistoryRequest=0x6d1f #
OP_TaskHistoryReply=0x189b #
OP_CancelTask=0x47ea #
OP_DeclineAllTasks=0x0000 #
# Title opcodes
OP_NewTitlesAvailable=0x6d95 #
OP_RequestTitles=0x7e3d #
OP_SendTitleList=0x3aef #
OP_SetTitle=0x725b #
OP_SetTitleReply=0x38e8 #
# mail opcodes
OP_Command=0x0000 #
OP_MailboxHeader=0x0000 #
OP_MailHeader=0x0000 #
OP_MailBody=0x0000 #
OP_NewMail=0x0000 #
OP_SentConfirm=0x0000 #
# # # # # # # # # # # Below this point should not be needed # # # # # # # # # # #
# This section are all unknown in Titanium
OP_ForceFindPerson=0x0000 #
OP_LocInfo=0x0000 #
OP_ReloadUI=0x0000 #
OP_ItemName=0x0000 #
OP_ItemLinkText=0x0000 #
OP_MultiLineMsg=0x0000 #
OP_MendHPUpdate=0x0000 #
OP_TargetReject=0x0000 #
OP_SafePoint=0x0000 #
OP_ApproveZone=0x0000 #
OP_ZoneComplete=0x0000 #
OP_ClientError=0x0000 #
OP_DumpName=0x0000 #
OP_Heartbeat=0x0000 #
OP_CrashDump=0x0000 #
OP_LoginComplete=0x0000 #
# discovered opcodes not yet used:
OP_PickLockSuccess=0x0000 #
OP_PlayMP3=0x0000 #
OP_ReclaimCrystals=0x0000 #
OP_DynamicWall=0x0000 #
OP_OpenDiscordMerchant=0x0000 #
OP_DiscordMerchantInventory=0x0000 #
OP_GiveMoney=0x0000 #
OP_RequestKnowledgeBase=0x0000 #
OP_KnowledgeBase=0x0000 #
OP_SlashAdventure=0x0000 # /adventure
OP_BecomePVPPrompt=0x0000 #
OP_MoveLogRequest=0x0000 # gone I think
OP_MoveLogDisregard=0x0000 # gone I think
# named unknowns, to make looking for real unknown easier
OP_AnnoyingZoneUnknown=0x0000 #
OP_Some6ByteHPUpdate=0x0000 # seems to happen when you target group members
OP_QueryResponseThing=0x0000 #
# realityincarnate: these are just here to stop annoying several thousand byte packet dumps
#OP_LoginUnknown1=0x46d3 # U OP_SendSpellChecksum
#OP_LoginUnknown2=0x040b # U OP_SendSkillCapsChecksum
# Petition Opcodes
OP_PetitionSearch=0x0000 # search term for petition
OP_PetitionSearchResults=0x0000 # (list of?) matches from search
OP_PetitionSearchText=0x0000 # text results of search
OP_PetitionUpdate=0x0000 #
OP_PetitionCheckout=0x0000 #
OP_PetitionCheckIn=0x0000 #
OP_PetitionQue=0x0000 #
OP_PetitionUnCheckout=0x0000 #
OP_PetitionDelete=0x0000 #
OP_DeletePetition=0x0000 #
OP_PetitionResolve=0x0000 #
OP_PDeletePetition=0x0000 #
OP_PetitionBug=0x0000 #
OP_PetitionRefresh=0x0000 #
OP_PetitionCheckout2=0x0000 #
OP_PetitionViewPetition=0x0000 #
# Login opcodes
OP_SessionReady=0x0000 #
OP_Login=0x0000 #
OP_ServerListRequest=0x0000 #
OP_PlayEverquestRequest=0x0000 #
OP_PlayEverquestResponse=0x0000 #
OP_ChatMessage=0x0000 #
OP_LoginAccepted=0x0000 #
OP_ServerListResponse=0x0000 #
OP_Poll=0x0000 #
OP_EnterChat=0x0000 #
OP_PollResponse=0x0000 #
# raw opcodes
OP_RAWSessionRequest=0x0000 #
OP_RAWSessionResponse=0x0000 #
OP_RAWCombined=0x0000 #
OP_RAWSessionDisconnect=0x0000 #
OP_RAWKeepAlive=0x0000 #
OP_RAWSessionStatRequest=0x0000 #
OP_RAWSessionStatResponse=0x0000 #
OP_RAWPacket=0x0000 #
OP_RAWFragment=0x0000 #
OP_RAWOutOfOrderAck=0x0000 #
OP_RAWAck=0x0000 #
OP_RAWAppCombined=0x0000 #
OP_RAWOutOfSession=0x0000 #
# we need to document the differences between these packets to make identifying them easier
OP_Some3ByteHPUpdate=0x0000 # initial HP update for mobs
OP_InitialHPUpdate=0x0000 #
@@ -0,0 +1,633 @@
# OPCodes not used by EQExtractor2 are most likely not correct.
#
# ShowEQ Import Notes:
# ZERO THE FILE first
# perl -pi -e 's/0x[0-9a-fA-F]{4}/0x0000/g' opcodes.conf
# Unknown Mapping:
# OP_Action2 -> OP_Damage
# OP_EnvDamage -> OP_Damage ---> might have been a one time mistake
# Name Differences:
# OP_CancelInvite -> OP_GroupCancelInvite
# OP_GMFind -> OP_FindPersonRequest
# OP_CommonMessage -> OP_ChannelMessage
OP_Unknown=0x0000
OP_ExploreUnknown=0x0000 # used for unknown explorer
# V = Verified correct
# C = Most likely correct
# U = Unsure, but should be correct or close
# world packets
# Required to reach Char Select:
OP_SendLoginInfo=0x4d5c #
OP_ApproveWorld=0x655c #
OP_LogServer=0x1497 #
OP_SendCharInfo=0x7f9e #
OP_ExpansionInfo=0x2c8f #
OP_GuildsList=0x5b0b #
OP_EnterWorld=0x710e #
OP_PostEnterWorld=0x7930 #
OP_World_Client_CRC1=0x7ce4 #
OP_World_Client_CRC2=0x7705 #
OP_SendSpellChecksum=0x0000 #
OP_SendSkillCapsChecksum=0x0000 #
# Character Select Related:
OP_DeleteCharacter=0x5ca5 #
OP_CharacterCreateRequest=0x4eba #
OP_CharacterCreate=0x3237 #
OP_RandomNameGenerator=0x26aa #
OP_ApproveName=0x3154 #
OP_MOTD=0x0b80 #
OP_SetChatServer=0x2c38 #
OP_SetChatServer2=0x441c #
OP_ZoneServerInfo=0x16f5 #
OP_WorldComplete=0x6c63 #
OP_WorldUnknown001=0x4274 #
OP_FloatListThing=0x1910 #
# Reasons for Disconnect:
OP_ZoneUnavail=0x20bc #
OP_WorldClientReady=0x0b89 # Testing VoA 0x3f24
OP_CharacterStillInZone=0x0000 #
OP_WorldChecksumFailure=0x0000 #
OP_WorldLoginFailed=0x0000 #
OP_WorldLogout=0x0000 #
OP_WorldLevelTooHigh=0x0000 #
OP_CharInacessable=0x0000 #
OP_UserCompInfo=0x0000 #
# OP_SendExeChecksum=0x0000 #
# OP_SendBaseDataChecksum=0x0000 #
# Zone in opcodes
OP_AckPacket=0x3594 #
OP_ZoneEntry=0x4892 #
OP_ReqNewZone=0x0000 #
OP_NewZone=0x4118 #
OP_ZoneSpawns=0x5f5e #
OP_PlayerProfile=0x6afd #
OP_TimeOfDay=0x6015 #
OP_LevelUpdate=0x6e1c #
OP_Stamina=0x7686 #
OP_RequestClientZoneChange=0x224f #
OP_ZoneChange=0x28c8 #
OP_LockoutTimerInfo=0x0000 #
OP_ZoneServerReady=0x0000 #
OP_ZoneInUnknown=0x0000 #
OP_LogoutReply=0x0000 #
OP_PreLogoutReply=0x0000 #
# Required to fully log in
OP_SpawnAppearance=0x3f55 #
OP_ChangeSize=0x0000 #
OP_TributeUpdate=0x0000 #
OP_TributeTimer=0x0000 # Testing VoA 0x1525
OP_TaskDescription=0x2e4f #
OP_TaskActivity=0x512b #
OP_CompletedTasks=0x3141 #
OP_Weather=0x3e50 #
OP_SendAATable=0x0d98 # Testing VoA 0x6a7e
OP_UpdateAA=0x5363 # Testing VoA 0x5363
OP_RespondAA=0x7bf6 # Testing VoA 0x0643 or maybe 0x7bf6
OP_ReqClientSpawn=0x2c27 #
OP_SpawnDoor=0x5a55 #
OP_GroundSpawn=0x5c85 #
OP_SendZonepoints=0x2683 #
OP_SendAAStats=0x4e22 #
OP_WorldObjectsSent=0x7b73 #
OP_BlockedBuffs=0x1681 #
OP_RemoveBlockedBuffs=0x6a86 #
OP_ClearBlockedBuffs=0x7ae1 #
OP_SendExpZonein=0x0f14 #
OP_SendTributes=0x010d #
OP_TributeInfo=0x047c #
OP_SendGuildTributes=0x0000 #
OP_AAExpUpdate=0x1318 #
OP_ExpUpdate=0x221a # Testing VoA 0x0555
OP_HPUpdate=0x2369 #
OP_ManaChange=0x3887 #
OP_TGB=0x3672 #
OP_SpecialMesg=0x039d #
OP_GuildMemberList=0x51bc #
OP_GuildMOTD=0x0a1d # Testing VoA 0x0a1d
OP_CharInventory=0x6cfe # Testing VoA 0x6cfe
OP_WearChange=0x1a58 #
OP_ClientUpdate=0x7062 #
OP_ClientReady=0x1272 #
OP_SetServerFilter=0x053a #
# Guild Opcodes
OP_GetGuildMOTD=0x3415 #
OP_GetGuildMOTDReply=0x709d #
OP_GuildMemberUpdate=0x589f #
OP_GuildInvite=0x5488 #
OP_GuildRemove=0x47d3 #
OP_GuildPeace=0x1d22 #
OP_SetGuildMOTD=0x5f85 #
OP_GuildList=0x0000 #
OP_GuildWar=0x0598 #
OP_GuildLeader=0x67c8 #
OP_GuildDelete=0x230e #
OP_GuildInviteAccept=0x2b5a #
OP_GuildDemote=0x1899 #
OP_GuildPublicNote=0x2dbd #
OP_GuildManageBanker=0x0000 #
OP_GuildBank=0x0000 #
OP_SetGuildRank=0x4ffe #
OP_GuildUpdateURLAndChannel=0x03d1 #
OP_GuildMemberLevelUpdate=0x0000 #
OP_ZoneGuildList=0x0000 #
OP_GetGuildsList=0x0000 #
OP_GuildStatus=0x6916 #
OP_GuildCreate=0x0000 #
# OP_GuildManageRemove=0x0000 #
# OP_GuildManageAdd=0x0000 #
# OP_GuildManageStatus=0x0000 #
# GM/guide opcodes
OP_GMServers=0x6989 #
OP_GMBecomeNPC=0x7093 #
OP_GMZoneRequest=0x701f #
OP_GMZoneRequest2=0x01 #
OP_GMGoto=0x15a1 #
OP_GMSearchCorpse=0x2bff #
OP_GMHideMe=0x7e4d #
OP_GMDelCorpse=0x072f #
OP_GMApproval=0x481f #
OP_GMToggle=0x2042 #
OP_GMSummon=0x6e47 #
OP_GMEmoteZone=0x307d #
OP_GMEmoteWorld=0x0c2d #
OP_GMFind=0x6e27 #
OP_GMKick=0x5a56 #
OP_GMKill=0x51fe #
OP_GMNameChange=0x0000 #
OP_GMLastName=0x1055 #
OP_InspectAnswer=0x0c54 #
OP_BeginCast=0x0d5a #
OP_BuffFadeMsg=0x1b8a #
OP_ConsentResponse=0x35c6 #
OP_MemorizeSpell=0x569e #
OP_SwapSpell=0x28a7 #
OP_CastSpell=0x8543 #
OP_Consider=0x70c6 #
OP_FormattedMessage=0x4675 #
OP_SimpleMessage=0x0698 #
OP_Buff=0x4658 #
OP_Illusion=0x10b7 #
OP_MoneyOnCorpse=0x4074 #
OP_RandomReply=0x07fb #
OP_DenyResponse=0x0370 #
OP_SkillUpdate=0x7f01 #
OP_GMTrainSkillConfirm=0x0000 #
OP_RandomReq=0x303e #
OP_Death=0x6685 #
OP_Bind_Wound=0x7b64 #
OP_GMTraining=0x5960 #
OP_GMEndTraining=0x4a61 #
OP_GMTrainSkill=0x4885 #
OP_Animation=0x0b93 #
OP_Begging=0x0ca5 #
OP_Consent=0x6bb9 #
OP_ConsentDeny=0x6b7f #
OP_AutoFire=0x23fc #
OP_PetCommands=0x7312 #
OP_DeleteSpell=0x0142 #
OP_Surname=0x777c #
OP_ClearSurname=0x0000 #
OP_FaceChange=0x0507 #
OP_SenseHeading=0x1dad #
OP_Action=0x1b85 #
OP_ConsiderCorpse=0x0e94 #
OP_HideCorpse=0x0000 #
OP_CorpseDrag=0x0000 #
OP_CorpseDrop=0x0000 #
OP_Bug=0x3365 #
OP_Feedback=0x52b5 #
OP_Report=0x211a #
OP_Damage=0x45d6 #
OP_ChannelMessage=0x2e79 #
OP_Assist=0x5658 #
OP_AssistGroup=0x43bc #
OP_MoveCoin=0x1418 #
OP_ZonePlayerToBind=0x2480 #
OP_KeyRing=0x3b85 #
OP_WhoAllRequest=0x177a #
OP_WhoAllResponse=0x15de #
OP_FriendsWho=0x73d6 #
OP_ConfirmDelete=0x604d #
OP_Logout=0x6275 #
OP_Rewind=0x09e3 #
OP_TargetCommand=0x3088 #
OP_InspectRequest=0x0000 #
OP_Hide=0x2913 #
OP_Jump=0x243b #
OP_Camp=0x3cd6 #
OP_Emote=0x0000 #
OP_SetRunMode=0x59c3 #
OP_BankerChange=0x0000 #
OP_TargetMouse=0x3edc #
OP_MobHealth=0x5cb0 #
OP_InitialMobHealth=0x0000 #
OP_TargetHoTT=0x460e #
OP_TargetBuffs=0x7c24 #
OP_BuffCreate=0x0c98 #
OP_BuffRemoveRequest=0x3567
OP_DeleteSpawn=0x3164 #
OP_AutoAttack=0x2257 #
OP_AutoAttack2=0x0000 #
OP_Consume=0x2ee2 #
OP_MoveItem=0x2963 #
OP_DeleteItem=0x7547 #
OP_DeleteCharge=0x6a90 #
OP_ItemPacket=0x399b #
OP_ItemLinkResponse=0x6948 #
OP_ItemLinkClick=0x3c66 #
OP_NewSpawn=0x016c #
OP_Track=0x2444 #
OP_TrackTarget=0x538f #
OP_TrackUnknown=0x10fa #
OP_ClickDoor=0x48f9 #
OP_MoveDoor=0x231f #
OP_RemoveAllDoors=0x24a3 #
OP_EnvDamage=0x2730 #
OP_BoardBoat=0x50c2 #
OP_Forage=0x3c02 #
OP_LeaveBoat=0x569a #
OP_ControlBoat=0x2641 #
OP_SafeFallSuccess=0x1dc6 #
OP_RezzComplete=0x7108 #
OP_RezzRequest=0x66c5 #
OP_RezzAnswer=0x71eb #
OP_Shielding=0x7598 #
OP_RequestDuel=0x0e71 #
OP_MobRename=0x6884 #
OP_AugmentItem=0x4cc6 #
OP_WeaponEquip1=0x11bc #
OP_WeaponEquip2=0x2121 #
OP_WeaponUnequip2=0x7b87 #
OP_ApplyPoison=0x3582 #
OP_Save=0x47e7 #
OP_TestBuff=0x712b #
OP_CustomTitles=0x6ade #
OP_Split=0x3a18 #
OP_YellForHelp=0x1f87 #
OP_LoadSpellSet=0x440f #
OP_Bandolier=0x3ad1 #
OP_PotionBelt=0x7b7f #
OP_DuelResponse=0x1df9 #
OP_DuelResponse2=0x36f8 #
OP_SaveOnZoneReq=0x5408 #
OP_ReadBook=0x41b5 #
OP_Dye=0x32c6 #
OP_InterruptCast=0x7706 #
OP_AAAction=0x55dd #
OP_LeadershipExpToggle=0x69d0 #
OP_LeadershipExpUpdate=0x3703 #
OP_PurchaseLeadershipAA=0x6e58 #
OP_UpdateLeadershipAA=0x0297 #
OP_MarkNPC=0x6b9e #
OP_ClearNPCMarks=0x074f #
OP_DoGroupLeadershipAbility=0x0000 #
OP_GroupLeadershipAAUpdate=0x0000 #
OP_DelegateAbility=0x105b #
OP_SetGroupTarget=0x42c7 #
OP_Charm=0x17f7 #
OP_Stun=0x41a6 #
OP_SendFindableNPCs=0x099e #
OP_FindPersonRequest=0x19a8 #
OP_FindPersonReply=0x7e45 #
OP_Sound=0x2d1d #
OP_PetBuffWindow=0x4895 #
OP_LevelAppearance=0x78b9 #
OP_Translocate=0x42ef #
OP_Sacrifice=0x2dc6 #
OP_PopupResponse=0x0000 #
OP_OnLevelMessage=0x0000 #
OP_AugmentInfo=0x0000 #
OP_Petition=0x31d1 #
OP_SomeItemPacketMaybe=0x1513 #
OP_PVPStats=0x0000 #
OP_PVPLeaderBoardRequest=0x0000 #
OP_PVPLeaderBoardReply=0x0000 #
OP_PVPLeaderBoardDetailsRequest=0x0000 #
OP_PVPLeaderBoardDetailsReply=0x0000 #
OP_RestState=0x0000 #
OP_RespawnWindow=0x435b #
OP_DisciplineTimer=0x74ca #
OP_LDoNButton=0x597d #
OP_SetStartCity=0x179d #
OP_VoiceMacroIn=0x0fce #
OP_VoiceMacroOut=0x1c36 #
OP_ItemViewUnknown=0x0000 #
OP_VetRewardsAvaliable=0x3637 #
OP_VetClaimRequest=0x032b #
OP_VetClaimReply=0x7b6e #
OP_CrystalCountUpdate=0x0000 #
OP_DisciplineUpdate=0x0d8d #
OP_BecomeCorpse=0x0000 #
OP_Action2=0x0000 #
OP_MobUpdate=0x4656 #
OP_NPCMoveUpdate=0x4f35 #
OP_CameraEffect=0x6812 #
OP_SpellEffect=0x0989 #
OP_RemoveNimbusEffect=0x0000 #
OP_AltCurrency=0x2536
OP_AltCurrencyMerchantRequest=0x5aac
OP_AltCurrencyMerchantReply=0x17c7
OP_AltCurrencyPurchase=0x6efe
OP_AltCurrencySell=0x32d9
OP_AltCurrencySellSelection=0x7eac
OP_AltCurrencyReclaim=0x1560
OP_CrystalReclaim=0x0000
OP_CrystalCreate=0x0000
OP_Untargetable=0x101e
OP_IncreaseStats=0x3fdc
OP_DzQuit=0x0000
OP_DzListTimers=0x0000
OP_DzAddPlayer=0x0000
OP_DzRemovePlayer=0x0000
OP_DzSwapPlayer=0x0000
OP_DzMakeLeader=0x0000
OP_DzPlayerList=0x0000
OP_DzJoinExpeditionConfirm=0x0000
OP_DzJoinExpeditionReply=0x0000
OP_DzExpeditionInfo=0x0000
OP_DzMemberStatus=0x0000
OP_DzLeaderStatus=0x0000
OP_DzExpeditionEndsWarning=0x0000
OP_DzExpeditionList=0x0000
OP_DzMemberList=0x0000
OP_DzCompass=0x0000
OP_DzChooseZone=0x0000
# New Opcodes
OP_SpawnPositionUpdate=0x0000 #
OP_ManaUpdate=0x7c94 #
OP_EnduranceUpdate=0x5851 #
OP_MobManaUpdate=0x4d27 #
OP_MobEnduranceUpdate=0x190c #
# Looting
OP_LootRequest=0x1d85 #
OP_EndLootRequest=0x0bc #
OP_LootItem=0x5bd9 #
OP_LootComplete=0x4ca1 #
# bazaar trader stuff stuff:
OP_BazaarSearch=0x2881 #
OP_TraderDelItem=0x0000 #
OP_BecomeTrader=0x358a #
OP_TraderShop=0x49f4 #
OP_Trader=0x058c #
OP_TraderBuy=0x783c #
OP_Barter=0x766f #
OP_ShopItem=0x0000 #
OP_BazaarInspect=0x0000 #
OP_Bazaar=0x0000 #
OP_TraderItemUpdate=0x0000 #
# pc/npc trading
OP_TradeRequest=0x0c24 #
OP_TradeAcceptClick=0x064a #
OP_TradeRequestAck=0x606a #
OP_TradeCoins=0x0149 #
OP_FinishTrade=0x3ff6 #
OP_CancelTrade=0x527e #
OP_TradeMoneyUpdate=0x1ebb #
OP_MoneyUpdate=0x528f #
OP_TradeBusy=0x2c03 #
# Sent after canceling trade or after closing tradeskill object
OP_FinishWindow=0x3c27 #
OP_FinishWindow2=0x2c6d #
# Sent on Live for what seems to be item existance verification
# Ex. Before Right Click Effect happens from items
OP_ItemVerifyRequest=0x0000 #
OP_ItemVerifyReply=0x0000 #
# merchant crap
OP_ShopPlayerSell=0x0b27 #
OP_ShopRequest=0x442a #
OP_ShopEnd=0x078e #
OP_ShopEndConfirm=0x4762 #
OP_ShopPlayerBuy=0x436a #
OP_ShopDelItem=0x537c #
# tradeskill stuff:
OP_ClickObject=0x5f0d #
OP_ClickObjectAction=0x29df #
OP_ClearObject=0x38d1 #
OP_RecipeDetails=0x068 #
OP_RecipesFavorite=0x0000 #
OP_RecipesSearch=0x0239 #
OP_RecipeReply=0x1ecf #
OP_RecipeAutoCombine=0x66bf #
OP_TradeSkillCombine=0x4212 #
# Tribute Packets:
OP_OpenGuildTributeMaster=0x0000 #
OP_OpenTributeMaster=0x3ba3 #
OP_SelectTribute=0x314f #
OP_TributeItem=0x0000 #
OP_TributeMoney=0x1772 #
OP_TributeToggle=0x0000 #
OP_TributePointUpdate=0x0000 #
OP_TributeNPC=0x0000 #
OP_GuildTributeInfo=0x0000 #
OP_OpenTributeReply=0x0000 #
# OP_GuildTributeStatus=0x0000 #
# Adventure packets:
OP_LeaveAdventure=0x771f #
OP_AdventureFinish=0x3168 #
OP_AdventureInfoRequest=0x05d8 #
OP_AdventureInfo=0x164b #
OP_AdventureRequest=0x3a75 #
OP_AdventureDetails=0x05 #
OP_AdventureData=0x21df #
OP_AdventureUpdate=0x6129 #
OP_AdventureMerchantRequest=0x0000 #
OP_AdventureMerchantResponse=0x0000 #
OP_AdventureMerchantPurchase=0x0000 #
OP_AdventureMerchantSell=0x0000 #
OP_AdventurePointsUpdate=0x7d05 #
OP_AdventureStatsRequest=0x0000 #
OP_AdventureStatsReply=0x15a7 #
OP_AdventureLeaderboardRequest=0x0000 #
OP_AdventureLeaderboardReply=0x6bfb #
# Group Opcodes
OP_GroupDisband=0x4200 #
OP_GroupInvite=0x3288 #
OP_GroupFollow=0x1190 #
OP_GroupUpdate=0x0000 #
OP_GroupUpdateB=0x0000 #
OP_GroupCancelInvite=0x0000 #
OP_GroupAcknowledge=0x0000 #
OP_GroupDelete=0x0000 #
OP_CancelInvite=0x132f #
OP_GroupFollow2=0x3519 #
OP_GroupInvite2=0x083b #
OP_GroupDisbandYou=0x0000 #
OP_GroupDisbandOther=0x0000 #
OP_GroupLeaderChange=0x0000 #
OP_GroupRoles=0x0000 #
OP_GroupMakeLeader=0x13da
# LFG/LFP Opcodes
OP_LFGCommand=0x457d #
OP_LFGGetMatchesRequest=0x49e7 #
OP_LFGGetMatchesResponse=0x4817 #
OP_LFPGetMatchesRequest=0x5fc7 #
OP_LFPGetMatchesResponse=0x3d0c #
OP_LFPCommand=0x20c6 #
OP_LFGAppearance=0x0000 #
OP_LFGResponse=0x0000 #
# Raid Opcodes
OP_RaidInvite=0x550f #
OP_RaidUpdate=0x0000 # Testing VoA 0x0c08
OP_RaidJoin=0x0000 #
# Button-push commands
OP_Taunt=0x732c #
OP_CombatAbility=0x16a5 #
OP_SenseTraps=0x416b #
OP_PickPocket=0x13bd #
OP_DisarmTraps=0x0000 #
OP_Disarm=0x6def #
OP_Sneak=0x6eff #
OP_Fishing=0x0555 #
OP_InstillDoubt=0x4acf #
OP_FeignDeath=0x6145 #
OP_Mend=0x7fbc #
OP_LDoNOpen=0x7c87 #
# Task packets
OP_TaskActivityComplete=0x0000 #
OP_TaskMemberList=0x0000 #
OP_OpenNewTasksWindow=0x0000 #
OP_AvaliableTask=0x0000 #
OP_AcceptNewTask=0x0000 #
OP_TaskHistoryRequest=0x6d1f #
OP_TaskHistoryReply=0x189b #
OP_CancelTask=0x47ea #
OP_DeclineAllTasks=0x0000 #
# Title opcodes
OP_NewTitlesAvailable=0x6d95 #
OP_RequestTitles=0x7e3d #
OP_SendTitleList=0x3aef #
OP_SetTitle=0x725b #
OP_SetTitleReply=0x38e8 #
# mail opcodes
OP_Command=0x0000 #
OP_MailboxHeader=0x0000 #
OP_MailHeader=0x0000 #
OP_MailBody=0x0000 #
OP_NewMail=0x0000 #
OP_SentConfirm=0x0000 #
# # # # # # # # # # # Below this point should not be needed # # # # # # # # # # #
# This section are all unknown in Titanium
OP_ForceFindPerson=0x0000 #
OP_LocInfo=0x0000 #
OP_ReloadUI=0x0000 #
OP_ItemName=0x0000 #
OP_ItemLinkText=0x0000 #
OP_MultiLineMsg=0x0000 #
OP_MendHPUpdate=0x0000 #
OP_TargetReject=0x0000 #
OP_SafePoint=0x0000 #
OP_ApproveZone=0x0000 #
OP_ZoneComplete=0x0000 #
OP_ClientError=0x0000 #
OP_DumpName=0x0000 #
OP_Heartbeat=0x0000 #
OP_CrashDump=0x0000 #
OP_LoginComplete=0x0000 #
# discovered opcodes not yet used:
OP_PickLockSuccess=0x0000 #
OP_PlayMP3=0x0000 #
OP_ReclaimCrystals=0x0000 #
OP_DynamicWall=0x0000 #
OP_OpenDiscordMerchant=0x0000 #
OP_DiscordMerchantInventory=0x0000 #
OP_GiveMoney=0x0000 #
OP_RequestKnowledgeBase=0x0000 #
OP_KnowledgeBase=0x0000 #
OP_SlashAdventure=0x0000 # /adventure
OP_BecomePVPPrompt=0x0000 #
OP_MoveLogRequest=0x0000 # gone I think
OP_MoveLogDisregard=0x0000 # gone I think
# named unknowns, to make looking for real unknown easier
OP_AnnoyingZoneUnknown=0x0000 #
OP_Some6ByteHPUpdate=0x0000 # seems to happen when you target group members
OP_QueryResponseThing=0x0000 #
# realityincarnate: these are just here to stop annoying several thousand byte packet dumps
#OP_LoginUnknown1=0x46d3 # U OP_SendSpellChecksum
#OP_LoginUnknown2=0x040b # U OP_SendSkillCapsChecksum
# Petition Opcodes
OP_PetitionSearch=0x0000 # search term for petition
OP_PetitionSearchResults=0x0000 # (list of?) matches from search
OP_PetitionSearchText=0x0000 # text results of search
OP_PetitionUpdate=0x0000 #
OP_PetitionCheckout=0x0000 #
OP_PetitionCheckIn=0x0000 #
OP_PetitionQue=0x0000 #
OP_PetitionUnCheckout=0x0000 #
OP_PetitionDelete=0x0000 #
OP_DeletePetition=0x0000 #
OP_PetitionResolve=0x0000 #
OP_PDeletePetition=0x0000 #
OP_PetitionBug=0x0000 #
OP_PetitionRefresh=0x0000 #
OP_PetitionCheckout2=0x0000 #
OP_PetitionViewPetition=0x0000 #
# Login opcodes
OP_SessionReady=0x0000 #
OP_Login=0x0000 #
OP_ServerListRequest=0x0000 #
OP_PlayEverquestRequest=0x0000 #
OP_PlayEverquestResponse=0x0000 #
OP_ChatMessage=0x0000 #
OP_LoginAccepted=0x0000 #
OP_ServerListResponse=0x0000 #
OP_Poll=0x0000 #
OP_EnterChat=0x0000 #
OP_PollResponse=0x0000 #
# raw opcodes
OP_RAWSessionRequest=0x0000 #
OP_RAWSessionResponse=0x0000 #
OP_RAWCombined=0x0000 #
OP_RAWSessionDisconnect=0x0000 #
OP_RAWKeepAlive=0x0000 #
OP_RAWSessionStatRequest=0x0000 #
OP_RAWSessionStatResponse=0x0000 #
OP_RAWPacket=0x0000 #
OP_RAWFragment=0x0000 #
OP_RAWOutOfOrderAck=0x0000 #
OP_RAWAck=0x0000 #
OP_RAWAppCombined=0x0000 #
OP_RAWOutOfSession=0x0000 #
# we need to document the differences between these packets to make identifying them easier
OP_Some3ByteHPUpdate=0x0000 # initial HP update for mobs
OP_InitialHPUpdate=0x0000 #
@@ -0,0 +1,631 @@
# ShowEQ Import Notes:
# ZERO THE FILE first
# perl -pi -e 's/0x[0-9a-fA-F]{4}/0x0000/g' opcodes.conf
# Unknown Mapping:
# OP_Action2 -> OP_Damage
# OP_EnvDamage -> OP_Damage ---> might have been a one time mistake
# Name Differences:
# OP_CancelInvite -> OP_GroupCancelInvite
# OP_GMFind -> OP_FindPersonRequest
# OP_CommonMessage -> OP_ChannelMessage
OP_Unknown=0x0000
OP_ExploreUnknown=0x0000 # used for unknown explorer
# V = Verified correct
# C = Most likely correct
# U = Unsure, but should be correct or close
# world packets
# Required to reach Char Select:
OP_SendLoginInfo=0x4d5c #
OP_ApproveWorld=0x655c #
OP_LogServer=0x1497 #
OP_SendCharInfo=0x7f9e #
OP_ExpansionInfo=0x2c8f #
OP_GuildsList=0x5b0b #
OP_EnterWorld=0x710e #
OP_PostEnterWorld=0x7930 #
OP_World_Client_CRC1=0x7ce4 #
OP_World_Client_CRC2=0x7705 #
OP_SendSpellChecksum=0x0000 #
OP_SendSkillCapsChecksum=0x0000 #
# Character Select Related:
OP_DeleteCharacter=0x5ca5 #
OP_CharacterCreateRequest=0x4eba #
OP_CharacterCreate=0x3237 #
OP_RandomNameGenerator=0x26aa #
OP_ApproveName=0x3154 #
OP_MOTD=0x0b80 #
OP_SetChatServer=0x2c38 #
OP_SetChatServer2=0x441c #
OP_ZoneServerInfo=0x16f5 #
OP_WorldComplete=0x6c63 #
OP_WorldUnknown001=0x4274 #
OP_FloatListThing=0x1910 #
# Reasons for Disconnect:
OP_ZoneUnavail=0x20bc #
OP_WorldClientReady=0x0b89 # Testing VoA 0x3f24
OP_CharacterStillInZone=0x0000 #
OP_WorldChecksumFailure=0x0000 #
OP_WorldLoginFailed=0x0000 #
OP_WorldLogout=0x0000 #
OP_WorldLevelTooHigh=0x0000 #
OP_CharInacessable=0x0000 #
OP_UserCompInfo=0x0000 #
# OP_SendExeChecksum=0x0000 #
# OP_SendBaseDataChecksum=0x0000 #
# Zone in opcodes
OP_AckPacket=0x3594 #
OP_ZoneEntry=0x5821 #
OP_ReqNewZone=0x4118 #
OP_NewZone=0x43ac #
OP_ZoneSpawns=0x5f5e #
OP_PlayerProfile=0x6afd #
OP_TimeOfDay=0x6015 #
OP_LevelUpdate=0x6e1c #
OP_Stamina=0x7686 #
OP_RequestClientZoneChange=0x224f #
OP_ZoneChange=0x28c8 #
OP_LockoutTimerInfo=0x0000 #
OP_ZoneServerReady=0x0000 #
OP_ZoneInUnknown=0x0000 #
OP_LogoutReply=0x0000 #
OP_PreLogoutReply=0x0000 #
# Required to fully log in
OP_SpawnAppearance=0x3f55 #
OP_ChangeSize=0x0000 #
OP_TributeUpdate=0x0000 #
OP_TributeTimer=0x0000 # Testing VoA 0x1525
OP_TaskDescription=0x2e4f #
OP_TaskActivity=0x512b #
OP_CompletedTasks=0x3141 #
OP_Weather=0x3e50 #
OP_SendAATable=0x6a7e # Testing VoA 0x6a7e
OP_UpdateAA=0x5363 # Testing VoA 0x5363
OP_RespondAA=0x7bf6 # Testing VoA 0x0643 or maybe 0x7bf6
OP_ReqClientSpawn=0x2c27 #
OP_SpawnDoor=0x7113 #
OP_GroundSpawn=0x33e5 #
OP_SendZonepoints=0x399f #
OP_SendAAStats=0x4e22 #
OP_WorldObjectsSent=0x7b73 #
OP_BlockedBuffs=0x1681 #
OP_RemoveBlockedBuffs=0x6a86 #
OP_ClearBlockedBuffs=0x7ae1 #
OP_SendExpZonein=0x0f14 #
OP_SendTributes=0x010d #
OP_TributeInfo=0x047c #
OP_SendGuildTributes=0x0000 #
OP_AAExpUpdate=0x1318 #
OP_ExpUpdate=0x221a # Testing VoA 0x0555
OP_HPUpdate=0x2369 #
OP_ManaChange=0x3887 #
OP_TGB=0x3672 #
OP_SpecialMesg=0x039d #
OP_GuildMemberList=0x51bc #
OP_GuildMOTD=0x0a1d # Testing VoA 0x0a1d
OP_CharInventory=0x6cfe # Testing VoA 0x6cfe
OP_WearChange=0x1a58 #
OP_ClientUpdate=0x7062 #
OP_ClientReady=0x1272 #
OP_SetServerFilter=0x053a #
# Guild Opcodes
OP_GetGuildMOTD=0x3415 #
OP_GetGuildMOTDReply=0x709d #
OP_GuildMemberUpdate=0x589f #
OP_GuildInvite=0x5488 #
OP_GuildRemove=0x47d3 #
OP_GuildPeace=0x1d22 #
OP_SetGuildMOTD=0x5f85 #
OP_GuildList=0x0000 #
OP_GuildWar=0x0598 #
OP_GuildLeader=0x67c8 #
OP_GuildDelete=0x230e #
OP_GuildInviteAccept=0x2b5a #
OP_GuildDemote=0x1899 #
OP_GuildPublicNote=0x2dbd #
OP_GuildManageBanker=0x0000 #
OP_GuildBank=0x0000 #
OP_SetGuildRank=0x4ffe #
OP_GuildUpdateURLAndChannel=0x03d1 #
OP_GuildMemberLevelUpdate=0x0000 #
OP_ZoneGuildList=0x0000 #
OP_GetGuildsList=0x0000 #
OP_GuildStatus=0x6916 #
OP_GuildCreate=0x0000 #
# OP_GuildManageRemove=0x0000 #
# OP_GuildManageAdd=0x0000 #
# OP_GuildManageStatus=0x0000 #
# GM/guide opcodes
OP_GMServers=0x6989 #
OP_GMBecomeNPC=0x7093 #
OP_GMZoneRequest=0x701f #
OP_GMZoneRequest2=0x01 #
OP_GMGoto=0x15a1 #
OP_GMSearchCorpse=0x2bff #
OP_GMHideMe=0x7e4d #
OP_GMDelCorpse=0x072f #
OP_GMApproval=0x481f #
OP_GMToggle=0x2042 #
OP_GMSummon=0x6e47 #
OP_GMEmoteZone=0x307d #
OP_GMEmoteWorld=0x0c2d #
OP_GMFind=0x6e27 #
OP_GMKick=0x5a56 #
OP_GMKill=0x51fe #
OP_GMNameChange=0x0000 #
OP_GMLastName=0x1055 #
OP_InspectAnswer=0x0c54 #
OP_BeginCast=0x0d5a #
OP_BuffFadeMsg=0x1b8a #
OP_ConsentResponse=0x35c6 #
OP_MemorizeSpell=0x569e #
OP_SwapSpell=0x28a7 #
OP_CastSpell=0x8543 #
OP_Consider=0x70c6 #
OP_FormattedMessage=0x4675 #
OP_SimpleMessage=0x0698 #
OP_Buff=0x4658 #
OP_Illusion=0x10b7 #
OP_MoneyOnCorpse=0x4074 #
OP_RandomReply=0x07fb #
OP_DenyResponse=0x0370 #
OP_SkillUpdate=0x7f01 #
OP_GMTrainSkillConfirm=0x0000 #
OP_RandomReq=0x303e #
OP_Death=0x6685 #
OP_Bind_Wound=0x7b64 #
OP_GMTraining=0x5960 #
OP_GMEndTraining=0x4a61 #
OP_GMTrainSkill=0x4885 #
OP_Animation=0x0b93 #
OP_Begging=0x0ca5 #
OP_Consent=0x6bb9 #
OP_ConsentDeny=0x6b7f #
OP_AutoFire=0x23fc #
OP_PetCommands=0x7312 #
OP_DeleteSpell=0x0142 #
OP_Surname=0x777c #
OP_ClearSurname=0x0000 #
OP_FaceChange=0x0507 #
OP_SenseHeading=0x1dad #
OP_Action=0x1b85 #
OP_ConsiderCorpse=0x0e94 #
OP_HideCorpse=0x0000 #
OP_CorpseDrag=0x0000 #
OP_CorpseDrop=0x0000 #
OP_Bug=0x3365 #
OP_Feedback=0x52b5 #
OP_Report=0x211a #
OP_Damage=0x45d6 #
OP_ChannelMessage=0x2e79 #
OP_Assist=0x5658 #
OP_AssistGroup=0x43bc #
OP_MoveCoin=0x1418 #
OP_ZonePlayerToBind=0x2480 #
OP_KeyRing=0x3b85 #
OP_WhoAllRequest=0x177a #
OP_WhoAllResponse=0x15de #
OP_FriendsWho=0x73d6 #
OP_ConfirmDelete=0x604d #
OP_Logout=0x6275 #
OP_Rewind=0x09e3 #
OP_TargetCommand=0x3088 #
OP_InspectRequest=0x2683 #
OP_Hide=0x2913 #
OP_Jump=0x243b #
OP_Camp=0x3cd6 #
OP_Emote=0x0000 #
OP_SetRunMode=0x59c3 #
OP_BankerChange=0x0000 #
OP_TargetMouse=0x3edc #
OP_MobHealth=0x5cb0 #
OP_InitialMobHealth=0x0000 #
OP_TargetHoTT=0x460e #
OP_TargetBuffs=0x7c24 #
OP_BuffCreate=0x0c98 #
OP_BuffRemoveRequest=0x3567
OP_DeleteSpawn=0x3164 #
OP_AutoAttack=0x2257 #
OP_AutoAttack2=0x0000 #
OP_Consume=0x2ee2 #
OP_MoveItem=0x2963 #
OP_DeleteItem=0x7547 #
OP_DeleteCharge=0x6a90 #
OP_ItemPacket=0x2dd3 #
OP_ItemLinkResponse=0x6948 #
OP_ItemLinkClick=0x3c66 #
OP_NewSpawn=0x016c #
OP_Track=0x2444 #
OP_TrackTarget=0x538f #
OP_TrackUnknown=0x10fa #
OP_ClickDoor=0x48f9 #
OP_MoveDoor=0x231f #
OP_RemoveAllDoors=0x24a3 #
OP_EnvDamage=0x2730 #
OP_BoardBoat=0x50c2 #
OP_Forage=0x3c02 #
OP_LeaveBoat=0x569a #
OP_ControlBoat=0x2641 #
OP_SafeFallSuccess=0x1dc6 #
OP_RezzComplete=0x7108 #
OP_RezzRequest=0x66c5 #
OP_RezzAnswer=0x71eb #
OP_Shielding=0x7598 #
OP_RequestDuel=0x0e71 #
OP_MobRename=0x6884 #
OP_AugmentItem=0x4cc6 #
OP_WeaponEquip1=0x11bc #
OP_WeaponEquip2=0x2121 #
OP_WeaponUnequip2=0x7b87 #
OP_ApplyPoison=0x3582 #
OP_Save=0x47e7 #
OP_TestBuff=0x712b #
OP_CustomTitles=0x6ade #
OP_Split=0x3a18 #
OP_YellForHelp=0x1f87 #
OP_LoadSpellSet=0x440f #
OP_Bandolier=0x3ad1 #
OP_PotionBelt=0x7b7f #
OP_DuelResponse=0x1df9 #
OP_DuelResponse2=0x36f8 #
OP_SaveOnZoneReq=0x5408 #
OP_ReadBook=0x41b5 #
OP_Dye=0x32c6 #
OP_InterruptCast=0x7706 #
OP_AAAction=0x55dd #
OP_LeadershipExpToggle=0x69d0 #
OP_LeadershipExpUpdate=0x3703 #
OP_PurchaseLeadershipAA=0x6e58 #
OP_UpdateLeadershipAA=0x0297 #
OP_MarkNPC=0x6b9e #
OP_ClearNPCMarks=0x074f #
OP_DoGroupLeadershipAbility=0x0000 #
OP_GroupLeadershipAAUpdate=0x0000 #
OP_DelegateAbility=0x105b #
OP_SetGroupTarget=0x42c7 #
OP_Charm=0x17f7 #
OP_Stun=0x41a6 #
OP_SendFindableNPCs=0x3015 #
OP_FindPersonRequest=0x19a8 #
OP_FindPersonReply=0x7e45 #
OP_Sound=0x2d1d #
OP_PetBuffWindow=0x4895 #
OP_LevelAppearance=0x78b9 #
OP_Translocate=0x42ef #
OP_Sacrifice=0x2dc6 #
OP_PopupResponse=0x0000 #
OP_OnLevelMessage=0x0000 #
OP_AugmentInfo=0x0000 #
OP_Petition=0x31d1 #
OP_SomeItemPacketMaybe=0x1513 #
OP_PVPStats=0x0000 #
OP_PVPLeaderBoardRequest=0x0000 #
OP_PVPLeaderBoardReply=0x0000 #
OP_PVPLeaderBoardDetailsRequest=0x0000 #
OP_PVPLeaderBoardDetailsReply=0x0000 #
OP_RestState=0x0000 #
OP_RespawnWindow=0x435b #
OP_DisciplineTimer=0x74ca #
OP_LDoNButton=0x597d #
OP_SetStartCity=0x179d #
OP_VoiceMacroIn=0x0fce #
OP_VoiceMacroOut=0x1c36 #
OP_ItemViewUnknown=0x0000 #
OP_VetRewardsAvaliable=0x3637 #
OP_VetClaimRequest=0x032b #
OP_VetClaimReply=0x7b6e #
OP_CrystalCountUpdate=0x0000 #
OP_DisciplineUpdate=0x0d8d #
OP_BecomeCorpse=0x0000 #
OP_Action2=0x0000 #
OP_MobUpdate=0x4656 #
OP_NPCMoveUpdate=0x2339 #
OP_CameraEffect=0x6812 #
OP_SpellEffect=0x0989 #
OP_RemoveNimbusEffect=0x0000 #
OP_AltCurrency=0x2536
OP_AltCurrencyMerchantRequest=0x5aac
OP_AltCurrencyMerchantReply=0x17c7
OP_AltCurrencyPurchase=0x6efe
OP_AltCurrencySell=0x32d9
OP_AltCurrencySellSelection=0x7eac
OP_AltCurrencyReclaim=0x1560
OP_CrystalReclaim=0x0000
OP_CrystalCreate=0x0000
OP_Untargetable=0x101e
OP_IncreaseStats=0x3fdc
OP_DzQuit=0x0000
OP_DzListTimers=0x0000
OP_DzAddPlayer=0x0000
OP_DzRemovePlayer=0x0000
OP_DzSwapPlayer=0x0000
OP_DzMakeLeader=0x0000
OP_DzPlayerList=0x0000
OP_DzJoinExpeditionConfirm=0x0000
OP_DzJoinExpeditionReply=0x0000
OP_DzExpeditionInfo=0x0000
OP_DzMemberStatus=0x0000
OP_DzLeaderStatus=0x0000
OP_DzExpeditionEndsWarning=0x0000
OP_DzExpeditionList=0x0000
OP_DzMemberList=0x0000
OP_DzCompass=0x0000
OP_DzChooseZone=0x0000
# New Opcodes
OP_SpawnPositionUpdate=0x0000 #
OP_ManaUpdate=0x7c94 #
OP_EnduranceUpdate=0x5851 #
OP_MobManaUpdate=0x4d27 #
OP_MobEnduranceUpdate=0x190c #
# Looting
OP_LootRequest=0x1d85 #
OP_EndLootRequest=0x0bc #
OP_LootItem=0x5bd9 #
OP_LootComplete=0x4ca1 #
# bazaar trader stuff stuff:
OP_BazaarSearch=0x2881 #
OP_TraderDelItem=0x0000 #
OP_BecomeTrader=0x358a #
OP_TraderShop=0x49f4 #
OP_Trader=0x058c #
OP_TraderBuy=0x783c #
OP_Barter=0x766f #
OP_ShopItem=0x0000 #
OP_BazaarInspect=0x0000 #
OP_Bazaar=0x0000 #
OP_TraderItemUpdate=0x0000 #
# pc/npc trading
OP_TradeRequest=0x0c24 #
OP_TradeAcceptClick=0x064a #
OP_TradeRequestAck=0x606a #
OP_TradeCoins=0x0149 #
OP_FinishTrade=0x3ff6 #
OP_CancelTrade=0x527e #
OP_TradeMoneyUpdate=0x1ebb #
OP_MoneyUpdate=0x528f #
OP_TradeBusy=0x2c03 #
# Sent after canceling trade or after closing tradeskill object
OP_FinishWindow=0x3c27 #
OP_FinishWindow2=0x2c6d #
# Sent on Live for what seems to be item existance verification
# Ex. Before Right Click Effect happens from items
OP_ItemVerifyRequest=0x0000 #
OP_ItemVerifyReply=0x0000 #
# merchant crap
OP_ShopPlayerSell=0x0b27 #
OP_ShopRequest=0x4194 #
OP_ShopEnd=0x078e #
OP_ShopEndConfirm=0x4762 #
OP_ShopPlayerBuy=0x436a #
OP_ShopDelItem=0x537c #
# tradeskill stuff:
OP_ClickObject=0x5f0d #
OP_ClickObjectAction=0x29df #
OP_ClearObject=0x38d1 #
OP_RecipeDetails=0x068 #
OP_RecipesFavorite=0x0000 #
OP_RecipesSearch=0x0239 #
OP_RecipeReply=0x1ecf #
OP_RecipeAutoCombine=0x66bf #
OP_TradeSkillCombine=0x4212 #
# Tribute Packets:
OP_OpenGuildTributeMaster=0x0000 #
OP_OpenTributeMaster=0x3ba3 #
OP_SelectTribute=0x314f #
OP_TributeItem=0x0000 #
OP_TributeMoney=0x1772 #
OP_TributeToggle=0x0000 #
OP_TributePointUpdate=0x0000 #
OP_TributeNPC=0x0000 #
OP_GuildTributeInfo=0x0000 #
OP_OpenTributeReply=0x0000 #
# OP_GuildTributeStatus=0x0000 #
# Adventure packets:
OP_LeaveAdventure=0x771f #
OP_AdventureFinish=0x3168 #
OP_AdventureInfoRequest=0x05d8 #
OP_AdventureInfo=0x164b #
OP_AdventureRequest=0x3a75 #
OP_AdventureDetails=0x05 #
OP_AdventureData=0x21df #
OP_AdventureUpdate=0x6129 #
OP_AdventureMerchantRequest=0x0000 #
OP_AdventureMerchantResponse=0x0000 #
OP_AdventureMerchantPurchase=0x0000 #
OP_AdventureMerchantSell=0x0000 #
OP_AdventurePointsUpdate=0x7d05 #
OP_AdventureStatsRequest=0x0000 #
OP_AdventureStatsReply=0x15a7 #
OP_AdventureLeaderboardRequest=0x0000 #
OP_AdventureLeaderboardReply=0x6bfb #
# Group Opcodes
OP_GroupDisband=0x4200 #
OP_GroupInvite=0x3288 #
OP_GroupFollow=0x1190 #
OP_GroupUpdate=0x0000 #
OP_GroupUpdateB=0x0000 #
OP_GroupCancelInvite=0x0000 #
OP_GroupAcknowledge=0x0000 #
OP_GroupDelete=0x0000 #
OP_CancelInvite=0x132f #
OP_GroupFollow2=0x3519 #
OP_GroupInvite2=0x083b #
OP_GroupDisbandYou=0x0000 #
OP_GroupDisbandOther=0x0000 #
OP_GroupLeaderChange=0x0000 #
OP_GroupRoles=0x0000 #
OP_GroupMakeLeader=0x13da
# LFG/LFP Opcodes
OP_LFGCommand=0x457d #
OP_LFGGetMatchesRequest=0x49e7 #
OP_LFGGetMatchesResponse=0x4817 #
OP_LFPGetMatchesRequest=0x5fc7 #
OP_LFPGetMatchesResponse=0x3d0c #
OP_LFPCommand=0x20c6 #
OP_LFGAppearance=0x0000 #
OP_LFGResponse=0x0000 #
# Raid Opcodes
OP_RaidInvite=0x550f #
OP_RaidUpdate=0x0000 # Testing VoA 0x0c08
OP_RaidJoin=0x0000 #
# Button-push commands
OP_Taunt=0x732c #
OP_CombatAbility=0x16a5 #
OP_SenseTraps=0x416b #
OP_PickPocket=0x13bd #
OP_DisarmTraps=0x0000 #
OP_Disarm=0x6def #
OP_Sneak=0x6eff #
OP_Fishing=0x0555 #
OP_InstillDoubt=0x4acf #
OP_FeignDeath=0x6145 #
OP_Mend=0x7fbc #
OP_LDoNOpen=0x7c87 #
# Task packets
OP_TaskActivityComplete=0x0000 #
OP_TaskMemberList=0x0000 #
OP_OpenNewTasksWindow=0x0000 #
OP_AvaliableTask=0x0000 #
OP_AcceptNewTask=0x0000 #
OP_TaskHistoryRequest=0x6d1f #
OP_TaskHistoryReply=0x189b #
OP_CancelTask=0x47ea #
OP_DeclineAllTasks=0x0000 #
# Title opcodes
OP_NewTitlesAvailable=0x6d95 #
OP_RequestTitles=0x7e3d #
OP_SendTitleList=0x3aef #
OP_SetTitle=0x725b #
OP_SetTitleReply=0x38e8 #
# mail opcodes
OP_Command=0x0000 #
OP_MailboxHeader=0x0000 #
OP_MailHeader=0x0000 #
OP_MailBody=0x0000 #
OP_NewMail=0x0000 #
OP_SentConfirm=0x0000 #
# # # # # # # # # # # Below this point should not be needed # # # # # # # # # # #
# This section are all unknown in Titanium
OP_ForceFindPerson=0x0000 #
OP_LocInfo=0x0000 #
OP_ReloadUI=0x0000 #
OP_ItemName=0x0000 #
OP_ItemLinkText=0x0000 #
OP_MultiLineMsg=0x0000 #
OP_MendHPUpdate=0x0000 #
OP_TargetReject=0x0000 #
OP_SafePoint=0x0000 #
OP_ApproveZone=0x0000 #
OP_ZoneComplete=0x0000 #
OP_ClientError=0x0000 #
OP_DumpName=0x0000 #
OP_Heartbeat=0x0000 #
OP_CrashDump=0x0000 #
OP_LoginComplete=0x0000 #
# discovered opcodes not yet used:
OP_PickLockSuccess=0x0000 #
OP_PlayMP3=0x0000 #
OP_ReclaimCrystals=0x0000 #
OP_DynamicWall=0x0000 #
OP_OpenDiscordMerchant=0x0000 #
OP_DiscordMerchantInventory=0x0000 #
OP_GiveMoney=0x0000 #
OP_RequestKnowledgeBase=0x0000 #
OP_KnowledgeBase=0x0000 #
OP_SlashAdventure=0x0000 # /adventure
OP_BecomePVPPrompt=0x0000 #
OP_MoveLogRequest=0x0000 # gone I think
OP_MoveLogDisregard=0x0000 # gone I think
# named unknowns, to make looking for real unknown easier
OP_AnnoyingZoneUnknown=0x0000 #
OP_Some6ByteHPUpdate=0x0000 # seems to happen when you target group members
OP_QueryResponseThing=0x0000 #
# realityincarnate: these are just here to stop annoying several thousand byte packet dumps
#OP_LoginUnknown1=0x46d3 # U OP_SendSpellChecksum
#OP_LoginUnknown2=0x040b # U OP_SendSkillCapsChecksum
# Petition Opcodes
OP_PetitionSearch=0x0000 # search term for petition
OP_PetitionSearchResults=0x0000 # (list of?) matches from search
OP_PetitionSearchText=0x0000 # text results of search
OP_PetitionUpdate=0x0000 #
OP_PetitionCheckout=0x0000 #
OP_PetitionCheckIn=0x0000 #
OP_PetitionQue=0x0000 #
OP_PetitionUnCheckout=0x0000 #
OP_PetitionDelete=0x0000 #
OP_DeletePetition=0x0000 #
OP_PetitionResolve=0x0000 #
OP_PDeletePetition=0x0000 #
OP_PetitionBug=0x0000 #
OP_PetitionRefresh=0x0000 #
OP_PetitionCheckout2=0x0000 #
OP_PetitionViewPetition=0x0000 #
# Login opcodes
OP_SessionReady=0x0000 #
OP_Login=0x0000 #
OP_ServerListRequest=0x0000 #
OP_PlayEverquestRequest=0x0000 #
OP_PlayEverquestResponse=0x0000 #
OP_ChatMessage=0x0000 #
OP_LoginAccepted=0x0000 #
OP_ServerListResponse=0x0000 #
OP_Poll=0x0000 #
OP_EnterChat=0x0000 #
OP_PollResponse=0x0000 #
# raw opcodes
OP_RAWSessionRequest=0x0000 #
OP_RAWSessionResponse=0x0000 #
OP_RAWCombined=0x0000 #
OP_RAWSessionDisconnect=0x0000 #
OP_RAWKeepAlive=0x0000 #
OP_RAWSessionStatRequest=0x0000 #
OP_RAWSessionStatResponse=0x0000 #
OP_RAWPacket=0x0000 #
OP_RAWFragment=0x0000 #
OP_RAWOutOfOrderAck=0x0000 #
OP_RAWAck=0x0000 #
OP_RAWAppCombined=0x0000 #
OP_RAWOutOfSession=0x0000 #
# we need to document the differences between these packets to make identifying them easier
OP_Some3ByteHPUpdate=0x0000 # initial HP update for mobs
OP_InitialHPUpdate=0x0000 #
@@ -0,0 +1,611 @@
# ShowEQ Import Notes:
# ZERO THE FILE first
# perl -pi -e 's/0x0000a-fA-F]{4}/0x0000/g' opcodes.conf
# Unknown Mapping:
# OP_Action2 -> OP_Damage
# OP_EnvDamage -> OP_Damage ---> might have been a one time mistake
# Name Differences:
# OP_CancelInvite -> OP_GroupCancelInvite
# OP_GMFind -> OP_FindPersonRequest
# OP_CommonMessage -> OP_ChannelMessage
OP_Unknown=0x0000
OP_ExploreUnknown=0x0000 # used for unknown explorer
# V = Verified correct
# C = Most likely correct
# U = Unsure, but should be correct or close
# world packets
# Required to reach Char Select:
OP_SendLoginInfo=0x6893 # was 0x2683
OP_ApproveWorld=0x115a # was 0x28a7
OP_LogServer=0x701f # was 0x224f
OP_SendCharInfo=0x1b85 # was 0x2c27
OP_ExpansionInfo=0x1771 # Same
OP_GuildsList=0x5b0b # Same
OP_EnterWorld=0x3288 # was 0x4f60
OP_PostEnterWorld=0x2f2c # was 0x570c
OP_World_Client_CRC1=0x0000 # C
OP_World_Client_CRC2=0x0000 # C
OP_SendSpellChecksum=0x0000 # C
OP_SendSkillCapsChecksum=0x0000 # C
# Character Select Related:
OP_DeleteCharacter=0x0000 # C
OP_CharacterCreateRequest=0x0000 # C
OP_CharacterCreate=0x0000 # C
OP_RandomNameGenerator=0x0000 # C 0x0000
OP_ApproveName=0x0000 # C
OP_MOTD=0x7312 # C 0x0000
OP_SetChatServer=0x698a #
OP_SetChatServer2=0x0000 # Not sent any more ?
OP_ZoneServerInfo=0x0479 # was 0x03cc
OP_WorldComplete=0x510c #
OP_WorldUnknown001=0x0000 # C 0x0000
OP_FloatListThing=0x0000 # V
# Reasons for Disconnect:
OP_ZoneUnavail=0x0000 # C 0x0000
OP_WorldClientReady=0x399b # C 0x0000
OP_CharacterStillInZone=0x0000 #
OP_WorldChecksumFailure=0x0000 #
OP_WorldLoginFailed=0x0000 #
OP_WorldLogout=0x0000 #
OP_WorldLevelTooHigh=0x0000 #
OP_CharInacessable=0x0000 #
OP_UserCompInfo=0x0000 #
# OP_SendExeChecksum=0x0000 #
# OP_SendBaseDataChecksum=0x0000 #
# Zone in opcodes
OP_AckPacket=0x3594 # was 0x3594
OP_ZoneEntry=0x002b # was 0x538f
OP_ReqNewZone=0x5ca5 # was 0x5ca5
OP_NewZone=0x0254 # was 0x0254
OP_ZoneSpawns=0x0000 # ?
OP_PlayerProfile=0x6022 # was 0x6022
OP_TimeOfDay=0x6015 # was 0x6015
OP_LevelUpdate=0x0000 # V
OP_Stamina=0x0000 # V
OP_RequestClientZoneChange=0x3fd2 # was 0x4178
OP_ZoneChange=0x0b93 # was 0x4a61
OP_LockoutTimerInfo=0x0000 #
OP_ZoneServerReady=0x0000 #
OP_ZoneInUnknown=0x0000 #
OP_LogoutReply=0x0000 #
OP_PreLogoutReply=0x0000 #
# Required to fully log in
OP_SpawnAppearance=0x7b64 # V
OP_TributeUpdate=0x4895 #
OP_TributeTimer=0x0000 # C
OP_TaskDescription=0x0000 # C
OP_TaskActivity=0x0000 # C
OP_CompletedTasks=0x0000 # C 0x0000
OP_Weather=0x7ce4 # was 0x0ed5
OP_SendAATable=0x1b26 #
OP_UpdateAA=0x0000 # V
OP_RespondAA=0x0000 # C 0x0000
OP_ReqClientSpawn=0x54e8 # was 0x6618
OP_SpawnDoor=0x4849 #
OP_GroundSpawn=0x5f0d # was 0x5f0d
OP_SendZonepoints=0x5f51 # was 0x0ff4
OP_SendAAStats=0x0000 # C
OP_WorldObjectsSent=0x7b73 # was 0x7b73
OP_BlockedBuffs=0x664a # was 0x4027
OP_SendExpZonein=0x2c27 # was 0x1436
OP_SendTributes=0x0000 # V
OP_TributeInfo=0x0000 # V
OP_SendGuildTributes=0x0000 # C 0x0000
OP_AAExpUpdate=0x0000 # V
OP_ExpUpdate=0x0000 # V
OP_HPUpdate=0x0000 # V
OP_ManaChange=0x0000 # C
OP_TGB=0x0000 # C
OP_SpecialMesg=0x3bf5 # was 0x14ff
OP_GuildMemberList=0x0000 # C
OP_GuildMOTD=0x0000 # V
OP_CharInventory=0x465e #
OP_WearChange=0x0000 # V
OP_ClientUpdate=0x7062 # was 0x7062
OP_ClientReady=0x6cdc # was 0x6cdc
OP_SetServerFilter=0x0000 # V
# Guild Opcodes
OP_GetGuildMOTD=0x0000 # C
OP_GetGuildMOTDReply=0x0000 # C
OP_GuildMemberUpdate=0x0000 # C
OP_GuildInvite=0x0000 # C
OP_GuildRemove=0x0000 # C
OP_GuildPeace=0x0000 # C
OP_SetGuildMOTD=0x0000 # C
OP_GuildList=0x0000 # C
OP_GuildWar=0x0000 # C
OP_GuildLeader=0x0000 # C
OP_GuildDelete=0x0000 # C
OP_GuildInviteAccept=0x0000 # C
OP_GuildDemote=0x0000 # C
OP_GuildPublicNote=0x0000 # C
OP_GuildManageBanker=0x0000 # C
OP_GuildBank=0x0000 # C
OP_SetGuildRank=0x0000 # C
OP_GuildUpdateURLAndChannel=0x0000 # C
OP_GuildMemberLevelUpdate=0x0000 #
OP_ZoneGuildList=0x0000 #
OP_GetGuildsList=0x0000 #
# OP_GuildManageRemove=0x0000 #
# OP_GuildManageAdd=0x0000 #
# OP_GuildManageStatus=0x0000 #
# GM/guide opcodes
OP_GMServers=0x0000 # C
OP_GMBecomeNPC=0x0000 # C
OP_GMZoneRequest=0x6f79 # was 0x18ea
OP_GMZoneRequest2=0x02d6 # was 0x3ad9
OP_GMGoto=0x0000 # C
OP_GMSearchCorpse=0x0000 # C
OP_GMHideMe=0x0000 # C
OP_GMDelCorpse=0x0000 # C
OP_GMApproval=0x0000 # C
OP_GMToggle=0x0000 # C 0x0000
OP_GMSummon=0x0000 # C
OP_GMEmoteZone=0x0000 # C
OP_GMEmoteWorld=0x0000 # C
OP_GMFind=0x0000 # C
OP_GMKick=0x0000 # C
OP_GMKill=0x0000 # C
OP_GMNameChange=0x0000 # C
OP_GMLastName=0x0000 # C
OP_InspectAnswer=0x0000 # C
OP_BeginCast=0x0000 # C
OP_BuffFadeMsg=0x50c2 # C
OP_ConsentResponse=0x0000 # C
OP_MemorizeSpell=0x0000 # C
OP_SwapSpell=0x0000 # C
OP_CastSpell=0x7286 # C
OP_Consider=0x0000 # C
OP_FormattedMessage=0x0000 # C
OP_SimpleMessage=0x0000 # C 0x0000
OP_Buff=0x0000 # C
OP_Illusion=0x0000 # C
OP_MoneyOnCorpse=0x0000 # C
OP_RandomReply=0x0000 # C
OP_DenyResponse=0x0000 # C
OP_SkillUpdate=0x0000 # C
OP_GMTrainSkillConfirm=0x0000 # C
OP_RandomReq=0x0000 # C
OP_Death=0x0000 # C
OP_Bind_Wound=0x0000 # C
OP_GMTraining=0x0000 # C
OP_GMEndTraining=0x0000 # C
OP_GMTrainSkill=0x0000 # C
OP_Animation=0x0000 # Was 0x0000
OP_Begging=0x0000 # C
OP_Consent=0x0000 # C
OP_ConsentDeny=0x0000 # C
OP_AutoFire=0x0000 # C
OP_PetCommands=0x0000 # C
OP_DeleteSpell=0x0000 # C
OP_Surname=0x0000 # C
OP_ClearSurname=0x0000 # C
OP_FaceChange=0x0000 # C
OP_SenseHeading=0x0000 # C
OP_Action=0x1513 # C
OP_ConsiderCorpse=0x0000 # C
OP_HideCorpse=0x0000 # C 0x0000
OP_Bug=0x0000 # C
OP_Feedback=0x0000 # C
OP_Report=0x0000 # C
OP_Damage=0x7519 # C or OP_Action2?
OP_ChannelMessage=0x2e79 # was 0x2e79
OP_Assist=0x0000 # C
OP_AssistGroup=0x0000 # C
OP_MoveCoin=0x0000 # C
OP_ZonePlayerToBind=0x0000 # C
OP_KeyRing=0x0000 # C
OP_WhoAllRequest=0x0000 # C
OP_WhoAllResponse=0x0000 # C
OP_FriendsWho=0x0000 # C
OP_ConfirmDelete=0x0000 # V
OP_Logout=0x44ae # was 0x64ec
OP_Rewind=0x0000 # C
OP_TargetCommand=0x0000 # C Was 0x0000
OP_InspectRequest=0x0000 # C
OP_Hide=0x0000 # C
OP_Jump=0x0000 # C
OP_Camp=0x42ef # C
OP_Emote=0x0000 # C
OP_SetRunMode=0x0000 # C
OP_BankerChange=0x0000 # C
OP_TargetMouse=0x36f8 # C 0x0000
OP_MobHealth=0x0000 # C
OP_InitialMobHealth=0x0000 # C
OP_TargetHoTT=0x0000 # C
OP_TargetBuffs=0x0000 # C
OP_BuffCreate=0x6bfb # V
OP_DeleteSpawn=0x7434 # was 0x7434
OP_AutoAttack=0x0000 # C
OP_AutoAttack2=0x0000 # C
OP_Consume=0x0000 # V
OP_MoveItem=0x0000 # C
OP_DeleteItem=0x0000 # C
OP_DeleteCharge=0x0000 # C
OP_ItemPacket=0x35b2 #
OP_ItemLinkResponse=0x0000 # C
OP_ItemLinkClick=0x0000 # C
OP_NewSpawn=0x0000 # C
OP_Track=0x0000 # C
OP_TrackTarget=0x0000 # C
OP_TrackUnknown=0x0000 # C
OP_ClickDoor=0x470e # was 0x4f1f
OP_MoveDoor=0x48f9 # was 0x1516
OP_EnvDamage=0x0000 # C
OP_BoardBoat=0x0000 # C
OP_Forage=0x0000 # C
OP_LeaveBoat=0x0000 # C
OP_ControlBoat=0x0000 # C
OP_SafeFallSuccess=0x0000 # C
OP_RezzComplete=0x0000 # C
OP_RezzRequest=0x0000 # C
OP_RezzAnswer=0x0000 # C
OP_Shielding=0x0000 # C
OP_RequestDuel=0x0000 # C
OP_MobRename=0x0000 # C
OP_AugmentItem=0x0000 # C
OP_WeaponEquip1=0x0000 # C
OP_WeaponEquip2=0x0000 # C
OP_WeaponUnequip2=0x0000 # C
OP_ApplyPoison=0x0000 # C
OP_Save=0x0000 # C
OP_TestBuff=0x0000 # C
OP_CustomTitles=0x0000 # C
OP_Split=0x0000 # C
OP_YellForHelp=0x0000 # C
OP_LoadSpellSet=0x0000 # C
OP_Bandolier=0x0000 # C
OP_PotionBelt=0x0000 # C
OP_DuelResponse=0x0000 # C
OP_DuelResponse2=0x0000 # C
OP_SaveOnZoneReq=0x2913 # was 0x2913
OP_ReadBook=0x0000 # C
OP_Dye=0x0000 # C
OP_InterruptCast=0x0000 # C
OP_AAAction=0x0000 # C
OP_LeadershipExpToggle=0x0000 # C
OP_LeadershipExpUpdate=0x0000 # C
OP_PurchaseLeadershipAA=0x0000 # C
OP_UpdateLeadershipAA=0x0000 # C
OP_MarkNPC=0x0000 # C
OP_ClearNPCMarks=0x0000 # C
OP_DoGroupLeadershipAbility=0x0000 # C
OP_GroupLeadershipAAUpdate=0x0000 # C
OP_DelegateAbility=0x0000 # C
OP_SetGroupTarget=0x0000 # C
OP_Charm=0x0000 # C
OP_Stun=0x0000 # C
OP_SendFindableNPCs=0x7eeb # C
OP_FindPersonRequest=0x0000 # C
OP_FindPersonReply=0x0000 # C
OP_Sound=0x0000 # C
OP_PetBuffWindow=0x0000 # C
OP_LevelAppearance=0x0000 # C
OP_Translocate=0x0000 # C
OP_Sacrifice=0x0000 # C
OP_PopupResponse=0x0000 # C
OP_OnLevelMessage=0x0000 # C
OP_AugmentInfo=0x0000 # C
OP_Petition=0x0000 # C
OP_SomeItemPacketMaybe=0x4200 # C
OP_SomeItemPacketMaybe=0x0000 # C
OP_PVPStats=0x0000 # C
OP_PVPLeaderBoardRequest=0x0000 # C
OP_PVPLeaderBoardReply=0x0000 # C
OP_PVPLeaderBoardDetailsRequest=0x0000 # C
OP_PVPLeaderBoardDetailsReply=0x0000 # C
OP_RestState=0x0000 # C
OP_RespawnWindow=0x0000 # C
OP_DisciplineTimer=0x0000 # C
OP_LDoNButton=0x0000 # C
OP_SetStartCity=0x0000 # C
OP_VoiceMacroIn=0x0000 # C
OP_VoiceMacroOut=0x0000 # C
OP_ItemViewUnknown=0x0000 # C
OP_VetRewardsAvaliable=0x0000 # C Mispelled?
OP_VetClaimRequest=0x0000 # C
OP_VetClaimReply=0x0000 # C
OP_CrystalCountUpdate=0x0000 # C
OP_DisciplineUpdate=0x0000 #
OP_BecomeCorpse=0x0000 #
OP_Action2=0x0000 # C OP_Damage?
OP_MobUpdate=0x4656 # was 0x4656
OP_NPCMoveUpdate=0x3278 #
OP_CameraEffect=0x0000 # V
OP_SpellEffect=0x0000 # V
OP_DzQuit=0x0000
OP_DzListTimers=0x0000
OP_DzAddPlayer=0x0000
OP_DzRemovePlayer=0x0000
OP_DzSwapPlayer=0x0000
OP_DzMakeLeader=0x0000
OP_DzPlayerList=0x0000
OP_DzJoinExpeditionConfirm=0x0000
OP_DzJoinExpeditionReply=0x0000
OP_DzExpeditionInfo=0x0000
OP_DzMemberStatus=0x0000
OP_DzLeaderStatus=0x0000
OP_DzExpeditionEndsWarning=0x0000
OP_DzExpeditionList=0x0000
OP_DzMemberList=0x0000
OP_DzCompass=0x0000
OP_DzChooseZone=0x0000
# New Opcodes
OP_SpawnPositionUpdate=0x0000 # C
OP_ManaUpdate=0x0000 # C
OP_EnduranceUpdate=0x0000 # C
OP_MobManaUpdate=0x0000 # C
OP_MobEnduranceUpdate=0x0000 # C
# Looting
OP_LootRequest=0x0000 # C
OP_EndLootRequest=0x0000 # C
OP_LootItem=0x0000 # C
OP_LootComplete=0x0000 # C
# bazaar trader stuff stuff:
OP_BazaarSearch=0x0000 # C
OP_TraderDelItem=0x0000 # C
OP_BecomeTrader=0x0000 # C
OP_TraderShop=0x0000 # C
OP_Trader=0x0000 # C
OP_TraderBuy=0x0000 # C
OP_Barter=0x0000 # C
OP_ShopItem=0x0000 #
OP_BazaarInspect=0x0000 #
OP_Bazaar=0x0000 #
OP_TraderItemUpdate=0x0000 #
# pc/npc trading
OP_TradeRequest=0x0000 # C
OP_TradeAcceptClick=0x0000 # C
OP_TradeRequestAck=0x0000 # C
OP_TradeCoins=0x0000 # C
OP_FinishTrade=0x0000 # C
OP_CancelTrade=0x0000 # C
OP_TradeMoneyUpdate=0x0000 # C
OP_MoneyUpdate=0x0000 # C
OP_TradeBusy=0x0000 # C
# Sent after canceling trade or after closing tradeskill object
OP_FinishWindow=0x0000 # C
OP_FinishWindow2=0x0000 # C
# Sent on Live for what seems to be item existance verification
# Ex. Before Right Click Effect happens from items
OP_ItemVerifyRequest=0x0000 # C
OP_ItemVerifyReply=0x0000 # C
# merchant crap
OP_ShopPlayerSell=0x0000 # C
OP_ShopRequest=0x1044 # was 0x1044
OP_ShopEnd=0x3753 # was 0x3753
OP_ShopEndConfirm=0x0000 # C
OP_ShopPlayerBuy=0x0000 # C
OP_ShopDelItem=0x0000 # C
# tradeskill stuff:
OP_ClickObject=0x0000 # V
OP_ClickObjectAction=0x0000 # V
OP_ClearObject=0x0000 # C
OP_RecipeDetails=0x0000 # C
OP_RecipesFavorite=0x0000 # C
OP_RecipesSearch=0x0000 # C
OP_RecipeReply=0x0000 # C
OP_RecipeAutoCombine=0x0000 # C
OP_TradeSkillCombine=0x0000 # C
# Tribute Packets:
OP_OpenGuildTributeMaster=0x0000 # C
OP_OpenTributeMaster=0x0000 # C
OP_SelectTribute=0x0000 # C
OP_TributeItem=0x0000 # C
OP_TributeMoney=0x0000 # C
OP_TributeToggle=0x0000 # C
OP_TributePointUpdate=0x0000 # C
OP_TributeNPC=0x0000 #
OP_GuildTributeInfo=0x0000 #
OP_OpenTributeReply=0x0000 #
# OP_GuildTributeStatus=0x0000 #
# Adventure packets:
OP_LeaveAdventure=0x0000 # C
OP_AdventureFinish=0x0000 # C
OP_AdventureInfoRequest=0x0000 # C
OP_AdventureInfo=0x0000 # C
OP_AdventureRequest=0x0000 # C
OP_AdventureDetails=0x0000 # C
OP_AdventureData=0x0000 # C
OP_AdventureUpdate=0x0000 # C
OP_AdventureMerchantRequest=0x0000 # C
OP_AdventureMerchantResponse=0x0000 # C
OP_AdventureMerchantPurchase=0x0000 # C
OP_AdventureMerchantSell=0x0000 # C
OP_AdventurePointsUpdate=0x0000 # C
OP_AdventureStatsRequest=0x0000 # C
OP_AdventureStatsReply=0x0000 # C
OP_AdventureLeaderboardRequest=0x0000 # C
OP_AdventureLeaderboardReply=0x0000 # C
# Group Opcodes
OP_GroupDisband=0x0000 # C
OP_GroupInvite=0x0000 # C
OP_GroupFollow=0x0000 # C
OP_GroupUpdate=0x0000 # C
OP_GroupUpdateB=0x0000 # C
OP_GroupCancelInvite=0x0000 # C - Same as OP_CancelInvite?
OP_GroupAcknowledge=0x0000 # C
OP_GroupDelete=0x0000 #
OP_CancelInvite=0x0000 # C
OP_GroupFollow2=0x0000 # C
OP_GroupInvite2=0x0000 # C
OP_GroupDisbandYou=0x0000 # C
OP_GroupDisbandOther=0x0000 # C
OP_GroupLeaderChange=0x0000 # C
OP_GroupRoles=0x0000 # C
# LFG/LFP Opcodes
OP_LFGCommand=0x0000 # C
OP_LFGGetMatchesRequest=0x0000 # C
OP_LFGGetMatchesResponse=0x0000 # C
OP_LFPGetMatchesRequest=0x0000 # C
OP_LFPGetMatchesResponse=0x0000 # C
OP_LFPCommand=0x0000 # C
OP_LFGAppearance=0x0000 #
OP_LFGResponse=0x0000 #
# Raid Opcodes
OP_RaidInvite=0x0000 # C
OP_RaidUpdate=0x0000 # C
OP_RaidJoin=0x0000 #
# Button-push commands
OP_Taunt=0x0000 # C
OP_CombatAbility=0x0000 # C
OP_SenseTraps=0x0000 # C
OP_PickPocket=0x0000 # C
OP_DisarmTraps=0x0000 #
OP_Disarm=0x0000 # C
OP_Sneak=0x0000 # C
OP_Fishing=0x0000 # C
OP_InstillDoubt=0x0000 # C
OP_FeignDeath=0x0000 # C
OP_Mend=0x0000 # C
OP_LDoNOpen=0x0000 # C
# Task packets
OP_TaskActivityComplete=0x0000 # C
OP_TaskMemberList=0x0000 # C
OP_OpenNewTasksWindow=0x0000 # C
OP_AvaliableTask=0x0000 # C Mispelled?
OP_AcceptNewTask=0x0000 # C
OP_TaskHistoryRequest=0x0000 # C
OP_TaskHistoryReply=0x0000 # C
OP_CancelTask=0x0000 # C
OP_DeclineAllTasks=0x0000 #
# Title opcodes
OP_NewTitlesAvailable=0x0000 # C
OP_RequestTitles=0x0000 # C
OP_SendTitleList=0x0000 # C
OP_SetTitle=0x0000 # C
OP_SetTitleReply=0x0000 # C
# mail opcodes
OP_Command=0x0000 #
OP_MailboxHeader=0x0000 #
OP_MailHeader=0x0000 #
OP_MailBody=0x0000 #
OP_NewMail=0x0000 #
OP_SentConfirm=0x0000 #
# # # # # # # # # # # Below this point should not be needed # # # # # # # # # # #
# This section are all unknown in Titanium
OP_ForceFindPerson=0x0000 #
OP_LocInfo=0x0000 #
OP_ReloadUI=0x0000 #
OP_ItemName=0x0000 #
OP_ItemLinkText=0x0000 #
OP_MultiLineMsg=0x0000 #
OP_MendHPUpdate=0x0000 #
OP_TargetReject=0x0000 #
OP_SafePoint=0x0000 #
OP_IncreaseStats=0x0000 #
OP_ApproveZone=0x0000 #
OP_ZoneComplete=0x0000 #
OP_ClientError=0x0000 #
OP_DumpName=0x0000 #
OP_Heartbeat=0x0000 #
OP_CrashDump=0x0000 #
OP_LoginComplete=0x0000 #
# discovered opcodes not yet used:
OP_PickLockSuccess=0x0000 #
OP_PlayMP3=0x0000 #
OP_ReclaimCrystals=0x0000 #
OP_DynamicWall=0x0000 #
OP_OpenDiscordMerchant=0x0000 #
OP_DiscordMerchantInventory=0x0000 #
OP_GiveMoney=0x0000 #
OP_RequestKnowledgeBase=0x0000 #
OP_KnowledgeBase=0x0000 #
OP_SlashAdventure=0x0000 # /adventure
OP_BecomePVPPrompt=0x0000 #
OP_MoveLogRequest=0x0000 # gone I think
OP_MoveLogDisregard=0x0000 # gone I think
# named unknowns, to make looking for real unknown easier
OP_AnnoyingZoneUnknown=0x0000 #
OP_Some6ByteHPUpdate=0x0000 # seems to happen when you target group members
OP_QueryResponseThing=0x0000 #
# realityincarnate: these are just here to stop annoying several thousand byte packet dumps
#OP_LoginUnknown1=0x0000 # U OP_SendSpellChecksum
#OP_LoginUnknown2=0x0000 # U OP_SendSkillCapsChecksum
# Petition Opcodes
OP_PetitionSearch=0x0000 # search term for petition
OP_PetitionSearchResults=0x0000 # (list of?) matches from search
OP_PetitionSearchText=0x0000 # text results of search
OP_PetitionUpdate=0x0000 #
OP_PetitionCheckout=0x0000 #
OP_PetitionCheckIn=0x0000 #
OP_PetitionQue=0x0000 #
OP_PetitionUnCheckout=0x0000 #
OP_PetitionDelete=0x0000 #
OP_DeletePetition=0x0000 #
OP_PetitionResolve=0x0000 #
OP_PDeletePetition=0x0000 #
OP_PetitionBug=0x0000 #
OP_PetitionRefresh=0x0000 #
OP_PetitionCheckout2=0x0000 #
OP_PetitionViewPetition=0x0000 #
# Login opcodes
OP_SessionReady=0x0000 #
OP_Login=0x0000 #
OP_ServerListRequest=0x0000 #
OP_PlayEverquestRequest=0x0000 #
OP_PlayEverquestResponse=0x0000 #
OP_ChatMessage=0x0000 #
OP_LoginAccepted=0x0000 #
OP_ServerListResponse=0x0000 #
OP_Poll=0x0000 #
OP_EnterChat=0x0000 #
OP_PollResponse=0x0000 #
# raw opcodes
OP_RAWSessionRequest=0x0000 #
OP_RAWSessionResponse=0x0000 #
OP_RAWCombined=0x0000 #
OP_RAWSessionDisconnect=0x0000 #
OP_RAWKeepAlive=0x0000 #
OP_RAWSessionStatRequest=0x0000 #
OP_RAWSessionStatResponse=0x0000 #
OP_RAWPacket=0x0000 #
OP_RAWFragment=0x0000 #
OP_RAWOutOfOrderAck=0x0000 #
OP_RAWAck=0x0000 #
OP_RAWAppCombined=0x0000 #
OP_RAWOutOfSession=0x0000 #
# we need to document the differences between these packets to make identifying them easier
OP_Some3ByteHPUpdate=0x0000 # initial HP update for mobs
OP_InitialHPUpdate=0x0000 #
OP_OPCode2511=0x2511
@@ -0,0 +1,619 @@
# ShowEQ Import Notes:
# ZERO THE FILE first
# perl -pi -e 's/0x[0-9a-fA-F]{4}/0x0000/g' opcodes.conf
# Unknown Mapping:
# OP_Action2 -> OP_Damage
# OP_EnvDamage -> OP_Damage ---> might have been a one time mistake
# Name Differences:
# OP_CancelInvite -> OP_GroupCancelInvite
# OP_GMFind -> OP_FindPersonRequest
# OP_CommonMessage -> OP_ChannelMessage
OP_Unknown=0x0000
OP_ExploreUnknown=0x0000 # used for unknown explorer
# V = Verified correct
# C = Most likely correct
# U = Unsure, but should be correct or close
# world packets
# Required to reach Char Select:
OP_SendLoginInfo=0x13da # V
OP_ApproveWorld=0x86c7 # C
OP_LogServer=0x6f79 # C
OP_SendCharInfo=0x4200 # C
OP_ExpansionInfo=0x7e4d # C
OP_GuildsList=0x5b0b # C
OP_EnterWorld=0x51b9 # C
OP_PostEnterWorld=0x5d32 # C
OP_World_Client_CRC1=0x3a18 # C
OP_World_Client_CRC2=0x3e50 # C
OP_SendSpellChecksum=0x46d3 # C
OP_SendSkillCapsChecksum=0x040b # C
# Character Select Related:
OP_DeleteCharacter=0x5ca5 # C
OP_CharacterCreateRequest=0x53a3 # C
OP_CharacterCreate=0x1b85 # C
OP_RandomNameGenerator=0x647a # C 0x440f
OP_ApproveName=0x4f1f # C
OP_MOTD=0x7629 # C 0x2b59
OP_SetChatServer=0x7d90 # C 0x0479
OP_SetChatServer2=0x7327 # C 0x158f
OP_ZoneServerInfo=0x1190 # C 0x41c0
OP_WorldComplete=0x441c # C
OP_WorldUnknown001=0x6f9d # C 0x77b1
OP_FloatListThing=0x61ba # V
# Reasons for Disconnect:
OP_ZoneUnavail=0x3288 # C 0x1190
OP_WorldClientReady=0x7d05 # C 0x4786
OP_CharacterStillInZone=0x0000 #
OP_WorldChecksumFailure=0x0000 #
OP_WorldLoginFailed=0x0000 #
OP_WorldLogout=0x0000 #
OP_WorldLevelTooHigh=0x0000 #
OP_CharInacessable=0x0000 #
OP_UserCompInfo=0x0000 #
# OP_SendExeChecksum=0x0000 #
# OP_SendBaseDataChecksum=0x0000 #
# Zone in opcodes
OP_AckPacket=0x3594 # V
OP_ZoneEntry=0x4b61 # V
OP_ReqNewZone=0x4118 # V
OP_NewZone=0x43ac # V
OP_ZoneSpawns=0x7114 # ?
OP_PlayerProfile=0x6022 # V
OP_TimeOfDay=0x6015 # V
OP_LevelUpdate=0x6a99 # V
OP_Stamina=0x3d86 # V
OP_RequestClientZoneChange=0x18ea # C
OP_ZoneChange=0x6d37 # C
OP_LockoutTimerInfo=0x0000 #
OP_ZoneServerReady=0x0000 #
OP_ZoneInUnknown=0x0000 #
OP_LogoutReply=0x0000 #
OP_PreLogoutReply=0x0000 #
# Required to fully log in
OP_SpawnAppearance=0x3e17 # V
OP_TributeUpdate=0x684c # V
OP_TributeTimer=0x4895 # C
OP_TaskDescription=0x156c # C
OP_TaskActivity=0x31f3 # C
OP_CompletedTasks=0x82d7 # C 0x6d27
OP_Weather=0x4658 # V
OP_SendAATable=0x6ef9 # V
OP_UpdateAA=0x7bf6 # V
OP_RespondAA=0x1fbd # C 0x2bad
OP_ReqClientSpawn=0x69cd # V
OP_SpawnDoor=0x6f2b # V
OP_GroundSpawn=0x5c85 # V
OP_SendZonepoints=0x2370 # V
OP_SendAAStats=0x78b9 # C
OP_WorldObjectsSent=0x7b73 # V
OP_BlockedBuffs=0x05d5 # V
OP_SendExpZonein=0x47e7 # V
OP_SendTributes=0x6bfb # V
OP_TributeInfo=0x5a67 # V
OP_SendGuildTributes=0x4df0 # C 0x5a01
OP_AAExpUpdate=0x4aa2 # V
OP_ExpUpdate=0x0555 # V
OP_HPUpdate=0x6145 # V
OP_ManaChange=0x569a # C
OP_TGB=0x42ef # C
OP_SpecialMesg=0x016c # V
OP_GuildMemberList=0x51bc # C
OP_GuildMOTD=0x5658 # V
OP_CharInventory=0x47ae # V
OP_WearChange=0x0400 # V
OP_ClientUpdate=0x7062 # V
OP_ClientReady=0x6cdc # V
OP_SetServerFilter=0x2d74 # V
# Guild Opcodes
OP_GetGuildMOTD=0x1899 # C
OP_GetGuildMOTDReply=0x4a5c # C
OP_GuildMemberUpdate=0x0a53 # C
OP_GuildInvite=0x1a58 # C
OP_GuildRemove=0x3c02 # C
OP_GuildPeace=0x2bff # C
OP_SetGuildMOTD=0x053a # C
OP_GuildList=0x5b0b # C
OP_GuildWar=0x5408 # C
OP_GuildLeader=0x0598 # C
OP_GuildDelete=0x3f55 # C
OP_GuildInviteAccept=0x7b64 # C
OP_GuildDemote=0x457d # C
OP_GuildPublicNote=0x2dbd # C
OP_GuildManageBanker=0x1e4c # C
OP_GuildBank=0x0d8a # C
OP_SetGuildRank=0x4ffe # C
OP_GuildUpdateURLAndChannel=0x5232 # C
OP_GuildMemberLevelUpdate=0x0000 #
OP_ZoneGuildList=0x0000 #
OP_GetGuildsList=0x0000 #
# OP_GuildManageRemove=0x0000 #
# OP_GuildManageAdd=0x0000 #
# OP_GuildManageStatus=0x0000 #
# GM/guide opcodes
OP_GMServers=0x6989 # C
OP_GMBecomeNPC=0x56e7 # C
OP_GMZoneRequest=0x3fd2 # C
OP_GMZoneRequest2=0x538f # C
OP_GMGoto=0x5ebc # C
OP_GMSearchCorpse=0x5a81 # C
OP_GMHideMe=0x28ef # C
OP_GMDelCorpse=0x655c # C
OP_GMApproval=0x7312 # C
OP_GMToggle=0x097f # C 0x7566
OP_GMSummon=0x712b # C
OP_GMEmoteZone=0x1ac1 # C
OP_GMEmoteWorld=0x2444 # C
OP_GMFind=0x6e27 # C
OP_GMKick=0x0402 # C
OP_GMKill=0x799c # C
OP_GMNameChange=0x0f48 # C
OP_GMLastName=0x7bfb # C
OP_InspectAnswer=0x0c2b # C
OP_BeginCast=0x0d5a # C
OP_BuffFadeMsg=0x71bf # C
OP_ConsentResponse=0x0e87 # C
OP_MemorizeSpell=0x3887 # C
OP_SwapSpell=0x0dda # C
OP_CastSpell=0x50c2 # C
OP_Consider=0x3c2d # C
OP_FormattedMessage=0x3b52 # C
OP_SimpleMessage=0x1f4d # C 0x5448
OP_Buff=0x0d1d # C
OP_Illusion=0x231f # C
OP_MoneyOnCorpse=0x4a83 # C
OP_RandomReply=0x6d5d # C
OP_DenyResponse=0x6129 # C
OP_SkillUpdate=0x7f01 # C
OP_GMTrainSkillConfirm=0x3190 # C
OP_RandomReq=0x139d # C
OP_Death=0x7f9e # C
OP_Bind_Wound=0x4b1a # C
OP_GMTraining=0x51fa # C
OP_GMEndTraining=0x5479 # C
OP_GMTrainSkill=0x2257 # C
OP_Animation=0x4a61 # Was 0x47d3
OP_Begging=0x53f9 # C
OP_Consent=0x6bb9 # C
OP_ConsentDeny=0x4cd1 # C
OP_AutoFire=0x5db5 # C
OP_PetCommands=0x7706 # C
OP_DeleteSpell=0x0698 # C
OP_Surname=0x44ae # C
OP_ClearSurname=0x2bc6 # C
OP_FaceChange=0x37a7 # C
OP_SenseHeading=0x1b8a # C
OP_Action=0x0f14 # C
OP_ConsiderCorpse=0x0a18 # C
OP_HideCorpse=0x2d08 # C 0x1842
OP_Bug=0x2369 # C
OP_Feedback=0x7705 # C
OP_Report=0x50d0 # C
OP_Damage=0x631a # C or OP_Action2?
OP_ChannelMessage=0x2e79 # C
OP_Assist=0x35b1 # C
OP_AssistGroup=0x194f # C
OP_MoveCoin=0x6024 # C
OP_ZonePlayerToBind=0x382c # C
OP_KeyRing=0x5c06 # C
OP_WhoAllRequest=0x177a # C
OP_WhoAllResponse=0x6ffa # C
OP_FriendsWho=0x6275 # C
OP_ConfirmDelete=0x3edc # V
OP_Logout=0x224f # C
OP_Rewind=0x7d63 # C
OP_TargetCommand=0x756c # C Was 0x5f5e
OP_InspectRequest=0x7c94 # C
OP_Hide=0x3497 # C
OP_Jump=0x083b # C
OP_Camp=0x5f85 # C
OP_Emote=0x3164 # C
OP_SetRunMode=0x3d06 # C
OP_BankerChange=0x300a # C
OP_TargetMouse=0x5f5e # C 0x7bbb
OP_MobHealth=0x15de # C
OP_InitialMobHealth=0x5cb0 # C
OP_TargetHoTT=0x4d56 # C
OP_TargetBuffs=0x3f24 # C
OP_BuffCreate=0x2121 # V
OP_DeleteSpawn=0x58c5 # C
OP_AutoAttack=0x1df9 # C
OP_AutoAttack2=0x517b # C
OP_Consume=0x24c5 # V
OP_MoveItem=0x2641 # C
OP_DeleteItem=0x66e0 # C
OP_DeleteCharge=0x4ca1 # C
OP_ItemPacket=0x7b6e # C
OP_ItemLinkResponse=0x695c # C
OP_ItemLinkClick=0x3c66 # C
OP_NewSpawn=0x429b # C
OP_Track=0x3f49 # C
OP_TrackTarget=0x3f49 # C
OP_TrackUnknown=0x03e7 # C
OP_ClickDoor=0x6e97 # C
OP_MoveDoor=0x3154 # C
OP_EnvDamage=0x2730 # C
OP_BoardBoat=0x7554 # C
OP_Forage=0x739b # C
OP_LeaveBoat=0x7286 # C
OP_ControlBoat=0x7ea8 # C
OP_SafeFallSuccess=0x6df7 # C
OP_RezzComplete=0x30a4 # C
OP_RezzRequest=0x32af # C
OP_RezzAnswer=0x2d41 # C
OP_Shielding=0x4675 # C
OP_RequestDuel=0x6cfe # C
OP_MobRename=0x0507 # C
OP_AugmentItem=0x7c87 # C
OP_WeaponEquip1=0x4572 # C
OP_WeaponEquip2=0x399b # C
OP_WeaponUnequip2=0x416b # C
OP_ApplyPoison=0x5cd3 # C
OP_Save=0x6618 # C
OP_TestBuff=0x3415 # C
OP_CustomTitles=0x6a7e # C
OP_Split=0x1418 # C
OP_YellForHelp=0x55a8 # C
OP_LoadSpellSet=0x6617 # C
OP_Bandolier=0x510c # C
OP_PotionBelt=0x0651 # C
OP_DuelResponse=0x41a6 # C
OP_DuelResponse2=0x6d60 # C
OP_SaveOnZoneReq=0x2913 # C
OP_ReadBook=0x465e # C
OP_Dye=0x2137 # C
OP_InterruptCast=0x7566 # C
OP_AAAction=0x2bad # C
OP_LeadershipExpToggle=0x5033 # C
OP_LeadershipExpUpdate=0x074f # C
OP_PurchaseLeadershipAA=0x5f55 # C
OP_UpdateLeadershipAA=0x77ed # C
OP_MarkNPC=0x3ec7 # C
OP_ClearNPCMarks=0x5c29 # C
OP_DoGroupLeadershipAbility=0x0068 # C
OP_GroupLeadershipAAUpdate=0x27bf # C
OP_DelegateAbility=0x6e58 # C
OP_SetGroupTarget=0x6b9e # C
OP_Charm=0x1fd5 # C
OP_Stun=0x3d00 # C
OP_SendFindableNPCs=0x6193 # C
OP_FindPersonRequest=0x1e04 # C
OP_FindPersonReply=0x7cae # C
OP_Sound=0x737a # C
OP_PetBuffWindow=0x7b87 # C
OP_LevelAppearance=0x1bd4 # C
OP_Translocate=0x3d9c # C
OP_Sacrifice=0x301b # C
OP_PopupResponse=0x6d27 # C
OP_OnLevelMessage=0x24cb # C
OP_AugmentInfo=0x31b1 # C
OP_Petition=0x31d1 # C
OP_SomeItemPacketMaybe=0x2c27 # C
OP_PVPStats=0x6840 # C
OP_PVPLeaderBoardRequest=0x4973 # C
OP_PVPLeaderBoardReply=0x3842 # C
OP_PVPLeaderBoardDetailsRequest=0x6c75 # C
OP_PVPLeaderBoardDetailsReply=0x7fd7 # C
OP_RestState=0x5d24 # C
OP_RespawnWindow=0x107f # C
OP_DisciplineTimer=0x047c # C
OP_LDoNButton=0x1031 # C
OP_SetStartCity=0x68f0 # C
OP_VoiceMacroIn=0x1524 # C
OP_VoiceMacroOut=0x1d99 # C
OP_ItemViewUnknown=0x4eb3 # C
OP_VetRewardsAvaliable=0x0baa # C Mispelled?
OP_VetClaimRequest=0x34f8 # C
OP_VetClaimReply=0x6a5d # C
OP_CrystalCountUpdate=0x3fc8 # C
OP_DisciplineUpdate=0x0000 #
OP_BecomeCorpse=0x0000 #
OP_Action2=0x0000 # C OP_Damage?
OP_MobUpdate=0x4656 # Same as OP_SpawnPositionUpdate
OP_NPCMoveUpdate=0x0f3e #
OP_CameraEffect=0x6b0e # V
OP_SpellEffect=0x57a3 # V
OP_DzQuit=0x1539
OP_DzListTimers=0x21e9
OP_DzAddPlayer=0x3657
OP_DzRemovePlayer=0x054e
OP_DzSwapPlayer=0x4661
OP_DzMakeLeader=0x226f
OP_DzPlayerList=0x74e4
OP_DzJoinExpeditionConfirm=0x3c5e
OP_DzJoinExpeditionReply=0x1154
OP_DzExpeditionInfo=0x1150
OP_DzMemberStatus=0x2d17
OP_DzLeaderStatus=0x2caf
OP_DzExpeditionEndsWarning=0x6ac2
OP_DzExpeditionList=0x70d8
OP_DzMemberList=0x15c4
OP_DzCompass=0x01cb
OP_DzChooseZone=0x0000
# New Opcodes
OP_SpawnPositionUpdate=0x4656 # C
OP_ManaUpdate=0x0433 # C
OP_EnduranceUpdate=0x6b76 # C
OP_MobManaUpdate=0x7901 # C
OP_MobEnduranceUpdate=0x6c5f # C
# Looting
OP_LootRequest=0x6ad7 # C
OP_EndLootRequest=0x6546 # C
OP_LootItem=0x5960 # C
OP_LootComplete=0x604d # C
# bazaar trader stuff stuff:
OP_BazaarSearch=0x550f # C
OP_TraderDelItem=0x63c8 # C
OP_BecomeTrader=0x0a1d # C
OP_TraderShop=0x2881 # C
OP_Trader=0x0c08 # C
OP_TraderBuy=0x3672 # C
OP_Barter=0x6db5 # C
OP_ShopItem=0x0000 #
OP_BazaarInspect=0x0000 #
OP_Bazaar=0x0000 #
OP_TraderItemUpdate=0x0000 #
# pc/npc trading
OP_TradeRequest=0x7113 # C
OP_TradeAcceptClick=0x064a # C
OP_TradeRequestAck=0x606a # C
OP_TradeCoins=0x0149 # C
OP_FinishTrade=0x3ff6 # C
OP_CancelTrade=0x527e # C
OP_TradeMoneyUpdate=0x2a6d # C
OP_MoneyUpdate=0xd677 # C
OP_TradeBusy=0x5ed3 # C
# Sent after canceling trade or after closing tradeskill object
OP_FinishWindow=0x3c27 # C
OP_FinishWindow2=0x6759 # C
# Sent on Live for what seems to be item existance verification
# Ex. Before Right Click Effect happens from items
OP_ItemVerifyRequest=0x101e # C
OP_ItemVerifyReply=0x21c7 # C
# merchant crap
OP_ShopPlayerSell=0x0b27 # C
OP_ShopRequest=0x442a # C
OP_ShopEnd=0x3753 # C
OP_ShopEndConfirm=0x4578 # C
OP_ShopPlayerBuy=0x436a # C
OP_ShopDelItem=0x63c8 # C
# tradeskill stuff:
OP_ClickObject=0x33e5 # V
OP_ClickObjectAction=0x41b5 # V
OP_ClearObject=0x71d1 # C
OP_RecipeDetails=0x58d9 # C
OP_RecipesFavorite=0x7770 # C
OP_RecipesSearch=0x6948 # C
OP_RecipeReply=0x521c # C
OP_RecipeAutoCombine=0x0322 # C
OP_TradeSkillCombine=0x4212 # C
# Tribute Packets:
OP_OpenGuildTributeMaster=0x5e79 # C
OP_OpenTributeMaster=0x7c24 # C
OP_SelectTribute=0x0c98 # C
OP_TributeItem=0x0b89 # C
OP_TributeMoney=0x314f # C
OP_TributeToggle=0x6dc3 # C
OP_TributePointUpdate=0x15a7 # C
OP_TributeNPC=0x0000 #
OP_GuildTributeInfo=0x0000 #
OP_OpenTributeReply=0x0000 #
# OP_GuildTributeStatus=0x0000 #
# Adventure packets:
OP_LeaveAdventure=0x3ed4 # C
OP_AdventureFinish=0x6acc # C
OP_AdventureInfoRequest=0x3541 # C
OP_AdventureInfo=0x5cea # C
OP_AdventureRequest=0x2c03 # C
OP_AdventureDetails=0x1d40 # C
OP_AdventureData=0x34f2 # C
OP_AdventureUpdate=0x771f # C
OP_AdventureMerchantRequest=0x4e22 # C
OP_AdventureMerchantResponse=0x4dd5 # C
OP_AdventureMerchantPurchase=0x7b7f # C
OP_AdventureMerchantSell=0x179d # C
OP_AdventurePointsUpdate=0x7537 # C
OP_AdventureStatsRequest=0x4786 # C
OP_AdventureStatsReply=0x38b0 # C
OP_AdventureLeaderboardRequest=0x4cc6 # C
OP_AdventureLeaderboardReply=0x4423 # C
# Group Opcodes
OP_GroupDisband=0x54e8 # C
OP_GroupInvite=0x4f60 # C
OP_GroupFollow=0x7f2b # C
OP_GroupUpdate=0x5331 # C
OP_GroupUpdateB=0x0786 # C
OP_GroupCancelInvite=0x2736 # C - Same as OP_CancelInvite?
OP_GroupAcknowledge=0x3e22 # C
OP_GroupDelete=0x58e6 #
OP_CancelInvite=0x2736 # C
OP_GroupFollow2=0x6c16 # C
OP_GroupInvite2=0x5251 # C
OP_GroupDisbandYou=0x0bd0 # C
OP_GroupDisbandOther=0x49f6 # C
OP_GroupLeaderChange=0x0c33 # C
OP_GroupRoles=0x116d # C
# LFG/LFP Opcodes
OP_LFGCommand=0x2c38 # C
OP_LFGGetMatchesRequest=0x28d4 # C
OP_LFGGetMatchesResponse=0x7a16 # C
OP_LFPGetMatchesRequest=0x189e # C
OP_LFPGetMatchesResponse=0x589f # C
OP_LFPCommand=0x7429 # C
OP_LFGAppearance=0x0000 #
OP_LFGResponse=0x0000 #
# Raid Opcodes
OP_RaidInvite=0x60b5 # C
OP_RaidUpdate=0x4d8b # C
OP_RaidJoin=0x0000 #
# Button-push commands
OP_Taunt=0x30e2 # C
OP_CombatAbility=0x36f8 # C
OP_SenseTraps=0x7e45 # C
OP_PickPocket=0x5821 # C
OP_DisarmTraps=0x0000 #
OP_Disarm=0x6def # C
OP_Sneak=0x1d22 # C
OP_Fishing=0x7093 # C
OP_InstillDoubt=0x221a # C
OP_FeignDeath=0x002b # C
OP_Mend=0x10a6 # C
OP_LDoNOpen=0x032b # C
# Task packets
OP_TaskActivityComplete=0x5832 # C
OP_TaskMemberList=0x66ba # C
OP_OpenNewTasksWindow=0x98f6 # C
OP_AvaliableTask=0x6255 # C Mispelled?
OP_AcceptNewTask=0x17d5 # C
OP_TaskHistoryRequest=0x547c # C
OP_TaskHistoryReply=0x4524 # C
OP_CancelTask=0x3bf5 # C
OP_DeclineAllTasks=0x0000 #
# Title opcodes
OP_NewTitlesAvailable=0x4b49 # C
OP_RequestTitles=0x4d3e # C
OP_SendTitleList=0x0d96 # C
OP_SetTitle=0x675c # C
OP_SetTitleReply=0x75f5 # C
# mail opcodes
OP_Command=0x0000 #
OP_MailboxHeader=0x0000 #
OP_MailHeader=0x0000 #
OP_MailBody=0x0000 #
OP_NewMail=0x0000 #
OP_SentConfirm=0x0000 #
# # # # # # # # # # # Below this point should not be needed # # # # # # # # # # #
# This section are all unknown in Titanium
OP_ForceFindPerson=0x0000 #
OP_LocInfo=0x0000 #
OP_ReloadUI=0x0000 #
OP_ItemName=0x0000 #
OP_ItemLinkText=0x0000 #
OP_MultiLineMsg=0x0000 #
OP_MendHPUpdate=0x0000 #
OP_TargetReject=0x0000 #
OP_SafePoint=0x0000 #
OP_IncreaseStats=0x0000 #
OP_ApproveZone=0x0000 #
OP_ZoneComplete=0x0000 #
OP_ClientError=0x0000 #
OP_DumpName=0x0000 #
OP_Heartbeat=0x0000 #
OP_CrashDump=0x0000 #
OP_LoginComplete=0x0000 #
# discovered opcodes not yet used:
OP_PickLockSuccess=0x0000 #
OP_PlayMP3=0x0000 #
OP_ReclaimCrystals=0x0000 #
OP_DynamicWall=0x0000 #
OP_OpenDiscordMerchant=0x0000 #
OP_DiscordMerchantInventory=0x0000 #
OP_GiveMoney=0x0000 #
OP_RequestKnowledgeBase=0x0000 #
OP_KnowledgeBase=0x0000 #
OP_SlashAdventure=0x0000 # /adventure
OP_BecomePVPPrompt=0x0000 #
OP_MoveLogRequest=0x0000 # gone I think
OP_MoveLogDisregard=0x0000 # gone I think
# named unknowns, to make looking for real unknown easier
OP_AnnoyingZoneUnknown=0x0000 #
OP_Some6ByteHPUpdate=0x0000 # seems to happen when you target group members
OP_QueryResponseThing=0x0000 #
# realityincarnate: these are just here to stop annoying several thousand byte packet dumps
#OP_LoginUnknown1=0x46d3 # U OP_SendSpellChecksum
#OP_LoginUnknown2=0x040b # U OP_SendSkillCapsChecksum
# Petition Opcodes
OP_PetitionSearch=0x0000 # search term for petition
OP_PetitionSearchResults=0x0000 # (list of?) matches from search
OP_PetitionSearchText=0x0000 # text results of search
OP_PetitionUpdate=0x0000 #
OP_PetitionCheckout=0x0000 #
OP_PetitionCheckIn=0x0000 #
OP_PetitionQue=0x0000 #
OP_PetitionUnCheckout=0x0000 #
OP_PetitionDelete=0x0000 #
OP_DeletePetition=0x0000 #
OP_PetitionResolve=0x0000 #
OP_PDeletePetition=0x0000 #
OP_PetitionBug=0x0000 #
OP_PetitionRefresh=0x0000 #
OP_PetitionCheckout2=0x0000 #
OP_PetitionViewPetition=0x0000 #
# Login opcodes
OP_SessionReady=0x0001 #
OP_Login=0x0002 #
OP_ServerListRequest=0x0004 #
OP_PlayEverquestRequest=0x000d #
OP_PlayEverquestResponse=0x0021 #
OP_ChatMessage=0x0016 #
OP_LoginAccepted=0x0017 #
OP_ServerListResponse=0x0018 #
OP_Poll=0x0029 #
OP_EnterChat=0x000f #
OP_PollResponse=0x0011 #
# raw opcodes
OP_RAWSessionRequest=0x0000 #
OP_RAWSessionResponse=0x0000 #
OP_RAWCombined=0x0000 #
OP_RAWSessionDisconnect=0x0000 #
OP_RAWKeepAlive=0x0000 #
OP_RAWSessionStatRequest=0x0000 #
OP_RAWSessionStatResponse=0x0000 #
OP_RAWPacket=0x0000 #
OP_RAWFragment=0x0000 #
OP_RAWOutOfOrderAck=0x0000 #
OP_RAWAck=0x0000 #
OP_RAWAppCombined=0x0000 #
OP_RAWOutOfSession=0x0000 #
# we need to document the differences between these packets to make identifying them easier
OP_Some3ByteHPUpdate=0x0000 # initial HP update for mobs
OP_InitialHPUpdate=0x0000 #
OP_MercenaryDataRequest=0x3015
OP_MercenaryDataResponse=0x0eaa
OP_MercenaryTimer=0x0cae
OP_MercenaryHire=0x099e
OP_MercenaryRelated1=0x2538
OP_MercenaryUnknown1=0x367f
@@ -0,0 +1,611 @@
# ShowEQ Import Notes:
# ZERO THE FILE first
# perl -pi -e 's/0x0000a-fA-F]{4}/0x0000/g' opcodes.conf
# Unknown Mapping:
# OP_Action2 -> OP_Damage
# OP_EnvDamage -> OP_Damage ---> might have been a one time mistake
# Name Differences:
# OP_CancelInvite -> OP_GroupCancelInvite
# OP_GMFind -> OP_FindPersonRequest
# OP_CommonMessage -> OP_ChannelMessage
OP_Unknown=0x0000
OP_ExploreUnknown=0x0000 # used for unknown explorer
# V = Verified correct
# C = Most likely correct
# U = Unsure, but should be correct or close
# world packets
# Required to reach Char Select:
OP_SendLoginInfo=0x6893 # was 0x2683
OP_ApproveWorld=0x115a # was 0x28a7
OP_LogServer=0x701f # was 0x224f
OP_SendCharInfo=0x1b85 # was 0x2c27
OP_ExpansionInfo=0x1771 # Same
OP_GuildsList=0x5b0b # Same
OP_EnterWorld=0x3288 # was 0x4f60
OP_PostEnterWorld=0x2f2c # was 0x570c
OP_World_Client_CRC1=0x0000 # C
OP_World_Client_CRC2=0x0000 # C
OP_SendSpellChecksum=0x0000 # C
OP_SendSkillCapsChecksum=0x0000 # C
# Character Select Related:
OP_DeleteCharacter=0x0000 # C
OP_CharacterCreateRequest=0x0000 # C
OP_CharacterCreate=0x0000 # C
OP_RandomNameGenerator=0x0000 # C 0x0000
OP_ApproveName=0x0000 # C
OP_MOTD=0x7312 # C 0x0000
OP_SetChatServer=0x698a #
OP_SetChatServer2=0x0000 # Not sent any more ?
OP_ZoneServerInfo=0x0479 # was 0x03cc
OP_WorldComplete=0x510c #
OP_WorldUnknown001=0x0000 # C 0x0000
OP_FloatListThing=0x0000 # V
# Reasons for Disconnect:
OP_ZoneUnavail=0x0000 # C 0x0000
OP_WorldClientReady=0x399b # C 0x0000
OP_CharacterStillInZone=0x0000 #
OP_WorldChecksumFailure=0x0000 #
OP_WorldLoginFailed=0x0000 #
OP_WorldLogout=0x0000 #
OP_WorldLevelTooHigh=0x0000 #
OP_CharInacessable=0x0000 #
OP_UserCompInfo=0x0000 #
# OP_SendExeChecksum=0x0000 #
# OP_SendBaseDataChecksum=0x0000 #
# Zone in opcodes
OP_AckPacket=0x3594 # was 0x3594
OP_ZoneEntry=0x02d6 # was 0x538f
OP_ReqNewZone=0x5ca5 # was 0x5ca5
OP_NewZone=0x0254 # was 0x0254
OP_ZoneSpawns=0x0000 # ?
OP_PlayerProfile=0x6022 # was 0x6022
OP_TimeOfDay=0x6015 # was 0x6015
OP_LevelUpdate=0x0000 # V
OP_Stamina=0x0000 # V
OP_RequestClientZoneChange=0x3fd2 # was 0x4178
OP_ZoneChange=0x0b93 # was 0x4a61
OP_LockoutTimerInfo=0x0000 #
OP_ZoneServerReady=0x0000 #
OP_ZoneInUnknown=0x0000 #
OP_LogoutReply=0x0000 #
OP_PreLogoutReply=0x0000 #
# Required to fully log in
OP_SpawnAppearance=0x7b64 # V
OP_TributeUpdate=0x4895 #
OP_TributeTimer=0x0000 # C
OP_TaskDescription=0x0000 # C
OP_TaskActivity=0x0000 # C
OP_CompletedTasks=0x0000 # C 0x0000
OP_Weather=0x7ce4 # was 0x0ed5
OP_SendAATable=0x1d99 #
OP_UpdateAA=0x0000 # V
OP_RespondAA=0x0000 # C 0x0000
OP_ReqClientSpawn=0x54e8 # was 0x6618
OP_SpawnDoor=0x6cfe #
OP_GroundSpawn=0x442a # was 0x5f0d
OP_SendZonepoints=0x5851 # was 0x0ff4
OP_SendAAStats=0x0000 # C
OP_WorldObjectsSent=0x7b73 # was 0x7b73
OP_BlockedBuffs=0x664a # was 0x4027
OP_SendExpZonein=0x2c27 # was 0x1436
OP_SendTributes=0x0000 # V
OP_TributeInfo=0x0000 # V
OP_SendGuildTributes=0x0000 # C 0x0000
OP_AAExpUpdate=0x0000 # V
OP_ExpUpdate=0x0000 # V
OP_HPUpdate=0x0000 # V
OP_ManaChange=0x0000 # C
OP_TGB=0x0000 # C
OP_SpecialMesg=0x3bf5 # was 0x14ff
OP_GuildMemberList=0x0000 # C
OP_GuildMOTD=0x0000 # V
OP_CharInventory=0x465e #
OP_WearChange=0x0000 # V
OP_ClientUpdate=0x7062 # was 0x7062
OP_ClientReady=0x6cdc # was 0x6cdc
OP_SetServerFilter=0x0000 # V
# Guild Opcodes
OP_GetGuildMOTD=0x0000 # C
OP_GetGuildMOTDReply=0x0000 # C
OP_GuildMemberUpdate=0x0000 # C
OP_GuildInvite=0x0000 # C
OP_GuildRemove=0x0000 # C
OP_GuildPeace=0x0000 # C
OP_SetGuildMOTD=0x0000 # C
OP_GuildList=0x0000 # C
OP_GuildWar=0x0000 # C
OP_GuildLeader=0x0000 # C
OP_GuildDelete=0x0000 # C
OP_GuildInviteAccept=0x0000 # C
OP_GuildDemote=0x0000 # C
OP_GuildPublicNote=0x0000 # C
OP_GuildManageBanker=0x0000 # C
OP_GuildBank=0x0000 # C
OP_SetGuildRank=0x0000 # C
OP_GuildUpdateURLAndChannel=0x0000 # C
OP_GuildMemberLevelUpdate=0x0000 #
OP_ZoneGuildList=0x0000 #
OP_GetGuildsList=0x0000 #
# OP_GuildManageRemove=0x0000 #
# OP_GuildManageAdd=0x0000 #
# OP_GuildManageStatus=0x0000 #
# GM/guide opcodes
OP_GMServers=0x0000 # C
OP_GMBecomeNPC=0x0000 # C
OP_GMZoneRequest=0x6f79 # was 0x18ea
OP_GMZoneRequest2=0x02d6 # was 0x3ad9
OP_GMGoto=0x0000 # C
OP_GMSearchCorpse=0x0000 # C
OP_GMHideMe=0x0000 # C
OP_GMDelCorpse=0x0000 # C
OP_GMApproval=0x0000 # C
OP_GMToggle=0x0000 # C 0x0000
OP_GMSummon=0x0000 # C
OP_GMEmoteZone=0x0000 # C
OP_GMEmoteWorld=0x0000 # C
OP_GMFind=0x0000 # C
OP_GMKick=0x0000 # C
OP_GMKill=0x0000 # C
OP_GMNameChange=0x0000 # C
OP_GMLastName=0x0000 # C
OP_InspectAnswer=0x0000 # C
OP_BeginCast=0x0000 # C
OP_BuffFadeMsg=0x50c2 # C
OP_ConsentResponse=0x0000 # C
OP_MemorizeSpell=0x0000 # C
OP_SwapSpell=0x0000 # C
OP_CastSpell=0x7286 # C
OP_Consider=0x0000 # C
OP_FormattedMessage=0x0000 # C
OP_SimpleMessage=0x0000 # C 0x0000
OP_Buff=0x0000 # C
OP_Illusion=0x0000 # C
OP_MoneyOnCorpse=0x0000 # C
OP_RandomReply=0x0000 # C
OP_DenyResponse=0x0000 # C
OP_SkillUpdate=0x0000 # C
OP_GMTrainSkillConfirm=0x0000 # C
OP_RandomReq=0x0000 # C
OP_Death=0x0000 # C
OP_Bind_Wound=0x0000 # C
OP_GMTraining=0x0000 # C
OP_GMEndTraining=0x0000 # C
OP_GMTrainSkill=0x0000 # C
OP_Animation=0x0000 # Was 0x0000
OP_Begging=0x0000 # C
OP_Consent=0x0000 # C
OP_ConsentDeny=0x0000 # C
OP_AutoFire=0x0000 # C
OP_PetCommands=0x0000 # C
OP_DeleteSpell=0x0000 # C
OP_Surname=0x0000 # C
OP_ClearSurname=0x0000 # C
OP_FaceChange=0x0000 # C
OP_SenseHeading=0x0000 # C
OP_Action=0x1513 # C
OP_ConsiderCorpse=0x0000 # C
OP_HideCorpse=0x0000 # C 0x0000
OP_Bug=0x0000 # C
OP_Feedback=0x0000 # C
OP_Report=0x0000 # C
OP_Damage=0x7519 # C or OP_Action2?
OP_ChannelMessage=0x2e79 # was 0x2e79
OP_Assist=0x0000 # C
OP_AssistGroup=0x0000 # C
OP_MoveCoin=0x0000 # C
OP_ZonePlayerToBind=0x0000 # C
OP_KeyRing=0x0000 # C
OP_WhoAllRequest=0x0000 # C
OP_WhoAllResponse=0x0000 # C
OP_FriendsWho=0x0000 # C
OP_ConfirmDelete=0x0000 # V
OP_Logout=0x44ae # was 0x64ec
OP_Rewind=0x0000 # C
OP_TargetCommand=0x0000 # C Was 0x0000
OP_InspectRequest=0x0000 # C
OP_Hide=0x0000 # C
OP_Jump=0x0000 # C
OP_Camp=0x42ef # C
OP_Emote=0x0000 # C
OP_SetRunMode=0x0000 # C
OP_BankerChange=0x0000 # C
OP_TargetMouse=0x36f8 # C 0x0000
OP_MobHealth=0x0000 # C
OP_InitialMobHealth=0x0000 # C
OP_TargetHoTT=0x0000 # C
OP_TargetBuffs=0x0000 # C
OP_BuffCreate=0x6bfb # V
OP_DeleteSpawn=0x7434 # was 0x7434
OP_AutoAttack=0x0000 # C
OP_AutoAttack2=0x0000 # C
OP_Consume=0x0000 # V
OP_MoveItem=0x0000 # C
OP_DeleteItem=0x0000 # C
OP_DeleteCharge=0x0000 # C
OP_ItemPacket=0x7c87 #
OP_ItemLinkResponse=0x0000 # C
OP_ItemLinkClick=0x0000 # C
OP_NewSpawn=0x0000 # C
OP_Track=0x0000 # C
OP_TrackTarget=0x0000 # C
OP_TrackUnknown=0x0000 # C
OP_ClickDoor=0x3154 #
OP_MoveDoor=0x470e #
OP_EnvDamage=0x0000 # C
OP_BoardBoat=0x0000 # C
OP_Forage=0x0000 # C
OP_LeaveBoat=0x0000 # C
OP_ControlBoat=0x0000 # C
OP_SafeFallSuccess=0x0000 # C
OP_RezzComplete=0x0000 # C
OP_RezzRequest=0x0000 # C
OP_RezzAnswer=0x0000 # C
OP_Shielding=0x0000 # C
OP_RequestDuel=0x0000 # C
OP_MobRename=0x0000 # C
OP_AugmentItem=0x0000 # C
OP_WeaponEquip1=0x0000 # C
OP_WeaponEquip2=0x0000 # C
OP_WeaponUnequip2=0x0000 # C
OP_ApplyPoison=0x0000 # C
OP_Save=0x0000 # C
OP_TestBuff=0x0000 # C
OP_CustomTitles=0x0000 # C
OP_Split=0x0000 # C
OP_YellForHelp=0x0000 # C
OP_LoadSpellSet=0x0000 # C
OP_Bandolier=0x0000 # C
OP_PotionBelt=0x0000 # C
OP_DuelResponse=0x0000 # C
OP_DuelResponse2=0x0000 # C
OP_SaveOnZoneReq=0x2913 # was 0x2913
OP_ReadBook=0x0000 # C
OP_Dye=0x0000 # C
OP_InterruptCast=0x0000 # C
OP_AAAction=0x0000 # C
OP_LeadershipExpToggle=0x0000 # C
OP_LeadershipExpUpdate=0x0000 # C
OP_PurchaseLeadershipAA=0x0000 # C
OP_UpdateLeadershipAA=0x0000 # C
OP_MarkNPC=0x0000 # C
OP_ClearNPCMarks=0x0000 # C
OP_DoGroupLeadershipAbility=0x0000 # C
OP_GroupLeadershipAAUpdate=0x0000 # C
OP_DelegateAbility=0x0000 # C
OP_SetGroupTarget=0x0000 # C
OP_Charm=0x0000 # C
OP_Stun=0x0000 # C
OP_SendFindableNPCs=0x390c # C
OP_FindPersonRequest=0x0000 # C
OP_FindPersonReply=0x0000 # C
OP_Sound=0x0000 # C
OP_PetBuffWindow=0x0000 # C
OP_LevelAppearance=0x0000 # C
OP_Translocate=0x0000 # C
OP_Sacrifice=0x0000 # C
OP_PopupResponse=0x0000 # C
OP_OnLevelMessage=0x0000 # C
OP_AugmentInfo=0x0000 # C
OP_Petition=0x0000 # C
OP_SomeItemPacketMaybe=0x4200 # C
OP_SomeItemPacketMaybe=0x0000 # C
OP_PVPStats=0x0000 # C
OP_PVPLeaderBoardRequest=0x0000 # C
OP_PVPLeaderBoardReply=0x0000 # C
OP_PVPLeaderBoardDetailsRequest=0x0000 # C
OP_PVPLeaderBoardDetailsReply=0x0000 # C
OP_RestState=0x0000 # C
OP_RespawnWindow=0x0000 # C
OP_DisciplineTimer=0x0000 # C
OP_LDoNButton=0x0000 # C
OP_SetStartCity=0x0000 # C
OP_VoiceMacroIn=0x0000 # C
OP_VoiceMacroOut=0x0000 # C
OP_ItemViewUnknown=0x0000 # C
OP_VetRewardsAvaliable=0x0000 # C Mispelled?
OP_VetClaimRequest=0x0000 # C
OP_VetClaimReply=0x0000 # C
OP_CrystalCountUpdate=0x0000 # C
OP_DisciplineUpdate=0x0000 #
OP_BecomeCorpse=0x0000 #
OP_Action2=0x0000 # C OP_Damage?
OP_MobUpdate=0x4656 # was 0x4656
OP_NPCMoveUpdate=0x38e0 #
OP_CameraEffect=0x0000 # V
OP_SpellEffect=0x0000 # V
OP_DzQuit=0x0000
OP_DzListTimers=0x0000
OP_DzAddPlayer=0x0000
OP_DzRemovePlayer=0x0000
OP_DzSwapPlayer=0x0000
OP_DzMakeLeader=0x0000
OP_DzPlayerList=0x0000
OP_DzJoinExpeditionConfirm=0x0000
OP_DzJoinExpeditionReply=0x0000
OP_DzExpeditionInfo=0x0000
OP_DzMemberStatus=0x0000
OP_DzLeaderStatus=0x0000
OP_DzExpeditionEndsWarning=0x0000
OP_DzExpeditionList=0x0000
OP_DzMemberList=0x0000
OP_DzCompass=0x0000
OP_DzChooseZone=0x0000
# New Opcodes
OP_SpawnPositionUpdate=0x0000 # C
OP_ManaUpdate=0x0000 # C
OP_EnduranceUpdate=0x0000 # C
OP_MobManaUpdate=0x0000 # C
OP_MobEnduranceUpdate=0x0000 # C
# Looting
OP_LootRequest=0x0000 # C
OP_EndLootRequest=0x0000 # C
OP_LootItem=0x0000 # C
OP_LootComplete=0x0000 # C
# bazaar trader stuff stuff:
OP_BazaarSearch=0x0000 # C
OP_TraderDelItem=0x0000 # C
OP_BecomeTrader=0x0000 # C
OP_TraderShop=0x0000 # C
OP_Trader=0x0000 # C
OP_TraderBuy=0x0000 # C
OP_Barter=0x0000 # C
OP_ShopItem=0x0000 #
OP_BazaarInspect=0x0000 #
OP_Bazaar=0x0000 #
OP_TraderItemUpdate=0x0000 #
# pc/npc trading
OP_TradeRequest=0x0000 # C
OP_TradeAcceptClick=0x0000 # C
OP_TradeRequestAck=0x0000 # C
OP_TradeCoins=0x0000 # C
OP_FinishTrade=0x0000 # C
OP_CancelTrade=0x0000 # C
OP_TradeMoneyUpdate=0x0000 # C
OP_MoneyUpdate=0x0000 # C
OP_TradeBusy=0x0000 # C
# Sent after canceling trade or after closing tradeskill object
OP_FinishWindow=0x0000 # C
OP_FinishWindow2=0x0000 # C
# Sent on Live for what seems to be item existance verification
# Ex. Before Right Click Effect happens from items
OP_ItemVerifyRequest=0x0000 # C
OP_ItemVerifyReply=0x0000 # C
# merchant crap
OP_ShopPlayerSell=0x0000 # C
OP_ShopRequest=0x58c5 # was 0x1044
OP_ShopEnd=0x3753 # was 0x3753
OP_ShopEndConfirm=0x0000 # C
OP_ShopPlayerBuy=0x0000 # C
OP_ShopDelItem=0x0000 # C
# tradeskill stuff:
OP_ClickObject=0x0000 # V
OP_ClickObjectAction=0x0000 # V
OP_ClearObject=0x0000 # C
OP_RecipeDetails=0x0000 # C
OP_RecipesFavorite=0x0000 # C
OP_RecipesSearch=0x0000 # C
OP_RecipeReply=0x0000 # C
OP_RecipeAutoCombine=0x0000 # C
OP_TradeSkillCombine=0x0000 # C
# Tribute Packets:
OP_OpenGuildTributeMaster=0x0000 # C
OP_OpenTributeMaster=0x0000 # C
OP_SelectTribute=0x0000 # C
OP_TributeItem=0x0000 # C
OP_TributeMoney=0x0000 # C
OP_TributeToggle=0x0000 # C
OP_TributePointUpdate=0x0000 # C
OP_TributeNPC=0x0000 #
OP_GuildTributeInfo=0x0000 #
OP_OpenTributeReply=0x0000 #
# OP_GuildTributeStatus=0x0000 #
# Adventure packets:
OP_LeaveAdventure=0x0000 # C
OP_AdventureFinish=0x0000 # C
OP_AdventureInfoRequest=0x0000 # C
OP_AdventureInfo=0x0000 # C
OP_AdventureRequest=0x0000 # C
OP_AdventureDetails=0x0000 # C
OP_AdventureData=0x0000 # C
OP_AdventureUpdate=0x0000 # C
OP_AdventureMerchantRequest=0x0000 # C
OP_AdventureMerchantResponse=0x0000 # C
OP_AdventureMerchantPurchase=0x0000 # C
OP_AdventureMerchantSell=0x0000 # C
OP_AdventurePointsUpdate=0x0000 # C
OP_AdventureStatsRequest=0x0000 # C
OP_AdventureStatsReply=0x0000 # C
OP_AdventureLeaderboardRequest=0x0000 # C
OP_AdventureLeaderboardReply=0x0000 # C
# Group Opcodes
OP_GroupDisband=0x0000 # C
OP_GroupInvite=0x0000 # C
OP_GroupFollow=0x0000 # C
OP_GroupUpdate=0x0000 # C
OP_GroupUpdateB=0x0000 # C
OP_GroupCancelInvite=0x0000 # C - Same as OP_CancelInvite?
OP_GroupAcknowledge=0x0000 # C
OP_GroupDelete=0x0000 #
OP_CancelInvite=0x0000 # C
OP_GroupFollow2=0x0000 # C
OP_GroupInvite2=0x0000 # C
OP_GroupDisbandYou=0x0000 # C
OP_GroupDisbandOther=0x0000 # C
OP_GroupLeaderChange=0x0000 # C
OP_GroupRoles=0x0000 # C
# LFG/LFP Opcodes
OP_LFGCommand=0x0000 # C
OP_LFGGetMatchesRequest=0x0000 # C
OP_LFGGetMatchesResponse=0x0000 # C
OP_LFPGetMatchesRequest=0x0000 # C
OP_LFPGetMatchesResponse=0x0000 # C
OP_LFPCommand=0x0000 # C
OP_LFGAppearance=0x0000 #
OP_LFGResponse=0x0000 #
# Raid Opcodes
OP_RaidInvite=0x0000 # C
OP_RaidUpdate=0x0000 # C
OP_RaidJoin=0x0000 #
# Button-push commands
OP_Taunt=0x0000 # C
OP_CombatAbility=0x0000 # C
OP_SenseTraps=0x0000 # C
OP_PickPocket=0x0000 # C
OP_DisarmTraps=0x0000 #
OP_Disarm=0x0000 # C
OP_Sneak=0x0000 # C
OP_Fishing=0x0000 # C
OP_InstillDoubt=0x0000 # C
OP_FeignDeath=0x0000 # C
OP_Mend=0x0000 # C
OP_LDoNOpen=0x0000 # C
# Task packets
OP_TaskActivityComplete=0x0000 # C
OP_TaskMemberList=0x0000 # C
OP_OpenNewTasksWindow=0x0000 # C
OP_AvaliableTask=0x0000 # C Mispelled?
OP_AcceptNewTask=0x0000 # C
OP_TaskHistoryRequest=0x0000 # C
OP_TaskHistoryReply=0x0000 # C
OP_CancelTask=0x0000 # C
OP_DeclineAllTasks=0x0000 #
# Title opcodes
OP_NewTitlesAvailable=0x0000 # C
OP_RequestTitles=0x0000 # C
OP_SendTitleList=0x0000 # C
OP_SetTitle=0x0000 # C
OP_SetTitleReply=0x0000 # C
# mail opcodes
OP_Command=0x0000 #
OP_MailboxHeader=0x0000 #
OP_MailHeader=0x0000 #
OP_MailBody=0x0000 #
OP_NewMail=0x0000 #
OP_SentConfirm=0x0000 #
# # # # # # # # # # # Below this point should not be needed # # # # # # # # # # #
# This section are all unknown in Titanium
OP_ForceFindPerson=0x0000 #
OP_LocInfo=0x0000 #
OP_ReloadUI=0x0000 #
OP_ItemName=0x0000 #
OP_ItemLinkText=0x0000 #
OP_MultiLineMsg=0x0000 #
OP_MendHPUpdate=0x0000 #
OP_TargetReject=0x0000 #
OP_SafePoint=0x0000 #
OP_IncreaseStats=0x0000 #
OP_ApproveZone=0x0000 #
OP_ZoneComplete=0x0000 #
OP_ClientError=0x0000 #
OP_DumpName=0x0000 #
OP_Heartbeat=0x0000 #
OP_CrashDump=0x0000 #
OP_LoginComplete=0x0000 #
# discovered opcodes not yet used:
OP_PickLockSuccess=0x0000 #
OP_PlayMP3=0x0000 #
OP_ReclaimCrystals=0x0000 #
OP_DynamicWall=0x0000 #
OP_OpenDiscordMerchant=0x0000 #
OP_DiscordMerchantInventory=0x0000 #
OP_GiveMoney=0x0000 #
OP_RequestKnowledgeBase=0x0000 #
OP_KnowledgeBase=0x0000 #
OP_SlashAdventure=0x0000 # /adventure
OP_BecomePVPPrompt=0x0000 #
OP_MoveLogRequest=0x0000 # gone I think
OP_MoveLogDisregard=0x0000 # gone I think
# named unknowns, to make looking for real unknown easier
OP_AnnoyingZoneUnknown=0x0000 #
OP_Some6ByteHPUpdate=0x0000 # seems to happen when you target group members
OP_QueryResponseThing=0x0000 #
# realityincarnate: these are just here to stop annoying several thousand byte packet dumps
#OP_LoginUnknown1=0x0000 # U OP_SendSpellChecksum
#OP_LoginUnknown2=0x0000 # U OP_SendSkillCapsChecksum
# Petition Opcodes
OP_PetitionSearch=0x0000 # search term for petition
OP_PetitionSearchResults=0x0000 # (list of?) matches from search
OP_PetitionSearchText=0x0000 # text results of search
OP_PetitionUpdate=0x0000 #
OP_PetitionCheckout=0x0000 #
OP_PetitionCheckIn=0x0000 #
OP_PetitionQue=0x0000 #
OP_PetitionUnCheckout=0x0000 #
OP_PetitionDelete=0x0000 #
OP_DeletePetition=0x0000 #
OP_PetitionResolve=0x0000 #
OP_PDeletePetition=0x0000 #
OP_PetitionBug=0x0000 #
OP_PetitionRefresh=0x0000 #
OP_PetitionCheckout2=0x0000 #
OP_PetitionViewPetition=0x0000 #
# Login opcodes
OP_SessionReady=0x0000 #
OP_Login=0x0000 #
OP_ServerListRequest=0x0000 #
OP_PlayEverquestRequest=0x0000 #
OP_PlayEverquestResponse=0x0000 #
OP_ChatMessage=0x0000 #
OP_LoginAccepted=0x0000 #
OP_ServerListResponse=0x0000 #
OP_Poll=0x0000 #
OP_EnterChat=0x0000 #
OP_PollResponse=0x0000 #
# raw opcodes
OP_RAWSessionRequest=0x0000 #
OP_RAWSessionResponse=0x0000 #
OP_RAWCombined=0x0000 #
OP_RAWSessionDisconnect=0x0000 #
OP_RAWKeepAlive=0x0000 #
OP_RAWSessionStatRequest=0x0000 #
OP_RAWSessionStatResponse=0x0000 #
OP_RAWPacket=0x0000 #
OP_RAWFragment=0x0000 #
OP_RAWOutOfOrderAck=0x0000 #
OP_RAWAck=0x0000 #
OP_RAWAppCombined=0x0000 #
OP_RAWOutOfSession=0x0000 #
# we need to document the differences between these packets to make identifying them easier
OP_Some3ByteHPUpdate=0x0000 # initial HP update for mobs
OP_InitialHPUpdate=0x0000 #
OP_OPCode2511=0x2511
@@ -0,0 +1,607 @@
# OPCodes that are not used by EQExtractor2 for SQL generation and have a none 0x0000 value are most likely incorrect.
OP_Unknown=0x0000
OP_ExploreUnknown=0x0000 # used for unknown explorer
# V = Verified correct
# C = Most likely correct
# U = Unsure, but should be correct or close
# world packets
# Required to reach Char Select:
OP_SendLoginInfo=0x4d5c #c
OP_ApproveWorld=0x655c #c
OP_LogServer=0x1497 #c
OP_SendCharInfo=0x1513 #
OP_ExpansionInfo=0x1771 #
OP_GuildsList=0x5b0b #
OP_EnterWorld=0x710e #c
OP_PostEnterWorld=0x7930 #c
OP_World_Client_CRC1=0x4552 #
OP_World_Client_CRC2=0x3e50 #
OP_SendSpellChecksum=0x0000 #
OP_SendSkillCapsChecksum=0x0000 #
# Character Select Related:
OP_DeleteCharacter=0x0000 #
OP_CharacterCreateRequest=0x0000 #
OP_CharacterCreate=0x0000 #
OP_RandomNameGenerator=0x0000 #
OP_ApproveName=0x0000 #
OP_MOTD=0x097f #
OP_SetChatServer=0x2c38 #c
OP_SetChatServer2=0x675c #c
OP_ZoneServerInfo=0x16f5 #c
OP_WorldComplete=0x3aef #
OP_WorldUnknown001=0x0000 #
OP_FloatListThing=0x45d7 #
# Reasons for Disconnect:
OP_ZoneUnavail=0x66e4 # This is not the right opcode. Produces a 'Your character is inaccessible' message.
OP_WorldClientReady=0x3f24 #
OP_CharacterStillInZone=0x0000 #
OP_WorldChecksumFailure=0x0000 #
OP_WorldLoginFailed=0x0000 #
OP_WorldLogout=0x0000 #
OP_WorldLevelTooHigh=0x0000 #
OP_CharInacessable=0x0000 #
OP_UserCompInfo=0x0000 #
# OP_SendExeChecksum=0x0000 #
# OP_SendBaseDataChecksum=0x0000 #
# Zone in opcodes
OP_AckPacket=0x3594 #
OP_ZoneEntry=0x5821 #
OP_ReqNewZone=0x1c36 #
OP_NewZone=0x4118 #
OP_ZoneSpawns=0x0000 #
OP_PlayerProfile=0x6afd #c
OP_TimeOfDay=0x6015 #
OP_LevelUpdate=0x0000 #
OP_Stamina=0x0000 #
OP_RequestClientZoneChange=0x18ea #
OP_ZoneChange=0x0000 #
OP_LockoutTimerInfo=0x0000 #
OP_ZoneServerReady=0x0000 #
OP_ZoneInUnknown=0x0000 #
OP_LogoutReply=0x0000 #
OP_PreLogoutReply=0x0000 #
# Required to fully log in
OP_SpawnAppearance=0x3f55 #c
OP_TributeUpdate=0x4895 #
OP_TributeTimer=0x0000 #
OP_TaskDescription=0x0000 #
OP_TaskActivity=0x0000 #
OP_CompletedTasks=0x6d1f #c
OP_Weather=0x4658 #
OP_SendAATable=0x72f3 #
OP_UpdateAA=0x0000 #
OP_RespondAA=0x0000 #
OP_ReqClientSpawn=0x47e7 #
OP_SpawnDoor=0x0e24 #
OP_GroundSpawn=0x5c85 #
OP_SendZonepoints=0x399f #
OP_SendAAStats=0x0000 #
OP_WorldObjectsSent=0x7b73 #
OP_BlockedBuffs=0x664a #
OP_SendExpZonein=0x54e8 #
OP_SendTributes=0x0000 #
OP_TributeInfo=0x0000 #
OP_SendGuildTributes=0x0000 #
OP_AAExpUpdate=0x0000 #
OP_ExpUpdate=0x0000 #
OP_HPUpdate=0x2369 #c
OP_ManaChange=0x0000 #
OP_TGB=0x0000 #
OP_SpecialMesg=0x156c #
OP_GuildMemberList=0x51bc #
OP_GuildMOTD=0x0a1d #
OP_CharInventory=0x4849 #c
OP_WearChange=0x1a58 #c
OP_ClientUpdate=0x7062 #
OP_ClientReady=0x6cdc #
OP_SetServerFilter=0x053a #c
# Guild Opcodes
OP_GetGuildMOTD=0x0000 #
OP_GetGuildMOTDReply=0x0000 #
OP_GuildMemberUpdate=0x0000 #
OP_GuildInvite=0x0000 #
OP_GuildRemove=0x0000 #
OP_GuildPeace=0x0000 #
OP_SetGuildMOTD=0x0000 #
OP_GuildList=0x5b0b #
OP_GuildWar=0x0000 #
OP_GuildLeader=0x0000 #
OP_GuildDelete=0x0000 #
OP_GuildInviteAccept=0x0000 #
OP_GuildDemote=0x0000 #
OP_GuildPublicNote=0x0000 #
OP_GuildManageBanker=0x0000 #
OP_GuildBank=0x0000 #
OP_SetGuildRank=0x0000 #
OP_GuildUpdateURLAndChannel=0x0000 #
OP_GuildMemberLevelUpdate=0x0000 #
OP_ZoneGuildList=0x0000 #
OP_GetGuildsList=0x0000 #
# OP_GuildManageRemove=0x0000 #
# OP_GuildManageAdd=0x0000 #
# OP_GuildManageStatus=0x0000 #
# GM/guide opcodes
OP_GMServers=0x0000 #
OP_GMBecomeNPC=0x0000 #
OP_GMZoneRequest=0x6f79 #
OP_GMZoneRequest2=0x02d6 #
OP_GMGoto=0x0000 #
OP_GMSearchCorpse=0x0000 #
OP_GMHideMe=0x0000 #
OP_GMDelCorpse=0x0000 #
OP_GMApproval=0x0000 #
OP_GMToggle=0x0000 #
OP_GMSummon=0x0000 #
OP_GMEmoteZone=0x0000 #
OP_GMEmoteWorld=0x0000 #
OP_GMFind=0x0000 #
OP_GMKick=0x0000 #
OP_GMKill=0x0000 #
OP_GMNameChange=0x0000 #
OP_GMLastName=0x0000 #
OP_InspectAnswer=0x0000 #
OP_BeginCast=0x0d5a #
OP_BuffFadeMsg=0x50c2 #
OP_ConsentResponse=0x0000 #
OP_MemorizeSpell=0x0000 #
OP_SwapSpell=0x0000 #
OP_CastSpell=0x7286 #
OP_Consider=0x70c6 #c
OP_FormattedMessage=0x32c6 #
OP_SimpleMessage=0x0000 # C 0x0000
OP_Buff=0x0000 #
OP_Illusion=0x4843 #c
OP_MoneyOnCorpse=0x0000 #
OP_RandomReply=0x0000 #
OP_DenyResponse=0x0000 #
OP_SkillUpdate=0x0000 #
OP_GMTrainSkillConfirm=0x0000 #
OP_RandomReq=0x0000 #
OP_Death=0x49b6 #
OP_Bind_Wound=0x0000 #
OP_GMTraining=0x0000 #
OP_GMEndTraining=0x0000 #
OP_GMTrainSkill=0x0000 #
OP_Animation=0x0b93 #c
OP_Begging=0x0000 #
OP_Consent=0x0000 #
OP_ConsentDeny=0x0000 #
OP_AutoFire=0x0000 #
OP_PetCommands=0x0000 #
OP_DeleteSpell=0x0000 #
OP_Surname=0x0000 #
OP_ClearSurname=0x0000 #
OP_FaceChange=0x0000 #
OP_SenseHeading=0x0000 #
OP_Action=0x0000 # 0x4200
OP_ConsiderCorpse=0x0000 #
OP_HideCorpse=0x0000 #
OP_Bug=0x0000 #
OP_Feedback=0x0000 #
OP_Report=0x0000 #
OP_Damage=0x7519 #
OP_ChannelMessage=0x2e79 #
OP_Assist=0x0000 #
OP_AssistGroup=0x0000 #
OP_MoveCoin=0x0000 #
OP_ZonePlayerToBind=0x0000 #
OP_KeyRing=0x0000 #
OP_WhoAllRequest=0x0000 #
OP_WhoAllResponse=0x0000 #
OP_FriendsWho=0x0000 #
OP_ConfirmDelete=0x0000 #
OP_Logout=0x517b #
OP_Rewind=0x0000 #
OP_TargetCommand=0x0000 #
OP_InspectRequest=0x0000 #
OP_Hide=0x0000 #
OP_Jump=0x0000 #
OP_Camp=0x0000 # Was 0x1436
OP_Emote=0x0000 #
OP_SetRunMode=0x0000 #
OP_BankerChange=0x0000 #
OP_TargetMouse=0x3edc #
OP_MobHealth=0x5cb0 #c
OP_InitialMobHealth=0x0000 #
OP_TargetHoTT=0x0000 #
OP_TargetBuffs=0x0000 #
OP_BuffCreate=0x0000
OP_DeleteSpawn=0x58c5 #c
OP_AutoAttack=0x1df9 #
OP_AutoAttack2=0x0000 #
OP_Consume=0x0000 #
OP_MoveItem=0x0000 #
OP_DeleteItem=0x0000 #
OP_DeleteCharge=0x0000 #
OP_ItemPacket=0x3df8 #
OP_ItemLinkResponse=0x0000 #
OP_ItemLinkClick=0x0000 #
OP_NewSpawn=0x0000 #
OP_Track=0x0000 #
OP_TrackTarget=0x0000 #
OP_TrackUnknown=0x0000 #
OP_ClickDoor=0x3154 #
OP_MoveDoor=0x470e #
OP_EnvDamage=0x0000 #
OP_BoardBoat=0x0000 #
OP_Forage=0x0000 #
OP_LeaveBoat=0x0000 #
OP_ControlBoat=0x0000 #
OP_SafeFallSuccess=0x0000 #
OP_RezzComplete=0x0000 #
OP_RezzRequest=0x0000 #
OP_RezzAnswer=0x0000 #
OP_Shielding=0x0000 #
OP_RequestDuel=0x0000 #
OP_MobRename=0x0000 #
OP_AugmentItem=0x0000 #
OP_WeaponEquip1=0x7404 #c //looks like 1 & 2 use same opcode- 2nd uint32 specifies weapon 1 or 2
OP_WeaponEquip2=0x0000 #
OP_WeaponUnequip2=0x0000 #
OP_ApplyPoison=0x0000 #
OP_Save=0x1436 #
OP_TestBuff=0x0000 #
OP_CustomTitles=0x0000 #
OP_Split=0x0000 #
OP_YellForHelp=0x0000 #
OP_LoadSpellSet=0x0000 #
OP_Bandolier=0x0000 #
OP_PotionBelt=0x0000 #
OP_DuelResponse=0x0000 #
OP_DuelResponse2=0x0000 #
OP_SaveOnZoneReq=0x2913 #
OP_ReadBook=0x0000 #
OP_Dye=0x0000 #
OP_InterruptCast=0x0000 #
OP_AAAction=0x0000 #
OP_LeadershipExpToggle=0x0000 #
OP_LeadershipExpUpdate=0x0000 #
OP_PurchaseLeadershipAA=0x0000 #
OP_UpdateLeadershipAA=0x0000 #
OP_MarkNPC=0x0000 #
OP_ClearNPCMarks=0x0000 #
OP_DoGroupLeadershipAbility=0x0000 #
OP_GroupLeadershipAAUpdate=0x1aae #c
OP_DelegateAbility=0x0000 #
OP_SetGroupTarget=0x0000 #
OP_Charm=0x0000 #
OP_Stun=0x0000 #
OP_SendFindableNPCs=0x3015 #
OP_FindPersonRequest=0x0000 #
OP_FindPersonReply=0x0000 #
OP_Sound=0x0000 #
OP_PetBuffWindow=0x0000 #
OP_LevelAppearance=0x0000 #
OP_Translocate=0x0000 #
OP_Sacrifice=0x0000 #
OP_PopupResponse=0x0000 #
OP_OnLevelMessage=0x0000 #
OP_AugmentInfo=0x0000 #
OP_Petition=0x0000 #
OP_SomeItemPacketMaybe=0x4200 #
OP_SomeItemPacketMaybe=0x0000 #
OP_PVPStats=0x0000 #
OP_PVPLeaderBoardRequest=0x0000 #
OP_PVPLeaderBoardReply=0x0000 #
OP_PVPLeaderBoardDetailsRequest=0x0000 #
OP_PVPLeaderBoardDetailsReply=0x0000 #
OP_RestState=0x0000 #
OP_RespawnWindow=0x0000 #
OP_DisciplineTimer=0x0000 #
OP_LDoNButton=0x0000 #
OP_SetStartCity=0x0000 #
OP_VoiceMacroIn=0x0000 #
OP_VoiceMacroOut=0x0000 #
OP_ItemViewUnknown=0x0000 #
OP_VetRewardsAvaliable=0x0000 #
OP_VetClaimRequest=0x0000 #
OP_VetClaimReply=0x0000 #
OP_CrystalCountUpdate=0x0000 #
OP_DisciplineUpdate=0x0000 #
OP_BecomeCorpse=0x0000 #
OP_Action2=0x0000 #
OP_MobUpdate=0x4656 #
OP_NPCMoveUpdate=0x2339 #
OP_CameraEffect=0x0000 #
OP_SpellEffect=0x0000 #
OP_DzQuit=0x0000
OP_DzListTimers=0x0000
OP_DzAddPlayer=0x0000
OP_DzRemovePlayer=0x0000
OP_DzSwapPlayer=0x0000
OP_DzMakeLeader=0x0000
OP_DzPlayerList=0x0000
OP_DzJoinExpeditionConfirm=0x0000
OP_DzJoinExpeditionReply=0x0000
OP_DzExpeditionInfo=0x0000
OP_DzMemberStatus=0x0000
OP_DzLeaderStatus=0x0000
OP_DzExpeditionEndsWarning=0x0000
OP_DzExpeditionList=0x0000
OP_DzMemberList=0x0000
OP_DzCompass=0x0000
OP_DzChooseZone=0x0000
# New Opcodes
OP_SpawnPositionUpdate=0x0000 #
OP_ManaUpdate=0x7c94 #c
OP_EnduranceUpdate=0x5851 #c
OP_MobManaUpdate=0x190c #c
OP_MobEnduranceUpdate=0x4d27 #c
# Looting
OP_LootRequest=0x0000 #
OP_EndLootRequest=0x0000 #
OP_LootItem=0x0000 #
OP_LootComplete=0x0000 #
# bazaar trader stuff stuff:
OP_BazaarSearch=0x0000 #
OP_TraderDelItem=0x0000 #
OP_BecomeTrader=0x0000 #
OP_TraderShop=0x0000 #
OP_Trader=0x0000 #
OP_TraderBuy=0x0000 #
OP_Barter=0x0000 #
OP_ShopItem=0x0000 #
OP_BazaarInspect=0x0000 #
OP_Bazaar=0x0000 #
OP_TraderItemUpdate=0x0000 #
# pc/npc trading
OP_TradeRequest=0x0000 #
OP_TradeAcceptClick=0x0000 #
OP_TradeRequestAck=0x0000 #
OP_TradeCoins=0x0000 #
OP_FinishTrade=0x0000 #
OP_CancelTrade=0x0000 #
OP_TradeMoneyUpdate=0x0000 #
OP_MoneyUpdate=0x0000 #
OP_TradeBusy=0x0000 #
# Sent after canceling trade or after closing tradeskill object
OP_FinishWindow=0x0000 #
OP_FinishWindow2=0x0000 #
# Sent on Live for what seems to be item existance verification
# Ex. Before Right Click Effect happens from items
OP_ItemVerifyRequest=0x0000 #
OP_ItemVerifyReply=0x0000 #
# merchant crap
OP_ShopPlayerSell=0x0000 #
OP_ShopRequest=0x442a #
OP_ShopEnd=0x078e #
OP_ShopEndConfirm=0x0000 #
OP_ShopPlayerBuy=0x0000 #
OP_ShopDelItem=0x0000 #
# tradeskill stuff:
OP_ClickObject=0x0000 #
OP_ClickObjectAction=0x0000 #
OP_ClearObject=0x0000 #
OP_RecipeDetails=0x0000 #
OP_RecipesFavorite=0x0000 #
OP_RecipesSearch=0x0000 #
OP_RecipeReply=0x0000 #
OP_RecipeAutoCombine=0x0000 #
OP_TradeSkillCombine=0x0000 #
# Tribute Packets:
OP_OpenGuildTributeMaster=0x0000 #
OP_OpenTributeMaster=0x0000 #
OP_SelectTribute=0x0000 #
OP_TributeItem=0x0000 #
OP_TributeMoney=0x0000 #
OP_TributeToggle=0x0000 #
OP_TributePointUpdate=0x0000 #
OP_TributeNPC=0x0000 #
OP_GuildTributeInfo=0x0000 #
OP_OpenTributeReply=0x0000 #
# OP_GuildTributeStatus=0x0000 #
# Adventure packets:
OP_LeaveAdventure=0x0000 #
OP_AdventureFinish=0x0000 #
OP_AdventureInfoRequest=0x0000 #
OP_AdventureInfo=0x0000 #
OP_AdventureRequest=0x0000 #
OP_AdventureDetails=0x0000 #
OP_AdventureData=0x0000 #
OP_AdventureUpdate=0x0000 #
OP_AdventureMerchantRequest=0x0000 #
OP_AdventureMerchantResponse=0x0000 #
OP_AdventureMerchantPurchase=0x0000 #
OP_AdventureMerchantSell=0x0000 #
OP_AdventurePointsUpdate=0x0000 #
OP_AdventureStatsRequest=0x0000 #
OP_AdventureStatsReply=0x0000 #
OP_AdventureLeaderboardRequest=0x0000 #
OP_AdventureLeaderboardReply=0x0000 #
# Group Opcodes
OP_GroupDisband=0x0000 #
OP_GroupInvite=0x3671 #c
OP_GroupFollow=0x0000 #
OP_GroupUpdate=0x4b82 #c
OP_GroupUpdateB=0x44c2 #c
OP_GroupCancelInvite=0x0000 #
OP_GroupAcknowledge=0x0000 #
OP_GroupDelete=0x0000 #
OP_CancelInvite=0x0000 #
OP_GroupFollow2=0x0000 #
OP_GroupInvite2=0x0000 #
OP_GroupDisbandYou=0x0000 #
OP_GroupDisbandOther=0x0000 #
OP_GroupLeaderChange=0x0000 #
OP_GroupRoles=0x6364 #c
# LFG/LFP Opcodes
OP_LFGCommand=0x0000 #
OP_LFGGetMatchesRequest=0x0000 #
OP_LFGGetMatchesResponse=0x0000 #
OP_LFPGetMatchesRequest=0x0000 #
OP_LFPGetMatchesResponse=0x0000 #
OP_LFPCommand=0x0000 #
OP_LFGAppearance=0x0000 #
OP_LFGResponse=0x0000 #
# Raid Opcodes
OP_RaidInvite=0x0000 #
OP_RaidUpdate=0x0c08 #
OP_RaidJoin=0x0000 #
# Button-push commands
OP_Taunt=0x0000 #
OP_CombatAbility=0x0000 #
OP_SenseTraps=0x0000 #
OP_PickPocket=0x0000 #
OP_DisarmTraps=0x0000 #
OP_Disarm=0x0000 #
OP_Sneak=0x0000 #
OP_Fishing=0x0000 #
OP_InstillDoubt=0x0000 #
OP_FeignDeath=0x0000 #
OP_Mend=0x0000 #
OP_LDoNOpen=0x0000 #
# Task packets
OP_TaskActivityComplete=0x0000 #
OP_TaskMemberList=0x0000 #
OP_OpenNewTasksWindow=0x0000 #
OP_AvaliableTask=0x0000 #
OP_AcceptNewTask=0x0000 #
OP_TaskHistoryRequest=0x0000 #
OP_TaskHistoryReply=0x0000 #
OP_CancelTask=0x0000 #
OP_DeclineAllTasks=0x0000 #
# Title opcodes
OP_NewTitlesAvailable=0x0000 #
OP_RequestTitles=0x0000 #
OP_SendTitleList=0x0000 #
OP_SetTitle=0x0000 #
OP_SetTitleReply=0x0000 #
# mail opcodes
OP_Command=0x0000 #
OP_MailboxHeader=0x0000 #
OP_MailHeader=0x0000 #
OP_MailBody=0x0000 #
OP_NewMail=0x0000 #
OP_SentConfirm=0x0000 #
# # # # # # # # # # # Below this point should not be needed # # # # # # # # # # #
# This section are all unknown in Titanium
OP_ForceFindPerson=0x0000 #
OP_LocInfo=0x0000 #
OP_ReloadUI=0x0000 #
OP_ItemName=0x0000 #
OP_ItemLinkText=0x0000 #
OP_MultiLineMsg=0x0000 #
OP_MendHPUpdate=0x0000 #
OP_TargetReject=0x0000 #
OP_SafePoint=0x0000 #
OP_IncreaseStats=0x0000 #
OP_ApproveZone=0x0000 #
OP_ZoneComplete=0x0000 #
OP_ClientError=0x0000 #
OP_DumpName=0x0000 #
OP_Heartbeat=0x0000 #
OP_CrashDump=0x0000 #
OP_LoginComplete=0x0000 #
# discovered opcodes not yet used:
OP_PickLockSuccess=0x0000 #
OP_PlayMP3=0x0000 #
OP_ReclaimCrystals=0x0000 #
OP_DynamicWall=0x0000 #
OP_OpenDiscordMerchant=0x0000 #
OP_DiscordMerchantInventory=0x0000 #
OP_GiveMoney=0x0000 #
OP_RequestKnowledgeBase=0x0000 #
OP_KnowledgeBase=0x0000 #
OP_SlashAdventure=0x0000 # /adventure
OP_BecomePVPPrompt=0x0000 #
OP_MoveLogRequest=0x0000 # gone I think
OP_MoveLogDisregard=0x0000 # gone I think
# named unknowns, to make looking for real unknown easier
OP_AnnoyingZoneUnknown=0x0000 #
OP_Some6ByteHPUpdate=0x0000 # seems to happen when you target group members
OP_QueryResponseThing=0x0000 #
# realityincarnate: these are just here to stop annoying several thousand byte packet dumps
#OP_LoginUnknown1=0x0000 # U OP_SendSpellChecksum
#OP_LoginUnknown2=0x0000 # U OP_SendSkillCapsChecksum
# Petition Opcodes
OP_PetitionSearch=0x0000 # search term for petition
OP_PetitionSearchResults=0x0000 # (list of?) matches from search
OP_PetitionSearchText=0x0000 # text results of search
OP_PetitionUpdate=0x0000 #
OP_PetitionCheckout=0x0000 #
OP_PetitionCheckIn=0x0000 #
OP_PetitionQue=0x0000 #
OP_PetitionUnCheckout=0x0000 #
OP_PetitionDelete=0x0000 #
OP_DeletePetition=0x0000 #
OP_PetitionResolve=0x0000 #
OP_PDeletePetition=0x0000 #
OP_PetitionBug=0x0000 #
OP_PetitionRefresh=0x0000 #
OP_PetitionCheckout2=0x0000 #
OP_PetitionViewPetition=0x0000 #
# Login opcodes
OP_SessionReady=0x0000 #
OP_Login=0x0000 #
OP_ServerListRequest=0x0000 #
OP_PlayEverquestRequest=0x0000 #
OP_PlayEverquestResponse=0x0000 #
OP_ChatMessage=0x0000 #
OP_LoginAccepted=0x0000 #
OP_ServerListResponse=0x0000 #
OP_Poll=0x0000 #
OP_EnterChat=0x0000 #
OP_PollResponse=0x0000 #
# raw opcodes
OP_RAWSessionRequest=0x0000 #
OP_RAWSessionResponse=0x0000 #
OP_RAWCombined=0x0000 #
OP_RAWSessionDisconnect=0x0000 #
OP_RAWKeepAlive=0x0000 #
OP_RAWSessionStatRequest=0x0000 #
OP_RAWSessionStatResponse=0x0000 #
OP_RAWPacket=0x0000 #
OP_RAWFragment=0x0000 #
OP_RAWOutOfOrderAck=0x0000 #
OP_RAWAck=0x0000 #
OP_RAWAppCombined=0x0000 #
OP_RAWOutOfSession=0x0000 #
# we need to document the differences between these packets to make identifying them easier
OP_Some3ByteHPUpdate=0x0000 # initial HP update for mobs
OP_InitialHPUpdate=0x0000 #
OP_MercenaryDataRequest=0x33b8 #c
OP_MercenaryDataResponse=0x0327 #c
OP_MercenaryHire=0x0000 #
OP_MercenaryAssign=0x0000 #
OP_MercenaryTimer=0x0000 #
OP_MercenaryUnknown1=0x0000 #
@@ -0,0 +1,610 @@
# ShowEQ Import Notes:
# ZERO THE FILE first
# perl -pi -e 's/0x0000a-fA-F]{4}/0x0000/g' opcodes.conf
# Unknown Mapping:
# OP_Action2 -> OP_Damage
# OP_EnvDamage -> OP_Damage ---> might have been a one time mistake
# Name Differences:
# OP_CancelInvite -> OP_GroupCancelInvite
# OP_GMFind -> OP_FindPersonRequest
# OP_CommonMessage -> OP_ChannelMessage
OP_Unknown=0x0000
OP_ExploreUnknown=0x0000 # used for unknown explorer
# V = Verified correct
# C = Most likely correct
# U = Unsure, but should be correct or close
# world packets
# Required to reach Char Select:
OP_SendLoginInfo=0x2683 # V
OP_ApproveWorld=0x28a7 # C
OP_LogServer=0x224f # C
OP_SendCharInfo=0x2c27 # C
OP_ExpansionInfo=0x1771 # C
OP_GuildsList=0x5b0b # C
OP_EnterWorld=0x4f60 # C
OP_PostEnterWorld=0x570c # C
OP_World_Client_CRC1=0x0000 # C
OP_World_Client_CRC2=0x0000 # C
OP_SendSpellChecksum=0x0000 # C
OP_SendSkillCapsChecksum=0x0000 # C
# Character Select Related:
OP_DeleteCharacter=0x0000 # C
OP_CharacterCreateRequest=0x0000 # C
OP_CharacterCreate=0x0000 # C
OP_RandomNameGenerator=0x0000 # C 0x0000
OP_ApproveName=0x0000 # C
OP_MOTD=0x7312 # C 0x0000
OP_SetChatServer=0x1ce3 # C 0x0000
OP_SetChatServer2=0x0000 # C 0x0000
OP_ZoneServerInfo=0x03cc # C 0x0000
OP_WorldComplete=0x1524 # C
OP_WorldUnknown001=0x0000 # C 0x0000
OP_FloatListThing=0x0000 # V
# Reasons for Disconnect:
OP_ZoneUnavail=0x0000 # C 0x0000
OP_WorldClientReady=0x399b # C 0x0000
OP_CharacterStillInZone=0x0000 #
OP_WorldChecksumFailure=0x0000 #
OP_WorldLoginFailed=0x0000 #
OP_WorldLogout=0x0000 #
OP_WorldLevelTooHigh=0x0000 #
OP_CharInacessable=0x0000 #
OP_UserCompInfo=0x0000 #
# OP_SendExeChecksum=0x0000 #
# OP_SendBaseDataChecksum=0x0000 #
# Zone in opcodes
OP_AckPacket=0x3594 # V
OP_ZoneEntry=0x538f # V
OP_ReqNewZone=0x5ca5 # V
OP_NewZone=0x0254 # V
OP_ZoneSpawns=0x0000 # ?
OP_PlayerProfile=0x6022 # V
OP_TimeOfDay=0x6015 # V
OP_LevelUpdate=0x0000 # V
OP_Stamina=0x0000 # V
OP_RequestClientZoneChange=0x4178 # C
OP_ZoneChange=0x4a61 # C
OP_LockoutTimerInfo=0x0000 #
OP_ZoneServerReady=0x0000 #
OP_ZoneInUnknown=0x0000 #
OP_LogoutReply=0x0000 #
OP_PreLogoutReply=0x0000 #
# Required to fully log in
OP_SpawnAppearance=0x0000 # V
OP_TributeUpdate=0x7b87 # V
OP_TributeTimer=0x0000 # C
OP_TaskDescription=0x0000 # C
OP_TaskActivity=0x0000 # C
OP_CompletedTasks=0x0000 # C 0x0000
OP_Weather=0x0ed5 # V
OP_SendAATable=0x6dc3 # V
OP_UpdateAA=0x0000 # V
OP_RespondAA=0x0000 # C 0x0000
OP_ReqClientSpawn=0x6618 # V
OP_SpawnDoor=0x47ae # V
OP_GroundSpawn=0x5f0d # V
OP_SendZonepoints=0x0ff4 # V
OP_SendAAStats=0x0000 # C
OP_WorldObjectsSent=0x7b73 # V
OP_BlockedBuffs=0x4027 # V
OP_SendExpZonein=0x1436 # V
OP_SendTributes=0x0000 # V
OP_TributeInfo=0x0000 # V
OP_SendGuildTributes=0x0000 # C 0x0000
OP_AAExpUpdate=0x0000 # V
OP_ExpUpdate=0x0000 # V
OP_HPUpdate=0x0000 # V
OP_ManaChange=0x0000 # C
OP_TGB=0x0000 # C
OP_SpecialMesg=0x14ff # V
OP_GuildMemberList=0x0000 # C
OP_GuildMOTD=0x0000 # V
OP_CharInventory=0x79e0 # V
OP_WearChange=0x0000 # V
OP_ClientUpdate=0x7062 # V
OP_ClientReady=0x6cdc # V
OP_SetServerFilter=0x0000 # V
# Guild Opcodes
OP_GetGuildMOTD=0x0000 # C
OP_GetGuildMOTDReply=0x0000 # C
OP_GuildMemberUpdate=0x0000 # C
OP_GuildInvite=0x0000 # C
OP_GuildRemove=0x0000 # C
OP_GuildPeace=0x0000 # C
OP_SetGuildMOTD=0x0000 # C
OP_GuildList=0x0000 # C
OP_GuildWar=0x0000 # C
OP_GuildLeader=0x0000 # C
OP_GuildDelete=0x0000 # C
OP_GuildInviteAccept=0x0000 # C
OP_GuildDemote=0x0000 # C
OP_GuildPublicNote=0x0000 # C
OP_GuildManageBanker=0x0000 # C
OP_GuildBank=0x0000 # C
OP_SetGuildRank=0x0000 # C
OP_GuildUpdateURLAndChannel=0x0000 # C
OP_GuildMemberLevelUpdate=0x0000 #
OP_ZoneGuildList=0x0000 #
OP_GetGuildsList=0x0000 #
# OP_GuildManageRemove=0x0000 #
# OP_GuildManageAdd=0x0000 #
# OP_GuildManageStatus=0x0000 #
# GM/guide opcodes
OP_GMServers=0x0000 # C
OP_GMBecomeNPC=0x0000 # C
OP_GMZoneRequest=0x18ea # C
OP_GMZoneRequest2=0x3ad9 # C
OP_GMGoto=0x0000 # C
OP_GMSearchCorpse=0x0000 # C
OP_GMHideMe=0x0000 # C
OP_GMDelCorpse=0x0000 # C
OP_GMApproval=0x0000 # C
OP_GMToggle=0x0000 # C 0x0000
OP_GMSummon=0x0000 # C
OP_GMEmoteZone=0x0000 # C
OP_GMEmoteWorld=0x0000 # C
OP_GMFind=0x0000 # C
OP_GMKick=0x0000 # C
OP_GMKill=0x0000 # C
OP_GMNameChange=0x0000 # C
OP_GMLastName=0x0000 # C
OP_InspectAnswer=0x0000 # C
OP_BeginCast=0x0000 # C
OP_BuffFadeMsg=0x0000 # C
OP_ConsentResponse=0x0000 # C
OP_MemorizeSpell=0x0000 # C
OP_SwapSpell=0x0000 # C
OP_CastSpell=0x7286 # C
OP_Consider=0x0000 # C
OP_FormattedMessage=0x0000 # C
OP_SimpleMessage=0x0000 # C 0x0000
OP_Buff=0x0000 # C
OP_Illusion=0x0000 # C
OP_MoneyOnCorpse=0x0000 # C
OP_RandomReply=0x0000 # C
OP_DenyResponse=0x0000 # C
OP_SkillUpdate=0x0000 # C
OP_GMTrainSkillConfirm=0x0000 # C
OP_RandomReq=0x0000 # C
OP_Death=0x0000 # C
OP_Bind_Wound=0x0000 # C
OP_GMTraining=0x0000 # C
OP_GMEndTraining=0x0000 # C
OP_GMTrainSkill=0x0000 # C
OP_Animation=0x0000 # Was 0x0000
OP_Begging=0x0000 # C
OP_Consent=0x0000 # C
OP_ConsentDeny=0x0000 # C
OP_AutoFire=0x0000 # C
OP_PetCommands=0x0000 # C
OP_DeleteSpell=0x0000 # C
OP_Surname=0x0000 # C
OP_ClearSurname=0x0000 # C
OP_FaceChange=0x0000 # C
OP_SenseHeading=0x0000 # C
OP_Action=0x0000 # C
OP_ConsiderCorpse=0x0000 # C
OP_HideCorpse=0x0000 # C 0x0000
OP_Bug=0x0000 # C
OP_Feedback=0x0000 # C
OP_Report=0x0000 # C
OP_Damage=0x0000 # C or OP_Action2?
OP_ChannelMessage=0x2e79 # C
OP_Assist=0x0000 # C
OP_AssistGroup=0x0000 # C
OP_MoveCoin=0x0000 # C
OP_ZonePlayerToBind=0x0a59 # C
OP_KeyRing=0x0000 # C
OP_WhoAllRequest=0x0000 # C
OP_WhoAllResponse=0x0000 # C
OP_FriendsWho=0x0000 # C
OP_ConfirmDelete=0x0000 # V
OP_Logout=0x64ec # C
OP_Rewind=0x0000 # C
OP_TargetCommand=0x0000 # C Was 0x0000
OP_InspectRequest=0x0000 # C
OP_Hide=0x0000 # C
OP_Jump=0x0000 # C
OP_Camp=0x0000 # C
OP_Emote=0x0000 # C
OP_SetRunMode=0x0000 # C
OP_BankerChange=0x0000 # C
OP_TargetMouse=0x36f8 # C 0x0000
OP_MobHealth=0x0000 # C
OP_InitialMobHealth=0x0000 # C
OP_TargetHoTT=0x0000 # C
OP_TargetBuffs=0x0000 # C
OP_BuffCreate=0x0000 # V
OP_DeleteSpawn=0x7434 # C
OP_AutoAttack=0x0000 # C
OP_AutoAttack2=0x0000 # C
OP_Consume=0x0000 # V
OP_MoveItem=0x0000 # C
OP_DeleteItem=0x0000 # C
OP_DeleteCharge=0x0000 # C
OP_ItemPacket=0x032b # C
OP_ItemLinkResponse=0x0000 # C
OP_ItemLinkClick=0x0000 # C
OP_NewSpawn=0x0000 # C
OP_Track=0x0000 # C
OP_TrackTarget=0x0000 # C
OP_TrackUnknown=0x0000 # C
OP_ClickDoor=0x4f1f # C
OP_MoveDoor=0x1516 # C
OP_EnvDamage=0x0000 # C
OP_BoardBoat=0x0000 # C
OP_Forage=0x0000 # C
OP_LeaveBoat=0x0000 # C
OP_ControlBoat=0x0000 # C
OP_SafeFallSuccess=0x0000 # C
OP_RezzComplete=0x0000 # C
OP_RezzRequest=0x0000 # C
OP_RezzAnswer=0x0000 # C
OP_Shielding=0x0000 # C
OP_RequestDuel=0x0000 # C
OP_MobRename=0x0000 # C
OP_AugmentItem=0x0000 # C
OP_WeaponEquip1=0x0000 # C
OP_WeaponEquip2=0x0000 # C
OP_WeaponUnequip2=0x0000 # C
OP_ApplyPoison=0x0000 # C
OP_Save=0x0000 # C
OP_TestBuff=0x0000 # C
OP_CustomTitles=0x0000 # C
OP_Split=0x0000 # C
OP_YellForHelp=0x0000 # C
OP_LoadSpellSet=0x0000 # C
OP_Bandolier=0x0000 # C
OP_PotionBelt=0x0000 # C
OP_DuelResponse=0x0000 # C
OP_DuelResponse2=0x0000 # C
OP_SaveOnZoneReq=0x2913 # C
OP_ReadBook=0x0000 # C
OP_Dye=0x0000 # C
OP_InterruptCast=0x0000 # C
OP_AAAction=0x0000 # C
OP_LeadershipExpToggle=0x0000 # C
OP_LeadershipExpUpdate=0x0000 # C
OP_PurchaseLeadershipAA=0x0000 # C
OP_UpdateLeadershipAA=0x0000 # C
OP_MarkNPC=0x0000 # C
OP_ClearNPCMarks=0x0000 # C
OP_DoGroupLeadershipAbility=0x0000 # C
OP_GroupLeadershipAAUpdate=0x0000 # C
OP_DelegateAbility=0x0000 # C
OP_SetGroupTarget=0x0000 # C
OP_Charm=0x0000 # C
OP_Stun=0x0000 # C
OP_SendFindableNPCs=0x162d # C
OP_FindPersonRequest=0x0000 # C
OP_FindPersonReply=0x0000 # C
OP_Sound=0x0000 # C
OP_PetBuffWindow=0x0000 # C
OP_LevelAppearance=0x0000 # C
OP_Translocate=0x0000 # C
OP_Sacrifice=0x0000 # C
OP_PopupResponse=0x0000 # C
OP_OnLevelMessage=0x0000 # C
OP_AugmentInfo=0x0000 # C
OP_Petition=0x0000 # C
OP_SomeItemPacketMaybe=0x0000 # C
OP_PVPStats=0x0000 # C
OP_PVPLeaderBoardRequest=0x0000 # C
OP_PVPLeaderBoardReply=0x0000 # C
OP_PVPLeaderBoardDetailsRequest=0x0000 # C
OP_PVPLeaderBoardDetailsReply=0x0000 # C
OP_RestState=0x0000 # C
OP_RespawnWindow=0x4e4e # C
OP_DisciplineTimer=0x0000 # C
OP_LDoNButton=0x0000 # C
OP_SetStartCity=0x0000 # C
OP_VoiceMacroIn=0x0000 # C
OP_VoiceMacroOut=0x0000 # C
OP_ItemViewUnknown=0x0000 # C
OP_VetRewardsAvaliable=0x0000 # C Mispelled?
OP_VetClaimRequest=0x0000 # C
OP_VetClaimReply=0x0000 # C
OP_CrystalCountUpdate=0x0000 # C
OP_DisciplineUpdate=0x0000 #
OP_BecomeCorpse=0x0000 #
OP_Action2=0x0000 # C OP_Damage?
OP_MobUpdate=0x4656 # Same as OP_SpawnPositionUpdate
OP_NPCMoveUpdate=0x7adb #
OP_CameraEffect=0x0000 # V
OP_SpellEffect=0x0000 # V
OP_DzQuit=0x0000
OP_DzListTimers=0x0000
OP_DzAddPlayer=0x0000
OP_DzRemovePlayer=0x0000
OP_DzSwapPlayer=0x0000
OP_DzMakeLeader=0x0000
OP_DzPlayerList=0x0000
OP_DzJoinExpeditionConfirm=0x0000
OP_DzJoinExpeditionReply=0x0000
OP_DzExpeditionInfo=0x0000
OP_DzMemberStatus=0x0000
OP_DzLeaderStatus=0x0000
OP_DzExpeditionEndsWarning=0x0000
OP_DzExpeditionList=0x0000
OP_DzMemberList=0x0000
OP_DzCompass=0x0000
OP_DzChooseZone=0x0000
# New Opcodes
OP_SpawnPositionUpdate=0x0000 # C
OP_ManaUpdate=0x0000 # C
OP_EnduranceUpdate=0x0000 # C
OP_MobManaUpdate=0x0000 # C
OP_MobEnduranceUpdate=0x0000 # C
# Looting
OP_LootRequest=0x0000 # C
OP_EndLootRequest=0x0000 # C
OP_LootItem=0x0000 # C
OP_LootComplete=0x0000 # C
# bazaar trader stuff stuff:
OP_BazaarSearch=0x0000 # C
OP_TraderDelItem=0x0000 # C
OP_BecomeTrader=0x0000 # C
OP_TraderShop=0x0000 # C
OP_Trader=0x0000 # C
OP_TraderBuy=0x0000 # C
OP_Barter=0x0000 # C
OP_ShopItem=0x0000 #
OP_BazaarInspect=0x0000 #
OP_Bazaar=0x0000 #
OP_TraderItemUpdate=0x0000 #
# pc/npc trading
OP_TradeRequest=0x0000 # C
OP_TradeAcceptClick=0x0000 # C
OP_TradeRequestAck=0x0000 # C
OP_TradeCoins=0x0000 # C
OP_FinishTrade=0x0000 # C
OP_CancelTrade=0x0000 # C
OP_TradeMoneyUpdate=0x0000 # C
OP_MoneyUpdate=0x0000 # C
OP_TradeBusy=0x0000 # C
# Sent after canceling trade or after closing tradeskill object
OP_FinishWindow=0x0000 # C
OP_FinishWindow2=0x0000 # C
# Sent on Live for what seems to be item existance verification
# Ex. Before Right Click Effect happens from items
OP_ItemVerifyRequest=0x0000 # C
OP_ItemVerifyReply=0x0000 # C
# merchant crap
OP_ShopPlayerSell=0x0000 # C
OP_ShopRequest=0x1044 # C
OP_ShopEnd=0x3753 # C
OP_ShopEndConfirm=0x0000 # C
OP_ShopPlayerBuy=0x0000 # C
OP_ShopDelItem=0x0000 # C
# tradeskill stuff:
OP_ClickObject=0x0000 # V
OP_ClickObjectAction=0x0000 # V
OP_ClearObject=0x0000 # C
OP_RecipeDetails=0x0000 # C
OP_RecipesFavorite=0x0000 # C
OP_RecipesSearch=0x0000 # C
OP_RecipeReply=0x0000 # C
OP_RecipeAutoCombine=0x0000 # C
OP_TradeSkillCombine=0x0000 # C
# Tribute Packets:
OP_OpenGuildTributeMaster=0x0000 # C
OP_OpenTributeMaster=0x0000 # C
OP_SelectTribute=0x0000 # C
OP_TributeItem=0x0000 # C
OP_TributeMoney=0x0000 # C
OP_TributeToggle=0x0000 # C
OP_TributePointUpdate=0x0000 # C
OP_TributeNPC=0x0000 #
OP_GuildTributeInfo=0x0000 #
OP_OpenTributeReply=0x0000 #
# OP_GuildTributeStatus=0x0000 #
# Adventure packets:
OP_LeaveAdventure=0x0000 # C
OP_AdventureFinish=0x0000 # C
OP_AdventureInfoRequest=0x0000 # C
OP_AdventureInfo=0x0000 # C
OP_AdventureRequest=0x0000 # C
OP_AdventureDetails=0x0000 # C
OP_AdventureData=0x0000 # C
OP_AdventureUpdate=0x0000 # C
OP_AdventureMerchantRequest=0x0000 # C
OP_AdventureMerchantResponse=0x0000 # C
OP_AdventureMerchantPurchase=0x0000 # C
OP_AdventureMerchantSell=0x0000 # C
OP_AdventurePointsUpdate=0x0000 # C
OP_AdventureStatsRequest=0x0000 # C
OP_AdventureStatsReply=0x0000 # C
OP_AdventureLeaderboardRequest=0x0000 # C
OP_AdventureLeaderboardReply=0x0000 # C
# Group Opcodes
OP_GroupDisband=0x0000 # C
OP_GroupInvite=0x0000 # C
OP_GroupFollow=0x0000 # C
OP_GroupUpdate=0x0000 # C
OP_GroupUpdateB=0x0000 # C
OP_GroupCancelInvite=0x0000 # C - Same as OP_CancelInvite?
OP_GroupAcknowledge=0x0000 # C
OP_GroupDelete=0x0000 #
OP_CancelInvite=0x0000 # C
OP_GroupFollow2=0x0000 # C
OP_GroupInvite2=0x0000 # C
OP_GroupDisbandYou=0x0000 # C
OP_GroupDisbandOther=0x0000 # C
OP_GroupLeaderChange=0x0000 # C
OP_GroupRoles=0x0000 # C
# LFG/LFP Opcodes
OP_LFGCommand=0x0000 # C
OP_LFGGetMatchesRequest=0x0000 # C
OP_LFGGetMatchesResponse=0x0000 # C
OP_LFPGetMatchesRequest=0x0000 # C
OP_LFPGetMatchesResponse=0x0000 # C
OP_LFPCommand=0x0000 # C
OP_LFGAppearance=0x0000 #
OP_LFGResponse=0x0000 #
# Raid Opcodes
OP_RaidInvite=0x0000 # C
OP_RaidUpdate=0x0000 # C
OP_RaidJoin=0x0000 #
# Button-push commands
OP_Taunt=0x0000 # C
OP_CombatAbility=0x0000 # C
OP_SenseTraps=0x0000 # C
OP_PickPocket=0x0000 # C
OP_DisarmTraps=0x0000 #
OP_Disarm=0x0000 # C
OP_Sneak=0x0000 # C
OP_Fishing=0x0000 # C
OP_InstillDoubt=0x0000 # C
OP_FeignDeath=0x0000 # C
OP_Mend=0x0000 # C
OP_LDoNOpen=0x0000 # C
# Task packets
OP_TaskActivityComplete=0x0000 # C
OP_TaskMemberList=0x0000 # C
OP_OpenNewTasksWindow=0x0000 # C
OP_AvaliableTask=0x0000 # C Mispelled?
OP_AcceptNewTask=0x0000 # C
OP_TaskHistoryRequest=0x0000 # C
OP_TaskHistoryReply=0x0000 # C
OP_CancelTask=0x0000 # C
OP_DeclineAllTasks=0x0000 #
# Title opcodes
OP_NewTitlesAvailable=0x0000 # C
OP_RequestTitles=0x0000 # C
OP_SendTitleList=0x0000 # C
OP_SetTitle=0x0000 # C
OP_SetTitleReply=0x0000 # C
# mail opcodes
OP_Command=0x0000 #
OP_MailboxHeader=0x0000 #
OP_MailHeader=0x0000 #
OP_MailBody=0x0000 #
OP_NewMail=0x0000 #
OP_SentConfirm=0x0000 #
# # # # # # # # # # # Below this point should not be needed # # # # # # # # # # #
# This section are all unknown in Titanium
OP_ForceFindPerson=0x0000 #
OP_LocInfo=0x0000 #
OP_ReloadUI=0x0000 #
OP_ItemName=0x0000 #
OP_ItemLinkText=0x0000 #
OP_MultiLineMsg=0x0000 #
OP_MendHPUpdate=0x0000 #
OP_TargetReject=0x0000 #
OP_SafePoint=0x0000 #
OP_IncreaseStats=0x0000 #
OP_ApproveZone=0x0000 #
OP_ZoneComplete=0x0000 #
OP_ClientError=0x0000 #
OP_DumpName=0x0000 #
OP_Heartbeat=0x0000 #
OP_CrashDump=0x0000 #
OP_LoginComplete=0x0000 #
# discovered opcodes not yet used:
OP_PickLockSuccess=0x0000 #
OP_PlayMP3=0x0000 #
OP_ReclaimCrystals=0x0000 #
OP_DynamicWall=0x0000 #
OP_OpenDiscordMerchant=0x0000 #
OP_DiscordMerchantInventory=0x0000 #
OP_GiveMoney=0x0000 #
OP_RequestKnowledgeBase=0x0000 #
OP_KnowledgeBase=0x0000 #
OP_SlashAdventure=0x0000 # /adventure
OP_BecomePVPPrompt=0x0000 #
OP_MoveLogRequest=0x0000 # gone I think
OP_MoveLogDisregard=0x0000 # gone I think
# named unknowns, to make looking for real unknown easier
OP_AnnoyingZoneUnknown=0x0000 #
OP_Some6ByteHPUpdate=0x0000 # seems to happen when you target group members
OP_QueryResponseThing=0x0000 #
# realityincarnate: these are just here to stop annoying several thousand byte packet dumps
#OP_LoginUnknown1=0x0000 # U OP_SendSpellChecksum
#OP_LoginUnknown2=0x0000 # U OP_SendSkillCapsChecksum
# Petition Opcodes
OP_PetitionSearch=0x0000 # search term for petition
OP_PetitionSearchResults=0x0000 # (list of?) matches from search
OP_PetitionSearchText=0x0000 # text results of search
OP_PetitionUpdate=0x0000 #
OP_PetitionCheckout=0x0000 #
OP_PetitionCheckIn=0x0000 #
OP_PetitionQue=0x0000 #
OP_PetitionUnCheckout=0x0000 #
OP_PetitionDelete=0x0000 #
OP_DeletePetition=0x0000 #
OP_PetitionResolve=0x0000 #
OP_PDeletePetition=0x0000 #
OP_PetitionBug=0x0000 #
OP_PetitionRefresh=0x0000 #
OP_PetitionCheckout2=0x0000 #
OP_PetitionViewPetition=0x0000 #
# Login opcodes
OP_SessionReady=0x0000 #
OP_Login=0x0000 #
OP_ServerListRequest=0x0000 #
OP_PlayEverquestRequest=0x0000 #
OP_PlayEverquestResponse=0x0000 #
OP_ChatMessage=0x0000 #
OP_LoginAccepted=0x0000 #
OP_ServerListResponse=0x0000 #
OP_Poll=0x0000 #
OP_EnterChat=0x0000 #
OP_PollResponse=0x0000 #
# raw opcodes
OP_RAWSessionRequest=0x0000 #
OP_RAWSessionResponse=0x0000 #
OP_RAWCombined=0x0000 #
OP_RAWSessionDisconnect=0x0000 #
OP_RAWKeepAlive=0x0000 #
OP_RAWSessionStatRequest=0x0000 #
OP_RAWSessionStatResponse=0x0000 #
OP_RAWPacket=0x0000 #
OP_RAWFragment=0x0000 #
OP_RAWOutOfOrderAck=0x0000 #
OP_RAWAck=0x0000 #
OP_RAWAppCombined=0x0000 #
OP_RAWOutOfSession=0x0000 #
# we need to document the differences between these packets to make identifying them easier
OP_Some3ByteHPUpdate=0x0000 # initial HP update for mobs
OP_InitialHPUpdate=0x0000 #
@@ -0,0 +1,612 @@
# ShowEQ Import Notes:
# ZERO THE FILE first
# perl -pi -e 's/0x0000a-fA-F]{4}/0x0000/g' opcodes.conf
# Unknown Mapping:
# OP_Action2 -> OP_Damage
# OP_EnvDamage -> OP_Damage ---> might have been a one time mistake
# Name Differences:
# OP_CancelInvite -> OP_GroupCancelInvite
# OP_GMFind -> OP_FindPersonRequest
# OP_CommonMessage -> OP_ChannelMessage
OP_Unknown=0x0000
OP_ExploreUnknown=0x0000 # used for unknown explorer
# V = Verified correct
# C = Most likely correct
# U = Unsure, but should be correct or close
# world packets
# Required to reach Char Select:
OP_SendLoginInfo=0x6893 # was 0x2683
OP_ApproveWorld=0x115a # was 0x28a7
OP_LogServer=0x701f # was 0x224f
OP_SendCharInfo=0x1b85 # was 0x2c27
OP_ExpansionInfo=0x1771 # Same
OP_GuildsList=0x5b0b # Same
OP_EnterWorld=0x3288 # was 0x4f60
OP_PostEnterWorld=0x2f2c # was 0x570c
OP_World_Client_CRC1=0x0000 # C
OP_World_Client_CRC2=0x0000 # C
OP_SendSpellChecksum=0x0000 # C
OP_SendSkillCapsChecksum=0x0000 # C
# Character Select Related:
OP_DeleteCharacter=0x0000 # C
OP_CharacterCreateRequest=0x0000 # C
OP_CharacterCreate=0x0000 # C
OP_RandomNameGenerator=0x0000 # C 0x0000
OP_ApproveName=0x0000 # C
OP_MOTD=0x7312 # C 0x0000
OP_SetChatServer=0x37db # was 0x1ce3
OP_SetChatServer2=0x0000 # C 0x0000
OP_ZoneServerInfo=0x0479 # was 0x03cc
OP_WorldComplete=0x72f3 # was 0x1524
OP_WorldUnknown001=0x0000 # C 0x0000
OP_FloatListThing=0x0000 # V
# Reasons for Disconnect:
OP_ZoneUnavail=0x0000 # C 0x0000
OP_WorldClientReady=0x399b # C 0x0000
OP_CharacterStillInZone=0x0000 #
OP_WorldChecksumFailure=0x0000 #
OP_WorldLoginFailed=0x0000 #
OP_WorldLogout=0x0000 #
OP_WorldLevelTooHigh=0x0000 #
OP_CharInacessable=0x0000 #
OP_UserCompInfo=0x0000 #
# OP_SendExeChecksum=0x0000 #
# OP_SendBaseDataChecksum=0x0000 #
# Zone in opcodes
OP_AckPacket=0x3594 # was 0x3594
OP_ZoneEntry=0x002b # was 0x538f
OP_ReqNewZone=0x5ca5 # was 0x5ca5
OP_NewZone=0x0254 # was 0x0254
OP_ZoneSpawns=0x0000 # ?
OP_PlayerProfile=0x6022 # was 0x6022
OP_TimeOfDay=0x6015 # was 0x6015
OP_LevelUpdate=0x0000 # V
OP_Stamina=0x0000 # V
OP_RequestClientZoneChange=0x3fd2 # was 0x4178
OP_ZoneChange=0x0b93 # was 0x4a61
OP_LockoutTimerInfo=0x0000 #
OP_ZoneServerReady=0x0000 #
OP_ZoneInUnknown=0x0000 #
OP_LogoutReply=0x0000 #
OP_PreLogoutReply=0x0000 #
# Required to fully log in
OP_SpawnAppearance=0x7b64 # V
OP_TributeUpdate=0x0c98
OP_TributeTimer=0x0000 # C
OP_TaskDescription=0x0000 # C
OP_TaskActivity=0x0000 # C
OP_CompletedTasks=0x0000 # C 0x0000
OP_Weather=0x7ce4 # was 0x0ed5
OP_SendAATable=0x1bd4 # was 0x6dc3
OP_UpdateAA=0x0000 # V
OP_RespondAA=0x0000 # C 0x0000
OP_ReqClientSpawn=0x54e8 # was 0x6618
OP_SpawnDoor=0x465e # was 0x47ae Need an Encode
OP_GroundSpawn=0x5f0d # was 0x5f0d
OP_SendZonepoints=0x5f51 # was 0x0ff4
OP_SendAAStats=0x0000 # C
OP_WorldObjectsSent=0x7b73 # was 0x7b73
OP_BlockedBuffs=0x664a # was 0x4027
OP_SendExpZonein=0x2c27 # was 0x1436
OP_SendTributes=0x0000 # V
OP_TributeInfo=0x0000 # V
OP_SendGuildTributes=0x0000 # C 0x0000
OP_AAExpUpdate=0x0000 # V
OP_ExpUpdate=0x0000 # V
OP_HPUpdate=0x0000 # V
OP_ManaChange=0x0000 # C
OP_TGB=0x0000 # C
OP_SpecialMesg=0x3bf5 # was 0x14ff
OP_GuildMemberList=0x0000 # C
OP_GuildMOTD=0x0000 # V
OP_CharInventory=0x5dbc # was 0x79e0
OP_WearChange=0x0000 # V
OP_ClientUpdate=0x7062 # was 0x7062
OP_ClientReady=0x6cdc # was 0x6cdc
OP_SetServerFilter=0x0000 # V
# Guild Opcodes
OP_GetGuildMOTD=0x0000 # C
OP_GetGuildMOTDReply=0x0000 # C
OP_GuildMemberUpdate=0x0000 # C
OP_GuildInvite=0x0000 # C
OP_GuildRemove=0x0000 # C
OP_GuildPeace=0x0000 # C
OP_SetGuildMOTD=0x0000 # C
OP_GuildList=0x0000 # C
OP_GuildWar=0x0000 # C
OP_GuildLeader=0x0000 # C
OP_GuildDelete=0x0000 # C
OP_GuildInviteAccept=0x0000 # C
OP_GuildDemote=0x0000 # C
OP_GuildPublicNote=0x0000 # C
OP_GuildManageBanker=0x0000 # C
OP_GuildBank=0x0000 # C
OP_SetGuildRank=0x0000 # C
OP_GuildUpdateURLAndChannel=0x0000 # C
OP_GuildMemberLevelUpdate=0x0000 #
OP_ZoneGuildList=0x0000 #
OP_GetGuildsList=0x0000 #
# OP_GuildManageRemove=0x0000 #
# OP_GuildManageAdd=0x0000 #
# OP_GuildManageStatus=0x0000 #
# GM/guide opcodes
OP_GMServers=0x0000 # C
OP_GMBecomeNPC=0x0000 # C
OP_GMZoneRequest=0x6f79 # was 0x18ea
OP_GMZoneRequest2=0x02d6 # was 0x3ad9
OP_GMGoto=0x0000 # C
OP_GMSearchCorpse=0x0000 # C
OP_GMHideMe=0x0000 # C
OP_GMDelCorpse=0x0000 # C
OP_GMApproval=0x0000 # C
OP_GMToggle=0x0000 # C 0x0000
OP_GMSummon=0x0000 # C
OP_GMEmoteZone=0x0000 # C
OP_GMEmoteWorld=0x0000 # C
OP_GMFind=0x0000 # C
OP_GMKick=0x0000 # C
OP_GMKill=0x0000 # C
OP_GMNameChange=0x0000 # C
OP_GMLastName=0x0000 # C
OP_InspectAnswer=0x0000 # C
OP_BeginCast=0x0000 # C
OP_BuffFadeMsg=0x0000 # C
OP_ConsentResponse=0x0000 # C
OP_MemorizeSpell=0x0000 # C
OP_SwapSpell=0x0000 # C
OP_CastSpell=0x0000 # C
OP_Consider=0x0000 # C
OP_FormattedMessage=0x0000 # C
OP_SimpleMessage=0x0000 # C 0x0000
OP_Buff=0x0000 # C
OP_Illusion=0x0000 # C
OP_MoneyOnCorpse=0x0000 # C
OP_RandomReply=0x0000 # C
OP_DenyResponse=0x0000 # C
OP_SkillUpdate=0x0000 # C
OP_GMTrainSkillConfirm=0x0000 # C
OP_RandomReq=0x0000 # C
OP_Death=0x0000 # C
OP_Bind_Wound=0x0000 # C
OP_GMTraining=0x0000 # C
OP_GMEndTraining=0x0000 # C
OP_GMTrainSkill=0x0000 # C
OP_Animation=0x0000 # Was 0x0000
OP_Begging=0x0000 # C
OP_Consent=0x0000 # C
OP_ConsentDeny=0x0000 # C
OP_AutoFire=0x0000 # C
OP_PetCommands=0x0000 # C
OP_DeleteSpell=0x0000 # C
OP_Surname=0x0000 # C
OP_ClearSurname=0x0000 # C
OP_FaceChange=0x0000 # C
OP_SenseHeading=0x0000 # C
OP_Action=0x0000 # C
OP_ConsiderCorpse=0x0000 # C
OP_HideCorpse=0x0000 # C 0x0000
OP_Bug=0x0000 # C
OP_Feedback=0x0000 # C
OP_Report=0x0000 # C
OP_Damage=0x0000 # C or OP_Action2?
OP_ChannelMessage=0x2e79 # was 0x2e79
OP_Assist=0x0000 # C
OP_AssistGroup=0x0000 # C
OP_MoveCoin=0x0000 # C
OP_ZonePlayerToBind=0x0000 # C
OP_KeyRing=0x0000 # C
OP_WhoAllRequest=0x0000 # C
OP_WhoAllResponse=0x0000 # C
OP_FriendsWho=0x0000 # C
OP_ConfirmDelete=0x0000 # V
OP_Logout=0x44ae # was 0x64ec
OP_Rewind=0x0000 # C
OP_TargetCommand=0x0000 # C Was 0x0000
OP_InspectRequest=0x0000 # C
OP_Hide=0x0000 # C
OP_Jump=0x0000 # C
OP_Camp=0x42ef # C
OP_Emote=0x0000 # C
OP_SetRunMode=0x0000 # C
OP_BankerChange=0x0000 # C
OP_TargetMouse=0x36f8 # C 0x0000
OP_MobHealth=0x0000 # C
OP_InitialMobHealth=0x0000 # C
OP_TargetHoTT=0x0000 # C
OP_TargetBuffs=0x0000 # C
OP_BuffCreate=0x0000 # V
OP_DeleteSpawn=0x7434 # was 0x7434
OP_AutoAttack=0x0000 # C
OP_AutoAttack2=0x0000 # C
OP_Consume=0x0000 # V
OP_MoveItem=0x0000 # C
OP_DeleteItem=0x0000 # C
OP_DeleteCharge=0x0000 # C
OP_ItemPacket=0x6a30 # was 0x032b
OP_ItemLinkResponse=0x0000 # C
OP_ItemLinkClick=0x0000 # C
OP_NewSpawn=0x0000 # C
OP_Track=0x0000 # C
OP_TrackTarget=0x0000 # C
OP_TrackUnknown=0x0000 # C
OP_ClickDoor=0x470e # was 0x4f1f
OP_MoveDoor=0x48f9 # was 0x1516
OP_EnvDamage=0x0000 # C
OP_BoardBoat=0x0000 # C
OP_Forage=0x0000 # C
OP_LeaveBoat=0x0000 # C
OP_ControlBoat=0x0000 # C
OP_SafeFallSuccess=0x0000 # C
OP_RezzComplete=0x0000 # C
OP_RezzRequest=0x0000 # C
OP_RezzAnswer=0x0000 # C
OP_Shielding=0x0000 # C
OP_RequestDuel=0x0000 # C
OP_MobRename=0x0000 # C
OP_AugmentItem=0x0000 # C
OP_WeaponEquip1=0x0000 # C
OP_WeaponEquip2=0x0000 # C
OP_WeaponUnequip2=0x0000 # C
OP_ApplyPoison=0x0000 # C
OP_Save=0x0000 # C
OP_TestBuff=0x0000 # C
OP_CustomTitles=0x0000 # C
OP_Split=0x0000 # C
OP_YellForHelp=0x0000 # C
OP_LoadSpellSet=0x0000 # C
OP_Bandolier=0x0000 # C
OP_PotionBelt=0x0000 # C
OP_DuelResponse=0x0000 # C
OP_DuelResponse2=0x0000 # C
OP_SaveOnZoneReq=0x2913 # was 0x2913
OP_ReadBook=0x0000 # C
OP_Dye=0x0000 # C
OP_InterruptCast=0x0000 # C
OP_AAAction=0x0000 # C
OP_LeadershipExpToggle=0x0000 # C
OP_LeadershipExpUpdate=0x0000 # C
OP_PurchaseLeadershipAA=0x0000 # C
OP_UpdateLeadershipAA=0x0000 # C
OP_MarkNPC=0x0000 # C
OP_ClearNPCMarks=0x0000 # C
OP_DoGroupLeadershipAbility=0x0000 # C
OP_GroupLeadershipAAUpdate=0x0000 # C
OP_DelegateAbility=0x0000 # C
OP_SetGroupTarget=0x0000 # C
OP_Charm=0x0000 # C
OP_Stun=0x0000 # C
OP_SendFindableNPCs=0x6b67 # was 0x162d
OP_FindPersonRequest=0x0000 # C
OP_FindPersonReply=0x0000 # C
OP_Sound=0x0000 # C
OP_PetBuffWindow=0x0000 # C
OP_LevelAppearance=0x0000 # C
OP_Translocate=0x0000 # C
OP_Sacrifice=0x0000 # C
OP_PopupResponse=0x0000 # C
OP_OnLevelMessage=0x0000 # C
OP_AugmentInfo=0x0000 # C
OP_Petition=0x0000 # C
OP_SomeItemPacketMaybe=0x0000 # C
OP_PVPStats=0x0000 # C
OP_PVPLeaderBoardRequest=0x0000 # C
OP_PVPLeaderBoardReply=0x0000 # C
OP_PVPLeaderBoardDetailsRequest=0x0000 # C
OP_PVPLeaderBoardDetailsReply=0x0000 # C
OP_RestState=0x0000 # C
OP_RespawnWindow=0x0000 # C
OP_DisciplineTimer=0x0000 # C
OP_LDoNButton=0x0000 # C
OP_SetStartCity=0x0000 # C
OP_VoiceMacroIn=0x0000 # C
OP_VoiceMacroOut=0x0000 # C
OP_ItemViewUnknown=0x0000 # C
OP_VetRewardsAvaliable=0x0000 # C Mispelled?
OP_VetClaimRequest=0x0000 # C
OP_VetClaimReply=0x0000 # C
OP_CrystalCountUpdate=0x0000 # C
OP_DisciplineUpdate=0x0000 #
OP_BecomeCorpse=0x0000 #
OP_Action2=0x0000 # C OP_Damage?
OP_MobUpdate=0x4656 # was 0x4656
OP_NPCMoveUpdate=0x38f9 # was 0x7adb
OP_CameraEffect=0x0000 # V
OP_SpellEffect=0x0000 # V
OP_DzQuit=0x0000
OP_DzListTimers=0x0000
OP_DzAddPlayer=0x0000
OP_DzRemovePlayer=0x0000
OP_DzSwapPlayer=0x0000
OP_DzMakeLeader=0x0000
OP_DzPlayerList=0x0000
OP_DzJoinExpeditionConfirm=0x0000
OP_DzJoinExpeditionReply=0x0000
OP_DzExpeditionInfo=0x0000
OP_DzMemberStatus=0x0000
OP_DzLeaderStatus=0x0000
OP_DzExpeditionEndsWarning=0x0000
OP_DzExpeditionList=0x0000
OP_DzMemberList=0x0000
OP_DzCompass=0x0000
OP_DzChooseZone=0x0000
# New Opcodes
OP_SpawnPositionUpdate=0x0000 # C
OP_ManaUpdate=0x0000 # C
OP_EnduranceUpdate=0x0000 # C
OP_MobManaUpdate=0x0000 # C
OP_MobEnduranceUpdate=0x0000 # C
# Looting
OP_LootRequest=0x0000 # C
OP_EndLootRequest=0x0000 # C
OP_LootItem=0x0000 # C
OP_LootComplete=0x0000 # C
# bazaar trader stuff stuff:
OP_BazaarSearch=0x0000 # C
OP_TraderDelItem=0x0000 # C
OP_BecomeTrader=0x0000 # C
OP_TraderShop=0x0000 # C
OP_Trader=0x0000 # C
OP_TraderBuy=0x0000 # C
OP_Barter=0x0000 # C
OP_ShopItem=0x0000 #
OP_BazaarInspect=0x0000 #
OP_Bazaar=0x0000 #
OP_TraderItemUpdate=0x0000 #
# pc/npc trading
OP_TradeRequest=0x0000 # C
OP_TradeAcceptClick=0x0000 # C
OP_TradeRequestAck=0x0000 # C
OP_TradeCoins=0x0000 # C
OP_FinishTrade=0x0000 # C
OP_CancelTrade=0x0000 # C
OP_TradeMoneyUpdate=0x0000 # C
OP_MoneyUpdate=0x0000 # C
OP_TradeBusy=0x0000 # C
# Sent after canceling trade or after closing tradeskill object
OP_FinishWindow=0x0000 # C
OP_FinishWindow2=0x0000 # C
# Sent on Live for what seems to be item existance verification
# Ex. Before Right Click Effect happens from items
OP_ItemVerifyRequest=0x0000 # C
OP_ItemVerifyReply=0x0000 # C
# merchant crap
OP_ShopPlayerSell=0x0000 # C
OP_ShopRequest=0x1044 # was 0x1044
OP_ShopEnd=0x3753 # was 0x3753
OP_ShopEndConfirm=0x0000 # C
OP_ShopPlayerBuy=0x0000 # C
OP_ShopDelItem=0x0000 # C
OP_MercenaryPurchaseWindow=0x239d
# tradeskill stuff:
OP_ClickObject=0x0000 # V
OP_ClickObjectAction=0x0000 # V
OP_ClearObject=0x0000 # C
OP_RecipeDetails=0x0000 # C
OP_RecipesFavorite=0x0000 # C
OP_RecipesSearch=0x0000 # C
OP_RecipeReply=0x0000 # C
OP_RecipeAutoCombine=0x0000 # C
OP_TradeSkillCombine=0x0000 # C
# Tribute Packets:
OP_OpenGuildTributeMaster=0x0000 # C
OP_OpenTributeMaster=0x0000 # C
OP_SelectTribute=0x0000 # C
OP_TributeItem=0x0000 # C
OP_TributeMoney=0x0000 # C
OP_TributeToggle=0x0000 # C
OP_TributePointUpdate=0x0000 # C
OP_TributeNPC=0x0000 #
OP_GuildTributeInfo=0x0000 #
OP_OpenTributeReply=0x0000 #
# OP_GuildTributeStatus=0x0000 #
# Adventure packets:
OP_LeaveAdventure=0x0000 # C
OP_AdventureFinish=0x0000 # C
OP_AdventureInfoRequest=0x0000 # C
OP_AdventureInfo=0x0000 # C
OP_AdventureRequest=0x0000 # C
OP_AdventureDetails=0x0000 # C
OP_AdventureData=0x0000 # C
OP_AdventureUpdate=0x0000 # C
OP_AdventureMerchantRequest=0x0000 # C
OP_AdventureMerchantResponse=0x0000 # C
OP_AdventureMerchantPurchase=0x0000 # C
OP_AdventureMerchantSell=0x0000 # C
OP_AdventurePointsUpdate=0x0000 # C
OP_AdventureStatsRequest=0x0000 # C
OP_AdventureStatsReply=0x0000 # C
OP_AdventureLeaderboardRequest=0x0000 # C
OP_AdventureLeaderboardReply=0x0000 # C
# Group Opcodes
OP_GroupDisband=0x0000 # C
OP_GroupInvite=0x0000 # C
OP_GroupFollow=0x0000 # C
OP_GroupUpdate=0x0000 # C
OP_GroupUpdateB=0x0000 # C
OP_GroupCancelInvite=0x0000 # C - Same as OP_CancelInvite?
OP_GroupAcknowledge=0x0000 # C
OP_GroupDelete=0x0000 #
OP_CancelInvite=0x0000 # C
OP_GroupFollow2=0x0000 # C
OP_GroupInvite2=0x0000 # C
OP_GroupDisbandYou=0x0000 # C
OP_GroupDisbandOther=0x0000 # C
OP_GroupLeaderChange=0x0000 # C
OP_GroupRoles=0x0000 # C
# LFG/LFP Opcodes
OP_LFGCommand=0x0000 # C
OP_LFGGetMatchesRequest=0x0000 # C
OP_LFGGetMatchesResponse=0x0000 # C
OP_LFPGetMatchesRequest=0x0000 # C
OP_LFPGetMatchesResponse=0x0000 # C
OP_LFPCommand=0x0000 # C
OP_LFGAppearance=0x0000 #
OP_LFGResponse=0x0000 #
# Raid Opcodes
OP_RaidInvite=0x0000 # C
OP_RaidUpdate=0x0000 # C
OP_RaidJoin=0x0000 #
# Button-push commands
OP_Taunt=0x0000 # C
OP_CombatAbility=0x0000 # C
OP_SenseTraps=0x0000 # C
OP_PickPocket=0x0000 # C
OP_DisarmTraps=0x0000 #
OP_Disarm=0x0000 # C
OP_Sneak=0x0000 # C
OP_Fishing=0x0000 # C
OP_InstillDoubt=0x0000 # C
OP_FeignDeath=0x0000 # C
OP_Mend=0x0000 # C
OP_LDoNOpen=0x0000 # C
# Task packets
OP_TaskActivityComplete=0x0000 # C
OP_TaskMemberList=0x0000 # C
OP_OpenNewTasksWindow=0x0000 # C
OP_AvaliableTask=0x0000 # C Mispelled?
OP_AcceptNewTask=0x0000 # C
OP_TaskHistoryRequest=0x0000 # C
OP_TaskHistoryReply=0x0000 # C
OP_CancelTask=0x0000 # C
OP_DeclineAllTasks=0x0000 #
# Title opcodes
OP_NewTitlesAvailable=0x0000 # C
OP_RequestTitles=0x0000 # C
OP_SendTitleList=0x0000 # C
OP_SetTitle=0x0000 # C
OP_SetTitleReply=0x0000 # C
# mail opcodes
OP_Command=0x0000 #
OP_MailboxHeader=0x0000 #
OP_MailHeader=0x0000 #
OP_MailBody=0x0000 #
OP_NewMail=0x0000 #
OP_SentConfirm=0x0000 #
# # # # # # # # # # # Below this point should not be needed # # # # # # # # # # #
# This section are all unknown in Titanium
OP_ForceFindPerson=0x0000 #
OP_LocInfo=0x0000 #
OP_ReloadUI=0x0000 #
OP_ItemName=0x0000 #
OP_ItemLinkText=0x0000 #
OP_MultiLineMsg=0x0000 #
OP_MendHPUpdate=0x0000 #
OP_TargetReject=0x0000 #
OP_SafePoint=0x0000 #
OP_IncreaseStats=0x0000 #
OP_ApproveZone=0x0000 #
OP_ZoneComplete=0x0000 #
OP_ClientError=0x0000 #
OP_DumpName=0x0000 #
OP_Heartbeat=0x0000 #
OP_CrashDump=0x0000 #
OP_LoginComplete=0x0000 #
# discovered opcodes not yet used:
OP_PickLockSuccess=0x0000 #
OP_PlayMP3=0x0000 #
OP_ReclaimCrystals=0x0000 #
OP_DynamicWall=0x0000 #
OP_OpenDiscordMerchant=0x0000 #
OP_DiscordMerchantInventory=0x0000 #
OP_GiveMoney=0x0000 #
OP_RequestKnowledgeBase=0x0000 #
OP_KnowledgeBase=0x0000 #
OP_SlashAdventure=0x0000 # /adventure
OP_BecomePVPPrompt=0x0000 #
OP_MoveLogRequest=0x0000 # gone I think
OP_MoveLogDisregard=0x0000 # gone I think
# named unknowns, to make looking for real unknown easier
OP_AnnoyingZoneUnknown=0x0000 #
OP_Some6ByteHPUpdate=0x0000 # seems to happen when you target group members
OP_QueryResponseThing=0x0000 #
# realityincarnate: these are just here to stop annoying several thousand byte packet dumps
#OP_LoginUnknown1=0x0000 # U OP_SendSpellChecksum
#OP_LoginUnknown2=0x0000 # U OP_SendSkillCapsChecksum
# Petition Opcodes
OP_PetitionSearch=0x0000 # search term for petition
OP_PetitionSearchResults=0x0000 # (list of?) matches from search
OP_PetitionSearchText=0x0000 # text results of search
OP_PetitionUpdate=0x0000 #
OP_PetitionCheckout=0x0000 #
OP_PetitionCheckIn=0x0000 #
OP_PetitionQue=0x0000 #
OP_PetitionUnCheckout=0x0000 #
OP_PetitionDelete=0x0000 #
OP_DeletePetition=0x0000 #
OP_PetitionResolve=0x0000 #
OP_PDeletePetition=0x0000 #
OP_PetitionBug=0x0000 #
OP_PetitionRefresh=0x0000 #
OP_PetitionCheckout2=0x0000 #
OP_PetitionViewPetition=0x0000 #
# Login opcodes
OP_SessionReady=0x0000 #
OP_Login=0x0000 #
OP_ServerListRequest=0x0000 #
OP_PlayEverquestRequest=0x0000 #
OP_PlayEverquestResponse=0x0000 #
OP_ChatMessage=0x0000 #
OP_LoginAccepted=0x0000 #
OP_ServerListResponse=0x0000 #
OP_Poll=0x0000 #
OP_EnterChat=0x0000 #
OP_PollResponse=0x0000 #
# raw opcodes
OP_RAWSessionRequest=0x0000 #
OP_RAWSessionResponse=0x0000 #
OP_RAWCombined=0x0000 #
OP_RAWSessionDisconnect=0x0000 #
OP_RAWKeepAlive=0x0000 #
OP_RAWSessionStatRequest=0x0000 #
OP_RAWSessionStatResponse=0x0000 #
OP_RAWPacket=0x0000 #
OP_RAWFragment=0x0000 #
OP_RAWOutOfOrderAck=0x0000 #
OP_RAWAck=0x0000 #
OP_RAWAppCombined=0x0000 #
OP_RAWOutOfSession=0x0000 #
# we need to document the differences between these packets to make identifying them easier
OP_Some3ByteHPUpdate=0x0000 # initial HP update for mobs
OP_InitialHPUpdate=0x0000 #
@@ -0,0 +1,609 @@
# ShowEQ Import Notes:
# ZERO THE FILE first
# perl -pi -e 's/0x[0-9a-fA-F]{4}/0x0000/g' opcodes.conf
# Unknown Mapping:
# OP_Action2 -> OP_Damage
# OP_EnvDamage -> OP_Damage ---> might have been a one time mistake
# Name Differences:
# OP_CancelInvite -> OP_GroupCancelInvite
# OP_GMFind -> OP_FindPersonRequest
# OP_CommonMessage -> OP_ChannelMessage
OP_Unknown=0x0000
OP_ExploreUnknown=0x0000 # used for unknown explorer
# V = Verified correct
# C = Most likely correct
# U = Unsure, but should be correct or close
# world packets
# Required to reach Char Select:
OP_SendLoginInfo=0x0ff4 # C
OP_ApproveWorld=0x701f # C
OP_LogServer=0x4762 # C
OP_SendCharInfo=0x0f14 # C
OP_ExpansionInfo=0x7519 # C
OP_GuildsList=0x5b0b # C
OP_EnterWorld=0x1c20 # C
OP_PostEnterWorld=0x7c94 # C
OP_World_Client_CRC1=0x0ca5 # C
OP_World_Client_CRC2=0x1cb3 # C
OP_SendSpellChecksum=0x5bad # C
OP_SendSkillCapsChecksum=0x5d24 # C
# Character Select Related:
OP_DeleteCharacter=0x0254 # C
OP_CharacterCreateRequest=0x4463 # C
OP_CharacterCreate=0x1513 # C
OP_RandomNameGenerator=0x3604 # C
OP_ApproveName=0x413f # C
OP_MOTD=0x192e # C
OP_SetChatServer=0x7f2b # C
OP_SetChatServer2=0x11f3 # C
OP_ZoneServerInfo=0x5da4 # C
OP_WorldComplete=0x37db # C
OP_WorldUnknown001=0x2c4c # C
OP_FloatListThing=0x10b5 # C
# Reasons for Disconnect:
OP_ZoneUnavail=0x7930 # C
OP_WorldClientReady=0x1a84 # C
OP_CharacterStillInZone=0x0000 #
OP_WorldChecksumFailure=0x0000 #
OP_WorldLoginFailed=0x0000 #
OP_WorldLogout=0x0000 #
OP_WorldLevelTooHigh=0x0000 #
OP_CharInacessable=0x0000 #
OP_UserCompInfo=0x0000 #
# OP_SendExeChecksum=0x0000 #
# OP_SendBaseDataChecksum=0x0000 #
# Zone in opcodes
OP_AckPacket=0x3594 # C
OP_ZoneEntry=0x5a6b # C
OP_ReqNewZone=0x43ac # C
OP_NewZone=0x5ca5 # C
OP_ZoneSpawns=0x72f8 # C
OP_PlayerProfile=0x6022 # C
OP_TimeOfDay=0x6015 # C
OP_LevelUpdate=0x6a99 # C
OP_Stamina=0x3e50 # C
OP_LockoutTimerInfo=0x0000 #
OP_ZoneServerReady=0x0000 #
OP_RequestClientZoneChange=0x4885 # C
OP_ZoneChange=0x051b # C
OP_ZoneInUnknown=0x0000 #
OP_LogoutReply=0x0000 #
OP_PreLogoutReply=0x0000 #
# Required to fully log in
OP_SpawnAppearance=0x10b7 # C
OP_TributeUpdate=0x399b # C
OP_TributeTimer=0x4423 # C
OP_TaskDescription=0x7b77 # C
OP_TaskActivity=0x0525 # C
OP_CompletedTasks=0x5412 # C
OP_Weather=0x2641 # C
OP_SendAATable=0x322f # C
OP_UpdateAA=0x466c # C
OP_RespondAA=0x0142 # C
OP_ReqClientSpawn=0x1436 # C
OP_SpawnDoor=0x102f # C
OP_GroundSpawn=0x33e5 # C
OP_SendZonepoints=0x5821 # C
OP_SendAAStats=0x57a3 # C
OP_WorldObjectsSent=0x7b73 # C
OP_BlockedBuffs=0x0baa # C
OP_SendExpZonein=0x69cd # C
OP_SendTributes=0x4786 # C
OP_TributeInfo=0x4cc6 # C
OP_SendGuildTributes=0x26c4 # C
OP_AAExpUpdate=0x3088 # C
OP_ExpUpdate=0x0e98 # C
OP_HPUpdate=0x538f # C
OP_ManaChange=0x50c2 # C
OP_TGB=0x2d74 # C
OP_SpecialMesg=0x074f # C
OP_GuildMemberList=0x51bc # C
OP_GuildMOTD=0xd677 # C
OP_CharInventory=0x709d # C
OP_WearChange=0x231f # C
OP_ClientUpdate=0x7062 # C
OP_ClientReady=0x6759 # C
OP_SetServerFilter=0x7312 # C
# Guild Opcodes
OP_GetGuildMOTD=0x189e # C
OP_GetGuildMOTDReply=0x7a16 # C
OP_GuildMemberUpdate=0x41c0 # C
OP_GuildInvite=0x4843 # C
OP_GuildRemove=0x2b9d # C
OP_GuildPeace=0x3f21 # C
OP_SetGuildMOTD=0x481f # C
OP_GuildList=0x5b0b # C
OP_GuildWar=0x7bfb # C
OP_GuildLeader=0x1055 # C
OP_GuildDelete=0x75d0 # C
OP_GuildInviteAccept=0x5f25 # C
OP_GuildDemote=0x15b2 # C
OP_GuildPublicNote=0x2dbd # C
OP_GuildManageBanker=0x11bc # C
OP_GuildBank=0x0fce # C
OP_SetGuildRank=0x4ffe # C
OP_GuildUpdateURLAndChannel=0x5422
OP_GuildMemberLevelUpdate=0x0000 #
OP_ZoneGuildList=0x0000 #
OP_GetGuildsList=0x0000 #
# OP_GuildManageRemove=0x0000 #
# OP_GuildManageAdd=0x0000 #
# OP_GuildManageStatus=0x0000 #
# GM/guide opcodes
OP_GMServers=0x6989 # C
OP_GMBecomeNPC=0x56e7 # C
OP_GMZoneRequest=0x4578 # C
OP_GMZoneRequest2=0x1912 # C
OP_GMGoto=0x0402 # C
OP_GMSearchCorpse=0x7872 # C
OP_GMHideMe=0x34a1 # C
OP_GMDelCorpse=0x0dda # C
OP_GMApproval=0x72fa # C
OP_GMToggle=0x7566 # C
OP_GMSummon=0x596d # C
OP_GMEmoteZone=0x3e7c # C
OP_GMEmoteWorld=0x3e7c # C
OP_GMFind=0x6e27 # C
OP_GMKick=0x799c # C
OP_GMKill=0x6685 # C
OP_GMNameChange=0x565d # C
OP_GMLastName=0x3563 # C
OP_InspectAnswer=0x4938 # C
OP_Action2=0x7e4d # C OP_Damage?
OP_BeginCast=0x0d5a # C
OP_BuffFadeMsg=0x569a # C
OP_ConsentResponse=0x6e47 # C
OP_MemorizeSpell=0x8543 # C
OP_SwapSpell=0x3fd2 # C
OP_CastSpell=0x3582 # C
OP_Consider=0x6024 # C
OP_FormattedMessage=0x1318 # C
OP_SimpleMessage=0x5448 # C
OP_Buff=0x7ea8 # C
OP_Illusion=0x48f9 # C
OP_MoneyOnCorpse=0x6546 # C
OP_RandomReply=0x6cdc # C
OP_DenyResponse=0x7ce7 # C
OP_SkillUpdate=0x7f01 # C
OP_GMTrainSkillConfirm=0x7ae1 # C
OP_RandomReq=0x777c # C
OP_Death=0x1b85 # C
OP_Bind_Wound=0x3969 # C
OP_GMTraining=0x7b64 # C
OP_GMEndTraining=0x3c02 # C
OP_GMTrainSkill=0x7686 # C
OP_Animation=0x47d3 # C
OP_Begging=0x6d37 # C
OP_Consent=0x6bb9 # C
OP_ConsentDeny=0x01e3 # C
OP_AutoFire=0x1bd4 # C
OP_PetCommands=0x3ad6 # C
OP_DeleteSpell=0x0736 # C
OP_Surname=0x7547 # C
OP_ClearSurname=0x2edd # C
OP_FaceChange=0x5658 # C
OP_SenseHeading=0x3887 # C
OP_Action=0x2c27 # C
OP_ConsiderCorpse=0x37a7 # C
OP_HideCorpse=0x1842
OP_Bug=0x02b # C
OP_Feedback=0x0d1d # C
OP_Report=0x6884 # C
OP_Damage=0x7e4d # C or OP_Action2?
OP_ChannelMessage=0x2e79 # C
OP_Assist=0x2b59 # C
OP_AssistGroup=0x5af6 # C
OP_MoveCoin=0x1fcd # C
OP_ZonePlayerToBind=0x1d3f # C
OP_KeyRing=0x0a18 # C
OP_WhoAllRequest=0x177a # C
OP_WhoAllResponse=0x31f3 # C
OP_FriendsWho=0x6a90 # C
OP_ConfirmDelete=0x3d00 # C
OP_Logout=0x66e0 # C
OP_Rewind=0x4b7b # C
OP_TargetCommand=0x17f7 # C
OP_InspectRequest=0x4892 # C
OP_Hide=0x1d22 # C
OP_Jump=0x6c16 # C
OP_Camp=0x3eec # C
OP_Emote=0x7434 # C
OP_SetRunMode=0x07fb # C
OP_BankerChange=0x21e9 # C
OP_TargetMouse=0x7bbb # C
OP_MobHealth=0x47ea # C
OP_InitialMobHealth=0x2d25 # C
OP_TargetHoTT=0x3ec7 # C
OP_TargetBuffs=0x3df8
OP_DeleteSpawn=0x3164 # C
OP_AutoAttack=0x3d86 # C
OP_AutoAttack2=0x4ca1 # C
OP_Consume=0x7ce4 # C
OP_MoveItem=0x7f56 # C
OP_DeleteItem=0x36f8 # C
OP_DeleteCharge=0x1df9 # C
OP_ItemPacket=0x34f8 # C
OP_ItemLinkResponse=0x2bad # C
OP_ItemLinkClick=0x3c66 # C
OP_NewSpawn=0x5c29 # C
OP_Track=0x4817 # C
OP_TrackTarget=0x7337 # C
OP_TrackUnknown=0x7b56 # C
OP_ClickDoor=0x1516 # C
OP_MoveDoor=0x6e97 # C
OP_EnvDamage=0x5ac4 # C
OP_BoardBoat=0x5cd3 # C
OP_Forage=0x7b05 # C
OP_LeaveBoat=0x7554 # C
OP_ControlBoat=0x5bd9 # C
OP_SafeFallSuccess=0x6ad2 # C
OP_RezzComplete=0x42d0 # C
OP_RezzRequest=0x0976 # C
OP_RezzAnswer=0x6e1c # C
OP_Shielding=0x2f6a # C
OP_RequestDuel=0x79e0 # C
OP_MobRename=0x0a1d # C
OP_AugmentItem=0x0370 # C
OP_WeaponEquip1=0x719e # C
OP_WeaponEquip2=0x7b6e # C
OP_WeaponUnequip2=0x19a8 # C
OP_ApplyPoison=0x405b # C
OP_Save=0x5c85 # C
OP_TestBuff=0x7309
OP_DestructableRelated=0x5ea1
OP_CustomTitles=0x1b26 # C
OP_Split=0x53f9 # C
OP_YellForHelp=0x6f79 # C
OP_LoadSpellSet=0x7113 # C
OP_Bandolier=0x441c # C
OP_PotionBelt=0x5db5 # C
OP_DuelResponse=0x1ebb # C
OP_SaveOnZoneReq=0x6eff # C
OP_ReadBook=0xa53e
OP_Dye=0x3672 # C
OP_InterruptCast=0x072f # C
OP_AAAction=0x50d0 # C
OP_LeadershipExpToggle=0x34c5 # C
OP_LeadershipExpUpdate=0x69d0 # C
OP_PurchaseLeadershipAA=0x07b3 # C
OP_UpdateLeadershipAA=0x6948 # C
OP_MarkNPC=0x0d4b # C
OP_ClearNPCMarks=0x5033 # C
OP_DoGroupLeadershipAbility=0x540b # C
OP_GroupLeadershipAAUpdate=0x0c33
OP_DelegateAbility=0x0322 # C
OP_SetGroupTarget=0x521c # C
OP_DuelResponse2=0x52b5 # C
OP_Charm=0x7108 # C
OP_Stun=0x2a6d # C
OP_SendFindableNPCs=0x5360
OP_FindPersonRequest=0x3168 # C
OP_FindPersonReply=0x1ac8 # C
OP_Sound=0x303e # C
OP_PetBuffWindow=0x2dd3 # C
OP_LevelAppearance=0x6dc3 # C
OP_Translocate=0x2042 # C
OP_Sacrifice=0x5805 # C
OP_PopupResponse=0x2caf # C
OP_OnLevelMessage=0x1154 # C
OP_AugmentInfo=0x3683 # C
OP_Petition=0x31d1 # C
OP_SomeItemPacketMaybe=0x54e8 # C
OP_PVPStats=0x6a37 # C
OP_PVPLeaderBoardRequest=0x24cb # C
OP_PVPLeaderBoardReply=0x6ac2 # C
OP_PVPLeaderBoardDetailsRequest=0x2a99 # C
OP_PVPLeaderBoardDetailsReply=0x5156 # C
OP_RestState=0x292f # C
OP_RespawnWindow=0x268c # C was 0x1643
OP_DisciplineTimer=0x684c # C
OP_LDoNButton=0x41b5 # C
OP_SetStartCity=0x7bf6 # C
OP_VoiceMacroIn=0x31b1 # C
OP_VoiceMacroOut=0x7880 # C
OP_ItemViewUnknown=0x21c7 # C
OP_VetRewardsAvaliable=0x4e4e # C
OP_VetClaimRequest=0x771f # C
OP_VetClaimReply=0x2f95 # C
OP_CrystalCountUpdate=0x2d0e # C
OP_DisciplineUpdate=0x0000 #
OP_BecomeCorpse=0x0000 #
OP_MobUpdate=0x4656 # Unused?
OP_NPCMoveUpdate=0x22a7 #
# New Opcodes
OP_SpawnPositionUpdate=0x4656 #
OP_ManaUpdate=0x4b61 #
OP_EnduranceUpdate=0x02d6 #
OP_MobManaUpdate=0x2ac1 #
OP_MobEnduranceUpdate=0x6c5f #
# Looting
OP_LootRequest=0x2701 # C
OP_EndLootRequest=0x6ad7 # C
OP_LootItem=0x2b5a # C
OP_LootComplete=0x41a6 # C
# bazaar trader stuff stuff:
OP_BazaarSearch=0x4675 # C
OP_TraderDelItem=0x63c8 # C
OP_BecomeTrader=0x528f # C
OP_TraderShop=0x7598 # C
OP_TraderItemUpdate=0x0000 #
OP_Trader=0x7092 # C
OP_ShopItem=0x0000 #
OP_TraderBuy=0x053a # C
OP_Barter=0x4b49 #
OP_BazaarInspect=0x0000 #
OP_Bazaar=0x0000 #
OP_MarketPlace1=0x367b
OP_MarketPlace2=0x0e1d
# pc/npc trading
OP_TradeRequest=0x47ae # C
OP_TradeAcceptClick=0x064a # C
OP_TradeRequestAck=0x606a # C
OP_TradeCoins=0x0149 # C
OP_FinishTrade=0x3ff6 # C
OP_CancelTrade=0x527e # C
OP_TradeMoneyUpdate=0x7452 # C
OP_MoneyUpdate=0x2d1d # C
# Sent after canceling trade or after closing tradeskill object
OP_FinishWindow=0x3c27 # C
OP_FinishWindow2=0x2f5d # C
# Sent on Live for what seems to be item existance verification
# Ex. Before Right Click Effect happens from items
OP_ItemVerifyRequest=0x032a # C
OP_ItemVerifyReply=0x7866 # C
# merchant crap
OP_ShopPlayerSell=0x0b27 # C
OP_ShopRequest=0x4194 # C
OP_ShopEnd=0x3753 # C
OP_ShopEndConfirm=0x7114 # C
OP_ShopPlayerBuy=0x436a # C
OP_ShopDelItem=0x63c8 # C
# tradeskill stuff:
OP_ClickObject=0x5f0d # C
OP_ClickObjectAction=0x5dbc # C
OP_ClearObject=0x0b80 # C
OP_RecipeDetails=0x49f4 # C
OP_RecipesFavorite=0x1150 # C
OP_RecipesSearch=0x55dd # C
OP_RecipeReply=0x0643 # C
OP_RecipeAutoCombine=0x1564 # C
OP_TradeSkillCombine=0x4212 # C
# Tribute Packets:
OP_OpenGuildTributeMaster=0x6361 # C
OP_OpenTributeMaster=0x2daa # C
OP_SelectTribute=0x38b0 # C
OP_TributeItem=0x416b # C
OP_TributeMoney=0x0b89 # C
OP_TributeToggle=0x45b3 # C
OP_TributePointUpdate=0x7d05 # C
OP_TributeNPC=0x0000 #
OP_GuildTributeInfo=0x0000 #
OP_OpenTributeReply=0x0000 #
# OP_GuildTributeStatus=0x0000 #
# Adventure packets:
OP_LeaveAdventure=0x2ab6 # C
OP_AdventureFinish=0x624c # C
OP_AdventureInfoRequest=0x3a75 # C
OP_AdventureInfo=0x3a28 # C
OP_AdventureRequest=0x5a55 # C
OP_AdventureDetails=0x5ed3 # C
OP_AdventureData=0x05 # C
OP_AdventureUpdate=0x0dcd # C
OP_AdventureMerchantRequest=0x0989 # C
OP_AdventureMerchantResponse=0x6ade # C
OP_AdventureMerchantPurchase=0x23fc # C
OP_AdventureMerchantSell=0x5363 # C
OP_AdventurePointsUpdate=0x6b7f # C
OP_AdventureStatsRequest=0x7e45 # C
OP_AdventureStatsReply=0x6a30 # C
OP_AdventureLeaderboardRequest=0x7537 # C
OP_AdventureLeaderboardReply=0x7c87 # C
# Group Opcodes
OP_GroupDisband=0x47e7 # C
OP_GroupInvite=0x5d32 # C
OP_GroupFollow=0x321a # C
OP_GroupUpdate=0x21be
OP_GroupUpdateB=0x7351
OP_GroupCancelInvite=0x5251 # C - Same as OP_CancelInvite?
OP_GroupAcknowledge=0x3e22 # C
OP_GroupDelete=0x58e6 #
OP_CancelInvite=0x5251 # C
OP_GroupFollow2=0x2736 # C
OP_GroupInvite2=0x548c # C
OP_GroupDisbandYou=0xc56c
OP_GroupDisbandOther=0x162d
OP_GroupLeaderChange=0x7545
OP_GroupRoles=0x6b67
# LFG/LFP Opcodes
OP_LFGCommand=0x3288 # C
OP_LFGGetMatchesRequest=0x5613 # C
OP_LFGGetMatchesResponse=0x7d90 # C
OP_LFPGetMatchesRequest=0x0479 # C
OP_LFPGetMatchesResponse=0x16f5 # C
OP_LFPCommand=0x710e # C
OP_LFGAppearance=0x0000 #
OP_LFGResponse=0x0000 #
# Raid Opcodes
OP_RaidInvite=0x3b52 # C
OP_RaidUpdate=0x32c6 # C
OP_RaidJoin=0x0000 #
# Button-push commands
OP_Taunt=0x1418 # C
OP_CombatAbility=0x24c5 # C
OP_SenseTraps=0x1e04 # C
OP_PickPocket=0x25f0 # C
OP_DisarmTraps=0x0000 #
OP_Disarm=0x6def # C
OP_Sneak=0x03e7 # C
OP_Fishing=0x7093 # C
OP_InstillDoubt=0x2d41 # C
OP_FeignDeath=0x3f49 # C
OP_Mend=0x221a # C
OP_LDoNOpen=0x6129 # C
# Task packets
OP_TaskActivityComplete=0x4df0 # C
OP_TaskMemberList=0x34ed # C
OP_OpenNewTasksWindow=0x4dd5 # C
OP_AvaliableTask=0x2136 # C
OP_AcceptNewTask=0x5832 # C
OP_TaskHistoryRequest=0x29d7 # C
OP_TaskHistoryReply=0x3d2a # C
OP_CancelTask=0x726b # C
OP_DeclineAllTasks=0x0000 #
OP_Shroud=0x6d1f
OP_ShroudRemove=0x17f6
OP_ShroudUnknown1=0x169a
OP_ShroudUnknown2=0x4292
OP_ShroudClearAA=0x3bef
OP_ShroudSelectionWindow=0x4d79
OP_ShroudRequestStats=0x28ce
OP_ShroudRespondStats=0x33f2
OP_ShroudSelect=0x194f
# Title opcodes
OP_NewTitlesAvailable=0x4399 # C
OP_RequestTitles=0x7327 # C
OP_SendTitleList=0x158f # C
OP_SetTitle=0x698a # C
OP_SetTitleReply=0x4d3e # C
# mail opcodes
OP_Command=0x0000 #
OP_MailboxHeader=0x0000 #
OP_MailHeader=0x0000 #
OP_MailBody=0x0000 #
OP_NewMail=0x0000 #
OP_SentConfirm=0x0000 #
# # # # # # # # # # # Below this point should not be needed # # # # # # # # # # #
# This section are all unknown in Titanium
OP_ForceFindPerson=0x0000 #
OP_LocInfo=0x0000 #
OP_ReloadUI=0x0000 #
OP_ItemName=0x0000 #
OP_ItemLinkText=0x0000 #
OP_MultiLineMsg=0x0000 #
OP_MendHPUpdate=0x0000 #
OP_TargetReject=0x0000 #
OP_SafePoint=0x0000 #
OP_IncreaseStats=0x0000 #
OP_ApproveZone=0x0000 #
OP_ZoneComplete=0x0000 #
OP_ClientError=0x0000 #
OP_DumpName=0x0000 #
OP_Heartbeat=0x0000 #
OP_CrashDump=0x0000 #
OP_LoginComplete=0x0000 #
# discovered opcodes not yet used:
OP_PickLockSuccess=0x0000 #
OP_PlayMP3=0x0000 #
OP_ReclaimCrystals=0x0000 #
OP_DynamicWall=0x0000 #
OP_OpenDiscordMerchant=0x0000 #
OP_DiscordMerchantInventory=0x0000 #
OP_GiveMoney=0x0000 #
OP_RequestKnowledgeBase=0x0000 #
OP_KnowledgeBase=0x0000 #
OP_SlashAdventure=0x0000 # /adventure
OP_BecomePVPPrompt=0x0000 #
OP_MoveLogRequest=0x0000 # gone I think
OP_MoveLogDisregard=0x0000 # gone I think
# named unknowns, to make looking for real unknown easier
OP_AnnoyingZoneUnknown=0x0000 #
OP_Some6ByteHPUpdate=0x0000 # seems to happen when you target group members
OP_QueryResponseThing=0x0000 #
# realityincarnate: these are just here to stop annoying several thousand byte packet dumps
#OP_LoginUnknown1=0x5bad # U OP_SendSpellChecksum
#OP_LoginUnknown2=0x5d24 # U OP_SendSkillCapsChecksum
# Petition Opcodes
OP_PetitionSearch=0x0000 # search term for petition
OP_PetitionSearchResults=0x0000 # (list of?) matches from search
OP_PetitionSearchText=0x0000 # text results of search
OP_PetitionUpdate=0x0000 #
OP_PetitionCheckout=0x0000 #
OP_PetitionCheckIn=0x0000 #
OP_PetitionQue=0x0000 #
OP_PetitionUnCheckout=0x0000 #
OP_PetitionDelete=0x0000 #
OP_DeletePetition=0x0000 #
OP_PetitionResolve=0x0000 #
OP_PDeletePetition=0x0000 #
OP_PetitionBug=0x0000 #
OP_PetitionRefresh=0x0000 #
OP_PetitionCheckout2=0x0000 #
OP_PetitionViewPetition=0x0000 #
# Login opcodes
OP_SessionReady=0x0001 #
OP_Login=0x0002 #
OP_ServerListRequest=0x0004 #
OP_PlayEverquestRequest=0x000d #
OP_PlayEverquestResponse=0x0021 #
OP_ChatMessage=0x0016 #
OP_LoginAccepted=0x0017 #
OP_ServerListResponse=0x0018 #
OP_Poll=0x0029 #
OP_EnterChat=0x000f #
OP_PollResponse=0x0011 #
# raw opcodes
OP_RAWSessionRequest=0x0000 #
OP_RAWSessionResponse=0x0000 #
OP_RAWCombined=0x0000 #
OP_RAWSessionDisconnect=0x0000 #
OP_RAWKeepAlive=0x0000 #
OP_RAWSessionStatRequest=0x0000 #
OP_RAWSessionStatResponse=0x0000 #
OP_RAWPacket=0x0000 #
OP_RAWFragment=0x0000 #
OP_RAWOutOfOrderAck=0x0000 #
OP_RAWAck=0x0000 #
OP_RAWAppCombined=0x0000 #
OP_RAWOutOfSession=0x0000 #
# we need to document the differences between these packets to make identifying them easier
OP_Some3ByteHPUpdate=0x0000 # initial HP update for mobs
OP_InitialHPUpdate=0x0000 #
# Mercenary Opcodes
OP_MercenaryDataRequest=0x4717 #
OP_MercenaryDataResponse=0x1715 #
OP_MercenaryHire=0x0bfd #
OP_MercenaryAssign=0x6188 #
OP_MercenaryTimer=0x116d #
OP_MercenaryUnknown1=0x28c7 #
@@ -0,0 +1,653 @@
# ShowEQ Import Notes:
# ZERO THE FILE first
# perl -pi -e 's/0x[0-9a-fA-F]{4}/0x0000/g' opcodes.conf
# Unknown Mapping:
# OP_Action2 -> OP_Damage
# OP_EnvDamage -> OP_Damage ---> might have been a one time mistake
# Name Differences:
# OP_CancelInvite -> OP_GroupCancelInvite
# OP_GMFind -> OP_FindPersonRequest
# OP_CommonMessage -> OP_ChannelMessage
OP_Unknown=0x0000
OP_ExploreUnknown=0x0000 used for unknown explorer
# world packets
# Required to reach Char Select:
OP_SendLoginInfo=0x437c
OP_ApproveWorld=0x7c9b
OP_LogServer=0x729e
OP_SendCharInfo=0x79c4
OP_ExpansionInfo=0x00ec
OP_GuildsList=0x3e97
OP_EnterWorld=0x52ca
OP_PostEnterWorld=0x26d4
OP_World_Client_CRC1=0x3f0e
OP_World_Client_CRC2=0x4628
OP_SendSpellChecksum=0x0000
OP_SendSkillCapsChecksum=0x0000
# Character Select Related:
OP_SendMaxCharacters=0x79df
OP_SendMembership=0x5584
OP_SendMembershipDetails=0x7bee
OP_CharacterCreateRequest=0x4aac
OP_CharacterCreate=0x60ea
OP_DeleteCharacter=0x4415
OP_RandomNameGenerator=0x2d39
OP_ApproveName=0x6607
OP_MOTD=0x237b
OP_SetChatServer=0x7fbc
OP_SetChatServer2=0x611a
OP_ZoneServerInfo=0x0610
OP_WorldComplete=0x4357
OP_WorldUnknown001=0x0f12
OP_FloatListThing=0x5d33
# Reasons for Disconnect:
OP_ZoneUnavail=0x4e66
OP_WorldClientReady=0x0059
OP_CharacterStillInZone=0x0000
OP_WorldChecksumFailure=0x0000
OP_WorldLoginFailed=0x0000
OP_WorldLogout=0x0000
OP_WorldLevelTooHigh=0x0000
OP_CharInacessable=0x0000
OP_UserCompInfo=0x0000
OP_SendExeChecksum=0x0000
OP_SendBaseDataChecksum=0x0000
# Zone in opcodes
OP_AckPacket=0x5bf3
OP_ZoneEntry=0x280b
OP_ReqNewZone=0x932b
OP_NewZone=0x6d6c
OP_ZoneSpawns=0x1451
OP_PlayerProfile=0x3a78
OP_TimeOfDay=0x5204
OP_LevelUpdate=0x747e
OP_Stamina=0x4dab
OP_RequestClientZoneChange=0x782a
OP_ZoneChange=0x3654
OP_LockoutTimerInfo=0x0000
OP_ZoneServerReady=0x0000
OP_ZoneInUnknown=0x0000
OP_LogoutReply=0x0000
OP_PreLogoutReply=0x0000
# Required to fully log in
OP_SpawnAppearance=0x4223
OP_ChangeSize=0x4b3b
OP_TributeUpdate=0x58f5
OP_TributeTimer=0x6d2e
OP_SendTributes=0x2017
OP_SendGuildTributes=0x7fd8
OP_TributeInfo=0x7a02
OP_Weather=0x434b
OP_ReqClientSpawn=0x9668
OP_SpawnDoor=0x49ac
OP_GroundSpawn=0x3855
OP_SendZonepoints=0x76d3
OP_BlockedBuffs=0x0966
OP_RemoveBlockedBuffs=0x153a
OP_ClearBlockedBuffs=0x7aa7
OP_WorldObjectsSent=0x0740
OP_SendExpZonein=0x1cc3
OP_SendAATable=0x70ba
OP_RespondAA=0x4d0e
OP_UpdateAA=0x3269
OP_SendAAStats=0x3168
OP_AAExpUpdate=0x0ded
OP_ExpUpdate=0x4326
OP_HPUpdate=0x5cf1
OP_ManaChange=0x1af5
OP_TGB=0x0f18
OP_SpecialMesg=0x6700
OP_GuildMemberList=0x1d1d
OP_GuildMOTD=0x5095
OP_CharInventory=0x3715
OP_WearChange=0x3260
OP_ClientUpdate=0x2f10
OP_ClientReady=0x4da3 # 0x422d
OP_SetServerFilter=0x21dd
# Guild Opcodes - Disabled until crashes are resolved in RoF
OP_GetGuildMOTD=0x76a3 # Was 0x35dc
OP_GetGuildMOTDReply=0x0e55 # Was 0x4586
OP_GuildMemberUpdate=0x07ac # Was 0x5643
OP_GuildInvite=0x6d0c
OP_GuildRemove=0x4df4
OP_GuildPeace=0x41e5
OP_SetGuildMOTD=0x361a
OP_GuildList=0x0000
OP_GuildWar=0x299a
OP_GuildLeader=0x3892
OP_GuildDelete=0x0d49
OP_GuildInviteAccept=0x3c45
OP_GuildDemote=0x3a8d
OP_GuildPublicNote=0x483c
OP_GuildManageBanker=0x04ad # Was 0x0737
OP_GuildBank=0xe64c # Was 0x10c3
OP_SetGuildRank=0x72aa
OP_GuildUpdateURLAndChannel=0x526c
OP_GuildStatus=0x3230
OP_GuildCreate=0x1a3c # or maybe 0x086e
OP_GuildMemberLevelUpdate=0x0000 # Unused?
OP_ZoneGuildList=0x0000 # Unused?
OP_GetGuildsList=0x0000 # Unused?
OP_LFGuild=0x0000
OP_GuildManageRemove=0x0000
OP_GuildManageAdd=0x0000
OP_GuildManageStatus=0x0000
# GM/Guide Opcodes
OP_GMServers=0x05ca
OP_GMBecomeNPC=0x7c0a
OP_GMZoneRequest=0x295d
OP_GMZoneRequest2=0x1c36
OP_GMGoto=0x1659
OP_GMSearchCorpse=0x537a
OP_GMHideMe=0x764e
OP_GMDelCorpse=0x2280
OP_GMApproval=0x6768
OP_GMToggle=0x4c4e
OP_GMSummon=0x17e5 # Was 0x684f
OP_GMEmoteZone=0x6c26 # Was 0x0655
OP_GMEmoteWorld=0x1ff3 # Was 0x1935
OP_GMFind=0x4a39
OP_GMKick=0x5b0f
OP_GMKill=0x6d0d
OP_GMNameChange=0x07fc # Was 0x4434
OP_GMLastName=0x57dd # Was 0x3077
# Misc Opcodes
OP_InspectRequest=0x4f0b
OP_InspectAnswer=0x3bf5
OP_InspectMessageUpdate=0x22ae
OP_BeginCast=0x66fd
OP_BuffFadeMsg=0x4aa9
OP_ConsentResponse=0x57a5
OP_MemorizeSpell=0x351d
OP_SwapSpell=0x3069
OP_CastSpell=0x568e
OP_Consider=0x0ea4
OP_FormattedMessage=0x7cd3
OP_SimpleMessage=0x4a83
OP_Buff=0x3c26
OP_Illusion=0x25dd
OP_MoneyOnCorpse=0x6fbd
OP_RandomReply=0x3939
OP_DenyResponse=0x7dc7
OP_SkillUpdate=0x365d
OP_GMTrainSkillConfirm=0x1a0c # 0x3960
OP_RandomReq=0x50ce
OP_Death=0x09fc
OP_GMTraining=0x1d12
OP_GMEndTraining=0x7d15
OP_GMTrainSkill=0x1369
OP_Animation=0x47d4
OP_Begging=0x7da4
OP_Consent=0x753e
OP_ConsentDeny=0x54dd
OP_AutoFire=0x3517
OP_PetCommands=0x5c34
OP_DeleteSpell=0x60e1
OP_Surname=0x7d6b
OP_ClearSurname=0x5c93
OP_FaceChange=0x09ac
OP_SenseHeading=0x7c17
OP_Action=0x1384
OP_ConsiderCorpse=0x4715
OP_HideCorpse=0x31df
OP_CorpseDrag=0x4b1c
OP_CorpseDrop=0x36e2
OP_Bug=0x5194
OP_Feedback=0x29f6
OP_Report=0x0c72
OP_Damage=0x6004
OP_ChannelMessage=0x0ead
OP_Assist=0x7923
OP_AssistGroup=0x7737
OP_MoveCoin=0x54b4
OP_ZonePlayerToBind=0x5cb6
OP_KeyRing=0x1490
OP_WhoAllRequest=0x18e5
OP_WhoAllResponse=0x1b8c
OP_FriendsWho=0x173c
OP_ConfirmDelete=0x417b
OP_Logout=0x2436
OP_Rewind=0x25e3
OP_TargetCommand=0x63cf
OP_Hide=0x2e6f
OP_Jump=0x7629
OP_Camp=0x3297
OP_Emote=0x1ad3
OP_SetRunMode=0x3448
OP_BankerChange=0x08cc
OP_TargetMouse=0x77c6
OP_MobHealth=0x29b7
OP_InitialMobHealth=0x0000 # Unused?
OP_TargetHoTT=0x042a
OP_XTargetResponse=0x5473
OP_XTargetRequest=0x45a9
OP_XTargetAutoAddHaters=0x5af8
OP_TargetBuffs=0x156f
OP_BuffCreate=0x2013
OP_BuffRemoveRequest=0x718c
OP_DeleteSpawn=0x69b2
OP_AutoAttack=0x702f
OP_AutoAttack2=0x47b1
OP_Consume=0x3008
OP_MoveItem=0x1512
OP_DeleteItem=0x4087
OP_DeleteCharge=0x2a47
OP_ItemPacket=0x1dc1
OP_ItemLinkResponse=0x24cd
OP_ItemLinkClick=0x0a72
OP_ItemPreview=0x46e4
OP_NewSpawn=0x2302
OP_Track=0x0192
OP_TrackTarget=0x7618
OP_TrackUnknown=0x1a71
OP_ClickDoor=0x15fb
OP_MoveDoor=0x4665
OP_RemoveAllDoors=0x4cca
OP_EnvDamage=0x2ed2
OP_BoardBoat=0x4324
OP_Forage=0x39e3
OP_LeaveBoat=0x20e6
OP_ControlBoat=0x599c
OP_SafeFallSuccess=0x31ee
OP_RezzComplete=0x79b9
OP_RezzRequest=0x70e8
OP_RezzAnswer=0x7158
OP_Shielding=0x0bd4
OP_RequestDuel=0x4719
OP_MobRename=0x5b82
OP_AugmentItem=0x1d6e # Was 0x37cb
OP_WeaponEquip1=0x1614
OP_WeaponEquip2=0x1660 # Was 0x6022
OP_WeaponUnequip2=0x75ea # Was 0x0110
OP_ApplyPoison=0x197e
OP_Save=0x260c
OP_TestBuff=0x29c3 # Was 0x3772
OP_CustomTitles=0x719f
OP_Split=0x27d5
OP_YellForHelp=0x2a50
OP_LoadSpellSet=0x4d0f
OP_Bandolier=0x2c88
OP_PotionBelt=0x62e9 # Was 0x4d3b
OP_DuelResponse=0x23e8
OP_DuelResponse2=0x3828
OP_SaveOnZoneReq=0x44d3
OP_ReadBook=0x4910
OP_Dye=0x265b
OP_InterruptCast=0x2e8c
OP_AAAction=0x4f7c
OP_LeadershipExpToggle=0x0350
OP_LeadershipExpUpdate=0x4a6e
OP_PurchaseLeadershipAA=0x45a5
OP_UpdateLeadershipAA=0x2efb
OP_MarkNPC=0x43f8
OP_ClearNPCMarks=0x6c57
OP_DelegateAbility=0x2e22
OP_SetGroupTarget=0x0da5
OP_Charm=0x738b
OP_Stun=0x3333
OP_SendFindableNPCs=0x6516
OP_FindPersonRequest=0x4e65
OP_FindPersonReply=0x5e04
OP_Sound=0x6ad4
OP_PetBuffWindow=0x5be1
OP_LevelAppearance=0x7a6f
OP_Translocate=0x3a61
OP_Sacrifice=0x18a6
OP_PopupResponse=0x0f8f
OP_OnLevelMessage=0x213b
OP_AugmentInfo=0x1565
OP_Petition=0x6002
OP_SomeItemPacketMaybe=0x49ee
OP_PVPStats=0x26ea # Unsure
OP_PVPLeaderBoardRequest=0x13fd
OP_PVPLeaderBoardReply=0x5dd0
OP_PVPLeaderBoardDetailsRequest=0x7a42
OP_PVPLeaderBoardDetailsReply=0x2b8b
OP_RestState=0x5b4b
OP_RespawnWindow=0x0920
OP_LDoNButton=0x09f2
OP_SetStartCity=0x372f # Was 0x2d1b
OP_VoiceMacroIn=0x376d
OP_VoiceMacroOut=0x5a45
OP_ItemViewUnknown=0x7bf0
OP_VetRewardsAvaliable=0x7060
OP_VetClaimRequest=0x345c
OP_VetClaimReply=0x1705
OP_DisciplineUpdate=0x4b8f # Was 0x2f05
OP_DisciplineTimer=0x0b96 # Was 0x5e3f
OP_BecomeCorpse=0x0000 # Unused?
OP_Action2=0x0000 # Unused?
OP_MobUpdate=0x09aa
OP_NPCMoveUpdate=0x4eca
OP_CameraEffect=0x0546
OP_SpellEffect=0x1f9d
OP_RemoveNimbusEffect=0x59dc
OP_AltCurrency=0x1da9
OP_AltCurrencyMerchantRequest=0x44f0
OP_AltCurrencyMerchantReply=0x77d4
OP_AltCurrencyPurchase=0x02ec
OP_AltCurrencySell=0x7bcf
OP_AltCurrencySellSelection=0x122a
OP_AltCurrencyReclaim=0x5b90
OP_CrystalCountUpdate=0x37da # Was 0x3f60
OP_CrystalCreate=0x22e4 # Was 0x5a82
OP_CrystalReclaim=0x1c12 # Was 0x7616
OP_Untargetable=0x6dd5
OP_IncreaseStats=0x355f
OP_Weblink=0x3d99
#OP_OpenInventory=0x0000 # Likely does not exist in RoF -U
OP_OpenContainer=0x0000
OP_DzQuit=0x7878
OP_DzListTimers=0x6bbc
OP_DzAddPlayer=0x4185
OP_DzRemovePlayer=0x6c01
OP_DzSwapPlayer=0x5746
OP_DzMakeLeader=0x47ba
OP_DzPlayerList=0x4848
OP_DzJoinExpeditionConfirm=0x56d3
OP_DzJoinExpeditionReply=0x28bf
OP_DzExpeditionInfo=0x575f
OP_DzExpeditionList=0x6ff3
OP_DzMemberStatus=0x2456
OP_DzLeaderStatus=0x5be9
OP_DzExpeditionEndsWarning=0x3966
OP_DzMemberList=0x215d
OP_DzCompass=0x5a12 # Was 0x4f09
OP_DzChooseZone=0x0000 # Maybe 0x29d6
# New Opcodes
OP_SpawnPositionUpdate=0x0000 # Actually OP_MobUpdate ?
OP_ManaUpdate=0x52de
OP_EnduranceUpdate=0x4730
OP_MobManaUpdate=0x7f17
OP_MobEnduranceUpdate=0x0336
# Mercenary Opcodes
OP_MercenaryDataUpdateRequest=0x7452
OP_MercenaryDataUpdate=0x0b3a
OP_MercenaryDataRequest=0x28ec
OP_MercenaryDataResponse=0x0247
OP_MercenaryHire=0x4950
OP_MercenaryDismiss=0x1408
OP_MercenaryTimerRequest=0x7691
OP_MercenaryTimer=0x0459
OP_MercenaryUnknown1=0x57b4
OP_MercenaryCommand=0x3be8
OP_MercenarySuspendRequest=0x4aea
OP_MercenarySuspendResponse=0x29a8
OP_MercenaryUnsuspendResponse=0x17f8
# Looting
OP_LootRequest=0x2106
OP_EndLootRequest=0x77fc
OP_LootItem=0x69a9
OP_LootComplete=0x2c4b
# bazaar trader stuff:
OP_BazaarSearch=0x31f0
OP_TraderDelItem=0x0000
OP_BecomeTrader=0x1028
OP_TraderShop=0x0527
OP_Trader=0x608b # Was 0x6790
OP_TraderBuy=0x0000
OP_Barter=0x0d79
OP_ShopItem=0x0000
OP_BazaarInspect=0x0000
OP_Bazaar=0x0000
OP_TraderItemUpdate=0x0000
# pc/npc trading
OP_TradeRequest=0x0910
OP_TradeAcceptClick=0x2921
OP_TradeRequestAck=0x6f1b
OP_TradeCoins=0x6aef
OP_FinishTrade=0x7b39
OP_CancelTrade=0x1486
OP_TradeMoneyUpdate=0x438a
OP_MoneyUpdate=0x5d8c
OP_TradeBusy=0x5856
# Sent after canceling trade or after closing tradeskill object
OP_FinishWindow=0x4a2a
OP_FinishWindow2=0x6b34
# Sent on Live for what seems to be item existance verification
# Ex. Before Right Click Effect happens from items
OP_ItemVerifyRequest=0x34b4
OP_ItemVerifyReply=0x04c1
# merchant stuff
OP_ShopPlayerSell=0x064a
OP_ShopRequest=0x1f03
OP_ShopEnd=0x38b9
OP_ShopEndConfirm=0x1362
OP_ShopPlayerBuy=0x5d60
OP_ShopDelItem=0x5e29
# tradeskill stuff:
OP_ClickObject=0x4c3e
OP_ClickObjectAction=0x5e24
OP_ClearObject=0x5465
OP_RecipeDetails=0x2695
OP_RecipesFavorite=0x1e20
OP_RecipesSearch=0x1335
OP_RecipeReply=0x728c
OP_RecipeAutoCombine=0x2fba
OP_TradeSkillCombine=0x11d5
# Tribute Packets:
OP_OpenGuildTributeMaster=0x11e5
OP_OpenTributeMaster=0x7c65 # Was 0x40f5
OP_SelectTribute=0x3f29
OP_TributeItem=0x42ff
OP_TributeMoney=0x1beb # Was 0x6fed
OP_TributeToggle=0x3d5c
OP_TributePointUpdate=0x1065
OP_TributeNPC=0x0000
OP_GuildTributeInfo=0x0000
OP_OpenTributeReply=0x0000
OP_GuildTributeStatus=0x0000
# Adventure packets:
OP_LeaveAdventure=0x206b
OP_AdventureFinish=0x7f00
OP_AdventureInfoRequest=0x2fc8
OP_AdventureInfo=0x1aaf
OP_AdventureRequest=0x6553
OP_AdventureDetails=0x5892
OP_AdventureData=0x7599
OP_AdventureUpdate=0x41b6
OP_AdventureMerchantRequest=0x1e99 # Was 654d
OP_AdventureMerchantResponse=0x394e # Was 7949
OP_AdventureMerchantPurchase=0x04b1 # Was 155a
OP_AdventureMerchantSell=0x1b22 # Was 389c
OP_AdventurePointsUpdate=0x36bf # Was 7589
OP_AdventureStatsRequest=0x5754
OP_AdventureStatsReply=0x31e2
OP_AdventureLeaderboardRequest=0x5b3d
OP_AdventureLeaderboardReply=0x5001
# Group Opcodes
OP_GroupDisband=0x468d
OP_GroupInvite=0x174e
OP_GroupFollow=0x06fc
OP_GroupUpdate=0x050b
OP_GroupUpdateB=0x09e2
OP_GroupCancelInvite=0x0000
OP_GroupAcknowledge=0x6f78
OP_GroupDelete=0x0d6b
OP_CancelInvite=0x67e2
OP_GroupFollow2=0x5435
OP_GroupInvite2=0x09af
OP_GroupDisbandYou=0x56f7
OP_GroupDisbandOther=0x50e8
OP_GroupLeaderChange=0x3d88
OP_GroupRoles=0x48b2
OP_GroupMakeLeader=0x6c31
OP_DoGroupLeadershipAbility=0x4af2
OP_GroupLeadershipAAUpdate=0x6a2b
# LFG/LFP Opcodes
OP_LFGCommand=0x2c60
OP_LFGGetMatchesRequest=0x7d32
OP_LFGGetMatchesResponse=0x5fa3
OP_LFPGetMatchesRequest=0x011c
OP_LFPGetMatchesResponse=0x6336
OP_LFPCommand=0x076c
OP_LFGAppearance=0x0000
OP_LFGResponse=0x0000
# Raid Opcodes
OP_RaidInvite=0x6f6a
OP_RaidUpdate=0x37bb
OP_RaidJoin=0x0000
# Button-push commands
OP_Taunt=0x5d7f
OP_CombatAbility=0x79ca
OP_SenseTraps=0x4795 # Was 0x2ee0
OP_PickPocket=0x5376
OP_DisarmTraps=0x0000
OP_Disarm=0x5122
OP_Sneak=0x6518
OP_Fishing=0x4312
OP_InstillDoubt=0x3392
OP_FeignDeath=0x2887
OP_Mend=0x4041
OP_Bind_Wound=0x55bf
OP_LDoNOpen=0x16af
# Task packets
OP_TaskDescription=0x0190
OP_TaskActivity=0x0c6a
OP_CompletedTasks=0x304b
OP_TaskActivityComplete=0x0e9f
OP_AcceptNewTask=0x1c0f
OP_CancelTask=0xb199
OP_TaskMemberList=0x4028 # Was 0x1656
OP_OpenNewTasksWindow=0x1e5b # Was 0x11de
OP_AvaliableTask=0x1138 # Was 0x2377
OP_TaskHistoryRequest=0x2e9b
OP_TaskHistoryReply=0x2adb
OP_DeclineAllTasks=0x0000
# Title opcodes
OP_NewTitlesAvailable=0x18c7
OP_RequestTitles=0x1118
OP_SendTitleList=0x4750
OP_SetTitle=0x2a7e
OP_SetTitleReply=0x0867
# mail opcodes
OP_Command=0x0000
OP_MailboxHeader=0x0000
OP_MailHeader=0x0000
OP_MailBody=0x0000
OP_NewMail=0x0000
OP_SentConfirm=0x0000
########### Below this point should not be needed ###########
# This section are all unknown in Titanium
OP_ForceFindPerson=0x0000
OP_LocInfo=0x0000
OP_ReloadUI=0x0000
OP_ItemName=0x0000
OP_ItemLinkText=0x0000
OP_MultiLineMsg=0x0000
OP_MendHPUpdate=0x0000
OP_TargetReject=0x0000
OP_SafePoint=0x0000
OP_ApproveZone=0x0000
OP_ZoneComplete=0x0000
OP_ClientError=0x0000
OP_DumpName=0x0000
OP_Heartbeat=0x0000
OP_CrashDump=0x0000
OP_LoginComplete=0x0000
# discovered opcodes not yet used:
OP_PickLockSuccess=0x0000
OP_PlayMP3=0x0000
OP_ReclaimCrystals=0x0000
OP_DynamicWall=0x0000
OP_OpenDiscordMerchant=0x0000
OP_DiscordMerchantInventory=0x0000
OP_GiveMoney=0x0000
OP_RequestKnowledgeBase=0x0000
OP_KnowledgeBase=0x0000
OP_SlashAdventure=0x0000 # /adventure
OP_BecomePVPPrompt=0x0000
OP_MoveLogRequest=0x0000 # gone I think
OP_MoveLogDisregard=0x0000 # gone I think
# named unknowns, to make looking for real unknown easier
OP_AnnoyingZoneUnknown=0x0000
OP_Some6ByteHPUpdate=0x0000 seems to happen when you target group members
OP_QueryResponseThing=0x0000
# realityincarnate: these are just here to stop annoying several thousand byte packet dumps
#OP_LoginUnknown1=0x46d3 # OP_SendSpellChecksum
#OP_LoginUnknown2=0x040b # OP_SendSkillCapsChecksum
# Petition Opcodes
OP_PetitionSearch=0x0000 search term for petition
OP_PetitionSearchResults=0x0000 (list of?) matches from search
OP_PetitionSearchText=0x0000 text results of search
OP_PetitionUpdate=0x0000
OP_PetitionCheckout=0x0000
OP_PetitionCheckIn=0x0000
OP_PetitionQue=0x0000
OP_PetitionUnCheckout=0x0000
OP_PetitionDelete=0x0000
OP_DeletePetition=0x0000
OP_PetitionResolve=0x0000
OP_PDeletePetition=0x0000
OP_PetitionBug=0x0000
OP_PetitionRefresh=0x0000
OP_PetitionCheckout2=0x0000
OP_PetitionViewPetition=0x0000
# Login opcodes
OP_SessionReady=0x0000
OP_Login=0x0000
OP_ServerListRequest=0x0000
OP_PlayEverquestRequest=0x0000
OP_PlayEverquestResponse=0x0000
OP_ChatMessage=0x0000
OP_LoginAccepted=0x0000
OP_ServerListResponse=0x0000
OP_Poll=0x0000
OP_EnterChat=0x0000
OP_PollResponse=0x0000
# raw opcodes
OP_RAWSessionRequest=0x0000
OP_RAWSessionResponse=0x0000
OP_RAWCombined=0x0000
OP_RAWSessionDisconnect=0x0000
OP_RAWKeepAlive=0x0000
OP_RAWSessionStatRequest=0x0000
OP_RAWSessionStatResponse=0x0000
OP_RAWPacket=0x0000
OP_RAWFragment=0x0000
OP_RAWOutOfOrderAck=0x0000
OP_RAWAck=0x0000
OP_RAWAppCombined=0x0000
OP_RAWOutOfSession=0x0000
# we need to document the differences between these packets to make identifying them easier
OP_Some3ByteHPUpdate=0x0000 # initial HP update for mobs
OP_InitialHPUpdate=0x0000
@@ -0,0 +1,653 @@
# ShowEQ Import Notes:
# ZERO THE FILE first
# perl -pi -e 's/0x[0-9a-fA-F]{4}/0x0000/g' opcodes.conf
# Unknown Mapping:
# OP_Action2 -> OP_Damage
# OP_EnvDamage -> OP_Damage ---> might have been a one time mistake
# Name Differences:
# OP_CancelInvite -> OP_GroupCancelInvite
# OP_GMFind -> OP_FindPersonRequest
# OP_CommonMessage -> OP_ChannelMessage
OP_Unknown=0x0000
OP_ExploreUnknown=0x0000 used for unknown explorer
# world packets
# Required to reach Char Select:
OP_SendLoginInfo=0x317e
OP_ApproveWorld=0x2ef2
OP_LogServer=0x5b24
OP_SendCharInfo=0x2ad9
OP_ExpansionInfo=0x1a9b
OP_GuildsList=0x6f57
OP_EnterWorld=0x6078
OP_PostEnterWorld=0x0f9f
OP_World_Client_CRC1=0x7978
OP_World_Client_CRC2=0x2b1c
OP_SendSpellChecksum=0x0000
OP_SendSkillCapsChecksum=0x0000
# Character Select Related:
OP_SendMaxCharacters=0x24db
OP_SendMembership=0x57f3
OP_SendMembershipDetails=0x4183
OP_CharacterCreateRequest=0x2cad
OP_CharacterCreate=0x15d7
OP_DeleteCharacter=0x2f9a
OP_RandomNameGenerator=0x4bf8
OP_ApproveName=0x78cc
OP_MOTD=0x282a
OP_SetChatServer=0x3f5e
OP_SetChatServer2=0x6a29
OP_ZoneServerInfo=0x00c9
OP_WorldComplete=0x48e6
OP_WorldUnknown001=0x52d2
OP_FloatListThing=0x2b9c
# Reasons for Disconnect:
OP_ZoneUnavail=0x408a
OP_WorldClientReady=0x45b4
OP_CharacterStillInZone=0x0000
OP_WorldChecksumFailure=0x0000
OP_WorldLoginFailed=0x0000
OP_WorldLogout=0x0000
OP_WorldLevelTooHigh=0x0000
OP_CharInacessable=0x0000
OP_UserCompInfo=0x0000
OP_SendExeChecksum=0x0000
OP_SendBaseDataChecksum=0x0000
# Zone in opcodes
OP_AckPacket=0x46c2
OP_ZoneEntry=0x4a63
OP_ReqNewZone=0x3ff0
OP_NewZone=0x6727
OP_ZoneSpawns=0x1d0a
OP_PlayerProfile=0x6926
OP_TimeOfDay=0x6b7b
OP_LevelUpdate=0x1d84
OP_Stamina=0x5114
OP_RequestClientZoneChange=0x31b0
OP_ZoneChange=0x7951
OP_LockoutTimerInfo=0x0000
OP_ZoneServerReady=0x0000
OP_ZoneInUnknown=0x0000
OP_LogoutReply=0x0000
OP_PreLogoutReply=0x0000
# Required to fully log in
OP_SpawnAppearance=0x3143
OP_ChangeSize=0x70d1
OP_TributeUpdate=0x590f
OP_TributeTimer=0x4590
OP_SendTributes=0x4124
OP_SendGuildTributes=0x1df9
OP_TributeInfo=0x37b0
OP_Weather=0x63f0
OP_ReqClientSpawn=0x37f1
OP_SpawnDoor=0x7e51
OP_GroundSpawn=0x07eb
OP_SendZonepoints=0x0067
OP_BlockedBuffs=0x1375
OP_RemoveBlockedBuffs=0x7996
OP_ClearBlockedBuffs=0x7a20
OP_WorldObjectsSent=0x0ae9
OP_SendExpZonein=0x0380
OP_SendAATable=0x7a7c
OP_RespondAA=0x11a3
OP_UpdateAA=0x4559
OP_SendAAStats=0x32fd
OP_AAExpUpdate=0x24a1
OP_ExpUpdate=0x793d
OP_HPUpdate=0x6598
OP_ManaChange=0x3a19
OP_TGB=0x552e
OP_SpecialMesg=0x7545
OP_GuildMemberList=0x2ef0
OP_GuildMOTD=0x3880
OP_CharInventory=0x4df2
OP_WearChange=0x003a
OP_ClientUpdate=0x47c9
OP_ClientReady=0x7538
OP_SetServerFilter=0x178d
# Guild Opcodes - Disabled until crashes are resolved in RoF
OP_GetGuildMOTD=0x3dfe
OP_GetGuildMOTDReply=0x7bff
OP_GuildMemberUpdate=0x45e4
OP_GuildInvite=0x47d2
OP_GuildRemove=0x245d
OP_GuildPeace=0x71b2
OP_SetGuildMOTD=0x703b
OP_GuildList=0x0000
OP_GuildWar=0x731c
OP_GuildLeader=0x01c6
OP_GuildDelete=0x5592
OP_GuildInviteAccept=0x7fa4
OP_GuildDemote=0x144a
OP_GuildPublicNote=0x44fb
OP_GuildManageBanker=0x769e
OP_GuildBank=0x2591
OP_SetGuildRank=0x4195
OP_GuildUpdateURLAndChannel=0x2df0
OP_GuildStatus=0x6e9e
OP_GuildCreate=0x1544
OP_GuildMemberLevelUpdate=0x0000 # Unused?
OP_ZoneGuildList=0x0000 # Unused?
OP_GetGuildsList=0x0000 # Unused?
OP_LFGuild=0x0000
OP_GuildManageRemove=0x0000
OP_GuildManageAdd=0x0000
OP_GuildManageStatus=0x0000
# GM/Guide Opcodes
OP_GMServers=0x2e1e
OP_GMBecomeNPC=0x1def
OP_GMZoneRequest=0x49ad
OP_GMZoneRequest2=0x54ff
OP_GMGoto=0x35a9
OP_GMSearchCorpse=0x206c
OP_GMHideMe=0x0b62
OP_GMDelCorpse=0x6344
OP_GMApproval=0x35b3
OP_GMToggle=0x3bd7
OP_GMSummon=0x0c58
OP_GMEmoteZone=0x28ab
OP_GMEmoteWorld=0x4903
OP_GMFind=0x0ea3
OP_GMKick=0x5f92
OP_GMKill=0x3b7d
OP_GMNameChange=0x1c3f
OP_GMLastName=0x4ead
# Misc Opcodes
OP_InspectRequest=0x3692
OP_InspectAnswer=0x0af1
OP_InspectMessageUpdate=0x1bc6
OP_BeginCast=0x5df6
OP_BuffFadeMsg=0x569a
OP_ConsentResponse=0x68c2
OP_MemorizeSpell=0x72e2
OP_SwapSpell=0x70c4
OP_CastSpell=0x5c4b
OP_Consider=0x0e31
OP_FormattedMessage=0x3735
OP_SimpleMessage=0x4645
OP_Buff=0x7fb5
OP_Illusion=0x3772
OP_MoneyOnCorpse=0x4ab0
OP_RandomReply=0x76ea
OP_DenyResponse=0x0a88
OP_SkillUpdate=0x2e5f
OP_GMTrainSkillConfirm=0x6692
OP_RandomReq=0x16e6
OP_Death=0x25ad
OP_GMTraining=0x3dcc
OP_GMEndTraining=0x5721
OP_GMTrainSkill=0x38f0
OP_Animation=0x53f6
OP_Begging=0x4d3d
OP_Consent=0x4d7c
OP_ConsentDeny=0x3b03
OP_AutoFire=0x4697
OP_PetCommands=0x574a
OP_DeleteSpell=0x5279
OP_Surname=0x181d
OP_ClearSurname=0x1097
OP_FaceChange=0x59d8
OP_SenseHeading=0x689a
OP_Action=0x280b
OP_ConsiderCorpse=0x6c92
OP_HideCorpse=0x7dea
OP_CorpseDrag=0x338a
OP_CorpseDrop=0x409e
OP_Bug=0x7589
OP_Feedback=0x5d5f
OP_Report=0x521c
OP_Damage=0x5e8a
OP_ChannelMessage=0x1770
OP_Assist=0x7021
OP_AssistGroup=0x6668
OP_MoveCoin=0x6a56
OP_ZonePlayerToBind=0x859e
OP_KeyRing=0x7613
OP_WhoAllRequest=0x1d64
OP_WhoAllResponse=0x20aa
OP_FriendsWho=0x527c
OP_ConfirmDelete=0x3221
OP_Logout=0x4e12
OP_Rewind=0x44d0
OP_TargetCommand=0x726c
OP_Hide=0x23f2
OP_Jump=0x3dbc
OP_Camp=0x2ca2
OP_Emote=0x314d
OP_SetRunMode=0x276f
OP_BankerChange=0x21b0
OP_TargetMouse=0x3605
OP_MobHealth=0x1949
OP_InitialMobHealth=0x0000 # Unused?
OP_TargetHoTT=0x1be6
OP_XTargetResponse=0x0ad9
OP_XTargetRequest=0x3034
OP_XTargetAutoAddHaters=0x7efd
OP_TargetBuffs=0x5e3b
OP_BuffCreate=0x51da
OP_BuffRemoveRequest=0x6ce2
OP_DeleteSpawn=0x0ef8
OP_AutoAttack=0x577f
OP_AutoAttack2=0x4f56
OP_Consume=0x7cca
OP_MoveItem=0x5ba6
OP_DeleteItem=0x36dd
OP_DeleteCharge=0x6ec3
OP_ItemPacket=0x75b5
OP_ItemLinkResponse=0x5fa8
OP_ItemLinkClick=0x0b40
OP_ItemPreview=0x2688
OP_NewSpawn=0x7cde
OP_Track=0x2f78
OP_TrackTarget=0x74dc
OP_TrackUnknown=0x3127
OP_ClickDoor=0x2b55
OP_MoveDoor=0x5e21
OP_RemoveAllDoors=0x73b3
OP_EnvDamage=0x21da
OP_BoardBoat=0x1372
OP_Forage=0x0d91
OP_LeaveBoat=0x7582
OP_ControlBoat=0x5d0e
OP_SafeFallSuccess=0x317f
OP_RezzComplete=0x017b
OP_RezzRequest=0x21a1
OP_RezzAnswer=0x21ce
OP_Shielding=0x17d3
OP_RequestDuel=0x4870
OP_MobRename=0x3a4e
OP_AugmentItem=0x3d13
OP_WeaponEquip1=0x6041
OP_WeaponEquip2=0x23f7
OP_WeaponUnequip2=0x4078
OP_ApplyPoison=0x099a
OP_Save=0x1361
OP_TestBuff=0x478a
OP_CustomTitles=0x6115
OP_Split=0x617f
OP_YellForHelp=0x40d4
OP_LoadSpellSet=0x0680
OP_Bandolier=0x1627
OP_PotionBelt=0x3208
OP_DuelResponse=0x0d3b
OP_DuelResponse2=0x24e0
OP_SaveOnZoneReq=0x13af
OP_ReadBook=0x641b
OP_Dye=0x401f
OP_InterruptCast=0x27e0
OP_AAAction=0x2eae
OP_LeadershipExpToggle=0x0f66
OP_LeadershipExpUpdate=0x3791
OP_PurchaseLeadershipAA=0x2c3e
OP_UpdateLeadershipAA=0x18ef
OP_MarkNPC=0x3093
OP_ClearNPCMarks=0x1404
OP_DelegateAbility=0x29a8
OP_SetGroupTarget=0x7b9f
OP_Charm=0x1c1f
OP_Stun=0x45e0
OP_SendFindableNPCs=0x62da
OP_FindPersonRequest=0x41fb
OP_FindPersonReply=0x23e2
OP_Sound=0x622a
OP_PetBuffWindow=0x53f8
OP_LevelAppearance=0x5b03
OP_Translocate=0x5e10
OP_Sacrifice=0x2ee4
OP_PopupResponse=0x7f5e
OP_OnLevelMessage=0x1ef3
OP_AugmentInfo=0x0000
OP_Petition=0x71e3
OP_SomeItemPacketMaybe=0x1f4c
OP_PVPStats=0x1937 # Unsure
OP_PVPLeaderBoardRequest=0x739b
OP_PVPLeaderBoardReply=0x5c62
OP_PVPLeaderBoardDetailsRequest=0x4ce0
OP_PVPLeaderBoardDetailsReply=0x2a52
OP_RestState=0x2342
OP_RespawnWindow=0x3f23
OP_LDoNButton=0x3820
OP_SetStartCity=0x5d81
OP_VoiceMacroIn=0x3144
OP_VoiceMacroOut=0x75ed
OP_ItemViewUnknown=0x6cc1
OP_VetRewardsAvaliable=0x67a6
OP_VetClaimRequest=0x23e7
OP_VetClaimReply=0x23eb
OP_DisciplineUpdate=0x5010
OP_DisciplineTimer=0x0673
OP_BecomeCorpse=0x0000 # Unused?
OP_Action2=0x0000 # Unused?
OP_MobUpdate=0x710b
OP_NPCMoveUpdate=0x51e9
OP_CameraEffect=0x7a73
OP_SpellEffect=0x30b6
OP_RemoveNimbusEffect=0x1fb3
OP_AltCurrency=0x32db
OP_AltCurrencyMerchantRequest=0x6588
OP_AltCurrencyMerchantReply=0x393c
OP_AltCurrencyPurchase=0x43e8
OP_AltCurrencySell=0x2c40
OP_AltCurrencySellSelection=0x0eec
OP_AltCurrencyReclaim=0x0fbc
OP_CrystalCountUpdate=0x5cd9
OP_CrystalCreate=0x0e4b
OP_CrystalReclaim=0x6506
OP_Untargetable=0x3859
OP_IncreaseStats=0x22b9
OP_Weblink=0x2d92
#OP_OpenInventory=0x0000 # Likely does not exist in RoF -U
OP_OpenContainer=0x0000
OP_DzQuit=0x20fb
OP_DzListTimers=0x50c1
OP_DzAddPlayer=0x06e0
OP_DzRemovePlayer=0x90ca
OP_DzSwapPlayer=0x6461
OP_DzMakeLeader=0x599d
OP_DzPlayerList=0x6dfb
OP_DzJoinExpeditionConfirm=0x3e9d
OP_DzJoinExpeditionReply=0x25b7
OP_DzExpeditionInfo=0x56a8
OP_DzExpeditionList=0x6171
OP_DzMemberStatus=0x52d9
OP_DzLeaderStatus=0x7b38
OP_DzExpeditionEndsWarning=0x26c5
OP_DzMemberList=0x59e2
OP_DzCompass=0x3435
OP_DzChooseZone=0x0000
# New Opcodes
OP_SpawnPositionUpdate=0x0000 # Actually OP_MobUpdate ?
OP_ManaUpdate=0x06bc
OP_EnduranceUpdate=0x4e20
OP_MobManaUpdate=0x4738
OP_MobEnduranceUpdate=0x6519
# Mercenary Opcodes
OP_MercenaryDataUpdateRequest=0x3a44
OP_MercenaryDataUpdate=0x6c75
OP_MercenaryDataRequest=0x4b77
OP_MercenaryDataResponse=0x69a0
OP_MercenaryHire=0x49cd
OP_MercenaryDismiss=0x74bd
OP_MercenaryTimer=0x34df
OP_MercenaryTimerRequest=0x5f36
OP_MercenaryUnknown1=0x305c
OP_MercenaryCommand=0x2131
OP_MercenarySuspendRequest=0x53e8
OP_MercenarySuspendResponse=0x277d
OP_MercenaryUnsuspendResponse=0x6ccc
# Looting
OP_LootRequest=0x396f
OP_EndLootRequest=0x12a6
OP_LootItem=0x7e1d
OP_LootComplete=0x46e8
# bazaar trader stuff:
OP_BazaarSearch=0x0962
OP_TraderDelItem=0x0000
OP_BecomeTrader=0x3360
OP_TraderShop=0x67f9
OP_Trader=0x3f87
OP_TraderBuy=0x0000
OP_Barter=0x14b0
OP_ShopItem=0x0000
OP_BazaarInspect=0x0000
OP_Bazaar=0x0000
OP_TraderItemUpdate=0x0000
# pc/npc trading
OP_TradeRequest=0x1695
OP_TradeAcceptClick=0x0ecc
OP_TradeRequestAck=0x6489
OP_TradeCoins=0x35eb
OP_FinishTrade=0x6897
OP_CancelTrade=0x7e73
OP_TradeMoneyUpdate=0x5857
OP_MoneyUpdate=0x2044
OP_TradeBusy=0x5ee9
# Sent after canceling trade or after closing tradeskill object
OP_FinishWindow=0x00ef
OP_FinishWindow2=0x7e90
# Sent on Live for what seems to be item existance verification
# Ex. Before Right Click Effect happens from items
OP_ItemVerifyRequest=0x3d17
OP_ItemVerifyReply=0x0f0e
# merchant stuff
OP_ShopPlayerSell=0x1650
OP_ShopRequest=0x6dab
OP_ShopEnd=0x44f1
OP_ShopEndConfirm=0x07ad
OP_ShopPlayerBuy=0x7d9b
OP_ShopDelItem=0x2cec
# tradeskill stuff:
OP_ClickObject=0x4370
OP_ClickObjectAction=0x0883
OP_ClearObject=0x4dd6
OP_RecipeDetails=0x584c
OP_RecipesFavorite=0x2e74
OP_RecipesSearch=0x41ee
OP_RecipeReply=0x1d46
OP_RecipeAutoCombine=0x413d
OP_TradeSkillCombine=0x268f
# Tribute Packets:
OP_OpenGuildTributeMaster=0x4b72
OP_OpenTributeMaster=0x58fb
OP_SelectTribute=0x3cb7
OP_TributeItem=0x796f
OP_TributeMoney=0x7bed
OP_TributeToggle=0x448c
OP_TributePointUpdate=0x0ca7
OP_TributeNPC=0x0000
OP_GuildTributeInfo=0x0000
OP_OpenTributeReply=0x0000
OP_GuildTributeStatus=0x0000
# Adventure packets:
OP_LeaveAdventure=0x37bd
OP_AdventureFinish=0x2ebd
OP_AdventureInfoRequest=0x258e
OP_AdventureInfo=0x5df3
OP_AdventureRequest=0x078c
OP_AdventureDetails=0x451d
OP_AdventureData=0x10da
OP_AdventureUpdate=0x38bc
OP_AdventureMerchantRequest=0x4958
OP_AdventureMerchantResponse=0x71ab
OP_AdventureMerchantPurchase=0x207d
OP_AdventureMerchantSell=0x3307
OP_AdventurePointsUpdate=0x0a93
OP_AdventureStatsRequest=0x1b35
OP_AdventureStatsReply=0x4cce
OP_AdventureLeaderboardRequest=0x4ac4
OP_AdventureLeaderboardReply=0x71c1
# Group Opcodes
OP_GroupDisband=0x4039
OP_GroupInvite=0x3b75
OP_GroupFollow=0x3158
OP_GroupUpdate=0x6b4e
OP_GroupUpdateB=0x39c3
OP_GroupCancelInvite=0x0000
OP_GroupAcknowledge=0x4013
OP_GroupDelete=0x2fb9
OP_CancelInvite=0x4ea4
OP_GroupFollow2=0x396c
OP_GroupInvite2=0x4cc2
OP_GroupDisbandYou=0x739a
OP_GroupDisbandOther=0x416d
OP_GroupLeaderChange=0x3153
OP_GroupRoles=0x3d35
OP_GroupMakeLeader=0x77a0
OP_DoGroupLeadershipAbility=0x0c82
OP_GroupLeadershipAAUpdate=0x4d85
# LFG/LFP Opcodes
OP_LFGCommand=0x370c
OP_LFGGetMatchesRequest=0x54e8
OP_LFGGetMatchesResponse=0x444a
OP_LFPGetMatchesRequest=0x55d6
OP_LFPGetMatchesResponse=0x0928
OP_LFPCommand=0x1df7
OP_LFGAppearance=0x0000
OP_LFGResponse=0x0000
# Raid Opcodes
OP_RaidInvite=0x7e7e
OP_RaidUpdate=0x1c5a
OP_RaidJoin=0x0000
# Button-push commands
OP_Taunt=0x4798
OP_CombatAbility=0x182d
OP_SenseTraps=0x3662
OP_PickPocket=0x23c8
OP_DisarmTraps=0x0000
OP_Disarm=0x0bc6
OP_Sneak=0x54a4
OP_Fishing=0x1e3b
OP_InstillDoubt=0x5a3f
OP_FeignDeath=0x7bb7
OP_Mend=0x56fb
OP_Bind_Wound=0x174b
OP_LDoNOpen=0x139f
# Task packets
OP_TaskDescription=0x1eac
OP_TaskActivity=0x4423
OP_CompletedTasks=0x7046
OP_TaskActivityComplete=0x7eee
OP_AcceptNewTask=0x3d60
OP_CancelTask=0x26a8
OP_TaskMemberList=0x411e
OP_OpenNewTasksWindow=0x2633
OP_AvaliableTask=0x05cc
OP_TaskHistoryRequest=0x72e1
OP_TaskHistoryReply=0x0c1e
OP_DeclineAllTasks=0x0000
# Title opcodes
OP_NewTitlesAvailable=0x201f
OP_RequestTitles=0x6034
OP_SendTitleList=0x2142
OP_SetTitle=0x740d
OP_SetTitleReply=0x3196
# mail opcodes
OP_Command=0x0000
OP_MailboxHeader=0x0000
OP_MailHeader=0x0000
OP_MailBody=0x0000
OP_NewMail=0x0000
OP_SentConfirm=0x0000
########### Below this point should not be needed ###########
# This section are all unknown in Titanium
OP_ForceFindPerson=0x0000
OP_LocInfo=0x0000
OP_ReloadUI=0x0000
OP_ItemName=0x0000
OP_ItemLinkText=0x0000
OP_MultiLineMsg=0x0000
OP_MendHPUpdate=0x0000
OP_TargetReject=0x0000
OP_SafePoint=0x0000
OP_ApproveZone=0x0000
OP_ZoneComplete=0x0000
OP_ClientError=0x0000
OP_DumpName=0x0000
OP_Heartbeat=0x0000
OP_CrashDump=0x0000
OP_LoginComplete=0x0000
# discovered opcodes not yet used:
OP_PickLockSuccess=0x0000
OP_PlayMP3=0x0000
OP_ReclaimCrystals=0x0000
OP_DynamicWall=0x0000
OP_OpenDiscordMerchant=0x0000
OP_DiscordMerchantInventory=0x0000
OP_GiveMoney=0x0000
OP_RequestKnowledgeBase=0x0000
OP_KnowledgeBase=0x0000
OP_SlashAdventure=0x0000 # /adventure
OP_BecomePVPPrompt=0x0000
OP_MoveLogRequest=0x0000 # gone I think
OP_MoveLogDisregard=0x0000 # gone I think
# named unknowns, to make looking for real unknown easier
OP_AnnoyingZoneUnknown=0x0000
OP_Some6ByteHPUpdate=0x0000 seems to happen when you target group members
OP_QueryResponseThing=0x0000
# realityincarnate: these are just here to stop annoying several thousand byte packet dumps
#OP_LoginUnknown1=0x46d3 # OP_SendSpellChecksum
#OP_LoginUnknown2=0x040b # OP_SendSkillCapsChecksum
# Petition Opcodes
OP_PetitionSearch=0x0000 search term for petition
OP_PetitionSearchResults=0x0000 (list of?) matches from search
OP_PetitionSearchText=0x0000 text results of search
OP_PetitionUpdate=0x0000
OP_PetitionCheckout=0x0000
OP_PetitionCheckIn=0x0000
OP_PetitionQue=0x0000
OP_PetitionUnCheckout=0x0000
OP_PetitionDelete=0x0000
OP_DeletePetition=0x0000
OP_PetitionResolve=0x0000
OP_PDeletePetition=0x0000
OP_PetitionBug=0x0000
OP_PetitionRefresh=0x0000
OP_PetitionCheckout2=0x0000
OP_PetitionViewPetition=0x0000
# Login opcodes
OP_SessionReady=0x0000
OP_Login=0x0000
OP_ServerListRequest=0x0000
OP_PlayEverquestRequest=0x0000
OP_PlayEverquestResponse=0x0000
OP_ChatMessage=0x0000
OP_LoginAccepted=0x0000
OP_ServerListResponse=0x0000
OP_Poll=0x0000
OP_EnterChat=0x0000
OP_PollResponse=0x0000
# raw opcodes
OP_RAWSessionRequest=0x0000
OP_RAWSessionResponse=0x0000
OP_RAWCombined=0x0000
OP_RAWSessionDisconnect=0x0000
OP_RAWKeepAlive=0x0000
OP_RAWSessionStatRequest=0x0000
OP_RAWSessionStatResponse=0x0000
OP_RAWPacket=0x0000
OP_RAWFragment=0x0000
OP_RAWOutOfOrderAck=0x0000
OP_RAWAck=0x0000
OP_RAWAppCombined=0x0000
OP_RAWOutOfSession=0x0000
# we need to document the differences between these packets to make identifying them easier
OP_Some3ByteHPUpdate=0x0000 # initial HP update for mobs
OP_InitialHPUpdate=0x0000