лимит TXD меняет 9 адрессов
Недостаточно менять 1385 на другое число 9 раз. Если ты посмотришь псевдокод (
F5), что происходит по первому адресу
0x41065D, то увидишь еще и массив
0x94DDD0 CStreaming::ms_aInfoForModel, в нем 1385 раз присваивается
m_nLoadState = 1. Увеличивая лимит, ты в цикле заставляешь массив вылезти за свои пределы и переписать другие существующие адреса после его окончания
0x974AFC. Это решаемо переопределением выделенной под массив памяти в другом месте, уже не в адресе
0x94DDD0, и переопределением всех ссылок в коде на этот массив на твой новый адрес (ниже покажу как), если ссылок не так много, но конкретно на этот массив ссылок огромная куча, достаточно нажать на нем
X, ну штук 400, хочешь их все переписывать? Не знаю, как лимитаджустеры с этим справляются, я не уверен, что они вообще увеличивают лимит txd, у меня не увеличивают. Мне кажется, проще уложиться в 1385, укрупнив txd, но тебе видимо надо объединить несколько карт.
//0x41065D
do
{
v25 = *(_DWORD *)(CTxdStore::ms_pTxdPool + 4);
if ( *(_BYTE *)(v25 + v23) & 0x80 )
v26 = 0;
else
v26 = v22 + *(_DWORD *)CTxdStore::ms_pTxdPool;
if ( v26 )
{
v27 = (_DWORD *)(*(_BYTE *)(v25 + v23) & 0x80 ? 0 : v22 + *(_DWORD *)CTxdStore::ms_pTxdPool);
if ( *v27 )
CStreaming::ms_aInfoForModel[v24 + 6500].m_nLoadState = 1; // v24 индекс массива, 1385 раз между адресами 0x94DDD0 и 0x974AFC, если увеличить 1385, то 0x974AFC съедет дальше
}
++v23;
v22 += 28;
++v24; // 1385 раз вместе с v23
}
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-а, а он зависит от длины машины. Это сделано для того, чтобы угол рядомстоящих машин был любым, например перпендикулярным, и они не втыкались друг в друга. Можно заменить на ширину авто, и тогда машины встанут ближе друг к другу, это будет красиво в случае параллельной парковки, но теряется универсальность при других углах, тут уже контроль углов со стороны разработчика карты, чтобы не было наслоений. Как видно из кода, увеличение самого лимита занимает не так много строк, как переопределение массивов этого размера, в чем вся и проблема увеличения для лимитов.
class CCarGenerator {
public:
DWORD id;
CVector pos;
DWORD angle;
WORD color1;
WORD color2;
BYTE alarm;
BYTE doorLock;
BYTE field_1A;
BYTE field_1B;
WORD field_1C;
WORD field_1E;
DWORD time;
DWORD ProcessedVehicleHandle;
WORD field_28;
BYTE field_2A;
BYTE field_2B;
};
DWORD CFG_ParkedLimit = 185; // 65535?
DWORD CFG_ParkedInView = 10; // 127
bool CFG_ParkedClosely = false; // true
static void SetCarGeneratorLimit() {
CarGenerator = new CCarGenerator[CFG_ParkedLimit]; //создание нового массива парковки вместо стандартного 0xA0DC94
Patch(0x4537A9, (DWORD)CarGenerator); // переопределение всех ссылок на массив
Patch(0x5A6C5F, (DWORD)CarGenerator);
Patch(0x5A6CC3, (DWORD)CarGenerator);
Patch(0x5A69DB, (DWORD)CarGenerator);
Patch(0x5A6B16, (DWORD)CarGenerator);
Patch(0x5A69E6, (DWORD)&CarGenerator->pos.x);
Patch(0x5A6B22, (DWORD)&CarGenerator->pos.x);
Patch(0x5A69F1, (DWORD)&CarGenerator->pos.y);
Patch(0x5A6B2A, (DWORD)&CarGenerator->pos.y);
Patch(0x5A69FC, (DWORD)&CarGenerator->pos.z);
Patch(0x5A6B35, (DWORD)&CarGenerator->pos.z);
Patch(0x5A6A07, (DWORD)&CarGenerator->angle);
Patch(0x5A6B40, (DWORD)&CarGenerator->angle);
Patch(0x5A6A14, (DWORD)&CarGenerator->color1);
Patch(0x5A6B4C, (DWORD)&CarGenerator->color1);
Patch(0x5A6A21, (DWORD)&CarGenerator->color2);
Patch(0x5A6B5C, (DWORD)&CarGenerator->color2);
Patch(0x5A6A2A, (DWORD)&CarGenerator->alarm);
Patch(0x5A6B65, (DWORD)&CarGenerator->alarm);
Patch(0x5A6A33, (DWORD)&CarGenerator->doorLock);
Patch(0x5A6B6E, (DWORD)&CarGenerator->doorLock);
Patch(0x5A6A3C, (DWORD)&CarGenerator->field_1A);
Patch(0x5A6B77, (DWORD)&CarGenerator->field_1A);
Patch(0x5A6A49, (DWORD)&CarGenerator->field_1C);
Patch(0x5A6B85, (DWORD)&CarGenerator->field_1C);
Patch(0x5A6A56, (DWORD)&CarGenerator->field_1E);
Patch(0x5A6B95, (DWORD)&CarGenerator->field_1E);
Patch(0x5A6A61, (DWORD)&CarGenerator->time);
Patch(0x5A6BA1, (DWORD)&CarGenerator->time);
Patch(0x5A6A6C, (DWORD)&CarGenerator->ProcessedVehicleHandle);
Patch(0x5A6BAC, (DWORD)&CarGenerator->ProcessedVehicleHandle);
Patch(0x5A6A79, (DWORD)&CarGenerator->field_28);
Patch(0x5A6BB8, (DWORD)&CarGenerator->field_28);
Patch(0x5A6A85, (DWORD)&CarGenerator->field_2A);
Patch(0x5A6BC1, (DWORD)&CarGenerator->field_2A);
Patch(0x5A6C16, (DWORD)CFG_ParkedLimit); // лимит припаркованных машин на карте, до 65535?
Patch(0x5A71D0, (BYTE)CFG_ParkedInView); // лимит одновременно видимых припаркованных машин, до 127
if (CFG_ParkedClosely)
Patch(0x5A6FE2, (BYTE)0); // замена проверки диаметра col-а (длины машины) на ширину машины, чтобы парковалось ближе
}