Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - xanser

Страницы: [1] 2 3 ... 40
1
По эскалатору, если занупить эти функции 0x54FBF8 и 0x54F442, то можно 584, Esc_step удалить.
daniel_360, посмотри подобные видео, там разбор неиспользуемых объектов (с 4 минуты)

https://www.youtube.com/watch?v=EywIGW_46OY&ab_channel=VadimM

2
Недавно разбирался с таким списком, вылет на трех звездах. Стоит добавить в минимальный набор еще полицейские шипы и дорожные заграждения:
354, roadworkbarrier1, barrier, 1, 62, 128
521, plc_stinger, plc_stinger, 1, 100, 128

Насчет 508, keycard не уверен, что нужна.
Отключение эскалаторов 584, Esc_step здесь 0x54F442, не думаю, что они кому-то нужны в этом месте карты.

Еще раз уточнение - id не важны, игра использует названия и регистр букв (Money), поэтому минимальный набор можно смело начинать с 300 по порядку.

3
В стандартной игре не используются например эти flatbedbak.txd, ak47.dff, ak47.txd, загрузочные экраны папки txd. Полный список мне не попадался, но думаю, он небольшой. Все зависит от мода, нужна ли там карта и миссии. Удалить можно все, что угодно, смотря что ты хочешь при этом потерять. Без миссий можно удалить катсценных персонажей, без карты можно сократить generic и вычистить папку maps. Для тех, кому интересно, прикрепляю сюда список из generic, который используется помимо карты еще и в exe, с этими надо поаккуратнее.

4
Попробуй отсюда 0x5A937F CCrane::Update

5
Интересная модификация с кучей всего, вот решил покопаться. В папке с игрой можно обнаружить множество asi-файлов. Из названий можно понять, для чего они нужны. Например _noDEP.asi избавляет от необходимости добавлять исполняемый файл в список исключений DEP. Код выглядит примерно так:

Код: C++
  1. static void DisableDEP() {
  2.         FARPROC _f = GetProcAddress(GetModuleHandleA("kernel32.dll"), "SetProcessDEPPolicy");
  3.         if (_f)
  4.                 ((void(__stdcall *)(FARPROC))_f)(0);
  5. }

Эти асишки видимо исправляют проблемы в указанных адресах 0x541109.asi, 0x582739.asi, 0x640D0B.asi, 0x6616B7.asi, сталкивался с третьим точно, возможно с четвертым.
Непонятно, откуда эти фиксы взялись, информацию по ним я не нашел. Хотелось бы понять, что они конкретно делают, и почему именно так.

6
Забавный адрес 0x69207C, если поставить значение побольше, например 9999.0, то ущерб от падения с высоты усилится. Можно убиться метров с десяти. Кроме реалистичности особой пользы от этого нет, если только усложнить себе жизнь при прохождении, зато весело сталкивать других. Первоначальное значение тоже расшибает пешехода примерно с высоты 50 метров, есть небольшая рандомность. С вертолета разбиться скорее всего не получится, там анимация не та, но ее можно принудительно переключить на свободное падение, тогда получится. Во вложении плагин с этим адресом побаловаться.

7
О сайте и форумах / Re: 2021
« : Январь 01, 2021, 10:36:22 am »
В конце концов все будет хорошо. Если еще не хорошо, значит нам еще не конец  :D

8
Видимо кишки опкода не дают тебе заменять столбы и шлагбаумы, поэтому весь код тебе не нужен, а только функция CEntity::ReplaceWithNewModel(). Во вложении пример замены столбов на светофоры при их первом появлении. Кстати кроме объекта ты можешь там же поменять и его координаты. Заметил, что свойства нового объекта остаются теми же, что были у старого. А как удалять объект полностью с карты, я не знаю.

9
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);

10
Общие вопросы / Re: Лимиты Игры
« : Сентябрь 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. }

11
Решил я наделать скинов для своего персонажа. Можно всех посмотреть здесь https://cloud.mail.ru/public/2sRc/2JTQm9rX7.
Каждый скин обладает своими способностями или даже сверх-способностями. Если по-быстрому, проверить скин можно так:

