Exemple #1
0
        public static void WelcomeRecieved(int fromClient, Packet packet)
        {
            int    clientIDCheck = packet.ReadInt();
            string username      = packet.ReadString();

            Console.WriteLine($"{Server.clients[fromClient].tcp.socket.Client.RemoteEndPoint} connected successfully and is now player {fromClient}");

            if (fromClient != clientIDCheck)
            {
                Console.WriteLine($"Player \"{username}\" (ID: {fromClient}) has assumed the wrong client ID ({clientIDCheck})!");
            }
            //TODO send player into game
            Player clientPlayer = GameLogic.GetPlayer(username);

            if (clientPlayer != null)
            {
                foreach (Client client in Server.clients.Values)
                {
                    if (client.Player == clientPlayer)
                    {
                        // Console.WriteLine($"Can't assign a Player to \"{username}\" (ID: {fromClient}) because there is already an active client with the username \"{username}\"!");
                        // Server.clients[fromClient].Disconnect();

                        Console.WriteLine("A Player has connected with a name which is already assigned to an active player. Assuming that this is due to a network change the server tries to sync the client with the lost packages!");

                        int receivedClientPackages = packet.ReadInt();
                        foreach (KeyValuePair <int, Client> kvp in Server.clients)
                        {
                            if (kvp.Value.Player == clientPlayer && kvp.Value != client)
                            {
                                int missingPackages = kvp.Value.tcp.sentPackages - receivedClientPackages;
                                if (missingPackages > PacketBuffer.size)
                                {
                                    Console.WriteLine("Number of lost packages were too high. Full Reconnect for client necessary!");
                                    ServerSend.InitGameLogic(fromClient);
                                }
                                else
                                {
                                    List <byte[]> lostPackages = PacketBuffer.GetLostPackets(missingPackages);
                                    Server.clients[fromClient].tcp.SendData(lostPackages);
                                }
                                Server.clients[fromClient].tcp.sentPackages = 0;
                                // Server.clients[fromClient].tcp.sentPackages = kvp.Value.tcp.sentPackages;
                                Server.clients[kvp.Key].Disconnect();
                                break;
                            }
                        }
                    }
                }
                Server.clients[fromClient].Player = clientPlayer;
            }
            else
            {
                Server.clients[fromClient].Player = GameLogic.AddPlayer(username, null);
            }

            //Stop Timer
            Server.StopPingTest(fromClient);
            ServerSend.InitGameLogic(fromClient);
        }