public override PositionUpdate Decode_OP_MobUpdate(byte[] mobUpdatePacket) { 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 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; }
public override void ExploreItemPacket(StreamWriter outputStream, ByteStream buffer, PacketDirection direction) { buffer.SkipBytes(4); // Skip type field. ExploreSubItem(outputStream, ref buffer); outputStream.WriteLine(""); }
public override 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 override 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 override 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 override 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 override 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(""); }
public override Item DecodeItemPacket(byte[] packetBuffer) { ByteStream Buffer = new ByteStream(packetBuffer); Item NewItem = new Item(); NewItem.StackSize = Buffer.ReadUInt32(); Buffer.SkipBytes(4); NewItem.Slot = Buffer.ReadUInt32(); NewItem.MerchantSlot = Buffer.ReadUInt32(); NewItem.Price = Buffer.ReadUInt32(); NewItem.Quantity = Buffer.ReadInt32(); Buffer.SetPosition(68); NewItem.Name = Buffer.ReadString(true); NewItem.Lore = Buffer.ReadString(true); NewItem.IDFile = Buffer.ReadString(true); NewItem.ID = Buffer.ReadUInt32(); return NewItem; }
public override 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; }
public override 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); GroundSpawn.DropID = Buffer.ReadUInt32(); GroundSpawn.Name = Buffer.ReadString(false); GroundSpawn.ZoneID = Buffer.ReadUInt16(); GroundSpawn.InstanceID = Buffer.ReadUInt16(); Buffer.SkipBytes(8); // Two unknown uint32s GroundSpawn.Heading = Buffer.ReadSingle(); Buffer.SkipBytes(12); // First float is 255 to make some groundspawns appear, second 4 bytes unknown, last is a float GroundSpawn.y = Buffer.ReadSingle(); GroundSpawn.x = Buffer.ReadSingle(); GroundSpawn.z = Buffer.ReadSingle(); GroundSpawn.ObjectType = Buffer.ReadUInt32(); GroundSpawns.Add(GroundSpawn); } return GroundSpawns; }
public virtual void DecodeItemPacket(StreamWriter outputStream, ByteStream buffer, PacketDirection direction) { throw new NotImplementedException(); }
public virtual void ExploreTaskDescription(StreamWriter outputStream, ByteStream buffer, PacketDirection direction) { throw new NotImplementedException(); }
public virtual void ExploreSpawnAppearance(StreamWriter outputStream, ByteStream buffer, PacketDirection direction) { throw new NotImplementedException(); }
public virtual void ExploreRequestClientZoneChange(StreamWriter outputStream, ByteStream buffer, PacketDirection direction) { throw new NotImplementedException(); }
public virtual void ExploreMercenaryDataResponse(StreamWriter outputStream, ByteStream buffer, PacketDirection direction) { throw new NotImplementedException(); }
public override 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(""); }
public override 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; }
public override List<PositionUpdate> GetClientMovementUpdates() { List<PositionUpdate> Updates = new List<PositionUpdate>(); List<EQApplicationPacket> PacketList = Packets.PacketList; UInt32 OP_ClientUpdate = OpManager.OpCodeNameToNumber("OP_ClientUpdate"); foreach (EQApplicationPacket UpdatePacket in PacketList) { if ((UpdatePacket.OpCode != OP_ClientUpdate) || (UpdatePacket.Direction != PacketDirection.ClientToServer)) continue; ByteStream Buffer = new ByteStream(UpdatePacket.Buffer); PositionUpdate PosUpdate = new PositionUpdate(); PosUpdate.SpawnID = Buffer.ReadUInt16(); Buffer.SkipBytes(6); PosUpdate.p.x = Buffer.ReadSingle(); PosUpdate.p.y = Buffer.ReadSingle(); Buffer.SkipBytes(12); PosUpdate.p.z = Buffer.ReadSingle(); PosUpdate.p.TimeStamp = UpdatePacket.PacketTime; Buffer.SkipBytes(4); UInt32 Temp = Buffer.ReadUInt32(); Temp = Temp & 0x3FFFFF; Temp = Temp >> 10; PosUpdate.p.heading = Utils.EQ19ToFloat((Int32)(Temp)); Updates.Add(PosUpdate); } return Updates; }
public virtual void ExploreCharInventoryPacket(StreamWriter outputStream, ByteStream buffer, PacketDirection direction) { throw new NotImplementedException(); }
public override 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) || (p.OpCode == OP_ShopRequest)) break; if (p.OpCode == OP_ItemPacket) { Item NewItem = DecodeItemPacket(p.Buffer); mm.AddMerchantItem(MerchantSpawnID, NewItem.ID, NewItem.Name, NewItem.MerchantSlot, NewItem.Quantity); } } } } return mm; }
public virtual void ExploreNPCMoveUpdate(StreamWriter outputStream, ByteStream buffer, PacketDirection direction) { throw new NotImplementedException(); }
public override 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(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; }
public virtual void ExploreRespawnWindow(StreamWriter outputStream, ByteStream buffer, PacketDirection direction) { throw new NotImplementedException(); }
public override List<ZoneEntryStruct> GetSpawns() { List<ZoneEntryStruct> zoneSpawns = new List<ZoneEntryStruct>(); List<byte[]> spawnPackets = GetPacketsOfType("OP_ZoneEntry", PacketDirection.ServerToClient); foreach (var spawnPacket in spawnPackets) { var newSpawn = new ZoneEntryStruct(); var buffer = new ByteStream(spawnPacket); newSpawn.SpawnName = buffer.ReadString(true); newSpawn.SpawnName = Utils.MakeCleanName(newSpawn.SpawnName); newSpawn.SpawnID = buffer.ReadUInt32(); newSpawn.Level = buffer.ReadByte(); buffer.SkipBytes(4); newSpawn.IsNPC = buffer.ReadByte(); var bitfield=buffer.ReadUInt32(); newSpawn.Gender = (bitfield & 3); var otherData = buffer.ReadByte(); buffer.SkipBytes(8); if ((otherData & 1) > 0) { newSpawn.DestructableString1 = buffer.ReadString(false); newSpawn.DestructableString2 = buffer.ReadString(false); newSpawn.DestructableString3 = buffer.ReadString(false); buffer.SkipBytes(53); } if ((otherData & 4) > 0) { 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 (var i = 1; i < newSpawn.PropCount; ++i) buffer.SkipBytes(4); buffer.SkipBytes(1); // Skip HP % newSpawn.Beard = buffer.ReadByte(); //Beardstyle newSpawn.HairColor = buffer.ReadByte(); newSpawn.EyeColor1 = buffer.ReadByte(); newSpawn.EyeColor2 = buffer.ReadByte(); newSpawn.HairStyle = buffer.ReadByte(); newSpawn.BeardColor = buffer.ReadByte(); newSpawn.DrakkinHeritage = buffer.ReadUInt32(); // vsab: an_unemployed_mercenary's and some newer npc's seem to have newSpawn.DrakkinHeritage set to 255, then have invalid numbers for the next ones if (newSpawn.DrakkinHeritage == 255) { newSpawn.DrakkinHeritage = 0; newSpawn.DrakkinTattoo = 0; newSpawn.DrakkinDetails = 0; buffer.SkipBytes(8); } else { newSpawn.DrakkinTattoo = buffer.ReadUInt32(); newSpawn.DrakkinDetails = buffer.ReadUInt32(); } newSpawn.EquipChest2 = buffer.ReadByte(); var 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.ReadUInt32(); buffer.SkipBytes(1); // Skip PVP, Standstate, Light, Flymode newSpawn.StandState = buffer.ReadByte(); //110 is sitting, 100 is standing, 120 is FD/corpse, mounts show as 102 buffer.SkipBytes(2); newSpawn.LastName = buffer.ReadString(true); buffer.SkipBytes(6); newSpawn.PetOwnerID = buffer.ReadUInt32(); newSpawn.MeleeTexture1 = 0; newSpawn.MeleeTexture2 = 0; buffer.SkipBytes(newSpawn.IsNPC == 1 ? 37 : 25); if (newSpawn.IsNPC == 0 || NPCType.IsPlayableRace(newSpawn.Race)) { var posn = buffer.GetPosition(); for (var colourSlot = 0; colourSlot < 9; ++colourSlot) newSpawn.SlotColour[colourSlot] = buffer.ReadUInt32(); var diff = buffer.GetPosition() - posn; Debug.Assert(diff == 36, "Colour slots wrong!"); for (var i = 0; i < 9; ++i) { newSpawn.Equipment[i] = buffer.ReadUInt32(); var equip3 = buffer.ReadUInt32(); var equip2 = buffer.ReadUInt32(); var equip1 = buffer.ReadUInt32(); var equip0 = buffer.ReadUInt32(); } if (newSpawn.Equipment[Constants.MATERIAL_CHEST] > 0) { newSpawn.EquipChest2 = (byte)newSpawn.Equipment[Constants.MATERIAL_CHEST]; } //vsab: unverified..... 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 { 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; var position1 = buffer.ReadUInt32(); var position2 = buffer.ReadUInt32(); //not valid this patch var position3 = buffer.ReadUInt32(); var position4 = buffer.ReadUInt32(); var position5 = buffer.ReadUInt32(); newSpawn.XPos = Utils.EQ19ToFloat((Int32)((position4 >> 13) & 0x7FFFF)); newSpawn.YPos = Utils.EQ19ToFloat((Int32)(position1 >> 12) & 0x7FFFF); newSpawn.ZPos = Utils.EQ19ToFloat((Int32)(position3) & 0x7FFFF); newSpawn.Heading = Utils.EQ19ToFloat((Int32)(position5) & 0x7FF); if ((otherData & 16) > 1) { newSpawn.Title = buffer.ReadString(false); } if ((otherData & 32) > 1) { newSpawn.Suffix = buffer.ReadString(false); } // unknowns buffer.SkipBytes(8); newSpawn.IsMercenary = buffer.ReadByte(); buffer.SkipBytes(54); var expectedLength = buffer.Length(); var currentPoint = buffer.GetPosition(); Debug.Assert(currentPoint == expectedLength, "Length mismatch while parsing zone spawns"); zoneSpawns.Add(newSpawn); } return zoneSpawns; }
public virtual void ExploreSubItem(StreamWriter outputStream, ref ByteStream buffer) { throw new NotImplementedException(); }
public override void ExplorePlayerProfile(StreamWriter outputStream, ByteStream buffer, PacketDirection direction) { return; }
public virtual void ExploreZonePlayerToBind(StreamWriter outputStream, ByteStream buffer, PacketDirection direction) { throw new NotImplementedException(); }
public override void ExploreZoneEntry(StreamWriter outputStream, ByteStream buffer, PacketDirection direction) { if (direction != PacketDirection.ServerToClient) return; try { var firstName = buffer.ReadString(false); //verified outputStream.WriteLine("Name = {0}", firstName); //File.WriteAllBytes(string.Format("{0}.bin",Utils.MakeCleanName(firstName)),buffer.Buffer); var spawnId = buffer.ReadUInt32();//verified outputStream.WriteLine("SpawnID = {0}", spawnId); var level = buffer.ReadByte();//verified outputStream.WriteLine("Level = {0}", level); buffer.SkipBytes(4); var isNpc = buffer.ReadByte();//verified outputStream.WriteLine("IsNPC = {0}", isNpc); var bitfield = buffer.ReadUInt32(); outputStream.WriteLine("Name: {0}, Bitfield: {1}", firstName, Convert.ToString(bitfield, 2)); outputStream.WriteLine("Gender: {0}", (bitfield & 3));//verified var otherData = buffer.ReadByte(); outputStream.WriteLine("OtherData = {0}", otherData); buffer.SkipBytes(8); // otherdata stuff is unverified 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); } //properties unverified in the sense that I don't know if they represent anything useful other than bodytype var properties = buffer.ReadByte(); outputStream.WriteLine("Properties = {0}, Offset now {1}", properties, buffer.GetPosition()); UInt32 bodyType = 0; if (properties > 0) bodyType = buffer.ReadUInt32(); //verified outputStream.WriteLine("Bodytype = {0}", bodyType); if (properties != 1) outputStream.WriteLine("XXXX Properties is {0}", properties); for (var i = 1; i < properties; ++i) outputStream.WriteLine(" Prop: {0}", buffer.ReadUInt32()); var hp = buffer.ReadByte(); //not 100% sure this is HP. I got 47% on my character when her hp at 100%. Poss mana? //Below here is verified var beardStyle = buffer.ReadByte(); outputStream.WriteLine("Beardstyle is {0}", beardStyle); var hairColor = buffer.ReadByte(); outputStream.WriteLine("Hair color is {0}", hairColor); var eye1 = buffer.ReadByte(); outputStream.WriteLine("Eye1 is {0}", eye1); var eye2 = buffer.ReadByte(); outputStream.WriteLine("Eye2 is {0}", eye2); var hairStyle = buffer.ReadByte(); outputStream.WriteLine("Hair style is {0}", hairStyle); var beardColor = buffer.ReadByte(); outputStream.WriteLine("Beard color is {0}", beardColor); var drakkinHeritage=buffer.ReadUInt32(); outputStream.WriteLine("Drakkin Heritage is {0}", drakkinHeritage); // an_unemployed_mercenary's and some newer npc's seem to have this set to 255, then have invalid numbers for the next ones if(drakkinHeritage==255) { outputStream.WriteLine("We should set drakkinHeritage to 0 as well as the other Drakkin stuff."); outputStream.WriteLine("Drakkin Heritage is 0"); outputStream.WriteLine("Drakkin Tattoo is 0"); outputStream.WriteLine("Drakkin Details is 0"); buffer.SkipBytes(8); } else { outputStream.WriteLine("Drakkin Tattoo is {0}", buffer.ReadUInt32()); outputStream.WriteLine("Drakkin Details is {0}", buffer.ReadUInt32()); } var equipChest2 = buffer.ReadByte(); //AKA texture var useWorn = equipChest2 == 255; buffer.SkipBytes(2); var helm = buffer.ReadByte(); //unverified var size = buffer.ReadSingle(); //verified var face = buffer.ReadByte(); // Probably correct var walkSpeed = buffer.ReadSingle(); //dunno valid ranges for this so this is anyone's guess :P var runSpeed = buffer.ReadSingle(); // verified var race = buffer.ReadUInt32(); //verified //dunno about bits below here outputStream.WriteLine("Holding = {0}", buffer.ReadByte()); outputStream.WriteLine("Deity = {0}", buffer.ReadUInt32()); //verified outputStream.WriteLine("GuildID = {0}", buffer.ReadUInt32());//unverified outputStream.WriteLine("Guildstatus = {0}", buffer.ReadUInt32());//unverified outputStream.WriteLine("Class = {0}", buffer.ReadUInt32());//verified outputStream.WriteLine("Size: {0}, Face: {1}, Walkspeed: {2}, RunSpeed: {3}, Race: {4}", size, face,walkSpeed, runSpeed, race); buffer.SkipBytes(1); //PVP-//unverified outputStream.WriteLine("Stand State = {0}", buffer.ReadByte());//unverified outputStream.WriteLine("Light = {0}", buffer.ReadByte());//unverified buffer.SkipBytes(1); //Flymode! //unverified var lastName = buffer.ReadString(false); outputStream.WriteLine("LastName = {0}", lastName); //verified buffer.SkipBytes(6); outputStream.WriteLine("PetOwnerId = {0}", buffer.ReadUInt32());//unverified buffer.SkipBytes(isNpc == 1 ? 37 : 25); if (isNpc == 0 || NPCType.IsPlayableRace(race)) { var posn = buffer.GetPosition(); for (int ColourSlot = 0; ColourSlot < 9; ++ColourSlot) outputStream.WriteLine("Color {0} is {1}", ColourSlot, buffer.ReadUInt32()); var diff = buffer.GetPosition() - posn; Debug.Assert(diff==36, "Colour slots wrong!"); //Player equip verified for (var i = 0; i < 9; ++i) { var equip3 = buffer.ReadUInt32(); var equipx = buffer.ReadUInt32(); var equip2 = buffer.ReadUInt32(); var equip1 = buffer.ReadUInt32(); var 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 { //vsab at this point this section is 100% untested // 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); var meleeTexture1 = buffer.ReadUInt32(); buffer.SkipBytes(16); var meleeTexture2 = buffer.ReadUInt32(); buffer.SkipBytes(16); } //positions verified! outputStream.WriteLine("Position starts at offset {0}", buffer.GetPosition()); var position1 = buffer.ReadUInt32(); outputStream.WriteLine("Position1 untreated {0}", position1); var position2 = buffer.ReadUInt32(); outputStream.WriteLine("Position2 untreated {0}", position2); var position3 = buffer.ReadUInt32(); outputStream.WriteLine("Position3 untreated {0}", position3); var position4 = buffer.ReadUInt32(); outputStream.WriteLine("Position4 untreated {0}", position4); var position5 = buffer.ReadUInt32(); outputStream.WriteLine("Position5 untreated {0}", position5); var xPos = Utils.EQ19ToFloat((Int32)((position4 >> 13) & 0x7FFFF)); var yPos = Utils.EQ19ToFloat((Int32)(position1 >> 12) & 0x7FFFF); var zPos = Utils.EQ19ToFloat((Int32)(position3) & 0x7FFFF); var heading = Utils.EQ19ToFloat((Int32)(position5) & 0x7FF); 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)); //verified if ((otherData & 32) > 1) outputStream.WriteLine("Suffix: {0}", buffer.ReadString(false)); //verified buffer.SkipBytes(8); var isMerc = buffer.ReadByte(); //verified outputStream.WriteLine("IsMerc: {0}", isMerc); buffer.SkipBytes(54); var expectedLength = buffer.Length(); var currentPoint = buffer.GetPosition(); outputStream.WriteLine("Buffer Length: {0}, Current Position: {1}",expectedLength,currentPoint); Debug.Assert(currentPoint == expectedLength, "Length mismatch while parsing zone spawns"); outputStream.WriteLine(""); } catch (Exception) { } }
public override 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)((Position1 >> 12) & 0x7FFFF)); newSpawn.ZPos = Utils.EQ19ToFloat((Int32)(Position2) & 0x7FFFF); newSpawn.XPos = Utils.EQ19ToFloat((Int32)(Position4 >> 13) & 0x7FFFF); newSpawn.Heading = Utils.EQ19ToFloat((Int32)(Position3 >> 13) & 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); var expectedLength = buffer.Length(); var currentPoint = buffer.GetPosition(); Debug.Assert(currentPoint == expectedLength, "Length mismatch while parsing zone spawns"); ZoneSpawns.Add(newSpawn); } return ZoneSpawns; }
public override 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); } }