add basic movement syncing with dev cubes

This commit is contained in:
ApfelTeeSaft
2024-09-23 10:49:46 +02:00
parent 1e9770884c
commit df7d4d806a
5 changed files with 169 additions and 76 deletions
+3
View File
@@ -48,6 +48,9 @@
<ItemGroup>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Unity\MovementHandler.cs" />
<Compile Include="Unity\MultikillServer.cs" />
<Compile Include="Unity\PlayerData.cs" />
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
+9 -76
View File
@@ -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<NetPeer> connectedClients = new List<NetPeer>();
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.");
}
}
}
+62
View File
@@ -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);
}
}
}
}
}
+80
View File
@@ -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<NetPeer, PlayerData> connectedClients = new Dictionary<NetPeer, PlayerData>();
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}");
}
}
}
+15
View File
@@ -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
}
}