From 0f80fa12dc780480e39f39e99f114c2476e2cb34 Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Tue, 6 Oct 2015 11:53:40 -0400 Subject: [PATCH] Added new equipment change packet. Renamed ChangeEquipmentPacket to EquipmentChangePacket. Renamed folder Actor to actor. --- .../FFXIVClassic Map Server.csproj | 27 ++--- FFXIVClassic Map Server/PacketProcessor.cs | 14 +-- .../Actor/inventory/ChangeEquipmentPacket.cs | 42 -------- .../Actor/inventory/EquipmentChangePacket.cs | 32 ++++++ .../Actor/inventory/EquipmentSetupPacket.cs | 98 +++++++++++++++++++ 5 files changed, 151 insertions(+), 62 deletions(-) delete mode 100644 FFXIVClassic Map Server/packets/send/Actor/inventory/ChangeEquipmentPacket.cs create mode 100644 FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentChangePacket.cs create mode 100644 FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentSetupPacket.cs diff --git a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj index 70a5ce68..4b216574 100644 --- a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj +++ b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj @@ -76,20 +76,21 @@ - - - - - - - - + + + + + + + + + - - - - - + + + + + diff --git a/FFXIVClassic Map Server/PacketProcessor.cs b/FFXIVClassic Map Server/PacketProcessor.cs index 7d0381f8..79976bae 100644 --- a/FFXIVClassic Map Server/PacketProcessor.cs +++ b/FFXIVClassic Map Server/PacketProcessor.cs @@ -259,13 +259,13 @@ namespace FFXIVClassic_Lobby_Server //client.queuePacket(keyitems); #region equipsetup - SetInitialEquipmentPacket initialEqupmentPacket = new SetInitialEquipmentPacket(); - initialEqupmentPacket.setItem(SetInitialEquipmentPacket.SLOT_BODY, 5); - initialEqupmentPacket.setItem(SetInitialEquipmentPacket.SLOT_HEAD, 3); - initialEqupmentPacket.setItem(SetInitialEquipmentPacket.SLOT_UNDERSHIRT, 6); - initialEqupmentPacket.setItem(SetInitialEquipmentPacket.SLOT_UNDERGARMENT, 7); - initialEqupmentPacket.setItem(SetInitialEquipmentPacket.SLOT_MAINHAND, 2); - initialEqupmentPacket.setItem(SetInitialEquipmentPacket.SLOT_LEGS, 8); + EquipmentSetupPacket initialEqupmentPacket = new EquipmentSetupPacket(); + initialEqupmentPacket.setItem(EquipmentSetupPacket.SLOT_BODY, 5); + initialEqupmentPacket.setItem(EquipmentSetupPacket.SLOT_HEAD, 3); + initialEqupmentPacket.setItem(EquipmentSetupPacket.SLOT_UNDERSHIRT, 6); + initialEqupmentPacket.setItem(EquipmentSetupPacket.SLOT_UNDERGARMENT, 7); + initialEqupmentPacket.setItem(EquipmentSetupPacket.SLOT_MAINHAND, 2); + initialEqupmentPacket.setItem(EquipmentSetupPacket.SLOT_LEGS, 8); #endregion //Equip Init diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/ChangeEquipmentPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/ChangeEquipmentPacket.cs deleted file mode 100644 index b14cd476..00000000 --- a/FFXIVClassic Map Server/packets/send/Actor/inventory/ChangeEquipmentPacket.cs +++ /dev/null @@ -1,42 +0,0 @@ -using FFXIVClassic_Lobby_Server.packets; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory -{ - class ChangeEquipmentPacket - { - public const ushort OPCODE = 0x014D; - public const uint PACKET_SIZE = 0x28; - - public const UInt16 SLOT_MAINHAND = 0x00; - public const UInt16 SLOT_OFFHAND = 0x01; - public const UInt16 SLOT_THROWINGWEAPON = 0x04; - public const UInt16 SLOT_PACK = 0x05; - public const UInt16 SLOT_POUCH = 0x06; - public const UInt16 SLOT_HEAD = 0x08; - public const UInt16 SLOT_UNDERSHIRT = 0x09; - public const UInt16 SLOT_BODY = 0x0A; - public const UInt16 SLOT_UNDERGARMENT = 0x0B; - public const UInt16 SLOT_LEGS = 0x0C; - public const UInt16 SLOT_HANDS = 0x0D; - public const UInt16 SLOT_BOOTS = 0x0E; - public const UInt16 SLOT_WAIST = 0x0F; - public const UInt16 SLOT_NECK = 0x10; - public const UInt16 SLOT_EARS = 0x11; - public const UInt16 SLOT_WRISTS = 0x13; - public const UInt16 SLOT_RIGHTFINGER = 0x15; - public const UInt16 SLOT_LEFTFINGER = 0x16; - - - public static SubPacket buildPacket(uint playerActorID, ushort equipSlot, uint inventorySlot) - { - ulong combined = equipSlot | (inventorySlot << 32); - return new SubPacket(OPCODE, 0, playerActorID, BitConverter.GetBytes(combined)); - } - - } -} diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentChangePacket.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentChangePacket.cs new file mode 100644 index 00000000..6208cef0 --- /dev/null +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentChangePacket.cs @@ -0,0 +1,32 @@ +using FFXIVClassic_Lobby_Server.packets; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory +{ + class EquipmentChangePacket + { + public const ushort OPCODE = 0x014D; + public const uint PACKET_SIZE = 0x28; + + public static SubPacket buildPacket(uint playerActorID, ushort slot, uint itemSlot) + { + byte[] data = new byte[PACKET_SIZE - 0x20]; + + using (MemoryStream mem = new MemoryStream(data)) + { + using (BinaryWriter binWriter = new BinaryWriter(mem)) + { + binWriter.Write((UInt16)slot); + binWriter.Write((UInt32)itemSlot); + } + } + + return new SubPacket(OPCODE, playerActorID, playerActorID, data); + } + } +} diff --git a/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentSetupPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentSetupPacket.cs new file mode 100644 index 00000000..4d8cc3de --- /dev/null +++ b/FFXIVClassic Map Server/packets/send/Actor/inventory/EquipmentSetupPacket.cs @@ -0,0 +1,98 @@ +using FFXIVClassic_Lobby_Server.packets; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FFXIVClassic_Map_Server.packets.send.Actor.inventory +{ + class EquipmentSetupPacket + { + public const ushort OPCODE = 0x014E; + 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 EquipmentSetupPacket() + { + 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++) + { + if (equipment[i] == UNEQUIPPED) + continue; + + binWriter.Write((UInt16)i); + binWriter.Write((UInt32)equipment[i]); + + packetCount++; + runningCount++; + + //Create another packet + if (runningCount >= 8) + { + 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); + } + } + + //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; + } + + } +}