Added several CallGS handlers.

This commit is contained in:
Kei-Luna
2026-04-22 06:03:42 +09:00
parent 2a961704a8
commit 1c2a43fa61
12 changed files with 124 additions and 4 deletions

1
.gitignore vendored
View File

@@ -369,3 +369,4 @@ FodyWeavers.xsd
/GameServer/OriginalProto /GameServer/OriginalProto
*.rar *.rar
/Lua_Script /Lua_Script
/.note

View File

@@ -1,13 +1,14 @@
namespace MikuSB.GameServer.Server.CallGS.Handlers.Achievement; namespace MikuSB.GameServer.Server.CallGS.Handlers.Achievement;
// Client requests a reward for a completed achievement.
// param: {nId}
// Response: {}
[CallGSApi("Achievement_GetReward")] [CallGSApi("Achievement_GetReward")]
public class Achievement_GetReward : ICallGSHandler public class Achievement_GetReward : ICallGSHandler
{ {
public async Task Handle(Connection connection, string param, ushort seqNo) public async Task Handle(Connection connection, string param, ushort seqNo)
{ {
// param: json.encode({nId = nId}) // TODO: validate achievement completion and grant reward items
// TODO: implement reward logic
await CallGSRouter.SendScript(connection, "Achievement_GetReward", "{}", seqNo); await CallGSRouter.SendScript(connection, "Achievement_GetReward", "{}", seqNo);
} }
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,7 +1,7 @@
using MikuSB.GameServer.Server.CallGS; using MikuSB.GameServer.Server.CallGS;
using MikuSB.Proto; using MikuSB.Proto;
namespace MikuSB.GameServer.Server.Packet.Recv.Player; namespace MikuSB.GameServer.Server.Packet.Recv;
[Opcode(CmdIds.ReqCallGS)] [Opcode(CmdIds.ReqCallGS)]
public class HandlerReqCallGS : Handler public class HandlerReqCallGS : Handler