Quando um novo jogador ingressa no jogo, ele precisa ser distribuído assimetricamente na equipe certa. Se essa equipe for a de Infiltradores, ela também precisará ter uma instância OnInfiltratorDamaged() associada.
Siga as etapas abaixo para saber como distribuir os jogadores na equipe correta ao ingressarem num jogo em andamento.
Configurando as funções de ingresso de jogadores
- Adicione uma nova função OnInfiltratorJoined() à definição de classe invisibility_manager. Essa função usa um agente e gera uma instância de OnInfiltratorDamaged() com o agente fornecido. Adicione o especificador
a essa função, já que você a chamará de triad_infiltration_game. ~~~(verse) # Gera uma função OnInfiltratorDamaged quando um novo infiltrador entra no jogo OnInfiltratorJoined (InAgent:agent):void= spawn{OnInfiltratorDamaged(InAgent)} ~~~ - Adicione uma nova função OnPlayerAdded() à definição de classe triad_infiltration_game. Essa função usa um jogador, o distribui na equipe correta e chama OnInfiltratorJoined() quando o novo jogador for um infiltrador. ~~~(verse) # Lida com a entrada de um novo jogador no jogo. OnPlayerAdded(InPlayer:player):void= ~~~
- Obtenha fort_team_collection do espaço de jogo atual e salve-o em uma variável FortTeamCollection.
~~~(verse)
# Lida com a entrada de um novo jogador no jogo.
OnPlayerAdded(InPlayer:player):void=
Logger.Print("Um novo jogador entrou. Atribuindo-o a uma equipe.")
FortTeamCollection := GetPlayspace().GetTeamCollection()
~~~
Refatorando a distribuição das equipes
- Você precisa equilibrar o novo jogador no time correto, mas se chamar
BalanceTeams(), você acabará reorganizando todos os jogadores em um novo time. Em vez de reescrever o código para encontrar a menor equipe para o novo jogador e colocá-lo nela, esta é uma boa oportunidade para refatorar.- Adicione um novo método BalancePlayer() à definição de classe triad_infiltration_game. Esse método usa um jogador e o equilibra assimetricamente na equipe correta.
# Para cada jogador, percorra a lista de equipes e atribua-as à # equipe com o menor número de jogadores ou à sua equipe titular em caso de empate. BalancePlayer(InPlayer:player):void= Logger.Print("Começando a equilibrar o jogador") - Extraia o código dentro do loop for em BalanceTeams() e coloque-o dentro de BalancePlayer(), renomeando TeamPlayer para InPlayer. Seu código BalancePlayer() deve ficar assim: ~~~(verse) # Para cada jogador, percorra a lista de equipes e atribua-as à # equipe com o menor número de jogadores ou à sua equipe titular em caso de empate. BalancePlayer(InPlayer:player):void= Logger.Print("Começando a equilibrar o jogador") var TeamToAssign:?team = false set TeamToAssign = FindTeamWithLargestDifference() if (AssignedTeam := TeamToAssign?, GetPlayspace().GetTeamCollection().AddToTeam[InPlayer, AssignedTeam]): Logger.Print("Tentativa de atribuir o jogador recém-ingressado a uma nova equipe") else: Logger.Print("Este jogador já estava na menor equipe") ~~~
- Agora, em BalanceTeams(), adicione uma chamada para BalancePlayer() dentro do loop for. Isso preserva a funcionalidade de BalanceTeams() e permite que você distribua um jogador individualmente. Seu código BalanceTeams() deve ter a seguinte aparência: ~~~(verse) # Equilibra todos os jogadores de todas as equipes do jogo BalanceTeams():void= Logger.Print("Começando a distribuir as equipes") var AllPlayers:[]player := GetPlayspace().GetPlayers() set AllPlayers = Shuffle(AllPlayers) Logger.Print("O comprimento de AllPlayers é {AllPlayers.Length}") for (TeamPlayer:AllPlayers): BalancePlayer(TeamPlayer) ~~~
- Adicione um novo método BalancePlayer() à definição de classe triad_infiltration_game. Esse método usa um jogador e o equilibra assimetricamente na equipe correta.
- Voltando a OnPlayerAdded(), adicione uma chamada para BalancePlayer(), transmitindo o jogador que acabou de ingressar. ~~~(verse) # Lida com a entrada de um novo jogador no jogo. OnPlayerAdded(InPlayer:player):void= Logger.Print("Um novo jogador entrou. Atribuindo-o a uma equipe.") FortTeamCollection := GetPlayspace().GetTeamCollection() set AllPlayers = GetPlayspace().GetPlayers() # Atribuir o novo jogador à menor equipe BalancePlayer(InPlayer) ~~~
-
Após o balanceamento, encontre o índice da equipe do jogador iterando cada equipe na matriz Teams com o uso de GetTeam[] como filtro para verificar sua equivalência a PlayerTeam. ~~~(verse) # Lida com a entrada de um novo jogador no jogo. OnPlayerAdded(InPlayer:player):void= Logger.Print("Um novo jogador entrou. Atribuindo-o a uma equipe.") FortTeamCollection := GetPlayspace().GetTeamCollection()
# Atribuir o novo jogador à menor equipe, de forma assimétrica. BalancePlayer(InPlayer)
for: TeamIndex -> PlayerTeam:Teams PlayerTeam = FortTeamCollection.GetTeam[InPlayer] ~~~
- Obtenha o teletransportador associado à equipe desse jogador, indexando-o na matriz Teleporters com o uso de TeamIndex e armazenando-o em uma variável TeamTeleporter. Armazene a transformação desse teletransportador em uma variável Transform. Em seguida, o novo jogador ressurge no teletransportador inicial de sua equipe. ~~~(verse) for: TeamIndex -> PlayerTeam:Teams PlayerTeam = FortTeamCollection.GetTeam[InPlayer] TeamTeleporter := Teleporters[TeamIndex] Transform := TeamTeleporter.GetTransform() do: InPlayer.Respawn(Transform.Translation, Transform.Rotation) Logger.Print("Teletransportou o jogador gerado para seu local inicial") ~~~
-
Por fim, verifique se o jogador que acabou de ingressar é um infiltrador, comparando sua equipe com a opção Infiltrators configurada anteriormente. Se for, chame OnInfiltratorJoined() da classe invisibility_manager no novo jogador para permitir que ele comece a piscar. O código OnPlayerAdded() deve ter a seguinte aparência: ~~~(verse) # Lida com a entrada de um novo jogador no jogo. OnPlayerAdded(InPlayer:player):void= Logger.Print("Um novo jogador entrou. Atribuindo-o a uma equipe.") FortTeamCollection := GetPlayspace().GetTeamCollection()
# Atribuir o novo jogador à menor equipe, de forma assimé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("Teletransportou o jogador gerado para seu local inicial") # Se o jogador era um infiltrador, chamar OnInfiltratorJoined em # InvisibilityManager. if(PlayerTeam = MaybeInfiltrators?): InvisibilityManager.OnInfiltratorJoined(InPlayer) ~~~
- Salve o script, compile-o e clique em Iniciar Sessão na barra de ferramentas do UEFN para testar o nível. Durante o teste, os jogadores deverão entrar na equipe correta ao ingressarem em um jogo em andamento. Se o jogador for um infiltrador, deverá surgir invisível e piscar ao receber dano.
Próxima etapa
Na próxima etapa deste tutorial, você aprenderá a criar um indicador visual para um jogador ao capturar um objetivo.