Pular para o conteúdo

Engine e modelos

Cliente

As funções de engine mexem no conteúdo do jogo que roda na máquina do jogador: modelos (.dff), texturas (.txd), colisões (.col), animações (.ifp) e arquivos .img. Com elas você troca o visual de qualquer objeto, veículo ou pedestre, cria IDs de modelo novos, mexe no comportamento físico das superfícies e controla quanto de memória o streaming pode usar.

Quase tudo aqui trabalha com IDs de modelo. As funções que aceitam “ID ou nome” resolvem o argumento assim:

Você passaO que acontece
um númerousado como ID direto
uma string só com dígitosconvertida em número
"txdN"o slot de TXD N, ou seja, 20000 + N
um nome de modeloresolvido para o ID correspondente (sem diferenciar maiúsculas de minúsculas)

O que acontece com um argumento inválido depende da função. Os carregadores de TXD, DFF, COL e IFP e as funções de substituição, distância de LOD, nomes, nomes de textura, shaders e superfícies devolvem false (as de superfície, nil) e escrevem o motivo no console de debug. Já as funções de flags, ID de TXD, propriedades físicas, streaming, IMG, pools e roupas, além de engineGetModelTextures, conferem os argumentos de forma estrita: um tipo errado ou um ID inválido gera um erro Lua que interrompe o código que fez a chamada. Cada página diz qual é o caso.

Estas 79 funções existem somente no cliente. Chamá-las de um script de servidor resulta em erro de valor nulo.

Os três carregadores aceitam um caminho dentro do resource ou os bytes do arquivo (o resultado de fileRead, por exemplo) — o formato é detectado a partir do conteúdo. O que volta é um elemento (txd, dff ou col) que as outras funções recebem. Ele é destruído quando o resource para, e os modelos que ele substituiu voltam ao original.

Uma colisão não precisa vir de um arquivo .col: setModelCollision constrói uma a partir de uma tabela de esferas, caixas, linhas e triângulos, e getModelCollision lê de volta, nessa mesma tabela, a colisão que um modelo usa no momento.

Em vez de sobrescrever um modelo que já existe, você pode pedir um ID livre e usá-lo só para o seu conteúdo.

As flags controlam como o modelo é desenhado e como o jogo o trata. Elas podem ser lidas e escritas em bloco (como número) ou uma a uma (pelo nome).

Flag
is_road
draw_last
additive
ignore_lighting
no_zbuffer_write
dont_receive_shadows
is_glass_type_1
is_glass_type_2
is_garage_door
is_damagable
is_tree
is_palm
does_not_collide_with_flyer
is_tag
disable_backface_culling
is_breakable_statue
is_crane

Cada modelo pode apontar para um grupo de propriedades físicas, numerado de 0 a 159. O valor -1 significa que o modelo não tem grupo e se comporta como estático.

Cada tipo de superfície do mundo tem um ID numérico e um conjunto de propriedades que definem som do passo, aderência dos pneus, efeitos de tiro e por aí vai.

PropriedadeTipo do valor
audiostring: concrete, grass, sand, gravel, wood, water, metal
bulleteffectstring: disabled, metal, sand, wood, concrete
wheeleffectstring: disabled, grass, gravel, mud, sand, dust
skidmarktypestring: asphalt, dirt, dust, disabled
adhesiongroupstring: rubber, hard, road, loose, sand, wet
tyregripnumber
wetgripnumber
fractioneffectnumber
roughnessnumber
stepwatersplashbool
stepdustbool
canclimbbool
shootthroughbool
seethroughbool
stairsbool
steepslopebool
glassbool
pavementbool
softlandingbool
footeffectbool

Os IDs de superfície vão de 0 a 179. stepdust é aceita, mas sempre é lida e gravada como false.

São os grupos referenciados por engineSetModelPhysicalPropertiesGroup, numerados de 0 a 159. Cada grupo define massa, elasticidade, comportamento ao quebrar e afins. Os nomes das propriedades não diferenciam maiúsculas de minúsculas.

PropriedadeValor esperado
massnumber
turn_massnumber
air_resistancenumber
elasticitynumber
buoyancynumber
uproot_limitnumber
col_damage_multipliernumber
smash_multipliernumber
break_velocity_randomnessnumber
col_damage_effectstring: none, change_model, smash, change_smash, breakable, breakable_remove
special_col_responsestring: none, lamppost, small_box, big_box, fence_part, grenade, swingdoor, lockdoor, hanging, poolball
fx_typestring: none, play_on_hit, play_on_destroyed, play_on_hitdestroyed
break_modestring: not_by_gun, by_gun, smashable
avoid_camerabool
cause_explosionbool
sparks_on_impactbool
fx_offsettrês números ou um Vector3 (lido de volta como Vector3)
break_velocitytrês números ou um Vector3 (lido de volta como Vector3)
fx_systemstring: nome de um sistema de FX, ou false para removê-lo (só escrita)

O streaming decide o que fica carregado na memória de vídeo enquanto o jogador anda pelo mundo. Aumentar os limites reduz o “pop-in” de modelos ao custo de memória.

Um .img é um arquivo único que empacota vários modelos e texturas. engineLoadIMG devolve um elemento img; depois de plugado no streaming, seus arquivos podem ser ligados a IDs de modelo ou de TXD.

Pools são as listas internas de tamanho fixo em que o jogo guarda cada tipo de coisa. Consultá-las ajuda a entender por que algo parou de aparecer. Só building e pointer-single-link-pool podem ser redimensionadas em tempo de execução.

Pool
building
ped
object
dummy
vehicle
col-model
task
event
task-allocator
ped-intelligence
ped-attractor
entry-info-node
node-route
patrol-route
point-route
pointer-double-link-pool
pointer-single-link-pool
env-map-material
env-map-atomic
spec-map-material

Estas duas funções registram arquivos de roupa novos no catálogo do cliente. Para vestir uma peça em alguém, veja as funções de Roupas.