Para este exercício, seu objetivo é causar danos ao jogador caso ele não se afaste uma certa distância da própria plataforma de surgimento dentro de um tempo definido. Você usará expressões falíveis e contextos de falha para obter as informações da localização do jogador e descobrir o quanto ele se moveu 10 segundos após o surgimento.
Primeiro, verifique se ainda tem as funções HurtPlayer() e CalculateDamage() no arquivo Verse. Você chamará HurtPlayer() se o jogador não tiver se movido o suficiente. Como lembrete, aqui está o código dessas funções:
HurtPlayer(DamageAmount:float):void=
Playspace:fort_playspace = GetPlayspace()
AllPlayers:[]player = Playspace.GetPlayers()
if (Player:player = AllPlayers[0]):
if (FortniteCharacter:fort_character = Player.GetFortCharacter[]):
MyCharacterHealth:float = FortniteCharacter.GetHealth()
DamageToDo:float = CalculateDamage(MyCharacterHealth, DamageAmount, 1.0)
Print("Dano que será causado: {DamageToDo}")
FortniteCharacter.Damage(DamageToDo)
CalculateDamage(PlayerHealth:float, DesiredDamageAmount:float, MinHealth:float):float=
# Se a quantidade de dano não eliminar o jogador, causar esta quantidade de dano
if (PlayerHealth > DesiredDamageAmount):
return DesiredDamageAmount
else if (PlayerHealth > MinHealth):
# Dar ao jogador mais uma chance se o nível de vida dele estiver baixo
return PlayerHealth - MinHealth
else:
# Eliminar o jogador
return PlayerHealth
~~~
Agora, você precisará obter todos os objetos `player` no nível (neste caso apenas um, você!). Você também criará duas variáveis para armazenar o objeto `transform` do jogador em ocasiões diferentes. Um objeto **transform** contém dados sobre a localização, a rotação e a escala de um objeto. Para este exercício, você precisa apenas da localização, mas ela está armazenada no objeto `transform`.
~~~(verse)
Playspace:fort_playspace = GetPlayspace()
AllPlayers:[]player = Playspace.GetPlayers()
var FirstPosition:transform = transform{}
var SecondPosition:transform = transform{}
É hora de criar alguns contextos de falha usando if. As duas primeiras linhas abaixo extraem o objeto fort_character do objeto player. Se esse código parece familiar, é porque é quase igual a parte do código da função HurtPlayer(). Você tem que escrevê-lo novamente aqui porque também precisa dele para obter o objeto transform de um fort_character. Ele também pode falhar, conforme indicado por []. Portanto, deve estar em um contexto de falha.
Defina a variável FirstPosition que você criou anteriormente como o valor retornado por FortniteCharacter.GetTransform(). Essa expressão não é falível, mas se qualquer uma das duas expressões anteriores falhar, não convém executar essa expressão e, portanto, ela está no mesmo contexto de falha.
~~~(verse) if: Player:player = AllPlayers[0] FortniteCharacter:fort_character = Player.GetFortCharacter[] set FirstPosition = FortniteCharacter.GetTransform()
Como todas as expressões falíveis estão no bloco de código `if`, você precisa de um novo bloco de código para o código que deseja executar se ele for bem-sucedido. É aí que entra `then`. Quando escrever a forma de `if` sem `()`, use `then` para o código que deve ser executado quando todo o código no bloco de código `if` for bem-sucedido.
Seu primeiro bloco `then` deve ficar assim:
~~~(verse)
then:
Print("Mexa-se ou prepare-se para sofrer dano!")
Sleep(10.0)
~~~
Você já viu essas duas funções antes: `Print()` é usada aqui para avisar ao jogador que ele precisa se mover; `Sleep()` dá ao jogador 10 segundos para se afastar do ponto de surgimento antes que o próximo bloco de código seja executado.
Após uma espera de 10 segundos, é hora de executar o código que verificará se o jogador está a uma certa distância do seu ponto de surgimento e, se não estiver, aplicará danos a ele.
~~~(verse)
if:
Player:player = AllPlayers[0]
FortniteCharacter:fort_character = Player.GetFortCharacter[]
set SecondPosition = FortniteCharacter.GetTransform()
DistanceBetweenPositions:float = DistanceXY(FirstPosition.Translation, SecondPosition.Translation)
DistanceBetweenPositions < 10000.0
As três primeiras linhas são quase iguais ao primeiro bloco de código if, com a diferença de que agora você está configurando SecondPosition em vez de FirstPosition. Agora, você tem dois locais para comparar.
Em seguida, declare e inicialize DistanceBetweenPositions. Para isso, você usará uma função interna da linguagem Verse chamada DistanceXY(). Ela usa dois argumentos, ambos coordenadas no espaço 3D chamadas de vetores. Ele usa apenas as coordenadas X e Y para medir a distância e retorna essa distância como um float. Lembre-se de usar apenas a propriedade Translation das duas variáveis transform.
Por fim, compare DistanceBetweenPositions com um valor float literal. É uma boa ideia começar com um número grande para garantir que o código esteja funcionando. Diminua-o conforme descobre uma distância razoável de deslocamento dentro do tempo determinado.
O próximo bloco then será executado se os jogadores não se deslocarem a distância necessária dentro do limite de tempo. Então, este deve ser o código que aplica dano ao jogador:
~~~(verse) then: Print("Distância percorrida: {DistanceBetweenPositions}") Print("Aplicando dano") HurtPlayer(50.0)
Esse código mostrará a distância real que o jogador se moveu, uma notificação de que danos estão prestes a serem aplicados e uma chamada para a função `HurtPlayer()` escrita anteriormente. Ao chamar a função `HurtPlayer()`, você não precisa pensar em como ela é implementada. Você sabe que ela seguirá as regras definidas anteriormente para aplicar dano ao jogador.
## O script completo
~~~(verse)
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /Fortnite.com/Characters }
using { /Fortnite.com/Playspaces }
using { /UnrealEngine.com/Temporary/SpatialMath }
hello_world_device := class(creative_device):
# É executado quando o dispositivo é iniciado em um jogo em execução
OnBegin<override>()<suspends>:void=
Playspace:fort_playspace = GetPlayspace()
AllPlayers:[]player = Playspace.GetPlayers()
var FirstPosition:transform = transform{}
var SecondPosition:transform = transform{}
if:
Player:player = AllPlayers[0]
FortniteCharacter:fort_character = Player.GetFortCharacter[]
set FirstPosition = FortniteCharacter.GetTransform()
then:
Print("Mexa-se ou prepare-se para sofrer dano!")
Sleep(10.0)
if:
Player : player = AllPlayers[0]
FortniteCharacter : fort_character = Player.GetFortCharacter[]
set SecondPosition = FortniteCharacter.GetTransform()
DistanceBetweenPositions: float = DistanceXY(FirstPosition.Translation, SecondPosition.Translation)
DistanceBetweenPositions < 10000.0
then:
Print("Distância percorrida: {DistanceBetweenPositions}")
Print("Aplicando dano")
HurtPlayer(50.0)
# As funções das aulas anteriores
#################################
HurtPlayer(DamageAmount : float):void=
Playspace: fort_playspace = GetPlayspace()
AllPlayers: []player = Playspace.GetPlayers()
if (Player : player = AllPlayers[0]):
if (FortniteCharacter : fort_character = Player.GetFortCharacter[]):
MyCharacterHealth : float = FortniteCharacter.GetHealth()
DamageToDo : float = CalculateDamage(MyCharacterHealth, DamageAmount, 1.0)
Print("Dano que será causado: {DamageToDo}")
FortniteCharacter.Damage(DamageToDo)
CalculateDamage(PlayerHealth:float, DesiredDamageAmount:float, MinHealth:float):float =
# Se a quantidade de dano não eliminar o jogador, causar esta quantidade de dano
if (PlayerHealth > DesiredDamageAmount):
return DesiredDamageAmount
else if (PlayerHealth > MinHealth):
# Dar ao jogador mais uma chance se o nível de vida dele estiver baixo
return PlayerHealth - MinHealth
else:
# Eliminar o jogador
return PlayerHealth
Próximos passos
Agora que conhece o básico, você já pode usar a linguagem Verse para criar seu próprio dispositivo no Unreal Editor para Fortnite! Confira o guia a seguir para saber como.