From 30feb1582170ae46a92a5290036cba9eeb05baa5 Mon Sep 17 00:00:00 2001 From: "derek.holloway" Date: Fri, 7 Aug 2026 13:00:04 -0700 Subject: [PATCH] Fix all of the nullable issues --- CLI/Help/Documentation.txt | 15 --------------- MistoxServer/Client/MistoxClient.cs | 18 ++++++++++++++---- MistoxServer/Client/TCPClient.cs | 9 +++++---- MistoxServer/Client/UDPReceiver.cs | 14 ++++++++------ MistoxServer/GameServer.cs | 2 +- MistoxServer/MistServer.csproj | 1 + MistoxServer/Server/MistoxServer.cs | 5 ++++- MistoxServer/Server/ServerConnection.cs | 9 +++++---- MistoxServer/Server/ServerListener.cs | 15 ++++++++------- MistoxServer/mPacket/DataPacket.cs | 4 ++-- .../mPacket/NetworkPacketDictionary.cs | 2 +- MistoxServer/mPacket/ResevedPackets.cs | 16 ++++++++-------- Todo.txt | 1 + 13 files changed, 58 insertions(+), 53 deletions(-) delete mode 100644 CLI/Help/Documentation.txt diff --git a/CLI/Help/Documentation.txt b/CLI/Help/Documentation.txt deleted file mode 100644 index a35a7c6..0000000 --- a/CLI/Help/Documentation.txt +++ /dev/null @@ -1,15 +0,0 @@ -The servers default port is 25566 - - -TCPServer.cs - Void TCPServer() Initilizes the server object on the default game port of 25566 - Void SendAll(string Data) Send data to all the clients - Event onReceived Fires when data is received from a client - -TCPClient.cs - Void TCPClient(String ServerIP) Initilizes the client object - Void Send(String Data) Sends data to the server - Event onReceived Fires when data is received from the server - -UDPClient.cs - \ No newline at end of file diff --git a/MistoxServer/Client/MistoxClient.cs b/MistoxServer/Client/MistoxClient.cs index 0cb0564..3a0fc35 100644 --- a/MistoxServer/Client/MistoxClient.cs +++ b/MistoxServer/Client/MistoxClient.cs @@ -20,7 +20,7 @@ namespace Mistox.Client { public Vector3 Position { get; set; } = new Vector3(0, 0, 0); // My world position public float MaxNetworkRenderDistance { get; private set; } = 0; // The distance for connections - public mTCPClient ServerConnection {get; private set; } // Global TCP Server Connection + public mTCPClient? ServerConnection {get; private set; } // Global TCP Server Connection public UdpClient ClientSocket { get; private set; } // Global UDP Sender public UDPReceiver UdpReceiver { get; private set; } // Global UDP Receiver @@ -36,6 +36,14 @@ namespace Mistox.Client { UserName = userName; ConnectionKey = connectionKey; + onServerConnected += () => {}; + onUserConnected += (_) => {}; + onUserJoined += (_) => {}; + onDataReceived += (_,_) => {}; + onUserLeft += (_) => {}; + onUserDisconnected += (_) => {}; + onServerDisconnected += () => {}; + // Create and connect to server on TCP Console.WriteLine( "The client is initilized and trying to connect to the server at ip : " + Server.Address ); try { @@ -116,6 +124,7 @@ namespace Mistox.Client { async Task TryAuth() { Console.WriteLine("Attempting to authenticate against the server..."); + if (ServerConnection == null) return; await ServerConnection.Send(new UserAuthPacket { UserName = UserName, ConnectionKey = ConnectionKey @@ -158,8 +167,8 @@ namespace Mistox.Client { } // When generic data is received - public event Action onDataReceived; - public void InvokeOnReceived(dynamic DataPacket, mUDPClient remote = null){ + public event Action onDataReceived; + public void InvokeOnReceived(dynamic DataPacket, mUDPClient? remote = null){ switch (DataPacket as object) { case HeartbeatPacket packet: HeartbeatReceived(packet); @@ -173,7 +182,7 @@ namespace Mistox.Client { Console.WriteLine("Received a null packet."); break; default: - onDataReceived?.Invoke(DataPacket); + onDataReceived?.Invoke(remote, DataPacket); break; } } @@ -219,6 +228,7 @@ namespace Mistox.Client { } public async Task SendServer(Packet data) { + if (ServerConnection == null) return; await ServerConnection.Send( data ); } } diff --git a/MistoxServer/Client/TCPClient.cs b/MistoxServer/Client/TCPClient.cs index b152298..908e791 100644 --- a/MistoxServer/Client/TCPClient.cs +++ b/MistoxServer/Client/TCPClient.cs @@ -48,10 +48,11 @@ namespace Mistox.Client { await ns.ReadExactlyAsync(payloadBuffer, 0, Header.DataLength); // Create the dataobject - dynamic dataobject = DataPacket.Deserialize( Header, payloadBuffer.AsMemory(DataPacket.HeaderLength, Header.DataLength) ); - - // Return the object - _parent.InvokeOnReceived(dataobject); + object? dataobject = DataPacket.Deserialize( Header, payloadBuffer.AsMemory(DataPacket.HeaderLength, Header.DataLength) ); + if (dataobject != null) { + // Return the object + _parent.InvokeOnReceived(dataobject); + } } } catch (Exception e) { diff --git a/MistoxServer/Client/UDPReceiver.cs b/MistoxServer/Client/UDPReceiver.cs index 166cd31..27ef1fe 100644 --- a/MistoxServer/Client/UDPReceiver.cs +++ b/MistoxServer/Client/UDPReceiver.cs @@ -21,9 +21,9 @@ namespace Mistox.Client { UdpReceiveResult udpPacket = await _parent.ClientSocket.ReceiveAsync(); // Try find the user - mUDPClient client = null; - bool clientExists = _parent.clientConnections.TryGetValue(udpPacket.RemoteEndPoint, out client); - if (clientExists) { + mUDPClient? client = null; + _parent.clientConnections.TryGetValue(udpPacket.RemoteEndPoint, out client); + if (client != null) { // Create the data readers ReadOnlyMemory dataMemory = udpPacket.Buffer.AsMemory(); @@ -39,10 +39,12 @@ namespace Mistox.Client { ReadOnlyMemory data = dataMemory.Slice(DataPacket.HeaderLength, Header.DataLength); // Extract the object - dynamic buildObj = DataPacket.Deserialize( Header, data ); + object? buildObj = DataPacket.Deserialize( Header, data ); + if (buildObj != null) { - // Return the object - _parent.InvokeOnReceived( buildObj, client ); + // Return the object + _parent.InvokeOnReceived( buildObj, client ); + } } } catch( Exception e ) { diff --git a/MistoxServer/GameServer.cs b/MistoxServer/GameServer.cs index 11ed0bd..db579d7 100644 --- a/MistoxServer/GameServer.cs +++ b/MistoxServer/GameServer.cs @@ -19,7 +19,7 @@ namespace Mistox { return new MistoxServer(listenerAddress, serverName); } - public static MistoxClient newClient( string UserName, string ServerIPOrHostName, int Port, string ConnectionKey = "" ) { + public static MistoxClient? newClient( string UserName, string ServerIPOrHostName, int Port, string ConnectionKey = "" ) { // Build the network packet list NetworkPacketDictionary.BuildNetworkPacketList(); diff --git a/MistoxServer/MistServer.csproj b/MistoxServer/MistServer.csproj index a98fbd2..262d65a 100644 --- a/MistoxServer/MistServer.csproj +++ b/MistoxServer/MistServer.csproj @@ -2,6 +2,7 @@ net10.0 + enable diff --git a/MistoxServer/Server/MistoxServer.cs b/MistoxServer/Server/MistoxServer.cs index 8bf6a9f..39da8b7 100644 --- a/MistoxServer/Server/MistoxServer.cs +++ b/MistoxServer/Server/MistoxServer.cs @@ -22,6 +22,9 @@ namespace Mistox.Server { public MistoxServer(IPEndPoint ListenerAddress, string serverName) { ServerName = serverName; Listener = new ServerListener(ListenerAddress, this); + onUserConnected += (_) => {}; + onDataReceived += (_, _) => {}; + onUserDisconnected += (_) => {}; Console.WriteLine( "The Server is initilized and waiting for clients to connect at port : " + ListenerAddress.Port ); } @@ -80,7 +83,7 @@ namespace Mistox.Server { public event Action onDataReceived; public void InvokeDataReceived( ServerConnection user, dynamic data ){ - switch (data) { + switch (data) { case UserAuthPacket packet when !user.IsAuthenticated: _ = RunAsync(async () => { await ProcessAuthRequest(user, packet); diff --git a/MistoxServer/Server/ServerConnection.cs b/MistoxServer/Server/ServerConnection.cs index 3a5d40b..dd68417 100644 --- a/MistoxServer/Server/ServerConnection.cs +++ b/MistoxServer/Server/ServerConnection.cs @@ -55,10 +55,11 @@ namespace Mistox.Server { await ns.ReadExactlyAsync(payloadBuffer, 0, Header.DataLength, _cts.Token); // Create the dataobject - dynamic dataobject = DataPacket.Deserialize( Header, payloadBuffer.AsMemory(DataPacket.HeaderLength) ); - - // Return the object - _parent.InvokeDataReceived(this, dataobject); + object? dataobject = DataPacket.Deserialize( Header, payloadBuffer.AsMemory(DataPacket.HeaderLength) ); + if (dataobject != null) { + // Return the object + _parent.InvokeDataReceived(this, dataobject); + } } } catch (Exception e) { diff --git a/MistoxServer/Server/ServerListener.cs b/MistoxServer/Server/ServerListener.cs index 6863fe4..c42c81f 100644 --- a/MistoxServer/Server/ServerListener.cs +++ b/MistoxServer/Server/ServerListener.cs @@ -32,14 +32,15 @@ namespace Mistox.Server { continue; } - IPEndPoint remote = client.Client.RemoteEndPoint as IPEndPoint; + IPEndPoint? remote = client.Client.RemoteEndPoint as IPEndPoint; + if (remote != null) { + string connectionID = Guid.NewGuid().ToString(); + _parent.Connections[connectionID] = new ServerConnection( client, _parent, remote) { + UserName = connectionID + }; - string connectionID = Guid.NewGuid().ToString(); - _parent.Connections[connectionID] = new ServerConnection( client, _parent, remote) { - UserName = connectionID - }; - - Console.WriteLine( "New User Connected" ); + Console.WriteLine( "New User Connected" ); + } } Dispose(); } diff --git a/MistoxServer/mPacket/DataPacket.cs b/MistoxServer/mPacket/DataPacket.cs index ae162fb..e8f06c0 100644 --- a/MistoxServer/mPacket/DataPacket.cs +++ b/MistoxServer/mPacket/DataPacket.cs @@ -46,10 +46,10 @@ namespace Mistox { return writer.WrittenSpan.ToArray(); } - public static object Deserialize( DataPacketHeader Header, ReadOnlyMemory Data ) { + public static object? Deserialize( DataPacketHeader Header, ReadOnlyMemory Data ) { // Get the type from the tag - if (!NetworkPacketDictionary.PacketLookupTable.TryGetValue(Header.Type, out Type resolvedType)) { + if (!NetworkPacketDictionary.PacketLookupTable.TryGetValue(Header.Type, out Type? resolvedType)) { throw new Exception($"Unknown packet type ID: {Header.Type}"); } diff --git a/MistoxServer/mPacket/NetworkPacketDictionary.cs b/MistoxServer/mPacket/NetworkPacketDictionary.cs index cac32f2..7fd141a 100644 --- a/MistoxServer/mPacket/NetworkPacketDictionary.cs +++ b/MistoxServer/mPacket/NetworkPacketDictionary.cs @@ -27,7 +27,7 @@ namespace Mistox.Attributes { foreach (Assembly assembly in assemblies) { Type[] allClasses = assembly.GetTypes(); foreach( Type cur in allClasses) { - mPacket attribute = cur.GetCustomAttribute(false); + mPacket? attribute = cur.GetCustomAttribute(false); if (attribute != null) { // Generate a deterministic 16-bit ID based on the Type's FullName diff --git a/MistoxServer/mPacket/ResevedPackets.cs b/MistoxServer/mPacket/ResevedPackets.cs index d2a015b..c4d280a 100644 --- a/MistoxServer/mPacket/ResevedPackets.cs +++ b/MistoxServer/mPacket/ResevedPackets.cs @@ -25,31 +25,31 @@ namespace Mistox.ResevedPackets { // Tag to make sure the object on the other side is the same object i want to update here // Need to map these Object ID's to a dictionary to make sure I only send network updates when there is a change - public ushort ObjectId { get; set; } + public ushort ObjectId { get; set; } = 0; // Packet payload data that im matching for in the dictionary - public byte[] InnerPayload { get; set; } + public byte[] InnerPayload { get; set; } = {}; } public class UserTableObject { - public string UserName { get; set; } - public IPAddress IpAddress { get; set; } - public Vector3 Position { get; set; } + public string UserName { get; set; } = string.Empty; + public IPAddress IpAddress { get; set; } = new([]); + public Vector3 Position { get; set; } = new(); } // Not implemented // Packet sent to all clients when a global position update occurrs [mPacket] public class HeartbeatPacket { - public Vector3 Position { get; set; } - public List ServerList { get; set; } + public Vector3 Position { get; set; } = new(); + public List ServerList { get; set; } = new(); } // Not implimented // Packet sent to all clients when a users TCP stream disconnects from the server [mPacket] public class UserDisconnectedPacket { - public string UserName { get; set; } + public string UserName { get; set; } = string.Empty; } } \ No newline at end of file diff --git a/Todo.txt b/Todo.txt index 2638b38..2916dbe 100644 --- a/Todo.txt +++ b/Todo.txt @@ -10,6 +10,7 @@ The server receive thread needs to push the user it was received from up the cha 8. Each client can figure out what connections it needs to make or drop via the list Done 10. When the TCP connection drops update the heartbeat list so all the clients remove the connection Done 11. Build a network cache table on the clients so obj's only send updates and not repeat packets +12. User joined and left events are not implimented Set the network bubble distance [ render distance ] on the server and pass to the clients