-
Notifications
You must be signed in to change notification settings - Fork 4
[PT] Extras Recursivos
Antes de prosseguir não deixe de ler a Introdução.
A atual sistema de variação de peças de veículos do GTA SA é muito limitado. Esta função visa eliminar estes limites.
Funciona em um sistema totalmente novo (sem substituir o atual sistema de extras do jogo), proporcionando muitas vantagens.
- Quantidade ilimitada de peças extras (originalmente é somente 6);
- Extras em literalmente qualquer parte do veículo, podendo variar portas, para-choques, rodas etc, incluindo danos funcionais. Isto possibilita a criação de diferentes veículos no mesmo arquivo;
- Sistema recursivo: Quando um extra ser selecionado, ele selecionará um filho, e assim por diante, criando um "agrupamento" onde um extra só aparecerá caso o outro aparecer;
- Você pode definir quantos extras de cada agrupamento serão selecionados;
- Possibilidade de adicionar extras também em trens (originalmente é possível em todos os tipos de veículos, exceto trens);
- Pode ser usado em conjunto com o sistema de Características para criar variar características de um veículo.
- Caso o jogador que baixar o seu mod de veículo não ter VehFuncs instalado, todos os extras ficarão visíveis por padrão.
- Utilizar extras em para-choques ou rodas, ao instalar uma peça tuning no para-choque ou na roda, deletará aqueles extras.
A sintaxe básica é a seguinte:
A imagem acima é auto-explicativa e já ensina todo o básico de como funciona.
Tenha a nota de que o nome "extra" é só exemplo, pode ser qualquer outra coisa.
Antes de prosseguir quero deixar claro que o sistema é muito flexível e conveniente, você não precisa usar muito a memória, inclusive, os nomes das funções podem ser escritos em qualquer ordem e como você bem entender. De fato, cada node nem precisa ter algum modelo visível dentro dele.
Se você quer fazer variações de roda, você precisa também ler sobre Rodas Variáveis. Veja uma imagem
f_extras
é um "gatilho", ou seja, um node que representa o ponto inicial; ele sempre será visível, no entanto, não precisa existir nenhum modelo dentro dele, pode ser simplesmente um dummy (ou seja, um node vazio).
Todos os filhos do f_extras
serão considerado "extras". Tenha a nota de que eles podem ter absolutamente qualquer nome, não precisam se chamar "extras" como na imagem acima.
Leia isso como "selecione X filhos", por exemplo :2
selecionará 2 filhos; :1
selecionará 1 filho (o que é o padrão); :0
pode ser que selecione 1, ou nenhum.
Como dito, se você não usar o :
por padrão selecionará 1 filho, mas se o pai tem somente 1 filho? Então terá 50% de chances do filho ser selecionado. Para forçar que o filho único sempre seja selecionado (100% de chance), use o sufixo :1
no pai.
Como dito, você pode usar :0
para criar uma chance de selecionar nenhum filho. Por exemplo, há 3 filhos e você quer que selecione um deles, mas também deseja que tenha uma chance de selecionar nenhum deles, basta usar :0
no pai.
Mas provavelmente o que você mais usará é o :0+
ou :1+
. Para entender, o +
no fim quer dizer literalmente "aleatorize até a quantidade máxima", ou seja, se você usar :0+
, selecionará nenhum, ou um, ou alguns, ou todos os filhos! Assim como :1+
selecionará pelo menos um, ou alguns, ou todos. Em resumo, o número após o :
quer dizer "selecione no mínimo isto" e o +
quer dizer "...aleatoriamente até o máximo possível".
É possível usar os extras dentro de peças danificáveis, como bump_front_dummy
, basta adicionar normalmente dentro dele e incluir _ok
ou _dam
no fim do nome da peça extra conforme necessário.
Anteriormente era ainda necessário ter algum bump_front_ok/dam
fora do f_extras
para os danos funcionarem, não é mais! Você pode colocar as peças _ok
e _dam
normalmente dentro do f_extras
.
Perceba que o VehFuncs trata os nodes _ok
e _dam
como peças extras normais, não faz nenhuma ligação entre os dois, portanto normalmente você organizará eles como irmãos tendo um pai :2
, conforme a imagem acima, e abaixo:
É possível utilizar o sistema de Características junto com extras, assim possibilitando o veículo ter certas características baseadas em quais extras foram selecionados.
No exemplo acima,
- O mod selecionará aleatoriamente o extra
gás
oucarga
; - Caso selecionar o
gás
, também aplicará um ID personalizado ao motorista (190) configurado nodrv=190
("drv" de "driver") e a paintjob 1 configurado nopj=1
(de "paintjob"), que seria uma pintura de caminhão de gás; - E o que é aquele
:2
? É quantos extras filhos serão selecionados; - Neste caso, os filhos do extra
gás
sãobotijões
einterior
, selecionará os 2; -
botijões
tem 2 extras que contém variações de botijões, será selecionado e aparecerá 1 deles; -
Interior
tem 3 extras e está configurado para selecionar 2 extras (:2
), portanto selecionará 2 dos 3:revistas
e/ougarrafas
e/oupédecabra
. Caso selecionargarrafas
, também há chance de selecionarcopo
; - E caso não ser selecionado o
gás
? Será selecionadocarga
; - Selecionando
carga
, o script aplicará um motorista personalizado de ID 160 ou 161; - E temos 2 extras:
móveis
eentulho
, onde caso for selecionadoentulho
, aplicará entre 7 e 9 níveis de sujeira ("drt", de "dirty" em inglês) (a configuração vai de 0 à 9).
Se você achou confuso, tudo bem, no fim da página há um exemplo mais fácil, mas é também importante que você entenda o básico deste.
Leia mais sobre Características.
Certo, aprendemos a colocar extras em algum lugar do carro, mas como se comunicar entre diferentes partes do carro?
Afinal, por exemplo, queremos que caso uma escada aparecer no teto (chassis
) apareça adesivo nas portas.
No exemplo acima temos f_class
que selecionará unofirma
ou unovelho
. Caso unofirma
ser selecionado, será definido a classe [unofirma]
.
Ao processar os extras da porta, poderá ser aplicado o adesivofirma[unofirma]
. Tenha a nota de que no exemplo há uma chance de 50% do adesivo ser aplicado ou não. Se você quer forçar que o adesivo sempre apareça caso a classe [unofirma]
tenha sido selecionada, no f_extras_ok
e f_extras_dam
, deixe f_extras:1_ok
e f_extras:1_dam
, assim sempre selecionará, como explicado acima.
É possível criar diferentes versões/modelos do carro dentro do mesmo .dff, como no exemplo:
É também possível fazer seleção de várias classes em vez de somente uma.
Perceba que você pode usar :
e +
no f_class
.
O _reset
faz o que o nome diz: limpa todas as classes antigas para selecionar somente as novas.
Gostaria de controlar as chances de cada classe aparecer? Você também pode, basta usar [#]
no nome da classe dentro do f_class
.
Neste exemplo, a classe com nome normal
será a mais comum, enquanto a construct
terá a metade das chances de aparecer ([50]
) comparada à normal
([100]
).
Perceba que o número vai de 1 à 100, mas utilizar 100
não quer dizer que aparecerá "100% das vezes". É recomendado que você utilize [100]
na classe mais comum e a partir disto escolha os outros números para as outras menos comuns.
Se você não informar um valor o mod considerará como 100
.
E em casos ainda maiores, que tal subclasses?
O sistema de seleção de class é semelhante ao dos extras, ou seja, recursivo, se seleciona um, irá processar os filhos, assim selecionando várias em sequência, como grupos.
Você também pode colocar características logo no nome da classe, assim as características serão aplicadas logo caso a tal class ser escolhida.
No entanto, devido ao limite de 23 caracteres, utilizar o nome das características logo na frente nem sempre é eficiente. Portanto, você pode criar um node com nome iniciado com !
(pode ser só um !
ou qualquer nome, o que importa é o !
no início) para informar que, abaixo, não é uma class, e sim nodes com características. Todas elas serão lidas e processadas.
No exemplo acima, caso o f_class
selecionar class1
e assim class1a
, todas aquelas características filhas do !characteristics
serão lidas.
Importante:
- A partir da v1.9 é suportado mais de 1 classe por node, por exemplo
peca[class1][class2]
. - Os nodes são processados de cima para baixo, portanto a seleção de classe deve ficar em cima, de preferência no topo da hierarquia do modelo.
- O mod considerará
_
como o final do nome da classe, ou seja, não use_
para o nome da classe, use somente uma palavra. Após o_
normalmente você usará características. - É necessário que o node tenha algum nome em vez de somente o nome da classe (aparentemente isto é um bug do ZModeler e não é necessário no 3DS Max). Por exemplo
[exemplo]
é errado;peca[exemplo]
é certo, até mesmo_[exemplo]
e1[exemplo]
estão certos.
E o que acontece se termos irmãos de mesma classe?
Caso exista 2 nodes irmãos marcados com a mesma classe, o funcionamento de escolha dos extras será exatamente o mesmo entre eles. No entanto, caso você definiu o sufixo ":" como um número maior do que o total de irmãos, primeiramente será selecionado entre os irmãos da mesma classe, e em seguida selecionará normalmente os nodes que sobrou que não tenham classe (bem conveniente, não?).
Veja um último exemplo semelhante ao que vimos antes. Dentro do ZModeler:
Possibilita que tal classe seja selecionada sob diferentes condições, por exemplo, a região (se é LS, SF, LV, zona rural ou deserto), zona específica (algum local específico do mapa, por exemplo Grove Street, Idlewood), clima (por exemplo se está chovendo), tipo de população (por exemplo se é praia), hora (se é noite ou dia) etc.
Só funciona durante a seleção de classe (f_class
).
Você pode usar várias condições ao mesmo tempo.
Retornará verdadeiro caso ALGUMA das condições sejam verdadeiras. Se você quer que retorne caso todas sejam verdadeiras ao mesmo tempo, prefira fazer uma condição "pai" para checar alguma coisa, e um filho para checar outra, assim, use o nome da classe somente no filho (assim o mod irá selecionar o nome da classe somente caso o filho ser selecionado, e para ele ser selecionado, antes precisa selecionar o pai, deu pra entender, né?).
Use ?
como trigger. Em seguida, use alguma destas condições:
Condição: c
(city). Checa se é tal cidade ou região.
Valores: 0
= Zona rural (e fora do mapa); 1
= Los Santos; 2
= San Fierro; 3
= Las Venturas; 4
= Deserto.
Exemplos: ?c0?c4
retorna verdadeiro caso esteja na zona rural ou deserto.
Condição: z
(zona). Checa se é tal zona do mapa.
Valores: Após o z
, coloque o nome do GXT da zona. Você encontra pesquisando por sites, ou no arquivo data/info.zon
. O nome curto no final da linha é o nome que você precisa.
Exemplos: ?zGAN
retorna verdadeiro caso esteja em Ganton (proximidades da Grove Street).
Nota: Sempre que puder, prefira usar c
ou p
pois são um pouco mais leves.
Condição: p
(população/popcycle). Checa se é tal tipo de população.
Valores: Número do ID do tipo de população. Você pode abrir o arquivo data/popcycle.dat
e contar os tipos de população a partir do zero, ou seja, BUSINESS
(negócios) é o 0
, DESERT
(deserto) é o 1
, BEACH
(praia) é o 8 etc.
Exemplos: ?p1?p3
retorna verdadeiro caso seja deserto (1
) ou zona rural (3
). ?p8
retorna verdadeiro caso seja praia. ?p7
retorna verdadeiro caso seja região de gangue.
Nota: Anteriormente estava documentado errado, não há "=".
Condição: rain
. Checa se está chovendo, ou prestes a chover (clima de ID 8 ou 16).
Exemplos: ?rain
, simplesmente.
Condição: h
. Checa se está dentro de um intervalo de horas.
Valores: Use um número para a hora mínima, um traço, e em seguida o número da hora máxima.
Exemplos: ?h6-18
retorna verdadeiro caso seja entre 6 e 18 horas.
Condição: d
. Checa o pedstat do motorista (se é policial, velho, jovem, gangue etc). nd
para negativo.
Valores: Use o número ID do pedstat (começando do 0) definido em data/pedstats.dat
.
Exemplos: ?d5
retorna verdadeiro se é da gangue Families (pedstat GANG2
). ?nd1
retorna verdadeiro se NÃO é um policial.
Condição: m
. Checa se o veículo é controlado por script, enquanto você está numa missão. nm
para negativo.
Exemplos: ?m
, simplesmente. ?nm
retorna se NÃO é de controlado por script ou não está em uma missão.
No exemplo acima:
Caso ser Los Santos (?c1
, de "city 1"), irá adicionar a classe ls
e sempre selecionar o filho (:1
), que irá checar se a zona é Ganton (?zGAN
) ou Idlewood (?zIWD
), assim adicionará também a classe grovest
. Lembre-se de evitar usar, ?z
é um pouco pesado para o desempenho.
Também irá adicionar a classe sflv
caso seja San Fierro (?c2
) ou Las Venturas (?c3
).
E também a classe country
caso seja zona rural (?c0
) ou deserto (?c4
). Juntamente, irá aplicar a característica "dirty" (_drt=
) numa intensidade entre 7
e 9
(ou seja, deixará o veículo bem sujo).
Há um segundo f_class
, agora para checar se está ou não chovendo: Será selecionado a classe roof
caso esteja chovendo ou prestes a chover (?rain
). Caso não, selecionará norain
, que sempre selecionará 1 filho (:1
) que somente irá checar se a hora do jogo é entre 7 e 19 (?h7-19)
. Caso verdadeiro, selecionará 1 filho (:1
), e lá, finalmente, adicionará a classe beach
caso esteja na população (popcycle) de número 8 (?p8
), que se trata da população de praia.
Se você já entendeu como as seleções de variações extras funcionam (explicados aqui nesta página), você já vai entender o resto.
Utiliza o sistema de extras. Na carreta é um ótimo exemplo de :1+
.
Download