Код: C++
  1. class CBaseModelInfo {
  2. public:
  3.         /*0x000*/       DWORD           vtable;
  4.         /*0x004*/       char            name[21];
  5.         /*0x019*/       char            _019[0x02C - 0x019];
  6.         /*0x02C*/
  7. };
  8. auto ModelInfo = (CBaseModelInfo **)0x92D4C8;
  9. if (!_strcmpi(ModelInfo[0]->name, "player6")) {}

Например, этот персонаж приобретает аццкое бессмертие по ночам и бронебойность своего транспорта.



А кто помнит этого персонажа по фильму, просто сделать бессмертие ему неинтересно. Хорошо бы, чтобы он подыхал как обычно, но без текста "Потрачено", а спустя несколько секунд оживал. В каких-то модах эта способность была бы интересной. Пока терпения не хватило до конца разобраться, как правильно остановить процесс гибели. Там вырубается куча флагов, отвечающих за жизнь. Есть мысль посмотреть еще в сторону медиков, когда им удается кого-то откачать...



Ну и кто еще не видел, с помощью смены скинов можно сделать вполне годный парашют. Так что тема интересная, жаль мало фанатов "в живых" осталось.

https://www.youtube.com/watch?v=uGbYzQQJ7Uo

12
Может кто выложит свежую базу на сегодня?

13
Скриптинг / Re: Пулы
« : Июнь 20, 2020, 04:04:15 pm »

14
Функции, которые вы написали, нет в "CCamera.h", может просто ещё не добавляли в репозиторий.

Поищи по адресам в CCamera.cpp, у меня другие названия.

Допустим, установили камеру в нужных нам координатах, но нужно её развернуть по вертикальной оси или наклонить от себя или от себя, для хорошего операторского ракурса, какие функции для этого использовать?

Функция 0x46A494 устанавливает точку, в которую камера смотрит.

15
Ради чего столько мучений? По идее ты переписываешь стандартный скрипт на другом языке, вся последовательность команд должна быть та же самая. И что будет в результате, та же самая игра, только с вероятными проблемами. Какие функции с камерой подсказать? Ну вот например (в SDK аналогично):

Код: C++
  1. void CCamera::SetBehindPlayer() {
  2.         ((void(__thiscall *)(CCamera *))0x46BADE)(this);
  3. }
  4. void CCamera::Restore() {
  5.         ((void(__thiscall *)(CCamera *))0x46BC7D)(this);
  6. }
  7. void CCamera::SetPosition(CVector pos, CVector rotation) {
  8.         ((void(__thiscall *)(CCamera *, CVector *, CVector *))0x46BA72)(this, &pos, &rotation);
  9. }
  10. void CCamera::SetTarget(CVector point, signed int mode, signed int flag) {
  11.         ((void(__thiscall *)(CCamera *, CVector *, signed int, signed int))0x46A494)(this, &point, mode, flag);
  12. }
  13. void CCamera::SetRadius(float value, bool flag) {
  14.         this->nearClipPlain = value;
  15.         this->nearClipPlainOn = flag;
  16. }
  17.  
  18. auto Camera = (CCamera *)0x7E4688;
  19. // установка камеры
  20. Camera->SetRadius(0.02f, 1);
  21.  
  22. Camera->cams[Camera->activeCam].target.x = Camera->pos.x + (float)(-X1 * cos(U) + Y1 * sin(U));
  23. Camera->cams[Camera->activeCam].target.y = Camera->pos.y + (float)(-Y1 * cos(U) - X1 * sin(U));
  24. Camera->cams[Camera->activeCam].target.z = Camera->cams[Camera->activeCam].target.z + R0 * Mouse->Y / 100;
  25.  
  26. Camera->pos.x = Camera->cams[Camera->activeCam].target.x + R2*(float)(X1 * cos(U) - Y1 * sin(U));
  27. Camera->pos.y = Camera->cams[Camera->activeCam].target.y + R2*(float)(Y1 * cos(U) + X1 * sin(U));
  28. Camera->pos.z = Camera->pos.z - R0 * Mouse->Y / 100;
  29.  
  30.  
  31. Camera->SetPosition(Camera->pos, CVector(0, 0, 0));
  32. Camera->SetTarget(Camera->cams[Camera->activeCam].target, 2, 1);
  33.  
  34. // восстановление камеры
  35. Camera->SetRadius(0.9f, 0);
  36. Camera->Restore();
  37. Camera->SetBehindPlayer();
  38.  

Страницы: [1] 2 3 ... 40