From b7fd3e442c22b4578ec7cd39f4bef460f553bebf Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Sat, 20 Feb 2016 16:51:35 -0500 Subject: [PATCH] Added 0x6c to the actorIdChanger. Mount appearance is now broadcast to show Goobbue. Equipment packets implemented as well as Equipment object. --- .../FFXIVClassic Map Server.csproj | 1 + .../actors/chara/player/Equipment.cs | 113 ++++++++++++++++++ .../actors/chara/player/Player.cs | 4 +- FFXIVClassic Map Server/packets/BasePacket.cs | 2 +- .../Actor/inventory/EquipmentListX01Packet.cs | 4 +- .../Actor/inventory/EquipmentListX08Packet.cs | 91 ++++---------- .../Actor/inventory/EquipmentListX16Packet.cs | 89 +++----------- .../Actor/inventory/EquipmentListX32Packet.cs | 91 +++----------- .../Actor/inventory/EquipmentListX64Packet.cs | 89 +++----------- 9 files changed, 194 insertions(+), 290 deletions(-) create mode 100644 FFXIVClassic Map Server/actors/chara/player/Equipment.cs diff --git a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj index f6f00e66..119442b4 100644 --- a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj +++ b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj @@ -65,6 +65,7 @@ + diff --git a/FFXIVClassic Map Server/actors/chara/player/Equipment.cs b/FFXIVClassic Map Server/actors/chara/player/Equipment.cs new file mode 100644 index 00000000..a3dbd470 --- /dev/null +++ b/FFXIVClassic Map Server/actors/chara/player/Equipment.cs @@ -0,0 +1,113 @@ +using FFXIVClassic_Map_Server.Actors; +using FFXIVClassic_Map_Server.dataobjects; +using FFXIVClassic_Map_Server.packets.send.Actor.inventory; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FFXIVClassic_Map_Server.actors.chara.player +{ + class Equipment + { + public const int SLOT_MAINHAND = 0x00; + public const int SLOT_OFFHAND = 0x01; + public const int SLOT_THROWINGWEAPON = 0x04; + public const int SLOT_PACK = 0x05; + public const int SLOT_POUCH = 0x06; + public const int SLOT_HEAD = 0x08; + public const int SLOT_UNDERSHIRT = 0x09; + public const int SLOT_BODY = 0x0A; + public const int SLOT_UNDERGARMENT = 0x0B; + public const int SLOT_LEGS = 0x0C; + public const int SLOT_HANDS = 0x0D; + public const int SLOT_BOOTS = 0x0E; + public const int SLOT_WAIST = 0x0F; + public const int SLOT_NECK = 0x10; + public const int SLOT_EARS = 0x11; + public const int SLOT_WRISTS = 0x13; + public const int SLOT_RIGHTFINGER = 0x15; + public const int SLOT_LEFTFINGER = 0x16; + + private Player owner; + private ushort inventoryCapacity; + private ushort inventoryCode; + private Item[] list; + + public Equipment(Player ownerPlayer, ushort capacity, ushort code) + { + owner = ownerPlayer; + inventoryCapacity = capacity; + inventoryCode = code; + } + + public Item GetItemAtSlot(ushort slot) + { + if (slot < list.Length) + return list[slot]; + else + return null; + } + + public void SetEquipment(List> toEquip) + { + List slotsToUpdate = new List(); + for (int i = 0; i < toEquip.Count; i++) + { + slotsToUpdate.Add(toEquip[i].Item1); + list[toEquip[i].Item1] = toEquip[i].Item2; + } + + SendEquipmentPackets(slotsToUpdate); + } + + public void Equip(ushort slot, Item item) + { + if (slot < list.Length) + list[slot] = item; + SendEquipmentPackets(slot, item); + } + + public void Unequip(ushort slot) + { + if (slot < list.Length) + list[slot] = null; + SendEquipmentPackets(slot, null); + } + + private void SendEquipmentPackets(ushort equipSlot, Item item) + { + if (item == null) + owner.queuePacket(EquipmentListX01Packet.buildPacket(owner.actorId, equipSlot, 0)); + else + owner.queuePacket(EquipmentListX01Packet.buildPacket(owner.actorId, equipSlot, item.slot)); + } + + private void SendEquipmentPackets(List slotsToUpdate) + { + int currentIndex = 0; + + while (true) + { + if (list.Length - currentIndex >= 64) + owner.queuePacket(EquipmentListX64Packet.buildPacket(owner.actorId, list, slotsToUpdate, ref currentIndex)); + else if (list.Length - currentIndex >= 32) + owner.queuePacket(EquipmentListX32Packet.buildPacket(owner.actorId, list, slotsToUpdate, ref currentIndex)); + else if (list.Length - currentIndex >= 16) + owner.queuePacket(EquipmentListX16Packet.buildPacket(owner.actorId, list, slotsToUpdate, ref currentIndex)); + else if (list.Length - currentIndex > 1) + owner.queuePacket(EquipmentListX08Packet.buildPacket(owner.actorId, list, slotsToUpdate, ref currentIndex)); + else if (list.Length - currentIndex == 1) + { + owner.queuePacket(EquipmentListX01Packet.buildPacket(owner.actorId, slotsToUpdate[currentIndex], list[currentIndex].slot)); + currentIndex++; + } + else + break; + } + + } + + } +} diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs index 9a606dd9..7e43dc79 100644 --- a/FFXIVClassic Map Server/actors/chara/player/Player.cs +++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs @@ -581,12 +581,12 @@ namespace FFXIVClassic_Map_Server.Actors public void sendChocoboAppearance() { - queuePacket(SetCurrentMountChocoboPacket.buildPacket(actorId, chocoboAppearance)); + broadcastPacket(SetCurrentMountChocoboPacket.buildPacket(actorId, chocoboAppearance), true); } public void sendGoobbueAppearance() { - queuePacket(SetCurrentMountGoobbuePacket.buildPacket(actorId, 1)); + broadcastPacket(SetCurrentMountGoobbuePacket.buildPacket(actorId, 1), true); } public void setMountState(byte mountState) diff --git a/FFXIVClassic Map Server/packets/BasePacket.cs b/FFXIVClassic Map Server/packets/BasePacket.cs index a56f9768..9e9c9c48 100644 --- a/FFXIVClassic Map Server/packets/BasePacket.cs +++ b/FFXIVClassic Map Server/packets/BasePacket.cs @@ -163,7 +163,7 @@ namespace FFXIVClassic_Lobby_Server.packets while (binreader.BaseStream.Position + 4 < data.Length) { uint read = binreader.ReadUInt32(); - if (read == 0x029B2941 || read == 0x02977DC7 || read == 0x0297D2C8 || read == 0x0230d573 || read == 0x23317df || read == 0x23344a3 || read == 0x1730bdb) //Original ID + if (read == 0x029B2941 || read == 0x02977DC7 || read == 0x0297D2C8 || read == 0x0230d573 || read == 0x23317df || read == 0x23344a3 || read == 0x1730bdb || read == 0x6c) //Original ID { binWriter.BaseStream.Seek(binreader.BaseStream.Position - 0x4, SeekOrigin.Begin); binWriter.Write(actorID); diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX01Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX01Packet.cs index ec40f23a..44422757 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX01Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX01Packet.cs @@ -13,7 +13,7 @@ namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory public const ushort OPCODE = 0x014D; public const uint PACKET_SIZE = 0x28; - public static SubPacket buildPacket(uint playerActorID, ushort slot, uint itemSlot) + public static SubPacket buildPacket(uint playerActorID, ushort equipSlot, uint itemSlot) { byte[] data = new byte[PACKET_SIZE - 0x20]; @@ -21,7 +21,7 @@ namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory { using (BinaryWriter binWriter = new BinaryWriter(mem)) { - binWriter.Write((UInt16)slot); + binWriter.Write((UInt16)equipSlot); binWriter.Write((UInt32)itemSlot); } } diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX08Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX08Packet.cs index 81b0c635..a2e71b73 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX08Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX08Packet.cs @@ -1,4 +1,5 @@ using FFXIVClassic_Lobby_Server.packets; +using FFXIVClassic_Map_Server.dataobjects; using System; using System.Collections.Generic; using System.IO; @@ -13,85 +14,33 @@ namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory public const ushort OPCODE = 0x14E; public const uint PACKET_SIZE = 0x58; - public const uint UNEQUIPPED = 0xFFFFFFFF; - - public const int SLOT_MAINHAND = 0x00; - public const int SLOT_OFFHAND = 0x01; - public const int SLOT_THROWINGWEAPON = 0x04; - public const int SLOT_PACK = 0x05; - public const int SLOT_POUCH = 0x06; - public const int SLOT_HEAD = 0x08; - public const int SLOT_UNDERSHIRT = 0x09; - public const int SLOT_BODY = 0x0A; - public const int SLOT_UNDERGARMENT = 0x0B; - public const int SLOT_LEGS = 0x0C; - public const int SLOT_HANDS = 0x0D; - public const int SLOT_BOOTS = 0x0E; - public const int SLOT_WAIST = 0x0F; - public const int SLOT_NECK = 0x10; - public const int SLOT_EARS = 0x11; - public const int SLOT_WRISTS = 0x13; - public const int SLOT_RIGHTFINGER = 0x15; - public const int SLOT_LEFTFINGER = 0x16; - - private uint[] equipment = new uint[0x17]; - - public EquipmentListX08Packet() + public static SubPacket buildPacket(uint playerActorId, Item[] equipment, List slotsToUpdate, ref int listOffset) { - for (int i = 0; i < equipment.Length; i++) - equipment[i] = UNEQUIPPED; //We will use this as "Unequipped" - } - - public void setItem(int slot, uint itemSlot) - { - if (slot >= equipment.Length) - return; - - equipment[slot] = itemSlot; - } - - public List buildPackets(uint playerActorID) - { - List packets = new List(); - int packetCount = 0; - int runningCount = 0; byte[] data = new byte[PACKET_SIZE - 0x20]; - MemoryStream mem = new MemoryStream(data); - BinaryWriter binWriter = new BinaryWriter(mem); - for (int i = 0; i < equipment.Length; i++) + using (MemoryStream mem = new MemoryStream(data)) { - if (equipment[i] == UNEQUIPPED) - continue; - - binWriter.Write((UInt16)i); - binWriter.Write((UInt32)equipment[i]); - - packetCount++; - runningCount++; - - //Create another packet - if (runningCount >= 8) + using (BinaryWriter binWriter = new BinaryWriter(mem)) { - packetCount = 0; - binWriter.Write((UInt32)8); - binWriter.Dispose(); - mem.Dispose(); - packets.Add(new SubPacket(OPCODE, playerActorID, playerActorID, data)); - data = new byte[PACKET_SIZE - 0x20]; - mem = new MemoryStream(data); - binWriter = new BinaryWriter(mem); + int max; + if (slotsToUpdate.Count - listOffset <= 8) + max = slotsToUpdate.Count - listOffset; + else + max = 8; + + for (int i = 0; i < max; i++) + { + binWriter.Write((UInt16)slotsToUpdate[i]); + binWriter.Write((UInt32)equipment[slotsToUpdate[i]].slot); + listOffset++; + } + + binWriter.Seek(0x30, SeekOrigin.Begin); + binWriter.Write((UInt32)max); } } - //Create any leftover subpacket - binWriter.BaseStream.Seek(0x30, SeekOrigin.Begin); - binWriter.Write((UInt32)packetCount); - binWriter.Dispose(); - mem.Dispose(); - packets.Add(new SubPacket(OPCODE, playerActorID, playerActorID, data)); - - return packets; + return new SubPacket(OPCODE, playerActorId, playerActorId, data); } } diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX16Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX16Packet.cs index 40d254e0..e0fb3d16 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX16Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX16Packet.cs @@ -1,4 +1,5 @@ using FFXIVClassic_Lobby_Server.packets; +using FFXIVClassic_Map_Server.dataobjects; using System; using System.Collections.Generic; using System.IO; @@ -13,85 +14,31 @@ namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory public const ushort OPCODE = 0x14F; public const uint PACKET_SIZE = 0x80; - public const uint UNEQUIPPED = 0xFFFFFFFF; - - public const int SLOT_MAINHAND = 0x00; - public const int SLOT_OFFHAND = 0x01; - public const int SLOT_THROWINGWEAPON = 0x04; - public const int SLOT_PACK = 0x05; - public const int SLOT_POUCH = 0x06; - public const int SLOT_HEAD = 0x08; - public const int SLOT_UNDERSHIRT = 0x09; - public const int SLOT_BODY = 0x0A; - public const int SLOT_UNDERGARMENT = 0x0B; - public const int SLOT_LEGS = 0x0C; - public const int SLOT_HANDS = 0x0D; - public const int SLOT_BOOTS = 0x0E; - public const int SLOT_WAIST = 0x0F; - public const int SLOT_NECK = 0x10; - public const int SLOT_EARS = 0x11; - public const int SLOT_WRISTS = 0x13; - public const int SLOT_RIGHTFINGER = 0x15; - public const int SLOT_LEFTFINGER = 0x16; - - private uint[] equipment = new uint[0x17]; - - public EquipmentListX16Packet() + public static SubPacket buildPacket(uint playerActorId, Item[] equipment, List slotsToUpdate, ref int listOffset) { - for (int i = 0; i < equipment.Length; i++) - equipment[i] = UNEQUIPPED; //We will use this as "Unequipped" - } - - public void setItem(int slot, uint itemSlot) - { - if (slot >= equipment.Length) - return; - - equipment[slot] = itemSlot; - } - - public List buildPackets(uint playerActorID) - { - List packets = new List(); - int packetCount = 0; - int runningCount = 0; byte[] data = new byte[PACKET_SIZE - 0x20]; - MemoryStream mem = new MemoryStream(data); - BinaryWriter binWriter = new BinaryWriter(mem); - for (int i = 0; i < equipment.Length; i++) + using (MemoryStream mem = new MemoryStream(data)) { - if (equipment[i] == UNEQUIPPED) - continue; - - binWriter.Write((UInt16)i); - binWriter.Write((UInt32)equipment[i]); - - packetCount++; - runningCount++; - - //Create another packet - if (runningCount >= 16) + using (BinaryWriter binWriter = new BinaryWriter(mem)) { - packetCount = 0; - binWriter.Write((UInt32)8); - binWriter.Dispose(); - mem.Dispose(); - packets.Add(new SubPacket(OPCODE, playerActorID, playerActorID, data)); - data = new byte[PACKET_SIZE - 0x20]; - mem = new MemoryStream(data); - binWriter = new BinaryWriter(mem); + int max; + if (slotsToUpdate.Count - listOffset <= 16) + max = slotsToUpdate.Count - listOffset; + else + max = 16; + + for (int i = 0; i < max; i++) + { + binWriter.Write((UInt16)slotsToUpdate[i]); + binWriter.Write((UInt32)equipment[slotsToUpdate[i]].slot); + listOffset++; + } + } } - //Create any leftover subpacket - binWriter.BaseStream.Seek(0x30, SeekOrigin.Begin); - binWriter.Write((UInt32)packetCount); - binWriter.Dispose(); - mem.Dispose(); - packets.Add(new SubPacket(OPCODE, playerActorID, playerActorID, data)); - - return packets; + return new SubPacket(OPCODE, playerActorId, playerActorId, data); } } diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX32Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX32Packet.cs index 81350a15..d7b0eba6 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX32Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX32Packet.cs @@ -1,4 +1,5 @@ using FFXIVClassic_Lobby_Server.packets; +using FFXIVClassic_Map_Server.dataobjects; using System; using System.Collections.Generic; using System.IO; @@ -13,86 +14,32 @@ namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory public const ushort OPCODE = 0x150; public const uint PACKET_SIZE = 0xE0; - public const uint UNEQUIPPED = 0xFFFFFFFF; - - public const int SLOT_MAINHAND = 0x00; - public const int SLOT_OFFHAND = 0x01; - public const int SLOT_THROWINGWEAPON = 0x04; - public const int SLOT_PACK = 0x05; - public const int SLOT_POUCH = 0x06; - public const int SLOT_HEAD = 0x08; - public const int SLOT_UNDERSHIRT = 0x09; - public const int SLOT_BODY = 0x0A; - public const int SLOT_UNDERGARMENT = 0x0B; - public const int SLOT_LEGS = 0x0C; - public const int SLOT_HANDS = 0x0D; - public const int SLOT_BOOTS = 0x0E; - public const int SLOT_WAIST = 0x0F; - public const int SLOT_NECK = 0x10; - public const int SLOT_EARS = 0x11; - public const int SLOT_WRISTS = 0x13; - public const int SLOT_RIGHTFINGER = 0x15; - public const int SLOT_LEFTFINGER = 0x16; - - private uint[] equipment = new uint[0x17]; - - public EquipmentListX32Packet() + public static SubPacket buildPacket(uint playerActorId, Item[] equipment, List slotsToUpdate, ref int listOffset) { - for (int i = 0; i < equipment.Length; i++) - equipment[i] = UNEQUIPPED; //We will use this as "Unequipped" - } - - public void setItem(int slot, uint itemSlot) - { - if (slot >= equipment.Length) - return; - - equipment[slot] = itemSlot; - } - - public List buildPackets(uint playerActorID) - { - List packets = new List(); - int packetCount = 0; - int runningCount = 0; byte[] data = new byte[PACKET_SIZE - 0x20]; - MemoryStream mem = new MemoryStream(data); - BinaryWriter binWriter = new BinaryWriter(mem); - for (int i = 0; i < equipment.Length; i++) + using (MemoryStream mem = new MemoryStream(data)) { - if (equipment[i] == UNEQUIPPED) - continue; - - binWriter.Write((UInt16)i); - binWriter.Write((UInt32)equipment[i]); - - packetCount++; - runningCount++; - - //Create another packet - if (runningCount >= 32) + using (BinaryWriter binWriter = new BinaryWriter(mem)) { - packetCount = 0; - binWriter.Write((UInt32)8); - binWriter.Dispose(); - mem.Dispose(); - packets.Add(new SubPacket(OPCODE, playerActorID, playerActorID, data)); - data = new byte[PACKET_SIZE - 0x20]; - mem = new MemoryStream(data); - binWriter = new BinaryWriter(mem); + int max; + if (slotsToUpdate.Count - listOffset <= 32) + max = slotsToUpdate.Count - listOffset; + else + max = 32; + + for (int i = 0; i < max; i++) + { + binWriter.Write((UInt16)slotsToUpdate[i]); + binWriter.Write((UInt32)equipment[slotsToUpdate[i]].slot); + listOffset++; + } + } } - //Create any leftover subpacket - binWriter.BaseStream.Seek(0x30, SeekOrigin.Begin); - binWriter.Write((UInt32)packetCount); - binWriter.Dispose(); - mem.Dispose(); - packets.Add(new SubPacket(OPCODE, playerActorID, playerActorID, data)); - - return packets; - } + return new SubPacket(OPCODE, playerActorId, playerActorId, data); + } } } diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX64Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX64Packet.cs index ed1e8b2e..88a34f4f 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX64Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentListX64Packet.cs @@ -1,4 +1,5 @@ using FFXIVClassic_Lobby_Server.packets; +using FFXIVClassic_Map_Server.dataobjects; using System; using System.Collections.Generic; using System.IO; @@ -13,85 +14,31 @@ namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory public const ushort OPCODE = 0x151; public const uint PACKET_SIZE = 0x194; - public const uint UNEQUIPPED = 0xFFFFFFFF; - - public const int SLOT_MAINHAND = 0x00; - public const int SLOT_OFFHAND = 0x01; - public const int SLOT_THROWINGWEAPON = 0x04; - public const int SLOT_PACK = 0x05; - public const int SLOT_POUCH = 0x06; - public const int SLOT_HEAD = 0x08; - public const int SLOT_UNDERSHIRT = 0x09; - public const int SLOT_BODY = 0x0A; - public const int SLOT_UNDERGARMENT = 0x0B; - public const int SLOT_LEGS = 0x0C; - public const int SLOT_HANDS = 0x0D; - public const int SLOT_BOOTS = 0x0E; - public const int SLOT_WAIST = 0x0F; - public const int SLOT_NECK = 0x10; - public const int SLOT_EARS = 0x11; - public const int SLOT_WRISTS = 0x13; - public const int SLOT_RIGHTFINGER = 0x15; - public const int SLOT_LEFTFINGER = 0x16; - - private uint[] equipment = new uint[0x17]; - - public EquipmentListX64Packet() + public static SubPacket buildPacket(uint playerActorId, Item[] equipment, List slotsToUpdate, ref int listOffset) { - for (int i = 0; i < equipment.Length; i++) - equipment[i] = UNEQUIPPED; //We will use this as "Unequipped" - } - - public void setItem(int slot, uint itemSlot) - { - if (slot >= equipment.Length) - return; - - equipment[slot] = itemSlot; - } - - public List buildPackets(uint playerActorID) - { - List packets = new List(); - int packetCount = 0; - int runningCount = 0; byte[] data = new byte[PACKET_SIZE - 0x20]; - MemoryStream mem = new MemoryStream(data); - BinaryWriter binWriter = new BinaryWriter(mem); - for (int i = 0; i < equipment.Length; i++) + using (MemoryStream mem = new MemoryStream(data)) { - if (equipment[i] == UNEQUIPPED) - continue; - - binWriter.Write((UInt16)i); - binWriter.Write((UInt32)equipment[i]); - - packetCount++; - runningCount++; - - //Create another packet - if (runningCount >= 64) + using (BinaryWriter binWriter = new BinaryWriter(mem)) { - packetCount = 0; - binWriter.Write((UInt32)8); - binWriter.Dispose(); - mem.Dispose(); - packets.Add(new SubPacket(OPCODE, playerActorID, playerActorID, data)); - data = new byte[PACKET_SIZE - 0x20]; - mem = new MemoryStream(data); - binWriter = new BinaryWriter(mem); + int max; + if (slotsToUpdate.Count - listOffset <= 64) + max = slotsToUpdate.Count - listOffset; + else + max = 64; + + for (int i = 0; i < max; i++) + { + binWriter.Write((UInt16)slotsToUpdate[i]); + binWriter.Write((UInt32)equipment[slotsToUpdate[i]].slot); + listOffset++; + } + } } - //Create any leftover subpacket - binWriter.BaseStream.Seek(0x30, SeekOrigin.Begin); - binWriter.Write((UInt32)packetCount); - binWriter.Dispose(); - mem.Dispose(); - packets.Add(new SubPacket(OPCODE, playerActorID, playerActorID, data)); - - return packets; + return new SubPacket(OPCODE, playerActorId, playerActorId, data); } }