11. Comandos e argumentos
Enviado: 24 Mai 2018, 00:54
Tópico antigo: http://brmodstudio.forumeiros.com/t5991 ... argumentos
Agora você finalmente irá se aprofundar no uso dos comandos, que já usamos bastante, sem ao menos você entender realmente o que são!Concluindo esta parte você vai:
Saber responder o que são, como usar e como procurar comandos;
Saber responder o que são e como usar argumentos dependente do data type pedido;
O que são "comandos"?
Vamos ser diretos:
Os comandos servem para comandar.
(eu devia parar com isso, mas é a realidade, às vezes as coisas são óbvias!)
Comandos é a coisa mais importante no GTA3script, pois praticamente tudo são comandos, o que inclusive isso difere bem das outras linguagens, inclusive pelo fato de ser scripting.
Você está aqui, mas já sabe o que são comandos, pois eu entrei na sua mente e te introduzi naturalmente neles. Este tutorial é para explicar mais a fundo o que são e como usá-los:
Por exemplo,
WAIT
é um comando. E o que ele faz? Você já sabe!IS_KEY_PRESSED
também sabe. E também já até expliquei sobre ver a descrição dos comandos:Fuçe! Quando quer alguma coisa, digite alguma palavra em específico.
Por exemplo, você quer armas, então digite
WEAPON
:E escolha o que você realmente quer, se você quer dar uma arma "GIVE", remover a arma "REMOVE" etc.
Atenção: Fique de olho se no GTA que você está programando há o tal comando disponível:
Senão dará o erro "unsupported command".
Inclusive alguns comandos nem operação tem — estão lá mas fazem nada, e na descrição estará escrito.
Em seguida, você irá "configurar" este comando dando os argumentos, dizendo qual arma e qual "char" (qual pessoa) — e é isso a parte mais importante!
Nota para programadores do Sanny Builder: Se você já mexe com Sanny Builder há um bom tempo vai se sentir muito incomodado de ter que trabalhar com nomes totalmente diferentes. Eu recomendo que você pegue o código do opcode do Sanny Builder e cole na caixa de pesquisa do Opcode Database, para assim cair "de cara" no novo nome do comando. (em raras vezes não ajudará, mas são muito raras...). Explicarei melhor no fim.
O que são "argumentos"?
Você também já sabe o que são!
Código: Selecionar tudo
WAIT 0
0
é um argumento para um parâmetro integer (de número inteiro) do comando WAIT
← frase importante aqui!Um comando tem parâmetros, e você envia os argumentos para preencher os parâmetros (por exemplo um valor, uma variável etc).
E se usarmos um data type errado (por exemplo, float) no lugar do parâmetro que pede integer?
Código: Selecionar tudo
WAIT 0.0
WAIT 100.0
Você tem que dar os argumentos corretos que são pedidos em cada parâmetro.
Por exemplo o comando
GOTO
tem o parâmetro LABEL
, assim você envia uma label (por exemplo main_loop
).Vamos criar um script passo-a-passo para pegar a coordenada do CJ e mostrar na tela?
Comece como sempre:
Código: Selecionar tudo
SCRIPT_START
{
NOP
}
SCRIPT_END
E o que é este "NOP"?
É só um comando sem operação! Não faz nada além de preencher algum espaço.
É que se você tiver uma label sem nenhum comando antes (excluindo declarações de variáveis, que não vão pro produto final) dará este erro:
É necessário um comando antes da primeira label, e o
NOP
é um comando, então colocá-lo sempre no topo do script ajuda a não passar por este erro. Mas na maioria das vezes você nem precisa dele e pode querer não colocá-lo (e assim economizar 2 bytes — o Julius aprovaria o seu script)Agora defina uma variável local
INT
com nome scplayer
— Por que scplayer
? O nome é de sua escolha, mas por organização, nós usamos scplayer
para o CJ/Tommy/Claude ("script controlled player"), pois foi assim que a Rockstar fez. Se você é anarquista, pode escolher não usar.Em seguida, use o comando
GET_PLAYER_CHAR
.Este comando faz o seguinte:
CHAR
é uma pessoa, um ped (pedestre), um ator, um personagem... GET
é "pegar" em inglês, ou seja, nós estamos "pegando o CHAR do player", e assim, nós podemos usar os comandos para CHAR
no nosso player (no CJ)!Os parâmetros do
GET_PLAYER_CHAR
são dois INT
:1 - player
2 - retorno
No primeiro parâmetro que é o "player", o
0
vale o "player 1" e o 1
vale o "player 2". Sempre que algum comando pedir um player você usará 0
, a não ser que você esteja pegando o segundo jogador (o que é somente disponível em mods de 2 jogadores).E no retorno, você deve enviar uma variável, e o valor daquela variável se tornará um handle para o "CHAR" do CJ — leia isso como "O CJ em forma de CHAR para ser usado em comandos que pedem o CHAR".
"Handle" é um ID que identifica alguma pessoa, carro, objeto etc no mundo. A Rockstar North usou a palavra "REFERENCE" (referência), mas normalmente chamamos de "handle".
Ou seja, a nossa variável terá um valor que identifica a "pessoa" (char/ped) do CJ. Não importa qual valor é este, o que importa é que temos lá e que podemos usar.
O script ficará assim:
Código: Selecionar tudo
SCRIPT_START
{
LVAR_INT scplayer
GET_PLAYER_CHAR 0 scplayer
}
SCRIPT_END
NOP
agora. Afinal, neste caso não precisa!Se você usar, não tem problema, só é desnecessário.
E vamos também adicionar um loop:
Código: Selecionar tudo
SCRIPT_START
{
LVAR_INT scplayer
GET_PLAYER_CHAR 0 scplayer
main_loop:
WAIT 0
GOTO main_loop
}
SCRIPT_END
É muito comum você começar a digitar o script desta forma acima caso esteja fazendo um mod que use o CHAR do CJ para alguma coisa.
Agora vamos adicionar o comando
TEST_CHEAT
, que é um comando condicional (perceba! Ele é condicional mas não começa com "IS_" nem "HAS_" nem "DOES_", acostume-se, há várias exceções) onde pede um argumento, que é uma string (text label):Durante o jogo, caso digitar a string colocada aqui dará verdadeiro! Ou seja, é como o
IS_KEY_PRESSED
, mas agora com uma palavra para digitar em vez de uma tecla para pressionar. Isto é muito usado para ativar mods.Código: Selecionar tudo
SCRIPT_START
{
LVAR_INT scplayer
GET_PLAYER_CHAR 0 scplayer
main_loop:
WAIT 0
IF TEST_CHEAT POSICAO
// faz algo caso eu tenha digitado "POSICAO"
ENDIF
GOTO main_loop
}
SCRIPT_END
POSICAO
? Vamos usar o comando para pegar a coordenada do CJ: GET_CHAR_COORDINATES
Percebeu o
CHAR
no nome do comando? Então! Em tradução livre: "pegar as coordenadas do CHAR".Este comando nos pede 4 argumentos:
Ou seja, nós enviamos a variável com o nosso CHAR (que neste caso em particular é o CJ (a variável1- Handle do CHAR — no momento, na descrição deste comando está escrito "actor", pois está na época do Sanny Builder ainda. "actor" é a forma antiga de um "char" ser chamado. Lembre-se que "actor" e "char" são a mesma coisa.
2 - Coordenada X (retorno)
3 - Coordenada Y (retorno)
4 - Coordenada Z (retorno)
scplayer
) e 3 variáveis para retornar a coordenada (X Y Z (ou seja, a posição 3D dele)), e assim nós podemos saber em que posição o CJ está no mundo!Ei, não esqueça: Você ainda não tem variáveis float para guardar estas coordenadas.
Defina 3 variáveis float para poder usá-las no comando:
Código: Selecionar tudo
SCRIPT_START
{
LVAR_INT scplayer
LVAR_FLOAT x y z
GET_PLAYER_CHAR 0 scplayer
main_loop:
WAIT 0
IF TEST_CHEAT POSICAO
GET_CHAR_COORDINATES scplayer x y z
ENDIF
GOTO main_loop
}
SCRIPT_END
"Por que FLOAT?"
Todas as coordenadas são float. Lembre-se.
Geralmente coisas do tipo distância, ângulo, velocidade etc são tudo em float (coisas que requerer mais definição). Não se preocupe com isto pois o data type necessário é sempre dito na tela enquanto você está digitando o comando, e se você colocar errado o compilador irá te informar também.
E por fim vamos mostrar as variáveis na tela com o comando
PRINT_FORMATTED_NOW
usando três %f
para mostrar o valor das variáveis float x y z
.Código: Selecionar tudo
PRINT_FORMATTED_NOW "X: %f Y: %f Z: %f" 1000 x y z
Código: Selecionar tudo
SCRIPT_START
{
LVAR_INT scplayer
LVAR_FLOAT x y z
GET_PLAYER_CHAR 0 scplayer
main_loop:
WAIT 0
IF TEST_CHEAT POSICAO
GET_CHAR_COORDINATES scplayer x y z
PRINT_FORMATTED_NOW "X: %f Y: %f Z: %f" 1000 x y z
ENDIF
GOTO main_loop
}
SCRIPT_END
O último são data types quaisquer! Representados por1 - string
2 - int (tempo)
3 - qualquer
PARAM
(de "parâmetros", na verdade, é meio estranho ser chamado assim):Que inclusive pode ser mais do que um, como nós mesmos fizemos, usamos 3 variáveis no
PARAM
, e não somente uma, pois este comando aceita fazer isso (normalmente quando se pede PARAM
no fim, é porque aceita vários argumentos livres).E assim temos o nosso script que pega a coordenada do CJ e mostra na tela após digitar "POSICAO":
Faça mais!
1. Experiente remover a checagem de digitar "POSICAO" e fazer ficar pegando a coordenada e mostrando na tela sem parar para dar um efeito diferente. Ou então segurar uma tecla para mostrar a posição.
2. Experimente também mudar os
%f
para %.3f
, assim irá mostrar 3 casas decimais em vez de 6, assim simplificando o float: Mostrando "327.416" em vez de "327.416168".3. E por fim, também experimente: Após ativar o script, pegar a coordenada, aumentar
10.0
em alguma coordenada (por exemplo z += 10.0
) e usar o comando SET_CHAR_COORDINATES
enviando as variáveis lá (de preferência o SET_CHAR_COORDINATES_NO_OFFSET
na qual remove o offset que faz ir mais pra cima do que o normal), assim, você enviará o CJ 10 metros para cima ou baixo (Z), ou leste ou oeste (X), ou norte ou sul (Y).Viu como foi fácil? É só fazer o que pede!
E como já foi dito antes, se você enviasse algum argumento errado, na grande maioria das vezes o compilador irá te corrigir, dizer que está errado.
Você pode ficar totalmente perdido em querer fazer tais coisas, por exemplo, se você nunca mexeu com isso antes e neste momento você quer criar uma pessoa e colocar arma nela, você sabe fazer isto? Você pode até tentar, pode até conseguir, mas muito possivelmente fará errado.
Por este motivo, este tutorial haverá uma seção chamada "Como fazer?" para você aprender a fazer tais coisas da forma correta. Basta dar uma olhada no Índice.
Inclusive, você pode perguntar pra nós em algum lugar, por exemplo criando um tópico aqui como fazer tal coisa caso ainda não tenha tutorial ou que não esteja na categoria de utilidades.
Mesmo assim, aqui vai umas dicas:
Veja no código fonte de outros mods quais comandos foram usados para fazer certas coisas (os meus códigos ficam no Gist). É algo bem prático, você vai conhecendo os comandos necessários com o passar do tempo, mas nunca deixe de ler os tutoriais de "Como fazer?" citados acima.
Se o código foi criado no Sanny Builder normalmente os comandos têm nomes diferentes. Como já dito anteriormente nesta parte do tutorial, basta copiar o opcode do comando e colocar na caixa de pesquisa do opcode database. Por exemplo no Sanny Builder temos o
0ACD: show_text_highpriority "Hello" time 1000
, basta colocar o 0ACD:
na caixa de pesquisa (ou URL) desta página para se deparar com o PRINT_STRING_NOW e suas definições. Sabendo isso, você poderá converter e/ou estudar códigos criados para o Sanny Builder. Lembrando que normalmente os nomes dos comandos do MoonLoader são iguais aos do GTA3script, portanto você também pode estudar GTA3script lendo códigos Lua do MoonLoader e vice-versa.Próxima parte:
12. Escopos