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

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


Темы - xanser

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

2
Решил я наделать скинов для своего персонажа. Можно всех посмотреть здесь 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

3
Моды / Ку, зараза!
« : Октябрь 29, 2019, 12:10:39 pm »
Землянин, здравствуй! Уверен, ты когда-нибудь зайдешь и в эту тему на задворках безжизненного форума. Хочу представить свой мод, посвященный известному фильму. Картинки можно посмотреть тут .



Хотелось обсудить не столько этот мод (в нем ничего особенного), сколько поделиться методами создания, которые могут пригодиться другим.

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

Карта сделана самостоятельным лодом размером 10000х10000, он не привязан ни к какому объекту, поэтому виден всегда. В данном случае подошла простая текстура высот, определившая в 3dmax-e холмистость, ее можно продолжить редактировать в z-modeler-e, например импортировав через 3ds. Размер dff-файла получился 2 Мб, что не так критично для готовой карты. Далее нужно сделать соприкосновение с картой, чтобы по ней ездить. Созданы "затычки" для поверхности через каждые 200x200 метров, состоящие из одного микро-полигона, который скрывается под лод-картой, он просто нужен, чтобы был. Далее col-файл этого полигона отличается от него самого. В этом основная фишка - col-файл "затычки" повторяет лод в пределах соответствующего ему участка через каждые 200х200, размер обусловлен лимитом осязаемой коллизии в пределах 300 метров. На это у меня ушло несколько дней - разбить лод на 20 колов по высоте и 20 по ширине карты, всего 400 колов. Тут бы хотелось узнать у знатоков скриптов 3dmax-а, может как-то можно автоматизировать подобную разбивку. Хорошо бы для произвольной карты сделать независимый от сетки распил по 200х200, потому что при доработке карты скорее всего изменится и кол дорабатываемого участка.



Расставить участки поверхности (их 400) в ipl файле тоже дело недолгое, в результате за неделю готовая простая карта. Если делать город, могу предложить вместо одного лода использовать, скажем, четыре размером 1000х1000, или размером еще меньше в зависимости от детализации рельефа и желаемого размера dff-файла. Думаю, такой способ ускорит создание карт.

4
Делюсь информацией по адресам координат прямоугольника, который задает "непромокаемость" салона лодки, вода в этом месте не рендерится, и салон может погружаться ниже уровня воды без подтопления. При замене модели лодки этот прямоугольник остается стандартным и портит картину. Вот адреса координат для замены, по 4 координаты x, y, z для каждой лодки. Для лодки 202 координат 8, там задано два прямоугольника. Для лодки 223 координат я не обнаружил. Если скриптом менять, то например замена первой точки 136 лодки выглядит так:

Код: Text
  1. 05DF: write_memory 0x5A5166 size 4 value -1.3 virtual_protect 1  // x
  2. 05DF: write_memory 0x5A5170 size 4 value -1.016 virtual_protect 1  // y
  3. 05DF: write_memory 0x5A517A size 4 value 0.51 virtual_protect 1  // z

