diff --git a/FFXIVClassic Map Server/actors/chara/Character.cs b/FFXIVClassic Map Server/actors/chara/Character.cs index 260d0b0a..522a13e5 100644 --- a/FFXIVClassic Map Server/actors/chara/Character.cs +++ b/FFXIVClassic Map Server/actors/chara/Character.cs @@ -197,7 +197,7 @@ namespace FFXIVClassic_Map_Server.Actors { if (actions.Length - currentIndex >= 18) BattleActionX18Packet.BuildPacket(actorId, animationId, commandId, actions, ref currentIndex); - else if (actions.Length - currentIndex >= 1) + else if (actions.Length - currentIndex > 1) BattleActionX10Packet.BuildPacket(actorId, animationId, commandId, actions, ref currentIndex); else if (actions.Length - currentIndex == 1) { @@ -218,7 +218,7 @@ namespace FFXIVClassic_Map_Server.Actors { if (actions.Count - currentIndex >= 18) BattleActionX18Packet.BuildPacket(actorId, animationId, commandId, actions, ref currentIndex); - else if (actions.Count - currentIndex >= 1) + else if (actions.Count - currentIndex > 1) BattleActionX10Packet.BuildPacket(actorId, animationId, commandId, actions, ref currentIndex); else if (actions.Count - currentIndex == 1) { diff --git a/FFXIVClassic Map Server/actors/chara/ai/BattleCommand.cs b/FFXIVClassic Map Server/actors/chara/ai/BattleCommand.cs index e215a952..b208d207 100644 --- a/FFXIVClassic Map Server/actors/chara/ai/BattleCommand.cs +++ b/FFXIVClassic Map Server/actors/chara/ai/BattleCommand.cs @@ -86,7 +86,7 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai { return (BattleCommand)MemberwiseClone(); } - + public bool IsSpell() { return mpCost != 0 || castTimeSeconds != 0; diff --git a/FFXIVClassic Map Server/actors/chara/ai/state/MagicState.cs b/FFXIVClassic Map Server/actors/chara/ai/state/MagicState.cs index 86127af8..1ca659b0 100644 --- a/FFXIVClassic Map Server/actors/chara/ai/state/MagicState.cs +++ b/FFXIVClassic Map Server/actors/chara/ai/state/MagicState.cs @@ -55,18 +55,15 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state float[] baseCastDuration = { 1.0f, 0.25f }; float spellSpeed = spell.castTimeSeconds; - List packets = new List(); // command casting duration if (owner.currentSubState == SetActorStatePacket.SUB_STATE_PLAYER) { // todo: modify spellSpeed based on modifiers and stuff - // ((Player)owner).SendStartCastBar(spell.id, Utils.UnixTimeStampUTC(DateTime.Now.AddSeconds(spellSpeed))); - + ((Player)owner).SendStartCastbar(spell.id, Utils.UnixTimeStampUTC(DateTime.Now.AddSeconds(spellSpeed))); + owner.DoBattleAction(spell.id, spell.battleAnimation, new BattleAction(target.actorId, 30128, 1, 0, 1)); //You begin casting (6F000002: BLM, 6F000003: WHM) } - // todo: change - - owner.zone.BroadcastPacketsAroundActor(owner, packets); + } } @@ -106,6 +103,11 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state public override void OnComplete() { + if (owner.currentSubState == SetActorStatePacket.SUB_STATE_PLAYER) + { + ((Player)owner).SendEndCastbar(); + } + spell.targetFind.FindWithinArea(target, spell.validTarget); isCompleted = true; @@ -115,14 +117,12 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state var i = 0; foreach (var chara in targets) { - var action = new BattleAction(target.actorId, spell.worldMasterTextId, spell.effectAnimation, 0, (byte) HitDirection.None, 1); + var action = new BattleAction(target.actorId, spell.worldMasterTextId, spell.battleAnimation, 0, (byte) HitDirection.None, 1); action.amount = (ushort)lua.LuaEngine.CallLuaBattleCommandFunction(owner, spell, "magic", "onMagicFinish", owner, chara, spell, action); - actions[i++] = action; - - //packets.Add(BattleActionX01Packet.BuildPacket(chara.actorId, owner.actorId, action.targetId, spell.battleAnimation, action.effectId, action.worldMasterTextId, spell.id, action.amount, action.param)); + actions[i++] = action; } - owner.DoBattleAction(spell.id, spell.effectAnimation, actions); + owner.DoBattleAction(spell.id, spell.battleAnimation, actions); } public override void TryInterrupt() @@ -164,12 +164,8 @@ namespace FFXIVClassic_Map_Server.actors.chara.ai.state public override void Cleanup() { // command casting duration - var packets = new List(); - if (owner.currentSubState == SetActorStatePacket.SUB_STATE_PLAYER) - { - // ((Player)owner).SendStartCastBar(0, 0); - } - owner.zone.BroadcastPacketsAroundActor(owner, packets); + //var packets = new List(); + //owner.zone.BroadcastPacketsAroundActor(owner, packets); } public BattleCommand GetSpell() diff --git a/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX10Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX10Packet.cs index 0c6323c0..04403201 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX10Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX10Packet.cs @@ -11,7 +11,7 @@ namespace FFXIVClassic_Map_Server.packets.send.actor.battle public const ushort OPCODE = 0x013A; public const uint PACKET_SIZE = 0xD8; - public static SubPacket BuildPacket(uint sourceActorId, uint animationId, ushort commandId, BattleAction[] actionList, ref int currentIndex) + public static SubPacket BuildPacket(uint sourceActorId, uint animationId, ushort commandId, BattleAction[] actionList, ref int listOffset) { byte[] data = new byte[PACKET_SIZE - 0x20]; @@ -19,46 +19,54 @@ namespace FFXIVClassic_Map_Server.packets.send.actor.battle { using (BinaryWriter binWriter = new BinaryWriter(mem)) { + int max; + if (actionList.Length - listOffset <= 10) + max = actionList.Length - listOffset; + else + max = 10; + binWriter.Write((UInt32)sourceActorId); binWriter.Write((UInt32)animationId); //Missing... last value is float, string in here as well? binWriter.Seek(0x20, SeekOrigin.Begin); - binWriter.Write((UInt32)actionList.Length); //Num actions (always 1 for this) + binWriter.Write((UInt32)max); //Num actions binWriter.Write((UInt16)commandId); binWriter.Write((UInt16)0x810); //? //binWriter.Seek(0x20, SeekOrigin.Begin); - foreach (BattleAction action in actionList) - binWriter.Write((UInt32)action.targetId); + for (int i = 0; i < max; i++) + binWriter.Write((UInt32)actionList[listOffset + i].targetId); binWriter.Seek(0x50, SeekOrigin.Begin); - foreach (BattleAction action in actionList) - binWriter.Write((UInt16)action.amount); + for (int i = 0; i < max; i++) + binWriter.Write((UInt16)actionList[listOffset + i].amount); binWriter.Seek(0x64, SeekOrigin.Begin); - foreach (BattleAction action in actionList) - binWriter.Write((UInt16)action.worldMasterTextId); + for (int i = 0; i < max; i++) + binWriter.Write((UInt16)actionList[listOffset + i].worldMasterTextId); binWriter.Seek(0x78, SeekOrigin.Begin); - foreach (BattleAction action in actionList) - binWriter.Write((UInt32)action.effectId); + for (int i = 0; i < max; i++) + binWriter.Write((UInt32)actionList[listOffset + i].effectId); binWriter.Seek(0xA0, SeekOrigin.Begin); - foreach (BattleAction action in actionList) - binWriter.Write((Byte)action.param); + for (int i = 0; i < max; i++) + binWriter.Write((Byte)actionList[listOffset + i].param); binWriter.Seek(0xAA, SeekOrigin.Begin); - foreach (BattleAction action in actionList) - binWriter.Write((Byte)action.unknown); + for (int i = 0; i < max; i++) + binWriter.Write((Byte)actionList[listOffset + i].unknown); + + listOffset += max; } } return new SubPacket(OPCODE, sourceActorId, data); } - public static SubPacket BuildPacket(uint sourceActorId, uint animationId, ushort commandId, List actionList, ref int currentIndex) + public static SubPacket BuildPacket(uint sourceActorId, uint animationId, ushort commandId, List actionList, ref int listOffset) { byte[] data = new byte[PACKET_SIZE - 0x20]; @@ -66,39 +74,47 @@ namespace FFXIVClassic_Map_Server.packets.send.actor.battle { using (BinaryWriter binWriter = new BinaryWriter(mem)) { + int max; + if (actionList.Count - listOffset <= 10) + max = actionList.Count - listOffset; + else + max = 10; + binWriter.Write((UInt32)sourceActorId); binWriter.Write((UInt32)animationId); //Missing... last value is float, string in here as well? binWriter.Seek(0x20, SeekOrigin.Begin); - binWriter.Write((UInt32)actionList.Count); //Num actions (always 1 for this) + binWriter.Write((UInt32)max); //Num actions binWriter.Write((UInt16)commandId); binWriter.Write((UInt16)0x810); //? //binWriter.Seek(0x20, SeekOrigin.Begin); - foreach (BattleAction action in actionList) - binWriter.Write((UInt32)action.targetId); + for (int i = 0; i < max; i++) + binWriter.Write((UInt32)actionList[listOffset + i].targetId); binWriter.Seek(0x50, SeekOrigin.Begin); - foreach (BattleAction action in actionList) - binWriter.Write((UInt16)action.amount); + for (int i = 0; i < max; i++) + binWriter.Write((UInt16)actionList[listOffset + i].amount); binWriter.Seek(0x64, SeekOrigin.Begin); - foreach (BattleAction action in actionList) - binWriter.Write((UInt16)action.worldMasterTextId); + for (int i = 0; i < max; i++) + binWriter.Write((UInt16)actionList[listOffset + i].worldMasterTextId); binWriter.Seek(0x78, SeekOrigin.Begin); - foreach (BattleAction action in actionList) - binWriter.Write((UInt32)action.effectId); + for (int i = 0; i < max; i++) + binWriter.Write((UInt32)actionList[listOffset + i].effectId); binWriter.Seek(0xA0, SeekOrigin.Begin); - foreach (BattleAction action in actionList) - binWriter.Write((Byte)action.param); + for (int i = 0; i < max; i++) + binWriter.Write((Byte)actionList[listOffset + i].param); binWriter.Seek(0xAA, SeekOrigin.Begin); - foreach (BattleAction action in actionList) - binWriter.Write((Byte)action.unknown); + for (int i = 0; i < max; i++) + binWriter.Write((Byte)actionList[listOffset + i].unknown); + + listOffset += max; } } diff --git a/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX18Packet.cs b/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX18Packet.cs index cf49f3dd..2fe2279f 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX18Packet.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/battle/BattleActionX18Packet.cs @@ -11,7 +11,7 @@ namespace FFXIVClassic_Map_Server.packets.send.actor.battle public const ushort OPCODE = 0x013B; public const uint PACKET_SIZE = 0x148; - public static SubPacket BuildPacket(uint sourceActorId, uint animationId, ushort commandId, BattleAction[] actionList, ref int currentIndex) + public static SubPacket BuildPacket(uint sourceActorId, uint animationId, ushort commandId, BattleAction[] actionList, ref int listOffset) { byte[] data = new byte[PACKET_SIZE - 0x20]; @@ -19,46 +19,54 @@ namespace FFXIVClassic_Map_Server.packets.send.actor.battle { using (BinaryWriter binWriter = new BinaryWriter(mem)) { + int max; + if (actionList.Length - listOffset <= 18) + max = actionList.Length - listOffset; + else + max = 18; + binWriter.Write((UInt32)sourceActorId); binWriter.Write((UInt32)animationId); //Missing... last value is float, string in here as well? binWriter.Seek(0x20, SeekOrigin.Begin); - binWriter.Write((UInt32)actionList.Length); //Num actions (always 1 for this) + binWriter.Write((UInt32)actionList.Length); //Num actions binWriter.Write((UInt16)commandId); binWriter.Write((UInt16)0x810); //? binWriter.Seek(0x58, SeekOrigin.Begin); - foreach (BattleAction action in actionList) - binWriter.Write((UInt32)action.targetId); - + for (int i = 0; i < max; i++) + binWriter.Write((UInt32)actionList[listOffset + i].targetId); + binWriter.Seek(0xA0, SeekOrigin.Begin); - foreach (BattleAction action in actionList) - binWriter.Write((UInt16)action.amount); + for (int i = 0; i < max; i++) + binWriter.Write((UInt16)actionList[listOffset + i].amount); binWriter.Seek(0xC4, SeekOrigin.Begin); - foreach (BattleAction action in actionList) - binWriter.Write((UInt16)action.worldMasterTextId); + for (int i = 0; i < max; i++) + binWriter.Write((UInt16)actionList[listOffset + i].worldMasterTextId); binWriter.Seek(0xE8, SeekOrigin.Begin); - foreach (BattleAction action in actionList) - binWriter.Write((UInt32)action.effectId); + for (int i = 0; i < max; i++) + binWriter.Write((UInt32)actionList[listOffset + i].effectId); binWriter.Seek(0x130, SeekOrigin.Begin); - foreach (BattleAction action in actionList) - binWriter.Write((Byte)action.param); + for (int i = 0; i < max; i++) + binWriter.Write((Byte)actionList[listOffset + i].param); binWriter.Seek(0x142, SeekOrigin.Begin); - foreach (BattleAction action in actionList) - binWriter.Write((Byte)action.unknown); + for (int i = 0; i < max; i++) + binWriter.Write((Byte)actionList[listOffset + i].unknown); + + listOffset += max; } - } + } return new SubPacket(OPCODE, sourceActorId, data); } - public static SubPacket BuildPacket(uint sourceActorId, uint animationId, ushort commandId, List actionList, ref int currentIndex) + public static SubPacket BuildPacket(uint sourceActorId, uint animationId, ushort commandId, List actionList, ref int listOffset) { byte[] data = new byte[PACKET_SIZE - 0x20]; @@ -66,39 +74,47 @@ namespace FFXIVClassic_Map_Server.packets.send.actor.battle { using (BinaryWriter binWriter = new BinaryWriter(mem)) { + int max; + if (actionList.Count - listOffset <= 18) + max = actionList.Count - listOffset; + else + max = 18; + binWriter.Write((UInt32)sourceActorId); binWriter.Write((UInt32)animationId); //Missing... last value is float, string in here as well? binWriter.Seek(0x20, SeekOrigin.Begin); - binWriter.Write((UInt32)actionList.Count); //Num actions (always 1 for this) + binWriter.Write((UInt32)max); //Num actions binWriter.Write((UInt16)commandId); binWriter.Write((UInt16)0x810); //? binWriter.Seek(0x58, SeekOrigin.Begin); - foreach (BattleAction action in actionList) - binWriter.Write((UInt32)action.targetId); + for (int i = 0; i < max; i++) + binWriter.Write((UInt32)actionList[listOffset + i].targetId); binWriter.Seek(0xA0, SeekOrigin.Begin); - foreach (BattleAction action in actionList) - binWriter.Write((UInt16)action.amount); + for (int i = 0; i < max; i++) + binWriter.Write((UInt16)actionList[listOffset + i].amount); binWriter.Seek(0xC4, SeekOrigin.Begin); - foreach (BattleAction action in actionList) - binWriter.Write((UInt16)action.worldMasterTextId); + for (int i = 0; i < max; i++) + binWriter.Write((UInt16)actionList[listOffset + i].worldMasterTextId); binWriter.Seek(0xE8, SeekOrigin.Begin); - foreach (BattleAction action in actionList) - binWriter.Write((UInt32)action.effectId); + for (int i = 0; i < max; i++) + binWriter.Write((UInt32)actionList[listOffset + i].effectId); binWriter.Seek(0x130, SeekOrigin.Begin); - foreach (BattleAction action in actionList) - binWriter.Write((Byte)action.param); + for (int i = 0; i < max; i++) + binWriter.Write((Byte)actionList[listOffset + i].param); binWriter.Seek(0x142, SeekOrigin.Begin); - foreach (BattleAction action in actionList) - binWriter.Write((Byte)action.unknown); + for (int i = 0; i < max; i++) + binWriter.Write((Byte)actionList[listOffset + i].unknown); + + listOffset += max; } }