Compartilhe
avatar
Scripter CLEO - Avançado
Scripter CLEO - Avançado
Título : Não quero acreditar, quero saber.
Mensagens : 21907
Reputação : 674
Desde : 03/05/2012
Idade : 21
Localização : Ibitinga - SP
Link : www.MixMods.com.br
Ver perfil do usuáriohttp://MixMods.com.br
  • Reputação da mensagem: 100% (2 votos)

17. Tipos de entidades nas variáveis

em Qui 13 Abr 2017, 11:07
Concluindo esta parte você vai:
Se aprofundar no funcionamento do compilador. Como ele trata os tipos de variáveis para determinar que você fez certo ou errado.
Saber desviar do erro de compilação caso o compilador se engane.

Esta é uma parte do tutorial onde iremos recapitular e entender melhor as entidades associadas com as variáveis.
Tudo leve e simples... Já que é um assunto sem muitos mistérios.




O compilador inteligente

Para evitar que você use variáveis erradas nos comandos (como por exemplo, um CAR num comando de um CHAR) o compilador "aprende" o tipo da variável que você está usando.

Por exemplo você criou um carro:

Mas você foi burro o bastante para usar um comando que pede uma pessoa, e não um carro:

E o compilador irá te alertar do erro:

Ok, já vimos isso anteriormente, nada de novo até então.

Só que é importante você entender exatamente como isso funciona.


O compilador não tão inteligente

O compilador não lê o seu código fazendo todos os caminhos possíveis para determinar exatamente o que você quis fazer ali — basicamente, não se vê isso na computação.

O compilador simplesmente pega algum comando que você tenha usado em cima, e em seguida (embaixo) determina o que é aquela variável.

Vamos entender na prática:


"NONE"? Como assim? Eu criei o meu carro antes! Esta variável é do tipo CAR sim!

É o que acabei de dizer... Assim como várias outras programações, você tem que dizer ao compilador o que você irá fazer, para depois fazer. As ordens das linhas importam. (à parte, dentro do jogo não importam, estamos falando sobre o compilador)

Quando você passar por um problema parecido, você terá que usar gambiarra para burlar o compilador.

Se trata de colocarmos, de algum modo, algum comando antes para dizer ao compilador o que aquela variável é.



Daí você diz "Nossa, que merda" e eu te respondo: A própria Rockstar fez isso muitas vezes nos scripts do jogo... Sem peso na consciência, fazer isso é comum.

Os programadores da Rockstar gostam de fazer uma condição impossível, ficando assim:

Perceba:
Código:
temp = 0
IF temp = 1
    CREATE_CAR 0 0.0 0.0 0.0 my_car
ENDIF
É óbvio que esta condição nunca daria verdadeira, portanto esta linha de criação do carro nunca será lida pelo jogo.

Se você está confuso quanto aos argumentos "0 0.0 0.0 0.0" deve ser porque não entendeu bem o que estamos fazendo aqui: A única utilidade de estarmos usando esta linha é para dizer ao compilador o tipo daquela variável, para não receber a mensagem de erro de compilação.
Os argumentos não importam, somente a variável!

Você inclusive pode usar outros comandos, não necessariamente CREATE_CAR/CHAR/OBJECT etc. Basta ser um comando na qual retorne alguma entidade do tipo, como por exemplo o (muito usado) comando STORE_CAR_CHAR_IS_IN_NO_SAVE

Perceba inclusive que quando você envia por exemplo um carro com CLEO_CALL, o tipo da variável também cai lá e funciona normalmente.



Caso a função fosse para CHAR  e não para CAR, você receberia o erro igualmente:




Entity Tracking

Depois de você ler e entender tudo o que se passa, você pode agora aprender a simplesmente desativar esta checagem.
Sim, você tem opção de desativar a checagem de entidade e compilar mesmo que o compilador diga que está errado, simplesmente clicando no "CS" no canto inferior (lembra que isso faz abrir as opções do compilador?) e indo em "Disable Entity Tracking".

Eu não recomendo que você faça isso mesmo que você seja experiente, pois, é fato de que mesmo experientes fazem erros bobos e passam dores de cabeça para encontrá-los. Mas a decisão final é sua.


Utilidade?

E você pode ficar um pouco confuso "Isso é realmente útil eu saber?"
É que em scripts mais complexos isso acaba sendo comum acontecer, enquanto nos scripts mais simples você dificilmente necessitará usar.

Vamos supor que você leu o handle de um carro usando endereço de memória (uma coisa que você possivelmente ainda não sabe, mas enfim), o compilador nunca saberá que o que você leu foi um carro, portanto você tem que dizer à ele.

