GTA Builder Форум

GTA Vice City => Общие вопросы => Тема начата: Saint от Сентябрь 05, 2020, 03:32:15 pm

Название: Лимиты Игры
Отправлено: Saint от Сентябрь 05, 2020, 03:32:15 pm
все наверняка знаю такую программу как VC Limit Adjuster от Steve-M и её более новую версию, а так же есть 2 плагина.
1й - это от ThirteenAG и 2й от fastman92 (более продвинутый) но последнии версии этих плагинов не работают на XP

вообщем дело не в этом.

Меня интересует 3 лимита.

1 - это лимит TXD
2 - это лимит ID
3 - лимит модей транспорта которые могут быть созданны в игре одновременно (он равен примерно 50, если создать больше игра зависает)

вообщем программой VC Limit Adjuster я пропатчил exe на первые 2 лимита, нашел все адресса которые программа поменяла значения,

лимит TXD меняет 9 адрессов
лимит ID меня значения в 150 адрессах

сделал вот такую функцию

Код: C++
  1. void ReCreateGameTXDLimit()
  2. {//------------------------------------------------------------------------------------------------------------------------
  3. /*     
  4.         // TXD Limit
  5.  
  6.         TXD Numbers - multiple instances (3160 bytes)
  7.  
  8.         Maximum number of TXDs allowed in gta3.img.
  9.         When VC loads TXD objects, it assigns ID numbers to them just above the rangeused for map objects.
  10.         Valid values range from the game default of 1385 to 32700.
  11. */
  12.         //---------------------------------------------------------------------------------------------------------------------
  13.  
  14.         DWORD dwNewLimit = 5000;
  15.  
  16.        
  17.         // .text:0041065D 81 FB 69 05 00 00                       cmp     ebx, 569h
  18.         CMemory::InstallPatch<DWORD>( 0x41065D+2 , dwNewLimit);
  19.  
  20.         // .text:00580FD4 81 FB 69 05 00 00                       cmp     ebx, 569h
  21.         CMemory::InstallPatch<DWORD>( 0x580FD4+2 , dwNewLimit);
  22.  
  23.         // .text:0058102C 68 69 05 00 00                          push    569h
  24.         CMemory::InstallPatch<DWORD>( 0x58102C+1 , dwNewLimit);
  25.  
  26.         // .text:0061D98B 68 69 05 00 00                          push    569h
  27.         CMemory::InstallPatch<DWORD>( 0x61D98B+1 , dwNewLimit);
  28.  
  29.         // .text:0061D9E5 68 69 05 00 00                          push    569h
  30.         CMemory::InstallPatch<DWORD>( 0x61D9E5+1 , dwNewLimit);
  31.  
  32.         // .text:0061DAA5 68 69 05 00 00                          push    1385
  33.         CMemory::InstallPatch<DWORD>( 0x61DAA5+1 , dwNewLimit);
  34.  
  35.         // .text:0061DBA5 68 69 05 00 00                          push    569h
  36.         CMemory::InstallPatch<DWORD>( 0x61DBA5+1 , dwNewLimit);
  37.  
  38.         // .text:0061DCFA 81 FB 69 05 00 00                       cmp     ebx, 569h
  39.         CMemory::InstallPatch<DWORD>( 0x61DCFA+2 , dwNewLimit);
  40.  
  41.         // .text:0061DD39 68 69 05 00 00                          push    569h
  42.         CMemory::InstallPatch<DWORD>( 0x61DD39+1 , dwNewLimit);
  43.  
  44.         // end
  45.  
  46. }//------------------------------------------------------------------------------------------------------------------------
  47.  

но при загрузке игры происходит краш

Название: Re: Лимиты Игры
Отправлено: xanser от Сентябрь 06, 2020, 09:18:30 am
лимит TXD меняет 9 адрессов

