diff --git a/Multikill-Server/Multikill-Server.csproj b/Multikill-Server/Multikill-Server.csproj index 9e76bfe..3c44111 100644 --- a/Multikill-Server/Multikill-Server.csproj +++ b/Multikill-Server/Multikill-Server.csproj @@ -48,6 +48,9 @@ + + + diff --git a/Multikill-Server/Program.cs b/Multikill-Server/Program.cs index 057ffe1..9ee95b3 100644 --- a/Multikill-Server/Program.cs +++ b/Multikill-Server/Program.cs @@ -1,90 +1,23 @@ -using LiteNetLib; -using LiteNetLib.Utils; -using System; -using System.Collections.Generic; -using System.Net; -using System.Net.Sockets; -using System.Threading; +using System; +using Multikill_Server.Unity; namespace Multikill_Server { - public class MultikillServer : INetEventListener + class Program { - private NetManager server; - private List connectedClients = new List(); - static void Main(string[] args) { - MultikillServer multiplayerServer = new MultikillServer(); - multiplayerServer.StartServer(); - } + MultikillServer server = new MultikillServer(); + server.StartServer(); - public void StartServer() - { - server = new NetManager(this) - { - AutoRecycle = true - }; - server.Start(9050); - Console.WriteLine("Server started on port 9050."); - - while (!Console.KeyAvailable || Console.ReadKey().Key != ConsoleKey.Escape) + Console.WriteLine("Press ESC to stop the server..."); + while (Console.ReadKey(true).Key != ConsoleKey.Escape) { server.PollEvents(); - Thread.Sleep(15); } - server.Stop(); - } - - public void OnPeerConnected(NetPeer peer) - { - Console.WriteLine($"Client connected: {peer.Address}"); - connectedClients.Add(peer); - } - - public void OnPeerDisconnected(NetPeer peer, DisconnectInfo disconnectInfo) - { - Console.WriteLine($"Client disconnected: {peer.Address}. Reason: {disconnectInfo.Reason}"); - connectedClients.Remove(peer); - } - - public void OnNetworkReceive(NetPeer peer, NetPacketReader reader, byte channelNumber, DeliveryMethod deliveryMethod) - { - string receivedMessage = reader.GetString(); - Console.WriteLine($"Received from {peer.Address}: {receivedMessage}"); - - NetDataWriter writer = new NetDataWriter(); - writer.Put(receivedMessage); - - foreach (var client in connectedClients) - { - if (client != peer) - { - client.Send(writer, DeliveryMethod.ReliableOrdered); - } - } - } - - public void OnConnectionRequest(ConnectionRequest request) - { - request.Accept(); - Console.WriteLine($"Incoming connection request from: {request.RemoteEndPoint}"); - } - - public void OnNetworkError(IPEndPoint endPoint, SocketError socketError) - { - Console.WriteLine($"Network error occurred at {endPoint}: {socketError}"); - } - - public void OnNetworkReceiveUnconnected(IPEndPoint remoteEndPoint, NetPacketReader reader, UnconnectedMessageType messageType) - { - Console.WriteLine($"Received unconnected message from {remoteEndPoint}"); - } - - public void OnNetworkLatencyUpdate(NetPeer peer, int latency) - { - Console.WriteLine($"Latency update for {peer.Address}: {latency}ms"); + server.StopServer(); + Console.WriteLine("Server stopped."); } } } \ No newline at end of file diff --git a/Multikill-Server/Unity/MovementHandler.cs b/Multikill-Server/Unity/MovementHandler.cs new file mode 100644 index 0000000..961b472 --- /dev/null +++ b/Multikill-Server/Unity/MovementHandler.cs @@ -0,0 +1,62 @@ +using LiteNetLib; +using LiteNetLib.Utils; +using Multikill_Server.Unity; +using System.Collections.Generic; + +namespace Multikill_Server.Unity +{ + public class MovementHandler + { + private MultikillServer server; + + public MovementHandler(MultikillServer server) + { + this.server = server; + } + + public void HandleMovement(NetPeer peer, NetPacketReader reader) + { + // Read position data sent from the client + float posX = reader.GetFloat(); + float posY = reader.GetFloat(); + float posZ = reader.GetFloat(); + float rotX = reader.GetFloat(); + float rotY = reader.GetFloat(); + float rotZ = reader.GetFloat(); + + // Update player data on the server + if (server.connectedClients.ContainsKey(peer)) + { + server.connectedClients[peer].PositionX = posX; + server.connectedClients[peer].PositionY = posY; + server.connectedClients[peer].PositionZ = posZ; + server.connectedClients[peer].RotationX = rotX; + server.connectedClients[peer].RotationY = rotY; + server.connectedClients[peer].RotationZ = rotZ; + } + + // Broadcast the player's movement to all other clients + BroadcastMovement(peer, posX, posY, posZ, rotX, rotY, rotZ); + } + + private void BroadcastMovement(NetPeer sender, float posX, float posY, float posZ, float rotX, float rotY, float rotZ) + { + NetDataWriter writer = new NetDataWriter(); + writer.Put(sender.Id); + writer.Put(posX); + writer.Put(posY); + writer.Put(posZ); + writer.Put(rotX); + writer.Put(rotY); + writer.Put(rotZ); + + foreach (var client in server.connectedClients.Keys) + { + if (client != sender) // Don't send the update back to the sender + { + client.Send(writer, DeliveryMethod.Unreliable); + } + } + } + } +} \ No newline at end of file diff --git a/Multikill-Server/Unity/MultikillServer.cs b/Multikill-Server/Unity/MultikillServer.cs new file mode 100644 index 0000000..479ce0e --- /dev/null +++ b/Multikill-Server/Unity/MultikillServer.cs @@ -0,0 +1,80 @@ +using LiteNetLib; +using Multikill_Server; +using System; +using System.Collections.Generic; +using System.Net; +using System.Net.Sockets; + +namespace Multikill_Server.Unity +{ + public class MultikillServer : INetEventListener + { + private NetManager server; + public Dictionary connectedClients = new Dictionary(); + private MovementHandler movementHandler; + + public MultikillServer() + { + movementHandler = new MovementHandler(this); + } + + public void StartServer() + { + server = new NetManager(this) + { + AutoRecycle = true + }; + server.Start(9050); // Listen on port 9050 + Console.WriteLine("Server started on port 9050."); + } + + public void StopServer() + { + server.Stop(); + } + + public void PollEvents() + { + server.PollEvents(); + } + + public void OnPeerConnected(NetPeer peer) + { + Console.WriteLine($"Client connected: {peer.Address}"); + connectedClients.Add(peer, new PlayerData()); + } + + public void OnPeerDisconnected(NetPeer peer, DisconnectInfo disconnectInfo) + { + Console.WriteLine($"Client disconnected: {peer.Address}. Reason: {disconnectInfo.Reason}"); + connectedClients.Remove(peer); + } + + public void OnConnectionRequest(ConnectionRequest request) + { + request.Accept(); + Console.WriteLine($"Incoming connection request from: {request.RemoteEndPoint}"); + } + + public void OnNetworkError(IPEndPoint endPoint, SocketError socketError) + { + Console.WriteLine($"Network error occurred at {endPoint}: {socketError}"); + } + + public void OnNetworkLatencyUpdate(NetPeer peer, int latency) + { + Console.WriteLine($"Latency update for {peer.Address}: {latency}ms"); + } + + public void OnNetworkReceive(NetPeer peer, NetPacketReader reader, byte channelNumber, DeliveryMethod deliveryMethod) + { + // Delegate movement data handling to MovementHandler + movementHandler.HandleMovement(peer, reader); + } + + public void OnNetworkReceiveUnconnected(IPEndPoint remoteEndPoint, NetPacketReader reader, UnconnectedMessageType messageType) + { + Console.WriteLine($"Received unconnected message from {remoteEndPoint}"); + } + } +} \ No newline at end of file diff --git a/Multikill-Server/Unity/PlayerData.cs b/Multikill-Server/Unity/PlayerData.cs new file mode 100644 index 0000000..0a066a1 --- /dev/null +++ b/Multikill-Server/Unity/PlayerData.cs @@ -0,0 +1,15 @@ +namespace Multikill_Server.Unity +{ + public class PlayerData + { + public float PositionX { get; set; } + public float PositionY { get; set; } + public float PositionZ { get; set; } + + public float RotationX { get; set; } + public float RotationY { get; set; } + public float RotationZ { get; set; } + + // TODO, add health etc here + } +} \ No newline at end of file