Também é extremamente comum (na real, foi o único lugar que a Rockstar usou essa gambiarra) quando você cria uma nova thread e envia alguma variável de tipo específico. Você também possivelmente não sabe como criar novas threads pelo seu script ainda, mas quando saber muito possivelmente irá precisar usar isto.




Bônus
Outro erro comum que eu já tive, falei pro LINK/2012 pensando ser bug e inclusive fiz aqui de novo enquanto eu escrevia este tutorial, e inclusive outras pessoas já pediram ajuda por ter feito este erro, é isto:



Consegue entender qual foi o erro?
Afinal, você enviou uma variável do tipo CAR, mas foi como se não tivesse enviado nada (NONE), e no call o compilador diz que o tipo não se bate... ??

Isso não foi um erro de tipos de variáveis, foi um erro de falta de argumento.

Perceba que você retorna uma variável ("angle") da função, e você só enviou o carro na linha do CLEO_CALL, você esqueceu de colocar a variável onde vai retornar o ângulo.
Tudo vai virar de cabeça pra baixo e o compilador tratará a variável "my_car" como retorno, ou seja, o compilador viu isso como "ele não enviou nenhuma variável, e a variável que tem ali é a variável onde vai retornar o valor", assim a variável "car" lá dentro da função será "0", e o valor da variável "angle" (do "CLEO_RETURN 0 angle") retornará para a variável "my_car", o que é errado.

É interessante tutoriais ensinarem também os possíveis erros, e resolvi colocar este erro aqui pois é comum.
Note que eu resolvi colocar aqui e não no de CLEO_CALL pois acredito que se alguém tiver este erro ela iria pensar que é um erro relacionado a tipos de variáveis (e não simplesmente quantidade de argumentos do CLEO_CALL), e ela iria vir nesta parte do tutorial para reler e procurar o que errou, e, bem, encontrará. Também adicionei uma nota lá.



Próxima parte:
(em breve)


Última edição por Junior_Djjr em Sex 19 Maio 2017, 11:22, editado 1 vez(es) (Razão : Adicionado "Entity Tracking")

______________________________

avatar
Mensagens Nível 2
Mensagens Nível 2
Título : Kick
Mensagens : 54
Reputação : 12
Desde : 03/07/2015
Idade : 19
Localização : Egypt
Ver perfil do usuário

Re: 17. Tipos de entidades nas variáveis

em Dom 14 Maio 2017, 12:49
Amazing. Thank you so much Junior for this great Tutorial and your efforts.
The Tutorial looks perfect in English , no problem at all.
I am looking forward to the next one : )

my first simple script called ( Rainbow_Color_Car) :
Script:

Código:

SCRIPT_START
{
NOP
LVAR_INT cc[2]
LVAR_INT scplayer
LVAR_INT playcar
GET_PLAYER_CHAR 0 scplayer

main_loop:
WAIT 0
GET_CAR_CHAR_IS_USING scplayer playcar
WHILE IS_CHAR_IN_CAR scplayer playcar
    WAIT 500
    IF IS_CAR_DEAD playcar //prevent crash.
        GOTO main_loop
    ENDIF
    CLEO_CALL Generators 0 cc[0] cc[1]
    CHANGE_CAR_COLOUR playcar cc[0] cc[1]
ENDWHILE
GOTO main_loop

Generators:
GENERATE_RANDOM_INT_IN_RANGE 0 129 cc[0]
GENERATE_RANDOM_INT_IN_RANGE 0 129 cc[1]
CLEO_RETURN 0 cc[0] cc[1]
}
SCRIPT_END
avatar
Scripter CLEO - Avançado
Scripter CLEO - Avançado
Título : Não quero acreditar, quero saber.
Mensagens : 21907
Reputação : 674
Desde : 03/05/2012
Idade : 21
Localização : Ibitinga - SP
Link : www.MixMods.com.br
Ver perfil do usuáriohttp://MixMods.com.br

Re: 17. Tipos de entidades nas variáveis

em Seg 15 Maio 2017, 05:41
crspo2020 escreveu:my first simple script called ( Rainbow_Color_Car) :
Script:

Código:

