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

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


Темы - DK

Страницы: [1]
1
Присоединяемся.

Тема: обсуждение модостроительства, помощь в моддинге (только в особо сложных ситуациях, конечно же), обсуждение состояния дел в моддинге.
Вариант общения: сообщения.
Язык: русский, украинский.

https://join.skype.com/jqGbs97avigh

2
Программирование / Создание класса в Plugin-SDK
« : Октябрь 23, 2016, 07:21:39 pm »
Plugin-SDK - открытый проект, внести свой вклад в проект может каждый.
Однако, для того, чтобы вносить изменения надо обладать кое-какими навыками.

Обсуждать, как загружать свой коммит в репозиторий мы здесь не будем - по этому уже есть статья на нашей вики.

Поговорим о том, как добавить класс игры (т.е. класс, который существует в коде GTA) в Plugin-SDK.
Весь процесс "добавления" можно представить такими этапами:
1. Собираем информацию о классе (структуры, переменные и функции) и разбираем его в IDA.
2. При помощи утилиты sdk_funcs_gen, генерируем код объявлений и определений функций.
3. Создаём файлы в sdk (хедеры, исходники) и заполняем их.
Самым сложным является первый этап.

Что нам нужно:
1. База данных. Для VC - я использую базу, основанную на базе maxorator'а.
2. База Android для VC.
3. Утилита sdk_funcs_gen. Получить её можно в ЛС.

Для примера мы возьмем класс CGeneral.

Как я уже говорил, использовать будем базу, основанную на базе maxorator'а. Плюсы этой базы - в ней проименованы почти все функции. Минусы - мало проименованых переменных и мало структур.
То, что в этой базе уже есть разобранные функции, немного упрощает нам задачу. Но нужно быть внимательным - я находил в этой базе ошибки.

https://www.youtube.com/watch?v=90qA3yDZSRs

При просмотре включить субтитры.

3
Программирование / GTA VC. Базы данных.
« : Октябрь 15, 2016, 09:40:29 pm »
С выходом Android-версий GTA мы получили чуть больше информации о коде игры.
Имена классов, функций, переменных (почти всех) - ко всему этому мы получили доступ.
Если раньше мы давали функциям и классам "свои" имена (например, настолько привыкшийся CScriptThread), то теперь у нас есть оригинальные названия всего этого.

Различия между Android и PC базами

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

Также не стоит забывать, что разработчики, которые занимались мобильной версией игры, внесли в неё некоторые изменения (это и изменения, связанные с особенностями девайсов (другая файловая система, другой движок аудио, как пример), так и улучшения/исправления оригинального кода игры).
Ещё стоит сказать, что в мобильных версиях используется не Direct3D, а OpenGL версия RenderWare Graphics.

Ну и третье - в базе PC (только VC/III) представлены только те функции, которые действительно используются в игре (неиспользуемые не были добавлены в испольняемый файл компилятором). В базе мобильной версии такие функции могут встречаться.

Перенос названий из Android-версии базы в PC-версию

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

Имена функций/переменных в Android-версии базы имеют вид
Код: C++
  1. _ZN11CTheScripts14LoadAllScriptsEPhj