// 136
0x5A5166   -1.3
0x5A5170   -1.016
0x5A517A   0.51
0x5A5184   1.3
0x5A518E   -1.016
0x5A5198   0.51
0x5A51A2   -1.3
0x5A51AC   -2.832
0x5A51B6   0.51
0x5A51C0   1.3
0x5A51CA   -2.832
0x5A51D4   0.51
// 160
0x5A4FE6     -1.45
0x5A4FF0     1.9
0x5A4FFA     0.96
0x5A5004     1.45
0x5A500E     1.9
0x5A5018     0.96
0x5A5022     -1.45
0x5A502C     -3.75
0x5A5036     0.96
0x5A5040     1.45
0x5A504A     -3.75
0x5A5054     0.96
// 176
0x5A51E6   -1.222
0x5A51F0   2.004
0x5A51FA   1.409
0x5A5204   1.222
0x5A520E   2.004
0x5A5218   1.409
0x5A5222   -1.24
0x5A522C   -1.367
0x5A5236   0.846
0x5A5240   1.24
0x5A524A   -1.367
0x5A5254   0.846
// 182
0x5A4EE6   -1.15
0x5A4EF0   3.61
0x5A4EFA   1.03
0x5A4F04   1.15
0x5A4F0E   3.61
0x5A4F18   1.03
0x5A4F22   -1.15
0x5A4F2C   0.06
0x5A4F36   1.03
0x5A4F40   1.15
0x5A4F4A   0.06
0x5A4F54   1.03
// 183
0x5A4F66   -1.9
0x5A4F70   2.83
0x5A4F7A   1.0
0x5A4F84   1.9
0x5A4F8E   2.83
0x5A4F98   1.0
0x5A4FA2   -1.66
0x5A4FAC   -4.48
0x5A4FB6   0.83
0x5A4FC0   1.66
0x5A4FCA   -4.48
0x5A4FD4   0.83
// 184
0x5A52E6   -1.886
0x5A52F0   -2.347
0x5A52FA   0.787
0x5A5304   1.886
0x5A530E   -2.347
0x5A5318   0.787
0x5A5322   -1.886
0x5A532C   -4.67
0x5A5336   0.842
0x5A5340   1.886
0x5A534A   -4.67
0x5A5354   0.842
// 202
0x5A50E6   -0.663
0x5A50F0   3.565
0x5A50FA   0.382
0x5A5104   0.663
0x5A510E   3.565
0x5A5118   0.382
0x5A5122   -1.087
0x5A512C   0.831
0x5A5136   0.381
0x5A5140   1.087
0x5A514A   0.831
0x5A5154   0.381
// 202 - 2
0x5A5447   -1.087
0x5A5451   0.831
0x5A545B   0.381
0x5A5465   1.087
0x5A546F   0.831
0x5A5479   0.381
0x5A5483   -1.097
0x5A548D   -2.977
0x5A5497   0.381
0x5A54A1   1.097
0x5A54AB   -2.977
0x5A54B5   0.381
// 203
0x5A5066   -0.797
0x5A5070   1.641
0x5A507A   0.573
0x5A5084   0.797
0x5A508E   1.641
0x5A5098   0.573
0x5A50A2   -0.865
0x5A50AC   -1.444
0x5A50B6   0.509
0x5A50C0   0.865
0x5A50CA   -1.444
0x5A50D4    0.509
// 214
0x5A5266   -1.246
0x5A5270   -1.373
0x5A527A   0.787
0x5A5284   1.246
0x5A528E   -1.373
0x5A5298   0.787
0x5A52A2   -1.023
0x5A52AC   -5.322
0x5A52B6   0.787
0x5A52C0   1.023
0x5A52CA   -5.322
0x5A52D4   0.787

5
Общие вопросы / Экстры транспорта
« : Июнь 20, 2019, 12:24:19 pm »
Решил создать тему про экстры, чтобы собрать материал. Интересует такой вопрос - у экстр почему-то отключен хром, даже если присутствует в модели. Есть некоторое объяснение этому - если экстра содержит прозрачность, буквы на кузове например, то хром ее портит, освещая весь прямоугольник текстуры, в том числе и прозрачные участки. Но это поправимо в самой модели отключением хрома. А вот когда экстра является частью кузова, то без хрома смотрится плохо. Я попробую раскопать, можно ли вернуть хром на экстры и напишу здесь. Если кто-то что-то знает по этому поводу, подскажите.

Вот еще некоторая информация по экстрам.
В default.ide есть параметр Comprules, он принимает значения 0, 1f10, 2ff0, 30123345, 4fff. Это тип отображения экстр, принимающий после преобразования (& f000 >> 12) значения 0, 1, 2, 3, 4:
1 = 1f10 & f000 >> 12
2 = 2ff0 & f000 >> 12
3 = 30123345 & f000 >> 12
4 = 4fff & f000 >> 12

