Você usará um mapa para acompanhar o número de eliminações que um jogador marcou. Mapas fornecem uma associação útil de chaves a valores e, neste tutorial, você usará o jogador como chave e o nível de arma associado (representado como um int) como valor. Dessa forma, poderá recuperar o nível atual de um jogador com apenas uma referência a esse jogador. Um exemplo de aparência de um mapa de associações de níveis entre jogadores e armas é fornecido abaixo.
| Chave | jogador 1 | jogador 2 | jogador 3 |
| Valor | 1 | 2 | 2 |
| Arma no Jogo | Pistola de Combate L1 | Pistola Repulsora L1 | Pistola Repulsora L1 |
Siga estas etapas para configurar e preencher seu mapa de jogadores:
-
Adicione o mapa
[player]intchamadoPlayerMapà classeteam_elimination_game. Isso armazena uma referência para cada jogador e seu nível de arma.~~~(verse) team_elimination_game := class(creative_device): var PlayerMap : [player]int = map{} ~~~
-
Adicione um novo método
PopulateTeamsAndPlayers()à classeteam_elimination_game. Esse método preenche seuPlayerMape será chamado deOnBegin().~~~(verse) PopulateTeamsAndPlayers() : void= Print("Começando a preencher jogadores") ~~~
-
Adicione um novo método,
OnPlayerEliminated, à classeteam_elimination_game. Ele é chamado sempre que um jogador é eliminado e determinará quem é o jogador eliminador, acessando o structelimination_resultpassado como um argumento.OnPlayerEliminated(Result : elimination_result) : void= Print("Um jogador foi eliminado!") -
Quando o jogo começa, você precisa percorrer a lista de jogadores e defini-los todos para o primeiro nível de arma. Dentro de
PopulateTeamsAndPlayers, obtenha todos os jogadores usandoGetPlaySpace().GetPlayers()e salve-os em uma matrizAllPlayers. Para cada jogador, recupere o respectivoFortCharactere salve-o em uma variávelFortCharacter. Defina a pontuação desse jogador emPlayerMapcomo 0 para representar a primeira arma na matrizWeaponGranters, em seguida registreFortCharacter.EliminatedEvent()paraOnPlayerEliminated.~~~(verse) AllPlayers := GetPlayspace().GetPlayers() for (Agent : AllPlayers, TeamPlayer := player[Agent], FortCharacter := TeamPlayer.GetFortCharacter[]): if(set PlayerMap[TeamPlayer] = 0, WeaponTier := PlayerMap[TeamPlayer]): Print("Jogador atribuído ao PlayerMap com Nível {WeaponTier}") FortCharacter.EliminatedEvent().Subscribe(OnPlayerEliminated) ~~~
-
Com uma referência à pontuação do jogador no conjunto
PlayerMap, você pode conceder aos jogadores suas primeiras armas. ModifiqueOnPlayerSpawnpara conceder aos jogadores suas primeiras armas. Quando um jogador surgir, recupere seu nível de arma dePlayerMape armazene-o em uma variávelWeaponTier. Em seguida, chameGrantWeaponpassandoWeaponTiere uma referência ao jogador.~~~(verse) OnPlayerSpawn(InPlayer : agent) : void = Print("Um jogador acabou de surgir!") if(WeaponTier := PlayerMap[InPlayer]): GrantWeapon(option{InPlayer}, WeaponTier) Print("O jogador que surgiu recebeu uma arma de nível {WeaponTier}") ~~~
-
Salve o código no Visual Studio Code, compile-o e clique em Iniciar sessão na barra de ferramentas do UEFN para testar o nível. Ao testar seu nível, você deve surgir com a primeira arma na matriz
WeaponGranters. Verifique esse comportamento com o log.
Como mapear equipes de jogadores
Com seu mapa de jogadores configurado, é útil pensar em como você verifica a pontuação de um jogador. Como seu script promoverá automaticamente o jogador da equipe com menos eliminações, não é útil verificar o nível de arma dos jogadores da equipe inimiga. Você já pode ver um problema surgindo, já que PlayerMap não diferencia entre as equipes.
Para contornar esse problema, você pode usar outro mapa. Para isso, você adaptará PlayerMap que configurou anteriormente em um sistema de mapas aninhados. Como os pares chave/valor em um mapa podem ser quaisquer pares de tipos, faz sentido que uma chave de equipe possa ter outro mapa como valor. O primeiro mapa associará equipes (chave) a outro mapa de jogadores daquela equipe (valor). O mapa interno associará jogadores (chave) à sua pontuação (valor).
Agora, com um jogador especificado, você pode verificar em qual equipe ele está usando GetTeam(). A partir daí, é possível recuperar uma lista de companheiros de equipe para comparar o número de eliminações.
A sintaxe do mapa aninhado [team][player]int pode não ser clara. Para tornar isso mais fácil de entender, você pode aproveitar o serrilhado de tipo para criar um nome mais simples para referenciar o mapa. Neste tutorial, você dará a [player]int o alias de player_map. Ou seja, você pode usar o nome player_map sempre que precisar de [player]int, e o mapa aninhado pode ser reescrito como [team]player_map ou um mapa que associa equipes a mapas de jogadores.
Siga estas etapas para adaptar seu mapa em um sistema de mapas aninhados:
-
Acima da definição da classe
team_elimination_game, adicione um alias para[player]intchamadoplayer_map.~~~(verse) player_map := [player]int # Este é um alias de tipo! team_elimination_game := class(creative_device): ~~~
-
Substitua a variável
PlayerMapque você configurou anteriormente emteam_elimination_gamepor uma nova variávelTeamMapdo tipo[team]player_map.~~~(verse) # Mapa dos Mapas da Equipe, em que a chave é a equipe e o valor é um mapa de # player->int key-value pairs var TeamMap : [team]player_map = map{} ~~~
-
Como o valor de
TeamMapé do tipoplayer_map, para cada equipe, você precisa inicializar um mapa de jogadores, preenchê-los, definir a pontuação de cada jogador como0e, em seguida, atribuir o mapa de jogadores aTeamMap. ModifiquePopulateTeamsAndPlayers()com o código atualizado.- Para cada equipe, recupere os jogadores dessa equipe e armazene-os em uma variável
TeamPlayers. Inicialize uma nova variávelPlayerMapdo tipoplayer_mappara mapear jogadores para sua pontuação.
PopulateTeamsAndPlayers() : void= Print("Começando a preencher jogadores") for (Team : Teams, TeamPlayers := GetPlayspace().GetTeamCollection().GetAgents[Team]): var PlayerMap : player_map = map {} ~~~ *Para cada jogador em `TeamPlayers`, recupere o respectivo `FortCharacter` e salve-o em uma variável `FortCharacter`. Defina a pontuação desse jogador em `PlayerMap` como `0` para representar a primeira arma na matriz `WeaponGranters`, em seguida registre `FortCharacter.EliminatedEvent()` para `OnPlayerEliminated`. ~~~(verse) PopulateTeamsAndPlayers() : void = Print("Começando a preencher jogadores") for (Team : Teams, TeamPlayers := GetPlayspace().GetTeamCollection().GetAgents[Team]): var PlayerMap : player_map = map {} for (Agent : TeamPlayers, TeamPlayer := player[Agent], FortCharacter := Agent.GetFortCharacter[]): if(set PlayerMap[TeamPlayer] = 0, WeaponTier := PlayerMap[TeamPlayer]): Print("Jogador atribuído ao PlayerMap com Nível {WeaponTier}") FortCharacter.EliminatedEvent().Subscribe(OnPlayerEliminated)- Por fim, defina
PlayerMapcomo o valor da chave atualTeamnoTeamMap. Seu códigoPopulateTeamsAndPlayersdeve ficar como mostrado abaixo.
PopulateTeamsAndPlayers() : void = Print("Começando a preencher jogadores") for (Team : Teams, TeamPlayers := GetPlayspace().GetTeamCollection().GetAgents[Team]): var PlayerMap : player_map = map {} for (Agent : TeamPlayers, TeamPlayer := player[Agent], FortCharacter := Agent.GetFortCharacter[]): if(set PlayerMap[TeamPlayer] = 0, WeaponTier := PlayerMap[TeamPlayer]): Print("Jogador atribuído ao PlayerMap com Nível {WeaponTier}") FortCharacter.EliminatedEvent().Subscribe(OnPlayerEliminated) if(set TeamMap[Team] = PlayerMap): Print(“Equipe definida com sucesso no TeamMap") - Para cada equipe, recupere os jogadores dessa equipe e armazene-os em uma variável
-
Depois de definir
TeamMap, atualizeOnPlayerSpawnpara acessar a equipe de um jogador usandoGetTeam[]e armazene-a em uma variável localPlayerTeam. DefinaWeaponTierrecuperando a pontuação atual do jogador emTeamMap, usandoPlayerTeame uma referência ao jogador. OOnPlayerSpawn()atualizado deve se parecer com o seguinte código.~~~(verse) OnPlayerSpawn(InPlayer : agent) : void = Print("Um jogador acabou de surgir!") if: PlayerTeam := GetPlayspace().GetTeamCollection().GetTeam[InPlayer] WeaponTier:int := TeamMap[PlayerTeam][InPlayer] then: GrantWeapon(option{InPlayer}, WeaponTier) Print("O jogador que surgiu recebeu uma arma de nível {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.
Próxima etapa
Na próxima etapa deste tutorial, você aprenderá a conceder armas aos jogadores quando eles marcarem uma eliminação.