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); }