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

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


Сообщения - xanser

Страницы: [1] 2 3 ... 40
1
Идеи / Re: Смена текстур педов
« : Сентябрь 11, 2023, 06:29:01 pm »
Теперь есть тут

2
Общие вопросы / Re: Лимиты Игры
« : Август 03, 2023, 03:56:26 pm »
Меня интересует 3 лимита.

1 - это лимит TXD
2 - это лимит ID
3 - лимит модей транспорта которые могут быть созданны в игре одновременно (он равен примерно 50, если создать больше игра зависает)
Если еще актуально, то здесь у меня получилось увеличить лимит одновременных машин до полного списка. Только мне кажется, выше речь шла не о 50, а о 25 разных машинах в списке. Так по крайней мере показывают тесты.

3
Аналогично можно увеличить лимит парковки, на карте изначально 185 парковочных мест. Замечено кстати, что припаркованные машины в зоне видимости могут препятствовать приезду спецслужб в это место. Причем спецтранспорт создается на горизонте, но потом решает развернуться и свалить.

Код: C++
  1. DWORD ParkedLimit = 1000;  // лимит парковки на карте = 185
  2. DWORD ParkedInView = 127;  // лимит парковки в зоне видимости = 10, максимум = 127
  3.  
  4. template<typename T>void Patch(DWORD Address, T Value) {
  5.         auto Pointer = (T *)Address;
  6.         unsigned long Protect;
  7.         VirtualProtect(Pointer, sizeof(T), PAGE_READWRITE, &Protect);
  8.         * Pointer = Value;
  9.         VirtualProtect(Pointer, sizeof(T), Protect, &Protect);
  10. }
  11. struct RwV3d {
  12.     float x, y, z;
  13. };
  14. class CCarGenerator {
  15. public:
  16.     DWORD id;
  17.     RwV3d pos;
  18.     DWORD angle;
  19.     WORD  color1;
  20.     WORD  color2;
  21.     BYTE  forceSpawn;
  22.     BYTE  alarm;
  23.     BYTE  doorLock;
  24.     BYTE  field_1B;
  25.     WORD  minDelay;
  26.     WORD  maxDelay;
  27.     DWORD timeNextGen;
  28.     DWORD ProcessedVehicleHandle;
  29.     WORD  enabled;
  30.     BYTE  field_2A;
  31.     BYTE  field_2B;
  32. };
  33.         CCarGenerator * CarGenerator;                   // новый блок парковки
  34.         CarGenerator = new CCarGenerator[ParkedLimit];  // выделение памяти на 1000 машин
  35. // перенаправление со старого блока на новый
  36.         Patch(0x4537A9, (DWORD)CarGenerator);
  37.         Patch(0x5A6C5F, (DWORD)CarGenerator);
  38.         Patch(0x5A6CC3, (DWORD)CarGenerator);
  39.         Patch(0x5A69DB, (DWORD)CarGenerator);
  40.         Patch(0x5A6B16, (DWORD)CarGenerator);
  41.         Patch(0x5A69E6, (DWORD)&CarGenerator->pos.x);
  42.         Patch(0x5A6B22, (DWORD)&CarGenerator->pos.x);
  43.         Patch(0x5A69F1, (DWORD)&CarGenerator->pos.y);
  44.         Patch(0x5A6B2A, (DWORD)&CarGenerator->pos.y);
  45.         Patch(0x5A69FC, (DWORD)&CarGenerator->pos.z);
  46.         Patch(0x5A6B35, (DWORD)&CarGenerator->pos.z);
  47.         Patch(0x5A6A07, (DWORD)&CarGenerator->angle);
  48.         Patch(0x5A6B40, (DWORD)&CarGenerator->angle);
  49.         Patch(0x5A6A14, (DWORD)&CarGenerator->color1);
  50.         Patch(0x5A6B4C, (DWORD)&CarGenerator->color1);
  51.         Patch(0x5A6A21, (DWORD)&CarGenerator->color2);
  52.         Patch(0x5A6B5C, (DWORD)&CarGenerator->color2);
  53.         Patch(0x5A6A2A, (DWORD)&CarGenerator->forceSpawn);
  54.         Patch(0x5A6B65, (DWORD)&CarGenerator->forceSpawn);
  55.         Patch(0x5A6A33, (DWORD)&CarGenerator->alarm);
  56.         Patch(0x5A6B6E, (DWORD)&CarGenerator->alarm);
  57.         Patch(0x5A6A3C, (DWORD)&CarGenerator->doorLock);
  58.         Patch(0x5A6B77, (DWORD)&CarGenerator->doorLock);
  59.         Patch(0x5A6A49, (DWORD)&CarGenerator->minDelay);
  60.         Patch(0x5A6B85, (DWORD)&CarGenerator->minDelay);
  61.         Patch(0x5A6A56, (DWORD)&CarGenerator->maxDelay);
  62.         Patch(0x5A6B95, (DWORD)&CarGenerator->maxDelay);
  63.         Patch(0x5A6A61, (DWORD)&CarGenerator->timeNextGen);
  64.         Patch(0x5A6BA1, (DWORD)&CarGenerator->timeNextGen);
  65.         Patch(0x5A6A6C, (DWORD)&CarGenerator->ProcessedVehicleHandle);
  66.         Patch(0x5A6BAC, (DWORD)&CarGenerator->ProcessedVehicleHandle);
  67.         Patch(0x5A6A79, (DWORD)&CarGenerator->enabled);
  68.         Patch(0x5A6BB8, (DWORD)&CarGenerator->enabled);
  69.         Patch(0x5A6A85, (DWORD)&CarGenerator->field_2A);
  70.         Patch(0x5A6BC1, (DWORD)&CarGenerator->field_2A);
  71.  
  72.         Patch(0x5A6C16, (DWORD)ParkedLimit);   // перезапись лимита парковки
  73.         Patch(0x5A71D0, (BYTE)ParkedInView);   // перезапись лимита парковки в зоне видимости

