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