From 1c2a43fa61d780f7264bf4d29e78aa3bee37e4ac Mon Sep 17 00:00:00 2001 From: Kei-Luna Date: Wed, 22 Apr 2026 06:03:42 +0900 Subject: [PATCH] Added several CallGS handlers. --- .gitignore | 1 + .../Achievement/Achievement_GetReward.cs | 7 ++++--- .../Achievement/Achievement_OnAddSomeOne.cs | 13 +++++++++++++ .../Handlers/Activity/ActivityFace_Update.cs | 14 ++++++++++++++ .../CallGS/Handlers/Activity/Activity_Refresh.cs | 13 +++++++++++++ .../Chapter/Chapter_SyncGuideLevelPassData.cs | 13 +++++++++++++ .../Handlers/Daily/Daily_GetActivityInfo.cs | 13 +++++++++++++ .../CallGS/Handlers/Misc/LanguageChange.cs | 10 ++++++++++ .../CallGS/Handlers/Misc/ZoneTime_ReqTime.cs | 16 ++++++++++++++++ .../Handlers/Preview/ReqEntranceGreenLevel.cs | 13 +++++++++++++ .../Handlers/Shop/ShopLogic_GetOpenTime.cs | 13 +++++++++++++ .../Packet/Recv/{Player => }/HandlerReqCallGS.cs | 2 +- 12 files changed, 124 insertions(+), 4 deletions(-) create mode 100644 GameServer/Server/CallGS/Handlers/Achievement/Achievement_OnAddSomeOne.cs create mode 100644 GameServer/Server/CallGS/Handlers/Activity/ActivityFace_Update.cs create mode 100644 GameServer/Server/CallGS/Handlers/Activity/Activity_Refresh.cs create mode 100644 GameServer/Server/CallGS/Handlers/Chapter/Chapter_SyncGuideLevelPassData.cs create mode 100644 GameServer/Server/CallGS/Handlers/Daily/Daily_GetActivityInfo.cs create mode 100644 GameServer/Server/CallGS/Handlers/Misc/LanguageChange.cs create mode 100644 GameServer/Server/CallGS/Handlers/Misc/ZoneTime_ReqTime.cs create mode 100644 GameServer/Server/CallGS/Handlers/Preview/ReqEntranceGreenLevel.cs create mode 100644 GameServer/Server/CallGS/Handlers/Shop/ShopLogic_GetOpenTime.cs rename GameServer/Server/Packet/Recv/{Player => }/HandlerReqCallGS.cs (86%) diff --git a/.gitignore b/.gitignore index 9197e46..8453c2e 100644 --- a/.gitignore +++ b/.gitignore @@ -369,3 +369,4 @@ FodyWeavers.xsd /GameServer/OriginalProto *.rar /Lua_Script +/.note diff --git a/GameServer/Server/CallGS/Handlers/Achievement/Achievement_GetReward.cs b/GameServer/Server/CallGS/Handlers/Achievement/Achievement_GetReward.cs index eabd406..6933bfc 100644 --- a/GameServer/Server/CallGS/Handlers/Achievement/Achievement_GetReward.cs +++ b/GameServer/Server/CallGS/Handlers/Achievement/Achievement_GetReward.cs @@ -1,13 +1,14 @@ namespace MikuSB.GameServer.Server.CallGS.Handlers.Achievement; +// Client requests a reward for a completed achievement. +// param: {nId} +// Response: {} [CallGSApi("Achievement_GetReward")] public class Achievement_GetReward : ICallGSHandler { public async Task Handle(Connection connection, string param, ushort seqNo) { - // param: json.encode({nId = nId}) - // TODO: implement reward logic - + // TODO: validate achievement completion and grant reward items await CallGSRouter.SendScript(connection, "Achievement_GetReward", "{}", seqNo); } } diff --git a/GameServer/Server/CallGS/Handlers/Achievement/Achievement_OnAddSomeOne.cs b/GameServer/Server/CallGS/Handlers/Achievement/Achievement_OnAddSomeOne.cs new file mode 100644 index 0000000..1cce628 --- /dev/null +++ b/GameServer/Server/CallGS/Handlers/Achievement/Achievement_OnAddSomeOne.cs @@ -0,0 +1,13 @@ +namespace MikuSB.GameServer.Server.CallGS.Handlers.Achievement; + +// Client notifies the server that an achievement trigger condition was met. No response required. +// param: {nType} +[CallGSApi("Achievement_OnAddSomeOne")] +public class Achievement_OnAddSomeOne : ICallGSHandler +{ + public Task Handle(Connection connection, string param, ushort seqNo) + { + // TODO: process achievement progress for the given nType + return Task.CompletedTask; + } +} diff --git a/GameServer/Server/CallGS/Handlers/Activity/ActivityFace_Update.cs b/GameServer/Server/CallGS/Handlers/Activity/ActivityFace_Update.cs new file mode 100644 index 0000000..326e849 --- /dev/null +++ b/GameServer/Server/CallGS/Handlers/Activity/ActivityFace_Update.cs @@ -0,0 +1,14 @@ +namespace MikuSB.GameServer.Server.CallGS.Handlers.Activity; + +// Updates the lobby activity face (presentation effect). +// param: {nType(1=equip, 2=unequip, 3=set flag), nId, bFlag} +// Response: {nFaceId, nId, nType} — nFaceId=0 means no next face +[CallGSApi("ActivityFace_Update")] +public class ActivityFace_Update : ICallGSHandler +{ + public async Task Handle(Connection connection, string param, ushort seqNo) + { + // TODO: process face equip/unequip state and return the next face to display + await CallGSRouter.SendScript(connection, "ActivityFace_Update", "{\"nFaceId\":0,\"nId\":0,\"nType\":0}", seqNo); + } +} diff --git a/GameServer/Server/CallGS/Handlers/Activity/Activity_Refresh.cs b/GameServer/Server/CallGS/Handlers/Activity/Activity_Refresh.cs new file mode 100644 index 0000000..cb10681 --- /dev/null +++ b/GameServer/Server/CallGS/Handlers/Activity/Activity_Refresh.cs @@ -0,0 +1,13 @@ +namespace MikuSB.GameServer.Server.CallGS.Handlers.Activity; + +// Client requests an activity state refresh. No s2c callback registered on client side. +// param: {nId} +[CallGSApi("Activity_Refresh")] +public class Activity_Refresh : ICallGSHandler +{ + public Task Handle(Connection connection, string param, ushort seqNo) + { + // TODO: refresh activity state for the given nId + return Task.CompletedTask; + } +} diff --git a/GameServer/Server/CallGS/Handlers/Chapter/Chapter_SyncGuideLevelPassData.cs b/GameServer/Server/CallGS/Handlers/Chapter/Chapter_SyncGuideLevelPassData.cs new file mode 100644 index 0000000..4e1667e --- /dev/null +++ b/GameServer/Server/CallGS/Handlers/Chapter/Chapter_SyncGuideLevelPassData.cs @@ -0,0 +1,13 @@ +namespace MikuSB.GameServer.Server.CallGS.Handlers.Chapter; + +// Client syncs completed guide level data to the server. No response required. +// param: {tbData = [{nLevelID, passTime}, ...]} +[CallGSApi("Chapter_SyncGuideLevelPassData")] +public class Chapter_SyncGuideLevelPassData : ICallGSHandler +{ + public Task Handle(Connection connection, string param, ushort seqNo) + { + // TODO: persist guide level pass data to player save + return Task.CompletedTask; + } +} diff --git a/GameServer/Server/CallGS/Handlers/Daily/Daily_GetActivityInfo.cs b/GameServer/Server/CallGS/Handlers/Daily/Daily_GetActivityInfo.cs new file mode 100644 index 0000000..e751165 --- /dev/null +++ b/GameServer/Server/CallGS/Handlers/Daily/Daily_GetActivityInfo.cs @@ -0,0 +1,13 @@ +namespace MikuSB.GameServer.Server.CallGS.Handlers.Daily; + +// Returns daily activity info for each activity type. +// Response: {activityId: tbActivity} +[CallGSApi("Daily_GetActivityInfo")] +public class Daily_GetActivityInfo : ICallGSHandler +{ + public async Task Handle(Connection connection, string param, ushort seqNo) + { + // TODO: return actual daily activity data + await CallGSRouter.SendScript(connection, "Daily_GetActivityInfo", "{}", seqNo); + } +} diff --git a/GameServer/Server/CallGS/Handlers/Misc/LanguageChange.cs b/GameServer/Server/CallGS/Handlers/Misc/LanguageChange.cs new file mode 100644 index 0000000..c887d8f --- /dev/null +++ b/GameServer/Server/CallGS/Handlers/Misc/LanguageChange.cs @@ -0,0 +1,10 @@ +namespace MikuSB.GameServer.Server.CallGS.Handlers.Misc; + +// Client notifies the server of its language setting. No response required. +// param: {nType, sLan, sEx} +[CallGSApi("LanguageChange")] +public class LanguageChange : ICallGSHandler +{ + public Task Handle(Connection connection, string param, ushort seqNo) + => Task.CompletedTask; +} diff --git a/GameServer/Server/CallGS/Handlers/Misc/ZoneTime_ReqTime.cs b/GameServer/Server/CallGS/Handlers/Misc/ZoneTime_ReqTime.cs new file mode 100644 index 0000000..53af913 --- /dev/null +++ b/GameServer/Server/CallGS/Handlers/Misc/ZoneTime_ReqTime.cs @@ -0,0 +1,16 @@ +using MikuSB.Util.Extensions; + +namespace MikuSB.GameServer.Server.CallGS.Handlers.Misc; + +// Client requests server time to calculate timezone offset. +// nTime1/nTime2 are DST transition reference timestamps; returning the same value means no offset. +[CallGSApi("ZoneTime_ReqTime")] +public class ZoneTime_ReqTime : ICallGSHandler +{ + public async Task Handle(Connection connection, string param, ushort seqNo) + { + var now = Extensions.GetUnixSec(); + var arg = $"{{\"nTime1\":{now},\"nTime2\":{now}}}"; + await CallGSRouter.SendScript(connection, "ZoneTime_ChangeTime", arg, seqNo); + } +} diff --git a/GameServer/Server/CallGS/Handlers/Preview/ReqEntranceGreenLevel.cs b/GameServer/Server/CallGS/Handlers/Preview/ReqEntranceGreenLevel.cs new file mode 100644 index 0000000..23d0dd0 --- /dev/null +++ b/GameServer/Server/CallGS/Handlers/Preview/ReqEntranceGreenLevel.cs @@ -0,0 +1,13 @@ +namespace MikuSB.GameServer.Server.CallGS.Handlers.Preview; + +// Returns the green (unlocked) level for each skin manifestation. +// Response: [{skinId, greenLevel}, ...] +[CallGSApi("ReqEntranceGreenLevel")] +public class ReqEntranceGreenLevel : ICallGSHandler +{ + public async Task Handle(Connection connection, string param, ushort seqNo) + { + // TODO: return actual skin green levels from player data + await CallGSRouter.SendScript(connection, "ReqEntranceGreenLevel", "[]", seqNo); + } +} diff --git a/GameServer/Server/CallGS/Handlers/Shop/ShopLogic_GetOpenTime.cs b/GameServer/Server/CallGS/Handlers/Shop/ShopLogic_GetOpenTime.cs new file mode 100644 index 0000000..f85f7d1 --- /dev/null +++ b/GameServer/Server/CallGS/Handlers/Shop/ShopLogic_GetOpenTime.cs @@ -0,0 +1,13 @@ +namespace MikuSB.GameServer.Server.CallGS.Handlers.Shop; + +// Returns the open/close timestamps for each shop tab. +// Response: {shopId: {nBegin, nEnd}} +[CallGSApi("ShopLogic_GetOpenTime")] +public class ShopLogic_GetOpenTime : ICallGSHandler +{ + public async Task Handle(Connection connection, string param, ushort seqNo) + { + // TODO: return actual shop open times from config + await CallGSRouter.SendScript(connection, "ShopLogic_GetOpenTime", "{}", seqNo); + } +} diff --git a/GameServer/Server/Packet/Recv/Player/HandlerReqCallGS.cs b/GameServer/Server/Packet/Recv/HandlerReqCallGS.cs similarity index 86% rename from GameServer/Server/Packet/Recv/Player/HandlerReqCallGS.cs rename to GameServer/Server/Packet/Recv/HandlerReqCallGS.cs index b8be93d..05096b4 100644 --- a/GameServer/Server/Packet/Recv/Player/HandlerReqCallGS.cs +++ b/GameServer/Server/Packet/Recv/HandlerReqCallGS.cs @@ -1,7 +1,7 @@ using MikuSB.GameServer.Server.CallGS; using MikuSB.Proto; -namespace MikuSB.GameServer.Server.Packet.Recv.Player; +namespace MikuSB.GameServer.Server.Packet.Recv; [Opcode(CmdIds.ReqCallGS)] public class HandlerReqCallGS : Handler