Моддинг игр с чего начать
Как разрабатываются моды для Unity-игр: внедряемся в код игры
У большинства игр нет официальной поддержки модов, но при этом постоянно появляются новости о том, как моддеры добавляют в игры новый контент. Часто речь идет о замене моделей, текстур или музыки, но бывают и полноценные новые игровые механики, т.е. моддеры внедряются в код игры и изменяют ее внутреннюю логику.
В этой статье мы рассмотрим, какие методы используется для того, чтобы игра, написанная на Unity, могла запускать сторонние моды: модификации библиотек игры и самого движка, подмена адресов в таблице импорта dll, вмешательство в загрузку Mono Runtime и другие.
О Beat Saber
В качестве примера я буду использовать Beat Saber — одну из самых популярных игр для VR-шлемов. Если у вас есть такой шлем, то, скорее всего, вы уже знаете, что такое Beat Saber. Если нет, то, возможно, вы видели хотя бы одно видео из игры в рекомендациях Youtube.
Единственное, что Beat Saber поддерживает из модов — это пользовательские уровни. В игре есть официальный редактор, но нет никакого сервиса, чтобы как-либо распространять свои творения, и, по моему мнению, вряд ли появится. В основе практически любого уровня лежит какая-то песня. Разрешить выкладывать такие файлы в своем официальном сервисе — значит привлечь к себе внимание правообладателей с их постоянными запросами что-то удалить или вообще с требованиями закрыть весь сервис.
Поэтому не удивительно, что вокруг Beat Saber сформировалось огромное сообщество: Beat Saber Modding Group (BSMG). Именно сообщество ответственно за большую часть того, что есть в игре.
Все это поддерживается сообществом. Большинство модов и даже сами сайты — это проекты с открытым исходным кодом, их можно найти на GitHub, чем я и воспользовался при подготовке к этой статье.
Общая информация о Unity
Mono — это одна из реализаций спецификации общеязыковой инфраструктуры (Common Language Infrastructure, CLI). Mono работает на Windows, Linux, macOS, мобильных устройствах и игровых консолях. Разрабатывается с 2001 года компанией Ximian, которую в 2003 купила компания Novell, которую в 2011 купила Attachmate. Attachmate сократила почти всех, но разработчики Mono хотели и дальше разрабатывать Mono, поэтому организовали в том же году отдельную компанию Xamarin, которую в 2016 купили Microsoft. Код Mono открыт и хранится на GitHub.
Это стандартная практика в разработке игр, когда высокопроизводительная часть движка написана на C или C++, а игровая логика пишется на скриптовом языке, например Lua. Преимущество C# в качестве скриптового языка в том, что он достаточно “высокоуровневый”, чтобы упростить и ускорить разработку игры, но при этом позволяет использовать JIT-компиляцию в нативный код.
Подробнее об этом можно прочитать в документации Mono.
BSIPA
BSIPA (Beat Saber Illusion Plugin Architecture) — это набор библиотек, которые модифицируют файлы Beat Saber так, чтобы игра могла загружать сторонние моды. Иногда такие библиотеки называют менеджерами плагинов.
BSIPA написана на C# (исходный код) и является форком IPA. Т.е. моддеры взяли уже существующий менеджер плагинов для Unity и улучшили его специально под нужды Beat Saber. В исходном коде BSIPA можно выделить три основных модуля: IPA, IPA.Loader и IPA.Injector.
IPA.exe
Обычно игроки используют ModAssistant и его аналоги, чтобы устанавливать моды, но мы рассмотрим, как это делается вручную. Для этого нужно скачать последний релиз BSIPA, распаковать все файлы в папку с игрой и запустить IPA.exe. Это исполняемый файл, который копирует файлы из только что распакованного архива в те папки, где они должны находиться. И это, в общем-то, все, что он делает: просто копирует файлы, и если какой-то из файлов уже существует в игре, то он делает его резервную копию. Вот список копируемых файлов:
Мы видим здесь еще два модуля BSIPA, которые я упомянул ранее: IPA.Loader.dll и IPA.Injector.dll. Остальные библиотеки нужны, чтобы работали эти две. Некоторые из них мы еще рассмотрим подробнее в этой статье и во второй части.
IPA.Loader.dll
Как и следует из названия этого модуля, он отвечает за загрузку и управление плагинами. Здесь определены классы PluginLoader, PluginManager и PluginComponent. PluginLoader — это класс, в котором определена логика загрузки плагинов из папки Plugins. В оригинальной IPA плагины загружаются в алфавитном порядке, что иногда приводит к проблемам. В BSIPA логика загрузки была переписана: Loader сначала загружает метаданные плагинов, анализирует зависимости, находит конфликты и строит порядок загрузки на основе этой информации.
Класс PluginManager отвечает за управление плагинами: поиск, активацию и деактивацию с учетом их зависимостей.
Класс PluginComponent — это компонент Unity, отвечающий за старт загрузки модов, их хранение и передачу им событий из игры. Например, если в основной игре сменилась активная сцена (мы запустили какой-то уровень или, наоборот, вернулись в главное меню), то PluginComponent итерирует по всем модам и сообщает им об этом. Подробнее об этом будет во второй части.
IPA.Injector.dll
Название Injector намекает, что этот модуль отвечает за внедрение в оригинальную игру. Начнем с забавного факта: BSIPA добавляет в игру антипиратскую защиту.
Защита примитивная, она просто проверяет, есть ли в папке с игрой файлы, которые явно указывают на взлом: SmartSteamEmu.ini, BSteam crack.dll, HUHUVR_steam_api64.dll и другие.
Скорее всего, BSIPA это нужно из практических интересов. Если игра пиратская, то это значит, что она была взломана и часть ее файлов изменены. BSIPA тоже изменяет файлы игры, а значит, совместимость с пиратскими библиотеками не гарантируется.
IPA.Injector использует Mono.Cecil, чтобы модифицировать библиотеку UnityEngine.CoreModule.dll. Она написана на C# (иначе бы мы не смогли ее редактировать) и содержит базовые сущности Unity. Например, там определены классы GameObject (все объекты в игре, которые располагаются на игровых сценах, являются объектами этого класса) и класс MonoBehaviour (базовый класс для компонентов с игровой логикой, в том числе PluginComponent). IPA.Injector находит в библиотеке UnityEngine.CoreModule.dll класс UnityEngine.Application и модифицирует его статический конструктор (или создает, если его нет), добавляя туда создание бутстраппера:
По крайней мере, в Unity 2019.3.0f3 у Application нет статического конструктора, а значит, эта модификация не удаляет существующий важный код и относительно безопасна. Если статический конструктор уже существует и Injector заменяет его, то это только в том случае, если мы повторно модифицируем библиотеку.
После модификации в классе Application появляется новый статический конструктор (код получен с помощью декомпиляции модифицированной UnityEngine.CoreModule.dll):
Метод CreateBootstrapper создает новый объект и добавляет в него компонент Bootstrapper:
Бутстраппер представляет собой интересное техническое решение:
Метод Start похож на метод Awake, но Awake вызывается в первый кадр, когда создается компонент, а Start вызывается в первый кадр после активации компонента (компоненты могут создаваться неактивными). Каждый из методов вызывается ровно один раз за жизненный цикл компонента и может использоваться для разных этапов инициализации компонента. Компонент Bootstrapper в своем методе Start вызывает уничтожение объекта, к которому он прикреплен. В методе OnDestroy вызывается колбэк, установленный в CreateBootstrapper:
Колбэк дожидается асинхронной загрузки плагинов и создает компонент PluginComponent. Если честно, я не знаю, зачем нужен этот механизм с самоуничтожением бутстраппера и созданием PluginComponent в OnDestroy. Мое предположение: это нужно для того, чтобы сделать загрузку отложенной — метод Start вызывается, когда компонент становится активным, а он не может стать активным, пока не загрузится игровая сцена. Буду рад, если более опытные Unity-разработчики поправят меня в комментариях.
Помимо этого IPA.Injector редактирует еще один файл — MainAssembly.dll. Эта библиотека содержит код Beat Saber. С помощью все того же Mono.Cecil IPA.Injector убирает у всех классов sealed и делает все методы публичными и виртуальными. Теперь любой класс в любом плагине может наследоваться от любого класса в оригинальной игре и переопределять поведение его методов. Эта модификация уже не относится к загрузке плагинов, но она очень упрощает разработку модов.
Если бы у нас использовалась не BSIPA, а оригинальная IPA, то на этом можно было бы остановиться. В оригинальной версии IPA.exe запускает Injector, модифицирует UnityEngine.CoreModule.dll, и в игре появляются моды. У такого подхода есть один минус — каждый раз, когда оригинальная игра обновляется, нужно заново запускать IPA.exe и патчить игру. BSIPA решает эту проблему, но, как я уже писал выше, IPA.exe в BSIPA просто копирует файлы и не делает больше ничего. За запуск Injector в этом случае отвечает другая библиотека.
Unity Doorstop
За внедрение в код Unity отвечает библиотека UnityDoorstop-BSIPA. Она лежит среди файлов BSIPA и написана на чистом C. UnityDoorstop-BSIPA (исходный код) — это тоже форк, оригинальный проект можно найти здесь. Далее для простоты буду вместо UnityDoorstop-BSIPA писать Doorstop. Лозунгом Doorstop является фраза “Run managed code before Unity does!”, что в примерном переводе звучит как “Запускай управляемый код до того, как Unity сможет это сделать”. Напомню, что “управляемый код” — это в нашем случае код C#. Выше мы уже выяснили, что ядро движка Unity написано на C++, а пользовательские скрипты для игровой логики и некоторые части самого Unity — на C#. Значит, Doorstop каким-то образом позволяет нам вмешаться в логику, когда ядро Unity уже загрузилось, а C#-скрипты — еще нет.
Когда мы запускаем игру на Unity (например, Beat Saber.exe), то в память одной из первых загружается библиотека UnityPlayer.dll. Она прилагается ко всем Unity-играм и отвечает за запуск и выполнение самой игры. У этой библиотеки есть таблица импорта, в которой говорится, что UnityPlayer использует функцию GetProcAddress из библиотеки kernel32.dll. GetProcAddress — это функция WinAPI, которая возвращает адрес функции из определенной библиотеки по ее названию. Я не видел исходного кода Unity, но судя по тому, что я видел в BSIPA и Doorstop, в UnityPlayer должно быть что-то вроде такого:
mono_jit_init_version — это функция, которая отвечает за инициализацию и запуск Mono. Подробнее можно прочитать здесь. Doorstop вмешивается в этот процесс. Делается это в два шага.
Шаг 1. Проксируем GetProcAddress
Этот код находит в памяти уже загруженную библиотеку UnityPlayer.dll, берет ее таблицу импорта (Import Address Table, IAT), находит в ней GetProcAddress из kernel32.dll и заменяет ее на нашу функцию hookGetProcAddress из Doorstop.dll. hookGetProcAddress в упрощенном виде выглядит так:
Подробнее про IAT Hooking можно прочитать здесь. Получается, что hookGetProcAddress проксирует все вызовы GetProcAddress. Прокси-функция смотрит название функции, которую у нее запрашивают. Если это НЕ mono_jit_init_version, то hookGetProcAddress просто вызывает настоящую GetProcAddress и возвращает то, что у нее попросили, тем самым не мешая нормальной работе. Если у нее запрашивают mono_jit_init_version, то тогда она возвращает переопределенную функцию ownMonoJitInitVersion. Пользуясь случаем, прокси-функция получает указатель на библиотеку, в котором ищется mono_jit_init_version, и берет из нее настоящие функции Mono с помощью GetProcAddress (внутри init(module); ):
Шаг 2. Переопределеяем mono_jit_init_version
ownMonoJitInitVersion сначала вызывает настоящую mono_jit_init_version, чтобы создать Mono. Затем она с помощью Mono загружает сборку IPA.Injector.dll и запускает из нее статический метод Main. В (очень) упрощенном виде код ownMonoJitInitVersion выглядит так:
Мы уже рассмотрели выше, что IPA.Injector содержит код, который внедряет плагины в Beat Saber. После того, как IPA.Injector завершает свою работу, ownMonoJitInitVersion отдает Mono в Unity. Unity даже не в состоянии понять, что что-то было не так. Если б он вызвал настоящую mono_jit_init_version, то он бы получил Mono и начал бы дальше с ним работать. Если Unity запускает переопределенную ownMonoJitInitVersion, то он тоже получает Mono — он просто не в курсе, что этим Mono успели воспользоваться для чего-то еще.
winhttp.dll
Остался один нерешенный вопрос. Во-первых, в описании Doorstop я писал про библиотеку Doorstop.dll. Давайте опять взглянем на файлы, которые IPA.exe устанавливает в игру:
Как вы можете видеть, Doorstop.dll здесь нет. Во-вторых, даже если бы Doorstop.dll здесь бы, то почему Beat Saber или Unity должны его загружать в память, если его нет в таблице импорта? Решение: выдать Doorstop.dll за другую библиотеку, которую загружает Unity, и сделать так, чтобы она загрузилась раньше настоящей. Такой библиотекой в нашем случае является winhttp.dll — это системная библиотека Windows для http-запросов (хранится в C:/Windows/System32). У Unity в одной из библиотек в таблице импорта указано, что ей нужна библиотека winhttp.dll, поэтому во время загрузки Unity Windows сначала загружает winhttp.dll в память, и только после этого Unity начинает работать.
Doorstop собирается в библиотеку под тем же названием: winhttp.dll. Там содержится код Doorstop, отвечающий за все манипуляции с GetProcAddress и mono_jit_init_version, а также туда добавляется таблица экспорта (Export Address Table) со всеми теми же функциями, что в оригинальной winhttp.dll. Загрузка библиотек в Windows устроена так, что Windows сначала проверяет, есть ли нужные библиотеки в папке с программой, и только потом, если ничего не нашел, идет в System32. Поэтому при запуске игры Windows в первую очередь находит наш файл. Поддельная библиотека загружает настоящую winhttp динамически (с помощью LoadLibrary) и просто перенаправляет все вызовы из своей таблицы экспорта на адреса настоящих функций (с помощью GetProcAddress). Можно сравнить размеры: поддельная библиотека весит 16кб, а настоящая — 960кб.
В репозиториях IPA и BSIPA есть скрипты для генерации файла proxy.c, который содержит таблицу экспорта, совпадающую с оригинальной библиотекой, и загружает все методы через GetProcAddress. В IPA такой скрипт написан на PowerShell, а в BSIPA — на Python. Сгенерированный файл выглядит так: proxy.c.
Подробнее про DLL Search Order Hijacking можно прочитать тут.
Перечисление действий в хронологическом порядке
Повторяем все шаги в хронологическом порядке.
Про часть 2
На этом первая часть завершена. Мы разобрались, как с помощью манипуляций с библиотеками Windows и Unity можно добавить моды в Beat Saber. Несмотря на то, что BSIPA — это форк, сделанный специально для этой игры, мы в этой статье нигде не делали предположений о внутренней структуре игры и не использовали ее код, а значит можно сказать, что эти методы применимы ко всем Unity-играм.
В следующей части мы напишем свой собственный мод для Beat Saber: посмотрим, как моды обмениваются информацией с игрой, как модифицировать поведение оригинальной игры, а также воспользуемся Harmony — библиотекой для модификации C#-кода, которая используется моддерами в RimWorld, BATTLETECH, Cities: Skylines, Kerbal Space Program, Oxygen Not Included, Stardew Valley, Subnautica и многих других.
Пособие для начинающего моддера
Сегодня мы открываем цикл статей о моддинге. В первой из них мы расскажем о том, как зародилось это движение и что можно сделать с помощью моддинга.
Персональный компьютер — помощник в решении любых задач, источник информации посредством интернета и незаменимое средство для развлечения. Все бы ничего, вот только ПК были все одинаково серыми — и не зря Стив Джобс Apple многократно обыгрывал эту тему в своих рекламных роликах.
Постепенно движение разрасталось, охватывая все новые страны, — теперь оно распространилось на весь мир.
В период 2000 2002 годов появились крупные сайты по моддингу — в то время они служили единственными источниками информации. Все модификации (моды) люди делали сами: пилили железо и акрил, встраивали в вентиляторы светодиоды, для подсветки брали толстые неоновые лампы для тюнинга автомобилей и т.д. Среди моддеров появились настоящие изобретатели: в 1999 году Клифф Андерсон изобрел реобас (его идея лежит в основе всех современных реобасов и многофункциональных панелей), в 2001 году Яни Понкко (Jani Ponkko) придумал светящийся коврик и мышку с вентилятором.
В 2001 году на помощь моддерам пришла компания Sunbeam и стала выпускать лампы, предназначенные специально для подсветки корпуса компьютера. Теперь подобных компаний пруд пруди. Моддинг становится массовым и доступным для всех.
Системный блок
Вот теперь шлейфы и провода приведены в порядок.
Обычно пользователи начинают моддить корпус компьютера. Прорубают “окно в железо” — вырезают окошко в системном блоке. Делают с помощью ножовки, ножниц по металлу, электролобзика, заморского инструмента дремели. После этого устанавливают оргстекло, укрепляя его с помощью прокладок (молдинга) или рамок. Уже существуют готовые окна-полуфабрикаты — вставлять их совсем просто. После всех манипуляций нашему взору предстают все внутренности системы — материнская плата и кулер, ворох шлейфов, винчестер, видеокарта и т.д.
Все, что находится в системном блоке, может стать объектом для моддинга. Дикое количество проводов и шлейфов выглядит не слишком эстетично, так почему бы их не привести в порядок, убрав в аккуратную оплетку, а плоские шлейфы заменить на закругленные? При этом улучшится не только внешний вид, но и циркуляция воздуха внутри системы. Подобные решения предлагают и сами производители, хотя можно все сделать самостоятельно с помощью оплетки и шланга от душа.
Подсвеченные молексы и ножки смотрятся эффектно.
Не менее оригинальное решение — взять толстый кусок оргстекла ( 17 мм), вырезать четыре прямоугольные подставки для компьютера и каждую подсветить изнутри светодиодом. Потом лишь заменить стандартные серые ножки корпуса на светящиеся “лапки”! Как вариант стоит попробовать использовать дюралайт ( duralight ) для подсветки дна корпуса. Обклеив шнур по периметру дна, получим компьютер, который будет напоминать летающую тарелку, заходящую на посадку.
На одной подсветке корпуса моддинг не заканчивается. Бывают корпуса, созданные с нуля своими руками ( custom case ). В них встраивают кофеварки и аквариумы, у художников-аэрографов наносят изображение или делают это с помощью специальных пленок.
Дюралайт в действии!
Фальшпанель закрывает собой оптический привод.
Обычная мышь превращается.
Прошло немало времени с тех пор, как мы объявили конкурс на самый яркий, самый красивый корпус, который вы, дорогие читатели, должны были раскрасить лично! С момента объявления конкурса мы получили более 15 работ. Здесь мы объявим победителей, а на диске “Игромании” вы сможете воочию посмотреть на работы наших призеров.
1 место — Буцкой Сергей из Олайне, Латвия. Он получает от нас Игроманский корпус и фонарик от компании Digital Direction Electronics Co., Ltd.
2 место — Скороходов Сергей из Харькова, Украина. Его призом стали MP3-плеер Beatsounds EMP-Z и фонарик от Digital Direction Electronics Co., Ltd
3 место — Бовкун Виталий из Белгорода, Россия. От нашего спонсора он получает фонарик.
Периферия
Когда-то это был вполне заурядный модем.
Самое время вспомнить о серой мышке, клавиатуре и мониторе — ведь их тоже можно превратить в произведение искусства. Взять, например, мышку: купите самую дешевую модель, с помощью боров и надфилей вырежьте окошко и отверстия в виде язычков пламени, вставьте оргстекло и подсветите все светодиодами — просто и со вкусом.
И монитор можно подсветить, но это опасно.
Шедевр можно сотворить даже из простеньких колонок, заменив защитную сетку на плекс, перед этим вырезав в нем отверстия для динамика и фазоинвертора любой, даже самой необычной формы. Все это дело обязательно стоит подсветить. Для вырезания воспользуемся дрелью, лобзиком или дремелем. Чтобы свет более равномерно рассеивался, стекло лучше сделать матовым, зашкурив его под струей воды. Для подсветки установим сверхъяркие светодиоды в оргстекло, прорезав канавки. Для питания диодов останется только подвести к колонке 12 В от свободного molex-а. Все провода лучше спрятать внутри колонки.
Начинаем вечеринку в стиле диско 80-х!
Как же наша ненаглядная клавиатура? Ее кто красит, кто подсвечивает с помощью огромного количества светодиодов, либо с помощью неонового шнура. Последний специально выпускают для моддинга — тонкий шнур (диаметр 2,3 мм), длинною 1,5 м, подключается к 12 В блока питания. Выпускают его с различными цветами подсветки. Для подсветки клавиатуры нужно снять ее крышку и протянуть шнур под клавишами так, чтобы он огибал их ряды. Через каждые 2—3 клавиши стоит шнур приклеивать к плате. Теперь осталось лишь вывести провод питания шнура через отверстие в клавиатуре, которое придется просверлить. Возможный минус мода: в изогнутом состоянии неоновый шнур может немного гудеть. Подсветка клавиатуры светодиодами — труд очень кропотливый, нужно встроить очень много диодов. К счастью, производители уже выпускают подобные клавиатуры с подсветкой.
Как мы говорили в начале статьи, неугомонный финский моддер создал светящийся коврик для мыши, а сделал он это просто: взял лист акрила толщиной 5 мм, вырезал коврик, отшлифовал края и подсветил светодиодами. Для этого он прорезал в коврике каналы и встроил светики, подведя к ним питание 5 В от блока питания. Все гениальное просто. Производители пошли дальше и выпускают круглые, квадратные коврики с семью режимами подсветки, со светящейся гравировкой и даже реагирующие на звонок сотового телефона.
Из винчестера тоже можно сделать произведение искусства.
Пикачу в зазеркалье.
Не торопитесь, когда занимаетесь моддингом, лучше потратить больше времени и сделать все как надо. Также не стоит гнаться за гипер-оригинальностью в ущерб комфорту. Вся соль в том, чтобы совместить эти две вещи вместе.
Больше обращайте внимания на провода, убирайте их в красивую оплетку, а все лишнее прячьте либо просто покупайте крученые шлейфы.
Не экономьте на покраске: аэрозольный баллончик — это дешево, но высокого качества рисунка вы не добьетесь. Если хотите получить шедевр, лучше отправиться в автосервис либо самому заняться профессиональной аэрографией.
Тема моддинга очень обширная, так что еще не раз мы к ней будем возвращаться в ближайших номерах журнала “Игромания”.
Моддинг игр с чего начать
Крайне рекомендуется добавить руководство в «избранное» и следить за обновлениями!
Итак, с чего же начинается сталкерское модостроение? Естественно, с папки «gamedata», которая является основой любого любительского мода. Но простое создание данной папки в корне игры ничего не принесет, так как для модостроения нужны файлы, достать которые можно двумя путями: либо взять за основу любую другую модификацию, либо использовать файлы оригинальной игры. И, так как редактирование сторонней модификации будет скорее модификацией модификации, а не собственноручно созданным модом, то мы за основу модифицирования возьмем оригинальные файлы игры.
Можете не беспокоиться, архив без вирусов. По сути, вы также можете распаковать пиратскую версию S.T.A.L.K.E.R.: Тень Чернобыля любым другим анпакером, благо, их достаточно много в интернете, но зачем тратить свое время и место на жестком диске, когда проще распаковать лицензию?
Стоит обратить внимание, данная программка тестировалась лишь на Steam-версии S.T.A.L.K.E.R.: Тень Чернобыля. Пиратские версии, а также версия игры для GOG не проходили тестирование.
Итак, когда вы скачаете архив, внутри него вас будет ждать лишь один файл. Эта и есть подходящая программка. Ее вы просто перетаскиваете из архива на рабочий стол и запускаете.
В этой же программе вы указываете путь к корневой папке со сталкером и от туда начинаете разархивировать файлы gamedata.
Вы просто выбираете нужный файл gamedata и нажимаете кнопку «открыть». Далее архиватор вам предложит выбрать место хранения файлов. Я рекомендую разархивировать файлы в отдельную папку на рабочем столе. Себе же для удобства я разархивировал каждую «геймдату» в отдельную папку. Зачем? Вы узнаете далее.
Для 90% любительских модификаций будет достаточно распакованного gamedata.db0.
Предположим, что вы не имеете никакого опыта в простейшем модостроении и еще не разобрались с файлами и папками. Для начала стоит разобраться с простейшими параметрами, которые бы вы, предположительно, хотели изменить в игре. Вот самая простая навигация для новичков лишь по одной папке Config.
Вот самые основные параметры, изменения которых помогут вам в создании простейших модификаций.
Для того, чтобы реализовать в игре модификацию, вам потребуется создать папку gamedata в корневой папке игры.
Далее, допустим, я хочу модифицировать главного героя, работая в файле actor.ltx.
Он расположен по пути config\creatures, соответственно, в папке gamedata я создаю папку config, с ней создаю папку creatures. В данную папку я закидываю файл actor.ltx. Но для корректной работы внесенных параметров в actor.ltx, необходимо их же продублировать в system.ltx. Файл system.ltx находится в папке config, соответственно, данный файл переноситься по пути корень/gamedata/config
После этого внесенные изменения сохраняются. Модифицированный сталкер можно будет запустить сразу, начав новую игру.
Таким образом, первая небольшая модификация занимает место всего в 33 КБ.
Как мы можем наблюдать, для создания модификаций совершенно не обязательно иметь полностью разархивированную папку gamedata в корень игры. Простейшие модификации требуют в папке gamedata только тех файлов, которые подвергаются изменению.
С другой стороны, создание модов требует комплексного подхода и знания взаимосвязей файлов игры. Даже для изменения параметров грузоподъемности ГГ необходимо знать о взаимосвязях того же actor.ltx и system.ltx.
Поэтому советую практиковаться, но перед этим изучать теорию сталкерского модостроения.
Как визуально улучшить картинку в игре? Как изменить (поменять) текстуры? При помощи каких программ работать с текстурами? На этот и все другие вопросы, связанные с текстурированием и визуализацией вы найдете ответы в текущей главе гайда по модостроению в сталкере ТЧ.
Я же предпочитаю работать в программе Photoshop CS6, потому что его инструментарий и работа со слоями мне ближе, чем функционал Paint.net.
Допустим, вы обзавелись одной из программ. Далее для работы с текстурами вам понадобится папка textures. Из предыдущих глав гайда вы уже должны понимать, где при разархивации будет находиться данная папка.
Сохраняете текстуры вы, естественно, в формате DDS. Если пользуетесь плагином для Photoshop, то советую оставлять в настройках Nvidia все как есть.
Как изменить имя главного героя игры (Меченого)?
В первой строке «lname_bandit_0» означает, что кличка свойственна бандитам из игры, а строка
означает, как не сложно догадаться, кличку. Изменяем, как обычно, то, что вписано между «
«, вписываем прямо между «> МАТЬ
Вам понадобится программа, ссылку на которую я оставлю ниже (пробелы уберете). Все нормально, без вирусов, регистрации и смс, а простая, как 5 копеек, короче, качаем архив.
Google:
https ://drive.google. com/file/d/126NJ8h9duJua6uDAKWn4LX9npg3Sou2-/view?usp=sharing
Яндекс:
https:// //disk.yandex. ru/d/kYuX-KkyJgSoaQ
Далее, значит, кидаем наш файл и файл оригинальной озвучки деда на ярлык этой самой программы. У вас выйдет 2 окна. В окне вашего файла вы должны изменить параметры так, как они есть в оригинальном аудио-файле. Для этого вводите все так, как показано на скриншоте, думаю, что с другими файлами алгоритм будет понятен (за мат извините).
Пишем следующие и у вас должно выйти вот так:
Далее создаем файл lootmoney.script (копируем любой скрипт, переименовываем его в lootmoney и убираем там все строки); прописываем в нем следующее:
Теперь у трупов ваших врагов всегда в кармане будет пара шекелей)
И так, дорогие друзья, данный раздел руководства посвящен тому, без чего не обходится ни один глобальный мод на Тень Чернобыля. Я подробно объясню вам, как установить X-Ray SDK 0.4 и выложу подробнейшую инструкцию о работе с X-Ray SDK 0.4. Вы наконец-то сможете войти в глобальное построение модов и узнаете, как менять локации, тайники, перетащить Сидоровича и, быть может, даже отстрелить ему его жирный зад (но это не точно).
Выкладываю несколько файлов, которые вам необходимо скачать.
Друзья! Гайд будет изменяться и пополняться со временем. К сожалению, мое время не бесконечно и я не могу постоянно заниматься пополнением руководства. Чем больше читателей оценят проделанную работу, тем скорее выйдет продолжение гайда. Планируется дополнять руководство новыми материалами либо каждую неделю, либо раз в две недели, но, запомните, что все зависит только от вашей активности!
Для самостоятельного изучения модостроения выкладываю матчасть:
Оценка и активность в других материалах также поспособствует активному пополнению руководства!
Друзья, если вам интересны краткие, но качественные обзоры на игры (и не только), советую вступить в мою группу, чтобы поддержать меня в роли начинающего куратора!