Последние сообщения

Страницы: [1] 2 3 ... 10
1
05DF: write_memory 0x69A1D8 size 4 value 150.0 virtual_protect 1 // LOD людей и машин(70.0 default)
05DF: write_memory 0x687138 size 4 value 150.0 virtual_protect 1 // Удаляет транспорт, когда игрок повёрнут спиной к машине(40.0 default)
05DF: write_memory 0x6871F8 size 4 value 150.0 virtual_protect 1 // Удаляет транспорт, в зоне видимости игрока(120.0 default)
05DF: write_memory 0x687200 size 4 value 150.0 virtual_protect 1 // Удаляет транспорт, когда игрок смотрит под ноги(70.0 default)
Тогда не обратил внимание, но сейчас заметил: с этими адресами есть нюанс. Если у всех выставить одинаковое значение - могут возникать ситуации, когда транспорт будет появляться и сразу же исчезать, так что лучше, чтобы первое значение было меньше остальных. Т.е. либо его уменьшить, либо остальные увеличить (хотя бы на 10 юнитов, но разница быть должна).
2
Скриптинг / Дистанция прорисовки короны и другое
« Последний ответ от aleks926820 Сентябрь 11, 2020, 05:01:35 pm »
Тут человек один интересуется (DMITRY_R) некоторыми вопросами касательно San Andreas, но не может зарегистрироваться на форуме.
Попросил за меня создать тему.
"
Доброго времени суток.

Первая задача такова, нужно увеличить дистанцию рендринга короны созданной опкодом  04D5.
Я уверен что существует какой-то адрес памяти хранящий значение дальности.

И вторая, есть адрес памяти 0xBA6797 который отвечает за громкость звуков в игре, со значениями от 0 до 64, но соль в том что он меняет значение громкости звука только в меню, а по факту в игре звук не меняется.
"
3
Общие вопросы / Re: Как удалять (редактировать) объекты карты
« Последний ответ от Saint Сентябрь 06, 2020, 11:36:29 pm »
Видимо кишки опкода не дают тебе заменять столбы и шлагбаумы, поэтому весь код тебе не нужен, а только функция CEntity::ReplaceWithNewModel(). Во вложении пример замены столбов на светофоры при их первом появлении. Кстати кроме объекта ты можешь там же поменять и его координаты. Заметил, что свойства нового объекта остаются теми же, что были у старого. А как удалять объект полностью с карты, я не знаю.

хорошо, спасибо
4
Общие вопросы / Re: Как удалять (редактировать) объекты карты
« Последний ответ от xanser Сентябрь 06, 2020, 06:46:10 pm »
Видимо кишки опкода не дают тебе заменять столбы и шлагбаумы, поэтому весь код тебе не нужен, а только функция CEntity::ReplaceWithNewModel(). Во вложении пример замены столбов на светофоры при их первом появлении. Кстати кроме объекта ты можешь там же поменять и его координаты. Заметил, что свойства нового объекта остаются теми же, что были у старого. А как удалять объект полностью с карты, я не знаю.
5
Общие вопросы / Re: Как удалять (редактировать) объекты карты
« Последний ответ от Saint Сентябрь 06, 2020, 01:38:51 pm »
спасибо за ответ, но всё же

в опкоде по замене моделей перед его вызовом я просто занупил  вызов
.text:0045A0D0 E8 BB EC FF FF                          call    CTheScripts::AddToBuildingSwapArray(CBuilding *,int,int)
и тем самым у меня получилось менять на карте более 25 объектов

но как я говорил выше мне нужно не замена, а именно удаление, т.к. опкод не может менять ломающиеся объекты типо фонарных столбов и т.д.

можешь пожалуйста привести пример как удалить допустим так называемый шлагбаум на военной базе?

379, smashbar, 0, -1721.86, -293.002, 15.1086, 1, 1, 1, -0.707107, -0.707107, 4.4827E-8, 4.4827E-8

может конечно то что нельзя подменять ломающиеся объекты както задаётся в этих функциях

.text:00459F28 E8 43 C8 07 00                          call    CWorld::FindObjectsOfTypeInRange(uint,CVector  const&,float,bool,short *,short,CEntity **,bool,bool,bool,bool,bool)
.text:00459F88 E8 13 C7 07 00                          call    CWorld::FindObjectsOfTypeInRangeSectorList(uint,CPtrList &,CVector  const&,float,bool,short *,short,CEntity **)
.text:0045A02F E8 6C C6 07 00                          call    CWorld::FindObjectsOfTypeInRangeSectorList(uint,CPtrList &,CVector  const&,float,bool,short *,short,CEntity **)

если я правильно понимаю то CEntity ** это как раз для получения указателя на найденный объект карты?
6
Общие вопросы / 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
7
Общие вопросы / Re: Как удалять (редактировать) объекты карты
« Последний ответ от xanser Сентябрь 06, 2020, 12:01:31 pm »
0363 не вижу смысла переписывать, это просто отключение видимости, можно этого достичь просто Entity->SetRwObjectAlpha(0);
03B6 действительно меняет объект полностью вместе с колом. Если взять саму суть опкода, то она заключается всего в двух функциях, применяемых к объекту карты. Как перебрать все объекты и получить нужный Entity по id, я писал выше. Ну и как уже говорилось, массив таких сменяемых объектов всего 25 штук, нужно его переопределять, менять во всем коде ссылки на него.

Код: C++
  1. void CEntity::ReplaceWithNewModel(int id) {
  2.         ((void(__thiscall *)(CEntity *, int))0x407DB0)(this, id);
  3. };
  4. void CTheScripts::AddToBuildingSwapArray(CEntity entity, int old_id, int new_id) {
  5.         ((void(__cdecl *)(CEntity, int, int))0x458D90)(entity, old_id, new_id);
  6. }
  7.  
  8. Entity->ReplaceWithNewModel(new_id);
  9. CTheScripts::AddToBuildingSwapArray(*Entity, old_id, new_id);
8
Общие вопросы / 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=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. }
9
Общие вопросы / Лимиты Игры
« Последний ответ от 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.  

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

10
Общие вопросы / Re: Как удалять (редактировать) объекты карты
« Последний ответ от Saint Сентябрь 05, 2020, 03:22:57 pm »
может кто помочь переписать опкоды 0363 и 03B6 в нормальный код?

хочется всё таки норм удалять объекты, а не подменять их, так как тем же опкодом 03B6 нельзя заменять объекты карты которые игрок может разрушить.
Страницы: [1] 2 3 ... 10