From 5d65965ec0e512e6f40d29318b6160331507a7d6 Mon Sep 17 00:00:00 2001 From: Filip Maj Date: Tue, 16 May 2017 23:43:07 -0400 Subject: [PATCH] Bug fix on broadcast packet method, filled out what 0x144 does. --- FFXIVClassic Map Server/FFXIVClassic Map Server.csproj | 2 +- FFXIVClassic Map Server/actors/area/Area.cs | 2 +- FFXIVClassic Map Server/actors/chara/Character.cs | 2 +- FFXIVClassic Map Server/actors/chara/npc/Npc.cs | 6 ++++++ FFXIVClassic Map Server/lua/LuaEngine.cs | 8 ++++++-- ...IdleAnimationPacket.cs => SetActorSubStatPacket.cs} | 10 ++++++++-- 6 files changed, 23 insertions(+), 7 deletions(-) rename FFXIVClassic Map Server/packets/send/Actor/{SetActorIdleAnimationPacket.cs => SetActorSubStatPacket.cs} (59%) diff --git a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj index 5d2f424b..39a99994 100644 --- a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj +++ b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj @@ -196,7 +196,7 @@ - + diff --git a/FFXIVClassic Map Server/actors/area/Area.cs b/FFXIVClassic Map Server/actors/area/Area.cs index a6ab5aa0..3b790428 100644 --- a/FFXIVClassic Map Server/actors/area/Area.cs +++ b/FFXIVClassic Map Server/actors/area/Area.cs @@ -355,7 +355,7 @@ namespace FFXIVClassic_Map_Server.Actors if (isIsolated && packet.header.sourceId != a.actorId) continue; - SubPacket clonedPacket = new SubPacket(packet, actor.actorId); + SubPacket clonedPacket = new SubPacket(packet, a.actorId); Player p = (Player)a; p.QueuePacket(clonedPacket); } diff --git a/FFXIVClassic Map Server/actors/chara/Character.cs b/FFXIVClassic Map Server/actors/chara/Character.cs index 6969e069..849f7b81 100644 --- a/FFXIVClassic Map Server/actors/chara/Character.cs +++ b/FFXIVClassic Map Server/actors/chara/Character.cs @@ -81,7 +81,7 @@ namespace FFXIVClassic_Map_Server.Actors public SubPacket CreateIdleAnimationPacket(uint playerActorId) { - return SetActorIdleAnimationPacket.BuildPacket(actorId, playerActorId, animationId); + return SetActorSubStatPacket.BuildPacket(actorId, playerActorId, 0, 0, 0, 0, 0, 0, animationId); } public void SetQuestGraphic(Player player, int graphicNum) diff --git a/FFXIVClassic Map Server/actors/chara/npc/Npc.cs b/FFXIVClassic Map Server/actors/chara/npc/Npc.cs index 148b586a..761ef80c 100644 --- a/FFXIVClassic Map Server/actors/chara/npc/Npc.cs +++ b/FFXIVClassic Map Server/actors/chara/npc/Npc.cs @@ -321,6 +321,12 @@ namespace FFXIVClassic_Map_Server.Actors { return actorClassId; } + + public void ChangeNpcAppearance(uint id) + { + LoadNpcAppearance(id); + zone.BroadcastPacketAroundActor(this, CreateAppearancePacket(actorId)); + } public void LoadNpcAppearance(uint id) { diff --git a/FFXIVClassic Map Server/lua/LuaEngine.cs b/FFXIVClassic Map Server/lua/LuaEngine.cs index b051edc5..65f146d3 100644 --- a/FFXIVClassic Map Server/lua/LuaEngine.cs +++ b/FFXIVClassic Map Server/lua/LuaEngine.cs @@ -405,6 +405,10 @@ namespace FFXIVClassic_Map_Server.lua #region RunGMCommand public static void RunGMCommand(Player player, String cmd, string[] param, bool help = false) { + bool playerNull = player == null; + if (playerNull && param.Length >= 2) + player = Server.GetWorldManager().GetPCInWorld(param[1] + " " + param[2]); + // load from scripts/commands/gm/ directory var path = String.Format("./scripts/commands/gm/{0}.lua", cmd.ToLower()); @@ -490,7 +494,7 @@ namespace FFXIVClassic_Map_Server.lua // we'll push our lua params here List LuaParam = new List(); - var i = 0; + var i = playerNull ? 2 : 0; for (; i < parameters.Length; ++i) { try @@ -526,7 +530,7 @@ namespace FFXIVClassic_Map_Server.lua // the script can double check the player exists, we'll push them anyways LuaParam.Insert(0, player); // push the arg count too - LuaParam.Insert(1, i); + LuaParam.Insert(1, i - (playerNull ? 2 : 0)); // run the script //script.Call(script.Globals["onTrigger"], LuaParam.ToArray()); diff --git a/FFXIVClassic Map Server/packets/send/Actor/SetActorIdleAnimationPacket.cs b/FFXIVClassic Map Server/packets/send/Actor/SetActorSubStatPacket.cs similarity index 59% rename from FFXIVClassic Map Server/packets/send/Actor/SetActorIdleAnimationPacket.cs rename to FFXIVClassic Map Server/packets/send/Actor/SetActorSubStatPacket.cs index c63c9cbe..f95f4d7a 100644 --- a/FFXIVClassic Map Server/packets/send/Actor/SetActorIdleAnimationPacket.cs +++ b/FFXIVClassic Map Server/packets/send/Actor/SetActorSubStatPacket.cs @@ -5,12 +5,12 @@ using FFXIVClassic.Common; namespace FFXIVClassic_Map_Server.packets.send.actor { - class SetActorIdleAnimationPacket + class SetActorSubStatPacket { public const ushort OPCODE = 0x144; public const uint PACKET_SIZE = 0x28; - public static SubPacket BuildPacket(uint playerActorID, uint targetID, uint idleAnimationId) + public static SubPacket BuildPacket(uint playerActorID, uint targetID, byte breakage, int leftChant, int rightChant, int guard, int wasteStat, int statMode, uint idleAnimationId) { byte[] data = new byte[PACKET_SIZE - 0x20]; @@ -19,6 +19,12 @@ namespace FFXIVClassic_Map_Server.packets.send.actor using (BinaryWriter binWriter = new BinaryWriter(mem)) { binWriter.Seek(0x6, SeekOrigin.Begin); + binWriter.Write((byte)breakage); + binWriter.Write((byte)(((leftChant & 0xF) << 8) | (rightChant & 0xF))); + binWriter.Write((byte)(guard & 0xF)); + binWriter.Write((byte)((wasteStat & 0xF) << 8)); + binWriter.Write((byte)(statMode & 0xF)); + binWriter.Write((byte)0); binWriter.Write((UInt16)(idleAnimationId&0xFFFF)); } }