diff --git a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj
index 85139a2d..db728865 100644
--- a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj
+++ b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj
@@ -124,6 +124,8 @@
+
+
@@ -134,7 +136,7 @@
-
+
diff --git a/FFXIVClassic Map Server/packets/send/Actor/battle/BattleAction.cs b/FFXIVClassic Map Server/packets/send/Actor/battle/BattleAction.cs
new file mode 100644
index 00000000..6e5ae733
--- /dev/null
+++ b/FFXIVClassic Map Server/packets/send/Actor/battle/BattleAction.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FFXIVClassic_Map_Server.packets.send.actor.battle
+{
+ class BattleAction
+ {
+ public uint targetId;
+ public ushort amount;
+ public ushort worldMasterTextId;
+ public uint effectId;
+ public byte param;
+ public byte unknown;
+ }
+}
diff --git a/FFXIVClassic Map Server/packets/send/Actor/DoBattleActionPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX01Packet.cs
similarity index 84%
rename from FFXIVClassic Map Server/packets/send/Actor/DoBattleActionPacket.cs
rename to FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX01Packet.cs
index 0f7f75d2..5a8d7af4 100644
--- a/FFXIVClassic Map Server/packets/send/Actor/DoBattleActionPacket.cs
+++ b/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX01Packet.cs
@@ -6,14 +6,14 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
-namespace FFXIVClassic_Map_Server.packets.send.actor
+namespace FFXIVClassic_Map_Server.packets.send.actor.battle
{
- class DoBattleActionPacket
+ class BattleActionX01Packet
{
public const ushort OPCODE = 0x0139;
public const uint PACKET_SIZE = 0x58;
- public static SubPacket buildPacket(uint playerActorID, uint sourceActorId, uint targetActorId, uint animationId, uint effectId, ushort worldMasterTextId, ushort commandId, ushort amount, byte dirOrBody)
+ public static SubPacket buildPacket(uint playerActorID, uint sourceActorId, uint targetActorId, uint animationId, uint effectId, ushort worldMasterTextId, ushort commandId, ushort amount, byte param)
{
byte[] data = new byte[PACKET_SIZE - 0x20];
@@ -27,8 +27,7 @@ namespace FFXIVClassic_Map_Server.packets.send.actor
//Missing... last value is float, string in here as well?
binWriter.Seek(0x20, SeekOrigin.Begin);
- binWriter.Write((UInt16)1); //? Crashes if changed
- binWriter.Write((UInt16)0); //?
+ binWriter.Write((UInt32)1); //Num actions (always 1 for this)
binWriter.Write((UInt16)commandId);
binWriter.Write((UInt16)810); //?
@@ -39,7 +38,7 @@ namespace FFXIVClassic_Map_Server.packets.send.actor
binWriter.Write((UInt32)effectId);
- binWriter.Write((Byte)dirOrBody);
+ binWriter.Write((Byte)param);
binWriter.Write((Byte)1); //?
}
}
diff --git a/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX10Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX10Packet.cs
new file mode 100644
index 00000000..c6fb10ed
--- /dev/null
+++ b/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX10Packet.cs
@@ -0,0 +1,63 @@
+using FFXIVClassic_Lobby_Server.packets;
+using FFXIVClassic_Map_Server.packets.send.actor.battle;
+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.battle
+{
+ class BattleActionX10Packet
+ {
+ public const ushort OPCODE = 0x013A;
+ public const uint PACKET_SIZE = 0xD8;
+
+ public static SubPacket buildPacket(uint playerActorID, uint sourceActorId, uint animationId, ushort commandId, BattleAction[] actionList)
+ {
+ byte[] data = new byte[PACKET_SIZE - 0x20];
+
+ using (MemoryStream mem = new MemoryStream(data))
+ {
+ using (BinaryWriter binWriter = new BinaryWriter(mem))
+ {
+ binWriter.Write((UInt32)sourceActorId);
+ binWriter.Write((UInt32)animationId);
+
+ //Missing... last value is float, string in here as well?
+
+ binWriter.Write((UInt32) actionList.Length); //Num actions (always 1 for this)
+ binWriter.Write((UInt16)commandId);
+ binWriter.Write((UInt16)810); //?
+
+ binWriter.Seek(0x20, SeekOrigin.Begin);
+ foreach (BattleAction action in actionList)
+ binWriter.Write((UInt32)action.targetId);
+
+ binWriter.Seek(0x50, SeekOrigin.Begin);
+ foreach (BattleAction action in actionList)
+ binWriter.Write((UInt16)action.amount);
+
+ binWriter.Seek(0x64, SeekOrigin.Begin);
+ foreach (BattleAction action in actionList)
+ binWriter.Write((UInt16)action.worldMasterTextId);
+
+ binWriter.Seek(0x78, SeekOrigin.Begin);
+ foreach (BattleAction action in actionList)
+ binWriter.Write((UInt32)action.effectId);
+
+ binWriter.Seek(0xA0, SeekOrigin.Begin);
+ foreach (BattleAction action in actionList)
+ binWriter.Write((Byte)action.param);
+
+ binWriter.Seek(0xAA, SeekOrigin.Begin);
+ foreach (BattleAction action in actionList)
+ binWriter.Write((Byte)action.unknown);
+ }
+ }
+
+ return new SubPacket(OPCODE, sourceActorId, playerActorID, data);
+ }
+ }
+}
diff --git a/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX18Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX18Packet.cs
new file mode 100644
index 00000000..f05ef6a8
--- /dev/null
+++ b/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX18Packet.cs
@@ -0,0 +1,63 @@
+using FFXIVClassic_Lobby_Server.packets;
+using FFXIVClassic_Map_Server.packets.send.actor.battle;
+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.battle
+{
+ class BattleActionX18Packet
+ {
+ public const ushort OPCODE = 0x013B;
+ public const uint PACKET_SIZE = 0x148;
+
+ public static SubPacket buildPacket(uint playerActorID, uint sourceActorId, uint animationId, ushort commandId, BattleAction[] actionList)
+ {
+ byte[] data = new byte[PACKET_SIZE - 0x20];
+
+ using (MemoryStream mem = new MemoryStream(data))
+ {
+ using (BinaryWriter binWriter = new BinaryWriter(mem))
+ {
+ binWriter.Write((UInt32)sourceActorId);
+ binWriter.Write((UInt32)animationId);
+
+ //Missing... last value is float, string in here as well?
+
+ binWriter.Write((UInt32) actionList.Length); //Num actions (always 1 for this)
+ binWriter.Write((UInt16)commandId);
+ binWriter.Write((UInt16)810); //?
+
+ binWriter.Seek(0x58, SeekOrigin.Begin);
+ foreach (BattleAction action in actionList)
+ binWriter.Write((UInt32)action.targetId);
+
+ binWriter.Seek(0xA0, SeekOrigin.Begin);
+ foreach (BattleAction action in actionList)
+ binWriter.Write((UInt16)action.amount);
+
+ binWriter.Seek(0xC4, SeekOrigin.Begin);
+ foreach (BattleAction action in actionList)
+ binWriter.Write((UInt16)action.worldMasterTextId);
+
+ binWriter.Seek(0xE8, SeekOrigin.Begin);
+ foreach (BattleAction action in actionList)
+ binWriter.Write((UInt32)action.effectId);
+
+ binWriter.Seek(0x130, SeekOrigin.Begin);
+ foreach (BattleAction action in actionList)
+ binWriter.Write((Byte)action.param);
+
+ binWriter.Seek(0x142, SeekOrigin.Begin);
+ foreach (BattleAction action in actionList)
+ binWriter.Write((Byte)action.unknown);
+ }
+ }
+
+ return new SubPacket(OPCODE, sourceActorId, playerActorID, data);
+ }
+ }
+}