Página 1 de 3

11. Comandos e argumentos

Enviado: 24 Mai 2018, 00:54
por Junior_Djjr
Imagem
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;
Agora você finalmente irá se aprofundar no uso dos comandos, que já usamos bastante, sem ao menos você entender realmente o que são!
 

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:
Imagem

Fuçe! Quando quer alguma coisa, digite alguma palavra em específico.

Por exemplo, você quer armas, então digite WEAPON:
Imagem
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:
Imagem
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
O 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
Não funciona.

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).
Imagem
  
  
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 finalmente vamos entender o mistério:

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:
Imagem
É 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
Perceba que eu não adicionei o 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):
Imagem
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
Certo, e o que será feito quando digitar a palavra 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:
1- 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)
Ou seja, nós enviamos a variável com o nosso CHAR (que neste caso em particular é o CJ (a variável 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
Nota: Não é necessário defini-las todas em uma só linha. Fiz assim pois é mais organizado do que fazer uma em cada linha.

"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
Ficando assim:

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
Perceba que o PRINT_FORMATTED_NOW nos pede 3 argumentos:
1 - string
2 - int (tempo)
3 - qualquer
O último são data types quaisquer! Representados por PARAM (de "parâmetros", na verdade, é meio estranho ser chamado assim):
Imagem
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":
Imagem

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

11. Comandos e argumentos

Enviado: 24 Mai 2018, 01:15
por Junior_Djjr
Muita coisa mudou ao revisar essa parte. O texto anterior deixava de explicar mais a fundo certas coisas.

11. Comandos e argumentos

Enviado: 14 Jun 2018, 19:34
por Saudoso
Junior_Djjr escreveu:
24 Mai 2018, 00:54
Experiente remover a checagem de digitar "POSICAO" e fazer ficar pegando a coordenada  e mostrando na tela sem parar
Não sei como fazer isso :|

Mas apertar alguma tecla pra mostrar as coordenadas eu consegui :daora:

Edit: Ahh, consegui, era só apagar o IF :toj:

11. Comandos e argumentos

Enviado: 11 Jul 2018, 11:30
por TG4M3R
Uma dúvida, como se cria aquelas espécies de marcadores? aqueles círculos vermelhos que aparecem em missões. Só consigo encontrar aquela seta que fica indo pra cima e pra baixo kk :toj:

11. Comandos e argumentos

Enviado: 12 Jul 2018, 01:55
por Junior_Djjr
TG4M3R escreveu: Uma dúvida, como se cria aquelas espécies de marcadores? aqueles círculos vermelhos que aparecem em missões. Só consigo encontrar aquela seta que fica indo pra cima e pra baixo kk :toj:
Comandos LOCATE, é ensinado na próxima parte.
 

11. Comandos e argumentos

Enviado: 12 Jul 2018, 09:52
por nadalao
TG4M3R escreveu: Uma dúvida, como se cria aquelas espécies de marcadores? aqueles círculos vermelhos que aparecem em missões. Só consigo encontrar aquela seta que fica indo pra cima e pra baixo kk :toj:

Código: Selecionar tudo

IF LOCATE_CHAR_ANY_MEANS_3D scplayer 2517.843750 -2150.128420 12.539100 30.0 30.0 100.0 TRUE //mudar TRUE para FALSE para tirar a marca vermelha no chão
e como faz aquela seta que vai pra cima e pra baixo? :fts:

11. Comandos e argumentos

Enviado: 12 Jul 2018, 10:17
por TG4M3R
nadalao escreveu:
TG4M3R escreveu: Uma dúvida, como se cria aquelas espécies de marcadores? aqueles círculos vermelhos que aparecem em missões. Só consigo encontrar aquela seta que fica indo pra cima e pra baixo kk :toj:

Código: Selecionar tudo

IF LOCATE_CHAR_ANY_MEANS_3D scplayer 2517.843750 -2150.128420 12.539100 30.0 30.0 100.0 TRUE //mudar TRUE para FALSE para tirar a marca vermelha no chão
e como faz aquela seta que vai pra cima e pra baixo? :fts:
Eu naum pensei em um nome pra aquela bagaça :fts:

11. Comandos e argumentos

Enviado: 12 Jul 2018, 11:00
por nadalao
TG4M3R escreveu:
nadalao escreveu:
TG4M3R escreveu: Uma dúvida, como se cria aquelas espécies de marcadores? aqueles círculos vermelhos que aparecem em missões. Só consigo encontrar aquela seta que fica indo pra cima e pra baixo kk :toj:

Código: Selecionar tudo

IF LOCATE_CHAR_ANY_MEANS_3D scplayer 2517.843750 -2150.128420 12.539100 30.0 30.0 100.0 TRUE //mudar TRUE para FALSE para tirar a marca vermelha no chão
e como faz aquela seta que vai pra cima e pra baixo? :fts: 
Eu naum pensei em um nome pra aquela bagaça :fts: 
não man, é sério, eu não sei fazer aquela seta kkkkkkkkkkkkk

11. Comandos e argumentos

Enviado: 12 Jul 2018, 14:46
por Junior_Djjr

Código: Selecionar tudo

ADD_SPRITE_BLIP_FOR_CONTACT_POINT x y z RADAR_SPRITE_NONE (blip)
Ele já cria a marca vermelha automaticamente, assim não precisa usar o outro pra criar.

Re: 11. Comandos e argumentos

Enviado: 23 Dez 2018, 16:19
por Jean_005
Junior_Djjr escreveu:
24 Mai 2018, 00:54
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).
Pra mim não dá, talvez porque fiz alguma coisa errada. Quando faço isso (não sei se da maneira certa), em novo jogo, meu CJ nasce no meio de uma fazenda já no céu, voando infinitamente.
 

Código: Selecionar tudo

SCRIPT_START
{
NOP

LVAR_INT scplayer
LVAR_FLOAT x y z 

GET_PLAYER_CHAR 0 scplayer

main_loop:
WAIT 0

z += 10.0

IF IS_KEY_PRESSED VK_KEY_V
     GET_CHAR_COORDINATES scplayer x y z  
     PRINT_FORMATTED_NOW "X: %f Y: %f Z: %f" 1000 x y z 
ENDIF

SET_CHAR_COORDINATES_NO_OFFSET scplayer x y z

GOTO main_loop
}
SCRIPT_END

Re: 11. Comandos e argumentos

Enviado: 24 Dez 2018, 01:24
por Junior_Djjr
Sério, você precisa reler o tutorial com mais atenção, a sua lógica não faz sentido, você pelo visto ainda não entendeu o que é loop, e ainda não sabe usar condições com teclas (são duas coisas básicas).
Você já tá lendo tutorial sobre comandos mas ainda não sabe usar loop (que é basicamente a primeira coisa ensinada).

Re: 11. Comandos e argumentos

Enviado: 24 Dez 2018, 14:17
por Jean_005
Junior_Djjr escreveu:
24 Dez 2018, 01:24
Sério, você precisa reler o tutorial com mais atenção, a sua lógica não faz sentido, você pelo visto ainda não entendeu o que é loop, e ainda não sabe usar condições com teclas (são duas coisas básicas).
Você já tá lendo tutorial sobre comandos mas ainda não sabe usar loop (que é basicamente a primeira coisa ensinada).
Parece que você escreveu isso com raiva de mim... Faz tempo estou achando isso nos tópicos que crio ou escrevo alguma coisa.

Re: 11. Comandos e argumentos

Enviado: 24 Dez 2018, 16:48
por Junior_Djjr
Jean_005 escreveu:
24 Dez 2018, 14:17
Junior_Djjr escreveu:
24 Dez 2018, 01:24
Sério, você precisa reler o tutorial com mais atenção, a sua lógica não faz sentido, você pelo visto ainda não entendeu o que é loop, e ainda não sabe usar condições com teclas (são duas coisas básicas).
Você já tá lendo tutorial sobre comandos mas ainda não sabe usar loop (que é basicamente a primeira coisa ensinada).
Parece que você escreveu isso com raiva de mim... Faz tempo estou achando isso nos tópicos que crio ou escrevo alguma coisa.  
Ué, só estou falando que você precisa reler o tutorial com mais atenção pois você ainda nem sabe como usar loop e já tá no final do tutorial, sendo que não entende o que foi ensinado no início.
O que tem a ver com raiva?

Re: 11. Comandos e argumentos

Enviado: 24 Dez 2018, 18:45
por Jean_005
Junior_Djjr escreveu:
24 Dez 2018, 16:48
O que tem a ver com raiva?
Pela impressão que eu tive, quando você escreveu. Mas vamos deixar quieto.


Sobre o loop, li novamente a parte que fala sobre ele, e eu já entendo o necessário. Não sei o que você está querendo dizer sobre eu não saber usar o loop...

E sobre o código, fiz de uma outra maneira que possivelmente está errada, mas deu certo no jogo.

Código: Selecionar tudo

SCRIPT_START
{

LVAR_INT scplayer

GET_PLAYER_CHAR 0 scplayer

main_loop:
WAIT 0

SET_CHAR_COORDINATES_NO_OFFSET scplayer 2239.7230 -1261.9230 33.9375

GOTO main_loop
}
SCRIPT_END

Re: 11. Comandos e argumentos

Enviado: 24 Dez 2018, 22:40
por Junior_Djjr
Jean_005 escreveu:
24 Dez 2018, 18:45
Sobre o loop, li novamente a parte que fala sobre ele, e eu já entendo o necessário. Não sei o que você está querendo dizer sobre eu não saber usar o loop...
Então por que você deixou tudo dentro de um loop? Você tem que entender que você ainda não entendeu, um loop é uma repetição, você ficou repetindo a variável subindo e posição sendo setada num loop, é um erro óbvio, e tanto em loop quanto na condição, pois você setou e deixou mudando a altura em um loop, enquanto na condição você só pegou a coordenada, não fez sentido, não é assim que se usa loops e condições.

Leia com mais atenção a parte sobre loops e condições, você está muito à frente do seu aprendizado, esta parte é praticamente o final do tutorial e você ainda não entendeu a primeira parte (e você nem consegue entender o que você não entendeu dela, ou seja, muito pior do que simplesmente não entender).