Это такой вид декорации имён (name-mangling'а). Просто копируем эту строчку и вставляем в название функции/переменной в PC-базе. IDA умеет транслировать такие имена, и в списке функций или в коде декомпилятора мы увидим привычные имена.

maxorator уже перенёс имена почти всех функций в базу PC - правда, речь только о функциях. Имена переменных не перенесены.
Также, некоторые функции сопоставлены неправильно (редкие случаи).
Именно с этой базой я работаю, если речь идёт о Vice City.

База, основанная на базе maxorator'а (15.10.2016)
Android-база Vice City

4
Программирование / GTA SA - опкоды анимации
« : Октябрь 09, 2016, 12:11:52 pm »
По порядку.

0393 | COMMAND_SET_CHAR_ANIM_SPEED

Описание
0393: set_char_anim_speed 215@ anim "POOL_SHORT_SHOT" to 248@
COMMAND_SET_CHAR_ANIM_SPEED

Порядок действий
Находим в клампе анимацию (CAnimBlendAssociation) по заданому имени. Если нашли - устанавливаем нужную скорость.

Код опкода
Код: C++
  1. case COMMAND_SET_CHAR_ANIM_SPEED:
  2.     this->CollectParameters(1);
  3.     CPed *ped = CPools::ms_pPedPool->AtHandle(ScriptParams[0].i);
  4.     this->ReadTextLabelFromScript(text, 24);
  5.     CAnimBlendAssociation *assoc = RpAnimBlendClumpGetAssociation(ped->m_pRwClump, text);
  6.     this->CollectParameters(1);
  7.     if ( assoc )
  8.         assoc->m_fSpeed = ScriptParams[0].f;
  9.     return OR_CONTINUE;

04ED | REQUEST_ANIMATION

Описание
04ED: request_animation "LOWRIDER"
REQUEST_ANIMATION

Порядок действий
Находим индекс файла анимации по названию, загружаем ресурс, добавляем в менеджер управления скриптовыми ресурсами.

Код опкода
Код: C++
  1. case COMMAND_REQUEST_ANIMATION:
  2.     this->ReadTextLabelFromScript(text, 16);
  3.     animResourceIndex = CAnimManager::GetAnimationBlockIndex(text);
  4.     CStreaming::RequestModel(animResourceIndex + 25575, 4); // 25575 - базовый индекс для файлов анимаций, 4 = MISSION_REQUIRED
  5.     CTheScripts::ScriptResourceManager->AddToResourceManager(animResourceIndex, 1, this);
  6.     return OR_CONTINUE;

04EE | HAS_ANIMATION_LOADED

Описание
04EE: has_animation_loaded "LOWRIDER"
HAS_ANIMATION_LOADED

Порядок действий
Находим блок анимации по названию, проверяем статус загрузки.

Код опкода
Код: C++
  1. case COMMAND_HAS_ANIMATION_LOADED:
  2.     this->ReadTextLabelFromScript(text, 16);
  3.     if ( CAnimManager::GetAnimationBlock(text)->bLoaded != 1 )
  4.         this->UpdateCompareFlag(false);
  5.     else
  6.         this->UpdateCompareFlag(true);
  7.     return OR_CONTINUE;

04EF | REMOVE_ANIMATION

Описание
04EF: remove_animation "LOWRIDER"
REMOVE_ANIMATION

Порядок действий
Находим индекс файла анимации по названию, удаляем из менеджера управления скриптовыми ресурсами, выгружаем ресурс.

Код опкода
Код: C++
  1. case COMMAND_REMOVE_ANIMATION:
  2.     this->ReadTextLabelFromScript(text, 16);
  3.     animResourceIndex = CAnimManager::GetAnimationBlockIndex(text);
  4.     if (!CTheScripts::ScriptResourceManager->RemoveFromResourceManager(animResourceIndex, 1, this))
  5.         return OR_CONTINUE;
  6.     CStreaming::SetMissionDoesntRequireAnim(animResourceIndex); // вызывает CStreaming::SetMissionDoesntRequireModel(animResourceIndex + 25575)
  7.     return OR_CONTINUE;

0611 | IS_CHAR_PLAYING_ANIM

Описание
0611:   is_char_playing_anim 2@ anim "LRGIRL_IDLE_TO_L0"
IS_CHAR_PLAYING_ANIM

Порядок действий
Проверяем наличие в клампе анимации (CAnimBlendAssociation) с заданым именем.

Код опкода
Код: C++
  1. case COMMAND_IS_CHAR_PLAYING_ANIM:
  2.     this->CollectParameters(1);
  3.     CPed *ped = CPools::ms_pPedPool->AtHandle(ScriptParams[0].i);
  4.     this->ReadTextLabelFromScript(text, 24);
  5.     if (RpAnimBlendClumpGetAssociation(ped->m_pRwClump, text))
  6.         this->UpdateCompareFlag(true);
  7.     else
  8.         this->UpdateCompareFlag(false);
  9.     return OR_CONTINUE;

0612 | SET_CHAR_ANIM_PLAYING_FLAG

Описание
0612: set_char_anim_playing_flag 66@ anim "SHP_HANDSUP_SCR" to 0
SET_CHAR_ANIM_PLAYING_FLAG

Порядок действий
Получаем в клампе анимацию (CAnimBlendAssociation) с заданым именем, устанавливаем или убираем флаг проигрывания.

Код опкода
Код: C++
  1. case COMMAND_SET_CHAR_ANIM_PLAYING_FLAG:
  2.     this->CollectParameters(1);
  3.     CPed *ped = CPools::ms_pPedPool->AtHandle(ScriptParams[0].i);
  4.     this->ReadTextLabelFromScript(text, 24);
  5.     CAnimBlendAssociation *assoc = RpAnimBlendClumpGetAssociation(ped->m_pRwClump, text);
  6.     this->CollectParameters(1);
  7.     if (assoc) {
  8.         if (ScriptParams[0].s)
  9.             assoc->m_clumpAssoc.m_nFlags.bPlaying = true;
  10.         else
  11.             assoc->m_clumpAssoc.m_nFlags.bPlaying = false;
  12.     }
  13.     return OR_CONTINUE;

Опкоды 0605, 0812, 088A, 0A1A проигрывают анимацию.

0605 | TASK_PLAY_ANIM

Описание
0605: task_play_anim -1 anim "M_SMKLEAN_LOOP" ifp "LOWRIDER" framedelta 4.0 loop 1 lockX 0 lockY 0 lockF 0 time -1
TASK_PLAY_ANIM

0812 | TASK_PLAY_ANIM_NON_INTERRUPTABLE Анимация не может быть прервана

Описание
0812: task_play_anim_non_interruptable -1 anim "LRGIRL_IDLELOOP" ifp "LOWRIDER" framedelta 4.0 loop 0 lockX 0 lockY 0 lockF 0 time -1
TASK_PLAY_ANIM_NON_INTERRUPTABLE

088A | TASK_PLAY_ANIM_WITH_FLAGS Дополнительные настройки для анимации

Описание
088A: task_play_anim_with_flags 34@ anim "RAIL_FALL" ifp "SWAT" framedelta 8.0 loop 0 lockX 0 lockY 0 lockF 1 time -1 disable_force 0 disable_lockZ 1
TASK_PLAY_ANIM_WITH_FLAGS

0A1A | TASK_PLAY_ANIM_SECONDARY Анимация верхних частей тела

Описание
0A1A: task_play_anim_secondary 88@ anim "HIKER_POSE_L" ifp "MISC" framedelta 4.0 loop 0 lockX 0 lockY 0 lockF 1 time -1
TASK_PLAY_ANIM_SECONDARY

Все опкоды вызывают специальную, "общую" функцию PlayAnimScriptCommand.
Код: C++
  1. this->PlayAnimScriptCommand(opcodeId);
  2. return OR_CONTINUE;

Код: C++
  1. void CRunningScript::PlayAnimScriptCommand(int opcodeId) {
  2.    
  3.     char animName[24];
  4.     char fileName[16];
  5.     bool lockZ = false;
  6.     bool interruptable = true;
  7.    
  8.     this->CollectParameters(1);
  9.     int pedHandle = ScriptParams[0].i;
  10.     this->ReadTextLabelFromScript(animName, 24);
  11.     this->ReadTextLabelFromScript(fileName, 16);
  12.     switch (opcodeId) {
  13.         case COMMAND_TASK_PLAY_ANIM:
  14.         case COMMAND_TASK_PLAY_ANIM_SECONDARY:
  15.             this->CollectParameters(6);
  16.             break;
  17.         case COMMAND_TASK_PLAY_ANIM_NON_INTERRUPTABLE:
  18.             interruptable = false;
  19.             this->CollectParameters(6);
  20.             break;
  21.         case COMMAND_TASK_PLAY_ANIM_WITH_FLAGS:
  22.             this->CollectParameters(8);
  23.             interruptable = ScriptParams[6].i != 0;
  24.             lockZ = ScriptParams[7].i != 0;
  25.             break;
  26.     }
  27.    
  28.     float frameDelta = ScriptParams[0].f;
  29.     int loop = ScriptParams[1].i;
  30.     int lockLastX = ScriptParams[2].i;
  31.     int lockLastY = ScriptParams[3].i;
  32.     int lockLastFrame = ScriptParams[4].i;
  33.     int time = ScriptParams[5].i;
  34.    
  35.     int flags = 0x10;
  36.     if (loop || time > 0 && !lockLastFrame)
  37.         flags = 0x12;
  38.     if (lockLastX)
  39.         flags |= 0x40;
  40.     if (lockLastY)
  41.         flags |= 0x80;
  42.     if (!lockLastFrame)
  43.         flags |= 8;
  44.     if (opcodeId == COMMAND_TASK_PLAY_ANIM_SECONDARY)
  45.         flags |= 0x400;
  46.    
  47.     bool isActiveSequence = false;
  48.     if (CTaskSequences::ms_iActiveSequence >= 0)
  49.         isActiveSequence = true;
  50.    
  51.     CTaskSimpleRunNamedAnim *taskAnim = new CTaskSimpleRunNamedAnim(animName, fileName, flags, frameDelta, time, !interruptable, isActiveSequence, lockZ, 0);
  52.    
  53.     if (opcodeId == COMMAND_TASK_PLAY_ANIM_SECONDARY) {
  54.         CTaskSimpleAffectSecondaryBehaviour *affectSecondaryBehaviour = new CTaskSimpleAffectSecondaryBehaviour(1, 4, taskAnim);
  55.        
  56.     this->GivePedScriptedTask(pedHandle, taskAnim, opcodeId);
  57. }

5
Программирование / Vice City Plugin SDK
« : Июнь 24, 2016, 06:15:49 pm »
Это тема для новостей о plugin-sdk для Vice City.
https://github.com/DK22Pac/plugin-sdk

24.06.2016 Первая версия SDK. Пока что реализовано очень мало.

6
В этой статье я опишу создание плагина для GTA. Основное внимание уделю созданию и настройке проекта.
Я использую Visual Studio 2017. В открытом доступе есть Community версия этого продукта. Впрочем, найти Pro или Enterprise версию тоже не сложно.
Ах, да... Что требуется от вас:
-Наличие игры
-Умение писать код (если вы до этого не занимались скриптингом - возможно, лучше стоит начать с него)
-Базовые знания C/C++ (хотя, можно и без этого, как я в своё время  :P)
-Желание познавать и... время.


Напомню, что ASI-плагин - это динамическая библиотека с расширением .asi, которая подгружается (ASI-Loader'ом) и прикрепляется к процессу игры.
Итак, поехали.

Инструкция

7
Моды / vice-37
« : Июль 19, 2015, 11:42:31 am »
Проект портирования Vice City на новую версию движка RenderWare - 3.7.0.2
https://github.com/DK22Pac/vice-37

На данный момент присутствуют баги, главный из которых - некорректное отображение заскиненных моделей.

8
Программирование / Последняя база gta_vc.idb
« : Апрель 08, 2014, 03:09:36 am »
Выкладываю немного обновлённую базу. Обновлены классы CTxdStore, CSprite2d, немного CPed.
https://www.mediafire.com/?5ikpe9156r0rhu2

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