From ceeeb070e9f4e27c1cab4e22b41543c843bc7f36 Mon Sep 17 00:00:00 2001 From: MasterGordon Date: Wed, 26 Oct 2022 14:57:00 +0200 Subject: [PATCH] added remote backend --- multiplayer-game/Program.cs | 4 +-- multiplayer-game/src/MultiPlayerGame.cs | 2 +- multiplayer-game/src/backend/Backend.cs | 32 +++++++++++++++++-- multiplayer-game/src/backend/RemoteBackend.cs | 23 +++++++++++-- multiplayer-game/src/frontend/Frontend.cs | 12 +++++-- multiplayer-game/src/network/Converter.cs | 2 ++ 6 files changed, 64 insertions(+), 11 deletions(-) diff --git a/multiplayer-game/Program.cs b/multiplayer-game/Program.cs index 6a63dee..2b35e03 100644 --- a/multiplayer-game/Program.cs +++ b/multiplayer-game/Program.cs @@ -2,8 +2,8 @@ { static void Main(string[] args) { - // bool isHost = args.Contains("--host"); - bool isHost = true; + bool isHost = args.Contains("--host"); + // bool isHost = true; var game = new MultiPlayerGame(isHost); game.Run(); } diff --git a/multiplayer-game/src/MultiPlayerGame.cs b/multiplayer-game/src/MultiPlayerGame.cs index eb6667c..f9aac14 100644 --- a/multiplayer-game/src/MultiPlayerGame.cs +++ b/multiplayer-game/src/MultiPlayerGame.cs @@ -29,8 +29,8 @@ class MultiPlayerGame : Game window ); } - ctx.Frontend.Init(); ctx.Backend.Init(); + ctx.Frontend.Init(); } protected override void draw() diff --git a/multiplayer-game/src/backend/Backend.cs b/multiplayer-game/src/backend/Backend.cs index 3de3040..f5c46ff 100644 --- a/multiplayer-game/src/backend/Backend.cs +++ b/multiplayer-game/src/backend/Backend.cs @@ -5,13 +5,18 @@ using WatsonTcp; class Backend : IBackend { + private WatsonTcpServer server; + private int nextId = 0; + public void Process(double dt) { + nextId++; var ctx = Context.Get(); ctx.GameState.PlayerPositions.ForEach(player => { player.position += player.movement; }); + this.sendGameState(); } public void ProcessPacket(ValueType packet) @@ -26,6 +31,7 @@ class Backend : IBackend } if (packet is ConnectPacket connectPacket) { + Console.WriteLine($"Player {connectPacket.playerName} connected"); gameState.PlayerPositions.Add(new Player { name = connectPacket.playerName, @@ -33,6 +39,7 @@ class Backend : IBackend movement = new Vector2(0, 0) }); } + this.sendGameState(); } public void Init() @@ -42,7 +49,7 @@ class Backend : IBackend public void Run() { - var server = new WatsonTcpServer("127.0.0.1", 42069); + server = new WatsonTcpServer("127.0.0.1", 42069); server.Events.ClientConnected += this.clientConnected; server.Events.ClientDisconnected += this.clientDisconnected; server.Events.MessageReceived += this.messageReceived; @@ -67,7 +74,26 @@ class Backend : IBackend private void messageReceived(object? sender, MessageReceivedEventArgs args) { - var message = Encoding.UTF8.GetString(args.Data); - Console.WriteLine("Message received: " + args.IpPort + " " + message); + Console.WriteLine("Message Received: " + args.IpPort); + var packet = Converter.ParsePacket(args.Data); + Console.WriteLine("Received packet: " + packet); + if (packet != null) + { + this.ProcessPacket(packet); + } + } + + private void sendGameState() + { + if (server == null) return; + var clients = server.ListClients(); + if (clients.Count() == 0) return; + var gameState = Context.Get().GameState; + var json = JsonConvert.SerializeObject(gameState); + var bytes = Encoding.UTF8.GetBytes(json); + foreach (var client in clients) + { + server.Send(client, bytes); + } } } diff --git a/multiplayer-game/src/backend/RemoteBackend.cs b/multiplayer-game/src/backend/RemoteBackend.cs index a74ac76..2a00ba8 100644 --- a/multiplayer-game/src/backend/RemoteBackend.cs +++ b/multiplayer-game/src/backend/RemoteBackend.cs @@ -1,5 +1,11 @@ +using WatsonTcp; +using Newtonsoft.Json; +using System.Text; + class RemoteBackend : IBackend { + private WatsonTcpClient client; + public void Process(double dt) { @@ -7,11 +13,24 @@ class RemoteBackend : IBackend public void ProcessPacket(ValueType packet) { - throw new NotImplementedException(); + var json = JsonConvert.SerializeObject(packet); + var bytes = Encoding.UTF8.GetBytes(json); + client.Send(bytes); } public void Init() { - + client = new WatsonTcpClient("127.0.0.1", 42069); + client.Events.MessageReceived += (sender, args) => + { + var ctx = Context.Get(); + var message = Encoding.UTF8.GetString(args.Data); + var packet = JsonConvert.DeserializeObject(message); + if (packet != null) + { + ctx.GameState = packet; + } + }; + client.Connect(); } } diff --git a/multiplayer-game/src/frontend/Frontend.cs b/multiplayer-game/src/frontend/Frontend.cs index 57bf481..00e581d 100644 --- a/multiplayer-game/src/frontend/Frontend.cs +++ b/multiplayer-game/src/frontend/Frontend.cs @@ -3,9 +3,12 @@ using static SDL2.SDL; class Frontend : IFrontend { + private string playerName = "Player"; + public void Init() { - var conntectPacket = new ConnectPacket("Gordon"); + this.playerName = Context.Get().IsHost ? "Host" : "Client"; + var conntectPacket = new ConnectPacket(playerName); Context.Get().Backend.ProcessPacket(conntectPacket); } @@ -66,7 +69,7 @@ class Frontend : IFrontend var movement = ctx.FrontendGameState.movementInput; if (movement.Length() > 0) movement = Vector2.Normalize(movement); - ctx.Backend.ProcessPacket(new MovePacket("Gordon", movement)); + ctx.Backend.ProcessPacket(new MovePacket(playerName, movement)); } if (e.key.keysym.scancode == SDL_Scancode.SDL_SCANCODE_ESCAPE) { @@ -75,9 +78,12 @@ class Frontend : IFrontend } ctx.Renderer.Clear(); - ctx.Renderer.SetColor(255, 0, 0, 255); ctx.GameState.PlayerPositions.ForEach(player => { + if (player.name == playerName) + ctx.Renderer.SetColor(0, 0, 255, 255); + else + ctx.Renderer.SetColor(255, 0, 0, 255); ctx.Renderer.DrawRect(player.position.X, player.position.Y, 10, 10); }); ctx.Renderer.Present(); diff --git a/multiplayer-game/src/network/Converter.cs b/multiplayer-game/src/network/Converter.cs index f369b65..9e17c53 100644 --- a/multiplayer-game/src/network/Converter.cs +++ b/multiplayer-game/src/network/Converter.cs @@ -19,9 +19,11 @@ class Converter throw new System.Exception("Packet has no type"); } var packetType = type.Value(); + Console.WriteLine("Packet type: " + packetType); return packetType switch { "move" => parsedRaw.ToObject(), + "connect" => parsedRaw.ToObject(), _ => throw new System.Exception("Unknown packet type") }; }