From c55145d7150d534c41dda66af9baf4a438b10c3b Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Sat, 20 Oct 2018 13:02:14 -0400 Subject: [PATCH] Added substate modifications to characters. --- FFXIVClassic Map Server/actors/Actor.cs | 43 ++++++++++---- .../actors/chara/Character.cs | 18 ++++-- .../actors/chara/SubState.cs | 56 +++++++++++++++++++ ...tatPacket.cs => SetActorSubStatePacket.cs} | 17 +++--- 4 files changed, 110 insertions(+), 24 deletions(-) create mode 100644 FFXIVClassic Map Server/actors/chara/SubState.cs rename FFXIVClassic Map Server/packets/send/Actor/{SetActorSubStatPacket.cs => SetActorSubStatePacket.cs} (70%) diff --git a/FFXIVClassic Map Server/actors/Actor.cs b/FFXIVClassic Map Server/actors/Actor.cs index 53529efb..24ee9ffb 100644 --- a/FFXIVClassic Map Server/actors/Actor.cs +++ b/FFXIVClassic Map Server/actors/Actor.cs @@ -11,6 +11,7 @@ using System.Reflection; using System.ComponentModel; using FFXIVClassic_Map_Server.packets.send.actor.battle; using FFXIVClassic_Map_Server.packets.send; +using FFXIVClassic_Map_Server.actors.chara; namespace FFXIVClassic_Map_Server.Actors { @@ -21,17 +22,18 @@ namespace FFXIVClassic_Map_Server.Actors Position = 0x01, HpTpMp = 0x02, State = 0x04, - Combat = 0x07, - Name = 0x08, - Appearance = 0x10, - Speed = 0x20, - Work = 0x40, - Stats = 0x80, - Status = 0x100, - StatusTime = 0x200, + SubState = 0x08, + Combat = 0x0F, + Name = 0x10, + Appearance = 0x20, + Speed = 0x40, + Work = 0x80, + Stats = 0x100, + Status = 0x200, + StatusTime = 0x400, - AllNpc = 0x6F, - AllPlayer = 0x9F + AllNpc = 0xDF, + AllPlayer = 0x13F } class Actor @@ -44,7 +46,9 @@ namespace FFXIVClassic_Map_Server.Actors public string customDisplayName; public ushort currentMainState = SetActorStatePacket.MAIN_STATE_PASSIVE; - public ushort currentSubState = SetActorStatePacket.SUB_STATE_NONE; + + public SubState currentSubState = new SubState(); + public float positionX, positionY, positionZ, rotation; public float oldPositionX, oldPositionY, oldPositionZ, oldRotation; public ushort moveState, oldMoveState; @@ -378,6 +382,16 @@ namespace FFXIVClassic_Map_Server.Actors } } + public SubState GetSubState() + { + return currentSubState; + } + + public void SubstateModified() + { + updateFlags |= (ActorUpdateFlags.SubState); + } + public void ModifySpeed(float mod) { for (int i = 0; i < 4; i++) @@ -450,7 +464,12 @@ namespace FFXIVClassic_Map_Server.Actors if ((updateFlags & ActorUpdateFlags.State) != 0) { - packets.Add(SetActorStatePacket.BuildPacket(actorId, currentMainState, currentSubState)); + packets.Add(SetActorStatePacket.BuildPacket(actorId, currentMainState, 0x3B)); + } + + if ((updateFlags & ActorUpdateFlags.SubState) != 0) + { + packets.Add(SetActorSubStatePacket.BuildPacket(actorId, currentSubState)); } updateFlags = ActorUpdateFlags.None; diff --git a/FFXIVClassic Map Server/actors/chara/Character.cs b/FFXIVClassic Map Server/actors/chara/Character.cs index 4aa32d67..c25b2479 100644 --- a/FFXIVClassic Map Server/actors/chara/Character.cs +++ b/FFXIVClassic Map Server/actors/chara/Character.cs @@ -169,7 +169,7 @@ namespace FFXIVClassic_Map_Server.Actors public SubPacket CreateIdleAnimationPacket() { - return SetActorSubStatPacket.BuildPacket(actorId, 0, 0, 0, 0, 0, 0, animationId); + return SetActorSubStatePacket.BuildPacket(actorId, 0, 0, 0, 0, 0, 0, animationId); } public void SetQuestGraphic(Player player, int graphicNum) @@ -221,8 +221,8 @@ namespace FFXIVClassic_Map_Server.Actors public void SendChant(int left, int right) { - SetActorSubStatPacket.BuildPacket(actorId, 0, left, right, 0, 0, 0, 0).DebugPrintSubPacket(); - zone.BroadcastPacketAroundActor(this, SetActorSubStatPacket.BuildPacket(actorId, 0, left, right, 0, 0, 0, 0)); + SetActorSubStatePacket.BuildPacket(actorId, 0, left, right, 0, 0, 0, 0).DebugPrintSubPacket(); + zone.BroadcastPacketAroundActor(this, SetActorSubStatePacket.BuildPacket(actorId, 0, left, right, 0, 0, 0, 0)); } public void DoBattleAction(ushort commandId, uint animationId) @@ -370,7 +370,7 @@ namespace FFXIVClassic_Map_Server.Actors if ((updateFlags & ActorUpdateFlags.State) != 0) { - packets.Add(SetActorStatePacket.BuildPacket(actorId, currentMainState, currentSubState)); + packets.Add(SetActorStatePacket.BuildPacket(actorId, currentMainState, 0x0)); packets.Add(BattleActionX00Packet.BuildPacket(actorId, 0x72000062, 0)); packets.Add(BattleActionX01Packet.BuildPacket(actorId, 0x7C000062, 21001, new BattleAction(actorId, 0, 1))); @@ -378,6 +378,16 @@ namespace FFXIVClassic_Map_Server.Actors //DoBattleAction(21001, 0x7C000062, new BattleAction(this.actorId, 0, 1, 0, 0, 1)); //Attack Mode } + if ((updateFlags & ActorUpdateFlags.SubState) != 0) + { + packets.Add(SetActorSubStatePacket.BuildPacket(actorId, currentSubState)); + packets.Add(BattleActionX00Packet.BuildPacket(actorId, 0x72000062, 0)); + packets.Add(BattleActionX01Packet.BuildPacket(actorId, 0x7C000062, 21001, new BattleAction(actorId, 0, 1))); + + updateFlags &= ~ActorUpdateFlags.SubState; + //DoBattleAction(21001, 0x7C000062, new BattleAction(this.actorId, 0, 1, 0, 0, 1)); //Attack Mode + } + if ((updateFlags & ActorUpdateFlags.Status) != 0) { List statusPackets = statusEffects.GetStatusPackets(); diff --git a/FFXIVClassic Map Server/actors/chara/SubState.cs b/FFXIVClassic Map Server/actors/chara/SubState.cs new file mode 100644 index 00000000..e7e3d8c7 --- /dev/null +++ b/FFXIVClassic Map Server/actors/chara/SubState.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FFXIVClassic_Map_Server.actors.chara +{ + class SubState + { + public byte breakage = 0; + public byte chantId = 0; + public byte guard = 0; + public byte waste = 0; + public byte mode = 0; + public ushort motionPack = 0; + + public void toggleBreak(int index, bool toggle) + { + if (index > 7 || index < 0) + return; + + if (toggle) + breakage = (byte)(breakage | (1 << index)); + else + breakage = (byte)(breakage & ~(1 << index)); + } + + public void setChant(byte chant) { + chantId = chant; + } + + public void setGuard(byte guard) + { + if (guard >= 0 && guard <= 3) + this.guard = guard; + } + + public void setWaste(byte waste) + { + if (waste >= 0 && waste <= 3) + this.waste = waste; + } + + public void setMode(byte bitfield) + { + mode = bitfield; + } + + public void setMotionPack(ushort mp) + { + motionPack = mp; + } + + } +} diff --git a/FFXIVClassic Map Server/packets/send/Actor/SetActorSubStatPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/SetActorSubStatePacket.cs similarity index 70% rename from FFXIVClassic Map Server/packets/send/Actor/SetActorSubStatPacket.cs rename to FFXIVClassic Map Server/packets/send/Actor/SetActorSubStatePacket.cs index 21656303..bbb2b747 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/SetActorSubStatPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/SetActorSubStatePacket.cs @@ -2,10 +2,11 @@ using System.IO; using FFXIVClassic.Common; +using FFXIVClassic_Map_Server.actors.chara; namespace FFXIVClassic_Map_Server.packets.send.actor { - class SetActorSubStatPacket + class SetActorSubStatePacket { public const ushort OPCODE = 0x144; public const uint PACKET_SIZE = 0x28; @@ -21,7 +22,7 @@ namespace FFXIVClassic_Map_Server.packets.send.actor SubStatMotionPack = 0x06, Unknown2 = 0x07, } - public static SubPacket BuildPacket(uint sourceActorId, byte breakage, int leftChant, int rightChant, int guard, int wasteStat, int statMode, uint idleAnimationId) + public static SubPacket BuildPacket(uint sourceActorId, SubState substate) { byte[] data = new byte[PACKET_SIZE - 0x20]; @@ -29,13 +30,13 @@ namespace FFXIVClassic_Map_Server.packets.send.actor { using (BinaryWriter binWriter = new BinaryWriter(mem)) { - binWriter.Write((byte)breakage); - binWriter.Write((byte)(((leftChant & 0xF) << 4) | (rightChant & 0xF))); - binWriter.Write((byte)(guard & 0xF)); - binWriter.Write((byte)(wasteStat)); - binWriter.Write((byte)(statMode)); + binWriter.Write((byte)substate.breakage); + binWriter.Write((byte)substate.chantId); + binWriter.Write((byte)(substate.guard & 0xF)); + binWriter.Write((byte)(substate.waste)); + binWriter.Write((byte)(substate.mode)); binWriter.Write((byte)0); - binWriter.Write((UInt16)(idleAnimationId&0xFFFF)); + binWriter.Write((ushort)substate.motionPack); } }