Browse Source

Refactored the NetMsg system

James Peret 2 years ago
parent
commit
2872003cdf

+ 2 - 3
Runtime/Client/ClientBehaviour.cs

@@ -50,7 +50,7 @@ namespace KairoEngine.Multiplayer
         {
             DataStreamWriter writer = new DataStreamWriter();
             m_Driver.BeginSend(m_Connection, out writer);
-            NetMsgController.Serialize(code, netMsg, ref writer, this);
+            NetMsgController.SendData(code, netMsg, ref writer, this);
             m_Driver.EndSend(writer);
         }
 
@@ -88,8 +88,7 @@ namespace KairoEngine.Multiplayer
                 else if (cmd == NetworkEvent.Type.Data)
                 {
                     //if(debug) Debug.Log("Client received data from the server");
-                    uint code = stream.ReadByte();
-                    NetMsgController.Deserialize(code, ref stream, this);
+                    NetMsgController.ReceiveData(ref stream, this);
                 }
                 else if (cmd == NetworkEvent.Type.Disconnect)
                 {

+ 53 - 0
Runtime/NetMsgController.cs

@@ -1,4 +1,5 @@
 using System.Collections;
+using System.Linq;
 using System.Collections.Generic;
 using UnityEngine;
 using Unity.Networking.Transport;
@@ -8,6 +9,55 @@ namespace KairoEngine.Multiplayer
 {
     public static class NetMsgController
     {
+        private static List<NetMsg> netMessageTypes = new List<NetMsg>();
+
+        public static void GetNetMessageTypes()
+        {
+            netMessageTypes = ReflectiveEnumerator.GetEnumerableOfType<NetMsg>()
+                .Where(x => x.code != 0)
+                .Select(x => { return x; })
+                .ToList();
+        }
+
+        public static NetMsg FindWithCode(uint code)
+        {
+            for (int i = 0; i < netMessageTypes.Count; i++)
+            {
+                if(netMessageTypes[i].code == code) return netMessageTypes[i];
+            }
+            return null;
+        }
+
+        public static void ReceiveData(ref DataStreamReader stream, ServerBehaviour server, int clientId) 
+        {
+            uint code = stream.ReadByte();
+            NetMsg msg = FindWithCode(code).ReceiveMessage(server, ref stream, clientId);
+            msg.ReadMessage(server, clientId);
+        }
+
+        public static void ReceiveData(ref DataStreamReader stream, ClientBehaviour client) 
+        {
+            uint code = stream.ReadByte();
+            NetMsg msg = FindWithCode(code).ReceiveMessage(client, ref stream);
+            msg.ReadMessage(client);
+        }
+
+        public static void SendData(uint code, NetMsg netMsg, ref DataStreamWriter writer, ServerBehaviour server, int clientId)
+        {
+            FindWithCode(code).SendMessage(server, netMsg, ref writer, clientId);
+        }
+
+        public static void SendData(uint code, NetMsg netMsg, ref DataStreamWriter writer, ClientBehaviour client)
+        {
+            FindWithCode(code).SendMessage(client, netMsg, ref writer);
+        }
+
+
+
+
+        // Remove rest of the code below
+        /*
+
         public static void Deserialize(uint code, ref DataStreamReader stream, ServerBehaviour server, int clientId = -1) 
             => Deserialize(code, ref stream, server, null, clientId);
 
@@ -43,6 +93,7 @@ namespace KairoEngine.Multiplayer
                         string text = $"Server accepted handshake (playerName = {netHandshakeMsg.playerName})";
                         if(client.debug) Debug.Log(text);
                         NetMsgEvents.Trigger($"{client.eventStreamName}_HandshakeAccepted", text, -1, code, netHandshakeMsg);
+                        
                     }
                     if(server != null)  
                     {
@@ -154,6 +205,8 @@ namespace KairoEngine.Multiplayer
                     break;
             }
         }
+
+        */
     }
 
 }

+ 2 - 3
Runtime/Server/ServerBehaviour.cs

@@ -60,7 +60,7 @@ namespace KairoEngine.Multiplayer
         {
             DataStreamWriter writer = new DataStreamWriter();
             m_Driver.BeginSend(m_Connections[id], out writer);
-            NetMsgController.Serialize(code, netMsg, ref writer, this, id);
+            NetMsgController.SendData(code, netMsg, ref writer, this, id);
             m_Driver.EndSend(writer);
         }
 
@@ -114,8 +114,7 @@ namespace KairoEngine.Multiplayer
                     if (cmd == NetworkEvent.Type.Data)
                     {
                         //if(debug) Debug.Log("Server received data from client");
-                        uint code = stream.ReadByte();
-                        NetMsgController.Deserialize(code, ref stream, this, i);
+                        NetMsgController.ReceiveData(ref stream, this, i);
                     }
                     else if (cmd == NetworkEvent.Type.Disconnect)
                     {

+ 2 - 1
Runtime/_NetMsgs/NetChatMsg.cs

@@ -7,9 +7,10 @@ namespace KairoEngine.Multiplayer
 {
     public class NetChatMsg : NetMsg
     {
+        public override uint code { get { return (uint)NetOpCode.ChatMessage; }}
         public NetChatMsg()
         {
-            code = NetOpCode.ChatMessage;
+            
         }
 
         public override void Serialize(ref DataStreamWriter writer)

+ 33 - 4
Runtime/_NetMsgs/NetClientConnectedMsg.cs

@@ -8,11 +8,9 @@ namespace KairoEngine.Multiplayer
     /// <summary>Network message sent from the server to alert clients that a peer has connected.</summary>
     public class NetClientConnectedMsg : NetMsg
     {
+        public override uint code { get { return (uint)NetOpCode.ClientConnected; }}
         public string playerName = "";
-        public NetClientConnectedMsg()
-        {
-            code = NetOpCode.ClientConnected;
-        }
+        public NetClientConnectedMsg() {}
 
         public override void Serialize(ref DataStreamWriter writer)
         {
@@ -24,5 +22,36 @@ namespace KairoEngine.Multiplayer
         {
             playerName = reader.ReadFixedString64().ToString();
         }
+
+        public override void SendMessage(ServerBehaviour server, NetMsg netMsg, ref DataStreamWriter writer,  int clientId) 
+        {
+            if(server == null) return;
+            NetClientConnectedMsg netClientConnectedMsg = (NetClientConnectedMsg)netMsg;
+            string text = $"Alerting clients of new connection (playerName = {netClientConnectedMsg.playerName})";
+            if(server.debug) Debug.Log(text);
+            NetMsgEvents.Trigger($"{server.eventStreamName}_SendingClientConnectedMsg", text, clientId, code, netClientConnectedMsg);
+            netClientConnectedMsg.Serialize(ref writer);
+        }
+
+        public override NetMsg ReceiveMessage(ServerBehaviour server, ref DataStreamReader stream, int clientId = -1) 
+        {
+            NetClientConnectedMsg netClientConnectedMsg = new NetClientConnectedMsg();
+            netClientConnectedMsg.Deserialize(ref stream);
+            return netClientConnectedMsg;
+        }
+
+        public override NetMsg ReceiveMessage(ClientBehaviour client, ref DataStreamReader stream) 
+        {
+            NetClientConnectedMsg netClientConnectedMsg = new NetClientConnectedMsg();
+            netClientConnectedMsg.Deserialize(ref stream);
+            return netClientConnectedMsg;
+        }
+
+        public override void ReadMessage(ClientBehaviour client) 
+        {
+            string text = $"New peer connected to server (playerName = {playerName})";
+            if(client.debug) Debug.Log(text);
+            NetMsgEvents.Trigger($"{client.eventStreamName}_PeerConnected", text, -1, code, this);
+        }
     }
 }

+ 33 - 4
Runtime/_NetMsgs/NetClientDisconnectedMsg.cs

@@ -8,11 +8,9 @@ namespace KairoEngine.Multiplayer
     /// <summary>Network message sent from the server to alert clients that a peer has disconnected.</summary>
     public class NetClientDisconnectedMsg : NetMsg
     {
+        public override uint code { get { return (uint)NetOpCode.ClientDisconnected; }}
         public string playerName = "";
-        public NetClientDisconnectedMsg()
-        {
-            code = NetOpCode.ClientDisconnected;
-        }
+        public NetClientDisconnectedMsg() {}
 
         public override void Serialize(ref DataStreamWriter writer)
         {
@@ -24,5 +22,36 @@ namespace KairoEngine.Multiplayer
         {
             playerName = reader.ReadFixedString64().ToString();
         }
+
+        public override void SendMessage(ServerBehaviour server, NetMsg netMsg, ref DataStreamWriter writer,  int clientId) 
+        {
+            if(server == null) return;
+            NetClientConnectedMsg netClientConnectedMsg = (NetClientConnectedMsg)netMsg;
+            string text = $"Alerting clients of new connection (playerName = {netClientConnectedMsg.playerName})";
+            if(server.debug) Debug.Log(text);
+            NetMsgEvents.Trigger($"{server.eventStreamName}_SendingClientConnectedMsg", text, clientId, code, netClientConnectedMsg);
+            netClientConnectedMsg.Serialize(ref writer);
+        }
+
+        public override NetMsg ReceiveMessage(ServerBehaviour server, ref DataStreamReader stream, int clientId = -1) 
+        {
+            NetClientDisconnectedMsg netClientDisconnectedMsg = new NetClientDisconnectedMsg();
+            netClientDisconnectedMsg.Deserialize(ref stream);
+            return netClientDisconnectedMsg;
+        }
+
+        public override NetMsg ReceiveMessage(ClientBehaviour client, ref DataStreamReader stream) 
+        {
+            NetClientDisconnectedMsg netClientDisconnectedMsg = new NetClientDisconnectedMsg();
+            netClientDisconnectedMsg.Deserialize(ref stream);
+            return netClientDisconnectedMsg;
+        }
+
+        public override void ReadMessage(ClientBehaviour client) 
+        {
+            string text = $"Peer disconnected to server (playerName = {playerName})";
+            if(client.debug) Debug.Log(text);
+            NetMsgEvents.Trigger($"{client.eventStreamName}_PeerDisconnected", text, -1, code, this);
+        }
     }
 }

+ 51 - 4
Runtime/_NetMsgs/NetDisconnectMsg.cs

@@ -7,10 +7,9 @@ namespace KairoEngine.Multiplayer
 {
     public class NetDisconnectMsg : NetMsg
     {
-        public NetDisconnectMsg()
-        {
-            code = NetOpCode.Disconnect;
-        }
+        public override uint code { get { return (uint)NetOpCode.Disconnect; }}
+
+        public NetDisconnectMsg() {}
 
         public override void Serialize(ref DataStreamWriter writer)
         {
@@ -21,5 +20,53 @@ namespace KairoEngine.Multiplayer
         {
             
         }
+
+        public override void SendMessage(ServerBehaviour server, NetMsg netMsg, ref DataStreamWriter writer,  int clientId) 
+        {
+            if(server == null) return;  
+            NetDisconnectMsg netDisconnectMsg = (NetDisconnectMsg)netMsg;
+            string text = $"Sending disconnect message to client (ID {clientId})";
+            if(server.debug) Debug.Log(text);
+            NetMsgEvents.Trigger($"{server.eventStreamName}_SendingDisconnectMessageToClient", text, clientId, code, netDisconnectMsg);
+            netDisconnectMsg.Serialize(ref writer);
+        }
+
+        public override void SendMessage(ClientBehaviour client, NetMsg netMsg, ref DataStreamWriter writer ) 
+        {
+            if(client == null) return;
+            NetDisconnectMsg netDisconnectMsg = (NetDisconnectMsg)netMsg;
+            string text = $"Sending disconnect message to server";
+            if(client.debug) Debug.Log(text);
+            NetMsgEvents.Trigger($"{client.eventStreamName}_SendingDisconnectMessageToServer", text, -1, code, netDisconnectMsg);
+            netDisconnectMsg.Serialize(ref writer);
+        }
+
+        public override NetMsg ReceiveMessage(ServerBehaviour server, ref DataStreamReader stream, int clientId = -1) 
+        {
+            NetDisconnectMsg netDisconnectMsg = new NetDisconnectMsg();
+            netDisconnectMsg.Deserialize(ref stream);
+            return netDisconnectMsg;
+        }
+
+        public override NetMsg ReceiveMessage(ClientBehaviour client, ref DataStreamReader stream) 
+        {
+            NetDisconnectMsg netDisconnectMsg = new NetDisconnectMsg();
+            netDisconnectMsg.Deserialize(ref stream);
+            return netDisconnectMsg;
+        }
+
+        public override void ReadMessage(ServerBehaviour server, int clientId = -1) 
+        {
+            string text = $"Client is disconnecting";
+            if(server.debug) Debug.Log(text);
+            NetMsgEvents.Trigger($"{server.eventStreamName}_ClientDisconnect", text, clientId, code, this);
+        }
+
+        public override void ReadMessage(ClientBehaviour client) 
+        {
+            string text = $"Server disconnected client";
+            if(client.debug) Debug.Log(text);
+            NetMsgEvents.Trigger($"{client.eventStreamName}_ServerDisconnect", text, -1, code, this);
+        }
     }
 }

+ 51 - 4
Runtime/_NetMsgs/NetHandshakeMsg.cs

@@ -7,11 +7,9 @@ namespace KairoEngine.Multiplayer
 {
     public class NetHandshakeMsg : NetMsg
     {
+        public override uint code { get { return (uint)NetOpCode.Handshake; }}
         public string playerName = "";
-        public NetHandshakeMsg()
-        {
-            code = NetOpCode.Handshake;
-        }
+        public NetHandshakeMsg() {}
 
         public override void Serialize(ref DataStreamWriter writer)
         {
@@ -23,5 +21,54 @@ namespace KairoEngine.Multiplayer
         {
             playerName = reader.ReadFixedString64().ToString();
         }
+
+        public override void SendMessage(ServerBehaviour server, NetMsg netMsg, ref DataStreamWriter writer,  int clientId) 
+        {
+            if(server == null) return;
+            NetHandshakeMsg netHandshakeMsg = (NetHandshakeMsg)netMsg;
+            string text = $"Accepting handshake from client (ID {clientId}, playerName = {netHandshakeMsg.playerName})";
+            if(server.debug) Debug.Log(text);
+            NetMsgEvents.Trigger($"{server.eventStreamName}_AcceptingHandshake", text, clientId, code, netHandshakeMsg);
+            netHandshakeMsg.Serialize(ref writer);
+        }
+
+        public override void SendMessage(ClientBehaviour client, NetMsg netMsg, ref DataStreamWriter writer ) 
+        {
+            Debug.Log("Testing!");
+            if(client == null) return;
+            NetHandshakeMsg netHandshakeMsg = (NetHandshakeMsg)netMsg;
+            string text = $"Sending handshake (playerName = {netHandshakeMsg.playerName})";
+            if(client.debug) Debug.Log(text);
+            NetMsgEvents.Trigger($"{client.eventStreamName}_SendingHandshake", text, -1, code, netHandshakeMsg);
+            netHandshakeMsg.Serialize(ref writer);
+        }
+
+        public override NetMsg ReceiveMessage(ServerBehaviour server, ref DataStreamReader stream, int clientId = -1) 
+        {
+            NetHandshakeMsg netHandshakeMsg = new NetHandshakeMsg();
+            netHandshakeMsg.Deserialize(ref stream);
+            return netHandshakeMsg;
+        }
+
+        public override NetMsg ReceiveMessage(ClientBehaviour client, ref DataStreamReader stream) 
+        {
+            NetHandshakeMsg netHandshakeMsg = new NetHandshakeMsg();
+            netHandshakeMsg.Deserialize(ref stream);
+            return netHandshakeMsg;
+        }
+
+        public override void ReadMessage(ServerBehaviour server, int clientId = -1) 
+        {
+            string text = $"Received handshake from client (ID {clientId}, playerName = {playerName})";
+            if(server.debug) Debug.Log(text);
+            NetMsgEvents.Trigger($"{server.eventStreamName}_HandshakeReceived", text, clientId, code, this);
+        }
+
+        public override void ReadMessage(ClientBehaviour client) 
+        {
+            string text = $"Server accepted handshake (playerName = {playerName})";
+            if(client.debug) Debug.Log(text);
+            NetMsgEvents.Trigger($"{client.eventStreamName}_HandshakeAccepted", text, -1, code, this);
+        }
     }
 }

+ 28 - 2
Runtime/_NetMsgs/NetMsg.cs

@@ -1,3 +1,4 @@
+using System;
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
@@ -5,9 +6,9 @@ using Unity.Networking.Transport;
 
 namespace KairoEngine.Multiplayer
 {
-    public class NetMsg
+    public class NetMsg : IComparable<NetMsg>
     {
-        public NetOpCode code { set; get;}
+        public virtual uint code { get { return (uint)NetOpCode.Generic; }}
 
         public virtual void Serialize(ref DataStreamWriter writer)
         {
@@ -18,6 +19,31 @@ namespace KairoEngine.Multiplayer
         {
 
         }
+        
+        /// <summary>Send a net message from the server to a client.</summary>
+        /// <param name="server">The server sending the message</param>
+        /// <param name="netMsg">The actual message to be sent</param>
+        /// <param name="writer">The driver writer object</param>
+        /// <param name="clientId">The server connection id for the recipient of this message</param>
+        public virtual void SendMessage(ServerBehaviour server, NetMsg netMsg, ref DataStreamWriter writer, int clientId) {}
+
+        /// <summary>Send a net message from a client to the server.</summary>
+        /// <param name="client">The client sending the message</param>
+        /// <param name="netMsg">The actual message to be sent</param>
+        /// <param name="writer">The driver writer object</param>
+        public virtual void SendMessage(ClientBehaviour client, NetMsg netMsg, ref DataStreamWriter writer) {}
+
+        public virtual NetMsg ReceiveMessage(ServerBehaviour server, ref DataStreamReader stream, int clientId = -1) => null;
+        public virtual NetMsg ReceiveMessage(ClientBehaviour client, ref DataStreamReader stream) => null;
+
+        public virtual void ReadMessage(ServerBehaviour server, int clientId = -1) {}
+        public virtual void ReadMessage(ClientBehaviour client) {}
+
+        public int CompareTo(NetMsg other)
+        {
+            throw new NotImplementedException();
+        }
+
     }
 }