Server Ok but not the ball
This commit is contained in:
+81
-19
@@ -6,36 +6,60 @@ namespace Server
|
||||
{
|
||||
public class Program
|
||||
{
|
||||
static EventBasedNetListener listener = new();
|
||||
static NetManager? server;
|
||||
static NetPacketProcessor processor = new();
|
||||
static NetSerializer serializer = new();
|
||||
static EventBasedNetListener listener;
|
||||
static NetManager server;
|
||||
static NetPacketProcessor processor;
|
||||
|
||||
static string? port;
|
||||
static string? pswd;
|
||||
|
||||
static string gameState = "Idle"; // Idle || Playing || Paused || Ended
|
||||
/*
|
||||
None => Waiting for minimum 2 clients
|
||||
Idle => Preparaing the game, waiting for client 1 to start the game
|
||||
Playing => Game actually playing
|
||||
Paused => Game paused by a player
|
||||
Ended => Game Ended, waiting for client 1 decision (exiting or restart)
|
||||
Disconnected => One of the two players has been disconnected
|
||||
*/
|
||||
static string gameState = "None";
|
||||
static List<NetPeer> activeConnections;
|
||||
static List<NetPeer> players;
|
||||
|
||||
// Game
|
||||
|
||||
public static void Main(string[] args)
|
||||
{
|
||||
Random random = new Random(Guid.NewGuid().GetHashCode());
|
||||
// Application
|
||||
Console.CancelKeyPress += new ConsoleCancelEventHandler(Console_CancelKeyPress);
|
||||
|
||||
listener = new EventBasedNetListener();
|
||||
server = new NetManager(listener);
|
||||
processor = new NetPacketProcessor();
|
||||
|
||||
activeConnections = new List<NetPeer>();
|
||||
players = new List<NetPeer>();
|
||||
|
||||
processor.SubscribeReusable<GameStateChange>(GameStateHandler);
|
||||
processor.SubscribeReusable<Position>(PositionHandler);
|
||||
|
||||
|
||||
port = Lib.ReadSetting("PORT");
|
||||
pswd = Lib.ReadSetting("PSWD");
|
||||
|
||||
if (port != null && pswd != null)
|
||||
{
|
||||
Console.WriteLine($"Server started on port {port}");
|
||||
server.Start(int.Parse(port));
|
||||
Console.WriteLine($"Server started on port {port}");
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.Error.WriteLine("Missing port or password in config file !\nClosing server...");
|
||||
return;
|
||||
}
|
||||
|
||||
serializer.Register<Assignation>();
|
||||
|
||||
listener.NetworkReceiveEvent += (client, reader, deliveryMethod) =>
|
||||
{
|
||||
processor.ReadAllPackets(reader, client);
|
||||
};
|
||||
|
||||
listener.ConnectionRequestEvent += request =>
|
||||
{
|
||||
@@ -48,29 +72,50 @@ namespace Server
|
||||
Console.WriteLine("Connection accepted for: {0}", peer.EndPoint);
|
||||
if (peer != null)
|
||||
{
|
||||
players.Add(peer);
|
||||
activeConnections.Add(peer);
|
||||
}
|
||||
};
|
||||
|
||||
listener.PeerDisconnectedEvent += (peer, infos) =>
|
||||
{
|
||||
Console.WriteLine($"{peer.EndPoint} has left.\nError code: {infos.SocketErrorCode}\nReason: {infos.Reason}");
|
||||
players.Remove(peer);
|
||||
activeConnections.Remove(peer);
|
||||
if (players.Contains(peer))
|
||||
{
|
||||
players.Remove(peer);
|
||||
gameState = "Disconnected";
|
||||
GameStateChange packet = new() { gameState = "Disconnected" };
|
||||
server.SendToAll(processor.Write(packet), DeliveryMethod.ReliableOrdered);
|
||||
}
|
||||
|
||||
if (activeConnections.Count < 2)
|
||||
{
|
||||
gameState = "None";
|
||||
}
|
||||
};
|
||||
|
||||
while (!Console.KeyAvailable)
|
||||
{
|
||||
server.PollEvents();
|
||||
if (server.GetPeersCount(ConnectionState.Connected) >= 2)
|
||||
if (activeConnections.Count >= 2)
|
||||
{
|
||||
// Differents game states
|
||||
if (gameState == "Idle")
|
||||
if (gameState == "None")
|
||||
{
|
||||
Assignation packet = new() { controller = 2, ballX = 0, ballY = 0 };
|
||||
processor.Send(players[0], packet, DeliveryMethod.ReliableOrdered);
|
||||
processor.Send(players[1], packet, DeliveryMethod.ReliableOrdered);
|
||||
Console.WriteLine("Assignation sended");
|
||||
gameState = "Playing";
|
||||
float MoveX = new float[2] { -2f, 2f }[random.Next(2)];
|
||||
float MoveY = new float[2] { -2f, 2f }[random.Next(2)];
|
||||
Assignation packet = new() { controller = 0, ballX = MoveX, ballY = MoveY };
|
||||
processor.Send(activeConnections[0], packet, DeliveryMethod.ReliableOrdered);
|
||||
players.Add(activeConnections[0]);
|
||||
|
||||
packet.controller = 1;
|
||||
|
||||
processor.Send(activeConnections[1], packet, DeliveryMethod.ReliableOrdered);
|
||||
players.Add(activeConnections[1]);
|
||||
|
||||
gameState = "Idle";
|
||||
Console.WriteLine($"Change GameState to {gameState}");
|
||||
server.SendToAll(processor.Write(new GameStateChange() { gameState = "Idle" }), DeliveryMethod.ReliableOrdered);
|
||||
}
|
||||
}
|
||||
Thread.Sleep(15);
|
||||
@@ -78,5 +123,22 @@ namespace Server
|
||||
|
||||
server.Stop();
|
||||
}
|
||||
|
||||
private static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e)
|
||||
{
|
||||
server.DisconnectAll();
|
||||
}
|
||||
|
||||
private static void PositionHandler(Position position)
|
||||
{
|
||||
server.SendToAll(processor.Write(position), DeliveryMethod.ReliableOrdered);
|
||||
}
|
||||
|
||||
private static void GameStateHandler(GameStateChange change)
|
||||
{
|
||||
Console.WriteLine($"Change GameState to {change.gameState}");
|
||||
gameState = change.gameState;
|
||||
server.SendToAll(processor.Write(change), DeliveryMethod.ReliableOrdered);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user