Cuando un nuevo jugador se une a la partida, es necesario que se lo equilibre asimétricamente en el equipo correcto. Si ese equipo es el de los Infiltrados, también necesita tener asociada una instancia de OnInfiltratorDamaged().
Sigue los pasos detallados a continuación para saber cómo equilibrar a los jugadores en el equipo correcto cuando se unen a una partida en progreso.
Cómo configurar las funciones de unión de jugadores
- Añade una nueva función
OnInfiltratorJoined()a la definición de la claseinvisibility_manager. Esta función toma un agente y genera una instancia deOnInfiltratorDamaged()con el agente dado. Añade el especificador `` a esta función, ya que la llamarás desde triad_infiltration_game.# Genera una función OnInfiltratorDamaged cuando un nuevo infiltrado se une al juego. OnInfiltratorJoined<public>(InAgent:agent):void= spawn{OnInfiltratorDamaged(InAgent)} - Añade una nueva función
OnPlayerAdded()a la definición de la clasetriad_infiltration_game. Esta función toma un jugador, lo equilibra al equipo correcto, y llama aOnInfiltratorJoined()si el nuevo jugador es un infiltrado.# Controla al nuevo jugador que se une al juego. OnPlayerAdded(InPlayer:player):void= - Obtén la
fort_team_collectiondel espacio de juego actual y guárdala en una variableFortTeamCollection.# Controla al nuevo jugador que se une al juego. OnPlayerAdded(InPlayer:player):void= Logger.Print("Se unió un nuevo jugador, se le está asignando un equipo.") FortTeamCollection := GetPlayspace().GetTeamCollection()Refactorización de equilibrio de equipo
- Necesitas equilibrar al nuevo jugador en el equipo correcto, pero si llamas a
BalanceTeams()acabarás reorganizando a cada jugador en un nuevo equipo. En lugar de reescribir el código para encontrar el equipo más pequeño para el nuevo jugador y equilibrarlos en él, esta es una buena oportunidad para la refactorización.- Añade un nuevo método
BalancePlayer()a la definición de clasetriad_infiltration_game. Este método toma a un jugador y lo equilibra asimétricamente en el equipo correcto.# Para cada jugador, itera a través de la lista de equipos y los asigna al # equipo con la menor cantidad de jugadores o al equipo inicial en caso de empate. BalancePlayer(InPlayer:player):void= Logger.Print("Equilibrando jugador.") - Extrae el código dentro del bucle
forenBalanceTeams(), colócalo dentro deBalancePlayer()y renombraTeamPlayercomoInPlayer. Tu códigoBalancePlayer()debe verse de la siguiente manera:# Para cada jugador, itera a través de la lista de equipos y los asigna al # equipo con la menor cantidad de jugadores o al equipo inicial en caso de empate. BalancePlayer(InPlayer:player):void= Logger.Print("Equilibrando jugador.") var TeamToAssign:?team = false set TeamToAssign = FindTeamWithLargestDifference() if (AssignedTeam := TeamToAssign?, GetPlayspace().GetTeamCollection().AddToTeam[InPlayer, AssignedTeam]): Logger.Print("Intentando asignarle un nuevo equipo al jugar unido recientemente.") else: Logger.Print("Este jugador ya pertenecía al equipo más pequeño.") - Ahora en
BalanceTeams(), agrega una llamada aBalancePlayer()dentro del buclefor. Esto preserva la funcionalidad deBalanceTeams()a la vez que permite equilibrar a un jugador de forma individual. Tu códigoBalanceTeams()debería verse de la siguiente manera:# Equilibra a todos los jugadores en todos los equipos del juego. BalanceTeams():void= Logger.Print("Equilibrando equipos") var AllPlayers:[]player := GetPlayspace().GetPlayers() set AllPlayers = Shuffle(AllPlayers) Logger.Print("El largo de AllPlayers es {AllPlayers.Length}.") for (TeamPlayer:AllPlayers): BalancePlayer(TeamPlayer)
- Añade un nuevo método
- De vuelta en
OnPlayerAdded(), agrega una llamada aBalancePlayer()pasando al jugador que se acaba de unir.# Controla al nuevo jugador que se une al juego. OnPlayerAdded(InPlayer:player):void= Logger.Print("Se unió un nuevo jugador, se le está asignando un equipo.") FortTeamCollection := GetPlayspace().GetTeamCollection() set AllPlayers = GetPlayspace().GetPlayers() # Asigna al jugador nuevo al equipo más pequeño BalancePlayer(InPlayer) - Busca el índice del equipo del jugador después de equilibrar; para ello, itera a través de cada equipo en la matriz
TeamsusandoGetTeam[]como filtro para comprobar que sea igual aPlayerTeam.# Controla al nuevo jugador que se une al juego. OnPlayerAdded(InPlayer:player):void= Logger.Print("Se unió un nuevo jugador, se le está asignando un equipo.") FortTeamCollection := GetPlayspace().GetTeamCollection() # Asigna el jugador nuevo al equipo más pequeño, de manera asimétrica. BalancePlayer(InPlayer) for: TeamIndex -> PlayerTeam:Teams PlayerTeam = FortTeamCollection.GetTeam[InPlayer] - Obtén el teletransportador asociado con el equipo del jugador, indéxalo a la matriz
TeleportersmedianteTeamIndexy almacénalo en una variableTeamTeleporter. Almacena la transformación de ese teletransportador en una variableTransform. Luego, haz que reaparezca el nuevo jugador en el teletransportador inicial de su equipo.for: TeamIndex -> PlayerTeam:Teams PlayerTeam = FortTeamCollection.GetTeam[InPlayer] TeamTeleporter := Teleporters[TeamIndex] Transform := TeamTeleporter.GetTransform() do: InPlayer.Respawn(Transform.Translation, Transform.Rotation) Logger.Print("Se teletransportó al jugador generado a su ubicación de inicio.") - Por último, comprueba si el jugador que acaba de unirse es un infiltrado al comparar su equipo con la opción
Infiltratorsque configuraste anteriormente. Si lo es, llama aOnInfiltratorJoined()desde la claseinvisibility_manageren el nuevo jugador para que empiece a parpadear. Tu códigoOnPlayerAdded()debería verse de la siguiente manera:# Controla al nuevo jugador que se une al juego. OnPlayerAdded(InPlayer:player):void= Logger.Print("Se unió un nuevo jugador, se le está asignando un equipo.") FortTeamCollection := GetPlayspace().GetTeamCollection() # Asigna el jugador nuevo al equipo más pequeño, de manera asimétrica. BalancePlayer(InPlayer) for: TeamIndex -> PlayerTeam:Teams PlayerTeam = FortTeamCollection.GetTeam[InPlayer] TeamTeleporter := Teleporters[TeamIndex] Transform := TeamTeleporter.GetTransform() do: InPlayer.Respawn(Transform.Translation, Transform.Rotation) Logger.Print("Se teletransportó al jugador generado a su ubicación de inicio.") # Si el jugador era un infiltrado, llama a OnInfiltratorJoined en # InvisibilityManager. if(PlayerTeam = MaybeInfiltrators?): InvisibilityManager.OnInfiltratorJoined(InPlayer) - Guarda la secuencia de comandos, compílala y haz clic en Comenzar sesión en la barra de herramientas de UEFN para probar el nivel. Cuando pruebes tu nivel, los jugadores deberán unirse al equipo correcto al unirse a una partida en curso. Si ese jugador es un infiltrado, debería aparecer invisible y parpadear al recibir daño.
Próximo paso
En el próximo paso de este tutorial, aprenderás a crear un indicador visual para un jugador cuando capture un objetivo.