diff --git a/multiplayer-game/Program.cs b/multiplayer-game/Program.cs index 2b35e03..5b2a526 100644 --- a/multiplayer-game/Program.cs +++ b/multiplayer-game/Program.cs @@ -4,7 +4,10 @@ { bool isHost = args.Contains("--host"); // bool isHost = true; - var game = new MultiPlayerGame(isHost); - game.Run(); + // var game = new MultiPlayerGame(isHost); + // game.Run(); + var p = new Publisher(isHost ? InteractorKind.Server : InteractorKind.Client); + p.Dump(); + Console.WriteLine("Hello World!"); } } diff --git a/multiplayer-game/multiplayer-game.csproj b/multiplayer-game/multiplayer-game.csproj index 210c78f..f8c4950 100644 --- a/multiplayer-game/multiplayer-game.csproj +++ b/multiplayer-game/multiplayer-game.csproj @@ -6,6 +6,7 @@ multiplayer-game enable true + link true true enable diff --git a/multiplayer-game/src/backend/Backend.cs b/multiplayer-game/src/backend/Backend.cs index 253a54a..28db107 100644 --- a/multiplayer-game/src/backend/Backend.cs +++ b/multiplayer-game/src/backend/Backend.cs @@ -6,15 +6,21 @@ using WatsonTcp; class Backend : IBackend { private WatsonTcpServer server; + private Queue pendingPackets = new Queue(); public void Process(double dt) { var ctx = Context.Get(); + while (pendingPackets.Count > 0) + { + var packet = pendingPackets.Dequeue(); + this.ProcessPacket(packet); + } ctx.GameState.PlayerPositions.ForEach(player => { player.position += player.movement; }); - this.sendGameState(); + // this.sendGameState(); } public void ProcessPacket(ValueType packet) @@ -83,7 +89,7 @@ class Backend : IBackend Console.WriteLine("Received packet: " + packet); if (packet != null) { - this.ProcessPacket(packet); + pendingPackets.Enqueue(packet); } Console.WriteLine(DateTime.Now - time); } diff --git a/multiplayer-game/src/backend/Publisher.cs b/multiplayer-game/src/backend/Publisher.cs new file mode 100644 index 0000000..b4ce24f --- /dev/null +++ b/multiplayer-game/src/backend/Publisher.cs @@ -0,0 +1,66 @@ +class Publisher +{ + private Dictionary> subscribers = + new Dictionary>(); + private InteractorKind kind; + + public Publisher(InteractorKind kind) + { + this.kind = kind; + this.scan(); + } + + private void scan() + { + var assembly = this.GetType().Assembly; + var types = assembly.GetTypes(); + foreach (var type in types) + { + var attrs = type.GetCustomAttributes(typeof(Interactor), false); + if (attrs.Length == 0) + { + continue; + } + var methods = type.GetMethods(); + foreach (var method in methods) + { + var attrs2 = method.GetCustomAttributes(typeof(Interaction), false); + if (attrs2.Length == 0) + { + continue; + } + var attr = (Interaction)attrs2[0]; + if (attr.Kind != this.kind && attr.Kind != InteractorKind.Hybrid) + { + continue; + } + var del = Delegate.CreateDelegate( + typeof(Action<>).MakeGenericType(method.GetParameters()[0].ParameterType), + method + ); + this.subscribe(attr.Type, del); + } + } + } + + private void subscribe(string type, Delegate callback) + { + if (!subscribers.ContainsKey(type)) + { + subscribers[type] = new HashSet(); + } + subscribers[type].Add(callback); + } + + public void Dump() + { + foreach (var pair in subscribers) + { + Console.WriteLine(pair.Key); + foreach (var del in pair.Value) + { + Console.WriteLine(del); + } + } + } +} diff --git a/multiplayer-game/src/backend/RemoteBackend.cs b/multiplayer-game/src/backend/RemoteBackend.cs index 7da56f6..f4cf16e 100644 --- a/multiplayer-game/src/backend/RemoteBackend.cs +++ b/multiplayer-game/src/backend/RemoteBackend.cs @@ -8,11 +8,11 @@ class RemoteBackend : IBackend public void Process(double dt) { - // var ctx = Context.Get(); - // ctx.GameState.PlayerPositions.ForEach(player => - // { - // player.position += player.movement; - // }); + var ctx = Context.Get(); + ctx.GameState.PlayerPositions.ForEach(player => + { + player.position += player.movement; + }); } public void ProcessPacket(ValueType packet) diff --git a/multiplayer-game/src/backend/interactor/Connect.cs b/multiplayer-game/src/backend/interactor/Connect.cs new file mode 100644 index 0000000..e214e1c --- /dev/null +++ b/multiplayer-game/src/backend/interactor/Connect.cs @@ -0,0 +1,23 @@ +using System.Numerics; + +[Interactor] +class Connect +{ + [Interaction(InteractorKind.Server, "connect")] + public static void ConnectServer(ConnectPacket packet) + { + var ctx = Context.Get(); + var player = ctx.GameState.PlayerPositions.Find(p => p.name == packet.playerName); + if (player == null) + { + ctx.GameState.PlayerPositions.Add( + new Player + { + name = packet.playerName, + position = new Vector2(0, 0), + movement = new Vector2(0, 0) + } + ); + } + } +} diff --git a/multiplayer-game/src/backend/interactor/Move.cs b/multiplayer-game/src/backend/interactor/Move.cs new file mode 100644 index 0000000..14ec141 --- /dev/null +++ b/multiplayer-game/src/backend/interactor/Move.cs @@ -0,0 +1,14 @@ +[Interactor] +class Move +{ + [Interaction(InteractorKind.Hybrid, "move")] + public static void MoveHybrid(MovePacket packet) + { + var ctx = Context.Get(); + var player = ctx.GameState.PlayerPositions.Find(p => p.name == packet.playerName); + if (player != null) + { + player.movement = packet.movement * 4; + } + } +} diff --git a/multiplayer-game/src/engine/system/Events.cs b/multiplayer-game/src/engine/system/Events.cs deleted file mode 100644 index 59089d2..0000000 --- a/multiplayer-game/src/engine/system/Events.cs +++ /dev/null @@ -1,33 +0,0 @@ -[AttributeUsage(AttributeTargets.Method)] -class OnECSEvent : Attribute -{ - public EventPriority Priority = EventPriority.Normal; -} - -class OnTickEvent : OnECSEvent { } - -struct TickEvent -{ - public int Tick; -} - -class OnKeyDownEvent : OnECSEvent -{ - public SDL2.SDL.SDL_Scancode? Scancode; -} - -class KeyEvent -{ - public SDL2.SDL.SDL_Scancode Scancode; - public bool Canceled; -} - -class OnKeyUpEvent : OnECSEvent -{ - public SDL2.SDL.SDL_Scancode? Scancode; -} - -class OnMouseButtonDownEvent : OnECSEvent -{ - public SDL2.SDL.SDL_Scancode? Scancode; -} diff --git a/multiplayer-game/src/engine/system/SystemRegistry.cs b/multiplayer-game/src/engine/system/SystemRegistry.cs deleted file mode 100644 index 871d8e4..0000000 --- a/multiplayer-game/src/engine/system/SystemRegistry.cs +++ /dev/null @@ -1,28 +0,0 @@ -class ECSystemRegistry -{ - private HashSet hybridSystems; - private HashSet clientSystems; - private HashSet serverSystems; - - public ECSystemRegistry() - { - hybridSystems = new HashSet(); - clientSystems = new HashSet(); - serverSystems = new HashSet(); - object obj = new object(); - } - - public void RegisterSystem(object system, ECSystemKind kind) - { - this.GetSystems(kind).Add(system); - } - - public HashSet GetSystems(ECSystemKind kind) => - kind switch - { - ECSystemKind.Hybrid => hybridSystems, - ECSystemKind.Client => clientSystems, - ECSystemKind.Server => serverSystems, - _ => throw new ArgumentException("Invalid ECSystemKind") - }; -} diff --git a/multiplayer-game/src/engine/system/annotations/Interactor.cs b/multiplayer-game/src/engine/system/annotations/Interactor.cs new file mode 100644 index 0000000..0aec9f7 --- /dev/null +++ b/multiplayer-game/src/engine/system/annotations/Interactor.cs @@ -0,0 +1,22 @@ +enum InteractorKind +{ + Client, + Server, + Hybrid +} + +[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] +class Interactor : Attribute { } + +[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] +class Interaction : Attribute +{ + public string Type; + public InteractorKind Kind; + + public Interaction(InteractorKind kind, string type) + { + this.Type = type; + this.Kind = kind; + } +} diff --git a/multiplayer-game/src/engine/system/annotations/Service.cs b/multiplayer-game/src/engine/system/annotations/Service.cs deleted file mode 100644 index 9c7ab27..0000000 --- a/multiplayer-game/src/engine/system/annotations/Service.cs +++ /dev/null @@ -1,17 +0,0 @@ -enum ECSystemKind -{ - Client, - Server, - Hybrid -} - -[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] -class ECSystem : Attribute -{ - public ECSystemKind Kind; - - public ECSystem(ECSystemKind kind) - { - this.Kind = kind; - } -} diff --git a/multiplayer-game/src/frontend/Frontend.cs b/multiplayer-game/src/frontend/Frontend.cs index 0deda32..0b5646d 100644 --- a/multiplayer-game/src/frontend/Frontend.cs +++ b/multiplayer-game/src/frontend/Frontend.cs @@ -21,12 +21,6 @@ class Frontend : IFrontend { System.Environment.Exit(0); } - // Console.WriteLine("new key event"); - // Console.WriteLine(e.key.repeat); - // Console.WriteLine(e.key.keysym.scancode); - // Console.WriteLine(e.key.keysym.sym); - // Console.WriteLine(e.key.keysym.unicode); - // Console.WriteLine(e.type); if (e.type == SDL_EventType.SDL_KEYDOWN && e.key.repeat == 0) { var movementInput = ctx.FrontendGameState.movementInput;