Unlock all difficulty levels of Paradox

This commit is contained in:
Kei-Luna
2026-05-02 08:42:57 +09:00
parent 2883ac3d41
commit f07c5f77fd
5 changed files with 78 additions and 2 deletions

View File

@@ -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;
}
}

View File

@@ -16,6 +16,7 @@ public static class GameData
public static Dictionary<uint, ArItemExcel> ArItemData { get; private set; } = []; public static Dictionary<uint, ArItemExcel> ArItemData { get; private set; } = [];
public static Dictionary<uint, ManifestationExcel> ManifestationData { get; private set; } = []; public static Dictionary<uint, ManifestationExcel> ManifestationData { get; private set; } = [];
public static Dictionary<uint, Rogue3DDifficultExcel> Rogue3DDifficultData { get; private set; } = []; public static Dictionary<uint, Rogue3DDifficultExcel> Rogue3DDifficultData { get; private set; } = [];
public static Dictionary<uint, Rogue3DSeasonExcel> Rogue3DSeasonData { get; private set; } = [];
public static Dictionary<int, BreakExcel> BreakData { get; private set; } = []; public static Dictionary<int, BreakExcel> BreakData { get; private set; } = [];
public static Dictionary<uint, SpineExcel> SpineData { get; private set; } = []; public static Dictionary<uint, SpineExcel> SpineData { get; private set; } = [];
public static Dictionary<uint, NodeConditionExcel> NodeConditionData { get; private set; } = []; public static Dictionary<uint, NodeConditionExcel> NodeConditionData { get; private set; } = [];

View File

@@ -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;
}
}

View File

@@ -8,6 +8,7 @@ public class Rogue3D_CheckOpenAct : ICallGSHandler
{ {
public async Task Handle(Connection connection, string param, ushort seqNo) 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);
} }
} }

View File

@@ -8,6 +8,7 @@ public class Rogue3D_SelectMode : ICallGSHandler
{ {
public async Task Handle(Connection connection, string param, ushort seqNo) 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);
} }
} }