4
Добавлю из своего. На дорогах доступен не весь транспорт сразу, а максимум 25 рандомных машин из-за оптимизации. Это приводит к частому повторению на дорогах. Раньше я пытался парковать разные машины по городу, чтобы "взбодрить" этот список. Но можно увеличить 25 до 127 (байтовое ограничение) и выделить новый кусок памяти под расширенный лист. Хотя достаточно и 110, в оригинале 107 машин + 3 свободных слота. Не уверен, почему в коде чаще всего используется удвоенное значение 25 * 2 = 50, возможно лучше тогда поставить значение, кратное 25, например 50 или 100. Я поставил себе 125, чтобы все существующие машины (без типа ignore) могли появляться на дорогах в любое время. Вроде работает, вот адреса, которые нужно пропатчить.

Код: C++
  1. BYTE CarListLimit = 25;                                   // первоначальный лимит
  2. DWORD * CarList;                                          // новый блок памяти
  3.  
  4. template<typename T>void Patch(DWORD Address, T Value) {
  5.         auto Pointer = (T *)Address;
  6.         unsigned long Protect;
  7.         VirtualProtect(Pointer, sizeof(T), PAGE_READWRITE, &Protect);
  8.         * Pointer = Value;
  9.         VirtualProtect(Pointer, sizeof(T), Protect, &Protect);
  10. }
  11.  
  12. // CStreaming_InitChannels
  13.         CarList = new DWORD[CarListLimit * 2];            // 50  0x860F38
  14.         Patch(0x410674, (DWORD)CarList);
  15.         Patch(0x41067C, (DWORD)&CarList[2]);
  16.         Patch(0x410684, (DWORD)&CarList[4]);
  17.         Patch(0x41068C, (DWORD)&CarList[6]);
  18.         Patch(0x410694, (DWORD)&CarList[8]);
  19.         Patch(0x41069D, (BYTE)(CarListLimit * 2));        // 50
  20.         Patch(0x410795, (DWORD)(CarListLimit));           // 25
  21. // CStreaming::AddToLoadedVehiclesList(int)
  22.         Patch(0x408B68, (DWORD)CarList);
  23.         Patch(0x408BA0, (DWORD)CarList);
  24.         Patch(0x408C17, (DWORD)CarList);
  25.         Patch(0x408C51, (DWORD)CarList);
  26.         Patch(0x408B7F, (BYTE)(CarListLimit * 2));        // 50
  27.         Patch(0x408B8F, (BYTE)(CarListLimit * 2));        // 50
  28.         Patch(0x408BD5, (BYTE)(CarListLimit * 2));        // 50
  29.         Patch(0x408BE5, (BYTE)(CarListLimit * 2));        // 50
  30.         Patch(0x408C21, (BYTE)(CarListLimit * 2));        // 50
  31.         Patch(0x408C4D, (BYTE)(CarListLimit * 2));        // 50
  32. // CStreaming::RemoveLoadedVehicle
  33.         Patch(0x408AC8, (DWORD)CarList);
  34.         Patch(0x408B15, (DWORD)CarList);
  35.         Patch(0x408AAF, (BYTE)(CarListLimit * 2));        // 50
  36.         Patch(0x408AC4, (BYTE)(CarListLimit * 2));        // 50
  37. // CStreaming::ProcessLoadingChannel
  38.         Patch(0x40BFC5, (DWORD)CarList);
  39.         Patch(0x40BFCF, (BYTE)(CarListLimit * 2));        // 50
  40. // CRunningScript::ProcessCommands900To999
  41.         Patch(0x45A707, (DWORD)CarList);
  42.         Patch(0x45A753, (BYTE)(CarListLimit * 2));        // 50
  43.         Patch(0x45A761, (BYTE)(CarListLimit * 2));        // 50
  44.  

5
Идеи / Re: Рендер тени в Vice City
« : Май 26, 2023, 04:24:23 am »
Возможно будет продолжение темы. Хотелось бы верить, что и для вайса запилят такой мод:

https://libertycity.ru/files/gta-3/173039-dinamicheskie-teni-dlja-peshekhodov-i.html

Кому интересно, есть красивая сборка гта 3 с такими тенями:

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

6
О сайте и форумах / Re: Будет ли закрыт сайт?
« : Декабрь 07, 2021, 01:50:11 pm »
Как это ни печально, но у сайта и форума нет будущего.
Мне бы хотелось обсудить еще много интересного, но я понимаю, что тему посмотрит три человека, ответит два, а по делу хорошо если один. Будет ли решен вопрос, вынесенный на обсуждение, вызовет ли интерес для совместной работы, скорее всего нет. Опубликуются ли какие-то значимые моды на главной странице, вряд ли. Актуален ли до сих пор образовательный аспект, не заметно. Имеет ли смысл дальше поддерживать сайт и оплачивать хостинг, решение за владельцем, но по-моему очевиден занавес  :'(

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

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

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

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

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

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

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

11
Интересная модификация с кучей всего, вот решил покопаться. В папке с игрой можно обнаружить множество 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, сталкивался с третьим точно, возможно с четвертым.
Непонятно, откуда эти фиксы взялись, информацию по ним я не нашел. Хотелось бы понять, что они конкретно делают, и почему именно так.

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

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

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

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

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