Перейти к содержимому

Как создать мод для любой игры

  • автор:

Как создать мод для любой игры

"Как создать (сделать) мод на (для) сталкер?", "учебник сталкерского модостроения", "основы модостроения", "гайд по созданию модов сталкер" — эти и другие поисковые запросы, связанные со всевозможными гайдами по модостроению, предположительно, присутствуют в истории вашего браузера, если вы сейчас читаете данное руководство. И, предположительно, вы новичок в модостроении и полны энтузиазма и желания постичь сталкерский модострой, чтобы своими руками создать "сталкер мечты".

Что же, если вы волею судьбы (или силами своего поисковика) попали на данное руководство, то, надеюсь, оно станет для вас исчерпывающим. Особенность же данного гайда по модостроению в том, что он является динамическим — руководство будет постоянно дорабатываться и обновляться, а при помощи общения в комментариях вы сможете напрямую повлиять на структуру гайда, скорость его пополнения и, самое главное, получить ответы на все свои вопросы.

Крайне рекомендуется добавить руководство в "избранное" и следить за обновлениями!

8
2
1
4
2
2
1
1

3,470 уникальных посетителей
379 добавили в избранное

Итак, с чего же начинается сталкерское модостроение? Естественно, с папки "gamedata", которая является основой любого любительского мода. Но простое создание данной папки в корне игры ничего не принесет, так как для модостроения нужны файлы, достать которые можно двумя путями: либо взять за основу любую другую модификацию, либо использовать файлы оригинальной игры. И, так как редактирование сторонней модификации будет скорее модификацией модификации, а не собственноручно созданным модом, то мы за основу модифицирования возьмем оригинальные файлы игры.

Но, соответственно, появляется вопрос, как разархивировать файлы gamedata в оригинальной игре, если они используют формат db0 — dbd? Ответ прост — необходимо воспользоваться специальной программой, открывающей путь в сталкерское модостроение. Но абы какая версия программы не подойдет. В отличие от пиратских версий "Сталкер: Тень Чернобыля", лицензионная Steam-версия игры не поддается разархивированию типичными программами-арихваторами.

Поэтому специально для вас я выкладываю правильную версию архиватора, при помощи которой можно разархивировать файлы лицензионного Steam-издания S.T.A.L.K.E.R.: Тень Чернобыля. Скачать программу вы сможете по ссылке ниже:
Google:
https:// drive.google.com /file/d/1qpX3UNQEuxPqV-10XAMGVM0XPYTrwt4b/view?usp=sharing
Яндекс:
https:// disk.yandex.ru /d/NK1Flan2aIOfCw
(пробелы убрать, копировать — вставить в поисковую строку, чтобы Steam не ругался)

Можете не беспокоиться, архив без вирусов. По сути, вы также можете распаковать пиратскую версию S.T.A.L.K.E.R.: Тень Чернобыля любым другим анпакером, благо, их достаточно много в интернете, но зачем тратить свое время и место на жестком диске, когда проще распаковать лицензию?

Стоит обратить внимание, данная программка тестировалась лишь на Steam-версии S.T.A.L.K.E.R.: Тень Чернобыля. Пиратские версии, а также версия игры для GOG не проходили тестирование.

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

В этой же программе вы указываете путь к корневой папке со сталкером и от туда начинаете разархивировать файлы gamedata.

Вы просто выбираете нужный файл gamedata и нажимаете кнопку "открыть". Далее архиватор вам предложит выбрать место хранения файлов. Я рекомендую разархивировать файлы в отдельную папку на рабочем столе. Себе же для удобства я разархивировал каждую "геймдату" в отдельную папку. Зачем? Вы узнаете далее.

Теперь, когда вы научились разархивировать файлы игры оригинальной лицензионной Steam-версии S.T.A.L.K.E.R.: Тень Чернобыля, возникает вопрос — какие именно файлы gamedata необходимо разархивировать для создания того или иного мода?

Итак, если поштучно разархивировать все файлы gamedata db0 — dbd, то на это уйдет крайне много времени. Куда проще разобраться, какие файлы из gamedata db0 — dbd вам действительно нужны для создания собственной модификации.

Предлагаю выяснить, какие файлы таятся в каждом архиве gamedata db0 — dbd.

gamedata.db0 — папка ai (в ней содержатся файлы типа .efd, отвечающие за искусственный интеллект),папка anims (игровая анимация, а также эффекты камеры), папка config (игровые параметры), папка levels (локации).

gamedata.db1 — папка levels (локации).

gamedata.db2 — папка levels (локации).

gamedata.db3 — папка levels (локации).

gamedata.db4 — папка levels (локации), папка meshes (игровые модели, в формате .ogf),
папка scripts (скрипты), папка shaders (шейдеры, для двух DX8 и 9), папка sounds (звуки и музыка, формат .ogg).

gamedata.db5 — папка sounds (звуки и музыка, формат .ogg), папка textures (текстуры домов, оружия, монстров и др. Формат — .dds).

gamedata.db6 — папка textures (текстуры домов, оружия, монстров и др. Формат — .dds).

gamedata.db7 — папка textures (текстуры домов, оружия, монстров и др. Формат — .dds).

gamedata.db8 — папка spawns (респаун NPC), папка textures (текстуры домов, оружия, монстров и др. Формат — .dds).

gamedata.db9 — папка config (игровые параметры), папка sounds (звуки и музыка, формат .ogg) (именно в этих звуках содержатся сценарий. ).

gamedata.dba — папка config (игровые параметры), папка scripts (скрипты), папка shaders (шейдеры, для двух DX8 и 9), папка spawns (респаун NPC).

gamedata.dbb — папка config (игровые параметры), папка levels (локации), папка scripts (скрипты), папка shaders (шейдеры, для двух DX8 и 9), папка spawns (респаун NPC), папка textures (текстуры домов, оружия, монстров и др. Формат — .dds).

gamedata.dbс — папка config (игровые параметры), папка scripts (скрипты).

gamedata.dbd — папка config (игровые параметры), папка scripts (скрипты).

Для создания простой любительской модификации совсем не обязательно распаковывать все файлы gamedata db0 — dbd. Вам достаточно распаковать какие-то отдельные файлы, которые будет задействовать ваша модификация. Например, если вы хотите всего лишь поменять параметры предметов и оружия в игре, вам достаточно лишь распаковать файлы, содержащие папки config.

Для 90% любительских модификаций будет достаточно распакованного gamedata.db0.

Предположим, что вы не имеете никакого опыта в простейшем модостроении и еще не разобрались с файлами и папками. Для начала стоит разобраться с простейшими параметрами, которые бы вы, предположительно, хотели изменить в игре. Вот самая простая навигация для новичков лишь по одной папке Config.

По отдельным файлам
Оружие — папка Config/Weapons (конфиги пушек вы сможете отыскать, разархивировав gamedata.db0).
NPC — папка Config/Сreatures (параметры NPC вы сможете отыскать, разархивировав gamedata.db0). Обратите внимание, что в данной папке находятся и параметры главного героя — файл actor.ltx.
Игровые предметы — папка Config/Misc (станет доступна при разархивации той же gamedata.db0). Свойства патронов находятся в файле weapons.ltx, а бронежилетов – в outfit.ltx.
Свойства артефактов находятся в файле artefacts.ltx, предметов – items. ltx.

По параметрам

