From f07c5f77fdd034c7c90c356d55d86557912f0fb2 Mon Sep 17 00:00:00 2001 From: Kei-Luna Date: Sat, 2 May 2026 08:42:57 +0900 Subject: [PATCH] Unlock all difficulty levels of Paradox --- Common/Data/Excel/Rogue3DSeasonExcel.cs | 19 +++++++ Common/Data/GameData.cs | 1 + .../Handlers/Rogue3D/Rogue3DStateHelper.cs | 54 +++++++++++++++++++ .../Handlers/Rogue3D/Rogue3D_CheckOpenAct.cs | 3 +- .../Handlers/Rogue3D/Rogue3D_SelectMode.cs | 3 +- 5 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 Common/Data/Excel/Rogue3DSeasonExcel.cs create mode 100644 GameServer/Server/CallGS/Handlers/Rogue3D/Rogue3DStateHelper.cs diff --git a/Common/Data/Excel/Rogue3DSeasonExcel.cs b/Common/Data/Excel/Rogue3DSeasonExcel.cs new file mode 100644 index 0000000..bca84dc --- /dev/null +++ b/Common/Data/Excel/Rogue3DSeasonExcel.cs @@ -0,0 +1,19 @@ +using Newtonsoft.Json; + +namespace MikuSB.Data.Excel; + +[ResourceEntity("server_10_season.json")] +public class Rogue3DSeasonExcel : ExcelResource +{ + [JsonProperty("SeasonID")] public uint SeasonId { get; set; } + [JsonProperty("Type")] public int Type { get; set; } + [JsonProperty("OpenTime")] public string OpenTime { get; set; } = ""; + [JsonProperty("CloseTime")] public string CloseTime { get; set; } = ""; + + public override uint GetId() => SeasonId; + + public override void Loaded() + { + GameData.Rogue3DSeasonData[SeasonId] = this; + } +} diff --git a/Common/Data/GameData.cs b/Common/Data/GameData.cs index 8e538e2..4e6dc33 100644 --- a/Common/Data/GameData.cs +++ b/Common/Data/GameData.cs @@ -16,6 +16,7 @@ public static class GameData public static Dictionary ArItemData { get; private set; } = []; public static Dictionary ManifestationData { get; private set; } = []; public static Dictionary Rogue3DDifficultData { get; private set; } = []; + public static Dictionary Rogue3DSeasonData { get; private set; } = []; public static Dictionary BreakData { get; private set; } = []; public static Dictionary SpineData { get; private set; } = []; public static Dictionary NodeConditionData { get; private set; } = []; diff --git a/GameServer/Server/CallGS/Handlers/Rogue3D/Rogue3DStateHelper.cs b/GameServer/Server/CallGS/Handlers/Rogue3D/Rogue3DStateHelper.cs new file mode 100644 index 0000000..71141ba --- /dev/null +++ b/GameServer/Server/CallGS/Handlers/Rogue3D/Rogue3DStateHelper.cs @@ -0,0 +1,54 @@ +using MikuSB.Data; +using MikuSB.Database.Player; +using MikuSB.GameServer.Game.Player; +using MikuSB.Proto; + +namespace MikuSB.GameServer.Server.CallGS.Handlers.Rogue3D; + +internal static class Rogue3DStateHelper +{ + private const uint GroupId = 124; + private const uint LevelPassStart = 20; + private const uint UnlockDiff1Sid = LevelPassStart + 1; + private const uint UnlockDiff2Sid = LevelPassStart + 2; + private const uint UnlockDiff3Sid = LevelPassStart + 3; + private const uint UnlockDiff4Sid = LevelPassStart + 4; + + public static NtfSyncPlayer EnsureUnlockState(PlayerInstance player) + { + var sync = new NtfSyncPlayer(); + + EnsureMinAttr(player, UnlockDiff1Sid, 1, sync); + EnsureMinAttr(player, UnlockDiff2Sid, 1, sync); + EnsureMinAttr(player, UnlockDiff3Sid, 1, sync); + EnsureMinAttr(player, UnlockDiff4Sid, 1, sync); + + return sync; + } + + private static void EnsureMinAttr(PlayerInstance player, uint sid, uint value, NtfSyncPlayer sync, bool overwrite = false) + { + var attr = player.Data.Attrs.FirstOrDefault(x => x.Gid == GroupId && x.Sid == sid); + if (attr == null) + { + attr = new PlayerAttr { Gid = GroupId, Sid = sid, Val = value }; + player.Data.Attrs.Add(attr); + AddSync(player, sync, sid, value); + return; + } + + if ((!overwrite && attr.Val >= value) || (overwrite && attr.Val == value)) + { + return; + } + + attr.Val = value; + AddSync(player, sync, sid, value); + } + + private static void AddSync(PlayerInstance player, NtfSyncPlayer sync, uint sid, uint value) + { + sync.Custom[player.ToPackedAttrKey(GroupId, sid)] = value; + sync.Custom[player.ToShiftedAttrKey(GroupId, sid)] = value; + } +} diff --git a/GameServer/Server/CallGS/Handlers/Rogue3D/Rogue3D_CheckOpenAct.cs b/GameServer/Server/CallGS/Handlers/Rogue3D/Rogue3D_CheckOpenAct.cs index 14947af..e405a62 100644 --- a/GameServer/Server/CallGS/Handlers/Rogue3D/Rogue3D_CheckOpenAct.cs +++ b/GameServer/Server/CallGS/Handlers/Rogue3D/Rogue3D_CheckOpenAct.cs @@ -8,6 +8,7 @@ public class Rogue3D_CheckOpenAct : ICallGSHandler { public async Task Handle(Connection connection, string param, ushort seqNo) { - await CallGSRouter.SendScript(connection, "Rogue3D_CheckOpenAct", "{\"bOpen\":true}"); + var sync = Rogue3DStateHelper.EnsureUnlockState(connection.Player!); + await CallGSRouter.SendScript(connection, "Rogue3D_CheckOpenAct", "{\"bOpen\":true}", sync); } } diff --git a/GameServer/Server/CallGS/Handlers/Rogue3D/Rogue3D_SelectMode.cs b/GameServer/Server/CallGS/Handlers/Rogue3D/Rogue3D_SelectMode.cs index 508dc52..67c481c 100644 --- a/GameServer/Server/CallGS/Handlers/Rogue3D/Rogue3D_SelectMode.cs +++ b/GameServer/Server/CallGS/Handlers/Rogue3D/Rogue3D_SelectMode.cs @@ -8,6 +8,7 @@ public class Rogue3D_SelectMode : ICallGSHandler { public async Task Handle(Connection connection, string param, ushort seqNo) { - await CallGSRouter.SendScript(connection, "Rogue3D_SelectMode", "{}"); + var sync = Rogue3DStateHelper.EnsureUnlockState(connection.Player!); + await CallGSRouter.SendScript(connection, "Rogue3D_SelectMode", "{}", sync); } }