diff --git a/changelog.txt b/changelog.txt
index 071d940b4..5a91b9e74 100644
--- a/changelog.txt
+++ b/changelog.txt
@@ -1,5 +1,8 @@
EQEMu Changelog (Started on Sept 24, 2003 15:50)
-------------------------------------------------------
+== 03/15/2013 ==
+Derision: RoF: Added ENCODE for Resurrect_struct (Accepting a rez should now work).
+Derision: Fixed a couple of memory leaks in Rez code.
== 03/14/2013 ==
JJ: (NatedogEZ) Fix for hate list random never selecting last member of hate list.
diff --git a/common/patches/RoF.cpp b/common/patches/RoF.cpp
index 97cfd927a..0f5bcaa3f 100644
--- a/common/patches/RoF.cpp
+++ b/common/patches/RoF.cpp
@@ -3987,6 +3987,24 @@ ENCODE(OP_BeginCast)
FINISH_ENCODE();
}
+ENCODE(OP_RezzRequest)
+{
+ SETUP_DIRECT_ENCODE(Resurrect_Struct, structs::Resurrect_Struct);
+
+ OUT(zone_id);
+ OUT(instance_id);
+ OUT(y);
+ OUT(x);
+ OUT(z);
+ OUT_str(your_name);
+ OUT_str(rezzer_name);
+ OUT(spellid);
+ OUT_str(corpse_name);
+ OUT(action);
+
+ FINISH_ENCODE();
+}
+
DECODE(OP_BuffRemoveRequest)
{
// This is to cater for the fact that short buff box buffs start at 30 as opposed to 25 in prior clients.
@@ -4777,6 +4795,25 @@ DECODE(OP_GuildStatus)
FINISH_DIRECT_DECODE();
}
+DECODE(OP_RezzAnswer)
+{
+ DECODE_LENGTH_EXACT(structs::Resurrect_Struct);
+ SETUP_DIRECT_DECODE(Resurrect_Struct, structs::Resurrect_Struct);
+
+ IN(zone_id);
+ IN(instance_id);
+ IN(y);
+ IN(x);
+ IN(z);
+ memcpy(emu->your_name, eq->your_name, sizeof(emu->your_name));
+ memcpy(emu->rezzer_name, eq->rezzer_name, sizeof(emu->rezzer_name));
+ IN(spellid);
+ memcpy(emu->corpse_name, eq->corpse_name, sizeof(emu->corpse_name));
+ IN(action);
+
+ FINISH_DIRECT_DECODE();
+}
+
uint32 NextItemInstSerialNumber = 1;
uint32 MaxInstances = 2000000000;
diff --git a/common/patches/RoF_ops.h b/common/patches/RoF_ops.h
index 159607a72..9e3a91c7e 100644
--- a/common/patches/RoF_ops.h
+++ b/common/patches/RoF_ops.h
@@ -100,6 +100,7 @@ E(OP_MercenaryDataResponse)
E(OP_GuildMemberUpdate)
E(OP_GMLastName)
E(OP_BeginCast)
+E(OP_RezzRequest)
//list of packets we need to decode on the way in:
D(OP_SetServerFilter)
D(OP_CharacterCreate)
@@ -156,5 +157,6 @@ D(OP_GuildRemove)
D(OP_GuildStatus)
D(OP_Trader)
D(OP_GMLastName)
+D(OP_RezzAnswer)
#undef E
#undef D
diff --git a/common/patches/RoF_structs.h b/common/patches/RoF_structs.h
index df428ffdf..f3565d2ce 100644
--- a/common/patches/RoF_structs.h
+++ b/common/patches/RoF_structs.h
@@ -2792,20 +2792,23 @@ struct Underworld_Struct {
float z;
};
-struct Resurrect_Struct {
- uint32 unknown00;
- uint16 zone_id;
- uint16 instance_id;
- float y;
- float x;
- float z;
- char your_name[64];
- uint32 unknown88;
- char rezzer_name[64];
- uint32 spellid;
- char corpse_name[64];
- uint32 action;
-/* 228 */
+struct Resurrect_Struct
+{
+/*000*/ uint32 unknown000;
+/*004*/ uint16 zone_id;
+/*006*/ uint16 instance_id;
+/*008*/ float y;
+/*012*/ float x;
+/*016*/ float z;
+/*020*/ uint32 unknown020;
+/*024*/ char your_name[64];
+/*088*/ uint32 unknown088;
+/*092*/ char rezzer_name[64];
+/*156*/ uint32 spellid;
+/*160*/ char corpse_name[64];
+/*224*/ uint32 action;
+/*228*/ uint32 unknown228;
+/*232*/
};
struct SetRunMode_Struct {
diff --git a/utils/EQExtractor2/.gitignore b/utils/EQExtractor2/.gitignore
new file mode 100644
index 000000000..bacb2196c
--- /dev/null
+++ b/utils/EQExtractor2/.gitignore
@@ -0,0 +1,39 @@
+# Object files
+*.o
+*.obj
+
+# Libraries
+*.lib
+*.a
+
+# Shared objects
+*.so
+*.so.*
+*.dylib
+
+# Executables
+*.exe
+*.out
+*.app
+
+# CMake
+CMakeCache.txt
+CMakeFiles
+Makefile
+cmake_install.cmake
+install_manifest.txt
+Build/
+build/
+Build32/
+build32/
+Build64/
+build64/
+Build_32/
+build_32/
+Build_64/
+build_64/
+log/
+logs/
+bin/
+obj/
+*.suo
diff --git a/utils/EQExtractor2/EQExtractor2/ChangeLog.txt b/utils/EQExtractor2/EQExtractor2/ChangeLog.txt
index bafe7d8d5..5a9813b76 100644
--- a/utils/EQExtractor2/EQExtractor2/ChangeLog.txt
+++ b/utils/EQExtractor2/EQExtractor2/ChangeLog.txt
@@ -1,5 +1,8 @@
EQExtractor2 Changelog. All changes since the 1.0 release.
+==03/16/2013==
+Derision: Added decoder to support packet dumps from current Live client. SQL generation NOT SUPPORTED YET.
+
==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.
diff --git a/utils/EQExtractor2/EQExtractor2/EQApplicationLayer.cs b/utils/EQExtractor2/EQExtractor2/EQApplicationLayer.cs
index a3c9a898f..b6732ca82 100644
--- a/utils/EQExtractor2/EQExtractor2/EQApplicationLayer.cs
+++ b/utils/EQExtractor2/EQExtractor2/EQApplicationLayer.cs
@@ -102,6 +102,8 @@ namespace EQApplicationLayer
PatchList.Add(new PatchTestServerFebruary52013Decoder());
PatchList.Add(new PatchFebruary112013Decoder());
+
+ PatchList.Add(new PatchMarch132013Decoder());
PatchList.Add(new PatchSoD());
diff --git a/utils/EQExtractor2/EQExtractor2/EQExtractor2.csproj b/utils/EQExtractor2/EQExtractor2/EQExtractor2.csproj
index 8266329f1..6e56a9c58 100644
--- a/utils/EQExtractor2/EQExtractor2/EQExtractor2.csproj
+++ b/utils/EQExtractor2/EQExtractor2/EQExtractor2.csproj
@@ -92,6 +92,7 @@
+
@@ -163,6 +164,9 @@
Always
+
+ Always
+
Always
diff --git a/utils/EQExtractor2/EQExtractor2/EQExtractor2Form1.cs b/utils/EQExtractor2/EQExtractor2/EQExtractor2Form1.cs
index 33f6d9645..c2f2edeb8 100644
--- a/utils/EQExtractor2/EQExtractor2/EQExtractor2Form1.cs
+++ b/utils/EQExtractor2/EQExtractor2/EQExtractor2Form1.cs
@@ -18,7 +18,7 @@ namespace EQExtractor2
{
public partial class EQExtractor2Form1 : Form
{
- string Version = "EQExtractor2 Version 2.6.0 SVN";
+ string Version = "EQExtractor2 Version 2.6.1 SVN";
static int PacketsSeen = 0;
static long BytesRead = 0;
diff --git a/utils/EQExtractor2/EQExtractor2/PacketDotNet.dll b/utils/EQExtractor2/EQExtractor2/PacketDotNet.dll
new file mode 100644
index 000000000..560b03fee
Binary files /dev/null and b/utils/EQExtractor2/EQExtractor2/PacketDotNet.dll differ
diff --git a/utils/EQExtractor2/EQExtractor2/PatchDecember10-2012.cs b/utils/EQExtractor2/EQExtractor2/PatchDecember10-2012.cs
index 4d36525f4..4b9c29479 100644
--- a/utils/EQExtractor2/EQExtractor2/PatchDecember10-2012.cs
+++ b/utils/EQExtractor2/EQExtractor2/PatchDecember10-2012.cs
@@ -546,7 +546,10 @@ namespace EQExtractor2.Patches
public void DecodeItemPacket(StreamWriter OutputStream, ByteStream Buffer, PacketDirection Direction)
{
String UnkString = Buffer.ReadString(false);
- Buffer.SkipBytes(88);
+ //Buffer.SkipBytes(88);
+ Buffer.SkipBytes(35);
+ UInt32 RecastTimer = Buffer.ReadUInt32();
+ Buffer.SkipBytes(49);
String ItemName = Buffer.ReadString(false);
String ItemLore = Buffer.ReadString(false);
String ItemIDFile = Buffer.ReadString(false);
@@ -554,6 +557,7 @@ namespace EQExtractor2.Patches
UInt32 ItemID = Buffer.ReadUInt32();
OutputStream.WriteLine("ItemName: {0}, IDFile: {1}", ItemName, ItemIDFile);
+ OutputStream.WriteLine("Recast Time: {0:X}", RecastTimer);
Buffer.SkipBytes(251);
diff --git a/utils/EQExtractor2/EQExtractor2/PatchFebruary11-2013.cs b/utils/EQExtractor2/EQExtractor2/PatchFebruary11-2013.cs
index b3213b6ff..2464e6f2d 100644
--- a/utils/EQExtractor2/EQExtractor2/PatchFebruary11-2013.cs
+++ b/utils/EQExtractor2/EQExtractor2/PatchFebruary11-2013.cs
@@ -17,7 +17,759 @@ namespace EQExtractor2.Patches
PatchConfFileName = "patch_Feb11-2013.conf";
+ PacketsToMatch = new PacketToMatch[] {
+ new PacketToMatch { OPCodeName = "OP_ZoneEntry", Direction = PacketDirection.ClientToServer, RequiredSize = 76, VersionMatched = false },
+ new PacketToMatch { OPCodeName = "OP_PlayerProfile", Direction = PacketDirection.ServerToClient, RequiredSize = -1, VersionMatched = true },
+ };
+
SupportsSQLGeneration = false;
- }
+ }
+
+ public override void RegisterExplorers()
+ {
+ //OpManager.RegisterExplorer("OP_PlayerProfile", ExplorePlayerProfile);
+ //OpManager.RegisterExplorer("OP_CharInventory", ExploreInventory);
+ }
+
+ public void DecodeItemPacket(StreamWriter OutputStream, ByteStream Buffer, PacketDirection Direction)
+ {
+ String UnkString = Buffer.ReadString(false);
+ //Buffer.SkipBytes(88);
+ Buffer.SkipBytes(35);
+ UInt32 RecastTimer = Buffer.ReadUInt32();
+ Buffer.SkipBytes(49);
+ String ItemName = Buffer.ReadString(false);
+ String ItemLore = Buffer.ReadString(false);
+ String ItemIDFile = Buffer.ReadString(false);
+ Buffer.ReadString(false);
+
+ UInt32 ItemID = Buffer.ReadUInt32();
+ OutputStream.WriteLine("ItemName: {0}, IDFile: {1}", ItemName, ItemIDFile);
+ OutputStream.WriteLine("Recast Time: {0:X}", RecastTimer);
+ Buffer.SkipBytes(251);
+
+ String CharmFile = Buffer.ReadString(false);
+
+ OutputStream.WriteLine("CharmFile: {0}", CharmFile);
+
+ Buffer.SkipBytes(74); // Secondary BS
+
+ String FileName = Buffer.ReadString(false);
+ OutputStream.WriteLine("FileName: {0}", CharmFile);
+
+ Buffer.SkipBytes(76); // Tertiary BS
+
+ UInt32 ClickEffect = Buffer.ReadUInt32();
+ //Buffer.SkipBytes(26); // ClickEffect Struct
+ //OutputStream.WriteLine("Click Effect - effect : {0}", Buffer.ReadUInt32());
+ OutputStream.WriteLine("Click Effect - level2 : {0}", Buffer.ReadByte());
+ OutputStream.WriteLine("Click Effect - Type : {0}", Buffer.ReadUInt32());
+ OutputStream.WriteLine("Click Effect - level : {0}", Buffer.ReadByte());
+ OutputStream.WriteLine("Click Effect - Max Charges : {0}", Buffer.ReadUInt32());
+ OutputStream.WriteLine("Click Effect - Cast Time : {0}", Buffer.ReadUInt32());
+ OutputStream.WriteLine("Click Effect - Recast : {0}", Buffer.ReadUInt32());
+ OutputStream.WriteLine("Click Effect - Recast Type: {0}", Buffer.ReadUInt32());
+ OutputStream.WriteLine("Click Effect - Unk5: {0}", Buffer.ReadUInt32());
+ String ClickName = Buffer.ReadString(false);
+ OutputStream.WriteLine("ClickEffect = {0}, ClickName = {1}", ClickEffect, ClickName);
+ Buffer.ReadUInt32();
+
+ ClickEffect = Buffer.ReadUInt32();
+ Buffer.SkipBytes(26); // ClickEffect Struct
+ ClickName = Buffer.ReadString(false);
+ OutputStream.WriteLine("ClickEffect = {0}, ClickName = {1}", ClickEffect, ClickName);
+ Buffer.ReadUInt32();
+
+ ClickEffect = Buffer.ReadUInt32();
+ Buffer.SkipBytes(26); // ClickEffect Struct
+ ClickName = Buffer.ReadString(false);
+ OutputStream.WriteLine("ClickEffect = {0}, ClickName = {1}", ClickEffect, ClickName);
+ Buffer.ReadUInt32();
+
+ ClickEffect = Buffer.ReadUInt32();
+ Buffer.SkipBytes(26); // ClickEffect Struct
+ ClickName = Buffer.ReadString(false);
+ OutputStream.WriteLine("ClickEffect = {0}, ClickName = {1}", ClickEffect, ClickName);
+ Buffer.ReadUInt32();
+
+ ClickEffect = Buffer.ReadUInt32();
+ Buffer.SkipBytes(26); // ClickEffect Struct
+ ClickName = Buffer.ReadString(false);
+ OutputStream.WriteLine("ClickEffect = {0}, ClickName = {1}", ClickEffect, ClickName);
+ Buffer.ReadUInt32();
+
+ ClickEffect = Buffer.ReadUInt32();
+ Buffer.SkipBytes(26); // ClickEffect Struct
+ ClickName = Buffer.ReadString(false);
+ OutputStream.WriteLine("ClickEffect = {0}, ClickName = {1}", ClickEffect, ClickName);
+ Buffer.ReadUInt32();
+
+ //Buffer.SkipBytes(167);
+ Buffer.SkipBytes(125);
+ //Byte UnkByte = Buffer.ReadByte();
+ //OutputStream.WriteLine("Unk byte is {0:X}", UnkByte);
+ OutputStream.WriteLine("At String ? Pos is {0}", Buffer.GetPosition());
+ UnkString = Buffer.ReadString(false);
+ OutputStream.WriteLine("Unk String is {0}", UnkString);
+ Buffer.SkipBytes(41);
+ UInt32 SubItemCount = Buffer.ReadUInt32();
+
+ OutputStream.WriteLine("Buffer Pos: {0}, SubItemCount = {1}", Buffer.GetPosition(), SubItemCount);
+
+ for (int j = 0; j < SubItemCount; ++j)
+ {
+ Buffer.ReadUInt32();
+ DecodeItemPacket(OutputStream, Buffer, Direction);
+ }
+
+
+ }
+
+
+ public void ExploreInventory(StreamWriter OutputStream, ByteStream Buffer, PacketDirection Direction)
+ {
+ if (Buffer.Length() < 4)
+ return;
+
+ UInt32 Count = Buffer.ReadUInt32();
+
+ for (int i = 0; i < Count; ++i)
+ {
+ try
+ {
+ DecodeItemPacket(OutputStream, Buffer, Direction);
+ }
+ catch
+ {
+ return;
+ }
+ }
+ }
+ public void ExplorePlayerProfile(StreamWriter OutputStream, ByteStream Buffer, PacketDirection Direction)
+ {
+ OutputStream.WriteLine("{0, -5}: Checksum = {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: ChecksumSize = {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown = {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown = {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+
+ OutputStream.WriteLine("");
+ OutputStream.WriteLine("{0, -5}: Gender = {1}", Buffer.GetPosition(), Buffer.ReadByte());
+ OutputStream.WriteLine("{0, -5}: Race = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Class = {1}", Buffer.GetPosition(), Buffer.ReadByte());
+ OutputStream.WriteLine("{0, -5}: Level = {1}", Buffer.GetPosition(), Buffer.ReadByte());
+ OutputStream.WriteLine("{0, -5}: Level1 = {1}", Buffer.GetPosition(), Buffer.ReadByte());
+
+ OutputStream.WriteLine("");
+ UInt32 BindCount = Buffer.ReadUInt32();
+ OutputStream.WriteLine("{0, -5}: BindCount = {1}", Buffer.GetPosition() - 4, BindCount);
+
+ for (int i = 0; i < BindCount; ++i)
+ {
+ OutputStream.WriteLine("{0, -5}: Bind: {1} Zone: {2} XYZ: {3},{4},{5} Heading: {6}",
+ Buffer.GetPosition(), i, Buffer.ReadUInt32(), Buffer.ReadSingle(), Buffer.ReadSingle(), Buffer.ReadSingle(), Buffer.ReadSingle());
+ }
+
+ OutputStream.WriteLine("");
+ OutputStream.WriteLine("{0, -5}: Deity = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Intoxication = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("");
+
+ //Buffer.SkipBytes(8); // Deity, intoxication
+
+ UInt32 UnknownCount = Buffer.ReadUInt32();
+
+ OutputStream.WriteLine("{0, -5}: Unknown Count = {1}", Buffer.GetPosition() - 4, UnknownCount);
+
+
+
+ for (int i = 0; i < UnknownCount; ++i)
+ {
+ OutputStream.WriteLine("{0, -5}: Unknown : {1}, Value = {2}", Buffer.GetPosition(), i, Buffer.ReadUInt32());
+ //Buffer.SkipBytes(4);
+ }
+
+ UInt32 EquipmentCount = Buffer.ReadUInt32();
+
+ OutputStream.WriteLine("{0, -5}: EquipmentCount = {1}", Buffer.GetPosition() - 4, EquipmentCount);
+
+ for (int i = 0; i < EquipmentCount; ++i)
+ {
+ OutputStream.Write("{0, -5}: Equip: {1} Values: ", Buffer.GetPosition(), i);
+ for (int j = 0; j < 5; ++j)
+ OutputStream.Write("{0} ", Buffer.ReadUInt32());
+
+ OutputStream.WriteLine("");
+ //Buffer.SkipBytes(20);
+ }
+
+ UInt32 EquipmentCount2 = Buffer.ReadUInt32();
+
+ OutputStream.WriteLine("{0, -5}: EquipmentCount2 = {1}", Buffer.GetPosition() - 4, EquipmentCount2);
+
+ for (int i = 0; i < EquipmentCount2; ++i)
+ {
+ OutputStream.Write("{0, -5}: Equip2: {1} Values: ", Buffer.GetPosition(), i);
+ for (int j = 0; j < 5; ++j)
+ OutputStream.Write("{0} ", Buffer.ReadUInt32());
+
+ OutputStream.WriteLine("");
+ //Buffer.SkipBytes(20);
+ }
+
+
+
+ UInt32 TintCount = Buffer.ReadUInt32();
+
+ OutputStream.WriteLine("{0, -5}: TintCount = {1}", Buffer.GetPosition() - 4, TintCount);
+
+ for (int i = 0; i < TintCount; ++i)
+ {
+ OutputStream.WriteLine("{0, -5}: TintCount : {1}, Value = {2}", Buffer.GetPosition(), i, Buffer.ReadUInt32());
+ //Buffer.SkipBytes(4);
+ }
+
+ UInt32 TintCount2 = Buffer.ReadUInt32();
+
+ OutputStream.WriteLine("{0, -5}: TintCount2 = {1}", Buffer.GetPosition() - 4, TintCount2);
+
+ for (int i = 0; i < TintCount; ++i)
+ {
+ OutputStream.WriteLine("{0, -5}: TintCount2 : {1}, Value = {2}", Buffer.GetPosition(), i, Buffer.ReadUInt32());
+ //Buffer.SkipBytes(4);
+ }
+
+ OutputStream.WriteLine("{0, -5}: Hair Color = {1}", Buffer.GetPosition(), Buffer.ReadByte());
+ OutputStream.WriteLine("{0, -5}: Beard Color = {1}", Buffer.GetPosition(), Buffer.ReadByte());
+ OutputStream.WriteLine("{0, -5}: Unknown = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Eye1 Color = {1}", Buffer.GetPosition(), Buffer.ReadByte());
+ OutputStream.WriteLine("{0, -5}: Eye2 Color = {1}", Buffer.GetPosition(), Buffer.ReadByte());
+ OutputStream.WriteLine("{0, -5}: Hairstyle = {1}", Buffer.GetPosition(), Buffer.ReadByte());
+ OutputStream.WriteLine("{0, -5}: Beard = {1}", Buffer.GetPosition(), Buffer.ReadByte());
+ OutputStream.WriteLine("{0, -5}: Face = {1}", Buffer.GetPosition(), Buffer.ReadByte());
+ OutputStream.WriteLine("{0, -5}: Drakkin Heritage = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Drakkin Tattoo = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Drakkin Details = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+
+ OutputStream.WriteLine("{0, -5}: Unknown = {1}", Buffer.GetPosition(), Buffer.ReadByte());
+ OutputStream.WriteLine("{0, -5}: Unknown = {1}", Buffer.GetPosition(), Buffer.ReadByte());
+ OutputStream.WriteLine("{0, -5}: Unknown = {1}", Buffer.GetPosition(), Buffer.ReadByte());
+ OutputStream.WriteLine("{0, -5}: Unknown = {1}", Buffer.GetPosition(), Buffer.ReadByte());
+ OutputStream.WriteLine("{0, -5}: Unknown = {1}", Buffer.GetPosition(), Buffer.ReadByte());
+ OutputStream.WriteLine("{0, -5}: Height = {1}", Buffer.GetPosition(), Buffer.ReadSingle());
+ OutputStream.WriteLine("{0, -5}: Unknown = {1}", Buffer.GetPosition(), Buffer.ReadSingle());
+ OutputStream.WriteLine("{0, -5}: Unknown = {1}", Buffer.GetPosition(), Buffer.ReadSingle());
+ OutputStream.WriteLine("{0, -5}: Unknown = {1}", Buffer.GetPosition(), Buffer.ReadSingle());
+ OutputStream.WriteLine("{0, -5}: Primary = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Secondary = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+
+
+
+ //Buffer.SkipBytes(52); // Per SEQ, this looks like face, haircolor, beardcolor etc.
+ OutputStream.WriteLine("{0, -5}: Unspent Skill Points = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Mana = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Current HP = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ //UInt32 Points = Buffer.ReadUInt32();
+ //UInt32 Mana = Buffer.ReadUInt32();
+ //UInt32 CurHP = Buffer.ReadUInt32();
+
+ //OutputStream.WriteLine("Points, Mana, CurHP = {0}, {1}, {2}", Points, Mana, CurHP);
+
+ OutputStream.WriteLine("{0, -5}: STR = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: STA = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: CHA = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: DEX = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: INT = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: AGI = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: WIS = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+
+ OutputStream.WriteLine("{0, -5}: Unknown = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+
+ //Buffer.SkipBytes(28);
+ //Buffer.SkipBytes(28);
+
+ UInt32 AACount = Buffer.ReadUInt32();
+
+ OutputStream.WriteLine("{0, -5}: AA Count = {1}", Buffer.GetPosition() - 4, AACount);
+
+
+ for (int i = 0; i < AACount; ++i)
+ {
+ OutputStream.WriteLine(" AA: {0}, Value: {1}, Unknown08: {2}", Buffer.ReadUInt32(), Buffer.ReadUInt32(), Buffer.ReadUInt32());
+ //Buffer.SkipBytes(12);
+ }
+
+ UInt32 SkillCount = Buffer.ReadUInt32();
+
+ OutputStream.WriteLine("{0, -5}: Skill Count = {1}", Buffer.GetPosition() - 4, SkillCount);
+
+ for (int i = 0; i < SkillCount; ++i)
+ {
+ Buffer.SkipBytes(4);
+ }
+
+ UInt32 SomethingCount = Buffer.ReadUInt32();
+
+ OutputStream.WriteLine("{0, -5}: Something Count = {1}", Buffer.GetPosition() - 4, SomethingCount);
+
+
+ for (int i = 0; i < SomethingCount; ++i)
+ {
+ //Buffer.SkipBytes(4);
+ OutputStream.WriteLine("Something {0} : {1}", i, Buffer.ReadUInt32());
+ }
+
+ UInt32 DisciplineCount = Buffer.ReadUInt32();
+ OutputStream.WriteLine("{0, -5}: Discipline Count = {1}", Buffer.GetPosition() - 4, DisciplineCount);
+
+ for (int i = 0; i < DisciplineCount; ++i)
+ {
+ Buffer.SkipBytes(4);
+ }
+
+ UInt32 TimeStampCount = Buffer.ReadUInt32();
+ OutputStream.WriteLine("{0, -5}: TimeStamp Count = {1}", Buffer.GetPosition() - 4, TimeStampCount);
+
+ for (int i = 0; i < TimeStampCount; ++i)
+ {
+ //Buffer.SkipBytes(4);
+ OutputStream.WriteLine("Timestamp {0} : {1}", i, Buffer.ReadUInt32());
+ }
+
+ System.DateTime dateTime;
+ UInt32 RecastCount = Buffer.ReadUInt32();
+
+ OutputStream.WriteLine("{0, -5}: Recast Count = {1}", Buffer.GetPosition() - 4, RecastCount);
+
+ for (int i = 0; i < RecastCount; ++i)
+ {
+ //Buffer.SkipBytes(4);
+ UInt32 TimeStamp = Buffer.ReadUInt32();
+ dateTime = new System.DateTime(1970, 1, 1, 0, 0, 0, 0);
+ dateTime = dateTime.AddSeconds(TimeStamp);
+ OutputStream.WriteLine("Recast {0} : {1} {2}", i, TimeStamp, dateTime.ToString());
+ }
+
+ UInt32 TimeStamp2Count = Buffer.ReadUInt32();
+ OutputStream.WriteLine("{0, -5}: TimeStamp2 Count = {1}", Buffer.GetPosition() - 4, TimeStamp2Count);
+
+ for (int i = 0; i < TimeStamp2Count; ++i)
+ {
+ //Buffer.SkipBytes(4);
+ UInt32 TimeStamp = Buffer.ReadUInt32();
+ dateTime = new System.DateTime(1970, 1, 1, 0, 0, 0, 0);
+ dateTime = dateTime.AddSeconds(TimeStamp);
+
+ OutputStream.WriteLine("Timestamp {0} : {1} {2}", i, TimeStamp, dateTime.ToString());
+ }
+
+
+ UInt32 SpellBookSlots = Buffer.ReadUInt32();
+
+ OutputStream.WriteLine("{0, -5}: SpellBookSlot Count = {1}", Buffer.GetPosition() - 4, SpellBookSlots);
+
+ for (int i = 0; i < SpellBookSlots; ++i)
+ {
+ Buffer.SkipBytes(4);
+ }
+
+ UInt32 SpellMemSlots = Buffer.ReadUInt32();
+
+ OutputStream.WriteLine("{0, -5}: Spell Mem Count = {1}", Buffer.GetPosition() - 4, SpellMemSlots);
+
+ for (int i = 0; i < SpellMemSlots; ++i)
+ {
+ Buffer.SkipBytes(4);
+ }
+
+ SomethingCount = Buffer.ReadUInt32();
+
+ OutputStream.WriteLine("{0, -5}: Unknown Count = {1}", Buffer.GetPosition() - 4, SomethingCount);
+
+ for (int i = 0; i < SomethingCount; ++i)
+ {
+ //Buffer.SkipBytes(4);
+ OutputStream.WriteLine("Unknown {0} : {1}", i, Buffer.ReadUInt32());
+
+ }
+
+ OutputStream.WriteLine("{0, -5}: Unknown = {1}", Buffer.GetPosition(), Buffer.ReadByte());
+
+ UInt32 BuffCount = Buffer.ReadUInt32();
+
+ OutputStream.WriteLine("{0, -5}: Buff Count = {1}", Buffer.GetPosition() - 4, BuffCount);
+
+ for (int i = 0; i < BuffCount; ++i)
+ {
+ Buffer.ReadByte();
+ float UnkFloat = Buffer.ReadSingle();
+ UInt32 PlayerID = Buffer.ReadUInt32();
+ Byte UnkByte = Buffer.ReadByte();
+ UInt32 Counters1 = Buffer.ReadUInt32();
+ UInt32 Duration = Buffer.ReadUInt32();
+ Byte Level = Buffer.ReadByte();
+ UInt32 SpellID = Buffer.ReadUInt32();
+ UInt32 SlotID = Buffer.ReadUInt32();
+ Buffer.SkipBytes(5);
+ UInt32 Counters2 = Buffer.ReadUInt32();
+ OutputStream.WriteLine("Sl: {0}, UF: {1}, PID: {2}, UByte: {3}, Cnt1: {4}, Dur: {5}, Lvl: {6} SpellID: {7}, SlotID: {8}, Cnt2: {9}",
+ i, UnkFloat, PlayerID, UnkByte, Counters1, Duration, Level, SpellID, SlotID, Counters2);
+ Buffer.SkipBytes(44);
+ }
+
+ OutputStream.WriteLine("{0, -5}: Plat = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Gold = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Silver = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Copper = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+
+ OutputStream.WriteLine("{0, -5}: Plat Cursor = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Gold Cursor = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Silver Cursor = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Copper Cursor = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+
+ OutputStream.WriteLine("{0, -5}: Unknown = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Toxicity? = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Thirst? = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Hunger? = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+
+ //Buffer.SkipBytes(20);
+
+ OutputStream.WriteLine("{0, -5}: AA Spent = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+
+ OutputStream.WriteLine("{0, -5}: AA Point Count? = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+
+ OutputStream.WriteLine("{0, -5}: AA Assigned = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: AA Spent General = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: AA Spent Archetype = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: AA Spent Class = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: AA Spent Special = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: AA Unspent = {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown", Buffer.GetPosition(), Buffer.ReadUInt16());
+
+
+ //Buffer.SkipBytes(30);
+
+ UInt32 BandolierCount = Buffer.ReadUInt32();
+
+ OutputStream.WriteLine("{0, -5}: Bandolier Count = {1}", Buffer.GetPosition() - 4, BandolierCount);
+
+ for (int i = 0; i < BandolierCount; ++i)
+ {
+ Buffer.ReadString(false);
+
+ Buffer.ReadString(false);
+ Buffer.SkipBytes(8);
+
+ Buffer.ReadString(false);
+ Buffer.SkipBytes(8);
+
+ Buffer.ReadString(false);
+ Buffer.SkipBytes(8);
+
+ Buffer.ReadString(false);
+ Buffer.SkipBytes(8);
+ }
+
+ UInt32 PotionCount = Buffer.ReadUInt32();
+
+ OutputStream.WriteLine("{0, -5}: Potion Count = {1}", Buffer.GetPosition() - 4, PotionCount);
+
+ for (int i = 0; i < PotionCount; ++i)
+ {
+ Buffer.ReadString(false);
+ Buffer.SkipBytes(8);
+ }
+
+ OutputStream.WriteLine("{0, -5}: Unknown {1}", Buffer.GetPosition(), Buffer.ReadInt32());
+ OutputStream.WriteLine("{0, -5}: Item HP Total? {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Endurance Total? {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Mana Total? {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+
+ OutputStream.WriteLine("{0, -5}: Unknown {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+
+ OutputStream.WriteLine("{0, -5}: Expansion Count {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+
+ UInt32 NameLength = Buffer.ReadUInt32();
+ OutputStream.WriteLine("{0, -5}: Name Length: {1}", Buffer.GetPosition() - 4, NameLength);
+
+ int CurrentPosition = Buffer.GetPosition();
+ OutputStream.WriteLine("{0, -5}: Name: {1}", Buffer.GetPosition(), Buffer.ReadString(false));
+
+ Buffer.SetPosition(CurrentPosition + (int)NameLength);
+
+ UInt32 LastNameLength = Buffer.ReadUInt32();
+ OutputStream.WriteLine("{0, -5}: LastName Length: {1}", Buffer.GetPosition() - 4, LastNameLength);
+
+ CurrentPosition = Buffer.GetPosition();
+ OutputStream.WriteLine("{0, -5}: Last Name: {1}", Buffer.GetPosition(), Buffer.ReadString(false));
+
+ Buffer.SetPosition(CurrentPosition + (int)LastNameLength);
+
+ OutputStream.WriteLine("{0, -5}: Birthday {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Account Start Date {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Last Login Date {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Time Played Minutes {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Time Entitled On Account {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Expansions {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+
+ UInt32 LanguageCount = Buffer.ReadUInt32();
+
+ OutputStream.WriteLine("{0, -5}: Language Count = {1}", Buffer.GetPosition() - 4, LanguageCount);
+
+ for (int i = 0; i < LanguageCount; ++i)
+ {
+ Buffer.SkipBytes(1);
+ }
+
+ OutputStream.WriteLine("{0, -5}: Zone ID {1}", Buffer.GetPosition(), Buffer.ReadUInt16());
+ OutputStream.WriteLine("{0, -5}: Zone Instance {1}", Buffer.GetPosition(), Buffer.ReadUInt16());
+ OutputStream.WriteLine("{0, -5}: Y,X,Z {1},{2},{3} Heading: {4}",
+ Buffer.GetPosition(), Buffer.ReadSingle(), Buffer.ReadSingle(), Buffer.ReadSingle(), Buffer.ReadSingle());
+
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadByte());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadByte());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadByte());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadByte());
+
+ OutputStream.WriteLine("{0, -5}: GuildID? {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadByte());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadByte());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+
+ OutputStream.WriteLine("{0, -5}: Experience {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadByte());
+
+ OutputStream.WriteLine("{0, -5}: Bank Plat {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Bank Gold {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Bank Silver {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Bank Copper {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+
+ UInt32 Unknown42 = Buffer.ReadUInt32();
+ OutputStream.WriteLine("{0, -5}: Unknown, value 42? {1}", Buffer.GetPosition() - 4, Unknown42);
+
+ Buffer.SkipBytes((int)(Unknown42 * 8));
+
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+
+ OutputStream.WriteLine("{0, -5}: Career Tribute Favour {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Current Tribute Favour {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadByte());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadByte());
+
+ UInt32 PersonalTributeCount = Buffer.ReadUInt32();
+ OutputStream.WriteLine("{0, -5}: Personal Tribute Count {1}", Buffer.GetPosition() - 4, PersonalTributeCount);
+ Buffer.SkipBytes((int)(PersonalTributeCount * 8));
+
+ UInt32 GuildTributeCount = Buffer.ReadUInt32();
+ OutputStream.WriteLine("{0, -5}: Guild Tribute Count {1}", Buffer.GetPosition() - 4, GuildTributeCount);
+ Buffer.SkipBytes((int)(GuildTributeCount * 8));
+
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+
+ OutputStream.WriteLine("Skipping 121 bytes starting at offset {0}", Buffer.GetPosition());
+ Buffer.SkipBytes(121);
+
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+
+ OutputStream.WriteLine("Position now {0}", Buffer.GetPosition());
+
+ UInt32 Unknown64 = Buffer.ReadUInt32();
+ OutputStream.WriteLine("{0, -5}: Unknown64 {1}", Buffer.GetPosition() - 4, Unknown64);
+ Buffer.SkipBytes((int)Unknown64);
+
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadByte());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadByte());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadByte());
+
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadByte());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadByte());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadByte());
+
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadByte());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadByte());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadByte());
+
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadByte());
+
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+
+ Unknown64 = Buffer.ReadUInt32();
+ OutputStream.WriteLine("{0, -5}: Unknown64 {1}", Buffer.GetPosition() - 4, Unknown64);
+ Buffer.SkipBytes((int)Unknown64);
+
+ Unknown64 = Buffer.ReadUInt32();
+ OutputStream.WriteLine("{0, -5}: Unknown64 {1}", Buffer.GetPosition() - 4, Unknown64);
+ Buffer.SkipBytes((int)Unknown64);
+
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+
+ OutputStream.WriteLine("Skipping 320 bytes starting at offset {0}", Buffer.GetPosition());
+ Buffer.SkipBytes(320);
+
+ OutputStream.WriteLine("Skipping 343 bytes starting at offset {0}", Buffer.GetPosition());
+ Buffer.SkipBytes(343);
+
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadByte());
+
+ UInt32 Unknown6 = Buffer.ReadUInt32();
+ OutputStream.WriteLine("{0, -5}: Unknown6 {1} LDON Stuff ?", Buffer.GetPosition() - 4, Unknown6);
+
+ for (int i = 0; i < Unknown6; ++i)
+ OutputStream.WriteLine("{0, -5}: Unknown LDON? {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+
+
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+
+ Unknown64 = Buffer.ReadUInt32();
+ OutputStream.WriteLine("{0, -5}: Unknown64 {1}", Buffer.GetPosition() - 4, Unknown64);
+ Buffer.SkipBytes((int)Unknown64 * 4);
+
+ // Air remaining ?
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+
+ // Next 7 could be PVP stats,
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+
+ // PVP LastKill struct ?
+ OutputStream.WriteLine("Skipping string + 24 bytes starting at offset {0}", Buffer.GetPosition());
+ //Buffer.SkipBytes(25);
+
+ Byte b;
+ do
+ {
+ b = Buffer.ReadByte();
+ } while (b != 0);
+
+ Buffer.SkipBytes(24);
+
+ // PVP LastDeath struct ?
+ OutputStream.WriteLine("Skipping string + 24 bytes starting at offset {0}", Buffer.GetPosition());
+ //Buffer.SkipBytes(25);
+ do
+ {
+ b = Buffer.ReadByte();
+ } while (b != 0);
+
+ Buffer.SkipBytes(24);
+
+ // PVP Number of Kills in Last 24 hours ?
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+
+ UInt32 Unknown50 = Buffer.ReadUInt32();
+ OutputStream.WriteLine("{0, -5}: Unknown50 {1}", Buffer.GetPosition() - 4, Unknown50);
+ // PVP Recent Kills ?
+ OutputStream.WriteLine("Skipping 50 x (String + 24 bytes) starting at offset {0}", Buffer.GetPosition());
+ //Buffer.SkipBytes(1338);
+ for (int i = 0; i < 50; ++i)
+ {
+ do
+ {
+ b = Buffer.ReadByte();
+ } while (b != 0);
+
+ Buffer.SkipBytes(24);
+
+ }
+
+
+
+ //
+
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+
+ OutputStream.WriteLine("{0, -5}: Group autoconsent? {1:X}", Buffer.GetPosition(), Buffer.ReadByte());
+ OutputStream.WriteLine("{0, -5}: Raid autoconsent? {1:X}", Buffer.GetPosition(), Buffer.ReadByte());
+ OutputStream.WriteLine("{0, -5}: Guild autoconsent? {1:X}", Buffer.GetPosition(), Buffer.ReadByte());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadByte());
+
+ OutputStream.WriteLine("{0, -5}: Level3? {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+
+ OutputStream.WriteLine("{0, -5}: Showhelm? {1}", Buffer.GetPosition(), Buffer.ReadByte());
+
+ OutputStream.WriteLine("{0, -5}: RestTimer? {1}", Buffer.GetPosition(), Buffer.ReadUInt32());
+
+ OutputStream.WriteLine("Skipping 1028 bytes starting at offset {0}", Buffer.GetPosition());
+ Buffer.SkipBytes(1028);
+
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+ OutputStream.WriteLine("{0, -5}: Unknown {1:X}", Buffer.GetPosition(), Buffer.ReadUInt32());
+
+ OutputStream.WriteLine("Pointer is {0} bytes from end.", Buffer.Length() - Buffer.GetPosition());
+
+
+
+ }
}
}
\ No newline at end of file
diff --git a/utils/EQExtractor2/EQExtractor2/PatchMarch13-2013.cs b/utils/EQExtractor2/EQExtractor2/PatchMarch13-2013.cs
new file mode 100644
index 000000000..7db0a720c
--- /dev/null
+++ b/utils/EQExtractor2/EQExtractor2/PatchMarch13-2013.cs
@@ -0,0 +1,79 @@
+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 PatchMarch132013Decoder : PatchFebruary112013Decoder
+ {
+ public PatchMarch132013Decoder()
+ {
+ Version = "EQ Client Build Date March 13 2013.";
+
+ PatchConfFileName = "patch_Mar13-2013.conf";
+
+ SupportsSQLGeneration = false;
+ }
+
+ override public List GetDoors()
+ {
+ List DoorList = new List();
+
+ List SpawnDoorPacket = GetPacketsOfType("OP_SpawnDoor", PacketDirection.ServerToClient);
+
+ if ((SpawnDoorPacket.Count == 0) || (SpawnDoorPacket[0].Length == 0))
+ return DoorList;
+
+ int DoorCount = SpawnDoorPacket[0].Length / 100;
+
+ 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(32);
+
+ 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;
+ }
+ }
+}
\ No newline at end of file
diff --git a/utils/EQExtractor2/EQExtractor2/SharpPcap.dll b/utils/EQExtractor2/EQExtractor2/SharpPcap.dll
new file mode 100644
index 000000000..38b783bf2
Binary files /dev/null and b/utils/EQExtractor2/EQExtractor2/SharpPcap.dll differ
diff --git a/utils/EQExtractor2/EQExtractor2/log4net.dll b/utils/EQExtractor2/EQExtractor2/log4net.dll
new file mode 100644
index 000000000..1bac5d9a0
Binary files /dev/null and b/utils/EQExtractor2/EQExtractor2/log4net.dll differ
diff --git a/utils/EQExtractor2/EQExtractor2/patch_Mar13-2013.conf b/utils/EQExtractor2/EQExtractor2/patch_Mar13-2013.conf
new file mode 100644
index 000000000..2f206d4ae
--- /dev/null
+++ b/utils/EQExtractor2/EQExtractor2/patch_Mar13-2013.conf
@@ -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=0x4c47
+OP_ApproveWorld=0x0fba
+OP_LogServer=0x147e
+OP_SendCharInfo=0x3501
+OP_ExpansionInfo=0x5529
+OP_GuildsList=0x1eb4
+OP_EnterWorld=0x5148
+OP_PostEnterWorld=0x138c
+OP_World_Client_CRC1=0x5c81
+OP_World_Client_CRC2=0x68ba
+OP_SendSpellChecksum=0x0000
+OP_SendSkillCapsChecksum=0x0000
+
+# Character Select Related:
+OP_SendMaxCharacters=0x6c2c
+OP_SendMembership=0x489a
+OP_SendMembershipDetails=0x5f73
+OP_CharacterCreateRequest=0x7d54
+OP_CharacterCreate=0x43cb
+OP_DeleteCharacter=0x7974
+OP_RandomNameGenerator=0x36b8
+OP_ApproveName=0x3cb0
+OP_MOTD=0x1e9b
+OP_SetChatServer=0x7d67
+OP_SetChatServer2=0x072c
+OP_ZoneServerInfo=0x5e3b
+OP_WorldComplete=0x230b
+OP_WorldUnknown001=0xa5af
+OP_FloatListThing=0x42e1
+
+# Reasons for Disconnect:
+OP_ZoneUnavail=0x1b4a
+OP_WorldClientReady=0x36b2
+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=0x2e94
+OP_ZoneEntry=0x9e82
+OP_ReqNewZone=0x1536
+OP_NewZone=0x23ef
+OP_ZoneSpawns=0x0325
+OP_PlayerProfile=0x48b7
+OP_TimeOfDay=0x6665
+OP_LevelUpdate=0x1048
+OP_Stamina=0x1fb1
+OP_RequestClientZoneChange=0x2521
+OP_ZoneChange=0x6976
+OP_LockoutTimerInfo=0x0000
+OP_ZoneServerReady=0x0000
+OP_ZoneInUnknown=0x0000
+OP_LogoutReply=0x0000
+OP_PreLogoutReply=0x0000
+
+# Required to fully log in
+OP_SpawnAppearance=0x3fe5
+OP_ChangeSize=0x095f
+OP_TributeUpdate=0x61af
+OP_TributeTimer=0x7f61
+OP_SendTributes=0x765f
+OP_SendGuildTributes=0x7fde
+OP_TributeInfo=0x7869
+OP_Weather=0x6f63
+OP_ReqClientSpawn=0x1fd2
+OP_SpawnDoor=0x5ab7
+OP_GroundSpawn=0x6410
+OP_SendZonepoints=0x2694
+OP_BlockedBuffs=0x5d12
+OP_RemoveBlockedBuffs=0x6b1a
+OP_ClearBlockedBuffs=0x5c27
+OP_WorldObjectsSent=0x3f24
+OP_SendExpZonein=0x39ef
+OP_SendAATable=0x2aed
+OP_RespondAA=0x6375
+OP_UpdateAA=0x7ae9
+OP_SendAAStats=0x4215
+OP_AAExpUpdate=0x7c0b
+OP_ExpUpdate=0x25cf
+OP_HPUpdate=0x462c
+OP_ManaChange=0x7db5
+OP_TGB=0x4111
+OP_SpecialMesg=0x0000
+OP_GuildMemberList=0x4f53
+OP_GuildMOTD=0x5906
+OP_CharInventory=0x3efe
+OP_WearChange=0x18ea
+OP_ClientUpdate=0x1ad3
+OP_ClientReady=0x5b91 # 0x422d
+OP_SetServerFilter=0x6d02
+
+# Guild Opcodes - Disabled until crashes are resolved in RoF
+OP_GetGuildMOTD=0x26d9 # Was 0x35dc
+OP_GetGuildMOTDReply=0x4a78 # Was 0x4586
+OP_GuildMemberUpdate=0x5809 # Was 0x5643
+OP_GuildInvite=0x6327
+OP_GuildRemove=0x4b63
+OP_GuildPeace=0x1fa2
+OP_SetGuildMOTD=0x0024
+OP_GuildList=0x0000
+OP_GuildWar=0x2366
+OP_GuildLeader=0x70f6
+OP_GuildDelete=0x50d7
+OP_GuildInviteAccept=0x6f2e
+OP_GuildDemote=0x02b3
+OP_GuildPublicNote=0x5b86
+OP_GuildManageBanker=0x714f # Was 0x0737
+OP_GuildBank=0x033e # Was 0x10c3
+OP_SetGuildRank=0x04f1
+OP_GuildUpdateURLAndChannel=0x3d53
+OP_GuildStatus=0x54a2
+OP_GuildCreate=0x23b5 # 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=0x19ee
+OP_GMBecomeNPC=0x6f5e
+OP_GMZoneRequest=0x64c6
+OP_GMZoneRequest2=0x3271
+OP_GMGoto=0x6d39
+OP_GMSearchCorpse=0x026a
+OP_GMHideMe=0x3195
+OP_GMDelCorpse=0x696f
+OP_GMApproval=0x639b
+OP_GMToggle=0x4c77
+OP_GMSummon=0x3ff2 # Was 0x684f
+OP_GMEmoteZone=0x722a # Was 0x0655
+OP_GMEmoteWorld=0x77a6 # Was 0x1935
+OP_GMFind=0x572d
+OP_GMKick=0x1d1b
+OP_GMKill=0x68c0
+OP_GMNameChange=0x075d # Was 0x4434
+OP_GMLastName=0x362a # Was 0x3077
+
+# Misc Opcodes
+OP_InspectRequest=0x3e82
+OP_InspectAnswer=0x5168
+OP_InspectMessageUpdate=0x420b
+OP_BeginCast=0x436d
+OP_BuffFadeMsg=0x46b9
+OP_ConsentResponse=0x38d7
+OP_MemorizeSpell=0x4d4b
+OP_SwapSpell=0x21d2
+OP_CastSpell=0x56ab
+OP_Consider=0x476f
+OP_FormattedMessage=0x69aa
+OP_SimpleMessage=0x0e87
+OP_Buff=0x2acd
+OP_Illusion=0x739c
+OP_MoneyOnCorpse=0x43c4
+OP_RandomReply=0x467d
+OP_DenyResponse=0x2eba
+OP_SkillUpdate=0x3b99
+OP_GMTrainSkillConfirm=0x24d4 # 0x3960
+OP_RandomReq=0x3599
+OP_Death=0x43a6
+OP_GMTraining=0x0aa1
+OP_GMEndTraining=0x5dd1
+OP_GMTrainSkill=0x5823
+OP_Animation=0x7487
+OP_Begging=0x2bac
+OP_Consent=0x5ccb
+OP_ConsentDeny=0x1a5d
+OP_AutoFire=0x6bfd
+OP_PetCommands=0x0e7a
+OP_DeleteSpell=0x3587
+OP_Surname=0x378f
+OP_ClearSurname=0x23c5
+OP_FaceChange=0x7fc4
+OP_SenseHeading=0x54cf
+OP_Action=0x4965
+OP_ConsiderCorpse=0x1294
+OP_HideCorpse=0x5141
+OP_CorpseDrag=0x14bb
+OP_CorpseDrop=0x66e8
+OP_Bug=0x055c
+OP_Feedback=0x6cb3
+OP_Report=0x28a6
+OP_Damage=0x0002e
+OP_ChannelMessage=0x1f4e
+OP_Assist=0x2612
+OP_AssistGroup=0x2ebc
+OP_MoveCoin=0x7611
+OP_ZonePlayerToBind=0x4284
+OP_KeyRing=0x7d31
+OP_WhoAllRequest=0x05f2
+OP_WhoAllResponse=0x396c
+OP_FriendsWho=0x40dd
+OP_ConfirmDelete=0x065f
+OP_Logout=0x0b31
+OP_Rewind=0x15f2
+OP_TargetCommand=0x15b5
+OP_Hide=0x0ba4
+OP_Jump=0x3622
+OP_Camp=0x2181
+OP_Emote=0x4773
+OP_SetRunMode=0x6cdb
+OP_BankerChange=0x1289
+OP_TargetMouse=0x698f
+OP_MobHealth=0x0294
+OP_InitialMobHealth=0x0000 # Unused?
+OP_TargetHoTT=0x72b0
+OP_XTargetResponse=0x38c9
+OP_XTargetRequest=0x616b
+OP_XTargetAutoAddHaters=0x0ef7
+OP_TargetBuffs=0x0aa5
+OP_BuffCreate=0x3e45
+OP_BuffRemoveRequest=0x063f
+OP_DeleteSpawn=0x49e0
+OP_AutoAttack=0x18e2
+OP_AutoAttack2=0x6af7
+OP_Consume=0x6388
+OP_MoveItem=0x2bf6
+OP_DeleteItem=0x388a
+OP_DeleteCharge=0x6d3e
+OP_ItemPacket=0x608e
+OP_ItemLinkResponse=0x08af
+OP_ItemLinkClick=0x5564
+OP_ItemPreview=0x57e3
+OP_NewSpawn=0x0009
+OP_Track=0x1261
+OP_TrackTarget=0x3a0a
+OP_TrackUnknown=0x7c61
+OP_ClickDoor=0x718e
+OP_MoveDoor=0x3953
+OP_RemoveAllDoors=0x4ca7
+OP_EnvDamage=0x71bc
+OP_BoardBoat=0x3bf8
+OP_Forage=0x1c5b
+OP_LeaveBoat=0x136c
+OP_ControlBoat=0x0686
+OP_SafeFallSuccess=0x001c
+OP_RezzComplete=0x105a
+OP_RezzRequest=0x546d
+OP_RezzAnswer=0x58b4
+OP_Shielding=0x747c
+OP_RequestDuel=0x1a3a
+OP_MobRename=0x6732
+OP_AugmentItem=0x269c # Was 0x37cb
+OP_WeaponEquip1=0x0232
+OP_WeaponEquip2=0x6f0c # Was 0x6022
+OP_WeaponUnequip2=0x1310 # Was 0x0110
+OP_ApplyPoison=0x319c
+OP_Save=0x2ab5
+OP_TestBuff=0x0a40 # Was 0x3772
+OP_CustomTitles=0x3fab
+OP_Split=0x6f03
+OP_YellForHelp=0x79c5
+OP_LoadSpellSet=0x520e
+OP_Bandolier=0x1b9f
+OP_PotionBelt=0xb71d # Was 0x4d3b
+OP_DuelResponse=0x51cd
+OP_DuelResponse2=0x5b83
+OP_SaveOnZoneReq=0x2a94
+OP_ReadBook=0x1fbe
+OP_Dye=0x6158
+OP_InterruptCast=0x1ed1
+OP_AAAction=0x7515
+OP_LeadershipExpToggle=0x6005
+OP_LeadershipExpUpdate=0x6527
+OP_PurchaseLeadershipAA=0x7a2e
+OP_UpdateLeadershipAA=0x05c4
+OP_MarkNPC=0x7d33
+OP_ClearNPCMarks=0x34ca
+OP_DelegateAbility=0x57eb
+OP_SetGroupTarget=0x2eff
+OP_Charm=0x1d9e
+OP_Stun=0x1a1a
+OP_SendFindableNPCs=0x6788
+OP_FindPersonRequest=0x6ccd
+OP_FindPersonReply=0x1f1c
+OP_Sound=0x6957
+OP_PetBuffWindow=0x66a7
+OP_LevelAppearance=0x3714
+OP_Translocate=0x4613
+OP_Sacrifice=0x1502
+OP_PopupResponse=0x53e9
+OP_OnLevelMessage=0x1b75
+OP_AugmentInfo=0x7afb
+OP_Petition=0x5f39
+OP_SomeItemPacketMaybe=0x5357
+OP_PVPStats=0x1dbf # Unsure
+OP_PVPLeaderBoardRequest=0x60fa
+OP_PVPLeaderBoardReply=0x9639
+OP_PVPLeaderBoardDetailsRequest=0x02a0
+OP_PVPLeaderBoardDetailsReply=0x628f
+OP_RestState=0x3f4c
+OP_RespawnWindow=0x311b
+OP_LDoNButton=0x528a
+OP_SetStartCity=0x7d25 # Was 0x2d1b
+OP_VoiceMacroIn=0x5a9f
+OP_VoiceMacroOut=0xbaab
+OP_ItemViewUnknown=0x0285
+OP_VetRewardsAvaliable=0x05e1
+OP_VetClaimRequest=0x18c9
+OP_VetClaimReply=0x22d7
+OP_DisciplineUpdate=0x2bf1 # Was 0x2f05
+OP_DisciplineTimer=0x3f01 # Was 0x5e3f
+OP_BecomeCorpse=0x0000 # Unused?
+OP_Action2=0x0000 # Unused?
+OP_MobUpdate=0x3c0e
+OP_NPCMoveUpdate=0x1df9
+OP_CameraEffect=0x7b49
+OP_SpellEffect=0x655c
+OP_RemoveNimbusEffect=0x3d58
+OP_AltCurrency=0x1df7
+OP_AltCurrencyMerchantRequest=0x1c52
+OP_AltCurrencyMerchantReply=0x5976
+OP_AltCurrencyPurchase=0x2322
+OP_AltCurrencySell=0x34d8
+OP_AltCurrencySellSelection=0x39ca
+OP_AltCurrencyReclaim=0x5f85
+OP_CrystalCountUpdate=0x6b56 # Was 0x3f60
+OP_CrystalCreate=0x1b2a # Was 0x5a82
+OP_CrystalReclaim=0x19cb # Was 0x7616
+OP_Untargetable=0x442c
+OP_IncreaseStats=0x502f
+OP_Weblink=0x70c8
+#OP_OpenInventory=0x0000 # Likely does not exist in RoF -U
+OP_OpenContainer=0x0000
+
+OP_DzQuit=0x6dc9
+OP_DzListTimers=0x59b4
+OP_DzAddPlayer=0x0cc4
+OP_DzRemovePlayer=0x5421
+OP_DzSwapPlayer=0x0260
+OP_DzMakeLeader=0x18cf
+OP_DzPlayerList=0x2767
+OP_DzJoinExpeditionConfirm=0x25a4
+OP_DzJoinExpeditionReply=0x0dd1
+OP_DzExpeditionInfo=0x74b5
+OP_DzExpeditionList=0x2270
+OP_DzMemberStatus=0x1952
+OP_DzLeaderStatus=0x0c68
+OP_DzExpeditionEndsWarning=0x2443
+OP_DzMemberList=0x0000
+OP_DzCompass=0x3dfd # Was 0x4f09
+OP_DzChooseZone=0x0000 # Maybe 0x29d6
+
+# New Opcodes
+OP_SpawnPositionUpdate=0x0000 # Actually OP_MobUpdate ?
+OP_ManaUpdate=0x48e4
+OP_EnduranceUpdate=0x47d6
+OP_MobManaUpdate=0x752a
+OP_MobEnduranceUpdate=0x244c
+
+# Mercenary Opcodes
+OP_MercenaryDataUpdateRequest=0x5fdf
+OP_MercenaryDataUpdate=0x7f41
+OP_MercenaryDataRequest=0x565b
+OP_MercenaryDataResponse=0x14b8
+OP_MercenaryHire=0x2455
+OP_MercenaryDismiss=0x1455
+OP_MercenaryTimerRequest=0x2afe
+OP_MercenaryTimer=0x2972
+OP_MercenaryUnknown1=0x71dd
+OP_MercenaryCommand=0x10d3
+OP_MercenarySuspendRequest=0x096d
+OP_MercenarySuspendResponse=0x1d94
+OP_MercenaryUnsuspendResponse=0x2f6b
+
+# Looting
+OP_LootRequest=0x64e9
+OP_EndLootRequest=0x4542
+OP_LootItem=0x2cf8
+OP_LootComplete=0x60fe
+
+# bazaar trader stuff:
+OP_BazaarSearch=0x3b59
+OP_TraderDelItem=0x0000
+OP_BecomeTrader=0x2a43
+OP_TraderShop=0x2b3b
+OP_Trader=0x1e94 # Was 0x6790
+OP_TraderBuy=0x0000
+OP_Barter=0x5df5
+OP_ShopItem=0x0000
+OP_BazaarInspect=0x0000
+OP_Bazaar=0x0000
+OP_TraderItemUpdate=0x0000
+
+# pc/npc trading
+OP_TradeRequest=0x7506
+OP_TradeAcceptClick=0x2d41
+OP_TradeRequestAck=0x619d
+OP_TradeCoins=0x6e22
+OP_FinishTrade=0x4676
+OP_CancelTrade=0x2e79
+OP_TradeMoneyUpdate=0x29df
+OP_MoneyUpdate=0x6ef4
+OP_TradeBusy=0x73c4
+
+# Sent after canceling trade or after closing tradeskill object
+OP_FinishWindow=0x4c2b
+OP_FinishWindow2=0x0830
+
+# Sent on Live for what seems to be item existance verification
+# Ex. Before Right Click Effect happens from items
+OP_ItemVerifyRequest=0x2977
+OP_ItemVerifyReply=0x7640
+
+# merchant stuff
+OP_ShopPlayerSell=0x396d
+OP_ShopRequest=0x6717
+OP_ShopEnd=0x0bf6
+OP_ShopEndConfirm=0x7b50
+OP_ShopPlayerBuy=0x5013
+OP_ShopDelItem=0x1658
+
+# tradeskill stuff:
+OP_ClickObject=0x00c6
+OP_ClickObjectAction=0x49ed
+OP_ClearObject=0x22c2
+OP_RecipeDetails=0x120d
+OP_RecipesFavorite=0x40bd
+OP_RecipesSearch=0x5bc1
+OP_RecipeReply=0x37ca
+OP_RecipeAutoCombine=0x741a
+OP_TradeSkillCombine=0x7272
+
+# Tribute Packets:
+OP_OpenGuildTributeMaster=0x57a8
+OP_OpenTributeMaster=0x48e8 # Was 0x40f5
+OP_SelectTribute=0x1b89
+OP_TributeItem=0x0434
+OP_TributeMoney=0x032b # Was 0x6fed
+OP_TributeToggle=0x5c5e
+OP_TributePointUpdate=0x13ab
+OP_TributeNPC=0x0000
+OP_GuildTributeInfo=0x0000
+OP_OpenTributeReply=0x0000
+OP_GuildTributeStatus=0x0000
+
+# Adventure packets:
+OP_LeaveAdventure=0x0b93
+OP_AdventureFinish=0x6f69
+OP_AdventureInfoRequest=0x6ecf
+OP_AdventureInfo=0x5463
+OP_AdventureRequest=0x4715
+OP_AdventureDetails=0x43f0
+OP_AdventureData=0x9515
+OP_AdventureUpdate=0x372a
+OP_AdventureMerchantRequest=0x4fb7 # Was 654d
+OP_AdventureMerchantResponse=0x2988 # Was 7949
+OP_AdventureMerchantPurchase=0x15a8 # Was 155a
+OP_AdventureMerchantSell=0x486c # Was 389c
+OP_AdventurePointsUpdate=0x677c # Was 7589
+OP_AdventureStatsRequest=0x0130
+OP_AdventureStatsReply=0x0b8d
+OP_AdventureLeaderboardRequest=0x1437
+OP_AdventureLeaderboardReply=0x3c78
+
+# Group Opcodes
+OP_GroupDisband=0x34d7
+OP_GroupInvite=0x4533
+OP_GroupFollow=0x6e8f
+OP_GroupUpdate=0x2b6a
+OP_GroupUpdateB=0x4c76
+OP_GroupCancelInvite=0x0000
+OP_GroupAcknowledge=0x465d
+OP_GroupDelete=0x0fa1
+OP_CancelInvite=0x2fb6
+OP_GroupFollow2=0x2e85
+OP_GroupInvite2=0x1a45
+OP_GroupDisbandYou=0x5c5a
+OP_GroupDisbandOther=0x39f0
+OP_GroupLeaderChange=0x00f0
+OP_GroupRoles=0x228a
+OP_GroupMakeLeader=0x6050
+OP_DoGroupLeadershipAbility=0x42aa
+OP_GroupLeadershipAAUpdate=0x5b21
+
+# LFG/LFP Opcodes
+OP_LFGCommand=0x79f1
+OP_LFGGetMatchesRequest=0x7069
+OP_LFGGetMatchesResponse=0x6fd7
+OP_LFPGetMatchesRequest=0x6276
+OP_LFPGetMatchesResponse=0x3008
+OP_LFPCommand=0x087e
+OP_LFGAppearance=0x0000
+OP_LFGResponse=0x0000
+
+# Raid Opcodes
+OP_RaidInvite=0x6988
+OP_RaidUpdate=0x09f9
+OP_RaidJoin=0x0000
+
+# Button-push commands
+OP_Taunt=0x751f
+OP_CombatAbility=0x02aa
+OP_SenseTraps=0x2d68 # Was 0x2ee0
+OP_PickPocket=0x6d4b
+OP_DisarmTraps=0x0000
+OP_Disarm=0x49ca
+OP_Sneak=0x1975
+OP_Fishing=0x6b72
+OP_InstillDoubt=0x2bd1
+OP_FeignDeath=0x574e
+OP_Mend=0x219f
+OP_Bind_Wound=0x10d5
+OP_LDoNOpen=0x57e2
+
+# Task packets
+OP_TaskDescription=0x2b71
+OP_TaskActivity=0x53b3
+OP_CompletedTasks=0x7c6b
+OP_TaskActivityComplete=0x16c5
+OP_AcceptNewTask=0x1e7a
+OP_CancelTask=0x1798
+OP_TaskMemberList=0x4844 # Was 0x1656
+OP_OpenNewTasksWindow=0x67b4 # Was 0x11de
+OP_AvaliableTask=0x0a3f # Was 0x2377
+OP_TaskHistoryRequest=0x4c34
+OP_TaskHistoryReply=0x593e
+OP_DeclineAllTasks=0x0000
+
+# Title opcodes
+OP_NewTitlesAvailable=0x1104
+OP_RequestTitles=0x71b2
+OP_SendTitleList=0x6d31
+OP_SetTitle=0x7ade
+OP_SetTitleReply=0x23f0
+
+# 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
diff --git a/utils/EQExtractor2/EQExtractor2/zlib.net.dll b/utils/EQExtractor2/EQExtractor2/zlib.net.dll
new file mode 100644
index 000000000..c156f8e7c
Binary files /dev/null and b/utils/EQExtractor2/EQExtractor2/zlib.net.dll differ
diff --git a/zone/PlayerCorpse.cpp b/zone/PlayerCorpse.cpp
index 82da1a827..9140a5914 100644
--- a/zone/PlayerCorpse.cpp
+++ b/zone/PlayerCorpse.cpp
@@ -1578,9 +1578,9 @@ uint32 ZoneDatabase::UpdatePlayerCorpse(uint32 dbid, uint32 charid, const char*
}
if(rezzed){
if (!RunQuery(query, MakeAnyLenString(&query, "update player_corpses set rezzed = 1 WHERE id=%d",dbid), errbuf)) {
- safe_delete_array(query);
cerr << "Error in UpdatePlayerCorpse/Rezzed query: " << errbuf << endl;
}
+ safe_delete_array(query);
}
return dbid;
}
diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp
index 66ee590b7..1949c7c59 100644
--- a/zone/client_packet.cpp
+++ b/zone/client_packet.cpp
@@ -4768,10 +4768,8 @@ void Client::Handle_OP_InstillDoubt(const EQApplicationPacket *app)
void Client::Handle_OP_RezzAnswer(const EQApplicationPacket *app)
{
- if (app->size != sizeof(Resurrect_Struct)) {
- LogFile->write(EQEMuLog::Error, "Wrong size: OP_RezzAnswer, size=%i, expected %i", app->size, sizeof(Resurrect_Struct));
- return;
- }
+ VERIFY_PACKET_LENGTH(OP_RezzAnswer, app, Resurrect_Struct);
+
const Resurrect_Struct* ra = (const Resurrect_Struct*) app->pBuffer;
_log(SPELLS__REZ, "Received OP_RezzAnswer from client. Pendingrezzexp is %i, action is %s",
@@ -4788,6 +4786,7 @@ void Client::Handle_OP_RezzAnswer(const EQApplicationPacket *app)
// the rezzed corpse is in to mark the corpse as rezzed.
outapp->SetOpcode(OP_RezzComplete);
worldserver.RezzPlayer(outapp, 0, 0, OP_RezzComplete);
+ safe_delete(outapp);
}
return;
}