17. Tipos de entidades nas variáveis

    Compartilhe
    avatar
    Junior_Djjr
    Scripter CLEO - Avançado
    Scripter CLEO - Avançado

    Título : Não quero acreditar, quero saber.
    Mensagens : 21449
    Reputação : 629
    Desde : 03/05/2012
    Idade : 21
    Localização : Ibitinga - SP
    Link : www.MixMods.com.br

    17. Tipos de entidades nas variáveis

    Mensagem por Junior_Djjr 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
    crspo2020
    Mensagens Nível 1
    Mensagens Nível 1

    Mensagens : 3
    Reputação : 0
    Desde : 03/07/2015
    Idade : 19
    Localização : Egypt

    Re: 17. Tipos de entidades nas variáveis

    Mensagem por crspo2020 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
    Junior_Djjr
    Scripter CLEO - Avançado
    Scripter CLEO - Avançado

    Título : Não quero acreditar, quero saber.
    Mensagens : 21449
    Reputação : 629
    Desde : 03/05/2012
    Idade : 21
    Localização : Ibitinga - SP
    Link : www.MixMods.com.br

    Re: 17. Tipos de entidades nas variáveis

    Mensagem por Junior_Djjr 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
    crspo2020
    Mensagens Nível 1
    Mensagens Nível 1

    Mensagens : 3
    Reputação : 0
    Desde : 03/07/2015
    Idade : 19
    Localização : Egypt

    Re: 17. Tipos de entidades nas variáveis

    Mensagem por crspo2020 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
    israel
    Scripter CLEO - Avançado
    Scripter CLEO - Avançado

    Mensagens : 657
    Reputação : 111
    Desde : 22/09/2015
    Idade : 19
    Localização : Salvador - BA

    Re: 17. Tipos de entidades nas variáveis

    Mensagem por israel 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
    crspo2020
    Mensagens Nível 1
    Mensagens Nível 1

    Mensagens : 3
    Reputação : 0
    Desde : 03/07/2015
    Idade : 19
    Localização : Egypt

    Re: 17. Tipos de entidades nas variáveis

    Mensagem por crspo2020 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
    Junior_Djjr
    Scripter CLEO - Avançado
    Scripter CLEO - Avançado

    Título : Não quero acreditar, quero saber.
    Mensagens : 21449
    Reputação : 629
    Desde : 03/05/2012
    Idade : 21
    Localização : Ibitinga - SP
    Link : www.MixMods.com.br

    Re: 17. Tipos de entidades nas variáveis

    Mensagem por Junior_Djjr 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.


    ____________________

    Conteúdo patrocinado

    Re: 17. Tipos de entidades nas variáveis

    Mensagem por Conteúdo patrocinado


      Data/hora atual: Qui 25 Maio 2017, 09:17