mirror of
https://github.com/EQEmu/Server.git
synced 2026-05-16 18:52:22 +00:00
svn -> git Migration
This commit is contained in:
@@ -0,0 +1,22 @@
|
||||
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
|
||||
|
||||
IF(UNIX)
|
||||
ADD_DEFINITIONS(-fPIC)
|
||||
ENDIF(UNIX)
|
||||
|
||||
IF(UNIX AND EQEMU_BUILD_CLEANIPC)
|
||||
SET(cleanipc_sources
|
||||
cleanipc.cpp
|
||||
)
|
||||
|
||||
SET(cleanipc_headers
|
||||
)
|
||||
|
||||
ADD_EXECUTABLE(cleanipc ${cleanipc_sources} ${cleanipc_headers})
|
||||
TARGET_LINK_LIBRARIES(cleanipc "rt")
|
||||
SET(EXECUTABLE_OUTPUT_PATH ../Bin)
|
||||
ENDIF(UNIX AND EQEMU_BUILD_CLEANIPC)
|
||||
|
||||
IF(EQEMU_BUILD_AZONE)
|
||||
ADD_SUBDIRECTORY(azone2)
|
||||
ENDIF(EQEMU_BUILD_AZONE)
|
||||
@@ -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>
|
||||
@@ -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
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
@@ -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>
|
||||
@@ -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
|
||||
@@ -0,0 +1,21 @@
|
||||
Microsoft Visual Studio Solution File, Format Version 8.00
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "EQEmuWxProject", "EQEmuWxProject.vcproj", "{5D3FC402-F6D9-49B7-8ABF-18F66E91AB6B}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfiguration) = preSolution
|
||||
Debug = Debug
|
||||
Release = Release
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfiguration) = postSolution
|
||||
{5D3FC402-F6D9-49B7-8ABF-18F66E91AB6B}.Debug.ActiveCfg = Debug|Win32
|
||||
{5D3FC402-F6D9-49B7-8ABF-18F66E91AB6B}.Debug.Build.0 = Debug|Win32
|
||||
{5D3FC402-F6D9-49B7-8ABF-18F66E91AB6B}.Release.ActiveCfg = Release|Win32
|
||||
{5D3FC402-F6D9-49B7-8ABF-18F66E91AB6B}.Release.Build.0 = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityAddIns) = postSolution
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
@@ -0,0 +1,170 @@
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="7.10"
|
||||
Name="EQEmuWxProject"
|
||||
ProjectGUID="{5D3FC402-F6D9-49B7-8ABF-18F66E91AB6B}"
|
||||
Keyword="Win32Proj">
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"/>
|
||||
</Platforms>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory="Debug"
|
||||
IntermediateDirectory="Debug"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
||||
MinimalRebuild="TRUE"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="5"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="TRUE"
|
||||
DebugInformationFormat="4"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
OutputFile="$(OutDir)/EQEmuWxProject.exe"
|
||||
LinkIncremental="2"
|
||||
GenerateDebugInformation="TRUE"
|
||||
ProgramDatabaseFile="$(OutDir)/EQEmuWxProject.pdb"
|
||||
SubSystem="1"
|
||||
TargetMachine="1"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory="Release"
|
||||
IntermediateDirectory="Release"
|
||||
ConfigurationType="1"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
PreprocessorDefinitions="WIN32;__WXMSW__;_WINDOWS;NOPCH"
|
||||
RuntimeLibrary="2"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="3"
|
||||
Detect64BitPortabilityProblems="TRUE"
|
||||
DebugInformationFormat="3"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
AdditionalDependencies="libmysql.lib wxmsw28_core.lib wxbase28.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregex.lib wxexpat.lib winmm.lib comctl32.lib rpcrt4.lib wsock32.lib odbc32.lib"
|
||||
OutputFile="$(OutDir)/TaskMaster.exe"
|
||||
LinkIncremental="1"
|
||||
AdditionalLibraryDirectories="C:\Documents and Settings\Golgie\My Documents\wxWidgets\wxWidgets-2.8.9\lib\vc_lib"
|
||||
GenerateDebugInformation="TRUE"
|
||||
SubSystem="1"
|
||||
OptimizeReferences="2"
|
||||
EnableCOMDATFolding="2"
|
||||
TargetMachine="1"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCWebDeploymentTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
||||
<File
|
||||
RelativePath=".\activities.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\base.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\base_utility.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\ErrorLog.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\goals.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\proximity.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\tasks.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\utility.cpp">
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
||||
<File
|
||||
RelativePath=".\base.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\ErrorLog.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\items.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\tasks.h">
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\utility.h">
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Resource Files"
|
||||
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
|
||||
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
||||
@@ -0,0 +1,71 @@
|
||||
#include <time.h>
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include "ErrorLog.h"
|
||||
|
||||
|
||||
EQEmuErrorLog::EQEmuErrorLog()
|
||||
{
|
||||
mErrorLog = NULL;
|
||||
mErrorLog = fopen(LOG_FILE_NAME, "w");
|
||||
if(!mErrorLog) {
|
||||
Log(eqEmuLogConsole,"Opening of %s for writing failed, debug output will be tied to console only.", LOG_FILE_NAME);
|
||||
}
|
||||
else
|
||||
Log(eqEmuLogBoth, "EQEmuErrorLog Init Successful.");
|
||||
|
||||
mErrorLogSQL = NULL;
|
||||
mErrorLogSQL = fopen(SQL_LOG_FILE_NAME, "a");
|
||||
if(!mErrorLog) {
|
||||
Log(eqEmuLogConsole, "SQL Log Init FAILED, %s could not be opened for writing", SQL_LOG_FILE_NAME);
|
||||
}
|
||||
else
|
||||
{
|
||||
Log(eqEmuLogConsole, "SQL Log Init Complete");
|
||||
}
|
||||
|
||||
}
|
||||
EQEmuErrorLog::~EQEmuErrorLog()
|
||||
{
|
||||
Log(eqEmuLogBoth, "EQEmuErrorLog Shutdown.");
|
||||
if(mErrorLog) {
|
||||
fclose(mErrorLog);
|
||||
mErrorLog = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void EQEmuErrorLog::Log(unsigned int mOutputType, const char *msg, ...)
|
||||
{
|
||||
va_list argptr;
|
||||
char *buffer = new char[MAX_LOG_LEN];
|
||||
|
||||
va_start(argptr, msg);
|
||||
_vsnprintf(buffer, MAX_LOG_LEN, msg, argptr);
|
||||
va_end(argptr);
|
||||
|
||||
time_t mClock;
|
||||
struct tm *mTime;
|
||||
time(&mClock);
|
||||
mTime = localtime(&mClock);
|
||||
|
||||
if(mOutputType & eqEmuLogConsole){
|
||||
printf("[Debug] [%02d.%02d.%02d - %02d:%02d:%02d] %s\n", mTime->tm_mon+1, mTime->tm_mday, mTime->tm_year%100, mTime->tm_hour, mTime->tm_min, mTime->tm_sec, buffer);
|
||||
}
|
||||
|
||||
if(mOutputType & eqEmuLogFile){
|
||||
if(mErrorLog){
|
||||
fprintf(mErrorLog, "[%02d.%02d.%02d - %02d:%02d:%02d] %s\n", mTime->tm_mon+1, mTime->tm_mday, mTime->tm_year%100, mTime->tm_hour, mTime->tm_min, mTime->tm_sec, buffer);
|
||||
}
|
||||
}
|
||||
|
||||
if(mOutputType & eqEmuLogSQL)
|
||||
{
|
||||
if(mErrorLogSQL){
|
||||
fprintf(mErrorLogSQL, "# [%02d.%02d.%02d - %02d:%02d:%02d]\n", mTime->tm_mon+1, mTime->tm_mday, mTime->tm_year%100, mTime->tm_hour, mTime->tm_min, mTime->tm_sec);
|
||||
fprintf(mErrorLogSQL, "%s;\n\n", buffer);
|
||||
}
|
||||
}
|
||||
|
||||
if(buffer)
|
||||
delete[] buffer;
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
#ifndef EQWX_ERRORLOG__H
|
||||
#define EQWX_ERRORLOG__H
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
//Log options
|
||||
enum{
|
||||
eqEmuLogConsole = 1,
|
||||
eqEmuLogFile = 2,
|
||||
eqEmuLogSQL = 4,
|
||||
eqEmuLogBoth = (eqEmuLogConsole | eqEmuLogFile),
|
||||
};
|
||||
|
||||
//log file output
|
||||
#define LOG_FILE_NAME "debug.txt"
|
||||
#define SQL_LOG_FILE_NAME "sql_log.sql"
|
||||
|
||||
//max single log length
|
||||
//same as a client:message() max len
|
||||
#define MAX_LOG_LEN 4096
|
||||
|
||||
//much simplified logging function, similar to the one used on the server (Tho much simpler)
|
||||
class EQEmuErrorLog {
|
||||
public:
|
||||
|
||||
EQEmuErrorLog();
|
||||
~EQEmuErrorLog();
|
||||
void Log(unsigned int mOutputType, const char *msg, ...);
|
||||
private:
|
||||
FILE* mErrorLog;
|
||||
FILE* mErrorLogSQL;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,648 @@
|
||||
#include <wx/wx.h>
|
||||
#include <mysql.h>
|
||||
#include <vector>
|
||||
#include "tasks.h"
|
||||
#include "utility.h"
|
||||
#include "base.h"
|
||||
#include "ErrorLog.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
void MainFrame::ActivitiesListBoxSimpleSelect(wxCommandEvent& event)
|
||||
{
|
||||
eqtask_activity_id *eqaid;
|
||||
eqaid = (eqtask_activity_id*)ActivitiesSelectionList->GetClientData(event.GetInt());
|
||||
if(eqaid){
|
||||
}
|
||||
else{
|
||||
mErrorLog->Log(eqEmuLogBoth, "Error selected a NULL activity object!");
|
||||
}
|
||||
}
|
||||
|
||||
void MainFrame::ActivitiesListBoxDoubleClick(wxCommandEvent& event)
|
||||
{
|
||||
eqtask_activity_id *eqaid;
|
||||
eqaid = (eqtask_activity_id*)ActivitiesSelectionList->GetClientData(event.GetInt());
|
||||
if(eqaid){
|
||||
openedActivity.activityid = eqaid->activityid;
|
||||
openedActivity.id = eqaid->id;
|
||||
openedActivity.step = eqaid->step;
|
||||
|
||||
FillActivity(eqaid->id, eqaid->activityid, eqaid->step);
|
||||
mActText1->Enable();
|
||||
mActText2->Enable();
|
||||
mActText3->Enable();
|
||||
mActivityZone->Enable();
|
||||
mActivityOptional->Enable();
|
||||
mActID->Enable();
|
||||
mActStep->Enable();
|
||||
mActType->Enable();
|
||||
mActDeliver->Enable();
|
||||
mActMethod->Enable();
|
||||
mActGoalID->Enable();
|
||||
mActGoalCount->Enable();
|
||||
}
|
||||
else{
|
||||
mErrorLog->Log(eqEmuLogBoth, "Error double clicked a NULL activity object!");
|
||||
}
|
||||
}
|
||||
|
||||
void MainFrame::NewActivity(wxCommandEvent& event)
|
||||
{
|
||||
if(!mMysql)
|
||||
return;
|
||||
|
||||
if(openedIndex == -1)
|
||||
return;
|
||||
|
||||
mErrorLog->Log(eqEmuLogBoth, "Creating new activity...");
|
||||
eqtask_activities newAct;
|
||||
eqtask curTask;
|
||||
|
||||
mErrorLog->Log(eqEmuLogBoth, "Opened Index %u", openedIndex);
|
||||
vector<eqtask>::iterator tIter = taskList.begin();
|
||||
tIter += openedIndex;
|
||||
curTask = *tIter;
|
||||
|
||||
vector<eqtask_activities>::iterator Iter;
|
||||
unsigned int highestId = 0;
|
||||
bool zeroExists;
|
||||
if(!taskActivitiesList.empty()){
|
||||
for(Iter = taskActivitiesList.begin(); Iter != taskActivitiesList.end(); Iter++)
|
||||
{
|
||||
eqtask_activities curAct = *Iter;
|
||||
if(curAct.id == curTask.id){
|
||||
if(curAct.activityId == 0)
|
||||
zeroExists = true;
|
||||
|
||||
if(curAct.activityId > highestId){
|
||||
highestId = curAct.activityId;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
mErrorLog->Log(eqEmuLogBoth, "Highest id: %u", highestId);
|
||||
|
||||
if(highestId == 0)
|
||||
{
|
||||
if(zeroExists)
|
||||
{
|
||||
newAct.activityId = highestId+1;
|
||||
}
|
||||
else
|
||||
{
|
||||
newAct.activityId = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
newAct.activityId = highestId+1;
|
||||
}
|
||||
|
||||
newAct.id = curTask.id;
|
||||
newAct.zoneid = curTask.startzone;
|
||||
newAct.activityType = 0;
|
||||
newAct.deliverToNpc = 0;
|
||||
newAct.goalcount = 0;
|
||||
newAct.goalid = 0;
|
||||
newAct.goalmethod = 2;
|
||||
newAct.optional = false;
|
||||
newAct.step = 0;
|
||||
strcpy(newAct.text1, "");
|
||||
strcpy(newAct.text2, "");
|
||||
strcpy(newAct.text3, "");
|
||||
|
||||
taskActivitiesList.push_back(newAct);
|
||||
|
||||
eqtask_activity_id * eqaid = new eqtask_activity_id;
|
||||
eqaid->id = newAct.id;
|
||||
eqaid->step = 0;
|
||||
eqaid->activityid = newAct.activityId;
|
||||
|
||||
wxString taskStr;
|
||||
taskStr.Printf("Step: %u", 0);
|
||||
ActivitiesSelectionList->Append(taskStr, (void*)eqaid);
|
||||
taskStr.clear();
|
||||
|
||||
if(mMysql){
|
||||
char * mActQuery = 0;
|
||||
MakeAnyLenString(&mActQuery, "INSERT INTO `activities` (`taskid`,`activityid`,`step`,`activitytype`,`text1`,`text2`,`text3`,`goalid`,`goalmethod`,`goalcount`,`delivertonpc`,`zoneid`,`optional`) VALUES (%u,%u,%u,%u,'%s','%s','%s',%u,%u,%u,%u,%u,%u)",
|
||||
newAct.id, newAct.activityId, newAct.step, newAct.activityType, newAct.text1, newAct.text2, newAct.text3, newAct.goalid, newAct.goalmethod, newAct.goalcount, newAct.deliverToNpc, newAct.zoneid, newAct.optional );
|
||||
|
||||
mErrorLog->Log(eqEmuLogSQL, "%s", mActQuery);
|
||||
if (mysql_query(mMysql, mActQuery)) {
|
||||
mErrorLog->Log(eqEmuLogBoth, "MySQL Error: %s", mysql_error(mMysql));
|
||||
}
|
||||
}
|
||||
else{
|
||||
mErrorLog->Log(eqEmuLogBoth, "Mysql not connected for activity creation.");
|
||||
}
|
||||
}
|
||||
|
||||
void MainFrame::DeleteActivity(wxCommandEvent& event)
|
||||
{
|
||||
if(!mMysql){
|
||||
mErrorLog->Log(eqEmuLogBoth, "Mysql not connected for delete activity");
|
||||
return;
|
||||
}
|
||||
|
||||
if(ActivitiesSelectionList->GetCount() == 0){
|
||||
mErrorLog->Log(eqEmuLogBoth, "No activities in list to select for delete");
|
||||
return;
|
||||
}
|
||||
|
||||
int reply = wxMessageBox("Are you sure?", "Confirm Delete", wxYES_NO, this);
|
||||
if(reply != wxYES)
|
||||
{
|
||||
mErrorLog->Log(eqEmuLogBoth, "User aborted delete of activity.");
|
||||
return;
|
||||
}
|
||||
|
||||
eqtask_activity_id *selAct = (eqtask_activity_id*)ActivitiesSelectionList->GetClientData(ActivitiesSelectionList->GetSelection());
|
||||
unsigned int aid = selAct->activityid;
|
||||
unsigned int tid = selAct->id;
|
||||
|
||||
if(selAct)
|
||||
{
|
||||
if(mMysql){
|
||||
char * mActQuery = 0;
|
||||
MakeAnyLenString(&mActQuery, "DELETE FROM activities WHERE taskid=%u AND activityid=%u",selAct->id, selAct->activityid);
|
||||
mErrorLog->Log(eqEmuLogSQL, "%s", mActQuery);
|
||||
if (mysql_query(mMysql, mActQuery)) {
|
||||
mErrorLog->Log(eqEmuLogBoth, "MySQL Error: %s", mysql_error(mMysql));
|
||||
return;
|
||||
}
|
||||
}
|
||||
else{
|
||||
mErrorLog->Log(eqEmuLogBoth, "No mysql connection for delete");
|
||||
}
|
||||
|
||||
for(unsigned int i = 0; i < ActivitiesSelectionList->GetCount(); i++)
|
||||
{
|
||||
eqtask_activity_id * id = (eqtask_activity_id*)ActivitiesSelectionList->GetClientData(i);
|
||||
if(id){
|
||||
if(id->activityid == selAct->activityid && id->id == selAct->id)
|
||||
{
|
||||
if(openedActivity.activityid == selAct->activityid && openedActivity.id == selAct->id)
|
||||
{
|
||||
mActText1->Clear();
|
||||
mActText1->Disable();
|
||||
|
||||
mActText2->Clear();
|
||||
mActText2->Disable();
|
||||
|
||||
mActText3->Clear();
|
||||
mActText3->Disable();
|
||||
|
||||
mActivityZone->Select(0);
|
||||
mActivityZone->Disable();
|
||||
|
||||
mActivityOptional->SetValue(false);
|
||||
mActivityOptional->Disable();
|
||||
|
||||
mActID->Clear();
|
||||
mActID->Disable();
|
||||
|
||||
mActStep->Clear();
|
||||
mActStep->Disable();
|
||||
|
||||
mActType->Select(0);
|
||||
mActType->Disable();
|
||||
|
||||
mActDeliver->Clear();
|
||||
mActDeliver->Disable();
|
||||
|
||||
mActMethod->Select(2);
|
||||
mActMethod->Disable();
|
||||
|
||||
mActGoalID->Clear();
|
||||
mActGoalID->Disable();
|
||||
|
||||
mActGoalCount->Clear();
|
||||
mActGoalCount->Disable();
|
||||
}
|
||||
|
||||
mErrorLog->Log(eqEmuLogBoth, "Erasing Activity Selection");
|
||||
ActivitiesSelectionList->Delete(i);
|
||||
delete id;
|
||||
mErrorLog->Log(eqEmuLogBoth, "Erased..");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
vector<eqtask_activities>::iterator Iter;
|
||||
for(Iter = taskActivitiesList.begin(); Iter!=taskActivitiesList.end(); Iter++)
|
||||
{
|
||||
eqtask_activities curAct = *Iter;
|
||||
if(curAct.activityId == aid && curAct.id == tid){
|
||||
mErrorLog->Log(eqEmuLogBoth, "Erasing Activity Iterator");
|
||||
taskActivitiesList.erase(Iter);
|
||||
mErrorLog->Log(eqEmuLogBoth, "Erased..");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
mErrorLog->Log(eqEmuLogBoth, "No activity selected for delete.");
|
||||
}
|
||||
}
|
||||
|
||||
void MainFrame::PopulateActivities()
|
||||
{
|
||||
int taskId = -1;
|
||||
mErrorLog->Log(eqEmuLogBoth, "Populating activities...");
|
||||
vector<eqtask>::iterator Iter;
|
||||
int index = 0;
|
||||
for(Iter = taskList.begin(); Iter != taskList.end(); Iter++)
|
||||
{
|
||||
if(index == openedIndex){
|
||||
eqtask eqt = *Iter;
|
||||
taskId = eqt.id;
|
||||
break;
|
||||
}
|
||||
index++;
|
||||
}
|
||||
|
||||
if(taskId > -1){
|
||||
vector<eqtask_activities>::iterator aIter;
|
||||
for(aIter = taskActivitiesList.begin(); aIter != taskActivitiesList.end(); aIter++)
|
||||
{
|
||||
eqtask_activities eqta = *aIter;
|
||||
if(eqta.id == taskId){
|
||||
eqtask_activity_id * eqaid = new eqtask_activity_id;
|
||||
|
||||
eqaid->id = eqta.id;
|
||||
eqaid->step = eqta.step;
|
||||
eqaid->activityid = eqta.activityId;
|
||||
|
||||
wxString taskStr;
|
||||
taskStr.Printf("Step: %u", eqta.step);
|
||||
ActivitiesSelectionList->Append(taskStr, (void*)eqaid);
|
||||
taskStr.clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MainFrame::ClearActivities()
|
||||
{
|
||||
mErrorLog->Log(eqEmuLogBoth, "Clearing activities...");
|
||||
for(unsigned int x = 0; x < ActivitiesSelectionList->GetCount(); x++)
|
||||
{
|
||||
eqtask_activity_id *eqaid = (eqtask_activity_id*)ActivitiesSelectionList->GetClientData(x);
|
||||
if(eqaid)
|
||||
{
|
||||
mErrorLog->Log(eqEmuLogBoth, "Delete of activity index: %u (%u:%u)", x, eqaid->id, eqaid->step);
|
||||
delete eqaid;
|
||||
eqaid = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
ActivitiesSelectionList->Clear();
|
||||
}
|
||||
|
||||
void MainFrame::FillActivity(int id, int activityid, int step)
|
||||
{
|
||||
if(id > -1){
|
||||
vector<eqtask_activities>::iterator Iter;
|
||||
for(Iter = taskActivitiesList.begin(); Iter != taskActivitiesList.end();Iter++)
|
||||
{
|
||||
eqtask_activities eqta = *Iter;
|
||||
if(eqta.id == id && eqta.activityId == activityid && eqta.step == step)
|
||||
{
|
||||
wxString actStr;
|
||||
actStr.Clear();
|
||||
actStr.Printf("%s", eqta.text1);
|
||||
mActText1->Clear();
|
||||
mActText1->AppendText(actStr);
|
||||
actStr.Clear();
|
||||
|
||||
actStr.Printf("%s", eqta.text2);
|
||||
mActText2->Clear();
|
||||
mActText2->AppendText(actStr);
|
||||
actStr.Clear();
|
||||
|
||||
actStr.Printf("%s", eqta.text3);
|
||||
mActText3->Clear();
|
||||
mActText3->AppendText(actStr);
|
||||
actStr.Clear();
|
||||
|
||||
SetZoneSelectionByIdActivity(eqta.zoneid);
|
||||
mActivityOptional->SetValue(eqta.optional);
|
||||
|
||||
actStr.Printf("%u", eqta.activityId);
|
||||
mActID->Clear();
|
||||
mActID->AppendText(actStr);
|
||||
actStr.Clear();
|
||||
|
||||
actStr.Printf("%u", eqta.step);
|
||||
mActStep->Clear();
|
||||
mActStep->AppendText(actStr);
|
||||
actStr.Clear();
|
||||
|
||||
actStr.Printf("%u", eqta.deliverToNpc);
|
||||
mActDeliver->Clear();
|
||||
mActDeliver->AppendText(actStr);
|
||||
actStr.Clear();
|
||||
|
||||
actStr.Printf("%u", eqta.goalid);
|
||||
mActGoalID->Clear();
|
||||
mActGoalID->AppendText(actStr);
|
||||
actStr.Clear();
|
||||
|
||||
actStr.Printf("%u", eqta.goalcount);
|
||||
mActGoalCount->Clear();
|
||||
mActGoalCount->AppendText(actStr);
|
||||
actStr.Clear();
|
||||
|
||||
if(eqta.goalmethod >= 0 && eqta.goalmethod <= 2)
|
||||
mActMethod->Select(eqta.goalmethod);
|
||||
else
|
||||
mActMethod->Select(2);
|
||||
|
||||
if(eqta.activityType > 0 && eqta.activityType < 12)
|
||||
{
|
||||
mActType->Select(eqta.activityType);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(eqta.activityType == 100){
|
||||
mActType->Select(12);
|
||||
}
|
||||
else if(eqta.activityType == 999)
|
||||
{
|
||||
mActType->Select(13);
|
||||
}
|
||||
else{
|
||||
mActType->Select(0);
|
||||
}
|
||||
}
|
||||
|
||||
wxCommandEvent evnt;
|
||||
evnt.SetInt(eqta.activityType);
|
||||
ActivityChoiceChange(evnt);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MainFrame::ActivityChoiceChange(wxCommandEvent& event)
|
||||
{
|
||||
mErrorLog->Log(eqEmuLogBoth, "Activity Choice Change: %u", event.GetInt());
|
||||
switch(event.GetInt()){
|
||||
case 1:
|
||||
mActInfoText->SetLabel("Deliver:\nDeliver a number of items to a NPC\n"
|
||||
"text1: NPC Name\n"
|
||||
"text2: Item Name"
|
||||
"\n\nRemember: text3 can be used to \noverwrite text1 or text2");
|
||||
break;
|
||||
case 2:
|
||||
mActInfoText->SetLabel("Kill:\nKill a number of NPCs\n"
|
||||
"text1: NPC Name\n"
|
||||
"\n\nRemember: text3 can be used to \noverwrite text1 or text2");
|
||||
break;
|
||||
case 3:
|
||||
mActInfoText->SetLabel("Loot:\nLoot a number of items\n"
|
||||
"text1: Item Name\n"
|
||||
"\n\nRemember: text3 can be used to \noverwrite text1 or text2");
|
||||
break;
|
||||
case 4:
|
||||
mActInfoText->SetLabel("Speak To:\nSpeak with a specific NPC\n"
|
||||
"text1: NPC Name\n"
|
||||
"\n\nRemember: text3 can be used to \noverwrite text1 or text2");
|
||||
break;
|
||||
case 5:
|
||||
mActInfoText->SetLabel("Explore:\nExplore a certain area of the game\n"
|
||||
"text1: Area Description\n"
|
||||
"\n\nRemember: text3 can be used to \noverwrite text1 or text2");
|
||||
break;
|
||||
case 6:
|
||||
mActInfoText->SetLabel("Tradeskill:\nCreate a number of items\n"
|
||||
"text1: Item Name\n"
|
||||
"\n\nRemember: text3 can be used to \noverwrite text1 or text2");
|
||||
break;
|
||||
case 7:
|
||||
mActInfoText->SetLabel("Fish:\nObtain a number of items with fishing\n"
|
||||
"text1: Item Name\n"
|
||||
"\n\nRemember: text3 can be used to \noverwrite text1 or text2");
|
||||
break;
|
||||
case 8:
|
||||
mActInfoText->SetLabel("Forage:\nObtain a number of items via foraging\n"
|
||||
"text1: Item Name\n"
|
||||
"\n\nRemember: text3 can be used to \noverwrite text1 or text2");
|
||||
break;
|
||||
case 11:
|
||||
mActInfoText->SetLabel("Touch:\nEnter a certain zone\n"
|
||||
"text1: Zone Name\n"
|
||||
"\n\nRemember: text3 can be used to \noverwrite text1 or text2");
|
||||
break;
|
||||
case 10:
|
||||
case 9:
|
||||
mActInfoText->SetLabel("Use:\nNot currently in use\n");
|
||||
break;
|
||||
case 12:
|
||||
mActInfoText->SetLabel("Give Cash:\nGive money to a certain npc\n"
|
||||
"text3: Custom Description");
|
||||
break;
|
||||
case 13:
|
||||
mActInfoText->SetLabel("Custom:\nCustom task handled by the quest\nsystem\n"
|
||||
"text3: Custom Description");
|
||||
break;
|
||||
default:
|
||||
mActInfoText->SetLabel("Unknown Activity Type:\nThis is not a valid activity type");
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void MainFrame::SaveActivity(wxCommandEvent& event)
|
||||
{
|
||||
mErrorLog->Log(eqEmuLogBoth, "Save activity requested...");
|
||||
|
||||
if(!mMysql){
|
||||
mErrorLog->Log(eqEmuLogBoth, "Mysql not connected for save activity");
|
||||
return;
|
||||
}
|
||||
|
||||
if(openedActivity.activityid < 0 || openedActivity.id < 0){
|
||||
mErrorLog->Log(eqEmuLogBoth, "Activity not valid for save.");
|
||||
return;
|
||||
}
|
||||
|
||||
eqtask_activities ourAct;
|
||||
|
||||
vector<eqtask_activities>::iterator Iter;
|
||||
for(Iter = taskActivitiesList.begin(); Iter != taskActivitiesList.end(); Iter++)
|
||||
{
|
||||
if((*Iter).activityId == openedActivity.activityid && (*Iter).id == openedActivity.id)
|
||||
{
|
||||
ourAct = *Iter;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int delid = openedActivity.activityid;
|
||||
bool canUpdate = false;
|
||||
wxString getStr;
|
||||
|
||||
getStr = mActText1->GetValue();
|
||||
strcpy(ourAct.text1, getStr.mb_str());
|
||||
getStr.Clear();
|
||||
|
||||
getStr = mActText2->GetValue();
|
||||
strcpy(ourAct.text2, getStr.mb_str());
|
||||
getStr.Clear();
|
||||
|
||||
getStr = mActText3->GetValue();
|
||||
strcpy(ourAct.text3, getStr.mb_str());
|
||||
getStr.Clear();
|
||||
|
||||
int * i = (int*)mActivityZone->GetClientData(mActivityZone->GetSelection());
|
||||
ourAct.zoneid = *i;
|
||||
|
||||
ourAct.optional = mActivityOptional->GetValue();
|
||||
|
||||
getStr = mActID->GetValue();
|
||||
ourAct.activityId = atoi(getStr.mb_str());
|
||||
getStr.Clear();
|
||||
|
||||
getStr = mActStep->GetValue();
|
||||
ourAct.step = atoi(getStr.mb_str());
|
||||
getStr.Clear();
|
||||
|
||||
int type = mActType->GetSelection();
|
||||
if(type > 0 && type < 12){
|
||||
ourAct.activityType = type;
|
||||
}
|
||||
else{
|
||||
if(type == 12){
|
||||
ourAct.activityType = 100;
|
||||
}
|
||||
else if(type == 13){
|
||||
ourAct.activityType = 999;
|
||||
}
|
||||
else
|
||||
ourAct.activityType = 0;
|
||||
}
|
||||
|
||||
getStr = mActDeliver->GetValue();
|
||||
ourAct.deliverToNpc = atoi(getStr.mb_str());
|
||||
getStr.Clear();
|
||||
|
||||
ourAct.goalmethod = mActMethod->GetSelection();
|
||||
|
||||
getStr = mActGoalID->GetValue();
|
||||
ourAct.goalid = atoi(getStr.mb_str());
|
||||
getStr.Clear();
|
||||
|
||||
getStr = mActGoalCount->GetValue();
|
||||
ourAct.goalcount = atoi(getStr.mb_str());
|
||||
getStr.Clear();
|
||||
|
||||
if(ourAct.activityId == openedActivity.activityid && ourAct.id == openedActivity.id){
|
||||
canUpdate = true;
|
||||
mErrorLog->Log(eqEmuLogBoth, "Can use UPDATE.");
|
||||
}
|
||||
else{
|
||||
mErrorLog->Log(eqEmuLogBoth, "Cannot use UPDATE must replace instead");
|
||||
}
|
||||
|
||||
if(canUpdate)
|
||||
{
|
||||
char * mQuery = 0;
|
||||
MakeAnyLenString(&mQuery, "UPDATE activities SET step=%u, activitytype=%u, text1='%s', text2='%s', text3='%s', goalid=%u, goalmethod=%u,goalcount=%u, delivertonpc=%u, zoneid=%u, optional=%u WHERE taskid=%u AND activityid =%u",
|
||||
ourAct.step, ourAct.activityType, MakeStringSQLSafe(ourAct.text1).mb_str(), MakeStringSQLSafe(ourAct.text2).mb_str(), MakeStringSQLSafe(ourAct.text3).mb_str(), ourAct.goalid, ourAct.goalmethod, ourAct.goalcount, ourAct.deliverToNpc, ourAct.zoneid, ourAct.optional, ourAct.id, ourAct.activityId );
|
||||
mErrorLog->Log(eqEmuLogSQL, "%s", mQuery);
|
||||
if (mysql_query(mMysql, mQuery)) {
|
||||
mErrorLog->Log(eqEmuLogBoth, "MySQL Error: %s", mysql_error(mMysql));
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
char * mQuery = 0;
|
||||
MakeAnyLenString(&mQuery, "DELETE FROM activities WHERE taskid=%u AND activityid=%u", ourAct.id, delid);
|
||||
mErrorLog->Log(eqEmuLogSQL, "%s", mQuery);
|
||||
if (mysql_query(mMysql, mQuery)) {
|
||||
mErrorLog->Log(eqEmuLogBoth, "MySQL Error: %s", mysql_error(mMysql));
|
||||
return;
|
||||
}
|
||||
|
||||
MakeAnyLenString(&mQuery, "INSERT INTO `activities` (`taskid`,`activityid`,`step`,`activitytype`,`text1`,`text2`,`text3`,`goalid`,`goalmethod`,`goalcount`,`delivertonpc`,`zoneid`,`optional`) VALUES (%u,%u,%u,%u,'%s','%s','%s',%u,%u,%u,%u,%u,%u)",
|
||||
ourAct.id, ourAct.activityId, ourAct.step, ourAct.activityType, MakeStringSQLSafe(ourAct.text1).mb_str(), MakeStringSQLSafe(ourAct.text2).mb_str(), MakeStringSQLSafe(ourAct.text3).mb_str(), ourAct.goalid, ourAct.goalmethod, ourAct.goalcount, ourAct.deliverToNpc, ourAct.zoneid, ourAct.optional);
|
||||
mErrorLog->Log(eqEmuLogSQL, "%s", mQuery);
|
||||
if (mysql_query(mMysql, mQuery)) {
|
||||
mErrorLog->Log(eqEmuLogBoth, "MySQL Error: %s", mysql_error(mMysql));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
(*Iter).activityId = ourAct.activityId;
|
||||
(*Iter).activityType = ourAct.activityType;
|
||||
(*Iter).deliverToNpc = ourAct.deliverToNpc;
|
||||
(*Iter).goalcount = ourAct.goalcount;
|
||||
(*Iter).goalid = ourAct.goalid;
|
||||
(*Iter).goalmethod = ourAct.goalmethod;
|
||||
(*Iter).id = ourAct.id;
|
||||
(*Iter).optional = ourAct.optional;
|
||||
(*Iter).step = ourAct.step;
|
||||
strcpy((*Iter).text1, ourAct.text1);
|
||||
strcpy((*Iter).text2, ourAct.text2);
|
||||
strcpy((*Iter).text3, ourAct.text3);
|
||||
(*Iter).zoneid = ourAct.zoneid;
|
||||
|
||||
int ourIndex = 0;
|
||||
for(unsigned int Index = 0 ;Index < ActivitiesSelectionList->GetCount(); Index++)
|
||||
{
|
||||
eqtask_activity_id *eqta;
|
||||
eqta = (eqtask_activity_id*)ActivitiesSelectionList->GetClientData(Index);
|
||||
if(eqta){
|
||||
if(eqta->activityid == openedActivity.activityid && eqta->id == openedActivity.id){
|
||||
ourIndex = Index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else{
|
||||
mErrorLog->Log(eqEmuLogBoth, "NULL eqta, index %u", Index);
|
||||
}
|
||||
}
|
||||
|
||||
getStr.Clear();
|
||||
getStr.Printf("Step: %u", (*Iter).step);
|
||||
eqtask_activity_id * eqt = (eqtask_activity_id*)ActivitiesSelectionList->GetClientData(ourIndex);
|
||||
eqt->activityid = ourAct.activityId;
|
||||
eqt->id = ourAct.id;
|
||||
eqt->step = ourAct.step;
|
||||
ActivitiesSelectionList->SetString(ourIndex, getStr);
|
||||
ActivitiesSelectionList->SetClientData(ourIndex, (void*)eqt);
|
||||
|
||||
|
||||
openedActivity.activityid = ourAct.activityId;
|
||||
openedActivity.id = ourAct.id;
|
||||
openedActivity.step = ourAct.step;
|
||||
|
||||
mErrorLog->Log(eqEmuLogBoth, "Save finished.");
|
||||
}
|
||||
|
||||
void MainFrame::ContextMenuActivityList()
|
||||
{
|
||||
if(!mMysql){
|
||||
mErrorLog->Log(eqEmuLogBoth, "Context menu cannot open, not connected to db");
|
||||
return;
|
||||
}
|
||||
|
||||
wxMenu *mMenu;
|
||||
mMenu = new wxMenu();
|
||||
|
||||
mMenu->Append(MENU_NewActivity, wxT("New Activity"), wxT("Creates a new activity"));
|
||||
mMenu->Append(MENU_DeleteActivity, wxT("Delete Activity"), wxT("Deletes the selected activity"));
|
||||
mMenu->AppendSeparator();
|
||||
mMenu->Append(MENU_SaveActivity, wxT("Save Activity"), wxT("Saves the opened activity"));
|
||||
|
||||
PopupMenu(mMenu);
|
||||
delete mMenu;
|
||||
}
|
||||
@@ -0,0 +1,672 @@
|
||||
#include <wx/wx.h>
|
||||
#include <wx/aboutdlg.h>
|
||||
#include <wx/cmdline.h>
|
||||
#include <mysql.h>
|
||||
#include <vector>
|
||||
#include "tasks.h"
|
||||
#include "utility.h"
|
||||
#include "base.h"
|
||||
#include "ErrorLog.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
//Defined Events
|
||||
BEGIN_EVENT_TABLE ( MainFrame, wxFrame )
|
||||
EVT_MENU(MENU_Connect, MainFrame::Connect)
|
||||
EVT_MENU(MENU_Quit, MainFrame::Quit)
|
||||
EVT_MENU(MENU_NewTask, MainFrame::NewTask)
|
||||
EVT_MENU(MENU_DeleteTask, MainFrame::DeleteTask)
|
||||
EVT_MENU(MENU_SaveTask, MainFrame::SaveTask)
|
||||
EVT_MENU(MENU_NewActivity, MainFrame::NewActivity)
|
||||
EVT_MENU(MENU_DeleteActivity, MainFrame::DeleteActivity)
|
||||
EVT_MENU(MENU_SaveActivity, MainFrame::SaveActivity)
|
||||
EVT_MENU(MENU_About, MainFrame::About)
|
||||
EVT_LISTBOX_DCLICK(LIST_Click, MainFrame::ListBoxDoubleClick)
|
||||
EVT_LISTBOX(LIST_Click, MainFrame::ListBoxSimpleSelect)
|
||||
EVT_BUTTON(BUTTON_Reward, MainFrame::OnRewardButton )
|
||||
EVT_LISTBOX_DCLICK(LIST_Click_Activities, MainFrame::ActivitiesListBoxDoubleClick)
|
||||
EVT_LISTBOX(LIST_Click_Activities, MainFrame::ActivitiesListBoxSimpleSelect)
|
||||
EVT_CHOICE(CHOICE_ActivityChoiceChange, MainFrame::ActivityChoiceChange)
|
||||
EVT_CONTEXT_MENU(MainFrame::ContextClick)
|
||||
EVT_LISTBOX_DCLICK(LIST_Click_Goals, MainFrame::GoalsListBoxDoubleClick)
|
||||
EVT_MENU(MENU_NewGoal, MainFrame::NewGoal)
|
||||
EVT_MENU(MENU_DeleteGoal, MainFrame::DeleteGoal)
|
||||
EVT_MENU(MENU_AddGoalItem, MainFrame::NewGoalValue)
|
||||
EVT_MENU(MENU_DeleteGoalItem, MainFrame::DeleteGoalValue)
|
||||
EVT_MENU(MENU_ModifyGoalItem, MainFrame::ChangeGoalValue)
|
||||
EVT_BUTTON(BUTTON_AddGoalItem, MainFrame::NewGoalValue)
|
||||
EVT_BUTTON(BUTTON_DeleteGoalItem, MainFrame::DeleteGoalValue)
|
||||
EVT_BUTTON(BUTTON_ModifyGoalItem, MainFrame::ChangeGoalValue)
|
||||
EVT_MENU(MENU_NewProximity, MainFrame::NewProximity)
|
||||
EVT_MENU(MENU_DeleteProximity, MainFrame::DeleteProximity)
|
||||
EVT_MENU(MENU_SaveProximity, MainFrame::SaveProximity)
|
||||
EVT_LISTBOX_DCLICK(LIST_Click_Proximity, MainFrame::ProximityListBoxDoubleClick)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
//Our main() thread
|
||||
IMPLEMENT_APP_CONSOLE(MainApp)
|
||||
|
||||
bool MainApp::OnInit()
|
||||
{
|
||||
MainFrame *MainWin = new MainFrame(wxT("Task Master"), wxDefaultPosition, //wxPoint(1,1),
|
||||
wxSize(800, 600)); // Create an instance of our frame, or window
|
||||
MainWin->Show(TRUE); // show the window
|
||||
SetTopWindow(MainWin);// and finally, set it as the main window
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
MainFrame::MainFrame(const wxString& title,
|
||||
const wxPoint& pos, const wxSize& size)
|
||||
: wxFrame((wxFrame *) NULL, -1, title, pos, size, (wxCAPTION|wxCLOSE_BOX|wxMINIMIZE_BOX|wxSYSTEM_MENU|wxCLIP_CHILDREN|wxTAB_TRAVERSAL))
|
||||
{
|
||||
mErrorLog = new EQEmuErrorLog;
|
||||
CreateStatusBar(1, 0);
|
||||
|
||||
mErrorLog->Log(eqEmuLogBoth, "Creating Menus.");
|
||||
MainMenu = new wxMenuBar();
|
||||
wxMenu *FileMenu = new wxMenu();
|
||||
|
||||
FileMenu->Append(MENU_Connect, wxT("&Connect"), wxT("Connect to the Database"));
|
||||
FileMenu->AppendSeparator();
|
||||
FileMenu->Append(MENU_Quit, wxT("&Quit"), wxT("Quit"));
|
||||
MainMenu->Append(FileMenu, wxT("&Main"));
|
||||
|
||||
wxMenu *EditMenu = new wxMenu();
|
||||
|
||||
EditMenu->Append(MENU_NewTask, wxT("&New Task"), wxT("Creates a new task"));
|
||||
EditMenu->Append(MENU_DeleteTask, wxT("&Delete Task"), wxT("Deletes the selected task"));
|
||||
EditMenu->AppendSeparator();
|
||||
EditMenu->Append(MENU_SaveTask, wxT("&Save Task"), wxT("Saves the opened task"));
|
||||
MainMenu->Append(EditMenu, wxT("&Tasks"));
|
||||
|
||||
wxMenu *ActMenu = new wxMenu();
|
||||
ActMenu->Append(MENU_NewActivity, wxT("&New Activity"), wxT("Create a new activity for this task"));
|
||||
ActMenu->Append(MENU_DeleteActivity, wxT("&Delete Activity"), wxT("Deletes the selected activity for this task"));
|
||||
ActMenu->AppendSeparator();
|
||||
ActMenu->Append(MENU_SaveActivity, wxT("&Save Activity"), wxT("Saves the opened task activity"));
|
||||
MainMenu->Append(ActMenu, wxT("&Activities"));
|
||||
|
||||
wxMenu *GoalsMenu = new wxMenu();
|
||||
GoalsMenu->Append(MENU_NewGoal, wxT("&New Goal"), wxT("Creates a new goal list entry"));
|
||||
GoalsMenu->Append(MENU_DeleteGoal, wxT("&Delete Goal"), wxT("Deletes the selected goal list entry"));
|
||||
GoalsMenu->AppendSeparator();
|
||||
GoalsMenu->Append(MENU_AddGoalItem, wxT("N&ew Goal Value"), wxT("Saves the opened task activity"));
|
||||
GoalsMenu->Append(MENU_DeleteGoalItem, wxT("De&lete Goal Value"), wxT("Deletes the selected goal value entry"));
|
||||
GoalsMenu->Append(MENU_ModifyGoalItem, wxT("M&odify Goal Value"), wxT("Attempts to change the selected goal value entry"));
|
||||
MainMenu->Append(GoalsMenu, wxT("&Goals"));
|
||||
|
||||
wxMenu *ProximityMenu = new wxMenu();
|
||||
ProximityMenu->Append(MENU_NewProximity, wxT("&New Proximity"), wxT("Creates a new proximity entry"));
|
||||
ProximityMenu->Append(MENU_DeleteProximity, wxT("&Delete Proximity"), wxT("Deletes the selected proximity entry"));
|
||||
ProximityMenu->AppendSeparator();
|
||||
ProximityMenu->Append(MENU_SaveProximity, wxT("&Save Proximity"), wxT("Saves the opened proximity entry"));
|
||||
MainMenu->Append(ProximityMenu, wxT("&Proximity"));
|
||||
|
||||
wxMenu *AboutMenu = new wxMenu();
|
||||
AboutMenu->Append(MENU_About, wxT("A&bout"), wxT("Program Information"));
|
||||
MainMenu->Append(AboutMenu, wxT("A&bout"));
|
||||
|
||||
SetMenuBar(MainMenu);
|
||||
|
||||
mErrorLog->Log(eqEmuLogBoth, "Creating Sizer.");
|
||||
BoxSizer1 = new wxBoxSizer(wxHORIZONTAL);
|
||||
|
||||
mErrorLog->Log(eqEmuLogBoth, "Creating Item List Box.");
|
||||
ItemSelectionList = new wxListBox(this, LIST_Click, wxDefaultPosition, wxSize( -1,-1 ), 0, NULL, 0);
|
||||
|
||||
mErrorLog->Log(eqEmuLogBoth, "Adding Item List Box to Sizer.");
|
||||
BoxSizer1->Add(ItemSelectionList, 0, wxALIGN_TOP|wxALL|wxEXPAND, 5);
|
||||
|
||||
mErrorLog->Log(eqEmuLogBoth, "Creating Notebook Backing.");
|
||||
MainNotebookBack = new wxNotebook(this, wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), 0);
|
||||
|
||||
mErrorLog->Log(eqEmuLogBoth, "Creating Panels.");
|
||||
MainPanel1 = new wxPanel(MainNotebookBack, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
|
||||
MainPanel2 = new wxPanel(MainNotebookBack, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
|
||||
MainPanel3 = new wxPanel(MainNotebookBack, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
|
||||
MainPanel4 = new wxPanel(MainNotebookBack, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
|
||||
MainPanel5 = new wxPanel(MainNotebookBack, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
|
||||
|
||||
mErrorLog->Log(eqEmuLogBoth, "Adding Panels to Notebook Backing.");
|
||||
MainNotebookBack->AddPage(MainPanel1, wxT("General"), true);
|
||||
MainNotebookBack->AddPage(MainPanel2, wxT("Activities"), false);
|
||||
MainNotebookBack->AddPage(MainPanel3, wxT("Goals"), false);
|
||||
MainNotebookBack->AddPage(MainPanel4, wxT("Proximities"), false);
|
||||
MainNotebookBack->AddPage(MainPanel5, wxT("Task Sets"), false);
|
||||
|
||||
/*General Page Elements*/
|
||||
mErrorLog->Log(eqEmuLogBoth, "Adding elements to General Page");
|
||||
//name label + text
|
||||
mTaskNameLabel = new wxStaticText(MainPanel1, -1, "Name:", wxPoint(0,2), wxDefaultSize);
|
||||
mTaskName = new wxTextCtrl(MainPanel1, -1, wxT("Task Name"), wxPoint(65,0), wxSize(300,20));
|
||||
mTaskName->SetMaxLength(100);
|
||||
mTaskName->Disable();
|
||||
|
||||
//desc label + text
|
||||
mTaskDescLabel = new wxStaticText(MainPanel1, -1, "Desc:", wxPoint(0,32), wxDefaultSize);
|
||||
mTaskDesc = new wxTextCtrl(MainPanel1, -1, wxT("Task Description"), wxPoint(65,30), wxSize(300,200), wxTE_MULTILINE);
|
||||
mTaskDesc->SetMaxLength(2047);
|
||||
mTaskDesc->Disable();
|
||||
|
||||
//Min Level label + text
|
||||
mTaskMinLvlLabel = new wxStaticText(MainPanel1, -1, "Min Lvl:", wxPoint(375,2), wxDefaultSize);
|
||||
mTaskMinLvl = new wxTextCtrl(MainPanel1, -1, wxT("0"), wxPoint(450,0), wxSize(25,20), wxTE_DONTWRAP, wxTextValidator(wxFILTER_NUMERIC));
|
||||
mTaskMinLvl->SetMaxLength(2);
|
||||
mTaskMinLvl->Disable();
|
||||
|
||||
//Max Level label + text
|
||||
mTaskMaxLvlLabel = new wxStaticText(MainPanel1, -1, "Max Lvl:", wxPoint(500,2), wxDefaultSize);
|
||||
mTaskMaxLvl = new wxTextCtrl(MainPanel1, -1, wxT("0"), wxPoint(580,0), wxSize(25,20), wxTE_DONTWRAP, wxTextValidator(wxFILTER_NUMERIC));
|
||||
mTaskMaxLvl->SetMaxLength(2);
|
||||
mTaskMaxLvl->Disable();
|
||||
|
||||
//duration
|
||||
mTaskDurationLabel = new wxStaticText(MainPanel1, -1, "Duration:", wxPoint(375,32), wxDefaultSize);
|
||||
mTaskDuration = new wxTextCtrl(MainPanel1, -1, wxT("0"), wxPoint(450,30), wxSize(70,20), wxTE_DONTWRAP, wxTextValidator(wxFILTER_NUMERIC));
|
||||
mTaskDuration->SetMaxLength(9);
|
||||
mTaskDuration->Disable();
|
||||
|
||||
//box to enclose rewards
|
||||
mRewardsBox = new wxStaticBox(MainPanel1, -1, "Rewards", wxPoint(0,300), wxSize(644,210));
|
||||
mRewardNameLabel = new wxStaticText(mRewardsBox, -1, "Reward:", wxPoint(10,17), wxDefaultSize);
|
||||
mRewardName = new wxTextCtrl(mRewardsBox, -1, wxT(""), wxPoint(80,15), wxSize(280,20));
|
||||
mRewardName->SetMaxLength(64);
|
||||
mRewardName->Disable();
|
||||
|
||||
mRewardIDLabel = new wxStaticText(mRewardsBox, -1, "Reward ID:", wxPoint(10,47), wxDefaultSize);
|
||||
mRewardID = new wxTextCtrl(mRewardsBox, -1, wxT("0"), wxPoint(160,45), wxSize(70,20), wxTE_DONTWRAP, wxTextValidator(wxFILTER_NUMERIC));
|
||||
mRewardID->SetMaxLength(9);
|
||||
mRewardID->Disable();
|
||||
|
||||
mRewardCashLabel = new wxStaticText(mRewardsBox, -1, "Money Rewarded:", wxPoint(10,77), wxDefaultSize);
|
||||
mRewardCash = new wxTextCtrl(mRewardsBox, -1, wxT("0"), wxPoint(160,75), wxSize(70,20), wxTE_DONTWRAP, wxTextValidator(wxFILTER_NUMERIC));
|
||||
mRewardCash->SetMaxLength(9);
|
||||
mRewardCash->Disable();
|
||||
|
||||
mRewardXPLabel = new wxStaticText(mRewardsBox, -1, "Experience Rewarded:", wxPoint(10,107), wxDefaultSize);
|
||||
mRewardXP = new wxTextCtrl(mRewardsBox, -1, wxT("0"), wxPoint(160,105), wxSize(70,20), wxTE_DONTWRAP, wxTextValidator(wxFILTER_NUMERIC));
|
||||
mRewardXP->SetMaxLength(9);
|
||||
mRewardXP->Disable();
|
||||
|
||||
mRewardMethodLabel = new wxStaticText(mRewardsBox, -1, "Reward Method:", wxPoint(10,137), wxDefaultSize);
|
||||
mRewardMethod = new wxChoice(mRewardsBox, -1, wxPoint(160, 135), wxDefaultSize);
|
||||
wxString mRewardMethodStr;
|
||||
mRewardMethodStr.Printf("%s", "(0) Single Item Id");
|
||||
mRewardMethod->Append(mRewardMethodStr);
|
||||
mRewardMethodStr.clear();
|
||||
mRewardMethodStr.Printf("%s", "(1) List from Goal List");
|
||||
mRewardMethod->Append(mRewardMethodStr);
|
||||
mRewardMethodStr.clear();
|
||||
mRewardMethodStr.Printf("%s", "(2) Perl Quest Reward");
|
||||
mRewardMethod->Append(mRewardMethodStr);
|
||||
mRewardMethod->Select(0);
|
||||
mRewardMethod->Disable();
|
||||
|
||||
ShowRewardItems = new wxListBox(mRewardsBox, -1, wxPoint(375, 40), wxSize(250,160), 0, NULL, 0);
|
||||
ShowRewardItems->Disable();
|
||||
|
||||
RefreshItems = new wxButton(mRewardsBox,BUTTON_Reward,"Refresh Item List", wxPoint(375,10), wxSize(250,25));
|
||||
RefreshItems->Disable();
|
||||
|
||||
mStartZoneLabel = new wxStaticText(MainPanel1, -1, "Start Zone:", wxPoint(375,62), wxDefaultSize);
|
||||
mStartZone = new wxChoice(MainPanel1, -1, wxPoint(460, 60), wxDefaultSize, 0, NULL, wxCB_SORT);
|
||||
mStartZone->Disable();
|
||||
|
||||
mTaskRepeatable = new wxCheckBox(MainPanel1, -1, "Repeatable:", wxPoint(375, 87), wxDefaultSize, wxCHK_2STATE | wxALIGN_RIGHT);
|
||||
mTaskRepeatable->Disable();
|
||||
|
||||
/*General Page Elements End*/
|
||||
|
||||
/*Activities Page Elements*/
|
||||
mErrorLog->Log(eqEmuLogBoth, "Adding elements to Activities Page");
|
||||
ActivitiesSelectionList = new wxListBox(MainPanel2, LIST_Click_Activities, wxPoint(0,0), wxSize(100,510), 0, NULL, 0);
|
||||
ActivitiesSelectionList->Disable();
|
||||
|
||||
|
||||
mActText1Label = new wxStaticText(MainPanel2, -1, "Text 1:", wxPoint(105,2), wxDefaultSize);
|
||||
mActText1 = new wxTextCtrl(MainPanel2, -1, wxT(""), wxPoint(185,0), wxSize(180,20), wxTE_DONTWRAP);
|
||||
mActText1->SetMaxLength(64);
|
||||
mActText1->Disable();
|
||||
|
||||
mActText2Label = new wxStaticText(MainPanel2, -1, "Text 2:", wxPoint(105,22), wxDefaultSize);
|
||||
mActText2 = new wxTextCtrl(MainPanel2, -1, wxT(""), wxPoint(185,20), wxSize(180,20), wxTE_DONTWRAP);
|
||||
mActText2->SetMaxLength(64);
|
||||
mActText2->Disable();
|
||||
|
||||
mActText3Label = new wxStaticText(MainPanel2, -1, "Text 3:", wxPoint(105,42), wxDefaultSize);
|
||||
mActText3 = new wxTextCtrl(MainPanel2, -1, wxT(""), wxPoint(185,40), wxSize(180,60), wxTE_MULTILINE);
|
||||
mActText3->SetMaxLength(128);
|
||||
mActText3->Disable();
|
||||
|
||||
mActivityZoneLabel = new wxStaticText(MainPanel2, -1, "Zone:", wxPoint(380,2), wxDefaultSize);
|
||||
mActivityZone = new wxChoice(MainPanel2, -1, wxPoint(440, 0), wxDefaultSize, 0, NULL, wxCB_SORT);
|
||||
mActivityZone->Disable();
|
||||
|
||||
mActivityOptional = new wxCheckBox(MainPanel2, -1, "Optional:", wxPoint(580, 2), wxDefaultSize, wxCHK_2STATE | wxALIGN_RIGHT);
|
||||
mActivityOptional->Disable();
|
||||
|
||||
mActIDLabel = new wxStaticText(MainPanel2, -1, "Activity ID:", wxPoint(105,107), wxDefaultSize);
|
||||
mActID = new wxTextCtrl(MainPanel2, -1, wxT(""), wxPoint(185,105), wxSize(25,20), wxTE_DONTWRAP, wxTextValidator(wxFILTER_NUMERIC));
|
||||
mActID->SetMaxLength(2);
|
||||
mActID->Disable();
|
||||
|
||||
mActStepLabel = new wxStaticText(MainPanel2, -1, "Step:", wxPoint(105,129), wxDefaultSize);
|
||||
mActStep = new wxTextCtrl(MainPanel2, -1, wxT(""), wxPoint(185,127), wxSize(25,20), wxTE_DONTWRAP, wxTextValidator(wxFILTER_NUMERIC));
|
||||
mActStep->SetMaxLength(2);
|
||||
mActStep->Disable();
|
||||
|
||||
mActTypeLabel = new wxStaticText(MainPanel2, -1, "Type:", wxPoint(105,155), wxDefaultSize);
|
||||
mActType = new wxChoice(MainPanel2, CHOICE_ActivityChoiceChange, wxPoint(185, 153), wxDefaultSize);
|
||||
mRewardMethodStr.Clear();
|
||||
mRewardMethodStr.Printf("%s", "(0) Unknown");
|
||||
mActType->Append(mRewardMethodStr);
|
||||
mRewardMethodStr.Clear();
|
||||
mRewardMethodStr.Printf("%s", "(1) Deliver");
|
||||
mActType->Append(mRewardMethodStr);
|
||||
mRewardMethodStr.Clear();
|
||||
mRewardMethodStr.Printf("%s", "(2) Kill");
|
||||
mActType->Append(mRewardMethodStr);
|
||||
mRewardMethodStr.Clear();
|
||||
mRewardMethodStr.Printf("%s", "(3) Loot");
|
||||
mActType->Append(mRewardMethodStr);
|
||||
mRewardMethodStr.Clear();
|
||||
mRewardMethodStr.Printf("%s", "(4) Speak To");
|
||||
mActType->Append(mRewardMethodStr);
|
||||
mRewardMethodStr.Clear();
|
||||
mRewardMethodStr.Printf("%s", "(5) Explore");
|
||||
mActType->Append(mRewardMethodStr);
|
||||
mRewardMethodStr.Clear();
|
||||
mRewardMethodStr.Printf("%s", "(6) Trade Skill");
|
||||
mActType->Append(mRewardMethodStr);
|
||||
mRewardMethodStr.Clear();
|
||||
mRewardMethodStr.Printf("%s", "(7) Fish");
|
||||
mActType->Append(mRewardMethodStr);
|
||||
mRewardMethodStr.Clear();
|
||||
mRewardMethodStr.Printf("%s", "(8) Forage");
|
||||
mActType->Append(mRewardMethodStr);
|
||||
mRewardMethodStr.Clear();
|
||||
mRewardMethodStr.Printf("%s", "(9) Use");
|
||||
mActType->Append(mRewardMethodStr);
|
||||
mRewardMethodStr.Clear();
|
||||
mRewardMethodStr.Printf("%s", "(10) Use");
|
||||
mActType->Append(mRewardMethodStr);
|
||||
mRewardMethodStr.Clear();
|
||||
mRewardMethodStr.Printf("%s", "(11) Touch");
|
||||
mActType->Append(mRewardMethodStr);
|
||||
mRewardMethodStr.Clear();
|
||||
mRewardMethodStr.Printf("%s", "(100) GiveCash");
|
||||
mActType->Append(mRewardMethodStr);
|
||||
mRewardMethodStr.Clear();
|
||||
mRewardMethodStr.Printf("%s", "(999) Custom");
|
||||
mActType->Append(mRewardMethodStr);
|
||||
mActType->Disable();
|
||||
mActType->Select(0);
|
||||
|
||||
mActInfo = new wxStaticBox(MainPanel2, -1, "Info", wxPoint(425,385), wxSize(219,125));
|
||||
mActInfoText = new wxStaticText(mActInfo, -1, "Unknown Activity Type:\nThis is not a valid activity type", wxPoint(25,25), wxDefaultSize);
|
||||
|
||||
mActDeliverLabel = new wxStaticText(MainPanel2, -1, "Deliver to NPCID:", wxPoint(105,182), wxDefaultSize);
|
||||
mActDeliver = new wxTextCtrl(MainPanel2, -1, wxT(""), wxPoint(215,180), wxSize(60,20), wxTE_DONTWRAP, wxTextValidator(wxFILTER_NUMERIC));
|
||||
mActDeliver->SetMaxLength(7);
|
||||
mActDeliver->Disable();
|
||||
|
||||
mActMethodLabel = new wxStaticText(MainPanel2, -1, "Goal Method:", wxPoint(105,402), wxDefaultSize);
|
||||
mActMethod = new wxChoice(MainPanel2, -1, wxPoint(200, 400), wxDefaultSize);
|
||||
|
||||
mRewardMethodStr.Clear();
|
||||
mRewardMethodStr.Printf("%s", "(0) Single Goal ID");
|
||||
mActMethod->Append(mRewardMethodStr);
|
||||
mRewardMethodStr.Clear();
|
||||
mRewardMethodStr.Printf("%s", "(1) Goal ID List");
|
||||
mActMethod->Append(mRewardMethodStr);
|
||||
mRewardMethodStr.Clear();
|
||||
mRewardMethodStr.Printf("%s", "(2) Perl Quest");
|
||||
mActMethod->Append(mRewardMethodStr);
|
||||
mActMethod->Select(2);
|
||||
mActMethod->Disable();
|
||||
|
||||
mActGoalIDLabel = new wxStaticText(MainPanel2, -1, "Goal ID:", wxPoint(105,432), wxDefaultSize);
|
||||
mActGoalID = new wxTextCtrl(MainPanel2, -1, wxT(""), wxPoint(200,430), wxSize(60,20), wxTE_DONTWRAP, wxTextValidator(wxFILTER_NUMERIC));
|
||||
mActGoalID->SetMaxLength(7);
|
||||
mActGoalID->Disable();
|
||||
|
||||
mActGoalCountLabel = new wxStaticText(MainPanel2, -1, "Goal Count:", wxPoint(105,457), wxDefaultSize);
|
||||
mActGoalCount = new wxTextCtrl(MainPanel2, -1, wxT(""), wxPoint(200,455), wxSize(60,20), wxTE_DONTWRAP, wxTextValidator(wxFILTER_NUMERIC));
|
||||
mActGoalCount->SetMaxLength(8);
|
||||
mActGoalCount->Disable();
|
||||
|
||||
/*Activities Page Elements End*/
|
||||
|
||||
/*Goals Page Elements*/
|
||||
mErrorLog->Log(eqEmuLogBoth, "Adding elements to Goals Page");
|
||||
GoalsSelectionList = new wxListBox(MainPanel3, LIST_Click_Goals, wxPoint(0,0), wxSize(100,510), 0, NULL, 0);
|
||||
|
||||
GoalsValuesList = new wxListBox(MainPanel3, -1, wxPoint(150,50), wxSize(150,300), 0, NULL, 0);
|
||||
GoalsValuesList->Disable();
|
||||
|
||||
mGoalsNewValueButton = new wxButton(MainPanel3, BUTTON_AddGoalItem, "Add Value", wxPoint(302,275), wxSize(100,-1));
|
||||
mGoalsNewValueButton->Disable();
|
||||
mGoalsDeleteValueButton = new wxButton(MainPanel3, BUTTON_DeleteGoalItem, "Delete Value", wxPoint(302,300), wxSize(100,-1));
|
||||
mGoalsDeleteValueButton->Disable();
|
||||
mGoalsChangeValueButton = new wxButton(MainPanel3, BUTTON_ModifyGoalItem, "Change Value", wxPoint(302,325), wxSize(100,-1));
|
||||
mGoalsChangeValueButton->Disable();
|
||||
/*Goals Page Elements End*/
|
||||
|
||||
/*Proximities Page Elements*/
|
||||
mErrorLog->Log(eqEmuLogBoth, "Adding elements to Proximities Page");
|
||||
ProximitySelectionList = new wxListBox(MainPanel4, LIST_Click_Proximity, wxPoint(0,0), wxSize(100,510), 0, NULL, 0);
|
||||
|
||||
mProxIdLabel = new wxStaticText(MainPanel4, -1, "Id:", wxPoint(105,12), wxDefaultSize);
|
||||
mProxId = new wxTextCtrl(MainPanel4, -1, wxT(""), wxPoint(150,10), wxSize(50,20), wxTE_DONTWRAP, wxTextValidator(wxFILTER_NUMERIC));
|
||||
mProxId->SetMaxLength(6);
|
||||
mProxId->Disable();
|
||||
mProxMinxLabel = new wxStaticText(MainPanel4, -1, "MinX:", wxPoint(105,42), wxDefaultSize);
|
||||
mProxMinx = new wxTextCtrl(MainPanel4, -1, wxT(""), wxPoint(150,40), wxSize(80,20), wxTE_DONTWRAP, wxTextValidator(wxFILTER_NUMERIC));
|
||||
mProxMinx->SetMaxLength(12);
|
||||
mProxMinx->Disable();
|
||||
mProxMaxxLabel = new wxStaticText(MainPanel4, -1, "MaxX:", wxPoint(255,42), wxDefaultSize);
|
||||
mProxMaxx = new wxTextCtrl(MainPanel4, -1, wxT(""), wxPoint(300,40), wxSize(80,20), wxTE_DONTWRAP, wxTextValidator(wxFILTER_NUMERIC));
|
||||
mProxMaxx->SetMaxLength(12);
|
||||
mProxMaxx->Disable();
|
||||
mProxMinyLabel = new wxStaticText(MainPanel4, -1, "MinY:", wxPoint(105,72), wxDefaultSize);
|
||||
mProxMiny = new wxTextCtrl(MainPanel4, -1, wxT(""), wxPoint(150,70), wxSize(80,20), wxTE_DONTWRAP, wxTextValidator(wxFILTER_NUMERIC));
|
||||
mProxMiny->SetMaxLength(12);
|
||||
mProxMiny->Disable();
|
||||
mProxMaxyLabel = new wxStaticText(MainPanel4, -1, "MaxY:", wxPoint(255,72), wxDefaultSize);
|
||||
mProxMaxy = new wxTextCtrl(MainPanel4, -1, wxT(""), wxPoint(300,70), wxSize(80,20), wxTE_DONTWRAP, wxTextValidator(wxFILTER_NUMERIC));
|
||||
mProxMaxy->SetMaxLength(12);
|
||||
mProxMaxy->Disable();
|
||||
mProxMinzLabel = new wxStaticText(MainPanel4, -1, "MinZ:", wxPoint(105,102), wxDefaultSize);
|
||||
mProxMinz = new wxTextCtrl(MainPanel4, -1, wxT(""), wxPoint(150,100), wxSize(80,20), wxTE_DONTWRAP, wxTextValidator(wxFILTER_NUMERIC));
|
||||
mProxMinz->SetMaxLength(12);
|
||||
mProxMinz->Disable();
|
||||
mProxMaxzLabel = new wxStaticText(MainPanel4, -1, "MaxZ:", wxPoint(255,102), wxDefaultSize);
|
||||
mProxMaxz = new wxTextCtrl(MainPanel4, -1, wxT(""), wxPoint(300,100), wxSize(80,20), wxTE_DONTWRAP, wxTextValidator(wxFILTER_NUMERIC));
|
||||
mProxMaxz->SetMaxLength(12);
|
||||
mProxMaxz->Disable();
|
||||
mProxZoneLabel = new wxStaticText(MainPanel4, -1, "Zone:", wxPoint(105,202), wxDefaultSize);
|
||||
mProxZone = new wxChoice(MainPanel4, -1, wxPoint(150, 200), wxDefaultSize);
|
||||
mProxZone->Disable();
|
||||
/*Proximities Page Elements End*/
|
||||
|
||||
mErrorLog->Log(eqEmuLogBoth, "Adding Notebook to Sizer.");
|
||||
BoxSizer1->Add(MainNotebookBack, 1, wxALIGN_TOP|wxEXPAND, 5);
|
||||
|
||||
mErrorLog->Log(eqEmuLogBoth, "Setting Frame Sizer.");
|
||||
this->SetSizer(BoxSizer1);
|
||||
mErrorLog->Log(eqEmuLogBoth, "Calculating Frame Layout.");
|
||||
this->Layout();
|
||||
|
||||
selectedIndex = -1; //nothing selected
|
||||
openedIndex = -1; //nothing opened
|
||||
highestIndex = 0;
|
||||
openedActivity.activityid = -1;
|
||||
openedActivity.id = -1;
|
||||
openedActivity.step = -1;
|
||||
openedGoal = 0;
|
||||
openedProximity.exploreid = 0xFFFFFFFF;
|
||||
openedProximity.zoneid = 0xFFFFFFFF;
|
||||
|
||||
//database setting init.
|
||||
mMysql = NULL;
|
||||
memset(server,0,256);
|
||||
memset(user,0,256);
|
||||
memset(password,0,256);
|
||||
memset(database,0,256);
|
||||
if(!GetDatabaseSettings())
|
||||
Close(TRUE);
|
||||
}
|
||||
|
||||
void MainFrame::Connect(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
if(mMysql){
|
||||
mErrorLog->Log(eqEmuLogBoth, "Connect to database requested but database connection exists.");
|
||||
return;
|
||||
}
|
||||
ItemSelectionList->Clear();
|
||||
mErrorLog->Log(eqEmuLogBoth, "Connect to database requested.");
|
||||
|
||||
if(!mMysql){
|
||||
mMysql = mysql_init(NULL);
|
||||
}
|
||||
|
||||
if(mMysql){
|
||||
if (!mysql_real_connect(mMysql, server,
|
||||
user, password, database, 0, NULL, 0)) {
|
||||
mErrorLog->Log(eqEmuLogBoth, "MySQL Connection Error: %s", mysql_error(mMysql));
|
||||
Close(TRUE);
|
||||
return;
|
||||
}
|
||||
|
||||
if(!LoadTasks()){
|
||||
mysql_close(mMysql);
|
||||
mErrorLog->Log(eqEmuLogBoth, "Failed to load tasks, exiting.");
|
||||
Close(TRUE);
|
||||
return;
|
||||
}
|
||||
|
||||
if(!LoadGoals()){
|
||||
mysql_close(mMysql);
|
||||
mErrorLog->Log(eqEmuLogBoth, "Failed to load goals, exiting.");
|
||||
Close(TRUE);
|
||||
return;
|
||||
}
|
||||
|
||||
if(!LoadActivities()){
|
||||
mysql_close(mMysql);
|
||||
mErrorLog->Log(eqEmuLogBoth, "Failed to load activities, exiting.");
|
||||
Close(TRUE);
|
||||
return;
|
||||
}
|
||||
|
||||
if(!LoadItems()){
|
||||
mysql_close(mMysql);
|
||||
mErrorLog->Log(eqEmuLogBoth, "Failed to load items, exiting.");
|
||||
Close(TRUE);
|
||||
return;
|
||||
}
|
||||
|
||||
if(!LoadZones()){
|
||||
mysql_close(mMysql);
|
||||
mErrorLog->Log(eqEmuLogBoth, "Failed to load zones, exiting.");
|
||||
Close(TRUE);
|
||||
return;
|
||||
}
|
||||
|
||||
if(!LoadProximity()){
|
||||
mysql_close(mMysql);
|
||||
mErrorLog->Log(eqEmuLogBoth, "Failed to load proximities, exiting.");
|
||||
Close(TRUE);
|
||||
return;
|
||||
}
|
||||
|
||||
PopulateGoals();
|
||||
PopulateProximity();
|
||||
}
|
||||
}
|
||||
|
||||
void MainFrame::Quit(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
mErrorLog->Log(eqEmuLogBoth, "Exit requested, exiting.");
|
||||
delete mErrorLog;
|
||||
mErrorLog = NULL;
|
||||
mysql_close(mMysql);
|
||||
|
||||
Close(TRUE);
|
||||
}
|
||||
|
||||
void MainFrame::ListBoxSimpleSelect(wxCommandEvent& event)
|
||||
{
|
||||
selectedIndex = event.GetInt();
|
||||
}
|
||||
|
||||
void MainFrame::ListBoxDoubleClick(wxCommandEvent& event)
|
||||
{
|
||||
mErrorLog->Log(eqEmuLogBoth, "Double clicked on item %d.", event.GetInt());
|
||||
openedIndex = event.GetInt();
|
||||
|
||||
vector<eqtask>::iterator Iter;
|
||||
Iter = taskList.begin();
|
||||
Iter += openedIndex;
|
||||
eqtask mTask = *Iter;
|
||||
|
||||
wxString mStr;
|
||||
mStr.Printf("%s", mTask.title);
|
||||
mTaskName->Clear();
|
||||
mTaskName->AppendText(mStr);
|
||||
mTaskName->Enable();
|
||||
mStr.clear();
|
||||
|
||||
mStr.Printf("%s", mTask.desc);
|
||||
mTaskDesc->Clear();
|
||||
mTaskDesc->AppendText(mStr);
|
||||
mTaskDesc->Enable();
|
||||
mStr.clear();
|
||||
|
||||
mStr.Printf("%u", mTask.level_min);
|
||||
mTaskMinLvl->Clear();
|
||||
mTaskMinLvl->AppendText(mStr);
|
||||
mTaskMinLvl->Enable();
|
||||
mStr.clear();
|
||||
|
||||
mStr.Printf("%u", mTask.level_max);
|
||||
mTaskMaxLvl->Clear();
|
||||
mTaskMaxLvl->AppendText(mStr);
|
||||
mTaskMaxLvl->Enable();
|
||||
mStr.clear();
|
||||
|
||||
mStr.Printf("%u", mTask.duration);
|
||||
mTaskDuration->Clear();
|
||||
mTaskDuration->AppendText(mStr);
|
||||
mTaskDuration->Enable();
|
||||
mStr.clear();
|
||||
|
||||
mStr.Printf("%s", mTask.reward);
|
||||
mRewardName->Clear();
|
||||
mRewardName->AppendText(mStr);
|
||||
mRewardName->Enable();
|
||||
mStr.clear();
|
||||
|
||||
mStr.Printf("%u", mTask.rewardid);
|
||||
mRewardID->Clear();
|
||||
mRewardID->AppendText(mStr);
|
||||
mRewardID->Enable();
|
||||
mStr.clear();
|
||||
|
||||
mStr.Printf("%u", mTask.cashreward);
|
||||
mRewardCash->Clear();
|
||||
mRewardCash->AppendText(mStr);
|
||||
mRewardCash->Enable();
|
||||
mStr.clear();
|
||||
|
||||
mStr.Printf("%i", mTask.xpreward);
|
||||
mRewardXP->Clear();
|
||||
mRewardXP->AppendText(mStr);
|
||||
mRewardXP->Enable();
|
||||
mStr.clear();
|
||||
|
||||
mRewardMethod->Select(mTask.rewardmethod);
|
||||
mRewardMethod->Enable();
|
||||
ShowRewardChange(mTask.rewardmethod, mTask.rewardid);
|
||||
|
||||
mStartZone->Enable();
|
||||
SetZoneSelectionById(mTask.startzone);
|
||||
|
||||
mTaskRepeatable->Enable();
|
||||
mTaskRepeatable->SetValue(mTask.repeatable);
|
||||
|
||||
ClearActivities();
|
||||
ActivitiesSelectionList->Enable();
|
||||
PopulateActivities();
|
||||
openedActivity.activityid = -1;
|
||||
openedActivity.id = -1;
|
||||
openedActivity.step = -1;
|
||||
|
||||
mActText1->Clear();
|
||||
mActText1->Disable();
|
||||
mActText2->Clear();
|
||||
mActText2->Disable();
|
||||
mActText3->Clear();
|
||||
mActText3->Disable();
|
||||
mActivityZone->Select(0);
|
||||
mActivityZone->Disable();
|
||||
mActivityOptional->SetValue(false);
|
||||
mActivityOptional->Disable();
|
||||
mActID->Clear();
|
||||
mActID->Disable();
|
||||
mActStep->Clear();
|
||||
mActStep->Disable();
|
||||
mActType->Select(0);
|
||||
mActType->Disable();
|
||||
mActDeliver->Clear();
|
||||
mActDeliver->Disable();
|
||||
mActGoalID->Clear();
|
||||
mActGoalID->Disable();
|
||||
mActGoalCount->Clear();
|
||||
mActGoalCount->Disable();
|
||||
|
||||
mActMethod->Select(2);
|
||||
mActMethod->Disable();
|
||||
|
||||
ShowRewardItems->Enable();
|
||||
RefreshItems->Enable();
|
||||
}
|
||||
|
||||
void MainFrame::ContextClick(wxContextMenuEvent& event)
|
||||
{
|
||||
mErrorLog->Log(eqEmuLogBoth, "Context Menu Requested");
|
||||
if(event.GetPosition() == wxDefaultPosition)
|
||||
{
|
||||
mErrorLog->Log(eqEmuLogBoth, "Context Menu Triggered From Keyboard.");
|
||||
}
|
||||
else{
|
||||
wxPoint p = event.GetPosition();
|
||||
mErrorLog->Log(eqEmuLogBoth, "Context Menu Triggered At (%d,%d)", p.x, p.y);
|
||||
wxPoint stcp = ScreenToClient(p);
|
||||
mErrorLog->Log(eqEmuLogBoth, "Context Menu Triggered At (%d,%d)(Adjusted for Client)", stcp.x, stcp.y);
|
||||
|
||||
//big box on the side: holds tasks
|
||||
if(stcp.x >= 7 && stcp.x <= 133)
|
||||
{
|
||||
if(stcp.y >=7 && stcp.y <= 258)
|
||||
{
|
||||
ContextMenuTaskList();
|
||||
}
|
||||
}
|
||||
|
||||
//small box on the 2nd tab: must be on top to work
|
||||
if(stcp.x >= 146 && stcp.x <= 243)
|
||||
{
|
||||
if(stcp.y >=23 && stcp.y <= 529)
|
||||
{
|
||||
if(MainPanel2->IsShownOnScreen())
|
||||
ContextMenuActivityList();
|
||||
else if(MainPanel3->IsShownOnScreen())
|
||||
ContextMenuGoalList();
|
||||
else if(MainPanel4->IsShownOnScreen())
|
||||
ContextMenuProximity();
|
||||
}
|
||||
}
|
||||
|
||||
if(stcp.x >= 297 && stcp.x <= 442)
|
||||
{
|
||||
if(stcp.y >= 74 && stcp.y <= 368)
|
||||
{
|
||||
if(MainPanel3->IsShownOnScreen() && GoalsValuesList->IsEnabled())
|
||||
ContextMenuGoalValueList();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MainFrame::About(wxCommandEvent& event)
|
||||
{
|
||||
wxAboutDialogInfo info;
|
||||
info.SetName(_("Task Master"));
|
||||
info.SetVersion(_(TASK_MASTER_VERSION));
|
||||
info.SetDescription(_("Task Creation Tool"));
|
||||
info.SetWebSite("www.eqemulator.net");
|
||||
|
||||
wxAboutBox(info);
|
||||
}
|
||||
@@ -0,0 +1,255 @@
|
||||
#ifndef EQWX_BASE__H
|
||||
#define EQWX_BASE__H
|
||||
#include <wx/frame.h>
|
||||
#include <wx/textctrl.h>
|
||||
#include <wx/notebook.h>
|
||||
#include <mysql.h>
|
||||
#include "ErrorLog.h"
|
||||
#include "tasks.h"
|
||||
#include "items.h"
|
||||
#include <vector>
|
||||
|
||||
#define TASK_MASTER_VERSION "1.0.8"
|
||||
|
||||
class MainApp: public wxApp
|
||||
{
|
||||
public:
|
||||
virtual bool OnInit();
|
||||
};
|
||||
|
||||
class MainFrame: public wxFrame
|
||||
{
|
||||
public:
|
||||
MainFrame( const wxString& title, const wxPoint& pos, const wxSize& size );
|
||||
wxTextCtrl *MainEditBox;
|
||||
wxMenuBar *MainMenu;
|
||||
|
||||
//various elements
|
||||
wxBoxSizer* BoxSizer1;
|
||||
wxListBox *ItemSelectionList;
|
||||
wxNotebook *MainNotebookBack;
|
||||
|
||||
wxPanel *MainPanel1;
|
||||
|
||||
/*General Panel Controls*/
|
||||
wxStaticText *mTaskNameLabel;
|
||||
wxTextCtrl *mTaskName;
|
||||
wxStaticText *mTaskDescLabel;
|
||||
wxTextCtrl *mTaskDesc;
|
||||
wxStaticText *mTaskMinLvlLabel;
|
||||
wxTextCtrl *mTaskMinLvl;
|
||||
wxStaticText *mTaskMaxLvlLabel;
|
||||
wxTextCtrl *mTaskMaxLvl;
|
||||
wxStaticText *mTaskDurationLabel;
|
||||
wxTextCtrl *mTaskDuration;
|
||||
wxStaticBox *mRewardsBox;
|
||||
wxStaticText *mRewardNameLabel;
|
||||
wxTextCtrl *mRewardName;
|
||||
wxStaticText *mRewardIDLabel;
|
||||
wxTextCtrl *mRewardID;
|
||||
wxStaticText *mRewardCashLabel;
|
||||
wxTextCtrl *mRewardCash;
|
||||
wxStaticText *mRewardXPLabel;
|
||||
wxTextCtrl *mRewardXP;
|
||||
wxStaticText *mRewardMethodLabel;
|
||||
wxChoice *mRewardMethod;
|
||||
wxListBox *ShowRewardItems;
|
||||
wxButton *RefreshItems;
|
||||
wxStaticText *mStartZoneLabel;
|
||||
wxChoice *mStartZone;
|
||||
|
||||
wxCheckBox *mTaskRepeatable;
|
||||
/*General Panel Controls End*/
|
||||
|
||||
wxPanel *MainPanel2;
|
||||
|
||||
/*Activities Panel Controls*/
|
||||
wxListBox *ActivitiesSelectionList;
|
||||
wxStaticText *mActText1Label;
|
||||
wxTextCtrl *mActText1;
|
||||
wxStaticText *mActText2Label;
|
||||
wxTextCtrl *mActText2;
|
||||
wxStaticText *mActText3Label;
|
||||
wxTextCtrl *mActText3;
|
||||
wxStaticText *mActivityZoneLabel;
|
||||
wxChoice *mActivityZone;
|
||||
wxCheckBox *mActivityOptional;
|
||||
wxStaticText *mActIDLabel;
|
||||
wxTextCtrl *mActID;
|
||||
wxStaticText *mActStepLabel;
|
||||
wxTextCtrl *mActStep;
|
||||
wxStaticText *mActTypeLabel;
|
||||
wxChoice *mActType;
|
||||
wxStaticBox *mActInfo;
|
||||
wxStaticText *mActInfoText;
|
||||
wxStaticText *mActDeliverLabel;
|
||||
wxTextCtrl *mActDeliver;
|
||||
wxStaticText *mActMethodLabel;
|
||||
wxChoice *mActMethod;
|
||||
wxStaticText *mActGoalIDLabel;
|
||||
wxTextCtrl *mActGoalID;
|
||||
wxStaticText *mActGoalCountLabel;
|
||||
wxTextCtrl *mActGoalCount;
|
||||
/*Activities Panel Controls End*/
|
||||
|
||||
wxPanel *MainPanel3;
|
||||
|
||||
/*Goals Panel Control Start*/
|
||||
wxListBox *GoalsSelectionList;
|
||||
wxListBox *GoalsValuesList;
|
||||
wxButton *mGoalsNewValueButton;
|
||||
wxButton *mGoalsDeleteValueButton;
|
||||
wxButton *mGoalsChangeValueButton;
|
||||
/*Goals Panel Control End*/
|
||||
|
||||
wxPanel *MainPanel4;
|
||||
|
||||
/*Proximity Panel Control Start*/
|
||||
wxListBox *ProximitySelectionList;
|
||||
wxStaticText *mProxIdLabel;
|
||||
wxTextCtrl *mProxId;
|
||||
wxStaticText *mProxMinxLabel;
|
||||
wxTextCtrl *mProxMinx;
|
||||
wxStaticText *mProxMaxxLabel;
|
||||
wxTextCtrl *mProxMaxx;
|
||||
wxStaticText *mProxMinyLabel;
|
||||
wxTextCtrl *mProxMiny;
|
||||
wxStaticText *mProxMaxyLabel;
|
||||
wxTextCtrl *mProxMaxy;
|
||||
wxStaticText *mProxMinzLabel;
|
||||
wxTextCtrl *mProxMinz;
|
||||
wxStaticText *mProxMaxzLabel;
|
||||
wxTextCtrl *mProxMaxz;
|
||||
wxStaticText *mProxZoneLabel;
|
||||
wxChoice *mProxZone;
|
||||
/*Proximity Panel Control End*/
|
||||
|
||||
wxPanel *MainPanel5;
|
||||
/*Task Set Panel Control Start*/
|
||||
/*Task Set Panel Control End*/
|
||||
|
||||
//error
|
||||
EQEmuErrorLog *mErrorLog;
|
||||
|
||||
/*database stuff*/
|
||||
MYSQL *mMysql;
|
||||
char server[256];
|
||||
char user[256];
|
||||
char password[256];
|
||||
char database[256];
|
||||
bool GetDatabaseSettings();
|
||||
bool LoadTasks();
|
||||
bool LoadGoals();
|
||||
bool LoadActivities();
|
||||
bool LoadItems();
|
||||
bool LoadZones();
|
||||
bool LoadProximity();
|
||||
|
||||
//I use vectors for everything speed of adding/removing isn't an issue for me.
|
||||
//Could use list for task, goals and activities if wanted.
|
||||
std::vector<eqtask> taskList;
|
||||
std::vector<eqtask_goallist> goalTaskList;
|
||||
std::vector<eqitem> itemList;
|
||||
std::vector<eqtask_activities> taskActivitiesList;
|
||||
std::vector<eqtask_zones> taskZoneList;
|
||||
std::vector<eqtask_proximity> taskProximityList;
|
||||
|
||||
int selectedIndex;
|
||||
int openedIndex;
|
||||
unsigned int highestIndex;
|
||||
eqtask_activity_id openedActivity;
|
||||
int openedGoal;
|
||||
eqtask_prox openedProximity;
|
||||
|
||||
void Connect(wxCommandEvent& event);
|
||||
void Save(wxCommandEvent& event);
|
||||
void Quit(wxCommandEvent& event);
|
||||
void NewTask(wxCommandEvent& event);
|
||||
void DeleteTask(wxCommandEvent& event);
|
||||
void SaveTask(wxCommandEvent& event);
|
||||
void About(wxCommandEvent& event);
|
||||
|
||||
void NewActivity(wxCommandEvent& event);
|
||||
void DeleteActivity(wxCommandEvent& event);
|
||||
void SaveActivity(wxCommandEvent& event);
|
||||
|
||||
void ListBoxDoubleClick(wxCommandEvent& event);
|
||||
void ListBoxSimpleSelect(wxCommandEvent& event);
|
||||
void OnRewardButton(wxCommandEvent& event);
|
||||
void ActivitiesListBoxSimpleSelect(wxCommandEvent& event);
|
||||
void ActivitiesListBoxDoubleClick(wxCommandEvent& event);
|
||||
void ActivityChoiceChange(wxCommandEvent& event);
|
||||
void PopulateActivities();
|
||||
void FillActivity(int id, int activityid, int step);
|
||||
|
||||
void GoalsListBoxDoubleClick(wxCommandEvent& event);
|
||||
void PopulateGoals();
|
||||
void PopulateGoalValues(unsigned int goalid);
|
||||
void ClearGoalValues();
|
||||
void NewGoal(wxCommandEvent& event);
|
||||
void DeleteGoal(wxCommandEvent& event);
|
||||
void NewGoalValue(wxCommandEvent& event);
|
||||
void DeleteGoalValue(wxCommandEvent& event);
|
||||
void ChangeGoalValue(wxCommandEvent& event);
|
||||
|
||||
void ProximityListBoxDoubleClick(wxCommandEvent& event);
|
||||
void NewProximity(wxCommandEvent& event);
|
||||
void DeleteProximity(wxCommandEvent& event);
|
||||
void SaveProximity(wxCommandEvent& event);
|
||||
void PopulateProximity();
|
||||
void FillProximityValues(unsigned int zone, unsigned int explore);
|
||||
|
||||
void ShowRewardChange(int rewardType, int rewardId);
|
||||
void SetZoneSelectionById(int zid);
|
||||
void SetZoneSelectionByIdActivity(int zid);
|
||||
void SetZoneSelectionByIdProximity(int zid);
|
||||
wxString MakeStringSQLSafe(const char * c);
|
||||
|
||||
void ContextClick(wxContextMenuEvent& event);
|
||||
void ContextMenuTaskList();
|
||||
void ContextMenuActivityList();
|
||||
void ContextMenuGoalList();
|
||||
void ContextMenuGoalValueList();
|
||||
void ContextMenuProximity();
|
||||
|
||||
|
||||
//we need to free the memory used when we change activites becase we attach it to
|
||||
//the items in our activities table and don't have any other way to track them so
|
||||
//Free it up before we call ActivitiesSelectionList->Clear();
|
||||
void ClearActivities();
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
TEXT_Main = wxID_HIGHEST + 1,
|
||||
MENU_Connect,
|
||||
MENU_Quit,
|
||||
MENU_NewTask,
|
||||
MENU_DeleteTask,
|
||||
MENU_SaveTask,
|
||||
LIST_Click,
|
||||
BUTTON_Reward,
|
||||
LIST_Click_Activities,
|
||||
MENU_NewActivity,
|
||||
MENU_DeleteActivity,
|
||||
MENU_SaveActivity,
|
||||
CHOICE_ActivityChoiceChange,
|
||||
MENU_About,
|
||||
LIST_Click_Goals,
|
||||
MENU_NewGoal,
|
||||
MENU_DeleteGoal,
|
||||
MENU_AddGoalItem,
|
||||
MENU_DeleteGoalItem,
|
||||
MENU_ModifyGoalItem,
|
||||
BUTTON_AddGoalItem,
|
||||
BUTTON_DeleteGoalItem,
|
||||
BUTTON_ModifyGoalItem,
|
||||
MENU_NewProximity,
|
||||
MENU_DeleteProximity,
|
||||
MENU_SaveProximity,
|
||||
LIST_Click_Proximity,
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,442 @@
|
||||
#include <wx/wx.h>
|
||||
#include <mysql.h>
|
||||
#include <vector>
|
||||
#include "tasks.h"
|
||||
#include "utility.h"
|
||||
#include "items.h"
|
||||
#include "base.h"
|
||||
#include "ErrorLog.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
bool MainFrame::GetDatabaseSettings(){
|
||||
FILE *mFile = NULL;
|
||||
mFile = fopen("db.txt", "r");
|
||||
|
||||
//very little error checking
|
||||
//we don't make sure the values in the file are valid
|
||||
//or all there just that the file exists so:
|
||||
//don't fuck this up.
|
||||
if(mFile){
|
||||
//this isn't all that safe
|
||||
char chunk[256];
|
||||
memset(chunk, 0, 256);
|
||||
|
||||
fgets(chunk, 256, mFile);
|
||||
strcpy(server, chunk);
|
||||
for(int i = 0; i<256; i++){
|
||||
if(server[i] == '\n')
|
||||
server[i] = '\0';
|
||||
}
|
||||
memset(chunk, 0, 256);
|
||||
|
||||
fgets(chunk, 256, mFile);
|
||||
strcpy(database, chunk);
|
||||
for(int i = 0; i<256; i++){
|
||||
if(database[i] == '\n')
|
||||
database[i] = '\0';
|
||||
}
|
||||
memset(chunk, 0, 256);
|
||||
|
||||
fgets(chunk, 256, mFile);
|
||||
strcpy(user, chunk);
|
||||
for(int i = 0; i<256; i++){
|
||||
if(user[i] == '\n')
|
||||
user[i] = '\0';
|
||||
}
|
||||
memset(chunk, 0, 256);
|
||||
|
||||
fgets(chunk, 256, mFile);
|
||||
strcpy(password, chunk);
|
||||
for(int i = 0; i<256; i++){
|
||||
if(password[i] == '\n')
|
||||
password[i] = '\0';
|
||||
}
|
||||
memset(chunk, 0, 256);
|
||||
}
|
||||
else{
|
||||
mErrorLog->Log(eqEmuLogBoth, "Error opening file db.txt, could not read db settings.");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool MainFrame::LoadItems(){
|
||||
if(mMysql){
|
||||
mErrorLog->Log(eqEmuLogBoth, "Loading Items...");
|
||||
unsigned int itemsLoaded = 0;
|
||||
MYSQL_RES *res;
|
||||
MYSQL_ROW row;
|
||||
|
||||
if (mysql_query(mMysql, "SELECT name,id FROM items")) {
|
||||
mErrorLog->Log(eqEmuLogBoth, "MySQL Connection Error: %s", mysql_error(mMysql));
|
||||
return false;
|
||||
}
|
||||
res = mysql_use_result(mMysql);
|
||||
while ((row = mysql_fetch_row(res)) != NULL){
|
||||
eqitem newIT;
|
||||
strcpy(newIT.name, row[0]);
|
||||
newIT.id = atoi(row[1]);
|
||||
itemList.push_back(newIT);
|
||||
itemsLoaded++;
|
||||
}
|
||||
mErrorLog->Log(eqEmuLogBoth, "%u Successfully Loaded Items", itemsLoaded);
|
||||
mysql_free_result(res);
|
||||
}
|
||||
else{
|
||||
mErrorLog->Log(eqEmuLogBoth, "Mysql connection did not exist for item load.");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool MainFrame::LoadZones()
|
||||
{
|
||||
if(mMysql){
|
||||
mErrorLog->Log(eqEmuLogBoth, "Loading Zones...");
|
||||
unsigned int zonesLoaded = 0;
|
||||
MYSQL_RES *res;
|
||||
MYSQL_ROW row;
|
||||
|
||||
if (mysql_query(mMysql, "SELECT short_name,zoneidnumber FROM zone")) {
|
||||
mErrorLog->Log(eqEmuLogBoth, "MySQL Connection Error: %s", mysql_error(mMysql));
|
||||
return false;
|
||||
}
|
||||
|
||||
wxString zoneStr;
|
||||
zoneStr.Printf("**Unknown Zone**");
|
||||
int * id = new int;
|
||||
*id = -1;
|
||||
mStartZone->Append(zoneStr, (void*)id);
|
||||
|
||||
zoneStr.Clear();
|
||||
zoneStr.Printf("*Any Zone*");
|
||||
id = new int;
|
||||
*id = 0;
|
||||
mStartZone->Append(zoneStr, (void*)id);
|
||||
|
||||
mActivityZone->Append(zoneStr, (void*)id);
|
||||
mProxZone->Append(zoneStr, (void*)id);
|
||||
zoneStr.clear();
|
||||
mStartZone->Select(0);
|
||||
mActivityZone->Select(0);
|
||||
mProxZone->Select(0);
|
||||
|
||||
res = mysql_use_result(mMysql);
|
||||
while ((row = mysql_fetch_row(res)) != NULL){
|
||||
eqtask_zones newZ;
|
||||
strcpy(newZ.name, row[0]);
|
||||
|
||||
newZ.id = atoi(row[1]);
|
||||
taskZoneList.push_back(newZ);
|
||||
|
||||
int * zoneId = new int;
|
||||
*zoneId = newZ.id;
|
||||
wxString zoneNameStr;
|
||||
|
||||
zoneNameStr.Printf("%s", newZ.name);
|
||||
mStartZone->Append(zoneNameStr, (void*)zoneId);
|
||||
mActivityZone->Append(zoneNameStr, (void*)zoneId);
|
||||
mProxZone->Append(zoneNameStr, (void*)zoneId);
|
||||
zoneNameStr.clear();
|
||||
|
||||
zonesLoaded++;
|
||||
}
|
||||
mErrorLog->Log(eqEmuLogBoth, "%u Successfully Loaded Zones", zonesLoaded);
|
||||
mysql_free_result(res);
|
||||
}
|
||||
else{
|
||||
mErrorLog->Log(eqEmuLogBoth, "Mysql connection did not exist for zone load.");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool MainFrame::LoadTasks()
|
||||
{
|
||||
if(mMysql){
|
||||
mErrorLog->Log(eqEmuLogBoth, "Loading Tasks...");
|
||||
unsigned int tasksLoaded = 0;
|
||||
MYSQL_RES *res;
|
||||
MYSQL_ROW row;
|
||||
|
||||
if (mysql_query(mMysql, "SELECT id, title, description, reward, rewardid, cashreward, xpreward, rewardmethod, startzone, duration, minlevel, maxlevel, repeatable FROM tasks")) {
|
||||
mErrorLog->Log(eqEmuLogBoth, "MySQL Connection Error: %s", mysql_error(mMysql));
|
||||
return false;
|
||||
}
|
||||
|
||||
res = mysql_use_result(mMysql);
|
||||
while ((row = mysql_fetch_row(res)) != NULL){
|
||||
eqtask newT;
|
||||
newT.id = atoi(row[0]);
|
||||
|
||||
//This isn't all that safe
|
||||
//Working under the assumption that:
|
||||
//Any database you connect to is not
|
||||
//Going to want to hurt you
|
||||
strcpy(newT.title, row[1]);
|
||||
strcpy(newT.desc, row[2]);
|
||||
strcpy(newT.reward, row[3]);
|
||||
|
||||
wxString str;
|
||||
str.Printf("%d:%s", newT.id, newT.title);
|
||||
ItemSelectionList->Append(str);
|
||||
|
||||
if(newT.id > highestIndex)
|
||||
highestIndex = newT.id;
|
||||
|
||||
newT.rewardid = atoi(row[4]);
|
||||
newT.cashreward = atoi(row[5]);
|
||||
newT.xpreward = atoi(row[6]);
|
||||
newT.rewardmethod = atoi(row[7]);
|
||||
newT.startzone = atoi(row[8]);
|
||||
newT.duration = atoi(row[9]);
|
||||
newT.level_min = atoi(row[10]);
|
||||
newT.level_max = atoi(row[11]);
|
||||
newT.repeatable = atoi(row[12]) ? true : false;
|
||||
|
||||
taskList.push_back(newT);
|
||||
|
||||
tasksLoaded++;
|
||||
}
|
||||
mErrorLog->Log(eqEmuLogBoth, "%u Successfully Loaded Tasks", tasksLoaded);
|
||||
mysql_free_result(res);
|
||||
}
|
||||
else{
|
||||
mErrorLog->Log(eqEmuLogBoth, "Mysql connection did not exist for task load.");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool MainFrame::LoadGoals()
|
||||
{
|
||||
if(mMysql){
|
||||
mErrorLog->Log(eqEmuLogBoth, "Loading Goals...");
|
||||
unsigned int goalsLoaded = 0;
|
||||
MYSQL_RES *res;
|
||||
MYSQL_ROW row;
|
||||
|
||||
if (mysql_query(mMysql, "SELECT listid, entry FROM goallists")) {
|
||||
mErrorLog->Log(eqEmuLogBoth, "MySQL Connection Error: %s", mysql_error(mMysql));
|
||||
return false;
|
||||
}
|
||||
|
||||
res = mysql_use_result(mMysql);
|
||||
while ((row = mysql_fetch_row(res)) != NULL){
|
||||
eqtask_goallist newGL;
|
||||
newGL.id = atoi(row[0]);
|
||||
newGL.value = atoi(row[1]);
|
||||
goalTaskList.push_back(newGL);
|
||||
|
||||
goalsLoaded++;
|
||||
}
|
||||
mErrorLog->Log(eqEmuLogBoth, "%u Successfully Loaded Goals", goalsLoaded);
|
||||
mysql_free_result(res);
|
||||
}
|
||||
else{
|
||||
mErrorLog->Log(eqEmuLogBoth, "Mysql connection did not exist for goal load.");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool MainFrame::LoadActivities()
|
||||
{
|
||||
if(mMysql){
|
||||
mErrorLog->Log(eqEmuLogBoth, "Loading Activities...");
|
||||
unsigned int activitiesLoaded = 0;
|
||||
MYSQL_RES *res;
|
||||
MYSQL_ROW row;
|
||||
|
||||
if (mysql_query(mMysql, "SELECT taskid, activityid, step, activitytype, text1, text2, text3, goalid, goalmethod, goalcount, delivertonpc, zoneid, optional FROM activities")) {
|
||||
mErrorLog->Log(eqEmuLogBoth, "MySQL Connection Error: %s", mysql_error(mMysql));
|
||||
return false;
|
||||
}
|
||||
|
||||
res = mysql_use_result(mMysql);
|
||||
while ((row = mysql_fetch_row(res)) != NULL){
|
||||
eqtask_activities newAL;
|
||||
|
||||
newAL.id = atoi(row[0]);
|
||||
newAL.activityId = atoi(row[1]);
|
||||
newAL.step = atoi(row[2]);
|
||||
newAL.activityType = atoi(row[3]);
|
||||
strcpy(newAL.text1, row[4]);
|
||||
strcpy(newAL.text2, row[5]);
|
||||
strcpy(newAL.text3, row[6]);
|
||||
newAL.goalid = atoi(row[7]);
|
||||
newAL.goalmethod = atoi(row[8]);
|
||||
newAL.goalcount = atoi(row[9]);
|
||||
newAL.deliverToNpc = atoi(row[10]);
|
||||
newAL.zoneid = atoi(row[11]);
|
||||
newAL.optional = atoi(row[12]) ? true : false;
|
||||
|
||||
taskActivitiesList.push_back(newAL);
|
||||
activitiesLoaded++;
|
||||
}
|
||||
mErrorLog->Log(eqEmuLogBoth, "%u Successfully Loaded Activities", activitiesLoaded);
|
||||
mysql_free_result(res);
|
||||
}
|
||||
else{
|
||||
mErrorLog->Log(eqEmuLogBoth, "Mysql connection did not exist for activity load.");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool MainFrame::LoadProximity()
|
||||
{
|
||||
if(mMysql){
|
||||
mErrorLog->Log(eqEmuLogBoth, "Loading Proximities...");
|
||||
unsigned int proximitiesLoaded = 0;
|
||||
MYSQL_RES *res;
|
||||
MYSQL_ROW row;
|
||||
|
||||
if (mysql_query(mMysql, "SELECT zoneid, exploreid, minx, maxx, miny, maxy, minz, maxz FROM proximities")) {
|
||||
mErrorLog->Log(eqEmuLogBoth, "MySQL Connection Error: %s", mysql_error(mMysql));
|
||||
return false;
|
||||
}
|
||||
|
||||
res = mysql_use_result(mMysql);
|
||||
while ((row = mysql_fetch_row(res)) != NULL){
|
||||
eqtask_proximity newPR;
|
||||
|
||||
newPR.zoneid = atoi(row[0]);
|
||||
newPR.exploreid = atoi(row[1]);
|
||||
newPR.minx = atof(row[2]);
|
||||
newPR.maxx = atof(row[3]);
|
||||
newPR.miny = atof(row[4]);
|
||||
newPR.maxy = atof(row[5]);
|
||||
newPR.minz = atof(row[6]);
|
||||
newPR.maxz = atof(row[7]);
|
||||
|
||||
taskProximityList.push_back(newPR);
|
||||
proximitiesLoaded++;
|
||||
}
|
||||
mErrorLog->Log(eqEmuLogBoth, "%u Successfully Loaded Proximities", proximitiesLoaded);
|
||||
mysql_free_result(res);
|
||||
}
|
||||
else{
|
||||
mErrorLog->Log(eqEmuLogBoth, "Mysql connection did not exist for proximity load.");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void MainFrame::ShowRewardChange(int rewardType, int rewardId)
|
||||
{
|
||||
if(rewardType == 2){
|
||||
ShowRewardItems->Clear();
|
||||
}
|
||||
else if(rewardType == 0 && rewardId != 0){
|
||||
ShowRewardItems->Clear();
|
||||
vector<eqitem>::iterator Iter;
|
||||
|
||||
for(Iter = itemList.begin(); Iter!=itemList.end(); Iter++)
|
||||
{
|
||||
eqitem eqi = *Iter;
|
||||
if(eqi.id == rewardId){
|
||||
wxString itStr;
|
||||
itStr.Printf("%u: %s", eqi.id, eqi.name);
|
||||
ShowRewardItems->Append(itStr);
|
||||
itStr.clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(rewardType == 1 && rewardId != 0)
|
||||
{
|
||||
ShowRewardItems->Clear();
|
||||
vector<eqtask_goallist>::iterator Iter;
|
||||
for(Iter = goalTaskList.begin(); Iter!=goalTaskList.end(); Iter++)
|
||||
{
|
||||
eqtask_goallist gli = *Iter;
|
||||
if(gli.id == rewardId)
|
||||
{
|
||||
vector<eqitem>::iterator itemIter;
|
||||
for(itemIter = itemList.begin(); itemIter!=itemList.end(); itemIter++)
|
||||
{
|
||||
eqitem eqi = *itemIter;
|
||||
if(eqi.id == gli.value)
|
||||
{
|
||||
wxString itStr;
|
||||
itStr.Printf("%u: %s", eqi.id, eqi.name);
|
||||
ShowRewardItems->Append(itStr);
|
||||
itStr.clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else{
|
||||
ShowRewardItems->Clear();
|
||||
}
|
||||
}
|
||||
|
||||
void MainFrame::SetZoneSelectionById(int zid)
|
||||
{
|
||||
for(unsigned int x = 0; x < mStartZone->GetCount(); x++)
|
||||
{
|
||||
int *i;
|
||||
i = (int*) mStartZone->GetClientData(x);
|
||||
if(i){
|
||||
if(*i == zid){
|
||||
mStartZone->Select(x);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
mErrorLog->Log(eqEmuLogBoth, "MainFrame::SetZoneSelectionById: i was NULL");
|
||||
}
|
||||
}
|
||||
mStartZone->Select(0); //we have no valid zone
|
||||
}
|
||||
|
||||
void MainFrame::SetZoneSelectionByIdActivity(int zid)
|
||||
{
|
||||
for(unsigned int x = 0; x < mActivityZone->GetCount(); x++)
|
||||
{
|
||||
int *i;
|
||||
i = (int*) mActivityZone->GetClientData(x);
|
||||
if(i){
|
||||
if(*i == zid){
|
||||
mActivityZone->Select(x);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
mErrorLog->Log(eqEmuLogBoth, "MainFrame::SetZoneSelectionByIdActivity: i was NULL");
|
||||
}
|
||||
}
|
||||
mActivityZone->Select(0); //we have no valid zone
|
||||
}
|
||||
|
||||
void MainFrame::SetZoneSelectionByIdProximity(int zid)
|
||||
{
|
||||
for(unsigned int x = 0; x < mProxZone->GetCount(); x++)
|
||||
{
|
||||
int *i;
|
||||
i = (int*) mProxZone->GetClientData(x);
|
||||
if(i){
|
||||
if(*i == zid){
|
||||
mProxZone->Select(x);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
mErrorLog->Log(eqEmuLogBoth, "MainFrame::SetZoneSelectionByIdProximity: i was NULL");
|
||||
}
|
||||
}
|
||||
mProxZone->Select(0); //we have no valid zone
|
||||
}
|
||||
|
||||
wxString MainFrame::MakeStringSQLSafe(const char * c)
|
||||
{
|
||||
wxString ret;
|
||||
ret.Printf("%s", c);
|
||||
ret.Replace("\'", "\\\'");
|
||||
return ret;
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
=01/09/2010=
|
||||
Trevius: The xpreward field now allows a negative value to match a change in Rev1803.
|
||||
|
||||
=04/27/2009=
|
||||
KLS: Fix for reward method not saving.
|
||||
|
||||
=10/12/2008=
|
||||
KLS: Improved some sql syntax to be more safe.
|
||||
KLS: Increased the size of goal count box significantly.
|
||||
KLS: Added id select for new task.
|
||||
KLS: Made change goal value more smooth.
|
||||
KLS: Removed database.cpp and database.h from project file.
|
||||
|
||||
=10/11/2008=
|
||||
KLS: SQL logging will now include a time stamped comment
|
||||
KLS: Updated some SQL queries.
|
||||
KLS: Changed default sql log file.
|
||||
KLS: Added method to account for ' in SQL syntax. Can expand to other control characters if needed
|
||||
|
||||
=10/10/2008=
|
||||
KLS: Initial Entry.
|
||||
@@ -0,0 +1,433 @@
|
||||
#include <wx/wx.h>
|
||||
#include <wx/numdlg.h>
|
||||
#include <mysql.h>
|
||||
#include <vector>
|
||||
#include "tasks.h"
|
||||
#include "utility.h"
|
||||
#include "base.h"
|
||||
#include "ErrorLog.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
void MainFrame::GoalsListBoxDoubleClick(wxCommandEvent& event)
|
||||
{
|
||||
int * i = (int*) GoalsSelectionList->GetClientData(event.GetInt());
|
||||
if(i){
|
||||
int mI = *i;
|
||||
PopulateGoalValues(mI);
|
||||
}
|
||||
}
|
||||
|
||||
void MainFrame::PopulateGoals()
|
||||
{
|
||||
mErrorLog->Log(eqEmuLogBoth, "Adding goals to the goal list box");
|
||||
vector<eqtask_goallist>::iterator Iter;
|
||||
|
||||
if(goalTaskList.size() == 0)
|
||||
{
|
||||
mErrorLog->Log(eqEmuLogBoth, "No goals in DB, cannot add to list box");
|
||||
return;
|
||||
}
|
||||
|
||||
for(Iter = goalTaskList.begin(); Iter != goalTaskList.end(); Iter++)
|
||||
{
|
||||
eqtask_goallist val = (*Iter);
|
||||
bool exists = false;
|
||||
if(GoalsSelectionList->GetCount() > 0){
|
||||
for(unsigned int i = 0; i < GoalsSelectionList->GetCount(); i++)
|
||||
{
|
||||
int *cd = (int*)GoalsSelectionList->GetClientData(i);
|
||||
if(*cd == val.id){
|
||||
exists = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!exists){
|
||||
int *newCD = new int;
|
||||
*newCD = val.id;
|
||||
wxString newStr;
|
||||
newStr.Printf("%u", *newCD);
|
||||
GoalsSelectionList->Append(newStr, (void*)newCD);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MainFrame::PopulateGoalValues(unsigned int goalid)
|
||||
{
|
||||
GoalsValuesList->Enable();
|
||||
mGoalsNewValueButton->Enable();
|
||||
mGoalsDeleteValueButton->Enable();
|
||||
mGoalsChangeValueButton->Enable();
|
||||
ClearGoalValues();
|
||||
openedGoal = goalid;
|
||||
vector<eqtask_goallist>::iterator Iter;
|
||||
if(goalTaskList.size() != 0){
|
||||
for(Iter = goalTaskList.begin(); Iter != goalTaskList.end(); Iter++)
|
||||
{
|
||||
if((*Iter).id == goalid){
|
||||
int *i = new int;
|
||||
*i = (*Iter).value;
|
||||
|
||||
wxString curStr;
|
||||
curStr.Clear();
|
||||
curStr.Printf("%u", (*Iter).value);
|
||||
|
||||
GoalsValuesList->Append(curStr, (void*)i);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MainFrame::ClearGoalValues()
|
||||
{
|
||||
if(GoalsValuesList->GetCount() > 0){
|
||||
for(unsigned int x = 0; x < GoalsValuesList->GetCount(); x++)
|
||||
{
|
||||
int *i = (int*)GoalsValuesList->GetClientData(x);
|
||||
if(i){
|
||||
delete i;
|
||||
i = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
GoalsValuesList->Clear();
|
||||
}
|
||||
|
||||
void MainFrame::NewGoal(wxCommandEvent& event)
|
||||
{
|
||||
if(!mMysql){
|
||||
mErrorLog->Log(eqEmuLogBoth, "New goal failed, not connected to db");
|
||||
return;
|
||||
}
|
||||
int newID = wxGetNumberFromUser("", "New ID:", "Input ID", 0, 0, 9999999);
|
||||
int newVal = wxGetNumberFromUser("", "New Value:", "Input Value", 0, 0, 9999999);
|
||||
|
||||
bool exists = false;
|
||||
for(unsigned int x = 0; x < GoalsSelectionList->GetCount(); x++)
|
||||
{
|
||||
int *di = (int*)GoalsSelectionList->GetClientData(x);
|
||||
if(*di == newID)
|
||||
exists = true;
|
||||
}
|
||||
|
||||
if(exists){
|
||||
mErrorLog->Log(eqEmuLogBoth, "New goal failed, already exists");
|
||||
return;
|
||||
}
|
||||
|
||||
if(newID <= 0){
|
||||
mErrorLog->Log(eqEmuLogBoth, "New goal failed, ID <= 0");
|
||||
return;
|
||||
}
|
||||
|
||||
if(newVal < 0){
|
||||
mErrorLog->Log(eqEmuLogBoth, "New goal failed, Val < 0");
|
||||
return;
|
||||
}
|
||||
char * mQuery = 0;
|
||||
MakeAnyLenString(&mQuery, "INSERT INTO `goallists` (`listid`,`entry`) VALUES (%u,%u)", newID, newVal);
|
||||
mErrorLog->Log(eqEmuLogSQL, "%s", mQuery);
|
||||
if (mysql_query(mMysql, mQuery)) {
|
||||
mErrorLog->Log(eqEmuLogBoth, "MySQL Error: %s", mysql_error(mMysql));
|
||||
return;
|
||||
}
|
||||
|
||||
eqtask_goallist newGoal;
|
||||
newGoal.id = newID;
|
||||
newGoal.value = newVal;
|
||||
goalTaskList.push_back(newGoal);
|
||||
|
||||
wxString newGoalStr;
|
||||
newGoalStr.Printf("%u", newGoal.id);
|
||||
int * i = new int;
|
||||
*i = newGoal.id;
|
||||
GoalsSelectionList->Append(newGoalStr, (void*)i);
|
||||
}
|
||||
|
||||
void MainFrame::DeleteGoal(wxCommandEvent& event)
|
||||
{
|
||||
if(!mMysql){
|
||||
mErrorLog->Log(eqEmuLogBoth, "Delete goal failed, not connected to db");
|
||||
return;
|
||||
}
|
||||
|
||||
if(GoalsSelectionList->GetCount() == 0)
|
||||
{
|
||||
mErrorLog->Log(eqEmuLogBoth, "Delete goal failed, does not exist");
|
||||
return;
|
||||
}
|
||||
|
||||
if(GoalsSelectionList->GetSelection() == wxNOT_FOUND)
|
||||
{
|
||||
mErrorLog->Log(eqEmuLogBoth, "Delete goal failed, nothing selected");
|
||||
return;
|
||||
}
|
||||
|
||||
int *mId;
|
||||
mId = (int*)GoalsSelectionList->GetClientData(GoalsSelectionList->GetSelection());
|
||||
|
||||
if(!mId){
|
||||
mErrorLog->Log(eqEmuLogBoth, "Delete goal failed, mId is NULL");
|
||||
return;
|
||||
}
|
||||
|
||||
int reply = wxMessageBox("Are you sure?", "Confirm Delete", wxYES_NO, this);
|
||||
if(reply != wxYES)
|
||||
{
|
||||
mErrorLog->Log(eqEmuLogBoth, "User aborted delete of goal");
|
||||
return;
|
||||
}
|
||||
|
||||
int delVal = *mId;
|
||||
char * mQuery = 0;
|
||||
MakeAnyLenString(&mQuery, "DELETE FROM goallists where listid=%u", delVal);
|
||||
mErrorLog->Log(eqEmuLogSQL, "%s", mQuery);
|
||||
if (mysql_query(mMysql, mQuery)) {
|
||||
mErrorLog->Log(eqEmuLogBoth, "MySQL Error: %s", mysql_error(mMysql));
|
||||
return;
|
||||
}
|
||||
|
||||
vector<eqtask_goallist>::iterator Iter;
|
||||
for(Iter = goalTaskList.begin(); Iter != goalTaskList.end(); Iter++)
|
||||
{
|
||||
if((*Iter).id == delVal)
|
||||
{
|
||||
goalTaskList.erase(Iter);
|
||||
Iter = goalTaskList.begin();
|
||||
}
|
||||
}
|
||||
|
||||
if(delVal == openedGoal){
|
||||
ClearGoalValues();
|
||||
openedGoal = 0;
|
||||
mGoalsNewValueButton->Disable();
|
||||
mGoalsDeleteValueButton->Disable();
|
||||
mGoalsChangeValueButton->Disable();
|
||||
}
|
||||
|
||||
for(unsigned int x = 0; x < GoalsSelectionList->GetCount(); x++)
|
||||
{
|
||||
int * ni = (int*)GoalsSelectionList->GetClientData(x);
|
||||
if(ni){
|
||||
if(*ni == delVal){
|
||||
delete ni;
|
||||
ni = NULL;
|
||||
GoalsSelectionList->Delete(x);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MainFrame::NewGoalValue(wxCommandEvent& event)
|
||||
{
|
||||
if(!mMysql){
|
||||
mErrorLog->Log(eqEmuLogBoth, "New goal value failed, not connected to db");
|
||||
return;
|
||||
}
|
||||
|
||||
if(!GoalsValuesList->IsEnabled())
|
||||
{
|
||||
mErrorLog->Log(eqEmuLogBoth, "New goal value failed, goal values not active");
|
||||
return;
|
||||
}
|
||||
int newVal = wxGetNumberFromUser("", "Value:", "Input Value", 0, 0, 9999999);
|
||||
if(newVal < 0){
|
||||
mErrorLog->Log(eqEmuLogBoth, "New goal value failed, Val < 0");
|
||||
}
|
||||
|
||||
int id = openedGoal;
|
||||
|
||||
char * mQuery = 0;
|
||||
MakeAnyLenString(&mQuery, "INSERT INTO `goallists` (`listid`,`entry`) VALUES (%u,%u)", id, newVal);
|
||||
mErrorLog->Log(eqEmuLogSQL, "%s", mQuery);
|
||||
if (mysql_query(mMysql, mQuery)) {
|
||||
mErrorLog->Log(eqEmuLogBoth, "MySQL Error: %s", mysql_error(mMysql));
|
||||
return;
|
||||
}
|
||||
int * iptr = new int;
|
||||
*iptr = newVal;
|
||||
wxString iStr;
|
||||
iStr.Printf("%u", newVal);
|
||||
GoalsValuesList->Append(iStr, (void*)iptr);
|
||||
|
||||
eqtask_goallist newGoal;
|
||||
newGoal.id = id;
|
||||
newGoal.value = newVal;
|
||||
goalTaskList.push_back(newGoal);
|
||||
}
|
||||
|
||||
void MainFrame::DeleteGoalValue(wxCommandEvent& event)
|
||||
{
|
||||
if(!mMysql){
|
||||
mErrorLog->Log(eqEmuLogBoth, "Delete goal value failed, not connected to db");
|
||||
return;
|
||||
}
|
||||
|
||||
if(!GoalsValuesList->IsEnabled()){
|
||||
mErrorLog->Log(eqEmuLogBoth, "Delete goal value failed, goal values not active");
|
||||
return;
|
||||
}
|
||||
|
||||
if(GoalsValuesList->GetCount() <= 1)
|
||||
{
|
||||
mErrorLog->Log(eqEmuLogBoth, "Delete goal value failed, too few values");
|
||||
return;
|
||||
}
|
||||
|
||||
int ourId = openedGoal;
|
||||
int ourVal;
|
||||
int *iPtr = (int*)GoalsValuesList->GetClientData(GoalsValuesList->GetSelection());
|
||||
|
||||
if(!iPtr){
|
||||
mErrorLog->Log(eqEmuLogBoth, "Delete goal value failed, iPtr is NULL");
|
||||
return;
|
||||
}
|
||||
|
||||
int reply = wxMessageBox("Are you sure?", "Confirm Delete", wxYES_NO, this);
|
||||
if(reply != wxYES)
|
||||
{
|
||||
mErrorLog->Log(eqEmuLogBoth, "User aborted delete of goal value");
|
||||
return;
|
||||
}
|
||||
|
||||
ourVal = *iPtr;
|
||||
|
||||
char * mQuery = 0;
|
||||
MakeAnyLenString(&mQuery, "DELETE FROM goallists WHERE listid=%u AND entry=%u", ourId, ourVal);
|
||||
mErrorLog->Log(eqEmuLogSQL, "%s", mQuery);
|
||||
if (mysql_query(mMysql, mQuery)) {
|
||||
mErrorLog->Log(eqEmuLogBoth, "MySQL Error: %s", mysql_error(mMysql));
|
||||
return;
|
||||
}
|
||||
|
||||
for(unsigned int x = 0; x < GoalsValuesList->GetCount(); x++)
|
||||
{
|
||||
int *ip = (int*)GoalsValuesList->GetClientData(x);
|
||||
if(ip){
|
||||
if(*ip == ourVal){
|
||||
GoalsValuesList->Delete(x);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
vector<eqtask_goallist>::iterator Iter;
|
||||
for(Iter = goalTaskList.begin(); Iter != goalTaskList.end(); Iter++)
|
||||
{
|
||||
if((*Iter).value == ourVal && (*Iter).id == ourId)
|
||||
{
|
||||
goalTaskList.erase(Iter);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MainFrame::ChangeGoalValue(wxCommandEvent& event)
|
||||
{
|
||||
if(!mMysql){
|
||||
mErrorLog->Log(eqEmuLogBoth, "Modify goal value failed, not connected to db");
|
||||
return;
|
||||
}
|
||||
|
||||
if(!GoalsValuesList->IsEnabled()){
|
||||
mErrorLog->Log(eqEmuLogBoth, "Modify goal value failed, goal values not active");
|
||||
return;
|
||||
}
|
||||
|
||||
if(GoalsValuesList->GetSelection() == wxNOT_FOUND)
|
||||
{
|
||||
mErrorLog->Log(eqEmuLogBoth, "Modify goal value failed, no selection found");
|
||||
return;
|
||||
}
|
||||
|
||||
int changedId = openedGoal;
|
||||
int changedGoal;
|
||||
int * changedGoalPtr = (int*)GoalsValuesList->GetClientData(GoalsValuesList->GetSelection());
|
||||
|
||||
if(!changedGoalPtr)
|
||||
{
|
||||
mErrorLog->Log(eqEmuLogBoth, "Modify goal value failed, changedGoalPtr was NULL");
|
||||
return;
|
||||
}
|
||||
|
||||
changedGoal = *changedGoalPtr;
|
||||
|
||||
int newVal = wxGetNumberFromUser("", "Value:", "Input Value", changedGoal, 0, 9999999);
|
||||
|
||||
char * mQuery = 0;
|
||||
MakeAnyLenString(&mQuery, "DELETE FROM goallists WHERE listid=%u AND entry=%u", changedId, changedGoal);
|
||||
mErrorLog->Log(eqEmuLogSQL, "%s", mQuery);
|
||||
if (mysql_query(mMysql, mQuery)) {
|
||||
mErrorLog->Log(eqEmuLogBoth, "MySQL Error: %s", mysql_error(mMysql));
|
||||
return;
|
||||
}
|
||||
|
||||
MakeAnyLenString(&mQuery, "INSERT INTO `goallists` (`listid`,`entry`) VALUES (%u,%u)", changedId, newVal);
|
||||
mErrorLog->Log(eqEmuLogSQL, "%s", mQuery);
|
||||
if (mysql_query(mMysql, mQuery)) {
|
||||
mErrorLog->Log(eqEmuLogBoth, "MySQL Error: %s", mysql_error(mMysql));
|
||||
return;
|
||||
}
|
||||
|
||||
for(unsigned int x = 0; x < GoalsValuesList->GetCount(); x++)
|
||||
{
|
||||
int *ip = (int*)GoalsValuesList->GetClientData(x);
|
||||
if(ip)
|
||||
{
|
||||
if(*ip == changedGoal)
|
||||
{
|
||||
*ip = newVal;
|
||||
wxString newStr;
|
||||
newStr.Printf("%u", newVal);
|
||||
GoalsValuesList->SetString(x, newStr);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
vector<eqtask_goallist>::iterator Iter;
|
||||
for(Iter = goalTaskList.begin(); Iter != goalTaskList.end(); Iter++)
|
||||
{
|
||||
if((*Iter).id == changedId && (*Iter).value == changedGoal)
|
||||
{
|
||||
(*Iter).value = newVal;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void MainFrame::ContextMenuGoalList()
|
||||
{
|
||||
if(!mMysql){
|
||||
mErrorLog->Log(eqEmuLogBoth, "Context menu cannot open, not connected to db");
|
||||
return;
|
||||
}
|
||||
|
||||
wxMenu *mMenu;
|
||||
mMenu = new wxMenu();
|
||||
|
||||
mMenu->Append(MENU_NewGoal, wxT("New Goal"), wxT("Creates a new goal list entry"));
|
||||
mMenu->Append(MENU_DeleteGoal, wxT("Delete Goal"), wxT("Deletes the selected goal list entry"));
|
||||
|
||||
PopupMenu(mMenu);
|
||||
delete mMenu;
|
||||
}
|
||||
|
||||
void MainFrame::ContextMenuGoalValueList()
|
||||
{
|
||||
if(!mMysql){
|
||||
mErrorLog->Log(eqEmuLogBoth, "Context menu cannot open, not connected to db");
|
||||
return;
|
||||
}
|
||||
|
||||
wxMenu *mMenu;
|
||||
mMenu = new wxMenu();
|
||||
|
||||
mMenu->Append(MENU_AddGoalItem, wxT("New Goal Value"), wxT("Creates a new goal value entry for the opened list"));
|
||||
mMenu->Append(MENU_DeleteGoalItem, wxT("Delete Goal Value"), wxT("Deletes the selected goal value entry"));
|
||||
mMenu->Append(MENU_ModifyGoalItem, wxT("Modify Goal Value"), wxT("Attempts to change the selected goal value entry"));
|
||||
|
||||
PopupMenu(mMenu);
|
||||
delete mMenu;
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
#ifndef EQWX_ITEMS__H
|
||||
#define EQWX_ITEMS__H
|
||||
|
||||
struct eqitem{
|
||||
unsigned int id;
|
||||
char name[64];
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,468 @@
|
||||
#include <wx/wx.h>
|
||||
#include <wx/numdlg.h>
|
||||
#include <mysql.h>
|
||||
#include <vector>
|
||||
#include "tasks.h"
|
||||
#include "utility.h"
|
||||
#include "base.h"
|
||||
#include "ErrorLog.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
void MainFrame::ProximityListBoxDoubleClick(wxCommandEvent& event)
|
||||
{
|
||||
eqtask_prox *eqp = (eqtask_prox*)ProximitySelectionList->GetClientData(event.GetInt());
|
||||
if(eqp){
|
||||
FillProximityValues(eqp->zoneid, eqp->exploreid);
|
||||
}
|
||||
else{
|
||||
mErrorLog->Log(eqEmuLogBoth, "ProximityListBoxDoubleClick failed, eqp is NULL");
|
||||
}
|
||||
}
|
||||
|
||||
void MainFrame::PopulateProximity()
|
||||
{
|
||||
mErrorLog->Log(eqEmuLogBoth, "Populating Proximity List");
|
||||
vector<eqtask_proximity>::iterator Iter;
|
||||
for(Iter = taskProximityList.begin(); Iter != taskProximityList.end(); Iter++)
|
||||
{
|
||||
eqtask_proximity eqt;
|
||||
eqt = *Iter;
|
||||
eqtask_prox * prox = new eqtask_prox;
|
||||
|
||||
prox->exploreid = eqt.exploreid;
|
||||
prox->zoneid = eqt.zoneid;
|
||||
|
||||
wxString zoneName;
|
||||
zoneName.Printf("Unknown Zone");
|
||||
vector<eqtask_zones>::iterator ZoneIter;
|
||||
for(ZoneIter = taskZoneList.begin(); ZoneIter != taskZoneList.end(); ZoneIter++)
|
||||
{
|
||||
eqtask_zones curZone = *ZoneIter;
|
||||
if(curZone.id == prox->zoneid)
|
||||
{
|
||||
zoneName.Clear();
|
||||
zoneName.Printf("%s", curZone.name);
|
||||
}
|
||||
}
|
||||
|
||||
wxString newStr;
|
||||
newStr.Printf("%s - %u", zoneName.mb_str(), prox->exploreid);
|
||||
ProximitySelectionList->Append(newStr, (void*)prox);
|
||||
}
|
||||
}
|
||||
|
||||
void MainFrame::FillProximityValues(unsigned int zone, unsigned int explore)
|
||||
{
|
||||
mErrorLog->Log(eqEmuLogBoth,"zon %u, ex %u", zone, explore);
|
||||
eqtask_proximity ourProx;
|
||||
vector<eqtask_proximity>::iterator Iter;
|
||||
for(Iter = taskProximityList.begin(); Iter != taskProximityList.end(); Iter++)
|
||||
{
|
||||
eqtask_proximity curProx = *Iter;
|
||||
if(curProx.exploreid == explore && curProx.zoneid == zone){
|
||||
ourProx = curProx;
|
||||
}
|
||||
}
|
||||
|
||||
wxString ourStr;
|
||||
|
||||
ourStr.Clear();
|
||||
ourStr.Printf("%u", ourProx.exploreid);
|
||||
mProxId->Enable();
|
||||
mProxId->SetValue(ourStr);
|
||||
|
||||
ourStr.Clear();
|
||||
ourStr.Printf("%.4f", ourProx.minx);
|
||||
mProxMinx->Enable();
|
||||
mProxMinx->SetValue(ourStr);
|
||||
|
||||
ourStr.Clear();
|
||||
ourStr.Printf("%.4f", ourProx.maxx);
|
||||
mProxMaxx->Enable();
|
||||
mProxMaxx->SetValue(ourStr);
|
||||
|
||||
ourStr.Clear();
|
||||
ourStr.Printf("%.4f", ourProx.miny);
|
||||
mProxMiny->Enable();
|
||||
mProxMiny->SetValue(ourStr);
|
||||
|
||||
ourStr.Clear();
|
||||
ourStr.Printf("%.4f", ourProx.maxy);
|
||||
mProxMaxy->Enable();
|
||||
mProxMaxy->SetValue(ourStr);
|
||||
|
||||
ourStr.Clear();
|
||||
ourStr.Printf("%.4f", ourProx.minz);
|
||||
mProxMinz->Enable();
|
||||
mProxMinz->SetValue(ourStr);
|
||||
|
||||
ourStr.Clear();
|
||||
ourStr.Printf("%.4f", ourProx.maxz);
|
||||
mProxMaxz->Enable();
|
||||
mProxMaxz->SetValue(ourStr);
|
||||
|
||||
openedProximity.exploreid = explore;
|
||||
openedProximity.zoneid = zone;
|
||||
|
||||
SetZoneSelectionByIdProximity(zone);
|
||||
mProxZone->Enable();
|
||||
}
|
||||
|
||||
void MainFrame::NewProximity(wxCommandEvent& event)
|
||||
{
|
||||
if(!mMysql){
|
||||
mErrorLog->Log(eqEmuLogBoth, "New proximity failed, not connected to db");
|
||||
return;
|
||||
}
|
||||
|
||||
int newID = wxGetNumberFromUser("", "Explore ID:", "Explore ID", 0, 0, 9999999);
|
||||
int newZoneID = wxGetNumberFromUser("", "Zone ID:", "Zone ID", 0, 0, 9999999);
|
||||
|
||||
if(newID < 0 || newZoneID < 0)
|
||||
{
|
||||
mErrorLog->Log(eqEmuLogBoth, "New proximity failed, id or zone < 0");
|
||||
return;
|
||||
}
|
||||
|
||||
if(newID == 0xFFFFFFFF || newZoneID == 0xFFFFFFF)
|
||||
{
|
||||
mErrorLog->Log(eqEmuLogBoth, "New proximity failed, 0xFFFFFFFF cannot be set with editor");
|
||||
return;
|
||||
}
|
||||
|
||||
eqtask_proximity newProx;
|
||||
newProx.exploreid = newID;
|
||||
newProx.zoneid = newZoneID;
|
||||
newProx.maxx = 0.0;
|
||||
newProx.minx = 0.0;
|
||||
newProx.maxy = 0.0;
|
||||
newProx.miny = 0.0;
|
||||
newProx.maxz = 0.0;
|
||||
newProx.minz = 0.0;
|
||||
|
||||
char * mQuery = 0;
|
||||
MakeAnyLenString(&mQuery, "INSERT INTO `proximities` (`zoneid`,`exploreid`) VALUES (%u,%u)", newZoneID, newID);
|
||||
mErrorLog->Log(eqEmuLogSQL, "%s", mQuery);
|
||||
if (mysql_query(mMysql, mQuery)) {
|
||||
mErrorLog->Log(eqEmuLogBoth, "MySQL Error: %s", mysql_error(mMysql));
|
||||
return;
|
||||
}
|
||||
|
||||
eqtask_prox * pPtr = new eqtask_prox;
|
||||
pPtr->exploreid = newID;
|
||||
pPtr->zoneid = newZoneID;
|
||||
|
||||
wxString zoneName;
|
||||
zoneName.Printf("Unknown Zone");
|
||||
vector<eqtask_zones>::iterator ZoneIter;
|
||||
for(ZoneIter = taskZoneList.begin(); ZoneIter != taskZoneList.end(); ZoneIter++)
|
||||
{
|
||||
eqtask_zones curZone = *ZoneIter;
|
||||
if(curZone.id == newZoneID)
|
||||
{
|
||||
zoneName.Clear();
|
||||
zoneName.Printf("%s", curZone.name);
|
||||
}
|
||||
}
|
||||
|
||||
wxString newStr;
|
||||
newStr.Printf("%s - %u", zoneName.mb_str(), newID);
|
||||
ProximitySelectionList->Append(newStr, (void*)pPtr);
|
||||
|
||||
taskProximityList.push_back(newProx);
|
||||
}
|
||||
|
||||
void MainFrame::DeleteProximity(wxCommandEvent& event)
|
||||
{
|
||||
if(!mMysql){
|
||||
mErrorLog->Log(eqEmuLogBoth, "Delete proximity failed, not connected to db");
|
||||
return;
|
||||
}
|
||||
|
||||
eqtask_prox * pPtr = (eqtask_prox*)ProximitySelectionList->GetClientData(ProximitySelectionList->GetSelection());
|
||||
|
||||
if(!pPtr){
|
||||
mErrorLog->Log(eqEmuLogBoth, "Delete proximity failed, pPtr is NULL");
|
||||
return;
|
||||
}
|
||||
|
||||
int explore = pPtr->exploreid;
|
||||
int zone = pPtr->zoneid;
|
||||
|
||||
int reply = wxMessageBox("Are you sure?", "Confirm Delete", wxYES_NO, this);
|
||||
if(reply != wxYES)
|
||||
{
|
||||
mErrorLog->Log(eqEmuLogBoth, "User aborted delete of proximity.");
|
||||
return;
|
||||
}
|
||||
|
||||
char * mQuery = 0;
|
||||
MakeAnyLenString(&mQuery, "DELETE FROM proximities WHERE zoneid=%u AND exploreid=%u", zone, explore);
|
||||
mErrorLog->Log(eqEmuLogSQL, "%s", mQuery);
|
||||
if (mysql_query(mMysql, mQuery)) {
|
||||
mErrorLog->Log(eqEmuLogBoth, "MySQL Error: %s", mysql_error(mMysql));
|
||||
return;
|
||||
}
|
||||
|
||||
for(unsigned int x = 0; x < ProximitySelectionList->GetCount(); x++)
|
||||
{
|
||||
eqtask_prox * p = (eqtask_prox*)ProximitySelectionList->GetClientData(x);
|
||||
if(p){
|
||||
if(p->exploreid == explore && p->zoneid == zone)
|
||||
{
|
||||
delete p;
|
||||
p = NULL;
|
||||
ProximitySelectionList->Delete(x);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
vector<eqtask_proximity>::iterator Iter;
|
||||
for(Iter = taskProximityList.begin(); Iter != taskProximityList.end(); Iter++)
|
||||
{
|
||||
eqtask_proximity curProx = *Iter;
|
||||
if(curProx.exploreid == explore && curProx.zoneid == zone){
|
||||
taskProximityList.erase(Iter);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(openedProximity.exploreid == explore && openedProximity.zoneid == zone)
|
||||
{
|
||||
mProxId->Clear();
|
||||
mProxId->Disable();
|
||||
mProxMinx->Clear();
|
||||
mProxMinx->Disable();
|
||||
mProxMaxx->Clear();
|
||||
mProxMaxx->Disable();
|
||||
mProxMiny->Clear();
|
||||
mProxMiny->Disable();
|
||||
mProxMaxy->Clear();
|
||||
mProxMaxy->Disable();
|
||||
mProxMinz->Clear();
|
||||
mProxMinz->Disable();
|
||||
mProxMaxz->Clear();
|
||||
mProxMaxz->Disable();
|
||||
|
||||
mProxZone->Select(0);
|
||||
mProxZone->Disable();
|
||||
openedProximity.exploreid = 0xFFFFFFFF;
|
||||
openedProximity.zoneid = 0xFFFFFFFF;
|
||||
}
|
||||
}
|
||||
|
||||
void MainFrame::SaveProximity(wxCommandEvent& event)
|
||||
{
|
||||
if(!mMysql){
|
||||
mErrorLog->Log(eqEmuLogBoth, "Save proximity failed, not connected to db");
|
||||
return;
|
||||
}
|
||||
|
||||
if(openedProximity.exploreid == 0xFFFFFFFF && openedProximity.zoneid == 0xFFFFFFFF)
|
||||
{
|
||||
mErrorLog->Log(eqEmuLogBoth, "Save proximity failed, no proximity opened");
|
||||
return;
|
||||
}
|
||||
|
||||
mErrorLog->Log(eqEmuLogBoth, "Saving proximity...");
|
||||
|
||||
eqtask_proximity toSave;
|
||||
wxString inStr;
|
||||
int explore = openedProximity.exploreid;
|
||||
int zone = openedProximity.zoneid;
|
||||
bool canUpdate = false;
|
||||
|
||||
inStr.Clear();
|
||||
inStr = mProxId->GetValue();
|
||||
toSave.exploreid = atoi(inStr.mb_str());
|
||||
|
||||
inStr.Clear();
|
||||
inStr = mProxMinx->GetValue();
|
||||
toSave.minx = atof(inStr.mb_str());
|
||||
|
||||
inStr.Clear();
|
||||
inStr = mProxMaxx->GetValue();
|
||||
toSave.maxx = atof(inStr.mb_str());
|
||||
|
||||
inStr.Clear();
|
||||
inStr = mProxMiny->GetValue();
|
||||
toSave.miny = atof(inStr.mb_str());
|
||||
|
||||
inStr.Clear();
|
||||
inStr = mProxMaxy->GetValue();
|
||||
toSave.maxy = atof(inStr.mb_str());
|
||||
|
||||
inStr.Clear();
|
||||
inStr = mProxMinz->GetValue();
|
||||
toSave.minz = atof(inStr.mb_str());
|
||||
|
||||
inStr.Clear();
|
||||
inStr = mProxMaxz->GetValue();
|
||||
toSave.maxz = atof(inStr.mb_str());
|
||||
|
||||
if(toSave.maxx < toSave.minx){
|
||||
mErrorLog->Log(eqEmuLogBoth, "min x and max x mismatched, correcting");
|
||||
int temp = toSave.minx;
|
||||
toSave.minx = toSave.maxx;
|
||||
toSave.maxx = temp;
|
||||
|
||||
wxString tempStr;
|
||||
tempStr.Printf("%.4f", toSave.minx);
|
||||
mProxMinx->SetValue(tempStr);
|
||||
tempStr.Clear();
|
||||
|
||||
tempStr.Printf("%.4f", toSave.maxx);
|
||||
mProxMaxx->SetValue(tempStr);
|
||||
tempStr.Clear();
|
||||
}
|
||||
|
||||
if(toSave.maxy < toSave.miny){
|
||||
mErrorLog->Log(eqEmuLogBoth, "min y and max y mismatched, correcting");
|
||||
int temp = toSave.miny;
|
||||
toSave.miny = toSave.maxy;
|
||||
toSave.maxy = temp;
|
||||
|
||||
wxString tempStr;
|
||||
tempStr.Printf("%.4f", toSave.miny);
|
||||
mProxMiny->SetValue(tempStr);
|
||||
tempStr.Clear();
|
||||
|
||||
tempStr.Printf("%.4f", toSave.maxy);
|
||||
mProxMaxy->SetValue(tempStr);
|
||||
tempStr.Clear();
|
||||
}
|
||||
|
||||
if(toSave.maxz < toSave.minz){
|
||||
mErrorLog->Log(eqEmuLogBoth, "min z and max z mismatched, correcting");
|
||||
int temp = toSave.minz;
|
||||
toSave.minz = toSave.maxz;
|
||||
toSave.maxz = temp;
|
||||
|
||||
wxString tempStr;
|
||||
tempStr.Printf("%.4f", toSave.minz);
|
||||
mProxMinz->SetValue(tempStr);
|
||||
tempStr.Clear();
|
||||
|
||||
tempStr.Printf("%.4f", toSave.maxz);
|
||||
mProxMaxz->SetValue(tempStr);
|
||||
tempStr.Clear();
|
||||
}
|
||||
|
||||
int * iPtr = (int*)mProxZone->GetClientData(mProxZone->GetCurrentSelection());
|
||||
toSave.zoneid = *iPtr;
|
||||
|
||||
if(!iPtr){
|
||||
mErrorLog->Log(eqEmuLogBoth, "Save proximity failed, iPtr is NULL");
|
||||
return;
|
||||
}
|
||||
|
||||
if(openedProximity.exploreid == toSave.exploreid && openedProximity.zoneid == toSave.zoneid)
|
||||
{
|
||||
mErrorLog->Log(eqEmuLogBoth, "Can use UPDATE");
|
||||
}
|
||||
else{
|
||||
mErrorLog->Log(eqEmuLogBoth, "Cannot use UPDATE must replace instead");
|
||||
}
|
||||
|
||||
if(canUpdate){
|
||||
char * mQuery = 0;
|
||||
MakeAnyLenString(&mQuery, "UPDATE proximities SET minx=%.4f, maxx=%.4f, miny=%.4f, maxy=%.4f, minz=%.4f, maxz=%.4f) WHERE zoneid=%u AND exploreid=%u",
|
||||
toSave.minx, toSave.maxx, toSave.miny, toSave.maxy, toSave.minz, toSave.maxz, toSave.zoneid, toSave.exploreid);
|
||||
|
||||
mErrorLog->Log(eqEmuLogSQL, "%s", mQuery);
|
||||
if (mysql_query(mMysql, mQuery)) {
|
||||
mErrorLog->Log(eqEmuLogBoth, "MySQL Error: %s", mysql_error(mMysql));
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
char * mQuery = 0;
|
||||
MakeAnyLenString(&mQuery, "DELETE FROM proximities WHERE zoneid=%u AND exploreid=%u", zone, explore);
|
||||
mErrorLog->Log(eqEmuLogSQL, "%s", mQuery);
|
||||
if (mysql_query(mMysql, mQuery)) {
|
||||
mErrorLog->Log(eqEmuLogBoth, "MySQL Error: %s", mysql_error(mMysql));
|
||||
return;
|
||||
}
|
||||
|
||||
MakeAnyLenString(&mQuery, "INSERT INTO `proximities` (`zoneid`,`exploreid`,`minx`,`maxx`,`miny`,`maxy`,`minz`,`maxz`) VALUES (%u,%u,%.4f,%.4f,%.4f,%.4f,%.4f,%.4f)"
|
||||
, toSave.zoneid, toSave.exploreid, toSave.minx, toSave.maxx, toSave.miny, toSave.maxy, toSave.minz, toSave.maxz);
|
||||
|
||||
mErrorLog->Log(eqEmuLogSQL, "%s", mQuery);
|
||||
if (mysql_query(mMysql, mQuery)) {
|
||||
mErrorLog->Log(eqEmuLogBoth, "MySQL Error: %s", mysql_error(mMysql));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
for(unsigned int x = 0; x < ProximitySelectionList->GetCount(); x++)
|
||||
{
|
||||
eqtask_prox * p = (eqtask_prox*)ProximitySelectionList->GetClientData(x);
|
||||
if(p){
|
||||
if(p->exploreid == openedProximity.exploreid && p->zoneid == openedProximity.zoneid)
|
||||
{
|
||||
p->exploreid = toSave.exploreid;
|
||||
p->zoneid = toSave.zoneid;
|
||||
wxString newStr;
|
||||
wxString zoneName;
|
||||
zoneName.Printf("Unknown Zone");
|
||||
vector<eqtask_zones>::iterator ZoneIter;
|
||||
for(ZoneIter = taskZoneList.begin(); ZoneIter != taskZoneList.end(); ZoneIter++)
|
||||
{
|
||||
eqtask_zones curZone = *ZoneIter;
|
||||
if(curZone.id == p->zoneid)
|
||||
{
|
||||
zoneName.Clear();
|
||||
zoneName.Printf("%s", curZone.name);
|
||||
}
|
||||
}
|
||||
newStr.Printf("%s - %u", zoneName.mb_str(), p->exploreid );
|
||||
ProximitySelectionList->SetString(x, newStr);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
vector<eqtask_proximity>::iterator Iter;
|
||||
for(Iter = taskProximityList.begin(); Iter != taskProximityList.end(); Iter++)
|
||||
{
|
||||
eqtask_proximity cur = *Iter;
|
||||
if(cur.exploreid == openedProximity.exploreid && cur.zoneid == openedProximity.zoneid)
|
||||
{
|
||||
(*Iter).exploreid = toSave.exploreid;
|
||||
(*Iter).zoneid = toSave.zoneid;
|
||||
(*Iter).minx = toSave.minx;
|
||||
(*Iter).maxx = toSave.maxx;
|
||||
(*Iter).miny = toSave.miny;
|
||||
(*Iter).maxy = toSave.maxy;
|
||||
(*Iter).minz = toSave.minz;
|
||||
(*Iter).maxz = toSave.maxz;
|
||||
}
|
||||
}
|
||||
|
||||
openedProximity.exploreid = toSave.exploreid;
|
||||
openedProximity.zoneid = toSave.zoneid;
|
||||
mErrorLog->Log(eqEmuLogBoth, "Save finished.");
|
||||
}
|
||||
|
||||
void MainFrame::ContextMenuProximity()
|
||||
{
|
||||
if(!mMysql){
|
||||
mErrorLog->Log(eqEmuLogBoth, "Context menu cannot open, not connected to db");
|
||||
return;
|
||||
}
|
||||
|
||||
wxMenu *mMenu;
|
||||
mMenu = new wxMenu();
|
||||
|
||||
mMenu->Append(MENU_NewProximity, wxT("New Proximity"), wxT("Creates a new goal proximity entry"));
|
||||
mMenu->Append(MENU_DeleteProximity, wxT("Delete Proximity"), wxT("Deletes the selected proximity entry"));
|
||||
mMenu->AppendSeparator();
|
||||
mMenu->Append(MENU_SaveProximity, wxT("Save Proximity"), wxT("Saves the opened proximity entry"));
|
||||
|
||||
PopupMenu(mMenu);
|
||||
delete mMenu;
|
||||
}
|
||||
@@ -0,0 +1,328 @@
|
||||
#include <wx/wx.h>
|
||||
#include <wx/numdlg.h>
|
||||
#include <mysql.h>
|
||||
#include <vector>
|
||||
#include "tasks.h"
|
||||
#include "utility.h"
|
||||
#include "base.h"
|
||||
#include "ErrorLog.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
void MainFrame::NewTask(wxCommandEvent& event)
|
||||
{
|
||||
if(mMysql){
|
||||
eqtask newT;
|
||||
newT.id = (highestIndex+1);
|
||||
newT.duration = 0;
|
||||
strcpy(newT.title, "Default Task Name");
|
||||
strcpy(newT.desc, "Default Task Description");
|
||||
strcpy(newT.reward, "");
|
||||
newT.cashreward = 0;
|
||||
newT.xpreward = 0;
|
||||
newT.rewardmethod = 2;
|
||||
newT.rewardid = 0;
|
||||
newT.startzone = -1;
|
||||
newT.level_min = 0;
|
||||
newT.level_max = 0;
|
||||
newT.repeatable = true;
|
||||
|
||||
unsigned int newID = wxGetNumberFromUser("", "ID:", "Input ID", (highestIndex+1), 0, 2147483600);
|
||||
|
||||
newT.id = newID;
|
||||
|
||||
char * mQuery = 0;
|
||||
MakeAnyLenString(&mQuery, "INSERT INTO `tasks` (`id`,`duration`,`title`,`description`,`reward`,`rewardid`,`cashreward`,`xpreward`,`rewardmethod`,`startzone`, `minlevel`, `maxlevel`, `repeatable`) VALUES (%u,%u,'%s','%s','%s',%u,%u,%u,%u,%u,%u,%u,%u)",
|
||||
newT.id, newT.duration, newT.title, newT.desc, newT.reward, newT.rewardid, newT.cashreward, newT.xpreward, newT.rewardmethod, newT.startzone, newT.level_min, newT.level_max, newT.repeatable);
|
||||
|
||||
mErrorLog->Log(eqEmuLogSQL, "%s", mQuery);
|
||||
if (mysql_query(mMysql, mQuery)) {
|
||||
mErrorLog->Log(eqEmuLogBoth, "MySQL Error: %s", mysql_error(mMysql));
|
||||
return;
|
||||
}
|
||||
taskList.push_back(newT);
|
||||
|
||||
wxString str;
|
||||
str.Printf("%d:%s", newT.id, "Default Task Name");
|
||||
ItemSelectionList->Append(str);
|
||||
if(highestIndex < (newID + 1))
|
||||
highestIndex = newID + 1;
|
||||
}
|
||||
else{
|
||||
mErrorLog->Log(eqEmuLogBoth, "Error with new task create, mysql not initialized");
|
||||
}
|
||||
}
|
||||
|
||||
void MainFrame::DeleteTask(wxCommandEvent& event)
|
||||
{
|
||||
if(selectedIndex < 0)
|
||||
{
|
||||
mErrorLog->Log(eqEmuLogBoth, "No item selected for delete, delete failing.");
|
||||
return;
|
||||
}
|
||||
|
||||
if(mMysql){
|
||||
int reply = wxMessageBox("Are you sure?", "Confirm Delete", wxYES_NO, this);
|
||||
if(reply != wxYES)
|
||||
{
|
||||
mErrorLog->Log(eqEmuLogBoth, "User aborted delete of task.");
|
||||
return;
|
||||
}
|
||||
|
||||
vector<eqtask>::iterator Iter;
|
||||
Iter = taskList.begin();
|
||||
Iter += selectedIndex;
|
||||
|
||||
eqtask mTask = *Iter;
|
||||
|
||||
char * mQuery = 0;
|
||||
MakeAnyLenString(&mQuery, "DELETE FROM `tasks` WHERE id=%u", mTask.id);
|
||||
mErrorLog->Log(eqEmuLogSQL, "%s", mQuery);
|
||||
|
||||
if (mysql_query(mMysql, mQuery)) {
|
||||
mErrorLog->Log(eqEmuLogBoth, "MySQL Error: %s", mysql_error(mMysql));
|
||||
return;
|
||||
}
|
||||
|
||||
if(openedIndex == selectedIndex){
|
||||
wxString mStr;
|
||||
mStr.Printf("%s", "Task Name");
|
||||
mTaskName->Clear();
|
||||
mTaskName->AppendText(mStr);
|
||||
mTaskName->Disable();
|
||||
mStr.clear();
|
||||
|
||||
mStr.Printf("%s", "Task Description");
|
||||
mTaskDesc->Clear();
|
||||
mTaskDesc->AppendText(mStr);
|
||||
mTaskDesc->Disable();
|
||||
mStr.clear();
|
||||
|
||||
mStr.Printf("%u", 0);
|
||||
mTaskMinLvl->Clear();
|
||||
mTaskMinLvl->AppendText(mStr);
|
||||
mTaskMinLvl->Disable();
|
||||
mStr.clear();
|
||||
|
||||
mStr.Printf("%u", 0);
|
||||
mTaskMaxLvl->Clear();
|
||||
mTaskMaxLvl->AppendText(mStr);
|
||||
mTaskMaxLvl->Disable();
|
||||
mStr.clear();
|
||||
|
||||
mStr.Printf("%u", 0);
|
||||
mTaskDuration->Clear();
|
||||
mTaskDuration->AppendText(mStr);
|
||||
mTaskDuration->Disable();
|
||||
mStr.clear();
|
||||
|
||||
mRewardName->Clear();
|
||||
mRewardName->Disable();
|
||||
|
||||
mStr.Printf("%u", 0);
|
||||
mRewardID->Clear();
|
||||
mRewardID->AppendText(mStr);
|
||||
mRewardID->Disable();
|
||||
mStr.clear();
|
||||
|
||||
mStr.Printf("%u", 0);
|
||||
mRewardCash->Clear();
|
||||
mRewardCash->AppendText(mStr);
|
||||
mRewardCash->Disable();
|
||||
mStr.clear();
|
||||
|
||||
mStr.Printf("%u", 0);
|
||||
mRewardXP->Clear();
|
||||
mRewardXP->AppendText(mStr);
|
||||
mRewardXP->Disable();
|
||||
mStr.clear();
|
||||
openedIndex = -1;
|
||||
|
||||
mRewardMethod->Select(0);
|
||||
mRewardMethod->Disable();
|
||||
|
||||
mStartZone->Select(0);
|
||||
mStartZone->Disable();
|
||||
|
||||
mTaskRepeatable->SetValue(false);
|
||||
mTaskRepeatable->Disable();
|
||||
|
||||
ShowRewardItems->Disable();
|
||||
ShowRewardItems->Clear();
|
||||
RefreshItems->Disable();
|
||||
|
||||
ClearActivities();
|
||||
ActivitiesSelectionList->Disable();
|
||||
openedActivity.activityid = -1;
|
||||
openedActivity.id = -1;
|
||||
openedActivity.step = -1;
|
||||
mActText1->Clear();
|
||||
mActText1->Disable();
|
||||
mActText2->Clear();
|
||||
mActText2->Disable();
|
||||
mActText3->Clear();
|
||||
mActText3->Disable();
|
||||
mActivityZone->Select(0);
|
||||
mActivityZone->Disable();
|
||||
mActivityOptional->SetValue(false);
|
||||
mActivityOptional->Disable();
|
||||
mActID->Clear();
|
||||
mActID->Disable();
|
||||
mActStep->Clear();
|
||||
mActStep->Disable();
|
||||
mActType->Select(0);
|
||||
mActType->Disable();
|
||||
mActDeliver->Clear();
|
||||
mActDeliver->Disable();
|
||||
mActMethod->Select(2);
|
||||
mActMethod->Disable();
|
||||
mActGoalID->Clear();
|
||||
mActGoalID->Disable();
|
||||
mActGoalCount->Clear();
|
||||
mActGoalCount->Disable();
|
||||
}
|
||||
|
||||
taskList.erase(Iter);
|
||||
ItemSelectionList->Delete(selectedIndex);
|
||||
}
|
||||
else{
|
||||
mErrorLog->Log(eqEmuLogBoth, "Error with task delete, mysql not initialized");
|
||||
}
|
||||
selectedIndex = -1;
|
||||
}
|
||||
|
||||
void MainFrame::OnRewardButton(wxCommandEvent& event)
|
||||
{
|
||||
wxString ridStr = mRewardID->GetValue();
|
||||
int rtype = mRewardMethod->GetCurrentSelection();
|
||||
int rid = atoi(ridStr.mb_str());
|
||||
|
||||
ShowRewardChange(rtype,rid);
|
||||
}
|
||||
|
||||
void MainFrame::SaveTask(wxCommandEvent& event)
|
||||
{
|
||||
if(!mMysql){
|
||||
mErrorLog->Log(eqEmuLogBoth, "Mysql not connected for save of task");
|
||||
return;
|
||||
}
|
||||
|
||||
if(openedIndex>=0){
|
||||
mErrorLog->Log(eqEmuLogBoth, "Saving task...");
|
||||
vector<eqtask>::iterator Iter;
|
||||
Iter = taskList.begin();
|
||||
Iter += openedIndex;
|
||||
eqtask ourTask = *Iter;
|
||||
wxString getStr;
|
||||
|
||||
getStr = mTaskName->GetValue();
|
||||
strcpy(ourTask.title, getStr.mb_str());
|
||||
getStr.Clear();
|
||||
|
||||
getStr = mTaskDesc->GetValue();
|
||||
strcpy(ourTask.desc, getStr.mb_str());
|
||||
getStr.Clear();
|
||||
|
||||
getStr = mTaskMinLvl->GetValue();
|
||||
ourTask.level_min = atoi(getStr.mb_str());
|
||||
getStr.Clear();
|
||||
|
||||
getStr = mTaskMaxLvl->GetValue();
|
||||
ourTask.level_max = atoi(getStr.mb_str());
|
||||
getStr.Clear();
|
||||
|
||||
getStr = mTaskDuration->GetValue();
|
||||
ourTask.duration = atoi(getStr.mb_str());
|
||||
getStr.Clear();
|
||||
|
||||
getStr = mRewardName->GetValue();
|
||||
strcpy(ourTask.reward, getStr.mb_str());
|
||||
getStr.Clear();
|
||||
|
||||
getStr = mRewardID->GetValue();
|
||||
ourTask.rewardid = atoi(getStr.mb_str());
|
||||
getStr.Clear();
|
||||
|
||||
getStr = mRewardCash->GetValue();
|
||||
ourTask.cashreward = atoi(getStr.mb_str());
|
||||
getStr.Clear();
|
||||
|
||||
getStr = mRewardXP->GetValue();
|
||||
ourTask.xpreward = atoi(getStr.mb_str());
|
||||
getStr.Clear();
|
||||
|
||||
int * i = (int*)mStartZone->GetClientData(mStartZone->GetSelection());
|
||||
ourTask.startzone = *i;
|
||||
|
||||
ourTask.rewardmethod = mRewardMethod->GetSelection();
|
||||
ourTask.repeatable = mTaskRepeatable->GetValue();
|
||||
|
||||
|
||||
char * mQuery = 0;
|
||||
MakeAnyLenString(&mQuery, "UPDATE tasks SET duration=%u, title='%s', description='%s', reward='%s', rewardid=%u, cashreward=%u, xpreward=%i, rewardmethod=%u, startzone=%u, minlevel=%u, maxlevel=%u, repeatable=%u WHERE id=%u",
|
||||
ourTask.duration, MakeStringSQLSafe(ourTask.title).mb_str(), MakeStringSQLSafe(ourTask.desc).mb_str(), MakeStringSQLSafe(ourTask.reward).mb_str(), ourTask.rewardid, ourTask.cashreward, ourTask.xpreward, ourTask.rewardmethod, ourTask.startzone, ourTask.level_min, ourTask.level_max, ourTask.repeatable, ourTask.id);
|
||||
|
||||
mErrorLog->Log(eqEmuLogSQL, "%s", mQuery);
|
||||
if (mysql_query(mMysql, mQuery)) {
|
||||
mErrorLog->Log(eqEmuLogBoth, "MySQL Error: %s", mysql_error(mMysql));
|
||||
return;
|
||||
}
|
||||
|
||||
/*char * mQuery = 0;
|
||||
MakeAnyLenString(&mQuery, "DELETE FROM tasks WHERE id=%u", (*Iter).id);
|
||||
mErrorLog->Log(eqEmuLogSQL, "%s", mQuery);
|
||||
if (mysql_query(mMysql, mQuery)) {
|
||||
mErrorLog->Log(eqEmuLogBoth, "MySQL Error: %s", mysql_error(mMysql));
|
||||
return;
|
||||
}
|
||||
|
||||
MakeAnyLenString(&mQuery, "INSERT INTO `tasks` (`id`,`duration`,`title`,`description`,`reward`,`rewardid`,`cashreward`,`xpreward`,`rewardmethod`,`startzone`, `minlevel`, `maxlevel`) VALUES (%u,%u,'%s','%s','%s',%u,%u,%u,%u,%u,%u,%u)",
|
||||
ourTask.id, ourTask.duration, MakeStringSQLSafe(ourTask.title).mb_str(), MakeStringSQLSafe(ourTask.desc).mb_str(), MakeStringSQLSafe(ourTask.reward).mb_str(), ourTask.rewardid, ourTask.cashreward, ourTask.xpreward, ourTask.rewardmethod, ourTask.startzone, ourTask.level_min, ourTask.level_max);
|
||||
|
||||
mErrorLog->Log(eqEmuLogSQL, "%s", mQuery);
|
||||
if (mysql_query(mMysql, mQuery)) {
|
||||
mErrorLog->Log(eqEmuLogBoth, "MySQL Error: %s", mysql_error(mMysql));
|
||||
return;
|
||||
}*/
|
||||
|
||||
(*Iter).cashreward = ourTask.cashreward;
|
||||
strcpy((*Iter).desc, ourTask.desc);
|
||||
(*Iter).duration = ourTask.duration;
|
||||
(*Iter).level_max = ourTask.level_max;
|
||||
(*Iter).level_min = ourTask.level_min;
|
||||
strcpy((*Iter).reward, ourTask.reward);
|
||||
(*Iter).rewardid = ourTask.rewardid;
|
||||
(*Iter).rewardmethod = ourTask.rewardmethod;
|
||||
(*Iter).startzone = ourTask.startzone;
|
||||
strcpy((*Iter).title, ourTask.title);
|
||||
(*Iter).xpreward = ourTask.xpreward;
|
||||
(*Iter).repeatable = ourTask.repeatable;
|
||||
|
||||
getStr.Printf("%u:%s", (*Iter).id, (*Iter).title);
|
||||
ItemSelectionList->SetString(openedIndex, getStr);
|
||||
mErrorLog->Log(eqEmuLogBoth, "Save finished.");
|
||||
}
|
||||
else{
|
||||
mErrorLog->Log(eqEmuLogBoth, "Opened index for Task Save not valid.");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void MainFrame::ContextMenuTaskList()
|
||||
{
|
||||
if(!mMysql){
|
||||
mErrorLog->Log(eqEmuLogBoth, "Context menu cannot open, not connected to db");
|
||||
return;
|
||||
}
|
||||
|
||||
wxMenu *mMenu;
|
||||
mMenu = new wxMenu();
|
||||
|
||||
mMenu->Append(MENU_NewTask, wxT("New Task"), wxT("Creates a new task"));
|
||||
mMenu->Append(MENU_DeleteTask, wxT("Delete Task"), wxT("Deletes the selected task"));
|
||||
mMenu->AppendSeparator();
|
||||
mMenu->Append(MENU_SaveTask, wxT("Save Task"), wxT("Saves the opened task"));
|
||||
|
||||
PopupMenu(mMenu);
|
||||
delete mMenu;
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
#ifndef EQWX_TASKS__H
|
||||
#define EQWX_TASKS__H
|
||||
|
||||
struct eqtask
|
||||
{
|
||||
unsigned int id;
|
||||
unsigned int duration; //i
|
||||
char title[100]; //i
|
||||
char desc[2047]; //i
|
||||
char reward[64]; //i
|
||||
unsigned int rewardid; //i
|
||||
unsigned int cashreward; //i
|
||||
int xpreward; //i
|
||||
unsigned short rewardmethod; //i
|
||||
unsigned int startzone; //i
|
||||
unsigned short level_min; //i
|
||||
unsigned short level_max; //i
|
||||
bool repeatable;
|
||||
};
|
||||
|
||||
struct eqtask_goallist
|
||||
{
|
||||
unsigned int id;
|
||||
unsigned int value;
|
||||
};
|
||||
|
||||
struct eqtask_activities
|
||||
{
|
||||
unsigned int id;
|
||||
unsigned int activityId; //i
|
||||
unsigned int step; //i
|
||||
unsigned int activityType; //i
|
||||
char text1[64]; //i
|
||||
char text2[64]; //i
|
||||
char text3[128]; //i
|
||||
unsigned int goalid; //n 7 digit textbox
|
||||
unsigned int goalmethod; //i
|
||||
unsigned int goalcount; //n 2 digit text box
|
||||
unsigned int deliverToNpc; //i
|
||||
unsigned int zoneid; //i
|
||||
bool optional; //i
|
||||
};
|
||||
|
||||
struct eqtask_activity_id
|
||||
{
|
||||
unsigned int id;
|
||||
unsigned int step;
|
||||
unsigned int activityid;
|
||||
};
|
||||
|
||||
struct eqtask_zones
|
||||
{
|
||||
char name[32];
|
||||
unsigned int id;
|
||||
};
|
||||
|
||||
struct eqtask_proximity
|
||||
{
|
||||
unsigned int exploreid;
|
||||
unsigned int zoneid;
|
||||
double minx;
|
||||
double maxx;
|
||||
double miny;
|
||||
double maxy;
|
||||
double minz;
|
||||
double maxz;
|
||||
};
|
||||
|
||||
struct eqtask_prox
|
||||
{
|
||||
unsigned int exploreid;
|
||||
unsigned int zoneid;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,29 @@
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include "utility.h"
|
||||
|
||||
#if (_MSC_VER < 1500)
|
||||
#define vsnprintf _vsnprintf
|
||||
#endif
|
||||
|
||||
#define safe_delete(d) if(d) { delete d; d=0; }
|
||||
#define safe_delete_array(d) if(d) { delete[] d; d=0; }
|
||||
|
||||
int MakeAnyLenString(char** ret, const char* format, ...) {
|
||||
int buf_len = 128;
|
||||
int chars = -1;
|
||||
va_list argptr;
|
||||
va_start(argptr, format);
|
||||
while (chars == -1 || chars >= buf_len) {
|
||||
safe_delete_array(*ret);
|
||||
if (chars == -1)
|
||||
buf_len *= 2;
|
||||
else
|
||||
buf_len = chars + 1;
|
||||
*ret = new char[buf_len];
|
||||
chars = vsnprintf(*ret, buf_len, format, argptr);
|
||||
}
|
||||
va_end(argptr);
|
||||
return chars;
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
#ifndef EQWX_UTILITY__H
|
||||
#define EQWX_UTILITY__H
|
||||
|
||||
int MakeAnyLenString(char** ret, const char* format, ...);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,101 @@
|
||||
#ifndef __OPENEQ_THREED__
|
||||
#define __OPENEQ_THREED__
|
||||
|
||||
#include "3d_base.hpp"
|
||||
#include <list>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
|
||||
using namespace std;
|
||||
|
||||
struct ObjectGroupEntry
|
||||
{
|
||||
ObjectGroupEntry()
|
||||
{
|
||||
IncludeInMap = true;
|
||||
}
|
||||
|
||||
bool FromTOG;
|
||||
bool IncludeInMap;
|
||||
float TileX, TileY, TileZ;
|
||||
float x, y, z;
|
||||
float RotX, RotY, RotZ;
|
||||
float ScaleX, ScaleY, ScaleZ;
|
||||
list<int> SubObjects;
|
||||
};
|
||||
|
||||
class Octree_Node;
|
||||
|
||||
class Bone {
|
||||
public:
|
||||
char *name;
|
||||
|
||||
int bone1, bone2;
|
||||
|
||||
float x, y, z;
|
||||
float e[4];
|
||||
float scale[3];
|
||||
|
||||
int vert_count;
|
||||
int *verts;
|
||||
};
|
||||
|
||||
class Zone_Model {
|
||||
public:
|
||||
Zone_Model() {}
|
||||
~Zone_Model() {}
|
||||
|
||||
Vertex **verts;
|
||||
Polygon **polys;
|
||||
Octree_Node *octree;
|
||||
Texture **tex;
|
||||
|
||||
int vert_count, poly_count, tex_count;
|
||||
};
|
||||
|
||||
class MobModel {
|
||||
public:
|
||||
MobModel() {}
|
||||
~MobModel() {}
|
||||
|
||||
Vertex **verts;
|
||||
Polygon **polys;
|
||||
Texture **tex;
|
||||
|
||||
int vert_count, poly_count, tex_count;
|
||||
|
||||
Bone *bones;
|
||||
|
||||
int bone_count;
|
||||
};
|
||||
|
||||
class Content_3D {
|
||||
public:
|
||||
Content_3D() { this->mob_model_count = 0; this->mob_count = 0; }
|
||||
~Content_3D() {}
|
||||
|
||||
Model *GetModel(char *model_name);
|
||||
|
||||
void GenerateOctree();
|
||||
|
||||
void MergeTextures();
|
||||
void MergeTexturesLazy();
|
||||
|
||||
Zone_Model *zone_model;
|
||||
|
||||
Model **models;
|
||||
Placeable **placeable;
|
||||
|
||||
int model_count, plac_count; // Count of placeable object models and count of instances
|
||||
int ObjectGroupCount;
|
||||
|
||||
MobModel **mob_models;
|
||||
Placeable **mob_locs;
|
||||
int mob_model_count, mob_count;
|
||||
|
||||
vector<ObjectGroupEntry> ObjectGroups;
|
||||
vector<string> ModelNames;
|
||||
vector<Placeable> PlaceableList;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,107 @@
|
||||
#ifndef __OPENEQ_THREED_BASE__
|
||||
#define __OPENEQ_THREED_BASE__
|
||||
|
||||
|
||||
#pragma pack(1)
|
||||
|
||||
|
||||
#include "archive.hpp"
|
||||
|
||||
#ifdef GLMODELVIEWER
|
||||
#include <gl\gl.h> // Header File For The OpenGL32 Library
|
||||
#endif
|
||||
|
||||
struct Light {
|
||||
float x, y, z;
|
||||
float r, g, b;
|
||||
float rad;
|
||||
} typedef Light;
|
||||
|
||||
struct Vertex {
|
||||
float x, y, z;
|
||||
float i, j, k;
|
||||
float u, v;
|
||||
|
||||
// int bone;
|
||||
|
||||
Vertex()
|
||||
{
|
||||
x = y = z = i = j = k = u = v = 0.0f;
|
||||
};
|
||||
|
||||
Vertex(float ix, float iy, float iz)
|
||||
{
|
||||
x = ix;
|
||||
y = iy;
|
||||
z = iz;
|
||||
}
|
||||
} typedef Vertex;
|
||||
|
||||
|
||||
struct Polygon {
|
||||
int flags;
|
||||
|
||||
int v1, v2, v3;
|
||||
|
||||
int tex;
|
||||
} typedef Polygon;
|
||||
|
||||
|
||||
struct Texture {
|
||||
Archive *archive;
|
||||
char frame_count;
|
||||
char current_frame;
|
||||
#ifdef GLMODELVIEWER
|
||||
GLuint *tex;
|
||||
#else
|
||||
int32 *tex;
|
||||
#endif
|
||||
char **filenames;
|
||||
|
||||
char flags;
|
||||
} typedef Texture;
|
||||
|
||||
class Model {
|
||||
public:
|
||||
Model() { IncludeInMap = false; verts = NULL; vert_count = 0; polys = NULL; poly_count = 0; tex = NULL; tex_count = 0; name = NULL; }
|
||||
~Model() {}
|
||||
|
||||
Vertex **verts;
|
||||
Polygon **polys;
|
||||
Texture **tex;
|
||||
|
||||
int vert_count, poly_count, tex_count;
|
||||
|
||||
char *name;
|
||||
bool IncludeInMap; // Include in EQEmu .map file
|
||||
};
|
||||
|
||||
|
||||
class Placeable {
|
||||
public:
|
||||
Placeable() {}
|
||||
|
||||
Placeable(int iModel, float ix, float iy, float iz, float irx, float iry, float irz, float iScale0, float iScale1, float iScale2)
|
||||
{
|
||||
model = iModel;
|
||||
x = ix;
|
||||
y = iy;
|
||||
z = iz;
|
||||
rx = irx;
|
||||
ry = iry;
|
||||
rz = irz;
|
||||
scale[0] = iScale0;
|
||||
scale[1] = iScale1;
|
||||
scale[2] = iScale2;
|
||||
}
|
||||
|
||||
float x, y, z;
|
||||
float rx, ry, rz;
|
||||
float scale[3];
|
||||
|
||||
int model;
|
||||
};
|
||||
|
||||
#pragma pack()
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,119 @@
|
||||
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
|
||||
|
||||
IF(NOT MSVC)
|
||||
ADD_DEFINITIONS(-fpermissive)
|
||||
ENDIF(NOT MSVC)
|
||||
|
||||
#azone common
|
||||
SET(azone_common_sources
|
||||
dat.cpp
|
||||
file.cpp
|
||||
global.cpp
|
||||
pfs.cpp
|
||||
ter.cpp
|
||||
wld.cpp
|
||||
zon.cpp
|
||||
zonv4.cpp
|
||||
)
|
||||
|
||||
SET(azone_common_headers
|
||||
3d.hpp
|
||||
3d_base.hpp
|
||||
archive.hpp
|
||||
dat.hpp
|
||||
file.hpp
|
||||
file_loader.hpp
|
||||
global.hpp
|
||||
octree.hpp
|
||||
pfs.hpp
|
||||
s3d.h
|
||||
ter.hpp
|
||||
types.h
|
||||
wld.hpp
|
||||
wld_structs.hpp
|
||||
zon.hpp
|
||||
zonv4.hpp
|
||||
)
|
||||
|
||||
ADD_LIBRARY(azone_common ${azone_common_sources} ${azone_common_headers})
|
||||
SET(LIBRARY_OUTPUT_PATH ../../Bin)
|
||||
|
||||
#azone
|
||||
SET(azone_sources
|
||||
azone.cpp
|
||||
)
|
||||
|
||||
SET(azone_headers
|
||||
azone.h
|
||||
)
|
||||
|
||||
ADD_EXECUTABLE(azone ${azone_sources} ${azone_headers})
|
||||
TARGET_LINK_LIBRARIES(azone azone_common debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE})
|
||||
IF(MSVC)
|
||||
SET_TARGET_PROPERTIES(azone PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF")
|
||||
TARGET_LINK_LIBRARIES(azone "Ws2_32.lib")
|
||||
ENDIF(MSVC)
|
||||
|
||||
IF(UNIX)
|
||||
TARGET_LINK_LIBRARIES(azone "z")
|
||||
ENDIF(UNIX)
|
||||
|
||||
SET(EXECUTABLE_OUTPUT_PATH ../../Bin)
|
||||
|
||||
#awater
|
||||
SET(awater_sources
|
||||
awater.cpp
|
||||
)
|
||||
|
||||
SET(awater_headers
|
||||
awater.h
|
||||
)
|
||||
|
||||
ADD_EXECUTABLE(awater ${awater_sources} ${awater_headers})
|
||||
TARGET_LINK_LIBRARIES(awater azone_common debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE})
|
||||
IF(MSVC)
|
||||
SET_TARGET_PROPERTIES(awater PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF")
|
||||
TARGET_LINK_LIBRARIES(awater "Ws2_32.lib")
|
||||
ENDIF(MSVC)
|
||||
|
||||
IF(UNIX)
|
||||
TARGET_LINK_LIBRARIES(awater "z")
|
||||
ENDIF(UNIX)
|
||||
|
||||
SET(EXECUTABLE_OUTPUT_PATH ../../Bin)
|
||||
|
||||
#listobj
|
||||
SET(listobj_sources
|
||||
listobj.cpp
|
||||
)
|
||||
|
||||
SET(listobj_headers
|
||||
)
|
||||
|
||||
ADD_EXECUTABLE(listobj ${listobj_sources} ${listobj_headers})
|
||||
TARGET_LINK_LIBRARIES(listobj azone_common debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE})
|
||||
IF(MSVC)
|
||||
SET_TARGET_PROPERTIES(listobj PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF")
|
||||
TARGET_LINK_LIBRARIES(listobj "Ws2_32.lib")
|
||||
ENDIF(MSVC)
|
||||
|
||||
IF(UNIX)
|
||||
TARGET_LINK_LIBRARIES(listobj "z")
|
||||
ENDIF(UNIX)
|
||||
|
||||
#on windows: glmodelviewer
|
||||
IF(MSVC)
|
||||
SET(glmodelviewer_sources
|
||||
GLModelViewer.cpp
|
||||
)
|
||||
|
||||
SET(glmodelviewer_headers
|
||||
GLModelViewer.h
|
||||
)
|
||||
|
||||
ADD_EXECUTABLE(glmodelviewer WIN32 ${glmodelviewer_sources} ${glmodelviewer_headers})
|
||||
TARGET_LINK_LIBRARIES(glmodelviewer azone_common debug ${MySQL_LIBRARY_DEBUG} optimized ${MySQL_LIBRARY_RELEASE} "opengl32.lib" "GLU32.lib" "Ws2_32.lib")
|
||||
SET_TARGET_PROPERTIES(glmodelviewer PROPERTIES LINK_FLAGS_RELEASE "/OPT:REF /OPT:ICF")
|
||||
|
||||
SET(EXECUTABLE_OUTPUT_PATH ../../Bin)
|
||||
ENDIF(MSVC)
|
||||
@@ -0,0 +1,548 @@
|
||||
|
||||
// Quick and dirty EQ model viewer for Windows, using OpenGL
|
||||
//
|
||||
// Put together by Derision from EQEmu forums using basic Windows OpenGL framework from NeHe tutorials @ gamedev.net
|
||||
// and S3D and EQG file loaders from OpenEQ (modified a bit to fix some bugs and support newer EQG formats).
|
||||
|
||||
|
||||
|
||||
#ifdef WIN32
|
||||
#define Polygon Polygon_win32
|
||||
#include <windows.h>
|
||||
#undef Polygon
|
||||
#endif
|
||||
#include <gl\gl.h>
|
||||
#include <gl\glu.h>
|
||||
#include <stdio.h>
|
||||
#include <cstdlib>
|
||||
#include <math.h>
|
||||
#include "types.h"
|
||||
#include "wld.hpp"
|
||||
#include "archive.hpp"
|
||||
#include "pfs.hpp"
|
||||
#include "file_loader.hpp"
|
||||
#include "zon.hpp"
|
||||
#include "zonv4.hpp"
|
||||
#include "ter.hpp"
|
||||
|
||||
|
||||
typedef struct _vertex{
|
||||
float x;
|
||||
float y;
|
||||
float z;
|
||||
|
||||
}VERTEX;
|
||||
|
||||
void DrawEQModel(FileLoader *fileloader, int modnum);
|
||||
FileLoader *mfileloader;
|
||||
bool ProcessZoneFile(const char *shortname);
|
||||
enum EQFileType { S3D, EQG, UNKNOWN };
|
||||
|
||||
HDC hDC=NULL;
|
||||
HGLRC hRC=NULL;
|
||||
HWND hWnd=NULL;
|
||||
HINSTANCE hInstance;
|
||||
|
||||
bool keys[256];
|
||||
char ch;
|
||||
bool active=true;
|
||||
GLuint base;
|
||||
|
||||
int modelnum = 1; // The Number of the model we are currently displaying.
|
||||
float angle = 0; // used to rotate the model. Updated by a timer
|
||||
|
||||
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // Declaration For WndProc
|
||||
|
||||
GLvoid BuildFont(GLvoid)
|
||||
{
|
||||
HFONT font;
|
||||
HFONT oldfont;
|
||||
|
||||
base = glGenLists(96);
|
||||
|
||||
font = CreateFont(-24, 0, 0, 0, FW_BOLD, false, false, false, ANSI_CHARSET,
|
||||
OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY,
|
||||
FF_DONTCARE|DEFAULT_PITCH, "Courier New");
|
||||
|
||||
oldfont = (HFONT)SelectObject(hDC, font);
|
||||
wglUseFontBitmaps(hDC, 32, 96, base);
|
||||
SelectObject(hDC, oldfont);
|
||||
DeleteObject(font);
|
||||
}
|
||||
|
||||
GLvoid KillFont(GLvoid)
|
||||
{
|
||||
glDeleteLists(base, 96);
|
||||
}
|
||||
|
||||
GLvoid glPrint(const char *fmt, ...)
|
||||
{
|
||||
char text[256];
|
||||
va_list ap;
|
||||
|
||||
if (fmt == NULL) return;
|
||||
|
||||
va_start(ap, fmt);
|
||||
vsprintf(text, fmt, ap);
|
||||
va_end(ap);
|
||||
|
||||
glPushAttrib(GL_LIST_BIT);
|
||||
glListBase(base - 32);
|
||||
glCallLists(strlen(text), GL_UNSIGNED_BYTE, text);
|
||||
glPopAttrib();
|
||||
}
|
||||
|
||||
GLvoid ReSizeGLScene(GLsizei width, GLsizei height)
|
||||
{
|
||||
if (height==0)height=1;
|
||||
|
||||
glViewport(0,0,width,height);
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
gluPerspective(60.0f,(GLfloat)width/(GLfloat)height,0.1f,12000.0f);
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glLoadIdentity();
|
||||
}
|
||||
|
||||
int InitGL(GLvoid)
|
||||
{
|
||||
glShadeModel(GL_SMOOTH);
|
||||
glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
|
||||
glClearDepth(1.0f);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glDepthFunc(GL_LEQUAL);
|
||||
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
|
||||
BuildFont();
|
||||
return true;
|
||||
}
|
||||
|
||||
int DrawGLScene(char *ZoneFileName)
|
||||
{
|
||||
char textBuffer[100];
|
||||
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
glLoadIdentity();
|
||||
|
||||
if(mfileloader->model_data.models[modelnum])
|
||||
DrawEQModel(mfileloader, modelnum);
|
||||
|
||||
glLoadIdentity();
|
||||
glTranslatef(0.0f,0.0f,-1.2f);
|
||||
glColor3f(100.0f,0.0f,0.0f);
|
||||
glRasterPos2f(-1.15f,0.56f);
|
||||
|
||||
if(mfileloader->model_data.models[modelnum])
|
||||
if(mfileloader->model_data.models[modelnum]->name)
|
||||
sprintf(textBuffer," %s: Model Number %4d. Name %s", ZoneFileName, modelnum, mfileloader->model_data.models[modelnum]->name);
|
||||
else
|
||||
sprintf(textBuffer," %s: Model Number %4d. Not Viewable (load failed).", ZoneFileName, modelnum);
|
||||
else
|
||||
sprintf(textBuffer," %s: Model Number %4d. Not Viewable (probably zone mesh).", ZoneFileName, modelnum);
|
||||
|
||||
glPrint(textBuffer);
|
||||
sprintf(textBuffer," Use the + and - keys to cycle through models.");
|
||||
glRasterPos2f(-1.15f,0.50f);
|
||||
glPrint(textBuffer);
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
GLvoid KillGLWindow(GLvoid) {
|
||||
if (hRC) {
|
||||
if (!wglMakeCurrent(NULL,NULL)) {
|
||||
MessageBox(NULL,"Release Of DC And RC Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
|
||||
}
|
||||
|
||||
if (!wglDeleteContext(hRC)) {
|
||||
MessageBox(NULL,"Release Rendering Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
|
||||
}
|
||||
hRC=NULL;
|
||||
}
|
||||
|
||||
if (hDC && !ReleaseDC(hWnd,hDC)) {
|
||||
MessageBox(NULL,"Release Device Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
|
||||
hDC=NULL;
|
||||
}
|
||||
|
||||
if (hWnd && !DestroyWindow(hWnd)) {
|
||||
MessageBox(NULL,"Could Not Release hWnd.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
|
||||
hWnd=NULL;
|
||||
}
|
||||
|
||||
if (!UnregisterClass("OpenGL",hInstance)) {
|
||||
MessageBox(NULL,"Could Not Unregister Class.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
|
||||
hInstance=NULL;
|
||||
}
|
||||
KillFont();
|
||||
}
|
||||
|
||||
|
||||
BOOL CreateGLWindow(char* title, int width, int height, int bits) {
|
||||
GLuint PixelFormat;
|
||||
WNDCLASS wc;
|
||||
DWORD dwExStyle;
|
||||
DWORD dwStyle;
|
||||
RECT WindowRect;
|
||||
WindowRect.left=(long)0;
|
||||
WindowRect.right=(long)width;
|
||||
WindowRect.top=(long)0;
|
||||
WindowRect.bottom=(long)height;
|
||||
|
||||
hInstance = GetModuleHandle(NULL);
|
||||
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
|
||||
wc.lpfnWndProc = (WNDPROC) WndProc;
|
||||
wc.cbClsExtra = 0;
|
||||
wc.cbWndExtra = 0;
|
||||
wc.hInstance = hInstance;
|
||||
wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
|
||||
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
||||
wc.hbrBackground = NULL;
|
||||
wc.lpszMenuName = NULL;
|
||||
wc.lpszClassName = "OpenGL";
|
||||
|
||||
if (!RegisterClass(&wc)) {
|
||||
MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);
|
||||
return false;
|
||||
}
|
||||
|
||||
dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
|
||||
dwStyle=WS_OVERLAPPEDWINDOW;
|
||||
|
||||
AdjustWindowRectEx(&WindowRect, dwStyle, false, dwExStyle);
|
||||
|
||||
if (!(hWnd=CreateWindowEx(dwExStyle, "OpenGL", title, dwStyle|WS_CLIPSIBLINGS|WS_CLIPCHILDREN,
|
||||
0, 0, WindowRect.right-WindowRect.left, WindowRect.bottom-WindowRect.top,
|
||||
NULL, NULL, hInstance, NULL))) {
|
||||
KillGLWindow();
|
||||
MessageBox(NULL,"Window Creation Error.","ERROR",MB_OK|MB_ICONEXCLAMATION);
|
||||
return false;
|
||||
}
|
||||
|
||||
static PIXELFORMATDESCRIPTOR pfd= {
|
||||
sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER,
|
||||
PFD_TYPE_RGBA, bits, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, PFD_MAIN_PLANE,
|
||||
0, 0, 0, 0
|
||||
};
|
||||
|
||||
if (!(hDC=GetDC(hWnd))) {
|
||||
KillGLWindow();
|
||||
MessageBox(NULL,"Can't Create A GL Device Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd))) {
|
||||
KillGLWindow();
|
||||
MessageBox(NULL,"Can't Find A Suitable PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!SetPixelFormat(hDC,PixelFormat,&pfd)) {
|
||||
KillGLWindow();
|
||||
MessageBox(NULL,"Can't Set The PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!(hRC=wglCreateContext(hDC))) {
|
||||
KillGLWindow();
|
||||
MessageBox(NULL,"Can't Create A GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!wglMakeCurrent(hDC,hRC)) {
|
||||
KillGLWindow();
|
||||
MessageBox(NULL,"Can't Activate The GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
|
||||
return false;
|
||||
}
|
||||
|
||||
ShowWindow(hWnd,SW_SHOW);
|
||||
SetForegroundWindow(hWnd);
|
||||
SetFocus(hWnd);
|
||||
ReSizeGLScene(width, height);
|
||||
|
||||
if (!InitGL()) {
|
||||
KillGLWindow();
|
||||
MessageBox(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION);
|
||||
return false;
|
||||
}
|
||||
|
||||
SetTimer(hWnd, 1, 50, (TIMERPROC) NULL);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
|
||||
switch (uMsg) {
|
||||
case WM_ACTIVATE:
|
||||
if (!HIWORD(wParam)) active=true;
|
||||
else
|
||||
active=false;
|
||||
|
||||
return 0;
|
||||
case WM_SYSCOMMAND:
|
||||
switch (wParam) {
|
||||
case SC_SCREENSAVE:
|
||||
case SC_MONITORPOWER:
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
case WM_CLOSE:
|
||||
PostQuitMessage(0);
|
||||
return 0;
|
||||
case WM_KEYDOWN:
|
||||
keys[wParam] = true;
|
||||
return 0;
|
||||
case WM_CHAR:
|
||||
ch = wParam;
|
||||
return 0;
|
||||
case WM_KEYUP:
|
||||
keys[wParam] = false;
|
||||
return 0;
|
||||
case WM_SIZE:
|
||||
ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));
|
||||
return 0;
|
||||
case WM_TIMER:
|
||||
angle = angle + 1;
|
||||
if(angle>359) angle = 0;
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
return DefWindowProc(hWnd,uMsg,wParam,lParam);
|
||||
}
|
||||
|
||||
void TranslateVertex(VERTEX &v, float XOffset, float YOffset, float ZOffset) {
|
||||
|
||||
v.x = v.x + XOffset;
|
||||
v.y = v.y + YOffset;
|
||||
v.z = v.z + ZOffset;
|
||||
}
|
||||
|
||||
void ScaleVertex(VERTEX &v, float XScale, float YScale, float ZScale) {
|
||||
|
||||
v.x = v.x * XScale;
|
||||
v.y = v.y * YScale;
|
||||
v.z = v.z * ZScale;
|
||||
}
|
||||
|
||||
|
||||
void DrawEQModel(FileLoader *fileloader, int modnum) {
|
||||
|
||||
Polygon *poly;
|
||||
Vertex *verts[3];
|
||||
VERTEX v1, v2, v3;
|
||||
|
||||
float maxDimension = 0, minx = 999999, miny = 999999, minz = 999999, maxx = -999999, maxy=-999999, maxz=-999999;
|
||||
Model *model = fileloader->model_data.models[modnum];
|
||||
|
||||
for(int i = 0; i < model->poly_count; ++i) {
|
||||
poly = model->polys[i];
|
||||
|
||||
verts[0] = model->verts[poly->v1];
|
||||
verts[1] = model->verts[poly->v2];
|
||||
verts[2] = model->verts[poly->v3];
|
||||
|
||||
for(int j=0; j<3; j++) {
|
||||
if(verts[j]->x > maxDimension) maxDimension = verts[j]->x;
|
||||
if(verts[j]->y > maxDimension) maxDimension = verts[j]->y;
|
||||
if(verts[j]->z > maxDimension) maxDimension = verts[j]->z;
|
||||
|
||||
if(verts[j]->x < minx) minx = verts[j]->x;
|
||||
if(verts[j]->y < miny) miny = verts[j]->y;
|
||||
if(verts[j]->z < minz) minz = verts[j]->z;
|
||||
|
||||
if(verts[j]->x > maxx) maxx = verts[j]->x;
|
||||
if(verts[j]->y > maxy) maxy = verts[j]->y;
|
||||
if(verts[j]->z > maxz) maxz = verts[j]->z;
|
||||
}
|
||||
}
|
||||
|
||||
maxDimension = 0;
|
||||
if(maxx-minx>maxDimension) maxDimension = maxx-minx;
|
||||
if(maxy-miny>maxDimension) maxDimension = maxy-miny;
|
||||
if(maxz-minz>maxDimension) maxDimension = maxz-minz;
|
||||
|
||||
// Hack for very small models (e.g. spoons)
|
||||
if(maxDimension>1)
|
||||
glTranslatef(-1.5f,0.0f,-(maxDimension*2));
|
||||
else
|
||||
glTranslatef(-1.5f,0.0f,-10);
|
||||
|
||||
// angle is updated by a timer every 50ms.
|
||||
glRotatef(angle, 1, 0, 0);
|
||||
glRotatef(angle, 0, 1, 0);
|
||||
glRotatef(angle, 0, 0, 1);
|
||||
|
||||
glBegin(GL_TRIANGLES);
|
||||
|
||||
for(int i = 0; i < model->poly_count; ++i) {
|
||||
poly = model->polys[i];
|
||||
|
||||
verts[0] = model->verts[poly->v1];
|
||||
verts[1] = model->verts[poly->v2];
|
||||
verts[2] = model->verts[poly->v3];
|
||||
|
||||
v1.x = verts[0]->x; v1.y = verts[0]->y; v1.z = verts[0]->z;
|
||||
v2.x = verts[1]->x; v2.y = verts[1]->y; v2.z = verts[1]->z;
|
||||
v3.x = verts[2]->x; v3.y = verts[2]->y; v3.z = verts[2]->z;
|
||||
|
||||
// The aim of this is to centre the model in the window
|
||||
|
||||
TranslateVertex(v1, -(minx + (maxx-minx)/2), -(miny + (maxy-miny)/2), -(minz + (maxz-minz)/2));
|
||||
TranslateVertex(v2, -(minx + (maxx-minx)/2), -(miny + (maxy-miny)/2), -(minz + (maxz-minz)/2));
|
||||
TranslateVertex(v3, -(minx + (maxx-minx)/2), -(miny + (maxy-miny)/2), -(minz + (maxz-minz)/2));
|
||||
|
||||
// For very small models, magnify them
|
||||
if(maxDimension<=1) {
|
||||
ScaleVertex(v1, 10, 10, 10);
|
||||
ScaleVertex(v2, 10, 10, 10);
|
||||
ScaleVertex(v3, 10, 10, 10);
|
||||
}
|
||||
|
||||
// Assign a kind of random colour to each polygon
|
||||
|
||||
//glColor3b((i%50)+50,(i*5)%200,(i*10)%200);
|
||||
float col = (float)(100 + ((i*10) % 150)) /250 * 1.0f;
|
||||
glColor3f(col, col, col);
|
||||
|
||||
glVertex3f(v1.x, v1.z, v1.y);
|
||||
glVertex3f(v2.x, v2.z, v2.y);
|
||||
glVertex3f(v3.x, v3.z, v3.y);
|
||||
|
||||
}
|
||||
glEnd();
|
||||
}
|
||||
|
||||
bool ProcessZoneFile(const char *shortname) {
|
||||
|
||||
char bufs[96];
|
||||
Archive *archive;
|
||||
|
||||
Zone_Model *zm;
|
||||
FILE *fff;
|
||||
EQFileType FileType = UNKNOWN;
|
||||
GLuint *textures;
|
||||
|
||||
sprintf(bufs, "%s.s3d", shortname);
|
||||
|
||||
archive = new PFSLoader();
|
||||
fff = fopen(bufs, "rb");
|
||||
if(fff != NULL)
|
||||
FileType = S3D;
|
||||
else {
|
||||
sprintf(bufs, "%s.eqg", shortname);
|
||||
fff = fopen(bufs, "rb");
|
||||
if(fff != NULL)
|
||||
FileType = EQG;
|
||||
}
|
||||
|
||||
if(FileType == UNKNOWN) {
|
||||
MessageBox(NULL,"Unable to locate specified zone either as EQG or S3D","ERROR",MB_OK|MB_ICONEXCLAMATION);
|
||||
return(false);
|
||||
}
|
||||
|
||||
if(archive->Open(fff) == 0) {
|
||||
MessageBox(NULL,"Unable to open container file","ERROR",MB_OK|MB_ICONEXCLAMATION);
|
||||
|
||||
return(false);
|
||||
}
|
||||
|
||||
switch(FileType) {
|
||||
case S3D:
|
||||
mfileloader = new WLDLoader();
|
||||
if(mfileloader->Open(NULL, (char *) shortname, archive) == 0) {
|
||||
|
||||
MessageBox(NULL,"Error reading WLD from container file","ERROR",MB_OK|MB_ICONEXCLAMATION);
|
||||
return(false);
|
||||
}
|
||||
break;
|
||||
case EQG:
|
||||
mfileloader = new ZonLoader();
|
||||
if(mfileloader->Open(NULL, (char *) shortname, archive) == 0) {
|
||||
delete mfileloader;
|
||||
mfileloader = new Zonv4Loader();
|
||||
if(mfileloader->Open(NULL, (char *) shortname, archive) == 0) {
|
||||
MessageBox(NULL,"Error reading ZON/TER from container file","ERROR",MB_OK|MB_ICONEXCLAMATION);
|
||||
return(false);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case UNKNOWN:
|
||||
break;
|
||||
}
|
||||
|
||||
if(mfileloader->model_data.model_count==0) {
|
||||
MessageBox(NULL,"No models found. For S3D, probably could not locate _obj.s3d file","ERROR",MB_OK|MB_ICONEXCLAMATION);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
zm = mfileloader->model_data.zone_model;
|
||||
|
||||
return(true);
|
||||
}
|
||||
|
||||
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
|
||||
MSG msg;
|
||||
BOOL done=false;
|
||||
FILE *fp;
|
||||
|
||||
for(int i=0;i<256;i++)
|
||||
keys[i] = false;
|
||||
|
||||
|
||||
char* buf = (char *) new char[strlen(lpCmdLine) + 1] ;
|
||||
char *pTmp = buf;
|
||||
|
||||
if(!strlen(lpCmdLine)) {
|
||||
MessageBox(NULL,"Specify the shortname of the zone (without the S3D or EQG extension) on the command line.",
|
||||
"ERROR",MB_OK | MB_ICONINFORMATION);
|
||||
return 0;
|
||||
}
|
||||
|
||||
strcpy(buf,lpCmdLine);
|
||||
|
||||
if(!ProcessZoneFile(buf)) return 0;
|
||||
|
||||
if (!CreateGLWindow("EQ Model Viewer",1280,768,16))
|
||||
return 0;
|
||||
|
||||
while(!done) {
|
||||
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) {
|
||||
if (msg.message==WM_QUIT)
|
||||
done=true;
|
||||
else {
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if ((active && !DrawGLScene(buf)) || keys[VK_ESCAPE])
|
||||
done=true;
|
||||
else
|
||||
SwapBuffers(hDC);
|
||||
|
||||
// Use + and - to cycle through the models
|
||||
|
||||
if (toupper(ch)=='+') {
|
||||
if(modelnum+1 < mfileloader->model_data.model_count)
|
||||
modelnum++;
|
||||
else
|
||||
modelnum=0;
|
||||
angle = 0;
|
||||
}
|
||||
if (toupper(ch)=='-') {
|
||||
if(modelnum>0)
|
||||
modelnum--;
|
||||
else
|
||||
modelnum = mfileloader->model_data.model_count - 1;
|
||||
|
||||
angle = 0;
|
||||
}
|
||||
ch = 0;
|
||||
}
|
||||
}
|
||||
|
||||
KillGLWindow();
|
||||
return (msg.wParam);
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
#pragma once
|
||||
|
||||
#include "resource.h"
|
||||
@@ -0,0 +1,79 @@
|
||||
|
||||
Azone2, awater, listobj, glModelViewer
|
||||
|
||||
azone2 creates .map files for EQEmu, used in LOS and BestZ, etc.
|
||||
|
||||
.S3D and .EQG zone files found with the Titanium EQ distribution are
|
||||
supported.
|
||||
|
||||
to use all of these utilities, copy them to a directory containing your .S3D and .EQG
|
||||
files.
|
||||
|
||||
IMPORTANT NOTE:
|
||||
|
||||
Older EQGs had the .ZON file within the .EQG container. Newer EQGs, e.g.
|
||||
tutorialb, dreadspire, have the .ZON file as a separate file in your EQ directory.
|
||||
To include placeable objects for these, YOU MUST have both the .EQG and .ZON file
|
||||
in the same directory as azone2.
|
||||
|
||||
To generate a map file, specifit the shortname of the zone (without the extension).
|
||||
|
||||
e.g.
|
||||
|
||||
./azone2 tox
|
||||
./azone2 anguish
|
||||
|
||||
Copy the resultant .map file to the Maps directory on your server.
|
||||
|
||||
|
||||
20/06/08 Derision:
|
||||
To include placeable objects, use the listobj program to find the models you want,
|
||||
e.g. ./listobj tox
|
||||
|
||||
LISTOBJ: List Placeable Objects in .S3D or .EQG zone files.
|
||||
Placeable Object 0 @ ( -420.42, 2443.43, -50.30 uses model 27 TIKI_DMSPRITEDEF
|
||||
Placeable Object 1 @ ( -482.54, 2446.06, -45.13 uses model 27 TIKI_DMSPRITEDEF
|
||||
Placeable Object 2 @ ( -439.99, 2603.35, -29.50 uses model 28 TORCH1_DMSPRITEDEF
|
||||
Placeable Object 3 @ ( 158.28, 1094.74, -50.40 uses model 27 TIKI_DMSPRITEDEF
|
||||
Placeable Object 4 @ ( 137.83, 1074.79, -49.91 uses model 17 HUT4_DMSPRITEDEF
|
||||
Placeable Object 5 @ ( 150.64, 1205.48, -48.46 uses model 27 TIKI_DMSPRITEDEF
|
||||
Placeable Object 6 @ ( 128.19, 1204.95, -48.37 uses model 27 TIKI_DMSPRITEDEF
|
||||
Placeable Object 7 @ ( 139.57, 1153.50, -53.74 uses model 20 KDOCK_DMSPRITEDEF
|
||||
Placeable Object 8 @ ( 1139.42, -837.60, -55.38 uses model 5 ERBRAZIER_DMSPRITEDEF
|
||||
|
||||
^
|
||||
|
|
||||
|
|
||||
This is the model number -------------|
|
||||
|
||||
If you want azone to include all occurrences of HUT4_DMSPRITEDF (model 17) and KDOCK_DMSPRITEDF (20),
|
||||
you would add a line to azone.ini as follows:
|
||||
|
||||
# Include huts, houses and bridge from tox
|
||||
tox.s3d,17,20
|
||||
# Include two bridges from Tutorialb
|
||||
tutorialb.eqg,17,47
|
||||
# Include a couple of towers in Anguish
|
||||
anguish.eqg,7,8
|
||||
|
||||
Note that as you can only specify a model number, it is not possible to only have selected occurrences
|
||||
of that model included.
|
||||
|
||||
Lines in azone.ini beginning with a # are ignored.
|
||||
|
||||
TO INCLUDE PLACEABLE MODELS FOR .S3D ZONES, THE _OBJ.S3D FILE FOR THAT ZONE MUST ALSO BE PRESENT IN THE
|
||||
SAME DIRECTORY.
|
||||
|
||||
You can also use glmodelviewer (Windows only) to display the models in a zone to find the ones you want
|
||||
to include. To run it, from a command prompt, e.g.
|
||||
|
||||
glmodelviewer wallofslaughter
|
||||
|
||||
Finally, awater generates .wtr files containing details of the water, lava, PVP etc areas in an S3D zone.
|
||||
Usage example:
|
||||
|
||||
./awater fieldofbone
|
||||
|
||||
The windows solution and project files provided were produced with Visual C++ 2008 and as configured,
|
||||
require a statically linkable zlib.lib.
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
#ifndef __OPENEQ_ARCHIVE_API__
|
||||
#define __OPENEQ_ARCHIVE_API__
|
||||
|
||||
#include "global.hpp"
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
class Archive {
|
||||
public:
|
||||
Archive() {}
|
||||
virtual ~Archive() {}
|
||||
|
||||
virtual int Open(FILE *fp) = 0;
|
||||
virtual int Close() = 0;
|
||||
|
||||
virtual int GetFile(char *name, uchar **buf, int *len) = 0;
|
||||
virtual const char *FindExtension(const char *ext) = 0;
|
||||
|
||||
char **filenames;
|
||||
int count;
|
||||
|
||||
protected:
|
||||
uchar *buffer;
|
||||
int buf_len;
|
||||
|
||||
int status;
|
||||
|
||||
uint32 *files;
|
||||
FILE *fp;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,375 @@
|
||||
/*
|
||||
|
||||
AWater: Generate 'Water Maps' for EQEmu. 'Water Maps' is a misnomer as,
|
||||
while originally intended to produce a map of water regions from .S3D
|
||||
zone files, it also includes details of lava, PVP and other 'special'
|
||||
areas.
|
||||
|
||||
Based on Azone (Father NitWit) and OpenEQ (Daeken et al). Original
|
||||
copyright notice from Azone follows:
|
||||
|
||||
Father Nitwit's Zone to map conversion program.
|
||||
Copyright (C) 2004 Father Nitwit (eqemu@8ass.com)
|
||||
|
||||
This thing uses code from freaku, so whatever license that comes under
|
||||
is relavent, if you care.
|
||||
|
||||
the rest of it is GPL, even though I hate the GPL.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; version 2 of the License.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||
are required to give you total support for your newly bought product;
|
||||
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
typedef unsigned char BYTE;
|
||||
typedef unsigned short WORD;
|
||||
typedef short SHORT;
|
||||
typedef unsigned long DWORD;
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include <stdlib.h>
|
||||
//#include "EQWldData.h"
|
||||
#include "awater.h"
|
||||
#include "types.h"
|
||||
#include "s3d.h"
|
||||
#include "wld.hpp"
|
||||
|
||||
#include "archive.hpp"
|
||||
#include "pfs.hpp"
|
||||
|
||||
#include "file_loader.hpp"
|
||||
#include "zon.hpp"
|
||||
#include "ter.hpp"
|
||||
|
||||
|
||||
//this un-commented works with my map.cpp code correctly.
|
||||
//with both of my inverts there commented.
|
||||
#define INVERSEXY 1
|
||||
|
||||
#include <vector>
|
||||
#include <map>
|
||||
using namespace std;
|
||||
|
||||
//#define SPLIT_DEBUG
|
||||
|
||||
|
||||
bool BuildWaterMap(const char *shortname, long DefaultRegionType);
|
||||
void PrintBSP(BSP_Node *tree, long node_number);
|
||||
long BSPFindRegion(BSP_Node *tree, long node_number, long region);
|
||||
long BSPFindNode(BSP_Node *tree, long node_number, float x, float y, float z);
|
||||
long BSPMarkRegion(BSP_Node *tree, long node_number, long region, int region_type);
|
||||
long BSPCountNodes(BSP_Node *tree, long node_number);
|
||||
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
|
||||
long DefaultRegionType=RegionTypeWater;
|
||||
|
||||
if((argc < 2) ||
|
||||
(argc > 3) ||
|
||||
#ifndef WIN32
|
||||
((argc == 3)&&(strcasecmp(argv[1],"-dl")))) {
|
||||
#else
|
||||
((argc == 3)&&(_stricmp(argv[1],"-dl")))) {
|
||||
#endif
|
||||
|
||||
printf("Usage: %s [-dl] (zone short name) to generate a water/lava map\n\n", argv[0]);
|
||||
printf(" -dl = mark special regions as lava if not tagged in .WLD\n");
|
||||
printf("\nIf -dl is omitted, untagged special regions will be marked as water\n");
|
||||
return(1);
|
||||
}
|
||||
|
||||
char bufm[250];
|
||||
|
||||
if(argc==3)
|
||||
DefaultRegionType=RegionTypeLava;
|
||||
sprintf(bufm, "%s.wtr", argv[argc-1]);
|
||||
if(!BuildWaterMap(argv[argc-1],DefaultRegionType))
|
||||
return(1);
|
||||
|
||||
return(0);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool BuildWaterMap(const char *shortname, long DefaultRegionType) {
|
||||
|
||||
char bufs[96];
|
||||
Archive *archive;
|
||||
WLDLoader *fileloader;
|
||||
long WaterOrLavaCount = 0;
|
||||
|
||||
//TODO: clean up a LOT of memory that the freaku code does not
|
||||
|
||||
|
||||
sprintf(bufs, "%s.s3d", shortname);
|
||||
|
||||
archive = new PFSLoader();
|
||||
|
||||
FILE *s3df = fopen(bufs, "rb");
|
||||
if(s3df == NULL) {
|
||||
// One day we may try EQG, but not today.
|
||||
printf("Unable to open s3d file '%s'.\n", bufs);
|
||||
return(false);
|
||||
}
|
||||
if(archive->Open(s3df) == 0) {
|
||||
printf("Unable to open s3d file '%s'.\n", bufs);
|
||||
return(false);
|
||||
}
|
||||
printf("Loading %s...\n", bufs);
|
||||
|
||||
fileloader = new WLDLoader();
|
||||
|
||||
if(fileloader->Open(NULL, (char *) shortname, archive) == 0) {
|
||||
printf("Error reading WLD from %s\n", bufs);
|
||||
return(false);
|
||||
}
|
||||
|
||||
BSP_Node *tree = fileloader->tree;
|
||||
struct_Data29 *data29;
|
||||
|
||||
|
||||
for(int i=0; i<fileloader->fragcount; i++) {
|
||||
if(fileloader->frags[i]->type == 0x29) {
|
||||
printf("We have a type 0x29 fragment. ");
|
||||
data29 = (struct_Data29 *) fileloader->frags[i]->frag;
|
||||
printf("It has %ld regions and is marked as type %d. ",
|
||||
data29->region_count, data29->region_type);
|
||||
switch(data29->region_type) {
|
||||
case RegionTypeUnsupported: { printf("Unsupported\n"); break; }
|
||||
case RegionTypeUntagged: {
|
||||
printf("Untagged. We will set it to ");
|
||||
if(DefaultRegionType==RegionTypeWater) {
|
||||
printf("Water\n");
|
||||
} else printf("Lava\n");
|
||||
data29->region_type = DefaultRegionType;
|
||||
WaterOrLavaCount++;
|
||||
break;
|
||||
}
|
||||
case RegionTypeWater: { printf("Water\n"); WaterOrLavaCount++; break; }
|
||||
case RegionTypeLava: { printf("Lava\n"); WaterOrLavaCount++; break; }
|
||||
case RegionTypeZoneLine: { printf("Zoneline\n"); break; }
|
||||
case RegionTypePVP: { printf("PVP\n"); break; }
|
||||
case RegionTypeSlime: { printf("Slime\n"); break; }
|
||||
case RegionTypeIce: { printf("Ice\n"); break; }
|
||||
case RegionTypeVWater: { printf("VWATER\n"); break; }
|
||||
default: printf("UNKNOWN\n");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
if(tree==NULL) {
|
||||
printf("No BSP Tree. Bailing out\n");
|
||||
return(false);
|
||||
}
|
||||
|
||||
unsigned long BSPTreeSize = BSPCountNodes(tree, 1);
|
||||
|
||||
printf("There are %ld nodes in the BSP tree\n", BSPTreeSize);
|
||||
|
||||
// Now we mark each leaf in the BSP tree that is in a 'special area' with what type the area is
|
||||
// Water, Lava, Zoneline etc
|
||||
|
||||
for(int i=0; i<fileloader->fragcount; i++) {
|
||||
if(fileloader->frags[i]->type == 0x29) {
|
||||
data29 = (struct_Data29 *) fileloader->frags[i]->frag;
|
||||
for(long j=0; j<data29->region_count; j++) {
|
||||
BSPMarkRegion(tree, 1,data29->region_array[j]+1, data29->region_type);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Now write out the file
|
||||
|
||||
char bufm[250];
|
||||
sprintf(bufm, "%s.wtr", shortname);
|
||||
|
||||
FILE *WaterFile = fopen(bufm, "wb");
|
||||
if(WaterFile == NULL) {
|
||||
printf("Failed to open %s for writing\n", bufm);
|
||||
return(false);
|
||||
}
|
||||
const char *WFMagic = "EQEMUWATER";
|
||||
const long WFVersion = 1;
|
||||
|
||||
if(fwrite(WFMagic, strlen(WFMagic), 1, WaterFile) != 1) {
|
||||
printf("Error writing output file\n");
|
||||
fclose(WaterFile);
|
||||
return(false);
|
||||
}
|
||||
if(fwrite(&WFVersion, sizeof(WFVersion), 1, WaterFile) != 1) {
|
||||
printf("Error writing output file\n");
|
||||
fclose(WaterFile);
|
||||
return(false);
|
||||
}
|
||||
|
||||
if(fwrite(&BSPTreeSize, sizeof(BSPTreeSize), 1, WaterFile) != 1) {
|
||||
printf("Error writing output file\n");
|
||||
fclose(WaterFile);
|
||||
return(false);
|
||||
}
|
||||
|
||||
if(fwrite(tree, sizeof(BSP_Node), BSPTreeSize, WaterFile) != BSPTreeSize) {
|
||||
printf("Error writing output file\n");
|
||||
fclose(WaterFile);
|
||||
return(false);
|
||||
}
|
||||
|
||||
fclose(WaterFile);
|
||||
return(true);
|
||||
}
|
||||
|
||||
|
||||
void PrintBSP(BSP_Node *tree, long node_number) {
|
||||
printf("Node %ld, Left=%ld, Right=%ld\n",
|
||||
node_number-1,
|
||||
tree[node_number-1].left,
|
||||
tree[node_number-1].right);
|
||||
printf("Normals are %4.3f, %4.3f, %4.3f, SplitD is %4.3f\n",
|
||||
tree[node_number-1].normal[0],
|
||||
tree[node_number-1].normal[1],
|
||||
tree[node_number-1].normal[2],
|
||||
tree[node_number-1].splitdistance);
|
||||
|
||||
if(tree[node_number-1].left!=0) PrintBSP(tree, tree[node_number-1].left);
|
||||
if(tree[node_number-1].right!=0) PrintBSP(tree, tree[node_number-1].right);
|
||||
if((tree[node_number-1].left==0)&&
|
||||
(tree[node_number-1].right==0)) {
|
||||
printf("Region pointer is %ld\n", tree[node_number-1].region);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
long BSPCountNodes(BSP_Node *tree, long node_number) {
|
||||
|
||||
long NodesInRightBranch = 0, NodesInLeftBranch = 0;
|
||||
|
||||
if((tree[node_number-1].left==0)&&
|
||||
(tree[node_number-1].right==0)) return 1;
|
||||
|
||||
if(tree[node_number-1].left!=0) NodesInLeftBranch = BSPCountNodes(tree, (tree[node_number-1].left));
|
||||
if(tree[node_number-1].right!=0) NodesInRightBranch = BSPCountNodes(tree, (tree[node_number-1].right));
|
||||
|
||||
return(NodesInRightBranch + NodesInLeftBranch + 1);
|
||||
|
||||
}
|
||||
|
||||
|
||||
long BSPFindRegion(BSP_Node *tree, long node_number, long region) {
|
||||
//printf("Find Region %ld in node %ld\n", region, node_number);
|
||||
if(node_number<1) {
|
||||
printf("Something went wrong\n");
|
||||
exit(1);
|
||||
}
|
||||
if((tree[node_number-1].left==0)&&
|
||||
(tree[node_number-1].right==0)) {
|
||||
if(tree[node_number-1].region==region) return node_number;
|
||||
}
|
||||
|
||||
|
||||
long retnode ;
|
||||
if(tree[node_number-1].left!=0) {
|
||||
retnode = BSPFindRegion(tree, tree[node_number-1].left, region);
|
||||
if(retnode != 0) return retnode ;
|
||||
}
|
||||
|
||||
if(tree[node_number-1].right!=0) {
|
||||
return BSPFindRegion(tree, tree[node_number-1].right, region);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
long BSPFindNode(BSP_Node *tree, long node_number, float x, float y, float z) {
|
||||
|
||||
float distance;
|
||||
|
||||
|
||||
printf("BSP Find Node, currently in Node %ld\n", node_number);
|
||||
// Are we at a leaf
|
||||
|
||||
if((tree[node_number-1].left==0)&&
|
||||
(tree[node_number-1].right==0)) {
|
||||
return tree[node_number-1].region;
|
||||
}
|
||||
|
||||
// No, so determine which side of the split plane we are on
|
||||
//
|
||||
|
||||
distance = (x * tree[node_number-1].normal[0]) +
|
||||
(y * tree[node_number-1].normal[1]) +
|
||||
(z * tree[node_number-1].normal[2]) +
|
||||
tree[node_number-1].splitdistance;
|
||||
printf("Distance is %4.3f\n", distance);
|
||||
// Guess which side to go down
|
||||
if(distance == 0.0f) {
|
||||
printf("Distance is 0, don't know what to do!\n");
|
||||
exit(1);
|
||||
}
|
||||
if(distance >0.0f) {
|
||||
if(tree[node_number-1].left==0) {
|
||||
printf("Pos and no left node, abort!\n");
|
||||
exit(1);
|
||||
}
|
||||
return BSPFindNode(tree, tree[node_number-1].left,
|
||||
x, y, z);
|
||||
}
|
||||
|
||||
if(tree[node_number-1].right==0) {
|
||||
printf("Neg and no right node, abort!\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
return BSPFindNode(tree, tree[node_number-1].right,
|
||||
x, y, z);
|
||||
|
||||
}
|
||||
|
||||
|
||||
long BSPMarkRegion(BSP_Node *tree, long node_number, long region, int region_type) {
|
||||
//printf("Find Region %ld in node %ld\n", region, node_number);
|
||||
if(node_number<1) {
|
||||
printf("Something went wrong\n");
|
||||
exit(1);
|
||||
}
|
||||
if((tree[node_number-1].left==0)&&
|
||||
(tree[node_number-1].right==0)) {
|
||||
if(tree[node_number-1].region==region) {
|
||||
tree[node_number-1].special=region_type;
|
||||
return node_number;
|
||||
}
|
||||
}
|
||||
|
||||
long retnode ;
|
||||
if(tree[node_number-1].left!=0) {
|
||||
retnode = BSPMarkRegion(tree, tree[node_number-1].left, region, region_type);
|
||||
if(retnode != 0) return retnode ;
|
||||
}
|
||||
|
||||
if(tree[node_number-1].right!=0) {
|
||||
return BSPMarkRegion(tree, tree[node_number-1].right, region, region_type);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
typedef enum {
|
||||
RegionTypeUnsupported = -2,
|
||||
RegionTypeUntagged = -1,
|
||||
RegionTypeNormal = 0,
|
||||
RegionTypeWater = 1,
|
||||
RegionTypeLava = 2,
|
||||
RegionTypeZoneLine = 3,
|
||||
RegionTypePVP = 4,
|
||||
RegionTypeSlime = 5,
|
||||
RegionTypeIce = 6,
|
||||
RegionTypeVWater =7
|
||||
|
||||
|
||||
} WaterRegionType;
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,200 @@
|
||||
#ifndef AZONE_H
|
||||
#define AZONE_H
|
||||
|
||||
//pull in datatypes from zone's map.h
|
||||
#include "../../zone/map.h"
|
||||
#include "file_loader.hpp"
|
||||
|
||||
/*
|
||||
|
||||
Father Nitwit's zone to map file converter.
|
||||
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
using namespace std;
|
||||
|
||||
|
||||
#define COUNT_MACTHES 1
|
||||
|
||||
//this is the version number to put in the map header
|
||||
#undef MAP_VERSION //override this from map.h with our version
|
||||
#define MAP_VERSION 0x01000000
|
||||
|
||||
//quadtree stopping criteria, comment any to disable them
|
||||
#define MAX_QUADRENT_FACES 50 //if box has fewer than this, stop
|
||||
#define MIN_QUADRENT_SIZE 100.0f //if box has a dimention smaller than this, stop
|
||||
#define MIN_QUADRENT_GAIN 0.3f //minimum split ratio before stopping
|
||||
#define MAX_QUADRENT_MISSES 2 //maximum number of quads which can miss their gains
|
||||
//1 or 2 make sense, others are less useful
|
||||
|
||||
//attepmt to trim the data a little
|
||||
#define MAX_Z 3000.0 //seems to be a lot of points above this
|
||||
//if all points on poly are, kill it.
|
||||
/*
|
||||
This is used for the recursive node structure
|
||||
unsigned shorts are adequate because, worst case
|
||||
even in a zone that is 6000x6000 with a small node
|
||||
size of 30x30, there are only 40000 nodes.
|
||||
|
||||
quadrent definitions:
|
||||
quad 1 (nodes[0]):
|
||||
x>=0, y>=0
|
||||
quad 2 (nodes[1]):
|
||||
x<0, y>=0
|
||||
quad 3 (nodes[2]):
|
||||
x<0, y<0
|
||||
quad 4 (nodes[3]):
|
||||
x>=0, y<0
|
||||
|
||||
*/
|
||||
#define MAX_POLY_VTX 24 //arbitrary, im too lazy to figure it out
|
||||
//cut a triangle at most 6 times....
|
||||
|
||||
enum EQFileType { S3D, EQG, UNKNOWN };
|
||||
|
||||
struct POLYGON {
|
||||
VERTEX /*w[MAX_POLY_VTX], */c[MAX_POLY_VTX];
|
||||
int count; // w is world points, c is for camera points
|
||||
};
|
||||
|
||||
class GPoint {
|
||||
public:
|
||||
GPoint();
|
||||
GPoint(VERTEX &v);
|
||||
GPoint(float x, float y, float z);
|
||||
|
||||
inline void operator()(float nx, float ny, float nz) { x = nx; y = ny; z = nz; }
|
||||
|
||||
GPoint cross(const GPoint &them) const;
|
||||
float dot3(const GPoint &them) const;
|
||||
|
||||
float x;
|
||||
float y;
|
||||
float z;
|
||||
|
||||
};
|
||||
GPoint operator-(const GPoint &v1, const GPoint &v2);
|
||||
|
||||
class GVector : public GPoint {
|
||||
public:
|
||||
GVector();
|
||||
GVector(const GPoint &them);
|
||||
GVector(float x, float y, float z, float w = 1.0f);
|
||||
|
||||
inline void operator()(float nx, float ny, float nz, float nw) { x = nx; y = ny; z = nz; W = nw; }
|
||||
float dot4(const GVector &them) const;
|
||||
float dot4(const GPoint &them) const;
|
||||
void normalize();
|
||||
float length();
|
||||
|
||||
float W;
|
||||
};
|
||||
|
||||
struct FaceRecord {
|
||||
FACE *face;
|
||||
unsigned long index;
|
||||
};
|
||||
|
||||
class QTNode;
|
||||
|
||||
class QTBuilder {
|
||||
public:
|
||||
QTBuilder();
|
||||
~QTBuilder();
|
||||
|
||||
bool build(const char *shortname);
|
||||
bool build_eqg(const char *shortname);
|
||||
void AddPlaceable(FileLoader *fileloader, char *ZoneFileName, bool ListPlaceable=false);
|
||||
void AddPlaceableV4(FileLoader *fileloader, char *ZoneFileName, bool ListPlaceable=false);
|
||||
void RotateVertex(VERTEX &v, float XRotation, float YRotation, float ZRotation);
|
||||
void ScaleVertex(VERTEX &v, float XScale, float YScale, float ZScale);
|
||||
void TranslateVertex(VERTEX &v, float XOffset, float YOffset, float ZOffset);
|
||||
bool writeMap(const char *file);
|
||||
|
||||
bool FaceInNode(const QTNode *q, const FACE *f);
|
||||
protected:
|
||||
|
||||
void AddFace(VERTEX &v1, VERTEX &v2, VERTEX &v3);
|
||||
|
||||
int ClipPolygon(POLYGON *poly, GVector *plane);
|
||||
|
||||
//dynamic during load
|
||||
// vector<VERTEX> _VertexList;
|
||||
vector<FACE> _FaceList;
|
||||
|
||||
//static once loaded
|
||||
// unsigned long vertexCount;
|
||||
unsigned long faceCount;
|
||||
// VERTEX * vertexBlock;
|
||||
FACE * faceBlock;
|
||||
|
||||
VERTEX tempvtx[MAX_POLY_VTX];
|
||||
|
||||
QTNode *_root;
|
||||
|
||||
static void NormalizeN(FACE *p);
|
||||
|
||||
#ifdef COUNT_MACTHES
|
||||
unsigned long gEasyMatches;
|
||||
unsigned long gEasyExcludes;
|
||||
unsigned long gHardMatches;
|
||||
unsigned long gHardExcludes;
|
||||
#endif
|
||||
|
||||
};
|
||||
|
||||
//quadtree node container
|
||||
class QTNode {
|
||||
public:
|
||||
QTNode(QTBuilder *builder, float Tminx, float Tmaxx, float Tminy, float Tmaxy);
|
||||
~QTNode();
|
||||
|
||||
void clearNodes();
|
||||
|
||||
void doSplit();
|
||||
void divideYourself(int depth);
|
||||
|
||||
void buildVertexes();
|
||||
|
||||
// bool writeFile(FILE *out);
|
||||
|
||||
unsigned long countNodes() const;
|
||||
unsigned long countFacelists() const;
|
||||
|
||||
void fillBlocks(nodeHeader *heads, unsigned long *flist, unsigned long &hindex, unsigned long &findex);
|
||||
|
||||
float minx;
|
||||
float miny;
|
||||
float maxx;
|
||||
float maxy;
|
||||
unsigned long nfaces;
|
||||
vector<FaceRecord> faces;
|
||||
|
||||
/*
|
||||
quadrent definitions:
|
||||
quad 1 (node1):
|
||||
x>=0, y>=0
|
||||
quad 2 (node2):
|
||||
x<0, y>=0
|
||||
quad 3 (node3):
|
||||
x<0, y<0
|
||||
quad 4 (node4):
|
||||
x>=0, y<0
|
||||
*/
|
||||
QTNode *node1;
|
||||
QTNode *node2;
|
||||
QTNode *node3;
|
||||
QTNode *node4;
|
||||
GPoint v[8];
|
||||
bool final;
|
||||
|
||||
protected:
|
||||
QTBuilder *builder;
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
# Include huts, houses dock and bridge from tox
|
||||
tox.s3d,7,17,20,26
|
||||
# Include two bridges from Tutorialb
|
||||
tutorialb.eqg,17,47
|
||||
# Include prison, ramp and a couple of towers in Anguish
|
||||
anguish.eqg,5,7,8,119
|
||||
# Include ruined buildings in LOIO
|
||||
lakeofillomen.s3d,49,50,51,52,53,54,55,56,57
|
||||
# Include bridges in thundercrest
|
||||
thundercrest.eqg,14,51
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user