Первые три - это комбинации нескольких экстр в машине при определенных условиях, некоторые реагируют на дождь. Подробнее можно посмотреть по коду функции 0x579670 CVehicleModelInfo::ChooseComponent() или поэкспериментировать в игре. А вот 4fff - это обязательное отображение одной из экстр, для этого требуется заложить все 6 экстр в модель. Таким образом, экстрами можно делать не только мелкие дополнения, но и модификации кузова, а тут уже хотелось бы восстановить хром. Можно конечно добавить свои компоненты с хромированными экстрами и чередовать, но возможно проще найти место отключения хрома.

Можно также внедриться в генератор парковок 0x5A7163 CarGeneratorDoInternalProcessing() и создавать машину с нужной экстрой, изменяя номер экстры в адресе 0x699538 до выполнения этой функции. Например можно поставить в аэропорт автобус с экстрой маршрута именно аэропорта, или поставить на стройку грузовик именно со строительной экстрой. Минус в том, что под большие экстры должен быть разный col-файл, но это не так важно.

6
Общие вопросы / Центрирование анимации
« : Март 13, 2019, 07:20:08 pm »
Есть такой мод Fixed Idle Animations, который оживляет две анимации IDLE_ARMED and IDLE_CSAW. Суть в том, что в PC версии эти анимации состоят из одного кадра - игрок неподвижный, когда держит оружие или бензопилу/миниган, а в PS2 эти анимации "живые". Все бы хорошо, но анимации отцентрированы неправильно, что привело к тому, что у игрока стали болтаться ноги. Как бы это пофиксить, "приклеив" ноги и сдвинув все остальное.

На 0:25 видно эту анимацию (болтающиеся ноги тоже видно):
https://youtu.be/E51Zn3QNRbo

7
Программирование / Расширение классов
« : Январь 06, 2018, 05:10:43 pm »
В этом посте DK показывал пример, как расширить класс, "прикрепив" к нему дополнительные атрибуты. Насколько я понял, существующие пулы при этом не расширяются.
Код: C++
  1.     #include <plugin.h>
  2.      
  3.     using namespace plugin;
  4.      
  5.     class VehicleExtendedExample {
  6.     public:
  7.         class VehicleComponents { // Класс, который представляет наши данные (можно сказать, что эти данные "прикрепляются" к структуре транспорта)
  8.         public:
  9.             RwFrame *m_pDoorLF;
  10.             RwFrame *m_pDoorRF;
  11.             RwFrame *m_pDoorLR;
  12.             RwFrame *m_pDoorRR;
  13.      
  14.             VehicleComponents(CVehicle *) { // Конструктор этого класса будет вызван при вызове конструктора транспорта (CVehicle::CVehicle)
  15.                 m_pDoorLF = m_pDoorRF = m_pDoorLR = m_pDoorRR = nullptr; // устанавливаем все указатели в 0
  16.             }
  17.         };
  18.      
  19.         VehicleExtendedExample() {
  20.             static VehicleExtendedData<VehicleComponents> vehComps; // Создаем экземпляр нашего расширения. vehComps - это переменная, через которую мы будем
  21.                                                                     // обращаться к нашим данным (используя метод Get(CVehicle *транспорт) )
  22.      
  23.             Events::vehicleSetModelEvent += [](CVehicle *vehicle, int modelIndex) { // Выполняем нашу функцию, когда игра устанавливает модель транспорту
  24.                 if (vehicle->m_pRwClump) { // Если создан графический обьект модели (RpClump)
  25.                     vehComps.Get(vehicle).m_pDoorLF = CClumpModelInfo::GetFrameFromName(vehicle->m_pRwClump, "door_lf_dummy"); // Находим компоненты в иерархии
  26.                     vehComps.Get(vehicle).m_pDoorRF = CClumpModelInfo::GetFrameFromName(vehicle->m_pRwClump, "door_rf_dummy"); // и записываем их в наш класс
  27.                     vehComps.Get(vehicle).m_pDoorLR = CClumpModelInfo::GetFrameFromName(vehicle->m_pRwClump, "door_lr_dummy");
  28.                     vehComps.Get(vehicle).m_pDoorRR = CClumpModelInfo::GetFrameFromName(vehicle->m_pRwClump, "door_rr_dummy");
  29.                 }
  30.                 else // иначе устанавливаём всё в 0
  31.                     vehComps.Get(vehicle).m_pDoorLF = vehComps.Get(vehicle).m_pDoorRF = vehComps.Get(vehicle).m_pDoorLR = vehComps.Get(vehicle).m_pDoorRR = nullptr;
  32.             };
  33.      
  34.             Events::vehicleRenderEvent += [](CVehicle *vehicle) { // Выполняем нашу функцию, когда игра рендерит транспорт
  35.                 if (vehComps.Get(vehicle).m_pDoorLF)
  36.                     vehComps.Get(vehicle).m_pDoorLF->modelling.pos.z = 1.0f; // Сдвигаем компонент вверх
  37.                 if (vehComps.Get(vehicle).m_pDoorRF)
  38.                     vehComps.Get(vehicle).m_pDoorRF->modelling.pos.z = 1.0f;
  39.                 if (vehComps.Get(vehicle).m_pDoorLR)
  40.                     vehComps.Get(vehicle).m_pDoorLR->modelling.pos.z = 1.0f;
  41.                 if (vehComps.Get(vehicle).m_pDoorRR)
  42.                     vehComps.Get(vehicle).m_pDoorRR->modelling.pos.z = 1.0f;
  43.             };
  44.         }
  45.     } vehicleExtendedExample;

