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;
+ }
+
+ }
+}