From 511c623dd6c9207cc3b6b373b2f6c89357f80a9e Mon Sep 17 00:00:00 2001 From: Kyle873 Date: Fri, 26 May 2023 03:49:47 -0400 Subject: [PATCH] Namespace refactor, basic Impl for PacketHandlers --- Gameserver/Packet.cs | 55 ++++++++++++++++++++++++++++++++++++++++++- Gameserver/Server.cs | 7 +++--- Gameserver/Session.cs | 3 +-- Program.cs | 3 ++- 4 files changed, 61 insertions(+), 7 deletions(-) diff --git a/Gameserver/Packet.cs b/Gameserver/Packet.cs index 1385368..73cc2e6 100644 --- a/Gameserver/Packet.cs +++ b/Gameserver/Packet.cs @@ -3,8 +3,9 @@ using Common.Resources.Proto; using Newtonsoft.Json; using Common.Utils; using ProtoBuf; +using System.Reflection; -namespace PemukulPaku.Gameserver +namespace PemukulPaku.GameServer { public class Packet { @@ -47,4 +48,56 @@ namespace PemukulPaku.Gameserver } } } + + public class PacketCmdId : Attribute + { + public CmdId Id { get; } + + public PacketCmdId(CmdId id) + { + Id = id; + } + } + + public interface IPacketHandler + { + public void Handle(Session session, Packet packet); + } + + public static class PacketFactory + { + public static readonly Dictionary Handlers = new(); + static readonly Logger c = new("PKT", ConsoleColor.Yellow); + + public static void LoadPacketHandlers() + { + c.Log("Loading Packet Handlers..."); + + IEnumerable classes = from t in Assembly.GetExecutingAssembly().GetTypes() + select t; + + foreach ((Type t, PacketCmdId attr) in from Type? t in classes.ToList() + let attrs = (Attribute[])t.GetCustomAttributes(typeof(PacketCmdId), false) + where attrs.Length > 0 + let attr = (PacketCmdId)attrs[0] + where !Handlers.ContainsKey(attr.Id) + select (t, attr)) + { + Handlers.Add(attr.Id, (IPacketHandler)Activator.CreateInstance(t)); + + c.Log($"Loaded PacketHandler {t.Name} for Packet Type {attr.Id}"); + } + + c.Log("Finished Loading Packet Handlers"); + } + } + + [PacketCmdId(CmdId.PlayerLoginReq)] + public class PlayerLoginReqHandler : IPacketHandler + { + public void Handle(Session session, Packet packet) + { + throw new NotImplementedException(); + } + } } diff --git a/Gameserver/Server.cs b/Gameserver/Server.cs index e07bafc..d1e060a 100644 --- a/Gameserver/Server.cs +++ b/Gameserver/Server.cs @@ -3,7 +3,7 @@ using System.Net; using Common; using Common.Utils; -namespace PemukulPaku.Gameserver +namespace PemukulPaku.GameServer { public class Server { @@ -11,7 +11,8 @@ namespace PemukulPaku.Gameserver public readonly Dictionary Sessions = new(); private static Server? Instance; - public static Server GetInstance() { + public static Server GetInstance() + { return Instance ??= new Server(); } @@ -24,7 +25,7 @@ namespace PemukulPaku.Gameserver { TcpListener Listener = new(IPAddress.Parse("0.0.0.0"), (int)Global.config.Gameserver.Port); - while(true) + while (true) { try { diff --git a/Gameserver/Session.cs b/Gameserver/Session.cs index 1e8395c..6c3d818 100644 --- a/Gameserver/Session.cs +++ b/Gameserver/Session.cs @@ -1,8 +1,7 @@ using System.Net.Sockets; using Common.Utils; -using Newtonsoft.Json; -namespace PemukulPaku.Gameserver +namespace PemukulPaku.GameServer { public class Session { diff --git a/Program.cs b/Program.cs index 4f8e185..9d06f89 100644 --- a/Program.cs +++ b/Program.cs @@ -1,7 +1,7 @@ using Common.Resources.Proto; using Common; using System.Net.NetworkInformation; -using PemukulPaku.Gameserver; +using PemukulPaku.GameServer; namespace PemukulPaku { @@ -19,6 +19,7 @@ namespace PemukulPaku }; new Thread(HttpServer.Program.Main).Start(); + PacketFactory.LoadPacketHandlers(); _ = Server.GetInstance(); Console.Read();