From 0d880b6b7505c798e12333b25177d363bf5c0c74 Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Sun, 7 Feb 2016 15:28:08 -0500 Subject: [PATCH] Figured out most of the battle action packets; 0x139, 0x13a, 0x13b. --- .../FFXIVClassic Map Server.csproj | 4 +- .../packets/send/Actor/battle/BattleAction.cs | 18 ++++++ .../BattleActionX01Packet.cs} | 11 ++-- .../Actor/battle/BattleActionX10Packet.cs | 63 +++++++++++++++++++ .../Actor/battle/BattleActionX18Packet.cs | 63 +++++++++++++++++++ 5 files changed, 152 insertions(+), 7 deletions(-) create mode 100644 FFXIVClassic Map Server/packets/send/Actor/battle/BattleAction.cs rename FFXIVClassic Map Server/packets/send/Actor/{DoBattleActionPacket.cs => battle/BattleActionX01Packet.cs} (84%) create mode 100644 FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX10Packet.cs create mode 100644 FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX18Packet.cs 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); + } + } +}