SCRIPT_START
{
NOP
LVAR_INT cc[2]
LVAR_INT scplayer
LVAR_INT playcar
GET_PLAYER_CHAR 0 scplayer

main_loop:
WAIT 0
GET_CAR_CHAR_IS_USING scplayer playcar
WHILE IS_CHAR_IN_CAR scplayer playcar
    WAIT 500
    IF IS_CAR_DEAD playcar //prevent crash.
        GOTO main_loop
    ENDIF
    CLEO_CALL Generators 0 cc[0] cc[1]
    CHANGE_CAR_COLOUR playcar cc[0] cc[1]
ENDWHILE
GOTO main_loop

Generators:
GENERATE_RANDOM_INT_IN_RANGE 0 129 cc[0]
GENERATE_RANDOM_INT_IN_RANGE 0 129 cc[1]
CLEO_RETURN 0 cc[0] cc[1]
}
SCRIPT_END
LINK/2012 created this same thing when he was starting with CLEO :v:

Código:
IS_CAR_DEAD playcar
Why not DOES_VEHICLE_EXIST?

______________________________

avatar
Mensagens Nível 2
Mensagens Nível 2
Título : Kick
Mensagens : 54
Reputação : 12
Desde : 03/07/2015
Idade : 19
Localização : Egypt
Ver perfil do usuário

Re: 17. Tipos de entidades nas variáveis

em Seg 15 Maio 2017, 08:58
Junior_Djjr escreveu:
Código:
IS_CAR_DEAD playcar
Why not DOES_VEHICLE_EXIST?

i tried this command with ( IF NOT )  and it did the same thing i wanted which is preventing the crash that happens when the car explodes while CJ is in the car :D
Anyway, i've got an important question. what's the command that store the char angle in a variable. like this in CLEO :
0@ = Actor.Angle($PLAYER_ACTOR)

^ What's the equivalent of this command in gta3script ? : )
avatar
Scripter CLEO - Avançado
Scripter CLEO - Avançado
Título : ;-;
Mensagens : 672
Reputação : 111
Desde : 22/09/2015
Idade : 19
Localização : Salvador - BA
Ver perfil do usuário

Re: 17. Tipos de entidades nas variáveis

em Seg 15 Maio 2017, 14:03
crspo2020 escreveu:0@ = Actor.Angle($PLAYER_ACTOR)

^ What's the equivalent of this command in gta3script ? : )
GET_CHAR_HEADING

______________________________
" Everyone gonna remember my name ! "
avatar
Mensagens Nível 2
Mensagens Nível 2
Título : Kick
Mensagens : 54
Reputação : 12
Desde : 03/07/2015
Idade : 19
Localização : Egypt
Ver perfil do usuário

Re: 17. Tipos de entidades nas variáveis

em Seg 15 Maio 2017, 18:10
israel escreveu:
crspo2020 escreveu:0@ = Actor.Angle($PLAYER_ACTOR)

^ What's the equivalent of this command in gta3script ? : )
GET_CHAR_HEADING

Oh thanks , i should've searched that in gtamodding wiki anyway (XD)
avatar
Scripter CLEO - Avançado
Scripter CLEO - Avançado
Título : Não quero acreditar, quero saber.
Mensagens : 21907
Reputação : 674
Desde : 03/05/2012
Idade : 21
Localização : Ibitinga - SP
Link : www.MixMods.com.br
Ver perfil do usuáriohttp://MixMods.com.br

Re: 17. Tipos de entidades nas variáveis

em Sex 19 Maio 2017, 11:23
Adicionei a dica de desativar a checagem de tipo de entidade, mesmo que eu não recomende, fiquem sabendo que existe.

______________________________

avatar
Mensagens Nível 1
Mensagens Nível 1
Mensagens : 28
Reputação : 2
Desde : 16/06/2017
Idade : 20
Ver perfil do usuário

Re: 17. Tipos de entidades nas variáveis

em Qui 13 Jul 2017, 16:57
Código:
SCRIPT_START
{
  LVAR_INT car
  GOTO skip
  CREATE_CAR (0 0.0 0.0 0.0) (car)
  skip:
  CLEO_CALL get_car 0 () (car) //ENTITY TYPE MISMATCH, why??
  LOCK_CAR_DOORS car CARLOCK_LOCKED
  TERMINATE_THIS_CUSTOM_SCRIPT
}
SCRIPT_END
{
  LVAR_INT car
  LVAR_INT scplayer
  get_car:
  GET_PLAYER_CHAR (0) (scplayer)
  GET_CAR_CHAR_IS_USING (scplayer) (car)
  CLEO_RETURN 0 car
}
avatar
Scripter CLEO - Avançado
Scripter CLEO - Avançado
Título : Não quero acreditar, quero saber.
Mensagens : 21907
Reputação : 674
Desde : 03/05/2012
Idade : 21
Localização : Ibitinga - SP
Link : www.MixMods.com.br
Ver perfil do usuáriohttp://MixMods.com.br

Re: 17. Tipos de entidades nas variáveis

