From 772c272fb4f7ca597bb36a39927e524946e641fe Mon Sep 17 00:00:00 2001 From: Kei-Luna Date: Sun, 24 May 2026 07:11:29 +0900 Subject: [PATCH] ClimbTowerLogic_SetLevelDiff --- Common/Data/Excel/ClimbTowerDiffExcel.cs | 18 +++++ Common/Data/GameData.cs | 1 + .../Tower/ClimbTowerLogic_SetLevelDiff.cs | 76 +++++++++++++++++++ 3 files changed, 95 insertions(+) create mode 100644 Common/Data/Excel/ClimbTowerDiffExcel.cs create mode 100644 GameServer/Server/CallGS/Handlers/Tower/ClimbTowerLogic_SetLevelDiff.cs diff --git a/Common/Data/Excel/ClimbTowerDiffExcel.cs b/Common/Data/Excel/ClimbTowerDiffExcel.cs new file mode 100644 index 0000000..6f89b4d --- /dev/null +++ b/Common/Data/Excel/ClimbTowerDiffExcel.cs @@ -0,0 +1,18 @@ +using Newtonsoft.Json; + +namespace MikuSB.Data.Excel; + +[ResourceEntity("challenge/climbtower/climb_tower_diff.json")] +public class ClimbTowerDiffExcel : ExcelResource +{ + [JsonProperty("ID")] public uint ID { get; set; } + [JsonProperty("Level1")] public int Level1 { get; set; } + [JsonProperty("Level2")] public int Level2 { get; set; } + + public override uint GetId() => ID; + + public override void Loaded() + { + GameData.ClimbTowerDiffData[ID] = this; + } +} diff --git a/Common/Data/GameData.cs b/Common/Data/GameData.cs index 96c5bdb..a1f04af 100644 --- a/Common/Data/GameData.cs +++ b/Common/Data/GameData.cs @@ -34,6 +34,7 @@ public static class GameData public static Dictionary BossPvpBossData { get; private set; } = []; public static Dictionary BossPvpNumData { get; private set; } = []; public static Dictionary ClimbTowerTimeData { get; private set; } = []; + public static Dictionary ClimbTowerDiffData { get; private set; } = []; public static Dictionary> ClimbTowerAwardData { get; private set; } = []; public static Dictionary ClimbTowerLevelOrderData { get; private set; } = []; public static Dictionary TowerLevelData { get; private set; } = []; diff --git a/GameServer/Server/CallGS/Handlers/Tower/ClimbTowerLogic_SetLevelDiff.cs b/GameServer/Server/CallGS/Handlers/Tower/ClimbTowerLogic_SetLevelDiff.cs new file mode 100644 index 0000000..ec96141 --- /dev/null +++ b/GameServer/Server/CallGS/Handlers/Tower/ClimbTowerLogic_SetLevelDiff.cs @@ -0,0 +1,76 @@ +using MikuSB.Data; +using MikuSB.Database; +using MikuSB.Database.Player; +using MikuSB.Proto; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace MikuSB.GameServer.Server.CallGS.Handlers.Tower; + +[CallGSApi("ClimbTowerLogic_SetLevelDiff")] +public class ClimbTowerLogic_SetLevelDiff : ICallGSHandler +{ + private const uint TowerGroupId = 3; + private const uint DiffSid = 4; + private const uint HisDiffSid = 5; + + public async Task Handle(Connection connection, string param, ushort seqNo) + { + var player = connection.Player!; + var req = JsonSerializer.Deserialize(param); + if (req == null || req.Diff <= 0) + { + await CallGSRouter.SendScript(connection, "ClimbTowerLogic_SetLevelDiff", "{\"sErr\":\"error.BadParam\"}"); + return; + } + + if (!GameData.ClimbTowerDiffData.ContainsKey((uint)req.Diff)) + { + await CallGSRouter.SendScript(connection, "ClimbTowerLogic_SetLevelDiff", "{\"sErr\":\"error.BadParam\"}"); + return; + } + + var hisDiff = GetAttrValue(player.Data, TowerGroupId, HisDiffSid); + if (req.Diff > hisDiff + 1) + { + await CallGSRouter.SendScript(connection, "ClimbTowerLogic_SetLevelDiff", "{\"sErr\":\"error.BadParam\"}"); + return; + } + + var diffAttr = GetOrCreateAttr(player.Data, TowerGroupId, DiffSid); + diffAttr.Val = (uint)req.Diff; + + var sync = new NtfSyncPlayer(); + sync.Custom[player.ToPackedAttrKey(diffAttr.Gid, diffAttr.Sid)] = diffAttr.Val; + sync.Custom[player.ToShiftedAttrKey(diffAttr.Gid, diffAttr.Sid)] = diffAttr.Val; + + DatabaseHelper.SaveDatabaseType(player.Data); + await CallGSRouter.SendScript(connection, "ClimbTowerLogic_SetLevelDiff", "{}", sync); + } + + private static uint GetAttrValue(PlayerGameData data, uint gid, uint sid) + { + return data.Attrs.FirstOrDefault(x => x.Gid == gid && x.Sid == sid)?.Val ?? 0; + } + + private static PlayerAttr GetOrCreateAttr(PlayerGameData data, uint gid, uint sid) + { + var attr = data.Attrs.FirstOrDefault(x => x.Gid == gid && x.Sid == sid); + if (attr != null) + return attr; + + attr = new PlayerAttr + { + Gid = gid, + Sid = sid + }; + data.Attrs.Add(attr); + return attr; + } +} + +internal sealed class ClimbTowerSetLevelDiffParam +{ + [JsonPropertyName("nDiff")] + public int Diff { get; set; } +}