This commit is contained in:
Kei-Luna
2026-04-22 05:31:08 +09:00
parent fe3c871992
commit 2a961704a8
6 changed files with 89 additions and 1 deletions

View File

@@ -0,0 +1,7 @@
namespace MikuSB.GameServer.Server.CallGS;
[AttributeUsage(AttributeTargets.Class)]
public class CallGSApiAttribute(string api) : Attribute
{
public string Api { get; } = api;
}

View File

@@ -0,0 +1,46 @@
using MikuSB.Proto;
using MikuSB.Util;
using System.Reflection;
namespace MikuSB.GameServer.Server.CallGS;
public static class CallGSRouter
{
private static readonly Logger Logger = new("CallGS");
private static readonly Dictionary<string, ICallGSHandler> Handlers = [];
public static void Init()
{
foreach (var type in Assembly.GetExecutingAssembly().GetTypes())
{
var attr = type.GetCustomAttribute<CallGSApiAttribute>();
if (attr == null) continue;
Handlers[attr.Api] = (ICallGSHandler)Activator.CreateInstance(type)!;
}
Logger.Info($"Registered {Handlers.Count} CallGS handlers.");
}
public static async Task Route(Connection connection, ReqCallGS req, ushort seqNo)
{
if (Handlers.TryGetValue(req.Api, out var handler))
{
try
{
await handler.Handle(connection, req.Param, seqNo);
}
catch (Exception e)
{
Logger.Error($"[{req.Api}] {e.Message}", e);
}
return;
}
Logger.Error($"No handler for CallGS API: {req.Api}");
}
public static async Task SendScript(Connection connection, string api, string arg, ushort seqNo = 0)
{
var rsp = new NtfCallScript { Api = api, Arg = arg };
await connection.SendPacket(CmdIds.RspCallGS, rsp, seqNo);
}
}

View File

@@ -0,0 +1,13 @@
namespace MikuSB.GameServer.Server.CallGS.Handlers.Achievement;
[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
await CallGSRouter.SendScript(connection, "Achievement_GetReward", "{}", seqNo);
}
}

View File

@@ -0,0 +1,6 @@
namespace MikuSB.GameServer.Server.CallGS;
public interface ICallGSHandler
{
Task Handle(Connection connection, string param, ushort seqNo);
}

View File

@@ -0,0 +1,14 @@
using MikuSB.GameServer.Server.CallGS;
using MikuSB.Proto;
namespace MikuSB.GameServer.Server.Packet.Recv.Player;
[Opcode(CmdIds.ReqCallGS)]
public class HandlerReqCallGS : Handler
{
public override async Task OnHandle(Connection connection, byte[] data, ushort seqNo)
{
var req = ReqCallGS.Parser.ParseFrom(data);
await CallGSRouter.Route(connection, req, seqNo);
}
}