Mais um problema grave e comum nos mods

Não quero ler

Simplesmente baixe a nova versão do VehFuncs que ele corrige um problema grave, e comum, dos mods de veículos para GTA SA. Basta tê-lo instalado que o problema é corrigido.
 

Introdução

O modding do GTA San Andreas é extremamente evoluído, considerando a falta de suporte oficial, e até hoje ainda passamos por dores de cabeça devido à falta de informação do que fazer quando algum erro (crash) acontece.

Durante os primeiros anos desde que criei o site, em 2011, a resposta mais comum para os problemas era “reinstale o jogo” ou “retorne os arquivos de backup, se você fez”. Com a chegada do ModLoader em 2014 a resposta mudou para “vai desinstalando os mods e testando até encontrar”, o que agilizou demais, principalmente seguindo a dica de remover metade-metade. Eu comecei a ganhar um certo conhecimento em engenharia reversa, e em 2015 eu comecei a montar a Lista de Crash, atualmente com basicamente 300 crashes documentados, alguns já muito bem informados.

Com a Lista de Crash, eu percebi que os crashes mais comuns eram causados por problemas relacionados à mods relacionados à modelos, e eu suponho que a maioria seja sobre mods de veículos.

Eu voltei a trabalhar no projeto GTA Brasil, com foco na estabilidade, e na linha de frente você percebe o quão difícil é lidar com crashes que você não consegue ter nenhuma informação.

Pensando nisto, eu atualizei o VehFuncs hoje que inclui a detecção de alguns crashes comuns em mods de veículos, e mostra para você o ID do modelo (vehicles.ide), assim você consegue identificar qual carro etc causou o erro.

Com isto, enquanto identificando e corrigindo os crashes no GTA Brasil, eu encontrei um problema comum que é uma bomba.


Centenas, senão milhares de mods de veículos têm um certo problema…

Eu sempre bato na tecla de que não existe “se funcionou é porque está certo”, é muito comum coisas funcionarem, mas no fundo, estão causando um problema fora da sua vista, que acaba sendo difícil de identificar.

Antes de explicar, há alguns anos atrás, com a montagem da Lista de Crash, eu encontrei um problema comum nos mods de veículos, que é o uso de modelo de sombra muito HD, bate os limites do jogo e parte da memória é sobrescrita (pelo overflow). Isto pode causar crashes estranhos, e um deles é o jogo dar crash ao tentar abrir o menu de configurações gráficas avançadas, e/ou trocar a resolução, após o carro ser carregado. A solução é que, quem cria carros, tenha um modelo de sombra mais lowpoly possível (seguindo o padrão dos carros originais do jogo). Eu ainda não busquei os números exatos do limite, mas seguir os padrões originais, não tem mistério.

Hoje, com a atualização do VehFuncs que informa crashes, eu encontrei um outro problema semelhante, mas ainda mais grave e comum.

Eu já havia notado que o jogo tem um limite de 23 caracteres no nome do node (basicamente, o nome da peça do carro dentro do .dff dele), mas hoje eu percebi que não respeitar esta regra é um problema mais grave do que parecia.

Tentando explicar sem o uso de termos técnicos, o 24º caractere do nome é sobrescrito por um null terminator (na programação, isto é o que indica que final de um texto), então não causa problemas, só perderá o último caractere do nome. No entanto, 25 caracteres, ou mais, causa um overflow (o valor é escrito em partes erradas da memória), onde o valor do ponteiro que referencia aquela peça é escrito num offset da memória referente ao valor ASCII do restante do texto multiplicado por 4 a partir do array dos nodes… O que isto quer dizer é que… Muita merda.

Por exemplo, se o nome da peça tem 25 caracteres e termina com “A”, segundo a tabela ASCII, o valor decimal para “A” é 65, assim ao processar as peças do carro, na criação dele, o valor desta peça será guardado num offset baseado neste 65, sendo que o limite de espaço para guardar é 25 (para não confundir, este 25 não tem relação com o outro 25, foi coincidência).

Isto sobrescreve outras informações do carro por um valor que irá confundir o jogo, e causar bugs e crashes completamente estranhos que é praticamente impossível compreender ao ler as informações no crash log / crash dump. Ou seja, é o pior tipo de crash possível, aquele que é praticamente impossível compreender de onde o problema veio.

Um exemplo que poderia acontecer: o jogo vai tentar ler o valor do nitro do carro, mas terá um valor da peça do carro lá, o jogo irá se confundir e causar crash. Ou não, depende de muitos fatores, principalmente de qual era o final do nome da peça. E isto vale mesmo para bugs e crashes não relacionados com veículos.


