From 1585cad39a6c57c9ce7018398b709009cf202cfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=82ngelo=20Tadeucci?= Date: Fri, 13 Feb 2026 17:45:02 -0300 Subject: [PATCH] Fix direction knock back for region skills --- Maple2.Server.Game/Model/Field/Actor/Actor.cs | 21 +++++++++++++++++-- .../Model/Field/Entity/FieldSkill.cs | 3 ++- .../Packets/RegionSkillPacket.cs | 2 +- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/Maple2.Server.Game/Model/Field/Actor/Actor.cs b/Maple2.Server.Game/Model/Field/Actor/Actor.cs index 64349d26e..e799df0b5 100644 --- a/Maple2.Server.Game/Model/Field/Actor/Actor.cs +++ b/Maple2.Server.Game/Model/Field/Actor/Actor.cs @@ -94,10 +94,27 @@ public virtual void ApplyEffect(IActor caster, IActor owner, SkillEffectMetadata } public virtual void ApplyDamage(IActor caster, DamageRecord damage, SkillMetadataAttack attack) { + // Determine the source position. + // For region/trigger skills, the caster is FieldActor at origin - use damage.Position (the skill region's position) instead. + Vector3 sourcePosition = caster.Position; + if (sourcePosition.LengthSquared() < 0.001f && damage.Position.LengthSquared() > 0.001f) { + sourcePosition = damage.Position; + } + var targetRecord = new DamageRecordTarget(this) { - Position = caster.Position, - Direction = caster.Rotation, // Idk why this is wrong + Position = sourcePosition, + Direction = caster.Transform.FrontAxis, }; + + if (attack.Damage.Push != null) { + // Direction should point from source toward the target (the push direction). + Vector3 offset = Position - sourcePosition; + if (offset.LengthSquared() > 0.001f) { + targetRecord.Direction = Vector3.Normalize(offset); + } else if (damage.Direction.LengthSquared() > 0.001f) { + targetRecord.Direction = Vector3.Normalize(damage.Direction); + } + } damage.Targets.TryAdd(ObjectId, targetRecord); if (attack.Damage.Count <= 0) { diff --git a/Maple2.Server.Game/Model/Field/Entity/FieldSkill.cs b/Maple2.Server.Game/Model/Field/Entity/FieldSkill.cs index d1c64e0ac..c9d45a74e 100644 --- a/Maple2.Server.Game/Model/Field/Entity/FieldSkill.cs +++ b/Maple2.Server.Game/Model/Field/Entity/FieldSkill.cs @@ -112,12 +112,13 @@ public override void Update(long tickCount) { SkillMetadataAttack attack = record.Attack; record.TargetUid++; var damage = new DamageRecord(record.Metadata, attack) { - CasterId = Caster.ObjectId, + CasterId = ObjectId, OwnerId = ObjectId, SkillId = Value.Id, Level = Value.Level, MotionPoint = record.MotionPoint, AttackPoint = record.AttackPoint, + Position = Position, Direction = Rotation, }; var targetRecords = new List(); diff --git a/Maple2.Server.Game/Packets/RegionSkillPacket.cs b/Maple2.Server.Game/Packets/RegionSkillPacket.cs index b17583742..f824b68ad 100644 --- a/Maple2.Server.Game/Packets/RegionSkillPacket.cs +++ b/Maple2.Server.Game/Packets/RegionSkillPacket.cs @@ -17,7 +17,7 @@ public static ByteWriter Add(FieldSkill fieldSkill) { var pWriter = Packet.Of(SendOp.RegionSkill); pWriter.Write(Command.Add); pWriter.WriteInt(fieldSkill.ObjectId); - pWriter.WriteInt(fieldSkill.Caster.ObjectId); + pWriter.WriteInt(fieldSkill.ObjectId); pWriter.WriteInt(fieldSkill.NextTick.Truncate32()); pWriter.WriteByte((byte) fieldSkill.Points.Length); foreach (Vector3 point in fieldSkill.Points) {