Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions Maple2.Server.Game/Manager/Field/FieldManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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.
Expand Down
26 changes: 26 additions & 0 deletions Maple2.Server.Game/Manager/Field/PerformanceStageManager.cs
Original file line number Diff line number Diff line change
@@ -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<PerformanceStageManager>();

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);
}
}
28 changes: 6 additions & 22 deletions Maple2.Server.Game/PacketHandlers/InstrumentHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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);
}
}

Expand Down Expand Up @@ -263,39 +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;
}

// 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);
}
}
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;
}

Expand Down
2 changes: 2 additions & 0 deletions Maple2.Server.Game/Util/ConditionUtil.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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:
Expand Down