Agora que você configurou seus mapas, o próximo passo é distribuir armas quando um jogador marcar uma eliminação.
Quando um jogador marca uma eliminação, você deve aplicar estas duas regras:
-
Se o jogador não estiver no nível de arma mais alto em sua equipe, ou todos os jogadores estiverem no mesmo nível de arma, promova-o para o próximo nível de arma.
-
Caso contrário, se houver um jogador em sua equipe com um nível de arma inferior, promova esse jogador.
Isso garantirá que os jogadores avancem pelas armas como uma equipe, e nenhum jogador estará mais de uma arma à frente ou atrás de qualquer um de seus companheiros de equipe.
Para fazer isso, você precisará saber quando um jogador marca uma eliminação e então comparar seu nível de arma com todos os outros jogadores de sua equipe e promover esse jogador com base nas duas regras acima.
Siga estas etapas para distribuir armas aos jogadores quando eles marcarem uma eliminação.
-
Adicione um novo método
GiveNextWeaponà classeteam_elimination_game. Esse método concede a um jogador uma arma sempre que ele ou alguém de sua equipe marcar uma eliminação com base nas duas regras acima.~~~(verse) GiveNextWeapon(EliminatingPlayer : agent) : void = Print("Encontrando um jogador para promover") ~~~
-
Atualize
OnPlayerEliminatedpara rastrear qual jogador marcou uma eliminação. ComoOnPlayerEliminatedaceita umelimination_result, você obtém referência a um personagem eliminado e um personagem eliminador. Como os jogadores podem ser eliminados por vários meios (como danos de queda, sentinelas, danos autoinfligidos, etc.), você precisa deduzir seEliminatingCharacteré umFortCharacterreal (ou seja, um jogador real).-
Obtenha uma referência a
Result.EliminatingCharactere salve-a em uma variável de opção localEliminator. Verifique seEliminatoré umFortCharacterválido e, se for, salve o agente para esse caractere em outra variávelEliminatorAgent. Por último, passeEliminatorAgentparaGiveNextWeapon~~~(verse) OnPlayerEliminated(Result : elimination_result) : void = Print("Um jogador foi eliminado!") Eliminator := Result.EliminatingCharacter if (FortCharacter := Eliminator?, EliminatorAgent := FortCharacter.GetAgent[]): GiveNextWeapon(EliminatorAgent) ~~~
-
-
GiveNextWeaponprecisa rastrear várias variáveis para distribuir ao jogador correto uma nova arma. Adicione as seguintes declarações aGiveNextWeapon.-
Uma variável int
WeaponTier. Isso rastreia o nível de arma do jogador para distribuir uma arma. -
Uma variável agent opcional chamada
MaybePlayerToGrant, que é o jogador a quem distribuir uma arma. Por padrão, este é o jogador passado paraGiveNextWeapon. -
Uma variável team opcional chamada
MaybePlayerTeam, que é a equipe do jogador ao qual distribuir uma arma. Por padrão, essa é a equipe do jogador passada paraGiveNextWeapon.~~~(verse) GiveNextWeapon(EliminatingPlayer : agent) : void = Print("Encontrando um jogador para promover") var WeaponTier : int = 0 var MaybePlayerToGrant : ?agent = option{EliminatingPlayer} # O jogador ao qual conceder uma arma var MaybePlayerTeam : ?team = option{GetPlayspace().GetTeamCollection().GetTeam[EliminatingPlayer]} # A equipe da qual este jogador faz parte ~~~
-
-
Extraia o valor de
MaybePlayerTeamem uma variável localPlayerTeame definaWeaponTiercomo o valor da pontuação do jogador emTeamMap.~~~(verse) var MaybePlayerTeam : ?team = option{GetPlayspace().GetTeamCollection().GetTeam[EliminatingPlayer]} # A equipe da qual este jogador faz parte if(PlayerTeam := MaybePlayerTeam?, set WeaponTier = TeamMap[PlayerTeam][EliminatingPlayer]): ~~~
-
Itere através de cada jogador da equipe e compare seu nível de arma. Se você encontrar um jogador em um nível inferior, defina
MaybePlayerToGrantpara esse jogador eWeaponTierpara sua pontuação. Observe que, comoTeamMapé um mapa, você pode extrair a chave (jogador) e o valor (nível da arma) como variáveis locais usando a sintaxeTeammate -> TeammateTier.~~~(verse) if(PlayerTeam := MaybePlayerTeam?, set WeaponTier = TeamMap[PlayerTeam][EliminatingPlayer]): for(Teammate -> TeammateTier : TeamMap[PlayerTeam], TeammateTier < WeaponTier): Print("Encontrado um colega de equipe com um nível inferior no nível {TeammateTier}") if(set WeaponTier = TeamMap[PlayerTeam][Teammate]): set MaybePlayerToGrant = option{Teammate} ~~~
-
Depois de encontrar o jogador no nível de arma mais baixo (ou empatado no nível mais baixo), aumente em um o
WeaponTier, em seguida defina a categoria da arma emTeamMapparaWeaponTier.~~~(verse) if(PlayerTeam := MaybePlayerTeam?, set WeaponTier = TeamMap[PlayerTeam][EliminatingPlayer]): for(Teammate -> TeammateTier : TeamMap[PlayerTeam], TeammateTier < WeaponTier): Print("Encontrado um colega de equipe com um nível inferior no nível {TeammateTier}") if(set WeaponTier = TeamMap[PlayerTeam][Teammate]): set MaybePlayerToGrant = option{Teammate}
set WeaponTier = WeaponTier + 1 if(PlayerTeam := MaybePlayerTeam?, PlayerToGrant := player[MaybePlayerToGrant?], set TeamMap[PlayerTeam][PlayerToGrant] = WeaponTier): Print("A eliminação do nível de jogador agora é {WeaponTier}") ~~~
-
Este é um bom lugar para verificar se um jogador ganhou o jogo, porque incrementar seu nível de arma pode empurrá-lo para além do número de eliminações necessárias para terminar o jogo.
- Crie um novo método
EndGamena classeteam_elimination_game. Este método ativa oEndGameDeviceno jogador especificado quando ele atinge o nível de arma final. O método concluído deve ter esta aparência:
EndGame(InPlayer : agent) : void = Print("Jogador alcançou o Nível de Arma final, ativando EndGameDevice") EndGameDevice.Activate(InPlayer)-
De volta a
GiveNextWeapon, após incrementar o nível da arma do jogador, confiraif WeaponTier >= EliminationsToEndGame. Em caso afirmativo, chameEndGamepassando o jogador.~~~(verse) if(PlayerTeam := MaybePlayerTeam?, PlayerToGrant := player[MaybePlayerToGrant?], set TeamMap[PlayerTeam][PlayerToGrant] = WeaponTier): Print("A eliminação do nível de jogador agora é {WeaponTier}")
if(WeaponTier >= EliminationsToEndGame): EndGame(EliminatingPlayer) ~~~
- Crie um novo método
-
Caso contrário, chame
GrantWeaponemGrantedPlayer.~~~(verse) if(WeaponTier >= EliminationsToEndGame): EndGame(EliminatingPlayer)
GrantWeapon(MaybePlayerToGrant, WeaponTier) ~~~
-
O método
GiveNextWeaponconcluído deve se parecer com o seguinte código.GiveNextWeapon(EliminatingPlayer : agent) : void = Print("Encontrando um jogador para promover") var WeaponTier : int = 0 var MaybePlayerToGrant : ?agent = option{EliminatingPlayer} # O jogador ao qual conceder uma arma var MaybePlayerTeam : ?team = option{GetPlayspace().GetTeamCollection().GetTeam[EliminatingPlayer]} # A equipe da qual este jogador faz parte if(PlayerTeam := MaybePlayerTeam?, set WeaponTier = TeamMap[PlayerTeam][EliminatingPlayer]): for(Teammate -> TeammateTier : TeamMap[PlayerTeam], TeammateTier < WeaponTier): Print("Encontrado um colega de equipe com um nível inferior no nível {TeammateTier}") if(set WeaponTier = TeamMap[PlayerTeam][Teammate]): set MaybePlayerToGrant = option{Teammate} set WeaponTier = WeaponTier + 1 if(PlayerTeam := MaybePlayerTeam?, PlayerToGrant := player[MaybePlayerToGrant?], set TeamMap[PlayerTeam][PlayerToGrant] = WeaponTier): Print("A eliminação do nível de jogador agora é {WeaponTier}") if(WeaponTier >= EliminationsToEndGame): EndGame(EliminatingPlayer) GrantWeapon(MaybePlayerToGrant, WeaponTier)
Salve o script no Visual Studio Code, compile-o e clique em Iniciar sessão na barra de ferramentas do UEFN para reproduzir o teste do nível. Ao testar seu nível, você deve surgir novamente com a primeira arma na matriz WeaponGranters. Verifique esse comportamento com o log. Marcar uma eliminação em um jogador inimigo deve promovê-lo para a próxima arma. As promoções devem seguir as duas regras descritas acima. Promover a arma final na sequência deve terminar o jogo com o jogador eliminador como vencedor.

Próxima etapa
Na próxima etapa deste tutorial, você aprenderá a adicionar jogadores ao seu mapa e atribuir a eles uma arma quando eles entrarem em um jogo em andamento.