From a2d08c573e7bb91e03f705dd7e1ce012880d6f77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=82ngelo=20Tadeucci?= Date: Mon, 17 Feb 2025 06:47:01 -0300 Subject: [PATCH 1/2] Enter Stage simplified & Ensemble condition --- .../PacketHandlers/InstrumentHandler.cs | 28 ++++++++----------- Maple2.Server.Game/Util/ConditionUtil.cs | 2 ++ 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/Maple2.Server.Game/PacketHandlers/InstrumentHandler.cs b/Maple2.Server.Game/PacketHandlers/InstrumentHandler.cs index 956382a96..d16d8be44 100644 --- a/Maple2.Server.Game/PacketHandlers/InstrumentHandler.cs +++ b/Maple2.Server.Game/PacketHandlers/InstrumentHandler.cs @@ -13,6 +13,7 @@ using Maple2.Server.Game.Model; using Maple2.Server.Game.Packets; using Maple2.Server.Game.Session; +using Maple2.Tools.Collision; namespace Maple2.Server.Game.PacketHandlers; @@ -212,6 +213,7 @@ private void HandleJoinEnsemble(GameSession session, IByteReader packet) { memberSession.StagedScoreItem.RemainUses--; memberSession.Field.Broadcast(InstrumentPacket.StartScore(memberSession.Instrument, memberSession.StagedScoreItem)); memberSession.Send(InstrumentPacket.RemainUses(memberSession.StagedScoreItem.Uid, memberSession.StagedScoreItem.RemainUses)); + memberSession.ConditionUpdate(ConditionType.music_play_ensemble); } } @@ -263,39 +265,33 @@ private void HandleViewScore(GameSession session, IByteReader packet) { } private void HandleStartPerform(GameSession session) { - if (session.Field?.MapId != Constant.PerformanceMapId) { + if (session.Field.MapId != Constant.PerformanceMapId) { return; } } private void HandleEndPerform(GameSession session) { - if (session.Field?.MapId != Constant.PerformanceMapId) { + if (session.Field.MapId != Constant.PerformanceMapId) { return; } } private void HandleEnterExitStage(GameSession session) { - if (session.Field?.MapId != Constant.PerformanceMapId) { + if (session.Field.MapId != Constant.PerformanceMapId) { return; } - // TODO: MS2TriggerBox: 6a17cfc1708e492b81896a780e2fecf9 - const float xLo = -3600 - 825; - const float xHi = -3600 + 825; - const float yLo = 7275 - 600; - const float yHi = 7275 + 600; - const float zLo = 2475 - 375; - const float zHi = 2475 + 375; - Vector3 position = session.Player.Position; - if (position.X is > xLo and < xHi && position.Y is > yLo and < yHi && position.Z is > zLo and < zHi) { - session.Field.MoveToPortal(session, 802); - } else { - session.Field.MoveToPortal(session, 803); + session.Field.TriggerObjects.Boxes.TryGetValue(101, out TriggerBox? triggerBox); + if (triggerBox is null) { + return; } + + bool insideStage = triggerBox.Contains(session.Player.Position); + session.Field.MoveToPortal(session, insideStage ? 802 : 803); } private void HandleFireworks(GameSession session) { - if (session.Field?.MapId != Constant.PerformanceMapId) { + if (session.Field.MapId != Constant.PerformanceMapId) { return; } diff --git a/Maple2.Server.Game/Util/ConditionUtil.cs b/Maple2.Server.Game/Util/ConditionUtil.cs index 263ba56ea..01c743e0c 100644 --- a/Maple2.Server.Game/Util/ConditionUtil.cs +++ b/Maple2.Server.Game/Util/ConditionUtil.cs @@ -126,6 +126,7 @@ private static bool CheckCode(this ConditionMetadata.Parameters code, GameSessio case ConditionType.gemstone_putoff: case ConditionType.fish_fail: case ConditionType.music_play_grade: + case ConditionType.music_play_ensemble: case ConditionType.breakable_object: case ConditionType.change_profile: case ConditionType.install_billboard: @@ -222,6 +223,7 @@ private static bool CheckTarget(this ConditionMetadata.Parameters target, GameSe case ConditionType.mastery_grade: case ConditionType.set_mastery_grade: case ConditionType.music_play_grade: + case ConditionType.music_play_ensemble: case ConditionType.item_add: case ConditionType.item_pickup: case ConditionType.beauty_add: From 0db216ae9278aeb983345c16c8faefe45525b160 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=82ngelo=20Tadeucci?= Date: Thu, 20 Feb 2025 12:57:36 -0300 Subject: [PATCH 2/2] PerformanceStageManager --- .../Manager/Field/FieldManager.cs | 5 ++++ .../Manager/Field/PerformanceStageManager.cs | 26 +++++++++++++++++++ .../PacketHandlers/InstrumentHandler.cs | 20 +++----------- 3 files changed, 35 insertions(+), 16 deletions(-) create mode 100644 Maple2.Server.Game/Manager/Field/PerformanceStageManager.cs diff --git a/Maple2.Server.Game/Manager/Field/FieldManager.cs b/Maple2.Server.Game/Manager/Field/FieldManager.cs index 936911636..a46ccdd8b 100644 --- a/Maple2.Server.Game/Manager/Field/FieldManager.cs +++ b/Maple2.Server.Game/Manager/Field/FieldManager.cs @@ -54,6 +54,7 @@ public sealed partial class FieldManager : IDisposable { public readonly MapMetadata Metadata; public readonly MapEntityMetadata Entities; public readonly Navigation Navigation; + public readonly PerformanceStageManager? PerformanceStage; public FieldAccelerationStructure? AccelerationStructure { get; private set; } private readonly UgcMapMetadata ugcMetadata; @@ -94,6 +95,10 @@ public FieldManager(MapMetadata metadata, UgcMapMetadata ugcMetadata, MapEntityM ItemDrop = new ItemDropManager(this); Navigation = new Navigation(metadata.XBlock); + + if (MapId is Constant.PerformanceMapId) { + PerformanceStage = new PerformanceStageManager(this); + } } // Init is separate from constructor to allow properties to be injected first. diff --git a/Maple2.Server.Game/Manager/Field/PerformanceStageManager.cs b/Maple2.Server.Game/Manager/Field/PerformanceStageManager.cs new file mode 100644 index 000000000..d2bd3797b --- /dev/null +++ b/Maple2.Server.Game/Manager/Field/PerformanceStageManager.cs @@ -0,0 +1,26 @@ +using Maple2.Model.Game; +using Maple2.Server.Game.Session; +using Serilog; + +namespace Maple2.Server.Game.Manager.Field; + +// TODO: Queue of players to enter the stage, time limit, etc +public class PerformanceStageManager { + private readonly ILogger logger = Log.Logger.ForContext(); + + private FieldManager Field { get; } + + public PerformanceStageManager(FieldManager field) { + Field = field; + } + + public void EnterExitStage(GameSession session) { + Field.TriggerObjects.Boxes.TryGetValue(101, out TriggerBox? triggerBox); + if (triggerBox is null) { + return; + } + + bool insideStage = triggerBox.Contains(session.Player.Position); + Field.MoveToPortal(session, insideStage ? 802 : 803); + } +} diff --git a/Maple2.Server.Game/PacketHandlers/InstrumentHandler.cs b/Maple2.Server.Game/PacketHandlers/InstrumentHandler.cs index d16d8be44..9b38b201d 100644 --- a/Maple2.Server.Game/PacketHandlers/InstrumentHandler.cs +++ b/Maple2.Server.Game/PacketHandlers/InstrumentHandler.cs @@ -265,33 +265,21 @@ private void HandleViewScore(GameSession session, IByteReader packet) { } private void HandleStartPerform(GameSession session) { - if (session.Field.MapId != Constant.PerformanceMapId) { + if (session.Field.PerformanceStage is null) { return; } } private void HandleEndPerform(GameSession session) { - if (session.Field.MapId != Constant.PerformanceMapId) { + if (session.Field.PerformanceStage is null) { return; } } - private void HandleEnterExitStage(GameSession session) { - if (session.Field.MapId != Constant.PerformanceMapId) { - return; - } - - session.Field.TriggerObjects.Boxes.TryGetValue(101, out TriggerBox? triggerBox); - if (triggerBox is null) { - return; - } - - bool insideStage = triggerBox.Contains(session.Player.Position); - session.Field.MoveToPortal(session, insideStage ? 802 : 803); - } + private void HandleEnterExitStage(GameSession session) => session.Field.PerformanceStage?.EnterExitStage(session); private void HandleFireworks(GameSession session) { - if (session.Field.MapId != Constant.PerformanceMapId) { + if (session.Field.PerformanceStage is null) { return; }