Especificadores são usados na linguagem Verse para definir comportamentos em alguns elementos do Verse. Os símbolos < e > são usados pelos especificadores. A função OnBegin, presente nos dispositivos Verse, tem dois especificadores: override e suspends.
OnBegin<override>()<suspends>:void=
O especificador <override> indica que a função OnBegin está sobrescrevendo a função OnBegin da classe pai creative_device. Vamos ver mais detalhes do especificador <override> em um artigo sobre herança de classe.
O especificador <suspends> é usado para definir funções assíncronas que são executadas em paralelo. Isto significa que elas podem ser suspensas e depois retomadas para continuar sua execução.
Outro especificador comum é o <decides> usado para criar expressões falíveis. Você pode gerar uma falha dentro da função usando a expressão false? .
Se você criar uma função usando somente o especificador <decides>, ao tentar chamar a função aparecerá um erro de compilação com a seguinte mensagem:
"This invocation calls a function that has the 'no_rollback' effect, which is not allowed by its context."
Para evitar este erro, você pode usar o especificador <transacts> que indica que as expressões executadas dentro da função podem ser revertidas.
A linha abaixo mostra um exemplo de declaração de função usando <decides> e <transacts>:
IncreaseExperience(Points: int)<decides><transacts>:void=
Vamos criar um dispositivo no UEFN aplicando estes especificadores. Em qualquer projeto UEFN, abra o Verse Explorer, clique com o botão-direito no nome do projeto e escolha a opção Add new Verse file to project.
Em Device Name coloque specifiers_device e clique no botão Create Empty.
Este dispositivo chamará a função IncreaseExperience uma vez por segundo passando como parâmetro um valor diferente que será adicionado a uma variável chamada ExperiencePoints. Existe uma chance de 1 em 6 da função IncreaseExperience falhar. Se ocorrer uma falha, a variável ExperiencePoints terá seu valor revertido.
Copie o código Verse abaixo para o dispositivo specifiers_device:
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /Verse.org/Random }
specifiers_device := class(creative_device):
var ExperiencePoints : int = 0
OnBegin<override>()<suspends>:void=
var XpGain : int = 0
loop:
set XpGain += 1
if( IncreaseExperience[XpGain] ):
Print("XpGain is valid")
else:
Print("*** XpGain is INVALID ***")
Print("ExperiencePoints rolled back to {ExperiencePoints}")
Sleep(1.0)
IncreaseExperience(Points: int)<decides><transacts>:void=
set ExperiencePoints += Points
Print("ExperiencePoints set to {ExperiencePoints}")
if( GetRandomInt(1, 6) = 1 ):
false? #isto é uma falha
Observe que na função OnBegin está sendo usado um loop sem uma expressão break ou return para sair do loop. O loop repete as expressões do seu bloco de código e a função Sleep() suspende a função OnBegin por um segundo.
A função IncreaseExperience é uma função falível devido o uso de <decides> por isso usamos [ ] ao invés de ( ) na chamada.
A função GetRandomInt() gera um número aleatório entre dois números. Os números usados como parâmetros podem fazer parte do resultado. Para usar esta função é preciso incluir o módulo Verse.org/Random no início do arquivo.
Salve o arquivo e compile o código Verse usando a opção Verse > Build Verse Code do menu do UEFN.
Acesse o Content Drawer e adicione o dispositivo Verse specifiers_device ao nível.
Clique no botão Launch Session localizado na barra de ferramentas do UEFN para carregar o nível no Fortnite.
Após iniciar a partida no Fortnite, pressione a tecla Tab e selecione a aba Registro para visualizar o log com as mensagens escritas pelas funções Print.