Skip to content

[PT] Extras Recursivos

Valdir da Costa Júnior edited this page May 8, 2020 · 31 revisions

Novo sistema de extras (variações)

Utilidade

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.

Pontos fortes:

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

Pontos ruins:

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

Básicos

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

Gatilho 'f_extras'

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.

Sufixo ':'

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

Danos (damage)

É 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:

Características

É 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 ou carga;
  • Caso selecionar o gás, também aplicará um ID personalizado ao motorista (190) configurado no drv=190 ("drv" de "driver") e a paintjob 1 configurado no pj=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ão botijões e interior, 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/ou garrafas e/ou pédecabra. Caso selecionar garrafas, também há chance de selecionar copo;
  • E caso não ser selecionado o gás? Será selecionado carga;
  • Selecionando carga, o script aplicará um motorista personalizado de ID 160 ou 161;
  • E temos 2 extras: móveis e entulho, onde caso for selecionado entulho, 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.

Seleção de classe (categoria)

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] e 1[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:

Condições

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.

Exemplos de veículos

Trator + Carreta

Utiliza o sistema de extras. Na carreta é um ótimo exemplo de :1+.
Download

Clone this wiki locally