Основные параметры оружия, например, w_ak74.ltx
ammo_mag_size – размер магазина (можно поставить хоть 999).
ammo_class – класс патронов, используемых оружием.
hit_power – мощность оружия. Чем больше, тем лучше.
silencer_hit_power — мощность оружия, когда на него надет глушитель.
misfire_probability — вероятность осечки при максимальном износе (0 ставить не рекомендуется!).
condition_shot_dec — увеличение износа при каждом выстреле (0 ставить не рекомендуется!).
zoom_enabled — можно ли целиться (true / false).

Основные параметры NPC, например, actor.ltx
max_walk_weight — максимальный вес, при достижении которого игрок перестает двигаться.
pickup_info_radius – радиус от ГГ, в котором над предметами выводятся их названия.
camera_height_factor – высота ГГ. По умолчанию стоит 0.85, но можно увеличить рост ГГ до 0.95 например.
disp_base – разброс при стрельбе. Если уменьшать, то и разлёт уменьшается соответственно.
wound_incarnation_v — скорость заживления раны.
cant_sprint_power_begin — порог силы, меньше которого актер не может бежать в спринте.
hit_probability_gd_novice, hit_probability_gd_stalker, hit_probability_gd_veteran, hit_probability_gd_master — эти строчки отвечают за вероятность попадания по вам, при игре на разных уровнях сложности.

Некоторые параметры из System.ltx (папка Config)
start_blood_size — размер раны, при наличии которой начинает литься кровь.
stop_blood_size — размер раны, при которой кровотечение останавливается.
max_weight – вес, с которым ГГ может бежать.

Некоторые параметры артефактов
health_restore_speed — скорость восстановления здоровья (0.0001 = +100%)
radiation_restore_speed — скорость накопления радиации (0.0004 = 4). Если поставить отрицательное значение, то артефакт будет ускорять выведение радиации.

Иммунитеты
strike_immunity — ударозащита.
shock_immunity — электрозащита.
chemical_burn_immunity — химзащита.
telepatic_immunity — сопротивление телеппатии.
radiation_immunity — сопротивление радиация.
wound_immunity — разрывозащита.
explosion_immunity — взрывозащита.
fire_wound_immunity — пулестойкость.

Некоторые параметры items.ltx
cost — цена.
eat_health — сколько восстанавливает здоровья.(если будет 0, то колбаса лечить не будет.)
eat_power — сколько восстанавливает силы.
inv_weight — вес предмета.

Параметры бронежелетов outfit.ltx
inv_weight – вес костюма.
cost – цена костюма.
burn_protection — коэффициент защиты от огня
strike_protection — коэффициент защиты от пуль
shock_protection — коэффициент защиты от молний
radiation_protection — коэффициент защиты от радиации
telepatic_protection — коэффициент защиты от телепатии
chemical_burn_protection — коэффициент защиты от хим. ожогов.
explosion_protection — коэффициент защиты от взрыва.
(коэффициенты выставляются от 0.0 до 1)

Вот самые основные параметры, изменения которых помогут вам в создании простейших модификаций.

Для того, чтобы реализовать в игре модификацию, вам потребуется создать папку gamedata в корневой папке игры.

Далее, допустим, я хочу модифицировать главного героя, работая в файле actor.ltx.
Он расположен по пути config\creatures, соответственно, в папке gamedata я создаю папку config, с ней создаю папку creatures. В данную папку я закидываю файл actor.ltx.

Файл actor.ltx открывается при помощи блокнота (notepad).

В файл я вношу некоторые изменения, самые простейшие и наглядные.

После этого внесенные изменения сохраняются. Игру можно будет запустить сразу.

Категорически рекомендуется начать новую игру.

Как визуально улучшить картинку в игре? Как изменить (поменять) текстуры? При помощи каких программ работать с текстурами? На этот и все другие вопросы, связанные с текстурированием и визуализацией вы найдете ответы в текущей главе гайда по модостроению в сталкере ТЧ.

Итак, перерисовать текстуры в сталкере достаточно просто. Причем, перерисовать можно абсолютно все текстуры в игре, начиная от стен и оружия, заканчивая текстурой старого скряги Сидоровича. Если вы хотите начать работать с текстурами, вам потребуется либо программа Photoshop (желательно CS6) с установленным плагином для работы с DDS, либо же можно обойтись и простым Paint.net, являющимся абсолютно бесплатным, но, тем не менее, его возможности позволяют работать с DDS без помощи сторонних плагинов.

Я же предпочитаю работать в программе Photoshop CS6, потому что его инструментарий и работа со слоями мне ближе, чем функционал Paint.net.

Допустим, вы обзавелись одной из программ. Далее для работы с текстурами вам понадобится папка textures. Из предыдущих глав гайда вы уже должны понимать, где при разархивации будет находиться данная папка.

Итак, в папке textures содержится крайне много папок, вот, что вы сможете найти в каждой из них:
папка act — в ней находятся текстуры всех NPC, представленных в игре. Как тела и лица людей, так и текстуры мутантов целиком. В этой папке можно найти даже вырезанных из игры персонажей;

папка andy — для начинающего мододела интереса не представляет;
папка atifact — соответственно, в ней находятся текстуры артефактов;
папка car — машины в этой папке не найти, но в ней есть ролик из начальной заставки (грузовик смерти);
папка controller — различные эффекты контроллера, вырезанные, для начинающего мододела интереса не представляет;
папка corp — соответственно, в этой папке находятся текстуры мертвых тел. Можно поразвлечься!
папка crete — черепица, напольные покрытия;
папка det — растения и листва;
папка detail — текстуры земли, травы и других поверхностей;
папка door — двери и дверные проемы;
папка ed — не особо полезна в моддинге;
папка effects — в ней находятся некоторые эффекты;
папка fbr — напольные покрытия;
папка flare — ничего особенного для начинающих;
папка fronts — что-то вроде шрифтов, в 99% случаев бесполезно;
папка FX — а это уже интересно! Тут находятся различные эффекты, такие как горение костра, свечение, луна. Но самое интересное для начинающего — это кадры из телевизора. Допустим, вам ничего не мешает заставить Сидора или военных смотреть ВВП, кадры с которым вам никто не мешает нарезать!
папка glas — оконные стекла, может быть полезна при создании витражей в Припяти!
папка glow — glow эффекты, быть может, кому-то и пригодится;
папка gr — обрывки фотографий, доски, дальние окна, плитки, балконы;
папка grnd — различная земля, песок;
папка hud — элементы hud;
папка human — вырезанный изуродованный человек (по этическим причинам?);
папка icon — билдовские иконки оружия (в том числе и вырезанные);
папка internal — узор свечения фонаря;
папка интро — в ней находятся несколько роликов, которые вы можете увидеть в игре;
папка item — текстуры предметов, как существующих в игре, так и вырезанных;
папка jeffry — эффект расколотой маски противогаза, вырезан из игры;
папка level
папка lights — эффекты свечения фонариков NPC;
папка map — карты из PDA, в том числе и вырезанных местностей;
папка mtl — металлические поверхности и бочки;
папка pda — эффекты из КПК игрока;
папка pfx — эффекты артефактов, в том числе и вырезанных;
папка prop — разные мелочи, в основном вырезанные из игры, много интересного для исследователя, но не для модера, пример:

