Como configurar as equipes
Nesta seção, você aprenderá a configurar as equipes de caçadores e adereços no início do jogo e teletransportá-las para suas áreas iniciais.
Essa página inclui trechos de Verse que mostram como executar as mecânicas de jogo necessárias nesse modo de jogo. Siga as etapas a seguir e copie o script completo na etapa 6 deste tutorial.
Siga estas etapas para configurar suas equipes corretamente:
-
Crie uma nova função SetupTeams(). Aqui você configurará várias inscrições a funções que serão definidas posteriormente, como funções para quando um adereço for eliminado ou o que fazer quando um jogador entrar no jogo.
~~~(verse) # Quando uma rodada começa, inscreva aos dispositivos de equipe, selecione aleatoriamente os agentes caçadores, habilite o cronômetro dos caçadores, defina os agentes de adereços e teletransporte-os para a área do jogo. SetUpTeams()
:void = Logger.Print("Configurando equipes.") ~~~ -
Primeiro, inscreva ao SuccessEvent do cronômetro de pontuação da equipe de adereços, o evento eliminado de TeamManager da equipe de adereços e defina a pontuação concedida ao gerenciador de pontuação.
# Quando uma rodada começa, inscreva aos dispositivos de equipe, selecione aleatoriamente os agentes caçadores, habilite o cronômetro dos caçadores, defina os agentes de adereços e teletransporte-os para a área do jogo. SetUpTeams()<suspends>:void = Logger.Print("Configurando equipes.") # Inscreva no cronômetro da pontuação da equipe de adereços, defina a pontuação concedida e inscreva o evento de eliminação da equipe de adereços. PropTeam.ScoreTimer.SuccessEvent.Subscribe(PropTeam.OnPropsScore) PropTeam.ScoreManager.SetScoreAward(PropTeam.ScorePerSecond) PropTeam.TeamManager.TeamMemberEliminatedEvent.Subscribe(OnPropEliminated) # Ocorre quando um agente de adereço é eliminado. -
Em seguida, faça o mesmo para a equipe de caçadores. Depois, defina o cronômetro de espera da equipe de caçadores para o atraso de surgimento que você deseja para os caçadores.
~~~(verse) # Quando uma rodada começa, inscreva aos dispositivos de equipe, selecione aleatoriamente os agentes caçadores, habilite o cronômetro dos caçadores, defina os agentes de adereços e teletransporte-os para a área do jogo. SetUpTeams()
:void = Logger.Print("Configurando equipes.") # Inscreva no cronômetro da pontuação da equipe de adereços, defina a pontuação concedida e inscreva o evento de eliminação da equipe de adereços. PropTeam.ScoreTimer.SuccessEvent.Subscribe(PropTeam.OnPropsScore) PropTeam.ScoreManager.SetScoreAward(PropTeam.ScorePerSecond) PropTeam.TeamManager.TeamMemberEliminatedEvent.Subscribe(OnPropEliminated) # Ocorre quando um agente de adereço é eliminado.
# Inscreva no cronômetro de espera da equipe de caçadores e defina sua duração. Inscreva também o evento de eliminação da equipe de caçadores. HunterTeam.WaitTimer.SuccessEvent.Subscribe(HuntersGo) HunterTeam.WaitTimer.SetMaxDuration(HunterTeam.SpawnDelay) HunterTeam.TeamManager.EnemyEliminatedEvent.Subscribe(OnHunterEliminated) # Ocorre quando um agente de caçador elimina um agente adereço. ~~~
-
Ainda dentro de
SetupTeams(), inicialize as matrizes de agentes caçadores e de adereços iniciais, depois habilite o HUD de espera enquanto verifica se há jogadores suficientes para começar o jogo. Se houver, desabilite o HUD de espera.# Inicialize as matrizes de agentes caçadores e de adereços iniciais. Obtenha os jogadores e procure o número de jogadores no servidor. var StartingHunterAgents:[]agent = array{} var StartingPropAgents:[]agent = array{} var Players:[]player = GetPlayspace().GetPlayers() # Habilite o HUD adequado para esperar os jogadores. HUDControllerWaiting.Enable() #Verifica se há jogadores suficientes para iniciar a rodada. set Players = WaitingForMorePlayers.WaitForMinimumNumberOfPlayers(Players) Logger.Print("Rodada iniciada.") # Desabilite o HUD de espera para usar o HUD de maior prioridade seguinte. HUDControllerWaiting.Disable() -
Agora que a rodada começou, você precisa lidar com o que acontece quando um jogador entrar na partida ou for removido dela. Você configurará as inscrições aqui e definirá essas funções depois.
~~~(verse) # Agora que a rodada começou, precisamos lidar com a adição ou remoção de jogadores da partida. Inscreva nesses eventos. GetPlayspace().PlayerAddedEvent().Subscribe(OnPlayerAdded) GetPlayspace().PlayerRemovedEvent().Subscribe(OnPlayerRemoved) ~~~
-
O número de caçadores iniciais se baseia em quantos jogadores há no jogo. Não queremos um caçador tendo que lidar com dez jogadores, então você definirá uma função que define o número de caçadores com base em uma fórmula. Converta o número de jogadores para um float que será usado na fórmula.
# Calcule o número de agentes caçadores iniciais para o jogo com base na contagem de jogadores e no número de agentes caçadores pelo número de jogadores. NumberOfPlayers:float = 1.0 * Players.Length # Converte Players.Length para um float, para que possa ser usado na próxima função "Ceil". -
Agora, defina o número de caçadores iniciais para o teto da fórmula a seguir. Depois, embaralhe a matriz de todos os jogadores, pois queremos que os caçadores iniciais sejam escolhidos aleatoriamente da lista de jogadores.
~~~(verse) # Calcule o número de agentes caçadores iniciais para o jogo com base na contagem de jogadores e no número de agentes caçadores pelo número de jogadores. NumberOfPlayers:float = 1.0 * Players.Length # Converte Players.Length para um float, para que possa ser usado na próxima função "Ceil".
if (NumberOfStartingHunters:int = Ceil[NumberOfPlayers / Max(1.1, HunterTeam.HunterAgentPerNumberOfPlayers)]): # Embaralhe os jogadores e depois divida a matriz para obter os agentes caçadores iniciais. Os jogadores restantes são os agentes de adereços iniciais. var RandomizedPlayers:[]agent = Shuffle(Players) ~~~
-
Divida a matriz aleatorizada para um tamanho entre 0 e seu número de caçadores iniciais. Essa será a equipe inicial de caçadores, então defina-a como StartingHuntersAgents. O resto dos jogadores comporá a equipe de adereços inicial, então defina-a como StartingPropAgents.
~~~(verse) # Calcule o número de agentes caçadores iniciais para o jogo com base na contagem de jogadores e no número de agentes caçadores pelo número de jogadores. NumberOfPlayers:float = 1.0 * Players.Length # Converte Players.Length para um float, para que possa ser usado na próxima função "Ceil".
if (NumberOfStartingHunters:int = Ceil[NumberOfPlayers / Max(1.1, HunterTeam.HunterAgentPerNumberOfPlayers)]): # Embaralhe os jogadores e depois divida a matriz para obter os agentes caçadores iniciais. Os jogadores restantes são os agentes de adereços iniciais.
var RandomizedPlayers:[]agent = Shuffle(Players) if (set StartingHunterAgents = RandomizedPlayers.Slice[0,NumberOfStartingHunters]) {}
if (set StartingPropAgents = RandomizedPlayers.Slice[NumberOfStartingHunters,RandomizedPlayers.Length]) {} # Itere pelos agentes caçadores iniciais e atribua-os à equipe de caçadores. Depois, inicie o cronômetro de espera dos caçadores. Logger.Print("Definindo {StartingHunterAgents.Length} agente(s) caçador(es).")
for (StartingHunterAgent : StartingHunterAgents): HunterTeam.InitializeAgent(StartingHunterAgent) HunterTeam.WaitTimer.Start()
# Itere pelos agentes de adereços iniciais e atribua-os à equipe de adereços. Teletransporte-os para a área de jogo. Logger.Print("Definindo {StartingPropAgents.Length} agente(s) de adereço(s).") ~~~
-
Com as equipes definidas, habilite o teletransportador do lobby para teletransportar os adereços para fora da sala inicial e ative os batimentos cardíacos. Em seguida, desabilite o teletransportador do lobby, pois ele não será necessário depois disso. Por fim, defina o número de adereços restantes no PropsRemainingTracker para o tamanho da equipe de adereços.
LobbyTeleporter.Enable() for (StartingPropAgent : StartingPropAgents): PropTeam.InitializeAgent(StartingPropAgent) PropTeam.HeartBeat.SetUpUI(StartingPropAgent) LobbyTeleporter.Activate(StartingPropAgent) LobbyTeleporter.Disable() # Defina o destino (Target) e o valor (Value) do rastreador (Tracker) dos adereços restantes para o número atual de adereços. # Futuramente, atualizaremos apenas o valor enquanto os adereços são eliminados. PropTeam.PropsRemainingTracker.SetTarget(PropTeam.Count()) PropTeam.UpdatePropsRemainingTracker()
Como gerenciar as eliminações dos jogadores
Os caçadores vencem quando eliminam todos os adereços e os convertem em caçadores. Siga estas etapas para conceder uma pontuação aos caçadores quando um adereço é eliminado, e para transferir os adereços eliminados para a equipe de caçadores.
-
Crie uma função chamada OnHunterEliminated(). Você inscreveu o dispositivo gerenciador de equipes dos caçadores EnemyEliminatedEvent para esta função anteriormente, então, agora ela será ativada sempre que um caçador eliminar um adereço.
~~~(verse) # Quando um agente caçador eliminar um agente de adereço, conceda pontos. A pontuação é dividida pelo número de agentes de adereços restantes. OnHunterEliminated(HunterAgent:agent):void = Logger.Print("Uma agente caçador eliminou um agente de adereço.") ~~~
-
Primeiro, você precisa conceder aos caçadores uma pontuação proporcional ao número de agentes de adereços restantes. Crie uma variável
EliminationAwardigual aMaxEliminationScoredividido porPropTeamSize. Defina o gerenciador de pontuação da equipe de caçadores para essa pontuação, depois conceda pontos ao caçador que executou a eliminação.~~~(verse)
# Quando um agente caçador eliminar um agente de adereço, conceda pontos. A pontuação é dividida pelo número de agentes de adereços restantes. OnHunterEliminated(HunterAgent:agent):void = Logger.Print("Uma agente caçador eliminou um agente de adereço.")PropTeamSize := PropTeam.Count()
if (EliminationAward := Floor(HunterTeam.MaxEliminationScore / PropTeamSize)): Logger.Print("Concedendo {EliminationAward} pontos.") HunterTeam.ScoreManager.SetScoreAward(EliminationAward) HunterTeam.ScoreManager.Activate(HunterAgent) ~~~
-
Você também precisa lidar com o que acontece com a equipe de adereços quando um adereço é eliminado. Crie uma função chamada OnPropEliminated(). Como OnHunterEliminated(), você inscreveu a esta função anteriormente. Quando um adereço é eliminado, você precisa removê-lo da equipe de adereços usando a função EliminateAgent() de PropTeam, depois inicializá-lo como um caçador com a função InitializeAgent() de HunterTeam.
~~~(verse) # Quando um agente de adereço é eliminado, remova o adereço da equipe de adereços, verifique quanto ao fim da rodada e defina-o como um caçador. OnPropEliminated(PropAgent:agent):void = Logger.Print("Agente de adereço eliminado.") spawn{ PropTeam.EliminateAgent(PropAgent) }
HunterTeam.InitializeAgent(PropAgent) ~~~
Como gerenciar jogadores que entram e saem do jogo
Quando um jogador entrar no jogo no meio da rodada, ele deve surgir como um caçador.
-
Crie uma função OnPlayerAdded() para cuidar disso. Essa função apenas inicializa o jogador que entra como caçador.
~~~(verse) # Quando um jogador entra na partida no meio da rodada, torne-o um caçador. OnPlayerAdded(Player:player):void = Logger.Print("Um jogador entrou no jogo.") HunterTeam.InitializeAgent(Player) ~~~
-
Lidar com os jogadores que saem da partida é um pouco mais complicado. Se um jogador sair da partida, precisamos removê-lo da equipe em que estão, e também verificar se quando saírem, o jogo terminará. Isso pode acontecer porque o jogador que saiu era o último adereço ou o único caçador. Essa lógica é operada pelas funções EliminateAgent() de cada equipe, então você gerará uma instância delas dependendo de qual equipe o jogador removido pertencia.
~~~(verse) # Quando um jogador sai da partida, verifique em que equipe ele estava e depois verifique quanto ao fim da rodada. OnPlayerRemoved(Player:player):void= Logger.Print("Um jogador saiu do jogo.")
if (PropTeam.FindOnTeam[Player]): Logger.Print("O jogador era um adereço.") spawn{ PropTeam.EliminateAgent(Player) }
if (HunterTeam.FindOnTeam[Player]): Logger.Print("O jogador era um caçador.") spawn{ HunterTeam.EliminateAgent(Player) } ~~~
Fim da rodada
Quando todas as equipes estiverem definidas, você precisa monitorar o tamanho de cada equipe e verificar quanto ao fim da rodada. O jogo termina quando uma das equipes estiver vazia ou quando o tempo da rodada terminar, então você usará uma expressão "race" (corrida) para saber o que acontece primeiro.
-
No fim da sua função OnBegin(), na expressão de corrida, execute Await() de TeamEmptyEvent da equipe de caçadores e de adereços, e a função AwaitEnd() de RoundTimer. Quando a corrida terminar, chame a função EndRound() que você definirá na próxima etapa.
~~~(verse) # Quando não houver mais agentes de adereços ou caçadores (o que acontecer primeiro), o cronômetro da rodada chegar ao fim ou a rodada terminar. race: PropTeam.TeamEmptyEvent.Await() HunterTeam.TeamEmptyEvent.Await() RoundTimer.AwaitEnd(). Logger.Print("Rodada terminando.") EndRound() ~~~
-
Na função EndRound(), você precisa desabilitar o sensor de batimento cardíaco para os jogadores na equipe de adereços e chamar EndRound() no dispositivo RoundSettings. Como a função EndRound() no dispositivo RoundSettings necessita de um jogador para ser passada para ele, obtenha o primeiro jogador na matriz "Players" e passe-o como instigador.
~~~(verse) # Limpa os efeitos visuais de batimentos cardíacos e depois encerra a rodada. EndRound():void= PropTeam.HeartBeat.DisableAll()
# Obtém qualquer jogador para ser passado para EndRound. Players:[]player = GetPlayspace().GetPlayers()
if (RoundEndInstigator := Players[0]): Logger.Print("Rodada encerrada.") RoundSettings.EndRound(RoundEndInstigator) ~~~