(english)
Este é o primeiro (e mais importante?) tutorial "opcional" da seção "Como fazer?", portanto, vou dar uma introduçãozinha:
"Como fazer?"
Nada adianta aprender a escrever um código, sem saber como fazer alguma coisa de útil, né? Por exemplo, não será apenas aprendendo a usar comandos que você automaticamente aprenderá tudo sobre criar um carro no jogo, pois há muita coisa por trás.
Por este motivo, este tutorial tem vários "sub-tutoriais" na seção "
Como fazer?" no
Índice ensinando a fazer cada coisinha. É uma seção quase infinita que sempre pode ter coisa nova, mas começaremos com os básicos.
Importante: Só leia estes tutoriais de "
Como fazer?" após já entender o básico de como escrever scripts!
Leia pelo menos até a parte "11. Comandos" do "Essenciais".
Concluindo este tutorial você vai:
Conseguir criar veículos (CAR), peds (CHAR), objetos (OBJECT) e ter uma introdução sobre o carregamento e descarregamento de coisas, assim também auxiliando no uso de animações (IFP) e armas (WEAPONS) por exemplo.
Peça, pois você não tem!
A criação de carros, objetos e pessoas são praticamente a mesma coisa (eu poderia resumir o título deste tutorial para
"criação de entidades (entity/entities)". Como exemplo, vou ensinar a criar uma pessoa/ped/pedestre/ator/actor/char:
Okay, já começamos com o óbvio.
Um exemplo do comando com os argumentos, indicando a criação de um FAM1 no meio da Grove Street:
Código: Selecionar tudo
CREATE_CHAR PEDTYPE_GANG2 FAM1 2491.107 -1667.853 13.343 my_char
Mas não é só isso que precisamos!
Antes de criarmos uma coisa, nós precisamos carregar o modelo dela. Sem o modelo carregado, não podemos criar — dará crash.
Mas isso é mais interessante do que você possa ter imaginado:
Marcar modelo como necessário / não mais necessário
Nós não usamos comandos para "carregar" e "descarregar" o modelo literalmente, pois isso seria ruim de diversas formas!
O jogo funciona de modo diferente:
Nós na verdade falamos para o jogo:
"Ei, eu preciso deste modelo" e depois de você usar
"Opa, não preciso mais dele", e quem irá cuidar do "carregar e descarregar" será o próprio jogo:
"Legal, nenhum script está precisando deste modelo mais, então vou descarregar ele para liberar memória RAM" (caso contrário, causará o chamado "memory leak").
Esperar carregar ou carregar agora?
Também, quando você diz ao jogo que você precisa de um modelo, ele não carrega instantaneamente, portanto você tem que esperar até que o jogo carregue:
Ou seja: Eu pedi (requisitei,
REQUEST
) o modelo
FAM1
, e em seguida, enquanto (
WHILE
) não (
NOT
) está carregado (
HAS_MODEL_LOADED
), fique rodando o
WAIT 0
somente processando o jogo. Quando carregar, o script sairá do
WHILE
e continuará seu caminho abaixo do
ENDWHILE
.
Mas também há este outro método que você pode gostar mais:
"Sério? Só isso?"
Sim! Você deve pensar
"Mas então por que diabos há o outro método?"
É que é assim:
Imagine que você é um patrão e está pedindo para seu funcionário trazer umas caixas. E você tem duas opções:
1. Esperar até que ele traga. E você espera sossegado na sua cadeira tomando seu café e trabalhando em outras coisas que você precisa.
2. Obrigar ele a trazer imediatamente. E você fica parado esperando até ele chegar.
Esperar até que ele traga é bom pois você não sobrecarrega, você deixará o jogo rodando livremente e quando ele estiver preparado, ele trará o modelo (a caixa) para você.
O segundo método você estaria obrigando o jogo a te dar o modelo (a caixa!...) no mesmo instante: Pode causar um pequeno freeze / lag spike caso o modelo seja pesado (alá carro BR); o disco do jogador seja lento (HD lento); você está carregando muitos modelos ao mesmo tempo, e o jogo não responderá até que estes modelos estejam carregados.
Eu recomendo você usar o método 1 para evitar os problemas que eu disse acima.
O método 2 pode ser usado para poucos modelos, ou coisas pequenas (leves para carregar), pois assim a resposta será mais rápida (a caixa chegará mais rápido em sua mão!). Ou então você por exemplo está iniciando uma missão: A tela do seu jogo está preta (em fade), portanto não há problemas o jogo ter travadinhas por carregar muitos modelos pesados, então carregue à vontade! Irá carregar muito mais rápido do que pedir os modelos e esperar o jogo carregar.
Mas se o jogador está durante o gameplay, para evitar que ele tenha "lag spikes" (travadinhas), prefira o primeiro método, na qual não sobrecarrega o jogo da pessoa, mas o tempo de carregamento do modelo pode variar muito (ser instantâneo, ou demorar até uns 5 segundos caso seja muitos modelos pesados em um PC ruim).
Nota: E se o modelo que você pediu já está carregado? Já vai estar carregado! Oras...
O jogo cuida muito bem disso, se o modelo já está carregado, ele não carrega de novo, ele só vai passar pelos comandos e você já vai poder usar instantaneamente.
Nota 2: Mas se você por exemplo pedir o modelo 2 vezes e marcar como não mais necessário 1 vez, vai ser um problema! Pois o modelo ficará na memória RAM do jogo da pessoa enquanto ela joga, gastando memória atoa: O chamado memory leak (vazamento de memória).
Nota 3: O LOAD_ALL_MODELS_NOW
é global! Ou seja, influencia todos os scripts na qual já deram algum REQUEST_MODELS
. Em outras palavras, quando você usar o LOAD_ALL_MODELS_NOW
, forçará o carregamento de todos os modelos já pedidos, mesmo não sendo do seu script.
Um detalhe também é que este comando nunca foi usado no GTA (muito possivelmente porque foi feito com foco no PS2, onde tem carregamento muito lento). Mas atualmente com nossos HDs fica tudo mais rápido e abriu essa possibilidade de usarmos.
Nota 4: Quais modelos foram marcados como necessários são dependentes por script e não global, portanto se você marcar o modelo para ser carregado uma vez mas marcar como não mais necessário duas vezes, não terá problema (mesmo que ainda seja um erro fazer isso).
Quando usar?
O
REQUEST_MODEL
não há muito o que dizer: Use-o logo antes de criar as pessoas/carros/objetos etc, mas prefira carregar todo o necessário ao mesmo tempo, em de, por exemplo, carregar um modelo, criar um char, carregar outro, criar outro etc na qual deixa tudo muito lento, ou deixaria o uso exagerado do
LOAD_ALL_MODELS_NOW
, podendo influenciar outros mods além do seu, como falei acima.
Você verá exemplos abaixo.
O
MARK_MODEL_AS_NO_LONGER_NEEDED
as pessoas causam muita confusão!
Quero deixar claro para vocês não errarem: Se você não vai mais usar o modelo, então use este comando!
É muito comum as pessoas usarem só no "release total" do mod: Uma parte do mod onde descarrega tudo, apaga as coisas etc. Não é necessário, você pode usar até mesmo embaixo do comando de
CREATE
.
Leve o nome "MARCAR MODELO COMO NÃO MAIS NECESSÁRIO" ao pé da letra que você não irá errar.
Alguns exemplos:
Exemplo 1:
Código: Selecionar tudo
REQUEST_MODEL FAM1
LOAD_ALL_MODELS_NOW
CREATE_CHAR PEDTYPE_GANG2 FAM1 2491.107 -1667.853 13.343 (char1)
MARK_MODEL_AS_NO_LONGER_NEEDED FAM1
Exemplo 2:
Código: Selecionar tudo
REQUEST_MODEL FAM1
WHILE NOT HAS_MODEL_LOADED FAM1
WAIT 0
ENDWHILE
CREATE_CHAR PEDTYPE_GANG2 FAM1 2491.107 -1667.853 13.343 (char1)
MARK_MODEL_AS_NO_LONGER_NEEDED FAM1
Exemplo 3:
Código: Selecionar tudo
REQUEST_MODEL FAM1
REQUEST_MODEL FAM2
WHILE NOT HAS_MODEL_LOADED FAM1
OR NOT HAS_MODEL_LOADED FAM2
WAIT 0
ENDWHILE
CREATE_CHAR PEDTYPE_GANG2 FAM1 2491.107 -1667.853 13.343 (char1)
CREATE_CHAR PEDTYPE_GANG2 FAM2 2496.235 -1667.934 13.343 (char2)
MARK_MODEL_AS_NO_LONGER_NEEDED FAM1
MARK_MODEL_AS_NO_LONGER_NEEDED FAM2
Atenção ao WHILE OR
E NÃO WHILE AND
!!! Acredito que muitas pessoas farão esta confusão, o certo neste caso é
OR
! Se não entendeu o porquê, leia devagar o código tentando entender o que acontecerá caso usasse
WHILE AND
: Quebraria o
WHILE
(daria falso) caso
algum dos modelos seja carregado, e não ambos. Dê uma olhada, raciocine, e não erre!
Exemplo 4:
Código: Selecionar tudo
REQUEST_MODEL FAM1
REQUEST_MODEL FAM2
LOAD_ALL_MODELS_NOW
CREATE_CHAR PEDTYPE_GANG2 FAM1 2491.107 -1667.853 13.343 (char1)
MARK_MODEL_AS_NO_LONGER_NEEDED FAM1
CREATE_CHAR PEDTYPE_GANG2 FAM2 2496.235 -1667.934 13.343 (char2)
MARK_MODEL_AS_NO_LONGER_NEEDED FAM2
Por favor note que estes exemplos são misturas de possibilidades. Você pode escolher qual mais te agrada, mas lembre-se que fiz misturas de posições dos comandos só como demonstração e não precisa ser obrigatoriamente deste exato mesmo jeito.
O que você aprendeu aqui?
Não, você não aprendeu a
carregar modelos de peds/skins/atores, você aprendeu a
carregar modelos!
Isso serve para qualquer modelo!!! Seja arma, seja objeto, seja
tudo!!! Serve até mesmo para animações (.ifp)!
Você pode ter ficado de saco cheio de ler tudo isso, mas foi um passo gigante, e não só um modelo de pedestre sendo carregado.
Se aprofundando individualmente
Agora vamos entender detalhes sobre criação de cada coisa.
Antes note que, é importante que você só crie coisas caso você já esteja no local!!! Por exemplo, você está na praia de Santa Maria criando coisas na Grove, em vários casos, isso não vai dar certo! O ped irá cair no submundo etc, pois não há colisão na Grove enquanto você está longe dela (uns 150.0 ou mais). Você precisa usar algum comando LOCATE
para checar se o player está próximo do local necessário, como o LOCATE_CHAR_ANY_MEANS_3D
(o último parâmetro é escolher mostrar a marca circular vermelha no chão, não queremos aqui, né?)
Como criar um pedestre / Ped / Actor / Ator / CHAR / Pessoa / Personagem / Skin / Boneco
1 bilhão de nomes
(e o pior deles é o "boneco") para a mesma coisa:
Código: Selecionar tudo
CREATE_CHAR PEDTYPE_GANG2 FAM1 2491.107 -1667.853 13.343 my_char
Como já mostrei, esta linha de comando cria um
FAM1
(membro da Grove) no meio da Grove Street.
Você também tem outras opções como
CREATE_RANDOM_CHAR
,
CREATE_CHAR_INSIDE_CAR
,
CREATE_CHAR_AS_PASSENGER
etc. Dê uma olhada no seu VSCode.
PEDTYPE_GANG2
— É o "ped type", que é o tipo de pessoa. Ao digitar alguma coisa ou apertar
CTRL+espaço
o Visual Studio já te dará a lista de ped types para você escolher.
Isso define o relacionamento desta pessoa com as outras, ou seja, o
PEDTYPE_GANG2
faz dizer que ele é da gangue 2 (que é a Grove St. Families) na qual ele te tratará com respeito, atirarão nos Ballas etc. Geralmente você irá querer escolher
PEDTYPE_CIVMALE
para homens normais e
PEDTYPE_CIVFEMALE
para mulheres. É tudo muito auto-explicativo (
PEDTYPE_COP
para policiais etc.). Você pode ver melhores descrições
aqui.
Se é algum personagem importante de missão ou que não pode reagir às coisas (como não levantar os braços ao mirar a arma), use
PEDTYPE_MISSION#
, onde
#
é algum número de 1 a 9. Isso são pedtypes personalizáveis especiais para personagens de missões.
FAM1
— É o modelo. Note que está digitado o nome. Necessário? NÃO! Você pode usar o ID do modelo, na qual pode ser qualquer um do jogo (desde que seja um pedestre, né. Procure no Google ou no
data\peds.ide
por IDs de peds). Se adicionou sem substituir, também sem problemas.
Neste caso em específico,
FAM1
é o ID
105
, ou seja, eu poderia ter usado o número
105
em vez de digitar
FAM1
. O
FAM1
é uma constante padrão — você lembra?
Nota: Você não precisa carregar o
MALE01
! Este ped é sempre carregado por padrão no jogo.
2491.107 -1667.853 13.343
— Coordenadas 3D (
X Y Z
). Ou seja, a posição no mundo. Para ter a coordenada do mapa há vários modos, um deles é utilizando
este mod.
Nota interessante: Se você usar "-100.0" no Z (no último valor, no lugar do
13.343
) o jogo irá usar a coordenada correta do chão do local! E isto vale para vários comandos do jogo na qual pedem alguma coordenada! Por exemplo comandos de teletransportar um carro (
SET_CAR_COORDINATES
), entre vários outros. É uma dica muito legal que você pode querer usar em certas ocasiões. O lado ruim é que o chão é definido numa linha vertical a partir de cima — se você tentar fazer algo embaixo de uma ponte, a coordenada ficará em cima dela.
my_char
— Variável de retorno na qual ficará armazenado o nosso CHAR.
Quando você não quiser mais usar o nosso CHAR, marque ele como não mais necessário ou apague-o:
MARK_CHAR_AS_NO_LONGER_NEEDED
— Marca o CHAR como não mais necessário, fazendo assim ele se agir como um pedestre aleatório andando na calçada, e quando você sair de perto, ele sumirá como de costume.
DELETE_CHAR
— Deleta o CHAR do jogo imediatamente, fazendo-o sumir no mesmo instante.
REMOVE_CHAR_ELEGANTLY
— Deleta o CHAR do jogo com um "fade out", ou seja, ele irá desaparecer suavemente ao invés de instantaneamente. Use este comando para remover CHARs que possivelmente estejam visíveis na câmera.
Como criar um carro / veículo / CAR
Este exemplo cria um carro do modelo
ELEGY
também no centro da Grove St e guarda numa variável com nome
my_car
.
É exatamente a mesma coisa do exemplo acima, portanto não preciso repetir.
Lembre-se que este comando
pode criar absolutamente qualquer veículo, não só carro. Exceto trem (não fica funcional, use
CREATE_MISSION_TRAIN
).
Quando você não quiser mais usar o veículo, marque ele como não mais necessário, ou apague-o:
MARK_CAR_AS_NO_LONGER_NEEDED
— Marca o veículos como não mais necessário, fazendo assim ele sumir caso você se distancie dele etc, como carros aleatórios criados na rua.
DELETE_CAR
— Deleta o carro do jogo imediatamente, fazendo-o sumir no mesmo instante (se o CJ estiver dentro do carro, causará a morte (wtf?), mas outros peds não há problemas).
Como criar um objeto / OBJECT
Este exemplo cria um objeto de modelo de ID
737
, na qual
é uma árvore ...também no meio da Grove St...
Eu recomendo altamente o site
dev.prineside.com/gtasa_samp_model_id para encontrar IDs para os modelos. Só fique atento e veja antes se o modelo é ou não do SAMP (pois estão misturados, há como filtrar na pesquisa).
Nós também temos esta opção:
Código: Selecionar tudo
CREATE_OBJECT_NO_OFFSET 737 2491.107 -1667.853 12.7 my_object
Na qual é a mesma coisa, mas a diferença é que este não adiciona um offset (uma distância extra na altura). Inclusive, perceba que eu tive que aumentar a coordenada Z (
12.7
) que é a altura, pois
12.2
deixou a árvore afundada quando usei este comando.
Eu particularmente prefiro o uso do
CREATE_OBJECT_NO_OFFSET
.
Uma nota interessante é que ao criar um objeto você NÃO precisa carregar o modelo!
Sim, no caso do objeto, você não é obrigado a carregar o modelo. O jogo irá carregar para você quando puder, e quando criar, dará um
fade in (um aparecimento suave) no mapa.
Se o modelo já estiver carregado (por exemplo você fez carregar), irá aparecer instantaneamente (sem
fade in).
Importante: Objetos criados por script ficam presos no save game!!!!!!!!!!
Tenha isso em mente! Não se esqueça! Eu até tive que criar um mod para
deletar objetos presos no save game por causa disso.
Nas próximas versões da CLEO isso pode ser corrigido.
Quando você não quiser mais usar o objeto marque ele como não mais necessário, ou apague-o:
MARK_OBJECT_AS_NO_LONGER_NEEDED
— Marca o objeto como não mais necessário, fazendo assim ele ser apagado pelo jogo quando ir longe dele etc.
DELETE_OBJECT
— Deleta o objeto instantaneamente.
REMOVE_OBJECT_ELEGANTLY
— Remove o objeto com "fade out" (sumindo suavemente). Use para objetos que estão visíveis na tela.
Como usar animações / IFP
REQUEST_ANIMATION
— Carrega um arquivo .IFP (de animações) para ser usado em comandos onde faz o CHAR ou OBJECT fazer alguma animação (digite
TASK_PLAY_ANIM
e veja as possibilidades).
Você não precisa digitar ".IFP" no nome, basta usar por exemplo:
REQUEST_ANIMATION GANGS
Nota importante: Você não precisa carregar o
PED.IFP
! Este arquivo é sempre carregado por padrão no jogo. E não se deixe levar pelo nome, mesmo que seja "animation", este comando pede o nome do arquivo .IFP da animação, e
não o nome da animação!
HAS_ANIMATION_LOADED
— Checa se o .IFP foi carregado, assim como você já aprendeu no
HAS_MODEL_LOADED
.
Nota interessante: O
LOAD_ALL_MODELS_NOW
funciona também para .IFP! Mesmo que não seja um modelo, o comando também faz carregar as animações (arquivos IFP).
REMOVE_ANIMATION
— Remove o .IFP da memória. Note que este aqui funciona diferente do
MARK_MODEL_AS_NO_LONGER_NEEDED
, pois quando marcar, e seu último script for o último que estava necessitando usar este IFP, o jogo não esperará, irá realmente descarregar o IFP mesmo caso a animação esteja sendo usada!
Ou seja, se você estiver usando uma animação numa pessoa ou objeto, a animação parará instantaneamente. Portanto, diferente do que eu disse antes, prefira usar este comando só quando realmente não estiver mais usando animações (quando ninguém mais estiver fazendo tais animações), normalmente no descarregamento total do mod.
Outros
Armas
Sempre que você for usar alguma arma, carregue os modelos necessários antes.
Por exemplo:
Código: Selecionar tudo
REQUEST_MODEL COLT45
LOAD_ALL_MODELS_NOW
GIVE_WEAPON_TO_CHAR scplayer WEAPONTYPE_PISTOL 999
MARK_MODEL_AS_NO_LONGER_NEEDED COLT45
Modelos especiais para CHARs
As missões do jogo carregam modelos especiais para usar nos personagens. São modelos que não tem ID.
Código: Selecionar tudo
LOAD_SPECIAL_CHARACTER 1 SWEET
LOAD_ALL_MODELS_NOW
CREATE_CHAR PEDTYPE_MISSION1 SPECIAL01 0.0 0.0 0.0 char
UNLOAD_SPECIAL_CHARACTER 1
Neste caso, nós carregamos o
sweet.dff/.txd
(note que
SWEET"
é uma string que diz o nome do .dff e .txd para ser carregado).
Se você adicionar uma nova skin com algum nome personalizado, como
mychar.dff/.txd
, é só carregar o `MYCHAR"! (
limite de 7 letras!). É muito dinâmico! É só ter o .dff e .txd instalado (modloader ou gta3.img) que irá carregar! Assim não precisando substituir pedestres do jogo para ter chars personalizados nos mods.
Como se pode ver, ao carregar um personagem especial, damos um número int (neste caso
1
), na qual ficará, neste caso específico, no
SPECIAL01
— se fosse
2
, ficaria no
SPECIAL02
.
SPECIAL01
é um modelo (ID
290
), e vai até o
SPECIAL10
— ou seja, você pode usar até
10
no
LOAD_SPECIAL_CHARACTER
.
Note que você pode querer carregar o char em outro número menos comum, por exemplo,
7
... Assim usar
SPECIAL07
ao invés do
SPECIAL01
, para evitar incompatibilidade entre mods e missões —
ué, por quê? — pois se você carregar como
1
e uma missão ou mod também carregar como
1
, irá sobrescrever e assim aparecerá outra pessoa lá (vários conhecem esse bug devido ao
mod de corvos, onde aparecia o Sweet voando batendo asas).
Carros estacionados / Parked cars / car generator
Leia o tutorial de como criar geradores de carros. (na qual não tem a ver com carregamento de modelos)
(... há mais coisas do tipo para colocar aqui? ...)
Bote a mão na massa!
No
Exercício #2 do
tutorial você será desafiado a colocar em prática o que aprendeu aqui!
Há muita coisa legal que se pode fazer, com certeza. Eu inclusive recomendo as pessoas de tentarem fazer pequenas submissões ou cenas para treinar criação de scripts, coisas simples do tipo criar algum objetivo, como matar alguém etc.
GTA3script, como eu já disse, foi a programação criada pela Rockstar para fazer as missões e outros scripts do jogo, é uma programação
feita para criação de missões, cenas, tarefas de pessoas, criação de coisas etc, portanto é ideal começar a praticar desta maneira. Você pode agora querer ler o
tutorial de criar tarefas.
(a CLEO é só uma introdução de novas possibilidades. Manipulações de pessoas, carros e todas estas coisas básicas são do jogo e não da CLEO.)