папка sign — различные знаки и значки (дорожные, доски объявлений и тд);
папка sky — текстуры неба, очень качественные;
папка sleep — в ней находятся сны, которые могли бы сниться меченному. Как видео, так и текстуры;
папка ston — плитка, стены, камни;
папка temp — разное, вырезанное. Не представляет особого интереса;
папка terrain — карты местностей с грубыми пометками, не имею возможности представить, как это использовть;
папка tree — ветка дерева и "fuflo", как пометил разработчик;
папка trees — все, что связано с природой и деревьями;
папка ui — очень важная папка, в которой содержатся текстуры меню, текстуры заставки, текстуры элементов hud, текстуры иконок (портретов) всех сталкеров и мутантов, фотокарточки, которые можно найти в PDA, иконки (модельки) оружия из инвентаря. Обратить внимание на данную папку категорически приветствуется.
папка veh — в ней содержится текстуры, связанные с транспортными средствами — от машин до поездов и прицепов;
папка water — текстуры воды, которой в игре категорически мало;
папка wind — окна и дальние объекты. Пригодится при редактировании Припяти;
папка wm — значки, текстурная кровь, газеты, плакаты, пулевые отверстия;
папка wood — все, что связано с деревом (заборы, полы, паркет);
папка wpn — все, что связано с оружием (от патронов и пушек до разметки прицела);

На этом папки закончились. Но у вас, собственно, возникает вопрос, а каким образом рисовать новые текстуры? А я вам скажу — берете и рисуете, все в ваших руках. Можете хоть измалевать все кисть. в пэинте, такой же эффект вы получите в игре. Единственное, рекомендую изучить в фотошопе такой инструмент, как печать, чтобы у вас выходила не мазня красками, а вы брали фото и натурально переделывали текстуру задавая ей фотореалистичный вид. Таким образом, например, можно покрыть проклятого Сидора г@вном. Но я вам об этом не говорил.

Сохраняете текстуры вы, естественно, в формате DDS. Если пользуетесь плагином для Photoshop, то советую оставлять в настройках Nvidia все как есть.

Если будут вопросы — задавайте их прямо в комментариях.

Как изменить имя главного героя игры (Меченого)?

Имя ГГ, в отличие от имен остальных NPC, изменяется в файле character_desc_general, формата .xml, который редактируется блокнотом, либо же через Notepad++. Стоит запомнить, что все, что связанно с текстовыми правками, редактируется либо через блокнот, либо через Notepad++, последний вариант более предпочтительный, так как, на мой взгляд, более удобный.

Изменяем непосредственно поле name, между "><" пишем, что хотим. Пробел, символы и цифры, а также латиницу в названии использовать можно.

Если вы ранее распаковали файлы gamedata так, как я посоветовал, то файл с именем ГГ стоит искать по пути: dbb\config\gameplay

Как изменить имена ключевых NPC?

Нас теперь интересует файл stable_bio_name, в нем находятся имена ключевых NPC в игре. Все текстовые изменения в игре делаются в папке rus, конкретно этот файл стоит искать по пути db9\config\text\rus, если вы ранее, опять же, распаковали gamedata так, как я просил.

Допустим, что необходимо изменить имя известного персонажа Волка, для этого стоит найти строку <text>Волк</text>, а за место имени Волк между "><" вписываем что угодно. Вопрос: "Как переименовать Сидоровича в П*доровича?", относится к этой же категории, торговец есть в этом же файле, стоит только поискать (ctrl+f).

Как переименовать мутантов?

Чтобы переименовать мутантов, ищем файл string_table_enc_mutants, который расположен по пути db9\config\text\rus.

Допустим, необходимо изменить название плоти. Ищем строку: <text>"Плоть"</text>, между "><" вписываем что угодно.

Как изменить имена случайных сталкеров / бандитов / монолитовцев и прочих NPC?

Чтобы изменять имена персонажей в игре, вам понадобятся два файла: stable_generate_fnames и stable_generate_snames. Следовательно, первый файл отвечает за имя, во втором файле записана кличка. В игре имена NPC генерируются случайным сочетанием имени и клички.

К слову, оба файла расположены по пути db9\config\text\rus.

Допустим, нам необходимо изменить кличку бандита ищем следующую форму:

В первой строке "lname_bandit_0" означает, что кличка свойственна бандитам из игры, а строка <text>Сивый</text> означает, как не сложно догадаться, кличку. Изменяем, как обычно, то, что вписано между "<text></text>", вписываем прямо между "><" без пробелов и прочего.

Итак, прошло более года с тех пор, как я занялся обучением модостроению фанатское сообщество STALKER. Даже второй сталкач успели анонсировать, а работа над манускриптом до сих пор не завершена. Что же. Надеюсь, что за год вы освоили предыдущие уроки и готовы перейти к одному из самых интересных аспектов в модострое — озвучке и изменению звуков в игре.

Как мы помним из начальных уроков, есть несколько архивов, где хранятся звуки игры. Произведем замену звуков на примере gamedata.db9, так как в ней хранятся сюжетные диалоги и старая озвучка для, скажем так, Жабы и прочих. Допустим, изменим вступительный диалог Сидоровича, который расположен по пути sounds\characters_voice\scenario\trader, файл trader_monolog1.

Давайте допустим, что у вас имеется звуковая дорожка. Если вы умеете работать со скриптами, то ее длина значения не имеет, если вы пока еще не разбираетесь в скриптах, то желательно делать дорожку до

30 секунд, так как потом она прервется другим звуковым файлом.

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

Частоту выставляем в 441100 Hz.
Пишем в МОНО. Либо, если ваш файл в стерео, переводим его в моно, как это сделать — все зависит от редактора, гуглите.

Что обязательно при сохранении?
Формат должен быть "OGG". Далее, при сохранении, вы пишите исполнителя и оставляете комментарий (везде должно быть более 25 символов, исполнителя лучше без пробелов (как и комментарий), можете на русском, хотя кому вообще это будет надо?)

Далее самое важное!
МАТЬ

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

Google:
https ://drive.google. com/file/d/126NJ8h9duJua6uDAKWn4LX9npg3Sou2-/view?usp=sharing

Яндекс:
https:// //disk.yandex. ru/d/kYuX-KkyJgSoaQ
Далее, значит, кидаем наш файл и файл оригинальной озвучки деда на ярлык этой самой программы. У вас выйдет 2 окна. В окне вашего файла вы должны изменить параметры так, как они есть в оригинальном аудио-файле. Для этого вводите все так, как показано на скриншоте, думаю, что с другими файлами алгоритм будет понятен (за мат извините).

Необходимый файл — ‘treasure_manager.script’

Ищем в нем поле: —‘ Юзание инициатора (возможность выдать тайник)

Пишем следующие и у вас должно выйти вот так:

Далее создаем файл lootmoney.script (копируем любой скрипт, переименовываем его в lootmoney и убираем там все строки); прописываем в нем следующее:

Теперь у трупов ваших врагов всегда в кармане будет пара шекелей)

И так, дорогие друзья, данный раздел руководства посвящен тому, без чего не обходится ни один глобальный мод на Тень Чернобыля. Я подробно объясню вам, как установить X-Ray SDK 0.4 и выложу подробнейшую инструкцию о работе с X-Ray SDK 0.4. Вы наконец-то сможете войти в глобальное построение модов и узнаете, как менять локации, тайники, перетащить Сидоровича и, быть может, даже отстрелить ему его жирный зад (но это не точно).

Одно важное "но": не смотрите Ютубы в поисках быстрого ответа на вопросы "от чайников". Прочитайте все, что содержится в текстовых документах — это истинная "библия модостроения". Никогда не ищите более легких путей и следуйте лишь тому, что написано в "манускриптах" — это наиболее верный путь к познанию сталкерского модостроения. Любые пересказы не являются истиной, так как в зависимости от интерпретации информация несколько искажается.

Выкладываю несколько файлов, которые вам необходимо скачать.

https:// /disk.yandex.ru /d/sSRf61oYNm6hfQ — огромная наиболее полная энциклопедия с ранжированным содержанием о работе с X-Ray SDK 0.4