em Sex 14 Jul 2017, 01:59
@__@
Looks like a compiler bug...

I tried with a new code:
Código:
SCRIPT_START
{
  LVAR_INT car
  
  GOTO skip
  CREATE_CAR (0 0.0 0.0 0.0) (car)
  skip:

  CLEO_CALL create_car 0 () (car) // <- entype type mismatch
  TERMINATE_THIS_CUSTOM_SCRIPT
}
SCRIPT_END

{
  LVAR_INT newcar

  create_car:
  REQUEST_MODEL 400
  LOAD_ALL_MODELS_NOW
  CREATE_CAR 400 (0.0 0.0 0.0) (newcar)
  CLEO_RETURN 0 (newcar)
}
It's impossible, it's all correct.

If I use any other var, will compile:
Código:
SCRIPT_START
{
  LVAR_INT car anyvar
  
  GOTO skip
  CREATE_CAR (0 0.0 0.0 0.0) (car)
  skip:

  CLEO_CALL create_car 0 () (anyvar) // <- ok now
  TERMINATE_THIS_CUSTOM_SCRIPT
}
SCRIPT_END

{
  LVAR_INT newcar

  create_car:
  REQUEST_MODEL 400
  LOAD_ALL_MODELS_NOW
  CREATE_CAR 400 (0.0 0.0 0.0) (newcar)
  CLEO_RETURN 0 (newcar)
}

So, we can fix in this way:
Código:
SCRIPT_START
{
  LVAR_INT car anyvar
  
  CLEO_CALL create_car 0 () (car)

  GOTO skip
  CREATE_CAR (0 0.0 0.0 0.0) (car)
  skip:

  LOCK_CAR_DOORS car CARLOCK_LOCKED
  TERMINATE_THIS_CUSTOM_SCRIPT
}
SCRIPT_END

{
  LVAR_INT newcar

  create_car:
  REQUEST_MODEL 400
  LOAD_ALL_MODELS_NOW
  CREATE_CAR 400 (0.0 0.0 0.0) (newcar)
  CLEO_RETURN 0 (newcar)
}
But, better (but with some problem if you want to pass vars to the function):
Código:
SCRIPT_START
{
  LVAR_INT car

  GOTO skip
  CREATE_CAR (0 0.0 0.0 0.0) (car)
  skip:
  
  CLEO_CALL create_car 0 () (car)
  LOCK_CAR_DOORS car CARLOCK_LOCKED
  TERMINATE_THIS_CUSTOM_SCRIPT

  create_car:
  REQUEST_MODEL 400
  LOAD_ALL_MODELS_NOW
  CREATE_CAR 400 (0.0 0.0 0.0) (car)
  CLEO_RETURN 0 (car)
}

SCRIPT_END

Your script would be:
Código:
SCRIPT_START
{
  LVAR_INT car
  GOTO skip
  CREATE_CAR (0 0.0 0.0 0.0) (car)
  skip:
  CLEO_CALL get_car 0 () (car)
  LOCK_CAR_DOORS car CARLOCK_LOCKED
  TERMINATE_THIS_CUSTOM_SCRIPT

  LVAR_INT scplayer
  get_car:
  GET_PLAYER_CHAR (0) (scplayer)
  GET_CAR_CHAR_IS_USING (scplayer) (car)
  CLEO_RETURN 0 car
}
SCRIPT_END
If you want to pass new vars to the CLEO_CALL, use in this way:
Código:
SCRIPT_START
{
  LVAR_INT car
  CLEO_CALL get_car 0 () (car)
  GOTO skip
  CREATE_CAR (0 0.0 0.0 0.0) (car)
  skip:
  LOCK_CAR_DOORS car CARLOCK_LOCKED
  TERMINATE_THIS_CUSTOM_SCRIPT
}
SCRIPT_END

{
  LVAR_INT car
  LVAR_INT scplayer
  get_car:
  GET_PLAYER_CHAR (0) (scplayer)
  GET_CAR_CHAR_IS_USING (scplayer) (car)
  CLEO_RETURN 0 car
}

It's not your fault. Was supposed to work.

______________________________

avatar
Mensagens Nível 1
Mensagens Nível 1
Mensagens : 28
Reputação : 2
Desde : 16/06/2017
Idade : 20
Ver perfil do usuário

Re: 17. Tipos de entidades nas variáveis

em Sex 14 Jul 2017, 03:04
Thanks, it worked.
Conteúdo patrocinado

Re: 17. Tipos de entidades nas variáveis

Permissão deste fórum:
Você não pode responder aos tópicos neste fórum