예제 #1
0
        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;
        }
예제 #2
0
        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);
        }
예제 #4
0
        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("");
        }
예제 #5
0
        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("");
        }
예제 #6
0
        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);
        }
예제 #7
0
        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("");
        }
예제 #8
0
        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;
        }
예제 #9
0
        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;
        }
예제 #10
0
        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;
        }
예제 #11
0
 public virtual void DecodeItemPacket(StreamWriter outputStream, ByteStream buffer, PacketDirection direction)
 {
     throw new NotImplementedException();
 }
예제 #12
0
 public virtual void ExploreTaskDescription(StreamWriter outputStream, ByteStream buffer, PacketDirection direction)
 {
     throw new NotImplementedException();
 }
예제 #13
0
 public virtual void ExploreSpawnAppearance(StreamWriter outputStream, ByteStream buffer, PacketDirection direction)
 {
     throw new NotImplementedException();
 }
예제 #14
0
 public virtual void ExploreRequestClientZoneChange(StreamWriter outputStream, ByteStream buffer, PacketDirection direction)
 {
     throw new NotImplementedException();
 }
예제 #15
0
 public virtual void ExploreMercenaryDataResponse(StreamWriter outputStream, ByteStream buffer, PacketDirection direction)
 {
     throw new NotImplementedException();
 }
예제 #16
0
        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("");
        }
예제 #17
0
        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;
        }
예제 #18
0
        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;
        }
예제 #19
0
 public virtual void ExploreCharInventoryPacket(StreamWriter outputStream, ByteStream buffer, PacketDirection direction)
 {
     throw new NotImplementedException();
 }
예제 #20
0
        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;
        }
예제 #21
0
 public virtual void ExploreNPCMoveUpdate(StreamWriter outputStream, ByteStream buffer, PacketDirection direction)
 {
     throw new NotImplementedException();
 }
예제 #22
0
        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;
        }
예제 #23
0
 public virtual void ExploreRespawnWindow(StreamWriter outputStream, ByteStream buffer, PacketDirection direction)
 {
     throw new NotImplementedException();
 }
예제 #24
0
        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;
        }
예제 #25
0
 public virtual void ExploreSubItem(StreamWriter outputStream, ref ByteStream buffer)
 {
     throw new NotImplementedException();
 }
예제 #26
0
 public override void ExplorePlayerProfile(StreamWriter outputStream, ByteStream buffer, PacketDirection direction)
 {
     return;
 }
예제 #27
0
 public virtual void ExploreZonePlayerToBind(StreamWriter outputStream, ByteStream buffer, PacketDirection direction)
 {
     throw new NotImplementedException();
 }
예제 #28
0
        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)
            {
            }
        }
예제 #29
0
        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;
        }
예제 #30
0
        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);
            }
        }