Beispiel #1
0
        public override void ProcessPacket(Guid sourcePlayerId, Packet packet, IProcessorContext context)
        {
            ServerProcessorContext    processorContext          = (ServerProcessorContext)context;
            AuthenticateRequestPacket authenticateRequestPacket = (AuthenticateRequestPacket)packet;
            ServerSettings            serverSettings            = processorContext.Server.Settings;
            PlayerManager             playerManager             = processorContext.Server.PlayerManager;
            SimulationManager         simulationManager         = processorContext.Server.SimulationManager;

            AuthenticatePacket authenticateResponsePacket;

            if (playerManager.PlayerExists(sourcePlayerId))
            {
                return; // Player already authenticated
            }
            // Will fail if the requested username contains disallowed characters/does not meet length requirements/etc.
            if (!playerManager.IsUsernameAllowed(authenticateRequestPacket.Username))
            {
                authenticateResponsePacket = new AuthenticatePacket(false, AuthenticationErrorReason.IllegalUsername, null, null, null);
                Console.WriteLine($"Player {sourcePlayerId} attempted joining with an illegal username");
            }
            // Will fail if a player with the same nickname is already connected.
            else if (playerManager.IsUsernameTaken(authenticateRequestPacket.Username))
            {
                authenticateResponsePacket = new AuthenticatePacket(false, AuthenticationErrorReason.UsernameTaken, null, null, null);
                Console.WriteLine($"Player {sourcePlayerId} attempted joining with an already taken username: {authenticateRequestPacket.Username}");
            }
            // Will fail if the authenticating client provided an incorrect server password.
            else if (serverSettings.PasswordProtected && serverSettings.Password != authenticateRequestPacket.Password)
            {
                authenticateResponsePacket = new AuthenticatePacket(false, AuthenticationErrorReason.IncorrectPassword, null, null, null);
                Console.WriteLine($"Player {sourcePlayerId} attempted joining with an incorrect password");
            }
            // Approve authentication request and let other players know that a player joined.
            else
            {
                Player   client          = playerManager.CreatePlayer(sourcePlayerId, authenticateRequestPacket.Username, state: PlayerState.ConnectedMainMenu);
                Player[] players         = playerManager.GetPlayers().ToArray();
                Player?  simulationOwner = simulationManager.GetSimulationOwner();
                authenticateResponsePacket = new AuthenticatePacket(true, null, client, players, simulationOwner);
                Console.WriteLine($"Player {sourcePlayerId} successfully authenticated!");
            }

            processorContext.Server.SendPacketToPlayer(authenticateResponsePacket, sourcePlayerId);
        }
        public override void ProcessPacket(Guid sourcePlayerId, Packet packet, IProcessorContext context)
        {
            ClientProcessorContext processorContext   = (ClientProcessorContext)context;
            AuthenticatePacket     authenticatePacket = (AuthenticatePacket)packet;
            PlayerManager          playerManager      = processorContext.Client.PlayerManager;

            if (!authenticatePacket.AuthenticationSuccessful)
            {
                switch (authenticatePacket.ErrorReason.Value)
                {
                case AuthenticationErrorReason.UsernameTaken:
                    MessageBoxOk.Show(null, "Failed to join game", "Failed to connect to the server: Username is already taken");
                    break;

                case AuthenticationErrorReason.IncorrectPassword:
                    MessageBoxOk.Show(null, "Failed to join game", "Failed to connect to the server: Incorrect password");
                    break;

                case AuthenticationErrorReason.IllegalUsername:
                    MessageBoxOk.Show(null, "Failed to join game", "Failed to connect to the server: Username contains disallowed characters");
                    break;
                }

                processorContext.Client.RequestDisconnect();
                return;
            }

            processorContext.Client.LocalPlayer = authenticatePacket.LocalPlayer.Value;
            processorContext.Client.SimulationManager.OnSimulationOwnerUpdated(authenticatePacket.SimulationOwner);
            foreach (Player player in authenticatePacket.Players)
            {
                playerManager.OnPlayerAdded(player); // Sync players
            }
            Debug.Log("Sending world data request");
            WorldDataRequestPacket worldDataRequestPacket = new WorldDataRequestPacket();

            processorContext.Client.SendPacket(worldDataRequestPacket);
        }