Carros adaptados ao pisca-alerta do IVF têm este problema

Calma, não entre em pânico como eu entrei quando eu descobri isto.

Caso você esteja adaptando um carro ou moto para a função de pisca-alertas do IVF, e queira escolher a cor dele (acredite, é muito comum as pessoas escolherem a cor mas ainda usar laranja), o nome do dummy terá 25 caracteres, por exemplo “indicator_lr_prm9a0e00046”, que é um exemplo comum de uso de pisca alerta laranja. O “4” deixará de existir, enquanto o “6” causará o bug que falei logo acima.
Para não se confundir, o valor do caractere “6” na tabela ASCII é 54, não 6. Isto quer dizer que neste exemplo, que é o mais comum, irá sobrescrever o valor da velocidade de rotação da carroceria do carro balançando (aquela função do jogo que faz a carroceria do carro balançar mesmo parado). Não, isto não tem a ver com a carroceria balançando rápido em FPS alto.

Por que eu disse que não precisa se preocupar com este caso?
Antes de sair alertando do mundo sobre este problema, que está em literalmente centenas, senão milhares de mods de carros e motos para GTA SA (lembrando, isto é um problema do modelo, não importa se você está com IVF instalado ou não), eu fui atrás de compreender os possíveis problemas que isto pode causar, e tenho uma boa notícia: neste caso em específico, do IVF, não causa erro no jogo. Mas o problema que falei anteriormente ainda existe, só não no caso desta adaptação do IVF.

Eu verifiquei o problema considerando todas as possibilidades de valores ali. Aquilo é a cor em RGB hexadecimal, isto é, no lugar daquele 6 pode estar 0 até 9, ou “a” até “f”, ou “A” até “F”, e por sorte, em nenhum destes casos causa problema.

Por sorte, o overflow que este problema causa, tanto em carros quanto em motos, é sobrescrito logo em seguida pelo jogo. Mas pelo o que entendi, isto não vale para recarregar o modelo do carro no ModLoader enquanto o jogo está rodando com um carro daquele modelo. Muito menos caso existir algum mod que troca o modelo do carro por outro mas continuando o mesmo (não deve existir, e eu nem vejo motivos práticos pra isto). Nestes casos sim pode causar crash, mas num gameplay normal, não.

Se você estiver interessado, aqui as anotações técnicas enquanto eu testava o problema:
Clique para abrir
indicator_lr_prm9a0e00046

CAutomobile (m_aCarNodes 0x648 array of 25)
'6' = 54
54 * 4 = 216
0x648 + 216 = 0x720
0x720 = 0x70C (m_swingingChassis CDoor) + 0x14
CDoor + 0x14 = m_fAngVel
Reinitialized after? No
Used? Maybe
Bug? Maybe visual
When? First frames when swinging chassis starts to process
Tested? YES, no problem

Possible intervals for '6':
'0'~'9' (48~57):
216: 192~228
0x720: 0x708~0x72C

Start: 0x708 (m_panels[2].m_vecPos.z) (last 4 bytes of "m_panels CBouncingPanel")
Reinitialized after? YES, no problem

Full m_swingingChassis CDoor
Reinitialized after? Partially, not m_fAngle; m_fPrevAngle; m_fAngVel
Used? Maybe only reinitialized parts
Bug? Maybe not, or only visual
When? During swinging chassis
Tested? YES, no problem

End: 0x72C (m_wheelColPoint[0].point.x; m_wheelColPoint[0].point.y) (fist 8 bytes of "m_wheelColPoint CColPoint")
Reinitialized after? YES, no problem

'A'~'F': 65~70:
216: 260~280
0x720: 0x74C~0x760

In general: m_wheelColPoint CColPoint
Reinitialized after? YES, no problem

'a'~'f': 65~102:
216: 388~408
0x720: 0x7CC~0x7E0

In general: m_wheelColPoint CColPoint and wheelsDistancesToGround1
Reinitialized after? YES, no problem


CBike (m_apModelNodes 0x5A0 array of 10)
Possible intervals for '6':
'0'~'f' (48~102):
216: 192~228
0x720: 0x660~0x738

Start: m_anWheelColPoint CColPoint
Reinitialized after? Maybe
Used? Maybe not
Bug? Maybe not
When? Driving

In general, to end: field_710, field_720, field_730 (array 4 each); field_740
Reinitialized after? YES, no problem

There is no turnlights for CBoat and CPlane (dur), so no problems


Quando se preocupar?

Primeiramente, já que agora eu compreendo o problema, neste momento eu atualizei o VehFuncs (v2.0.6) que adiciona uma correção para este problema. Portanto com a versão v2.0.6 ou mais nova instalada no seu jogo, você não precisa se preocupar, todos os carros que têm este erro serão corrigidos automaticamente pelo VehFuncs.

