Página 1 de 1

18. Tipos de entidades

Enviado: 03 Jun 2018, 20:35
por Junior_Djjr
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:
Imagem
Mas você foi burro o bastante para usar um comando que pede uma pessoa, e não um carro:
Imagem
E o compilador irá te alertar do erro:
Imagem
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 — normalmente 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:
Imagem
"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 isto não importa, 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 é.

Código: Selecionar tudo

GOTO jump_var_types
CREATE_CAR 0 0.0 0.0 0.0 my_car
jump_var_types:

GOSUB create_car
CAR_WANDER_RANDOMLY my_car

//...

create_car:
CREATE_CAR ELEGY 0.0 0.0 0.0 (my_car)
RETURN
Daí você diz "Nossa, que merda" e eu te respondo: A própria Rockstar fez isto 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:

Código: Selecionar tudo

temp = 0
IF temp = 1
    CREATE_CAR 0 0.0 0.0 0.0 (my_car)
ENDIF

GOSUB create_car
CAR_WANDER_RANDOMLY my_car

//...

create_car:
CREATE_CAR ELEGY 0.0 0.0 0.0 (my_car)
RETURN
Perceba:

Código: Selecionar tudo

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 outros 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.

Código: Selecionar tudo

SCRIPT_START
{
    LVAR_INT scplayer my_car
    LVAR_FLOAT angle

    GOTO var_types_jump
    CREATE_CAR 0 0.0 0.0 0.0 (my_car)
    var_types_jump:

    GOSUB create_car
    CLEO_CALL get_car_z_angle 0 (my_car)(angle)

    main_loop:
    WAIT 0
    GOTO main_loop

    create_car:
    REQUEST_MODEL ELEGY
    LOAD_ALL_MODELS_NOW
    CREATE_CAR ELEGY 0.0 0.0 0.0 (my_car)
    MARK_MODEL_AS_NO_LONGER_NEEDED ELEGY
    RETURN
}
SCRIPT_END

{
    LVAR_INT car
    LVAR_FLOAT angle

    get_car_z_angle:
    GET_CAR_HEADING car angle
    CLEO_RETURN 0 angle
}
Caso o comando fosse para CHAR  e não para CAR, você receberia o erro normalmente:
Imagem


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 direito do VS Code (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 — você aprenderá logo aqui no tutorial), o compilador nunca saberá que o que você leu foi um carro, portanto você tem que dizer à ele que aquela variável é um carro.

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 aqui:
Imagem
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 chamada 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 é muito comum.
  

Próxima parte:
REQUIRE

Re: 18. Tipos de entidades

Enviado: 28 Out 2018, 21:49
por TG4M3R
Tutoriais ótimos, espero que o próximo seja de como criar menus, kkkk.

Re: 18. Tipos de entidades

Enviado: 19 Dez 2018, 23:54
por Gabriel Pinheiro
QUE AFLIÇÃO...(Em breve)
então acho que é hora de eu ler tudo do inicio até aqui, pra ficar expert... Vou fazer isso até sair a proxima parte ☺️

Re: 18. Tipos de entidades

Enviado: 31 Jan 2019, 11:11
por Arcanjo_pires
Junior você me ensinou muita coisa.....na verdade eu nem sabia escrever nenhum script para GTA coisa que eu sempre sonhei, mas nunca tinha encontrado nenhum tutorial melhor...aprendí tanta coisa e estou escrevendo tanta coisa.....somente tou a espera de tutorial sobre criacao de menus e tou precisando tanto..."hugs"

Re: 18. Tipos de entidades

Enviado: 31 Jan 2019, 12:17
por HybridTheory
Arcanjo_pires escreveu:
31 Jan 2019, 11:11
somente tou a espera de tutorial sobre criacao de menus e tou precisando tanto..."hugs"

http://brmodstudio.forumeiros.com/t6207 ... nus#244711

Re: 18. Tipos de entidades

Enviado: 28 Ago 2020, 12:48
por Withdrawpurpose
Esse código referente ao exercício #2 eu fiz tudo certinho mas ao tentar usar o REPEAT para deletar os char, n funciona, será que ta acontecendo igual ao caso acima ?
SpoilerAbrir

Código: Selecionar tudo

SCRIPT_START
{
LVAR_INT n
LVAR_INT scplayer qballas cballas[10]
LVAR_FLOAT cx cy

GET_PLAYER_CHAR 0 scplayer

main_loop:
WAIT 0

WHILE NOT LOCATE_CHAR_ANY_MEANS_3D scplayer 2079.908 -1342.479 23.984 10.0 10.0 10.0 1
    WAIT 0
ENDWHILE

GOSUB modelsrequest
GOSUB charcreator

WHILE LOCATE_CHAR_ANY_MEANS_3D scplayer 2079.908 -1342.479 23.984 50.0 50.0 50.0 0
    WAIT 0
ENDWHILE

MARK_MODEL_AS_NO_LONGER_NEEDED 102
MARK_MODEL_AS_NO_LONGER_NEEDED 103
MARK_MODEL_AS_NO_LONGER_NEEDED 104
MARK_MODEL_AS_NO_LONGER_NEEDED AK47

REPEAT 10 n
    DELETE_CHAR cballas[n]
ENDREPEAT

charcreator:

REPEAT 10 n
    GENERATE_RANDOM_FLOAT_IN_RANGE 2102.844 2122.844 cx
    GENERATE_RANDOM_FLOAT_IN_RANGE -1332.118 -1352.118 cy
    GENERATE_RANDOM_INT_IN_RANGE 102 105 qballas
    CREATE_CHAR PEDTYPE_GANG1 qballas cx cy -100.0 cballas[n]
    GIVE_WEAPON_TO_CHAR cballas[n] WEAPONTYPE_AK47 500
    SET_CHAR_WEAPON_SKILL cballas[n] 1
    TASK_KILL_CHAR_ON_FOOT cballas[n] scplayer
ENDREPEAT
RETURN

modelsrequest:
REQUEST_MODEL 102
REQUEST_MODEL 103
REQUEST_MODEL 104
REQUEST_MODEL AK47
WHILE NOT HAS_MODEL_LOADED 102
OR NOT HAS_MODEL_LOADED 103
OR NOT HAS_MODEL_LOADED 104
OR NOT HAS_MODEL_LOADED AK47
    WAIT 0
ENDWHILE
RETURN
}
SCRIPT_END

Re: 18. Tipos de entidades

Enviado: 28 Ago 2020, 13:29
por AguiaX2
Sim, está :\
e alem disso, o seu codigo mesmo que não estivesse tendo esse problema, qualquer opcode que usasse para controla-los
só funcionaria no ultimo CHAR porque você está reescrevendo a variavel que armazena eles toda vez que os cria no REPEAT
então nesse caso para que funcionasse e pudesse controlar todos os CHARs (inclusive deleta-los), você deveria usar Arrays :peepo6:
(ou se quiser poupar variaveis pode usar Thread Memory)