From e3fb581ddf0205567f3ab17855e92d1b7c844710 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=82ngelo=20Tadeucci?= Date: Tue, 15 Jul 2025 12:34:24 -0300 Subject: [PATCH] Fix Npc being stuck after using skill Npc used skill and immediately tried to go back to spawn before skill keyframe ended --- Maple2.Server.Core/Network/Session.cs | 1 + .../Manager/Field/FieldManager/FieldManager.cs | 1 - .../Field/Actor/ActorStateComponent/BattleState.cs | 4 ++-- .../MovementStateStates/MovementState.SkillCast.cs | 9 ++++----- .../MovementStateTasks/MovementState.SkillCastTask.cs | 10 +++++----- .../Model/Field/Actor/ActorStateComponent/TaskState.cs | 4 ++-- Maple2.Server.Game/Model/Field/Actor/FieldNpc.cs | 4 ++-- Maple2.Server.Game/Service/ChannelService.Heartbeat.cs | 1 - Maple2.Server.Game/Trigger/TriggerContext.Cinematic.cs | 2 +- 9 files changed, 17 insertions(+), 19 deletions(-) diff --git a/Maple2.Server.Core/Network/Session.cs b/Maple2.Server.Core/Network/Session.cs index f2439c010..3ea9568fd 100644 --- a/Maple2.Server.Core/Network/Session.cs +++ b/Maple2.Server.Core/Network/Session.cs @@ -281,6 +281,7 @@ private void LogSend(byte[] packet, int length) { case SendOp.RequestHeartbeat: case SendOp.FurnishingInventory: case SendOp.FurnishingStorage: + case SendOp.Vibrate: break; default: Logger.Verbose("{Mode} ({Name} - {OpCode}): {Packet}", "SEND".ColorRed(), opcode, $"0x{op:X4}", packet.ToHexString(length, ' ')); diff --git a/Maple2.Server.Game/Manager/Field/FieldManager/FieldManager.cs b/Maple2.Server.Game/Manager/Field/FieldManager/FieldManager.cs index 65506f8c7..f1f8de29c 100644 --- a/Maple2.Server.Game/Manager/Field/FieldManager/FieldManager.cs +++ b/Maple2.Server.Game/Manager/Field/FieldManager/FieldManager.cs @@ -27,7 +27,6 @@ using Maple2.Tools.DotRecast; using Maple2.Tools.Extensions; using Maple2.Tools.Scheduler; -using Maple2.Tools.VectorMath; using Serilog; namespace Maple2.Server.Game.Manager.Field; diff --git a/Maple2.Server.Game/Model/Field/Actor/ActorStateComponent/BattleState.cs b/Maple2.Server.Game/Model/Field/Actor/ActorStateComponent/BattleState.cs index 4307e48e6..c3be812ce 100644 --- a/Maple2.Server.Game/Model/Field/Actor/ActorStateComponent/BattleState.cs +++ b/Maple2.Server.Game/Model/Field/Actor/ActorStateComponent/BattleState.cs @@ -69,13 +69,13 @@ public void Update(long tickCount) { actor.AppendDebugMessage($"Lost target '{GetTargetName()}'\n"); Target = null; - if (actor is FieldPet pet && pet.OwnerId == 0) { + if (actor is FieldPet { OwnerId: 0 } pet) { actor.Field.Broadcast(PetPacket.SyncTaming(0, pet)); } } if (CanBattle && TargetId == 0 && nextTargetSearchTick <= tickCount) { - if (actor is FieldPet pet && pet.OwnerId == 0 && pet.TamingPoint <= 0) { + if (actor is FieldPet { OwnerId: 0, TamingPoint: <= 0 }) { return; } FindNewTarget(); diff --git a/Maple2.Server.Game/Model/Field/Actor/ActorStateComponent/MovementStateStates/MovementState.SkillCast.cs b/Maple2.Server.Game/Model/Field/Actor/ActorStateComponent/MovementStateStates/MovementState.SkillCast.cs index 46b7c0474..db303c8e5 100644 --- a/Maple2.Server.Game/Model/Field/Actor/ActorStateComponent/MovementStateStates/MovementState.SkillCast.cs +++ b/Maple2.Server.Game/Model/Field/Actor/ActorStateComponent/MovementStateStates/MovementState.SkillCast.cs @@ -7,7 +7,7 @@ namespace Maple2.Server.Game.Model.ActorStateComponent; public partial class MovementState { private SkillRecord? castSkill = null; - private NpcTask? castTask = null; + public NpcTask? CastTask { get; private set; } = null; private Vector3 castMoveOffset; private string castMoveStartKeyframe; private string castMoveEndKeyframe; @@ -16,7 +16,7 @@ public partial class MovementState { public void StateSkillEvent(string keyName) { if (castSkill is null) { - castTask?.Cancel(); + CastTask?.Cancel(); return; } @@ -55,13 +55,12 @@ public void StateSkillEvent(string keyName) { int motionCount = castSkill.Metadata.Data.Motions.Length; byte motion = castSkill.MotionPoint; - if (castTask is NpcSkillCastTask task && motion + 1 < motionCount) { + if (CastTask is NpcSkillCastTask task && motion + 1 < motionCount) { SkillCast(task, castSkill!.SkillId, castSkill!.Level, 0, (byte) (motion + 1)); - return; } - castTask?.Completed(); + CastTask?.Completed(); break; case "move0": diff --git a/Maple2.Server.Game/Model/Field/Actor/ActorStateComponent/MovementStateTasks/MovementState.SkillCastTask.cs b/Maple2.Server.Game/Model/Field/Actor/ActorStateComponent/MovementStateTasks/MovementState.SkillCastTask.cs index 67c410a58..0ddd234bf 100644 --- a/Maple2.Server.Game/Model/Field/Actor/ActorStateComponent/MovementStateTasks/MovementState.SkillCastTask.cs +++ b/Maple2.Server.Game/Model/Field/Actor/ActorStateComponent/MovementStateTasks/MovementState.SkillCastTask.cs @@ -8,7 +8,7 @@ namespace Maple2.Server.Game.Model.ActorStateComponent; public partial class MovementState { - class NpcSkillCastTask : NpcTask { + public class NpcSkillCastTask : NpcTask { private readonly MovementState movement; public SkillRecord? Cast; @@ -33,7 +33,7 @@ protected override void TaskResumed() { protected override void TaskFinished(bool isCompleted) { movement.castSkill = null; - movement.castTask = null; + movement.CastTask = null; movement.Idle(); movement.actor.AppendDebugMessage((isCompleted ? "Finished" : "Canceled") + " cast\n"); } @@ -77,8 +77,8 @@ private void SkillCastFaceTarget(SkillRecord cast, IActor target, int faceTarget } private void SkillCast(NpcSkillCastTask task, int id, short level, long uid, byte motion) { - if (castTask != task) { - castTask?.Cancel(); + if (CastTask != task) { + CastTask?.Cancel(); } if (!CanTransitionToState(ActorState.PcSkill)) { @@ -109,7 +109,7 @@ private void SkillCast(NpcSkillCastTask task, int id, short level, long uid, byt SkillCastFaceTarget(cast, actor.BattleState.Target, task.FaceTarget); } - castTask = task; + CastTask = task; castSkill = cast; task.Cast = cast; diff --git a/Maple2.Server.Game/Model/Field/Actor/ActorStateComponent/TaskState.cs b/Maple2.Server.Game/Model/Field/Actor/ActorStateComponent/TaskState.cs index 86f5dca48..e3664f169 100644 --- a/Maple2.Server.Game/Model/Field/Actor/ActorStateComponent/TaskState.cs +++ b/Maple2.Server.Game/Model/Field/Actor/ActorStateComponent/TaskState.cs @@ -13,7 +13,7 @@ public class TaskState { public TaskState(FieldNpc actor) { Actor = actor; - var comparer = Comparer.Create((NpcTaskPriority item1, NpcTaskPriority item2) => item2.CompareTo(item1)); + var comparer = Comparer.Create((item1, item2) => item2.CompareTo(item1)); taskQueue = new PriorityQueue(comparer); runningTasks = new NpcTask?[(int) NpcTaskPriority.Count]; @@ -28,7 +28,7 @@ private NpcTaskStatus QueueTask(NpcTask task) { queued?.Cancel(); - if (taskQueue.TryPeek(out NpcTask? currentTask, out NpcTaskPriority priority) && currentTask.PriorityValue < task.PriorityValue) { + if (taskQueue.TryPeek(out NpcTask? currentTask, out _) && currentTask.PriorityValue < task.PriorityValue) { if (currentTask.CancelOnInterrupt) { currentTask.Cancel(); } else { diff --git a/Maple2.Server.Game/Model/Field/Actor/FieldNpc.cs b/Maple2.Server.Game/Model/Field/Actor/FieldNpc.cs index 93d47b9c1..992607070 100644 --- a/Maple2.Server.Game/Model/Field/Actor/FieldNpc.cs +++ b/Maple2.Server.Game/Model/Field/Actor/FieldNpc.cs @@ -199,7 +199,7 @@ private void DoIdleBehavior(long tickCount) { return; } - if (hasBeenBattling && idleTask is null) { + if (hasBeenBattling && idleTask is null && MovementState.CastTask is null) { Vector3 spawnPoint = Navigation?.GetRandomPatrolPoint() ?? Origin; idleTask = MovementState.TryMoveTo(spawnPoint, false); @@ -330,7 +330,7 @@ public virtual void Animate(string sequenceName, float duration = -1f) { return; } - bool isIdle = sequenceName.Contains("idle", StringComparison.OrdinalIgnoreCase); + bool isIdle = sequenceName.Contains("idle", StringComparison.OrdinalIgnoreCase) || sequenceName.Contains("sit", StringComparison.OrdinalIgnoreCase); idleTask = MovementState.TryEmote(sequence.Name, isIdle, duration); } diff --git a/Maple2.Server.Game/Service/ChannelService.Heartbeat.cs b/Maple2.Server.Game/Service/ChannelService.Heartbeat.cs index 1f83f7f26..581e53f48 100644 --- a/Maple2.Server.Game/Service/ChannelService.Heartbeat.cs +++ b/Maple2.Server.Game/Service/ChannelService.Heartbeat.cs @@ -1,7 +1,6 @@ using Grpc.Core; using Maple2.Server.Core.Packets; using Maple2.Server.Game.Session; -using Serilog; namespace Maple2.Server.Game.Service; diff --git a/Maple2.Server.Game/Trigger/TriggerContext.Cinematic.cs b/Maple2.Server.Game/Trigger/TriggerContext.Cinematic.cs index dc4da7bbc..2fbdc96ee 100644 --- a/Maple2.Server.Game/Trigger/TriggerContext.Cinematic.cs +++ b/Maple2.Server.Game/Trigger/TriggerContext.Cinematic.cs @@ -38,7 +38,7 @@ public void SetOnetimeEffect(int id, bool enabled, string path) { } public void SetCinematicUi(int type, string script, bool arg3) { - WarnLog("[SetCinematicUI] type:{Type}, script:{Script}, arg3:{Arg3}", type, script, arg3); + DebugLog("[SetCinematicUI] type:{Type}, script:{Script}, arg3:{Arg3}", type, script, arg3); switch (type) { case 0: Broadcast(CinematicPacket.ToggleUi(false));