DK, можешь на простом примере показать общий принцип расширения классов через прикрепление новых атрибутов. К примеру, есть условный класс
Код: C++
  1. class CVector {
  2. public:
  3.     float x;
  4.     float y;
  5.     CVector();
  6. } vector2d[100];

И есть, например, пул таких координат по определенному адресу памяти, где идет по порядку vector2d[0].x, veсtor2d[0].y, vector2d[1].x, veсtor2d[1].y, vector2d[2].x, veсtor2d[2].y...
Как к этому классу "прикрепить" еще свою координату float z, чтобы обращаться уже к vector2d.x, vector2d.y, vector3d.Get(vector2d).z и не повредить существующий пул. Пример не связан с игрой.

8
Общие вопросы / Зеркальное отражение модели
« : Октябрь 27, 2017, 06:37:16 pm »
Есть ли способ поставить на карту модель в зеркальном отражении, например по-хитрому задав углы поворота. Актуально для симметричных моделей, например ворот, чтобы не моделить отраженный аналог.

9
Идеи / Смена текстур транспорта
« : Октябрь 18, 2017, 03:13:50 pm »
Предлагаю запилить мод для смены скинов машин или поделиться соображениями, возможно это или нет. Вот, что мне удалось. Во вложении вторая текстура для танка rhino2.txd для gta3.img и тестовая asi-шка, которая меняет скин танка до его первого появления нажатием на Tab, для проверки после этого можно ввести например чит-код panzer. Проблема в том, что текстуру танка пока удалось сменить только до появления первой модели, потом все модели создаются такие же. Если первым создать стандартный танк, то мой код уже не оказывает эффекта. Нужна помощь в поиске причины. Хотелось бы сделать смену на лету.



Почему это кажется возможным. Я позаимствовал функции из этого блока: 0x40AA60 CStreaming::RequestSpecialModel, здесь меняются модели и текстуры для специальных актеров для миссий:
109, special01, generic, CIVMALE, STAT_STD_MISSION, man, 0, null, 9,9
110, special02, generic, CIVMALE, STAT_STD_MISSION, man, 0, null, 9,9
......................................
129, special21, generic, CIVMALE, STAT_STD_MISSION, man, 0, null, 9,9

Получается, что можно на один id вешать любые модели и текстуры, в перспективе кажется возможным таким способом расширить количество транспортных средств, используя одни и те же номера.
Что касается скинов, то мне видится возможным внедрение кода с чередующимися текстурами до отрисовки отдельной машины в функцию 0x589AE0 CAutomobile::PreRender

Вот примеры практического применения с использованием этого кода, но пока неодновременные полуфейки:


