From fa61e79682ec68864890d40655c0894b71a2909c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=82ngelo=20Tadeucci?= Date: Wed, 9 Jul 2025 02:41:07 -0300 Subject: [PATCH] feat(field): adjust player position when moving through touch portals Modify portal teleportation logic to offset player position when the portal's action type is Touch. This prevents players from spawning exactly on the portal. The offset uses either a default block size or a custom front offset if specified. --- .../Manager/Field/FieldManager/FieldManager.cs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/Maple2.Server.Game/Manager/Field/FieldManager/FieldManager.cs b/Maple2.Server.Game/Manager/Field/FieldManager/FieldManager.cs index ed2e2c3ef..8f9be4641 100644 --- a/Maple2.Server.Game/Manager/Field/FieldManager/FieldManager.cs +++ b/Maple2.Server.Game/Manager/Field/FieldManager/FieldManager.cs @@ -27,6 +27,7 @@ using Maple2.Tools.DotRecast; using Maple2.Tools.Extensions; using Maple2.Tools.Scheduler; +using Maple2.Tools.VectorMath; using Serilog; namespace Maple2.Server.Game.Manager.Field; @@ -550,7 +551,21 @@ public bool UsePortal(GameSession session, int portalId, string password) { if (srcPortal.TargetMapId == MapId) { if (TryGetPortal(srcPortal.TargetPortalId, out FieldPortal? dstPortal)) { - session.Send(PortalPacket.MoveByPortal(session.Player, dstPortal)); + Vector3 position = dstPortal.Position; + Vector3 rotation = dstPortal.Rotation; + + if (dstPortal.Value.ActionType is PortalActionType.Touch) { + // add one blocks or use offset in the direction of front axis + float offset = Constant.BlockSize; + if (dstPortal.Value.FrontOffset != 0) { + offset = dstPortal.Value.FrontOffset; + } + + Vector3 forward = dstPortal.Transform.FrontAxis; + + position += forward * offset; + } + session.Send(PortalPacket.MoveByPortal(session.Player, position, rotation)); } return true;