From 5af23a8113b5869980f9da823a15d41af2bd3865 Mon Sep 17 00:00:00 2001 From: Naruse <71993948+DevilProMT@users.noreply.github.com> Date: Wed, 29 Apr 2026 00:47:21 +0800 Subject: [PATCH] unlock more stage for operation --- Common/Data/Excel/DailyLevelExcel.cs | 14 ++++ Common/Data/GameData.cs | 2 + GameServer/Game/Player/PlayerInstance.cs | 67 +++++++++++-------- .../Handlers/Daily/Daily_SetSelectSuit.cs | 26 +++++++ .../Packet/Send/Misc/PacketNtfCallScript.cs | 31 ++++++++- 5 files changed, 111 insertions(+), 29 deletions(-) create mode 100644 Common/Data/Excel/DailyLevelExcel.cs create mode 100644 GameServer/Server/CallGS/Handlers/Daily/Daily_SetSelectSuit.cs diff --git a/Common/Data/Excel/DailyLevelExcel.cs b/Common/Data/Excel/DailyLevelExcel.cs new file mode 100644 index 0000000..12d0974 --- /dev/null +++ b/Common/Data/Excel/DailyLevelExcel.cs @@ -0,0 +1,14 @@ +namespace MikuSB.Data.Excel; + +[ResourceEntity("daily_level.json")] +public class DailyLevelExcel : ExcelResource +{ + public uint ID { get; set; } + + public override uint GetId() => ID; + + public override void Loaded() + { + GameData.DailyLevelData.Add(ID, this); + } +} diff --git a/Common/Data/GameData.cs b/Common/Data/GameData.cs index 48152f4..fabd1fe 100644 --- a/Common/Data/GameData.cs +++ b/Common/Data/GameData.cs @@ -20,6 +20,8 @@ public static class GameData public static Dictionary NodeConditionData { get; private set; } = []; public static List SupportCardData { get; private set; } = []; public static Dictionary WeaponSkinData { get; private set; } = []; + public static Dictionary DailyLevelData { get; private set; } = []; + } public static class GameResourceTemplateId diff --git a/GameServer/Game/Player/PlayerInstance.cs b/GameServer/Game/Player/PlayerInstance.cs index e8f9a72..1dc1137 100644 --- a/GameServer/Game/Player/PlayerInstance.cs +++ b/GameServer/Game/Player/PlayerInstance.cs @@ -79,34 +79,6 @@ public class PlayerInstance(PlayerGameData data) await LineupManager.UpdateLineup(1, selected[0], selected[1], selected[2],false); - var bootstrapAttrs = BuildLobbyBootstrapAttrs(); - var existingAttrs = Data.Attrs - .ToDictionary(x => (x.Gid, x.Sid)); - var seenAttrs = new HashSet<(uint Gid, uint Sid)>(); - - foreach (var (gid, sid, value) in bootstrapAttrs) - { - if (!seenAttrs.Add((gid, sid))) - continue; - - if (existingAttrs.TryGetValue((gid, sid), out var attr)) - { - if (attr.Val < value) - attr.Val = value; - - continue; - } - - var newAttr = new PlayerAttr - { - Gid = gid, - Sid = sid, - Val = value - }; - - Data.Attrs.Add(newAttr); - existingAttrs[(gid, sid)] = newAttr; - } }); t.Wait(); @@ -226,6 +198,7 @@ public class PlayerInstance(PlayerGameData data) public Proto.Player ToPlayerProto() { + BuildPlayerAttr(); var displayName = PlayerGameData.NormalizeDisplayName(Data.Name); var proto = new Proto.Player { @@ -293,6 +266,38 @@ public class PlayerInstance(PlayerGameData data) return (gid << 16) | sid; } + public void BuildPlayerAttr() + { + var bootstrapAttrs = BuildLobbyBootstrapAttrs(); + var existingAttrs = Data.Attrs + .ToDictionary(x => (x.Gid, x.Sid)); + var seenAttrs = new HashSet<(uint Gid, uint Sid)>(); + + foreach (var (gid, sid, value) in bootstrapAttrs) + { + if (!seenAttrs.Add((gid, sid))) + continue; + + if (existingAttrs.TryGetValue((gid, sid), out var attr)) + { + if (attr.Val < value) + attr.Val = value; + + continue; + } + + var newAttr = new PlayerAttr + { + Gid = gid, + Sid = sid, + Val = value + }; + + Data.Attrs.Add(newAttr); + existingAttrs[(gid, sid)] = newAttr; + } + } + private static IEnumerable<(uint Gid, uint Sid, uint Value)> BuildLobbyBootstrapAttrs() { // GuideLogic uses group 4. Value 999 is safely above every configured step count, @@ -337,6 +342,12 @@ public class PlayerInstance(PlayerGameData data) yield return (22, levelId, 1_700_000_000); } + foreach (var levelId in GameData.DailyLevelData.Keys) + { + yield return (21, levelId, 7); + yield return (22, levelId, 1_700_000_000); + } + // Main Scene 0 mean default scene yield return (132, 1, 0); } diff --git a/GameServer/Server/CallGS/Handlers/Daily/Daily_SetSelectSuit.cs b/GameServer/Server/CallGS/Handlers/Daily/Daily_SetSelectSuit.cs new file mode 100644 index 0000000..2d51857 --- /dev/null +++ b/GameServer/Server/CallGS/Handlers/Daily/Daily_SetSelectSuit.cs @@ -0,0 +1,26 @@ +using System.Text.Json; + +namespace MikuSB.GameServer.Server.CallGS.Handlers.Daily; + +[CallGSApi("Daily_SetSelectSuit")] +public class Daily_SetSelectSuit : ICallGSHandler +{ + + public async Task Handle(Connection connection, string param, ushort seqNo) + { + var req = JsonSerializer.Deserialize(param); + if (req == null) + { + await CallGSRouter.SendScript(connection, "GirlWeaponSkin_Change", "{}"); + return; + } + var rsp = $"{{\"SuitId\":{req.Suit}}}"; + await CallGSRouter.SendScript(connection, "Daily_SetSelectSuit", rsp); + } +} + +internal sealed class GirlWeaponSkinParam +{ + public uint Type { get; set; } + public uint Suit { get; set; } +} diff --git a/GameServer/Server/Packet/Send/Misc/PacketNtfCallScript.cs b/GameServer/Server/Packet/Send/Misc/PacketNtfCallScript.cs index 7486522..0fde531 100644 --- a/GameServer/Server/Packet/Send/Misc/PacketNtfCallScript.cs +++ b/GameServer/Server/Packet/Send/Misc/PacketNtfCallScript.cs @@ -1,6 +1,6 @@ using MikuSB.Database.Character; using MikuSB.Database.Inventory; -using MikuSB.GameServer.Game.Inventory; +using MikuSB.GameServer.Game.Player; using MikuSB.Proto; using MikuSB.TcpSharp; @@ -84,4 +84,33 @@ public class PacketNtfCallScript : BasePacket proto.ExtraSync = extraSync; SetData(proto); } + + public PacketNtfCallScript(PlayerInstance Player) : base(CmdIds.NtfScript) + { + Player.BuildPlayerAttr(); + var proto = new NtfCallScript + { + Api = "", + Arg = "{}" + }; + var sync = new NtfSyncPlayer(); + foreach (var x in Player.Data.Attrs) + { + uint gid = x.Gid; + uint sid = x.Sid; + uint val = x.Val; + + if (gid == 0) + { + sync.Custom[sid] = val; + continue; + } + + sync.Custom[Player.ToPackedAttrKey(gid, sid)] = val; + sync.Custom[Player.ToShiftedAttrKey(gid, sid)] = val; + } + proto.ExtraSync = sync; + + SetData(proto); + } }