10
Может кто-нибудь разбирался, почему игрок не падает с эскалатора. От чего интересно зависит "примагничивание" к ступенькам. Попробовал сделать свой эскалатор из тех же ступенек, работает только вертикальное движение, при горизонтальном ступеньки уезжают из под ног. Также игрок не съезжает с яхты кортеза в миссии, интересно от чего это зависит.

Проверил еще одну вещь. Если дополнительно двигать стандартный эскалатор например вбок, то сцепление со ступеньками теряется. Также теряется сцепление при увеличении FPS. Похоже, что игрок удерживается программно.

11
Программирование / Модульность dll
« : Август 31, 2017, 11:31:00 am »
Хочется рассмотреть такой вариант мода, когда написана общая dll, которая патчит какие-то адреса и подсовывает туда вызов своих функций, но внутри уже список вызываемых подфункций вынести в отдельные dll. Например каждый уникальный транспорт может идти со своей asi-шкой, которая добавляет ему новые возможности. Получается общая dll должна вызывать экспортные внешние функции этих мелких dll. Может есть пример такого построения.

12
Скриптинг / Группы педов и скрипт пляжа
« : Август 29, 2017, 05:19:34 pm »
Тут обнаружилось, что на очищенном main.scm перестает работать разделение на группы пешеходов, по всем зонам гуляют одинаковые педы. Я раньше думал, что группы зависят от info.zon, где разделение карты на зоны, и pedgrp.dat, где настройки педов для этих зон. Отсюда вопрос, что в мэйне влияет на активацию групп педов.

Второй вопрос, мне хотелось бы вытащить отдельно зону пляж и события для нее, такие как загорающие люди, заметил, что они начинают это делать с 10 утра. Если это тоже в скрипте, то подскажите, где искать это место. Уточнил - загорающие люди проявляются и без скрипта, если поставить пляжников по дефолту для всех зон, значит надо копать в exe, второй вопрос снимается.

13
При создании карты из кусков может получиться, что нормаль на краю одного куска имеет другой градус, чем нормаль соседнего куска, это дает эффект однобокого затенения вершины при использовании динамического освещения. Склеивать куски каждый раз для склеивания нормалей, а потом их разделять опять не вариант. Какой программой можно задать точный градус нормали, например 90 градусов по краям куска карты? ZModeler не умеет, в 3dmax-е я не нашел как.


14
Удалось ли увеличить в вайсе лимит на максимальный номер модели? Максимальный насколько я знаю 6500, я пропатчил все вхождения, также рядом постоянно попадаются какие-то 7885 и 7916, но все равно работает только с 6500, ни больше, ни меньше, похоже что-то упустил. Limit adjuster 2 beta 6 тоже не увеличивает, хотя там вроде заявлено. Во вложении мои попытки, может кто-то добавит или направит в нужную сторону.

15
Смотрю, на форуме до сих пор нет нормальной темы про FPS.
Вот что получается - если играть на 300-400 fps, появляются всем известные корявости, не привязанные разработчиками к fps, такие как плохая физика авто, не успевающие вылетать и развеиваться партиклы и т.д. При этом картинка очень плавная. Казалось бы нужно просто ограничить fps в опциях, но не тут-то было. Возникает обратный эффект, картинка даже на топовых компах временами начинает идти рывками на модах с тяжелыми моделями. Не знаю в чем причина, в полигонах или текстурах 2048x2048, хотя без ограничителя все летало, значит ресурсов хватает. Есть моды, которые увеличивают ограничитель кадров до 60, типа framelimiter (ставит новый fps в адреса 0x602D68 и 0x9B48EC) или framelimitadjuster_vc и подобные, 30/60/120 fps - никакой разницы, ограничитель увеличивается, но рывки остаются.

Я так подозреваю, что проблема в том, что игре на тяжелых моментах нужно просесть ниже 30/60 fps, а ограничитель не дает ни выше, ни ниже. Без ограничителя я наблюдал проседание с 300 до 20 fps, возможно за счет этого сохранялась плавность. Мне кажется нужен другой подход - ограничить fps только сверху, но не снизу. Вот с этим хотелось бы разобраться, может я не прав.

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