https:// /docs.google .com/document/d/1vPEl5mIS6hzToYjTQXN7POYvU5d-3ZtO/edit?usp=sharing&ouid=113434208506919223576&rtpof=true&sd=true — огромная наиболее полная энциклопедия с ранжированным содержанием о работе с X-Ray SDK 0.4

Заветная ссылка на единственный в сети рабочий X-Ray SDK 0.4, оптимизированный под windows 10 x64, простейшая установка без танцев с бубном:
https:// //disk.yandex .ru/d/s1PW0FyY_BG2aQ

Друзья! Гайд будет изменяться и пополняться со временем. К сожалению, мое время не бесконечно и я не могу постоянно заниматься пополнением руководства. Чем больше читателей оценят проделанную работу, тем скорее выйдет продолжение гайда. Планируется дополнять руководство новыми материалами либо каждую неделю, либо раз в две недели, но, запомните, что все зависит только от вашей активности!

Для самостоятельного изучения модостроения выкладываю матчасть:

Google:
https://drive.google .com /file/d/1an5DwUg1dTqxobr3xwW97JQD1RE46hDi/view?usp=sharing

Яндекс:
https:// /disk.yandex .ru/d/x3dPeouIduhiTA

Друзья, рекомендую опробовать ремастер Тени Чернобыля — Shadow Of Chernobyl Update. Модификация имеет великолепную стабильность, красивейшую графику и очень качественный пак оружия. Все вырезанные мутанты восстановлены — все сделано по канону, атмосфера остается той самой.

Гайд, как поставить модификацию на Steam-версию и играть со всеми возможностями Steam:

Оценка и активность в других материалах также поспособствует активному пополнению руководства!

Друзья, если вам интересны краткие, но качественные обзоры на игры (и не только), советую вступить в мою группу, чтобы поддержать меня в роли начинающего куратора!

Как разрабатываются моды для игр, которые не поддерживают моды (на примере Beat Saber) — часть 1: внедряемся в код игры

Простым языком о dll-файлах, Unity, Mono, паре хакерских методов и о крутости open-source-сообщества.

Я довольно много играю в Beat Saber с модами, и в какой-то момент появилась необходимость написать свои. Beat Saber сделан на Unity, так что я покопался в его коде, в коде существующих модов, разобрался, как там всё устроено, и написал об этом лонгрид.

Получилось довольно много материала, так что я разбил его на две части. В этой части мы рассмотрим, как сделать так, чтобы игра запускала сторонние моды, а во второй — напишем свой собственный. Не смотря на то, что в этом лонге я местами закапываюсь в технические дебри, рассчитан он на широкую аудиторию.

Моей задачей было показать, как глубоко может залезть инженерная мысль, чтобы добавить в игру что-то новое. Я старался объяснять всё, что может показаться сложным человеку далекому от программирования, но если почувствуете, что что-то совсем непонятно, не бойтесь задавать вопросы.

Если у вас есть VR-шлем, то вы почти наверняка знаете, что такое Beat Saber. Если нет, то, вероятно, вы видели хотя бы одно видео из игры.

Единственное, что Beat Saber поддерживает из модов — это пользовательские уровни. В игре есть официальный редактор, но нет никакого сервиса, чтобы как-либо распространять свои творения (даже мастерской Steam), и вряд ли появится. В основе практически любого уровня лежит какая-то песня. Разрешить выкладывать такие файлы в своем официальном сервисе — значит привлечь к себе внимание правообладателей с их постоянными запросами что-то удалить, а то и вообще с требованиями всё закрыть.

Поэтому не удивительно, что вокруг Beat Saber сформировалось огромное сообщество: Beat Saber Modding Group (BSMG). Именно сообщество ответственно за большую часть того, что есть в игре.

    — коллекция пользовательских уровней, созданных с помощью официального или неофициальных редакторов. Сюда добавляются десятки уровней каждый день. — сайт, главная задача которого — помочь найти что-то хорошее среди того, что появляется на https://beatsaver.com. Здесь есть рекомендации кураторов, топы за неделю, поиск по музыкальным жанрам и многое другое.
    — таблицы лидеров для пользовательских уровней.
    — модели мечей, платформ и аватаров. Тут хранится визуальный 3D-контент, не содержащий дополнительного кода.
    — коллекция модов, модифицирующих код игры.
    — ModAssistant, программа для установки модов. Игрок просто выбирает моды, которые ему нужны, и жмет Install. Не нужно даже вручную копировать файлы.

Всё это поддерживается сообществом. Большинство модов и даже сами сайты — это проекты с открытым исходным кодом, их можно найти на GitHub — сайте, где программисты выкладывают свой код. Этим мы и воспользуемся дальше.

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

Исполняемый файл (executable) — это файл, который содержит код в понятном для компьютера виде — в виде набора инструкций процессора. В большинстве случаев в Windows это файлы с расширением .exe. Исполняемые файлы, внезапно, могут исполняться — у них есть точка входа (entry point) и набор подпрограмм (они же процедуры, функции, методы).

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

Файлы .dll — это файлы динамических библиотек (dynamic link library). По своей сути и структуре они очень похожи на исполняемые файлы, но у них нет точки входа. Это просто наборы подпрограмм, которые загружаются в память вместе с exe-файлом и могут использоваться процессором.

У таких библиотек есть много преимуществ. Одну такую библиотеку могут использовать несколько программ одновременно: достаточно один раз загрузить её в память, и она станет доступна сразу для всех. Или при определённых условиях программе может вообще не понадобиться какая-то библиотека, и тогда её можно не загружать в память (потому они и называются «динамические»).

Также такие библиотеки могут поставляться другими разработчиками. Если вы когда-нибудь при запуске игры видели сообщение, что вам нужно дополнительно установить Microsoft Visual C++ Redistributable 2015, то знайте — это как раз оно и есть.

Помимо простых .dll существуют ещё так называемые сборки с управляемым кодом .NET (managed .NET assemblies). Это тоже dll-файлы, но они содержат не команды процессора, а команды промежуточного языка (Common Intermediate Language, CIL или иногда просто IL).

Процессоры не знают, что такое CIL, они не могут выполнять такие инструкции сами по себе. Для этого Windows запускает отдельную программу, которая на ходу переводит CIL-команды в инструкции, понятные процессору. Такой процесс называется компиляцией на ходу (just-in-time compilation, JIT), а программа, которая это делает — «общеязыковая исполняющая среда» (Common Language Runtime, CLR). Есть много языков, программы на которых собираются в такие сборки, но самым известным и популярным является C# (именно он используется в Unity).

Есть разные реализации Common Language Runtime. По сути это просто стандарт, и кто угодно может написать свою версию. Популярных версий всего три:

  • .NET Framework — основная платформа, с неё и пошли все эти C#, CIL и CLR. Разрабатывается Microsoft c 1999 года, работает под Windows. Считается, что .NET Framework появился как ответ Java, набирающей популярность в то время.
  • .NET Core — платформа с открытым исходным кодом, тоже разрабатывается Microsoft, но уже под разные платформы: Windows, Linux и macOS. Разрабатывается с 2014 года. Судя по всему, является попыткой Microsoft охватить серверы, работающие на Linux.
  • Mono — ещё одна платформа с открытым исходным кодом, работает на Windows, Linux, macOS, мобилках и консолях. Используется в Unity. Разрабатывается с 2001 года компанией Ximian, которую в 2003 купила компания Novell, которую в 2011 купила Attachmate. Attachmate поуволняла всех, но разработчики Mono хотели и дальше разрабатывать Mono, поэтому организовали в том же году отдельную компанию Xamarin, которую в 2016 купили Microsoft.

