Автор Тема: Лимиты Игры  (Прочитано 1084 раз)

Оффлайн Saint

  • Прохожий
  • *
  • Сообщений: 81
  • Репутация: +1/-0
  • Saint Games
    • saint36rus
    • Просмотр профиля
Лимиты Игры
« : Сентябрь 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.  

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


Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 592
  • Репутация: +89/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Лимиты Игры
« Ответ #1 : Сентябрь 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=395.msg2738#msg2738, но понимаю, что до конца все проверить в такой куче я не смогу.

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

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



Тут приведу пример, как расширить парковку и сделать ее более плотной. В отличие от вышеперечисленных лимитов это получается, потому что ссылок на массив не так много, и можно все переопределить. Лимит припаркованных машин на карте 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. }
« Последнее редактирование: Сентябрь 06, 2020, 09:36:27 am от xanser »

Оффлайн Saint

  • Прохожий
  • *
  • Сообщений: 81
  • Репутация: +1/-0
  • Saint Games
    • saint36rus
    • Просмотр профиля
Re: Лимиты Игры
« Ответ #2 : Сентябрь 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
« Последнее редактирование: Сентябрь 06, 2020, 01:45:20 pm от Saint »

Оффлайн daniel_360

  • Прохожий
  • *
  • Сообщений: 100
  • Репутация: +4/-0
    • daniel360465
    • Просмотр профиля
Re: Лимиты Игры
« Ответ #3 : Май 27, 2021, 10:58:58 pm »
Есть ли возможность, как-то взломать лимит на добавление новых txd и dff файлов в gta3.img?

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 692
  • Репутация: +22/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Лимиты Игры
« Ответ #4 : Май 28, 2021, 05:25:50 pm »
Есть ли возможность, как-то взломать лимит на добавление новых txd и dff файлов в gta3.img?
Этот вопрос неоднократно поднимался на различных ресурсах, и пока все приходили к выводу, что игра не стоит свеч. Слишком много всего нужно будет патчить....

Оффлайн Sektor

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 520
  • Репутация: +34/-0
    • Просмотр профиля
Re: Лимиты Игры
« Ответ #5 : Май 29, 2021, 01:29:41 am »
Есть ли возможность, как-то взломать лимит на добавление новых txd и dff файлов в gta3.img?

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

Оффлайн daniel_360

  • Прохожий
  • *
  • Сообщений: 100
  • Репутация: +4/-0
    • daniel360465
    • Просмотр профиля
Re: Лимиты Игры
« Ответ #6 : Август 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