Eu poderia adicionar a correção em outro mod, como MixSets, mas VehFuncs já é consagrado para quem instala e cria mods de carros, então esta correção combina estar nele.

Mas por curiosidade, inclusive porque muitíssimo provavelmente você já teve um bug ou crash causado por este problema (e que a Lista de Crash não te ajudou, pois identificar a origem de um problema como este é muito difícil, pra piorar, pode ser raro o crash aparecer), tenha em mente de que qualquer mod de veículo (seja carro, moto, avião, qualquer), mesmo não tendo nada a ver com IVF, é propenso à este erro, e como eu expliquei, depende de muitos fatores para um bug ou crash aparecer, mas o problema sempre estará lá, não importa o tipo de mod, seja carro HD, lowpoly, qualquer um pode ter este erro, e o VehFuncs adiciona funções pelo nome da peça, alguém pode exagerar e colocar um nome longo, tanto que tutorial de introdução de como adaptar carros para o VehFuncs, eu sempre deixei claro sobre este problema, e repeti ele em outras partes do tutorial (só que na época eu não tinha certeza se isto era grave).

Na Lista de Crash, durante testes de corrigir crashes no 90s AVP, o crash “0x004C53A6”, que é um crash mais comum deste problema, foi documentado como um crash que pode ser comum ou raro, acontecendo logo na primeira vez que o carro é criado, ou mesmo após todos os veículos do jogo sendo carregados e descarregados 60 vezes num stress test, documentado pelo Luiz Felipe. Isto sem contar o possível corrompimento que citei acima, que gera bugs e crashes indecifráveis. Portanto é algo muito inesperado.

E por ser fácil alguém cometer o erro durante a criação, e ao cometer, o veículo continua parecer funcionar normalmente, este problema é realmente comum. Não dizendo que a maioria dos mods de veículos para GTA SA têm isto, mas com certeza são muitas centenas, senão milhares!
Felizmente no caso da adaptação do IVF isto não causa problema, senão o número de carros e motos causando este erro seria, com certeza, milhares.

Como eu disse no início, eu inicialmente fiz isto principalmente para o GTA Brasil 0.2.5, e dos 170+ carros do GTA Brasil, 2 deles tinham este problema, isto mesmo que a nossa comunidade tenha experiência e cuidado no assunto.

Por exemplo, a van Rumpo tinha um node com 2 ou 3 letras acima do limite, e isto causou um offset 12600*4, isto é um número tão alto que o corrompimento não acontece no mesmo carro, mas sim em outros, e em alguns casos o valor cairá em outras regiões da memória do jogo, mesmo não relacionado com carros, causando bugs e crashes completamente estranhos e difíceis de serem entendidos.

Algo semelhante à isto era a causa daquele bug dos artefatos piscando na tela ao instalar mods pesados, já corrigido pelo SilentPatch, e que estava presente nativamente na versão mobile antes da v2.0 (sim, este bug existe desde o PS2, mas não visível devido ao baixo uso de memória, ficou notável no PC e mobile), e como vocês viram, demorou mais de 1 década para aquele bug ser identificado e corrigido, mesmo na versão mobile foi necessário a comunidade modder passar a solução pra eles (a War Drum Studios corrigiu após eu pedir para o Silent, que pediu pra eles, senão até hoje o bug estaria lá, no meu celular por exemplo era impossível jogar por causa daquele bug, mesmo sem instalar mod algum).

Inclusive, é comum modders colocarem o nome completo do carro em algum lugar dentro do .dff dele, às vezes o nome do carro junto com o nome de quem o criou, como créditos, às vezes o ano do carro, e até mesmo o site da pessoa, no lugar do nome da peça “raiz” (que por padrão o GTA SA usa para o nome do carro, mas não é utilizado pelo jogo), e isto é um dos exemplos de ser muito comum ultrapassar os limites, veja: “Bugatti Veyron by Fulano3D” e “Lamborghini Murcielago ’05” têm 26 caracteres. Se alguém decidiu colocar o nome “limpador para-brisa frontal” no limpador de para-brisa, já são 27 caracteres (ou algo assim, se você estiver lendo isto traduzido em outro idioma), e 27 caracteres já é capaz de fazer um estrago muito inesperado no seu jogo.




No momento este site está parado (motivos aqui) portanto não estamos mais moderando e aceitando comentários.

Prefira usar o nosso Discord, fórum, Facebook ou Youtube.

0 Comentários
Inline Feedbacks
View all comments