Таким образом, все основные реализации CLR сейчас находятся под крылом Microsoft. Однако некоторое время назад титул «корпорации добра» перешел от Google к Microsoft, так что не факт, что это плохо.

На этом с ликбезом пока достаточно, пора переходить к основной теме. Программные моды (также известные как плагины) — это dll-файлы, которые добавляются к игре и загружаются в память вместе с ней. Проблема в том, что Beat Saber не поддерживает сторонние плагины и сам по себе ничего загружать и использовать не собирается. Значит, нам нужно что-то, что внедрится в код игры и научит её это делать. Этим чем-то является BSIPA.

BSIPA (Beat Saber Illusion Plugin Architecture) — это набор библиотек, которые модифицируют файлы Beat Saber так, чтобы игра могла загружать сторонние моды. Иногда такие библиотеки называют менеджерами плагинов.

Небольшое лирическое отступление. Для того, чтобы мне было проще объяснять некоторые вещи, мне нужно объяснить значение слова «форк».

Разработка программ с открытым исходным кодом (open source) — это явление, которое оказывает колоссальный эффект на развитие технологий. Разработчики пишут программы, выкладывают их исходный код со свободной лицензией, например, на GitHub, а другие разработчики могут свободно использовать эти программы, предлагать определённые улучшения для существующих программ (пул реквесты, pull requests) или вообще копировать другие проекты и делать что-то свое на их основе. Последнее как раз и называется «форком» (fork, переводится буквально как «вилка», «развилка», «ответвление»).

