mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-15 00:01:28 +00:00
342 lines
15 KiB
C#
342 lines
15 KiB
C#
//
|
|
// 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("");
|
|
}
|
|
|
|
|
|
}
|
|
}
|