Недостаточно менять 1385 на другое число 9 раз. Если ты посмотришь псевдокод (F5), что происходит по первому адресу 0x41065D, то увидишь еще и массив 0x94DDD0 CStreaming::ms_aInfoForModel, в нем 1385 раз присваивается m_nLoadState = 1. Увеличивая лимит, ты в цикле заставляешь массив вылезти за свои пределы и переписать другие существующие адреса после его окончания 0x974AFC. Это решаемо переопределением выделенной под массив памяти в другом месте, уже не в адресе 0x94DDD0, и переопределением всех ссылок в коде на этот массив на твой новый адрес (ниже покажу как), если ссылок не так много, но конкретно на этот массив ссылок огромная куча, достаточно нажать на нем X, ну штук 400, хочешь их все переписывать? Не знаю, как лимитаджустеры с этим справляются, я не уверен, что они вообще увеличивают лимит txd, у меня не увеличивают. Мне кажется, проще уложиться в 1385, укрупнив txd, но тебе видимо надо объединить несколько карт.
Код: C++
  1. //0x41065D
  2. do
  3.   {
  4.     v25 = *(_DWORD *)(CTxdStore::ms_pTxdPool + 4);
  5.     if ( *(_BYTE *)(v25 + v23) & 0x80 )
  6.       v26 = 0;
  7.     else
  8.       v26 = v22 + *(_DWORD *)CTxdStore::ms_pTxdPool;
  9.     if ( v26 )
  10.     {
  11.       v27 = (_DWORD *)(*(_BYTE *)(v25 + v23) & 0x80 ? 0 : v22 + *(_DWORD *)CTxdStore::ms_pTxdPool);
  12.       if ( *v27 )
  13.         CStreaming::ms_aInfoForModel[v24 + 6500].m_nLoadState = 1;        // v24 индекс массива, 1385 раз между адресами 0x94DDD0 и 0x974AFC, если увеличить 1385, то 0x974AFC съедет дальше
  14.     }
  15.     ++v23;
  16.     v22 += 28;
  17.     ++v24;        // 1385 раз вместе с v23
  18.   }
  19.   while ( v23 < 1385 );        // увеличение v23 повлияет на увеличение v24, что приведет к смещению адресов за пределы стандартного массива 0x94DDD0
лимит ID меня значения в 150 адрессах

О чем я выше и писал, огромная куча адресов и массивов, расширить это все сложно. Я пробовал это делать и с лимитом id http://forum.gtabuilder.ru/index.php?topic=407.msg2918#msg2918 (http://forum.gtabuilder.ru/index.php?topic=407.msg2918#msg2918) и с лимитом оружия http://forum.gtabuilder.ru/index.php?topic=395.msg2738#msg2738 (http://forum.gtabuilder.ru/index.php?topic=395.msg2738#msg2738), но понимаю, что до конца все проверить в такой куче я не смогу.

3 - лимит модей транспорта которые могут быть созданны в игре одновременно (он равен примерно 50, если создать больше игра зависает)

Тут мне кажется, можно создать до 110, поскольку это размер пула машин CPools::pVehiclePool->size http://forum.gtabuilder.ru/index.php?topic=280.msg1855#msg1855 (http://forum.gtabuilder.ru/index.php?topic=280.msg1855#msg1855). У меня получалось вручную создать где-то 87 машин (+3 летающих самолета уже были, они в начале пула). Дальше начинаются проблемы, но больше с рендером, машины начинают пропадать, сам игрок не дорисовывается. Вылет происходит не в момент очередного создания, а после, как будто не хватает памяти на сами модели. Столько же однотипных машин можно создать парковкой, если создавать все модели разными, то прорисуется не больше 20. Те 80 штук, что припаркованы на картинке, тоже не всегда в порядке, если поставить id более тяжелых моделей, то их рендер будет страдать, а дальше возможен вылет. Но само создание работает.

(https://i.postimg.cc/Yq02dXxH/scr_20200905175526922.jpg) (https://i.postimg.cc/nVswTBQW/scr_20200905165507172.jpg) (https://i.postimg.cc/ZY1sQn85/scr_20200905170939994.jpg)

Тут приведу пример, как расширить парковку и сделать ее более плотной. В отличие от вышеперечисленных лимитов это получается, потому что ссылок на массив не так много, и можно все переопределить. Лимит припаркованных машин на карте 185, увеличивается до размера DWORD. Также есть лимит видимых одновременно машин 10, увеличивается до 127, размер unsigned char. Плотность рядомстоящих машин зависит от диаметра col-а, а он зависит от длины машины. Это сделано для того, чтобы угол рядомстоящих машин был любым, например перпендикулярным, и они не втыкались друг в друга. Можно заменить на ширину авто, и тогда машины встанут ближе друг к другу, это будет красиво в случае параллельной парковки, но теряется универсальность при других углах, тут уже контроль углов со стороны разработчика карты, чтобы не было наслоений. Как видно из кода, увеличение самого лимита занимает не так много строк, как переопределение массивов этого размера, в чем вся и проблема увеличения для лимитов.

Код: C++
  1. class CCarGenerator {
  2. public:
  3.         DWORD id;
  4.         CVector pos;
  5.         DWORD angle;
  6.         WORD  color1;
  7.         WORD  color2;
  8.         BYTE  alarm;
  9.         BYTE  doorLock;
  10.         BYTE  field_1A;
  11.         BYTE  field_1B;
  12.         WORD  field_1C;
  13.         WORD  field_1E;
  14.         DWORD time;
  15.         DWORD ProcessedVehicleHandle;
  16.         WORD  field_28;
  17.         BYTE  field_2A;
  18.         BYTE  field_2B;
  19. };
  20.  
  21. DWORD CFG_ParkedLimit = 185;    // 65535?
  22. DWORD CFG_ParkedInView = 10;    // 127
  23. bool CFG_ParkedClosely = false; // true
  24.  
  25. static void SetCarGeneratorLimit() {
  26.        
  27.         CarGenerator = new CCarGenerator[CFG_ParkedLimit];      //создание нового массива парковки вместо стандартного 0xA0DC94
  28.  
  29.         Patch(0x4537A9, (DWORD)CarGenerator);           // переопределение всех ссылок на массив
  30.         Patch(0x5A6C5F, (DWORD)CarGenerator);
  31.         Patch(0x5A6CC3, (DWORD)CarGenerator);
  32.         Patch(0x5A69DB, (DWORD)CarGenerator);
  33.         Patch(0x5A6B16, (DWORD)CarGenerator);
  34.         Patch(0x5A69E6, (DWORD)&CarGenerator->pos.x);
  35.         Patch(0x5A6B22, (DWORD)&CarGenerator->pos.x);
  36.         Patch(0x5A69F1, (DWORD)&CarGenerator->pos.y);
  37.         Patch(0x5A6B2A, (DWORD)&CarGenerator->pos.y);
  38.         Patch(0x5A69FC, (DWORD)&CarGenerator->pos.z);
  39.         Patch(0x5A6B35, (DWORD)&CarGenerator->pos.z);
  40.         Patch(0x5A6A07, (DWORD)&CarGenerator->angle);
  41.         Patch(0x5A6B40, (DWORD)&CarGenerator->angle);
  42.         Patch(0x5A6A14, (DWORD)&CarGenerator->color1);
  43.         Patch(0x5A6B4C, (DWORD)&CarGenerator->color1);
  44.         Patch(0x5A6A21, (DWORD)&CarGenerator->color2);
  45.         Patch(0x5A6B5C, (DWORD)&CarGenerator->color2);
  46.         Patch(0x5A6A2A, (DWORD)&CarGenerator->alarm);
  47.         Patch(0x5A6B65, (DWORD)&CarGenerator->alarm);
  48.         Patch(0x5A6A33, (DWORD)&CarGenerator->doorLock);
  49.         Patch(0x5A6B6E, (DWORD)&CarGenerator->doorLock);
  50.         Patch(0x5A6A3C, (DWORD)&CarGenerator->field_1A);
  51.         Patch(0x5A6B77, (DWORD)&CarGenerator->field_1A);
  52.         Patch(0x5A6A49, (DWORD)&CarGenerator->field_1C);
  53.         Patch(0x5A6B85, (DWORD)&CarGenerator->field_1C);
  54.         Patch(0x5A6A56, (DWORD)&CarGenerator->field_1E);
  55.         Patch(0x5A6B95, (DWORD)&CarGenerator->field_1E);
  56.         Patch(0x5A6A61, (DWORD)&CarGenerator->time);
  57.         Patch(0x5A6BA1, (DWORD)&CarGenerator->time);
  58.         Patch(0x5A6A6C, (DWORD)&CarGenerator->ProcessedVehicleHandle);
  59.         Patch(0x5A6BAC, (DWORD)&CarGenerator->ProcessedVehicleHandle);
  60.         Patch(0x5A6A79, (DWORD)&CarGenerator->field_28);
  61.         Patch(0x5A6BB8, (DWORD)&CarGenerator->field_28);
  62.         Patch(0x5A6A85, (DWORD)&CarGenerator->field_2A);
  63.         Patch(0x5A6BC1, (DWORD)&CarGenerator->field_2A);
  64.  
  65.         Patch(0x5A6C16, (DWORD)CFG_ParkedLimit);        // лимит припаркованных машин на карте, до 65535?
  66.  
  67.         Patch(0x5A71D0, (BYTE)CFG_ParkedInView);        // лимит одновременно видимых припаркованных машин, до 127
  68.  
  69.         if (CFG_ParkedClosely)
  70.                 Patch(0x5A6FE2, (BYTE)0);               // замена проверки диаметра col-а (длины машины) на ширину машины, чтобы парковалось ближе
  71. }
Название: Re: Лимиты Игры
Отправлено: Saint от Сентябрь 06, 2020, 01:24:19 pm
cпасибо за ответ, я примерно так и думал

Тут мне кажется, можно создать до 110, поскольку это размер пула машин CPools::pVehiclePool->size

размер пула я увеличил и могу создать хоть 500 машин (тестил до 250) но только одной модели или разных моделей до 50 штук

так же есть ещё такая особенноть если прямо во  время игры создать больше 180 ТС то начинает пропадать звуки у авто

в вайсе модели авто начинаются с 130 до 236 получаем что всего 106 моделей транспортных средств. вообщем создать одновременно можно любые 50 из этих 106

если же превысить этот лимит в 50 моделей ТС игра вылетает с ошибкой Exception At Address: 0x00541109 // превышение лимита моделей авто = 50

в лагине от ThirteenAG есть лимит повышения VehicleModels я думал что это как раз то, что мне нужно, но нет там это лимит моделей для IDE файлов, короче сколько мы можем прописывать моделей в ide

так же чем больше мы увеличаем лимиты, и создаём в игре всего, необходимо увеличивать и StreamMemory
Название: Re: Лимиты Игры
Отправлено: daniel_360 от Май 27, 2021, 10:58:58 pm
Есть ли возможность, как-то взломать лимит на добавление новых txd и dff файлов в gta3.img?
Название: Re: Лимиты Игры
Отправлено: Shagg_E от Май 28, 2021, 05:25:50 pm
Есть ли возможность, как-то взломать лимит на добавление новых txd и dff файлов в gta3.img?
Этот вопрос неоднократно поднимался на различных ресурсах, и пока все приходили к выводу, что игра не стоит свеч. Слишком много всего нужно будет патчить....
Название: Re: Лимиты Игры
Отправлено: Sektor от Май 29, 2021, 01:29:41 am
Есть ли возможность, как-то взломать лимит на добавление новых txd и dff файлов в gta3.img?

Я раньше делал давно иначе. Просто сделал хук на RWG (графическую обложку) и сколько угодно мог грузить TXD, DFF и прям напрямую с каталога. Так что вам в сторону Hook смотреть.
Название: Re: Лимиты Игры
Отправлено: daniel_360 от Август 02, 2021, 06:35:37 pm
Вышла новая версия Open Limit Adjuster v1.5.8, в ней можно увеличить лимит на создание txd файлов!!! https://github.com/ThirteenAG/III.VC.SA.LimitAdjuster/releases/tag/v1.5.8
Название: Re: Лимиты Игры
Отправлено: xanser от Август 03, 2023, 03:56:26 pm
Меня интересует 3 лимита.

1 - это лимит TXD
2 - это лимит ID
3 - лимит модей транспорта которые могут быть созданны в игре одновременно (он равен примерно 50, если создать больше игра зависает)
Если еще актуально, то здесь (https://forum.gtabuilder.ru/index.php?topic=117.msg4312#msg4312) у меня получилось увеличить лимит одновременных машин до полного списка. Только мне кажется, выше речь шла не о 50, а о 25 разных машинах в списке. Так по крайней мере показывают тесты.
Название: Re: Лимиты Игры
Отправлено: Saint от Декабрь 17, 2023, 08:00:03 pm
xanser, спасибо
Название: Re: Лимиты Игры
Отправлено: PowerBlack от Февраль 12, 2024, 01:58:30 pm
Есть ли возможность, как-то взломать лимит на добавление новых txd и dff файлов в gta3.img?

Я раньше делал давно иначе. Просто сделал хук на RWG (графическую обложку) и сколько угодно мог грузить TXD, DFF и прям напрямую с каталога. Так что вам в сторону Hook смотреть.

О, я тоже в основном в этом плане через хук работал.

https://vipzerkalo.site (https://vipzerkalo.site/) https://zerkalozerkalo.site (https://zerkalozerkalo.site/) https://zerkalo1xbet.site (https://zerkalo1xbet.site/)