Так вот, BSIPA (написана на C#, исходный код: GitHub) является форком IPA (GitHub). Т.е. моддеры взяли уже существующий менеджер плагинов для Unity и улучшили его специально под нужды Beat Saber. Давайте залезем в исходный код, чтобы понять, как оно всё работает. Я выделяю там три основных модуля: IPA, IPA.Loader и IPA.Injector. На самом деле их больше, но остальные не так важны.

Обычно игроки используют ModAssistant или его аналоги, чтобы устанавливать моды, но мы будем делать это вручную. Для этого нужно скачать последний релиз BSIPA, распаковать все файлы в папку с игрой и запустить IPA.exe. Это исполняемый файл, который копирует файлы из только что распакованного архива в те места, где они должны находиться. И это, в общем-то, всё, что он делает: просто копирует файлы, и если какой-то из файлов уже существует в игре, то он делает его резервную копию. Давайте посмотрим на список файлов.

Beat Saber_Data\Managed\I18N.dll

Beat Saber_Data\Managed\I18N.West.dll

Beat Saber_Data\Managed\IPA.Injector.dll

Beat Saber_Data\Managed\IPA.Injector.pdb

Beat Saber_Data\Managed\IPA.Loader.dll

Beat Saber_Data\Managed\IPA.Loader.pdb

Beat Saber_Data\Managed\IPA.Loader.xml

Beat Saber_Data\Managed\Microsoft.CSharp.dll

Beat Saber_Data\Managed\System.Runtime.Serialization.dll

Libs\0Harmony.1.2.0.1.dll

Libs\Ionic.Zip.1.9.1.8.dll

Libs\Mono.Cecil.0.10.4.0.dll

Libs\Mono.Cecil.Mdb.0.10.4.0.dll

Libs\Mono.Cecil.Pdb.0.10.4.0.dll

Libs\Mono.Cecil.Rocks.0.10.4.0.dll

Libs\Newtonsoft.Json.12.0.0.0.dll

Libs\SemVer.1.2.0.0.dll

winhttp.dll

Мы видим здесь ещё два модуля BSIPA, которые я упомянул ранее: IPA.Loader.dll и IPA.Injector.dll. Остальные библиотеки нужны, чтобы работали эти две. Некоторые из них мы ещё рассмотрим подробнее в этом лонге и во второй части.

Как следует из названия этого модуля, он отвечает за загрузку плагинов и управление ими. Здесь определен класс PluginComponent — компонент Unity, отвечающий за хранение модов и передачу им событий из игры. Например, если в основной игре сменилась активная сцена (мы запустили какой-то уровень или, наоборот, вернулись в главное меню), то PluginComponent пробегается по всем модам и сообщает им об этом. Подробнее об этом будет во второй части.

Название Injector намекает, что этот модуль отвечает за внедрение в оригинальную игру. Начнем с забавного факта: BSIPA добавляет в игру антипиратскую защиту.

Защита очень примитивная, никакого Denuvo, никакой виртуализации, она просто проверяет, есть ли в папке с игрой файлы, которые явно указывают на взлом: SmartSteamEmu.ini, BSteam crack.dll, huhuvr_steam_api64.dll и другие. Скорее всего, BSIPA это нужно из практических интересов. Внедрение в код игры и добавление туда модов — это по своей сути взлом. Если игра ещё и пиратская, то получается, что она взломана дважды, а совместная работа двух взломов не гарантируется.

В IPA.Injector используется сторонняя библиотека Mono.Cecil (исходный код: GitHub). Её автор: Jb Evain, когда-то работал в Novell над разработкой Mono, сейчас работает в Microsoft, руководит разработкой Visual Studio Tools for Unity. Mono.Cecil существует с 2004 года — примерно со времен релиза первой версии Mono.

Она позволяет читать и модернизировать .NET-сборки. То есть с её помощью можно менять различные параметры C#-библиотек или даже редактировать код, который в них записан. Здесь нет ничего особо сложного: Mono.Cecil редактирует файлы dll примерно как Microsoft Office редактирует файлы docx — нужно просто знать структуру файла, что как прочитать и что куда записать. Я не умаляю заслуг Jb Evain, если что. Библиотека всё ещё очень сложная и полезная, просто со стороны её изучать не так интересно.

И раз я уже не первый раз упомянул Mono в этом лонге, то надо написать про него чуть подробнее. Я уже писал в начале, что Mono — это одна из реализаций Common Language Runtime — программы, которая нужна, чтобы запускать код из управляемых сборок .NET. Если говорить проще и про наш конкретный случай, Mono нужен для того, чтобы в Unity можно было писать код на C#. Ядро движка Unity написано на C++, но некоторые части движка и практически все скрипты разрабатываемых на нем игр пишутся на C#. Когда мы запускаем игру, то сначала загружается C++ код. Этот код запускает Mono, передает в него C#-код движка и код игры, и после этого сама игра начинает работать — можно играть.

С помощью Mono.Cecil IPA.Injector редактирует библиотеку UnityEngine.CoreModule.dll. Как видно из названия, это одна из библиотек Unity. Она написана на C# (иначе бы мы не смогли её редактировать) и содержит базовые сущности движка. Например, там есть класс GameObject — все объекты в игре, которые располагаются на игровых сценах, являются объектами этого класса.

Ещё там есть класс MonoBehaviour — это класс для компонентов с игровой логикой (тут Mono даже в название класса затесался). IPA.Injector находит в библиотеке UnityEngine.CoreModule.dll класс UnityEngine.Application и модифицирует его статический конструктор (или создает, если его нет), добавляя туда код из IPA.Loader. Не буду углубляться в то, что такое статический конструктор, но теперь, когда загружается класс Application, у нас создаётся PluginComponent и загружаются плагины из папки Plugins. Получается, что мы внедрились не в код Beat Saber, чтобы он загружал моды, а в код самого Unity.

Если бы у нас использовалась не BSIPA, а оригинальная IPA, то на этом можно было бы и остановиться. В оригинальной версии IPA.exe запускает Injector, модифицирует UnityEngine.CoreModule.dll, и у нас появляются моды в игре. У такого подхода есть один минус — каждый раз, когда оригинальная игра обновляется, нужно заново запускать IPA.exe и патчить игру.

Это может показаться не такой серьёзной проблемой, но видели бы вы, сколько жалоб поступает от игроков к разработчикам игры за то, что они очередным своим обновлением сломали их моды. BSIPA решает эту проблему, но как я писал выше, IPA.exe в BSIPA просто копирует файлы и не делает больше ничего. Тогда непонятно, кто же запускает Injector в этом случае? И тут начинается самое интересное.

Как оказалось, за внедрение в код Unity отвечает библиотека UnityDoorstop-BSIPA. Она лежит среди файлов BSIPA и написана на чистом C. UnityDoorstop-BSIPA (исходный код: GitHub) — это тоже форк, оригинальный проект можно найти здесь: GitHub. Далее для простоты буду вместо UnityDoorstop-BSIPA просто писать Doorstop. Лозунгом Doorstop является фраза «Run managed code before Unity does», что в примерном переводе звучит как «Запускай управляемый код до того, как Unity сможет это сделать».

Напомню, что «управляемый код» — это в нашем случае код C#. Выше мы уже выяснили, что ядро движка Unity написано на C++, а пользовательские скрипты для игровой логики и некоторые части самого Unity — на C#. Значит, Doorstop каким-то образом позволяет нам вмешаться в логику, когда ядро Unity уже загрузилось, а C#-скрипты — ещё нет.

Теперь уже лезем в исходники UnityDoorstop-BSIPA и смотрим, как это делается. Дальше идет немного более продвинутый уровень. Я постарался описать всё простыми словами, но при этом достаточно подробно, чтобы можно было оценить всю техническую глубину происходящей там магии.

Чтобы объяснить, как работает Doorstop, давайте вернёмся к нашим «основам информатики», которые уже перестают быть основами. Я уже писал выше, что исполняемые файлы могут использовать функции из других библиотек, переходя по адресам этих функций. Давайте уточним, откуда берутся эти адреса. В файлах .exe и .dll есть такие параметры как таблица импорта (Import Address Table, IAT) и таблица экспорта (Export Address Table, EAT). Импорт — это то, что требуется файлу из других библиотек, а экспорт — это то, что файл предоставляет для использования другим файлам. Очевидно, у .exe есть только импорт, потому что его никто использовать не может, а у .dll может быть и то, и другое, потому что они и сами что-то используют, и другим дают пользоваться.

Теперь вернемся к Unity и рассмотрим конкретный пример, который и подведет нас к тому, как работает Doorstop. Когда мы запускаем игру на Unity (например, Beat Saber.exe), то в память одной из первых загружается библиотека UnityPlayer.dll. Она прилагается ко всем Unity-играм и отвечает за запуск и выполнение самой игры. Всё указывает на то, что там как раз и есть код движка, написанный на C++, но я не проверял.

У этой библиотеки есть таблица импорта, в которой говорится, что UnityPlayer использует функцию GetProcAddress из библиотеки kernel32.dll. kernel32.dll — это системная библиотека ядра Windows, которая отвечает за базовые вещи, такие как управление памятью и ввод-вывод. Системные библиотеки — это библиотеки, которые нам дает Windows, они обычно хранятся в папке C:/Windows/System32.

GetProcAddress — это очень важная для нас функция, она даёт нам адрес какой-то функции из определенной библиотеки по её названию. Помните, в начале я писал, что dll-библиотеки называются динамическими, потому что их можно загружать по мере необходимости? Представим, что у нас есть библиотека HelloWorld.dll и в ней есть функция hello_world(). Тогда динамическая загрузка и вызов функции будут выглядеть примерно так:

Примерно такой же код есть и в UnityPlayer.dll. Напомню, что чтобы Unity мог запускать код на C#, ему нужно сначала запустить Common Language Runtime (чем в нашем случае является Mono). UnityPlayer делает что-то вроде этого:

mono_jit_init_version — это функция, которая отвечает за загрузку Mono. Возможно, вы уже догадались, что раз Doorstop вмешивается в запуск игры до того, как Unity запускает свой C#-код, то это должно быть как-то связано с этим Mono. Да, всё так. Делается это в два шага.

Когда библиотека Doorstop.dll загружается в память компьютера, она запускает свой код. Этот код находит в памяти уже загруженную библиотеку UnityPlayer.dll, берет её таблицу импорта, находит там GetProcAddress из kernel32.dll и заменяет её на нашу поддельную функцию GetProcAddress из Doorstop.dll. Поддельная функция GetProcAddress смотрит название функции, которую у неё запрашивают. Если это НЕ mono_jit_init_version, то поддельная GetProcAddress просто вызывает настоящую GetProcAddress и дает то, что у неё попросили, тем самым не мешая нормальной работе. Но если у неё запрашивают mono_jit_init_version, то тогда она возвращает поддельную mono_jit_init_version.

Поддельная mono_jit_init_version сначала вызывает настоящую mono_jit_init_version, чтобы загрузить Mono. Затем она с помощью этого Mono загружает и запускает библиотеку IPA.Injector.dll. Мы уже рассмотрели выше, что IPA.Injector содержит код, который внедряет плагины в Beat Saber. После того, как IPA.Injector завершает свою работу, поддельная mono_jit_init_version отдаёт Mono в Unity.

Unity даже не в состоянии понять, что что-то было не так. Если бы он вызвал настоящую mono_jit_init_version, то он бы получил Mono и начал бы дальше с ним работать. Если Unity запускает поддельную mono_jit_init_version, то он тоже получает Mono — он просто не в курсе, что этим Mono успели воспользоваться для чего-то ещё.

Всё работает именно так, как и написано в лозунге Doorstop: «Run managed code before Unity does». Мы запустили наш управляемый C#-код из IPA.Injector до того, как Unity смог запустить свой C#-код.

Небольшое лирическое отступление. Подмена адресов в таблице импорта — это один из методов хакерских взломов (подробнее тут (на английском): https://pentest.blog/offensive-iat-hooking/). Ещё один интересный факт: в коде UnityDoorstop-BSIPA я нашел благодарность ez (профиль на GitHub) за код, который модифицирует таблицу импорта. Это ещё один пример того, как сообщество совместно работает над решением технических задач и использует код друг друга.

Остался один нерешенный вопрос. Во-первых, в описании Doorstop я писал про библиотеку Doorstop.dll. Давайте опять взглянем на файлы, которые IPA.exe устанавливает в игру:

Beat Saber_Data\Managed\I18N.dll

Beat Saber_Data\Managed\I18N.West.dll

Beat Saber_Data\Managed\IPA.Injector.dll

Beat Saber_Data\Managed\IPA.Injector.pdb

Beat Saber_Data\Managed\IPA.Loader.dll

Beat Saber_Data\Managed\IPA.Loader.pdb

Beat Saber_Data\Managed\IPA.Loader.xml

Beat Saber_Data\Managed\Microsoft.CSharp.dll

Beat Saber_Data\Managed\System.Runtime.Serialization.dll

Libs\0Harmony.1.2.0.1.dll

Libs\Ionic.Zip.1.9.1.8.dll

Libs\Mono.Cecil.0.10.4.0.dll

Libs\Mono.Cecil.Mdb.0.10.4.0.dll

Libs\Mono.Cecil.Pdb.0.10.4.0.dll

Libs\Mono.Cecil.Rocks.0.10.4.0.dll

Libs\Newtonsoft.Json.12.0.0.0.dll

Libs\SemVer.1.2.0.0.dll

winhttp.dll

Как вы можете видеть, Doorstop.dll здесь нет. Во-вторых, даже если бы Doorstop.dll здесь был, то почему Beat Saber или Unity должны его загружать в память? Beat Saber.exe знает про UnityPlayer.dll, поэтому UnityPlayer.dll загружается. UnityPlayer.dll знает про kernel32.dll, поэтому kernel32.dll тоже загружается. Но про Doorstop.dll они ничего не знают и загружать не собираются, как быть?

Решение: прикинуться другой библиотекой, которую загружает Unity и сделать так, чтобы она загрузилась раньше настоящей (и это, кстати, ещё один метод, используемый в хакерских взломах наравне с манипуляциями в таблице импорта, подробнее тут (на английском).

Такой библиотекой в нашем случае является winhttp.dll — это системная библиотека Windows для http-запросов (хранится в C:/Windows/System32). У Unity в какой-то из библиотек в таблице импорта указано, что ей нужна библиотека winhttp.dll, поэтому Windows во время загрузки Unity загружает ещё и её, и только после этого Unity начинает работать.

Doorstop собирается в библиотеку под тем же названием: winhttp.dll. Там содержится код Doorstop, отвечающий за все манипуляции с GetProcAddress и mono_jit_init_version, а ещё там есть таблица экспорта (Export Address Table) со всеми теми же функциями, что в оригинальной winhttp.dll. Загрузка библиотек в Windows устроена так, что Windows сначала проверяет, есть ли нужные библиотеки в папке с программой, а только потом, если ничего не найдено, идет в System32. Поэтому при запуске игры Windows в первую очередь находит наш файл.

Так как у поддельной библиотеки такое же название и такая же таблица экспорта, Windows считает, что это та самая библиотека, которая нужна для игры, поэтому загружает её в память. Поддельная библиотека, в свою очередь, загружает настоящую winhttp динамически (с помощью LoadLibrary) и просто перенаправляет все вызовы из своей таблицы экспорта на адреса настоящих функций (с помощью GetProcAddress). Можно даже размеры сравнить: поддельная библиотека весит 16кб, а настоящая — 960кб.

Вместо winhttp.dll может использоваться любая другая библиотека, используемая Unity, просто разработчики Doorstop выбрали именно её.

В этом месте хочется поблагодарить сообщество BSMG и в особенности DaNike за то, что ответили на мои вопросы в дискорде и помогли разобраться с тем, как работает Doorstop и зачем ему нужна winhttp.dll. Вряд ли они это прочитают, но тем не менее.

Если вы уже совсем запутались, то это нормально. Давайте повторим все шаги в хронологическом порядке:

  • запускаем IPA.exe. Все библиотеки копируются в нужные папки игры. Никаких изменений в коде игры пока нет;
  • запускаем игру (Beat Saber.exe);
  • загружается библиотека UnityPlayer.dll, написанная на C++;
  • Windows ищет системные библиотеки, нужные для Unity. Одна из таких библиотек — это winhttp.dll. Windows находит в папке с игрой нашу поддельную библиотеку winhttp.dll и загружает её;
  • в поддельной winhttp.dll вызывается код Doorstop. Он подделывает функцию GetProcAddress из системной библиотеки kernel32.dll;
  • Unity вызывает GetProcAddress, чтобы найти функцию mono_jit_init_version. Так как мы подделали GetProcAddress, она находит поддельную mono_jit_init_version;
  • поддельная mono_jit_init_version загружает Mono;
  • поддельная mono_jit_init_version использует Mono, чтобы загрузить IPA.Injector.dll;
  • IPA.Injector с помощью библиотеки Mono.Cecil модифицирует класс Application из библиотеки UnityEngine.CoreModule.dll так, чтобы он использовал код из IPA.Loader.dll;
  • поддельная mono_jit_init_version передает Mono в Unity;
  • Unity использует Mono, чтобы запустить части движка, написанные на C#;
  • загружается модифицированный класс Application. Вызывается код из IPA.Loader.dll;
  • IPA.Loader загружает моды;
  • Unity использует Mono, чтобы запустить код Beat Saber;
  • оригинальный код игры и код из модов теперь существуют вместе;
  • ?
  • profit.

На этом часть первая завершена. Мы разобрались, как с помощью манипуляций с библиотеками Windows и Unity, можно добавить моды в любую Unity-игру.

В следующей части мы напишем свой собственный мод для Beat Saber: посмотрим, как моды обмениваются информацией с игрой, как модифицировать поведение оригинальной игры, а также взглянем поближе на Harmony — библиотеку для модификации C#-кода, которая используется моддерами в RimWorld, BATTLETECH, Cities: Skylines, Kerbal Space Program, Oxygen Not Included, Stardew Valley, Subnautica и многих других (по крайней мере так пишет автор Harmony, GitHub).

Я начинаю вести свой блог здесь на DTF. Он будет об историях из разработки, о геймдеве и об информационных технологиях в целом. Моя цель — рассказывать людям простыми словами, что технологии — это интересно. Ширяев вон уже этим занимается со своими нейронками, вроде даже успешно. Так что подписывайтесь! Лонги тоже иногда будут.

Creating your first Mod

Before we take a deep dive into writing your first mod, we need to take a look at C#, the programming language that we would be using to create our mods, it would certainly be helpful if you know a little bit about programming already, but if not then you can use the resources in this section to get a basic understanding of programming and C#.

The video series is especially beginner friendly, so you may want to try that !

Unity Fundamentals

While not entirely mandatory, knowing about unity concepts is immensely helpful in creating the mental model required for making your own mods. This video by Game Maker’s Toolkit is a good introduction to unity. I highly recommend watching it.

Installing the Mod Template

Tip: if your IDE supports it, using an extension can simplify or eliminate many of the steps below!

Strictly speaking, there is no need to use a template to create your mod. it will however take some common things that you will have to do every time you start a project and do them for you, which is nice.

To install the template :

  • Download the Template Zip
  • Move this zip to \Visual Studio 2022\Templates\ProjectTemplates
  • Restart visual studio

Create your Mod using the Mod Template

  • Open visual studio community 2022
  • Click "Create a new project" on the right
  • Select the Hollow Knight 1.5 Mod template
  • Enter project name and change the location to your working directory
  • [optional] Select place solution and project in the same directory
  • Fix the assembly references in your mod project

Note : this can be done easily by opening the csproj file in your project directory

Basic structure of a mod

let’s take a look at a very basic mod and break it down, this is a mod that logs some text to our modlog.txt file every frame the player presses O on their keyboard.

so what is going on here ?

  • The first few lines are using statements, where we tell the C# compiler the namespaces that we are going to be using in our file.
  • Next, we create our own namespace called MyFirstMod this will contain our mod
  • public class MyFirstMod : Mod we define a new public class called MyFirstMod that extends the Mod base class, this is the class that will be loaded by the Modding api, and this is where we will tell the game about our mod.
  • new public string GetName() => "My First Mod"; The Mod class has a few special methods that if provided by out mod allows us to do a few interesting things. GetName() for example allows us to set our mods name as it will appear in game, in the top-left mods list.
  • GetVersion serves a similar purpose but for the version of our mod.
  • Initialize is called when the Api is ready for our mod to start making modifications, this is also the place where preloads are provided (more on that in a bit)
  • ModHooks.HeroUpdateHook the Modding api provides us with certain events that we can react to, this is what allows us to code things that respond to in game events. HeroUpdateHook for example is an event that is invoked every frame that the player character exists, this makes it possible for us to listen for a keypress and react to that, for achieving this we use our own method OnHeroUpdate .
  • OnHeroUpdate simply checks if the O key was pressed down this frame, if it was then it adds the string "Key Pressed" to the Modlog.txt

The Mod base Class & Mod Lifecycle

For further reference into what the mod base class is and the lifecycle of a mod you can visit these reference docs.

Time to load your mod into game

The Mod Template automatically copies the compiled dll of your mod into the right folder when a successful build is created (and the game is not running), so all you have to do next is start the game and you should see your mod in the top — left.

if you start a save and press O your modlog.txt will now contain the text Key Pressed . you can find your modlog by following the steps outlined here

Video tutorial

you can follow along with this video tutorial to create your first mod. creating your first mod

Программы для создания модов для игр

Желание привнести в игру новые механики, окружение или, говоря проще, изменить что-то на свой лад идет с незапамятных времен. Модифицировать игру куда проще, чем создавать ее с нуля. Уже есть заданные механики, окружение и анимации. Остается только добавлять новый или отрезать уже существующий контент, меняя таким образом изначальный билд. Нередко бывает и так, что сообщество создает специальный софт, который упрощает ряд задач, включая импорт исходников и экспорт новых или измененных файлов в игру. К примеру, еще в 1994 году, благодаря Брендону Уайберу и наличию открытого в DOOM кода, модостроение стало популярно в таких масштабах. Используя DEU (DOOM Editor Utility), написанную Уайбером, игроки получили возможность делать собственные уровни и модификации к игре. На программе “Менеджмент игровых проектов” в Высшей школе бизнес информатики НИУ ВШЭ многие наши слушатели тоже имеют опыт использования программ для создания модов для игр или же интересуются этой темой.

Программы для создания модов - фото 1

Мотивации игроков и мододелов могут быть самыми разными. Начиная от желания разобраться, что находится “под капотом” любимой игры или задаться целью освоить таким образом азы игростроя. Разработка модов может пригодится при устройстве на работу в геймдев, если мододел решает пойти по пути игростроя и стать разработчиком. Кроме того, это помогает увидеть, что представляет собой игра изнутри. Так приходит понимание принципа работы механик, работы скриптов, работы текстур, 2D/3D окружения и объектов, спрайтов, эффектов и т.д. Навыки, которые безусловно пригодятся при дальнейших планах на разработку уже собственного проекта. Точно так же можно прототипировать собственные механики — мод к какой-либо игре вполне может помочь визуализировать задуманное и показать фичу в действии.

По сложности и времязатратам все очень неоднозначно. Начиная от рескина героя, как это часто было в Grand Theft Auto: Vice City и занимало не больше 10-15 минут, заканчивая совсем амбициозными проектами. Иногда модификации могут приобрести чудовищные масштабы и изменить игру до неузнаваемости. Таких примеров не так уж и мало. PlayerUnknown’s Battlegrounds — стала хитом всего за три дня. Брендан Грин под псевдонимом Playerunknown начинал с разработки модов для ArmA 3, и в дальнейшем создал собственный игровой режим, который сейчас называется «Battle Royale». Режим про H1Z1: King of the Kill. Увидев коммерческий успех этого жанра, Брендан Грин принял решение сделать свою собственную игру в режиме «Battle Royale». Игра была выпущена в рамках программы раннего доступа Steam в марте 2017 года. Разработчики планируют завершить разработку и выпустить готовый продукт до конца 4 квартала 2017 года. Всего за три дня после выхода проект возглавил топ самых популярных игр Steam и за три дня заработал 11 миллионов долларов. А на момент написания статьи продано уже свыше 10 млн. копий игры по цене $29.99.

Та же Dota – изначально была модификацией для Warcraft III. Карта была создана с помощью редактора уровней World Editor для Warcraft III: Reign of Chaos, а с выходом расширения Warcraft III: The Frozen Throne была улучшена. Сейчас же, Абдул Измаил (IceFrog), один из её создателей, продолжает работать над Dota 2 в Valve. Точно так же было и Counter-Strike. Первая бета Counter-Strike вышла в 1999 году и изначально являлась модификацией Half-Life. Сменив пять версий, игра остается актуальной до сих пор, давно отделившись от Half-Life и перейдя на новый движок Source, а в последствии на Source 2. Огромная работа проделана над S.T.A.L.K.E.R.: Lost Alpha – по сути это огромный аддон, вносящий в игру все, что было вырезано разработчиками из GSC Game World ранее, чтобы воссоздать ранний облик игры из анонсов периода 2003-2004 года. Как и в случае с Dota или с CS, будучи модом к Half-Life 2, Stanley Parable смогла в итоге стать полноценной отдельной игрой и завоевать множество наград.

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

OpenIV

Программы для создания модов - фото 2style=»text-align: center;»>

Универсальный редактор и файл-менеджер для PC-версий Grand Theft Auto V, Grand Theft Auto IV/EFLC и Max Payne 3. OpenIV позволяет редактировать скрытые архивы игры, добавлять и изменять в них файлы нужные файлы, в два клика интегрировать в игру новую текстуру. В режиме редактирования программа автоматически сохраняет все внесенные изменения, но занимаясь созданием модов, лучше вообще всегда не забывать делать бекапы.

Valve Hammer Editor

Программы для создания модов - фото 3

Редактор уровней, разработанный компанией Valve Software для работы с игровыми движками GoldSrc и Source входит в комплект Source SDK — набора программ для создания модификаций к играм, построенным на технологии Source.

Редактор был разработан Беном Моррисом для создания уровней в Quake 1 и размещен в свободном доступе. Начиная с версии 4.0 программа стала работать с Source, на котором написана Half-Life 2, изначально Dota 2 и еще ряд игр от Valve. Редактор поставляется в комплекте Source SDK и доступен к свободной загрузке через сервис Steam для обладателя любой игры, созданной на движке Source. Все обновления программы загружаются с помощью Steam. В Hammer можно создавать уровни для всех современных игр от Valve.

S.T.A.L.K E.R.

Программы для создания модов - фото 4

По S.T.A.L.K E.R.: Зов Припяти и S.T.A.L.K E.R.: Тень Чернобыля вышло уже столько программ, что их объединяют в целые паки.

Сборка для модостроительства ТЧ и ЗП v1.2 объединяет в себе свыше 25 программ и такое количество контента, что игру можно изменить практически до неузнаваемости. В пак входят 165 учебников по модостроению, конвертер для X-ray sdk, набор текстур, 4.XRspawner, Генератор однотипных квестов, DDSPacker v0.1, CharEd v0.2b, статьи по моддингу и еще столько всего, что проще увидеть.

Помимо понимания устройства игры, модификации могут дать небывалый простор для экспериментов и нововведений. Garry’s mod, разработанный Гарри Ньюманом, является физической “песочницей”, где игрок может создавать окружение и проводить любые манипуляции с объектами из игр, созданных на движке Source (CS:S, CS:GO, TF2, HL2 и других игр от Valve). Спустя два года после появления первой версии, 29 ноября 2006 года Garry’s Mod стал платной игрой и до сих пор распространяется через Steam.

В 2012 году Valve сделала огромный шаг навстречу модостроению и запустила Steam Workshop. Сервис позволил всем желающим заниматься созданием собственных модификаций к уже существующим играм, которые его поддерживали. Это дало пользователям возможность не просто делать модификации, но еще и зарабатывать, а также получать фидбек от сообщества прямо в Steam.

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

Если вам интересно больше узнать про игровую индустрию, создать и запустить свою игру, или пойти на работу в игровую компанию, то приглашаем на нашу образовательную программу “Менеджмент игровых проектов”. У нас часто проходят и однодневные открытые мероприятия, узнать о которых можно на странице анонсов.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *