Глава 8.1: Ваш первый мод (Hello World)
Главная | Ваш первый мод | Далее: Создание пользовательского предмета >>
Краткое содержание: Это руководство проведёт вас через создание вашего самого первого мода для DayZ с нуля. Вы установите инструменты, настроите рабочее пространство, напишете три файла, упакуете PBO, загрузите мод в DayZ и проверите его работу, прочитав лог скриптов. Предыдущий опыт моддинга DayZ не требуется.
Содержание
- Предварительные требования
- Шаг 1: Установка DayZ Tools
- Шаг 2: Настройка диска P: (Workdrive)
- Шаг 3: Создание структуры каталогов мода
- Шаг 4: Написание mod.cpp
- Шаг 5: Написание config.cpp
- Шаг 6: Написание вашего первого скрипта
- Шаг 7: Упаковка PBO с помощью Addon Builder
- Шаг 8: Загрузка мода в DayZ
- Шаг 9: Проверка в логе скриптов
- Шаг 10: Устранение частых проблем
- Полный справочник файлов
- Следующие шаги
Предварительные требования
Прежде чем начать, убедитесь, что у вас есть:
- Steam -- установлен и выполнен вход
- DayZ -- игра установлена (розничная версия из Steam)
- Текстовый редактор (VS Code, Notepad++ или даже Notepad)
- Около 15 ГБ свободного дискового пространства для DayZ Tools
Это всё, что нужно. Для этого руководства не требуется опыт программирования -- каждая строка кода объясняется.
Шаг 1: Установка DayZ Tools
DayZ Tools -- это бесплатное приложение в Steam, которое включает всё необходимое для создания модов: редактор скриптов Workbench, Addon Builder для упаковки PBO, Terrain Builder и Object Builder.
Как установить
- Откройте Steam
- Перейдите в Библиотеку
- В выпадающем фильтре сверху измените Игры на Инструменты
- Найдите DayZ Tools
- Нажмите Установить
- Дождитесь завершения загрузки (примерно 12-15 ГБ)
После установки вы найдёте DayZ Tools в библиотеке Steam в разделе «Инструменты». Путь установки по умолчанию:
C:\Program Files (x86)\Steam\steamapps\common\DayZ Tools\Что устанавливается
| Инструмент | Назначение |
|---|---|
| Addon Builder | Упаковывает файлы вашего мода в архивы .pbo |
| Workbench | Редактор скриптов с подсветкой синтаксиса |
| Object Builder | Просмотр и редактирование 3D-моделей .p3d |
| Terrain Builder | Редактор карт/ландшафта |
| TexView2 | Просмотр/конвертация текстур (.paa, .edds) |
Для этого руководства вам нужен только Addon Builder. Остальные инструменты пригодятся позже.
Шаг 2: Настройка диска P: (Workdrive)
Моддинг DayZ использует виртуальную букву диска P: в качестве общего рабочего пространства. Все моды и данные игры ссылаются на пути, начинающиеся с P:, что обеспечивает единообразие путей на разных машинах.
Создание диска P:
- Откройте DayZ Tools из Steam
- В главном окне DayZ Tools нажмите P: Drive Management (или найдите кнопку "Mount P drive" / "Setup P drive")
- Нажмите Create/Mount P: Drive
- Выберите расположение для данных диска P: (по умолчанию подойдёт, или выберите диск с достаточным пространством)
- Дождитесь завершения процесса
Проверка работы
Откройте Проводник и перейдите к P:\. Вы должны увидеть каталог с данными игры DayZ. Если диск P: существует и вы можете его просматривать, вы готовы продолжить.
Альтернатива: ручное создание диска P:
Если GUI DayZ Tools не работает, вы можете создать диск P: вручную с помощью командной строки Windows (запуск от администратора):
subst P: "C:\DayZWorkdrive"Замените C:\DayZWorkdrive на любую папку. Это создаёт временное сопоставление диска, которое действует до перезагрузки. Для постоянного сопоставления используйте net use или GUI DayZ Tools.
Что если я не хочу использовать диск P:?
Вы можете разрабатывать без диска P:, разместив папку мода непосредственно в каталоге игры DayZ и используя режим -filePatching. Однако диск P: -- это стандартный рабочий процесс, и вся официальная документация предполагает его использование. Мы настоятельно рекомендуем его настроить.
Шаг 3: Создание структуры каталогов мода
Каждый мод DayZ следует определённой структуре папок. Создайте следующие каталоги и файлы на вашем диске P: (или в каталоге игры DayZ, если не используете P:):
P:\MyFirstMod\
mod.cpp
Scripts\
config.cpp
5_Mission\
MyFirstMod\
MissionHello.cСоздание папок
- Откройте Проводник
- Перейдите к
P:\ - Создайте новую папку с именем
MyFirstMod - Внутри
MyFirstModсоздайте папкуScripts - Внутри
Scriptsсоздайте папку5_Mission - Внутри
5_Missionсоздайте папкуMyFirstMod
Понимание структуры
| Путь | Назначение |
|---|---|
MyFirstMod/ | Корень вашего мода |
mod.cpp | Метаданные (имя, автор), отображаемые в лаунчере DayZ |
Scripts/config.cpp | Сообщает движку, от чего зависит ваш мод и где находятся скрипты |
Scripts/5_Mission/ | Слой скриптов миссии (UI, хуки запуска) |
Scripts/5_Mission/MyFirstMod/ | Подпапка для скриптов миссий вашего мода |
Scripts/5_Mission/MyFirstMod/MissionHello.c | Ваш файл скрипта |
Вам нужно ровно 3 файла. Создадим их по одному.
Шаг 4: Написание mod.cpp
Создайте файл P:\MyFirstMod\mod.cpp в текстовом редакторе и вставьте следующее содержимое:
name = "My First Mod";
author = "YourName";
version = "1.0";
overview = "My very first DayZ mod. Prints Hello World to the script log.";Что делает каждая строка
name-- отображаемое имя в списке модов лаунчера DayZ. Игроки видят его при выборе модов.author-- ваше имя или название команды.version-- любая строка версии. Движок не разбирает её.overview-- описание, отображаемое при раскрытии деталей мода.
Сохраните файл. Это удостоверение личности вашего мода.
Шаг 5: Написание config.cpp
Создайте файл P:\MyFirstMod\Scripts\config.cpp и вставьте следующее содержимое:
class CfgPatches
{
class MyFirstMod_Scripts
{
units[] = {};
weapons[] = {};
requiredVersion = 0.1;
requiredAddons[] =
{
"DZ_Data"
};
};
};
class CfgMods
{
class MyFirstMod
{
dir = "MyFirstMod";
name = "My First Mod";
author = "YourName";
type = "mod";
dependencies[] = { "Mission" };
class defs
{
class missionScriptModule
{
value = "";
files[] = { "MyFirstMod/Scripts/5_Mission" };
};
};
};
};Что делает каждый раздел
CfgPatches объявляет ваш мод движку DayZ:
class MyFirstMod_Scripts-- уникальный идентификатор пакета скриптов вашего мода. Не должен конфликтовать с другими модами.units[] = {}; weapons[] = {};-- списки сущностей и оружия, добавляемых вашим модом. Пока пустые.requiredVersion = 0.1;-- минимальная версия игры. Всегда0.1.requiredAddons[] = { "DZ_Data" };-- зависимости.DZ_Data-- это базовые данные игры. Это гарантирует, что ваш мод загрузится после базовой игры.
CfgMods сообщает движку, где находятся ваши скрипты:
dir = "MyFirstMod";-- корневой каталог мода.type = "mod";-- это клиент+серверный мод (в отличие от"servermod"для серверных модов).dependencies[] = { "Mission" };-- ваш код подключается к модулю скриптов Mission.class missionScriptModule-- указывает движку компилировать все файлы.cвMyFirstMod/Scripts/5_Mission/.
Почему только 5_Mission? Потому что наш скрипт Hello World подключается к событию запуска миссии, которое находится на слое миссий. Большинство простых модов начинают отсюда.
Шаг 6: Написание вашего первого скрипта
Создайте файл P:\MyFirstMod\Scripts\5_Mission\MyFirstMod\MissionHello.c и вставьте следующее содержимое:
modded class MissionServer
{
override void OnInit()
{
super.OnInit();
Print("[MyFirstMod] Hello World! The SERVER mission has started.");
}
};
modded class MissionGameplay
{
override void OnInit()
{
super.OnInit();
Print("[MyFirstMod] Hello World! The CLIENT mission has started.");
}
};Построчное объяснение
modded class MissionServerКлючевое слово modded -- это сердце моддинга DayZ. Оно говорит: «Возьми существующий класс MissionServer из ванильной игры и добавь мои изменения поверх.» Вы не создаёте новый класс -- вы расширяете существующий.
override void OnInit()OnInit() вызывается движком при запуске миссии. override сообщает компилятору, что этот метод уже существует в родительском классе, и мы заменяем его нашей версией.
super.OnInit();Эта строка критически важна. super.OnInit() вызывает оригинальную ванильную реализацию. Если вы пропустите это, ванильный код инициализации миссии никогда не выполнится и игра сломается. Всегда вызывайте super первым.
Print("[MyFirstMod] Hello World! The SERVER mission has started.");Print() записывает сообщение в файл лога скриптов DayZ. Префикс [MyFirstMod] помогает легко найти ваши сообщения в логе.
modded class MissionGameplayMissionGameplay -- это клиентский аналог MissionServer. Когда игрок подключается к серверу, MissionGameplay.OnInit() срабатывает на его машине. Модифицируя оба класса, ваше сообщение появится в логах и сервера, и клиента.
О файлах .c
Скрипты DayZ используют расширение .c. Несмотря на сходство с C, это Enforce Script, собственный скриптовый язык DayZ. Он имеет классы, наследование, массивы и словари, но это не C, C++ или C#. Ваша IDE может показывать ошибки синтаксиса -- это нормально и ожидаемо.
Шаг 7: Упаковка PBO с помощью Addon Builder
DayZ загружает моды из файлов-архивов .pbo (похожих на .zip, но в формате, понятном движку). Вам нужно упаковать папку Scripts в PBO.
Использование Addon Builder (GUI)
Откройте DayZ Tools из Steam
Нажмите Addon Builder для запуска
Установите Source directory в:
P:\MyFirstMod\Scripts\Установите Output/Destination directory в новую папку:
P:\@MyFirstMod\Addons\Сначала создайте папку
@MyFirstMod\Addons\, если она не существует.В Addon Builder Options:
- Установите Prefix в:
MyFirstMod\Scripts - Остальные настройки оставьте по умолчанию
- Установите Prefix в:
Нажмите Pack
В случае успеха вы увидите файл по пути:
P:\@MyFirstMod\Addons\Scripts.pboНастройка финальной структуры мода
Теперь скопируйте ваш mod.cpp рядом с папкой Addons:
P:\@MyFirstMod\
mod.cpp <-- Скопировать из P:\MyFirstMod\mod.cpp
Addons\
Scripts.pbo <-- Создан Addon BuilderПрефикс @ в имени папки -- это соглашение для распространяемых модов. Он сигнализирует администраторам серверов и лаунчеру, что это пакет мода.
Альтернатива: тестирование без упаковки (File Patching)
Во время разработки вы можете полностью пропустить упаковку PBO, используя режим file patching. Он загружает скрипты непосредственно из ваших исходных папок:
DayZDiag_x64.exe -mod=P:\MyFirstMod -filePatchingFile patching быстрее для итерации, потому что вы редактируете файл .c, перезапускаете игру и сразу видите изменения. Этап упаковки не нужен. Однако file patching работает только с диагностическим исполняемым файлом (DayZDiag_x64.exe) и не подходит для распространения.
Шаг 8: Загрузка мода в DayZ
Есть два способа загрузить ваш мод: через лаунчер или через параметры командной строки.
Вариант A: Лаунчер DayZ
- Откройте лаунчер DayZ из Steam
- Перейдите на вкладку Mods
- Нажмите Add local mod (или "Add mod from local storage")
- Перейдите к
P:\@MyFirstMod\ - Включите мод, поставив галочку
- Нажмите Play (убедитесь, что подключаетесь к локальному/оффлайн серверу или запускаете одиночную игру)
Вариант B: Командная строка (рекомендуется для разработки)
Для более быстрой итерации запускайте DayZ напрямую с параметрами командной строки. Создайте ярлык или batch-файл:
Использование диагностического исполняемого файла (с file patching, без PBO):
"C:\Program Files (x86)\Steam\steamapps\common\DayZ\DayZDiag_x64.exe" -mod=P:\MyFirstMod -filePatching -server -config=serverDZ.cfg -port=2302Использование упакованного PBO:
"C:\Program Files (x86)\Steam\steamapps\common\DayZ\DayZDiag_x64.exe" -mod=P:\@MyFirstMod -server -config=serverDZ.cfg -port=2302Флаг -server запускает локальный listen-сервер. Флаг -filePatching позволяет загружать скрипты из неупакованных папок.
Быстрый тест: оффлайн-режим
Самый быстрый способ протестировать -- запустить DayZ в оффлайн-режиме:
DayZDiag_x64.exe -mod=P:\MyFirstMod -filePatchingЗатем в главном меню нажмите Play и выберите Offline Mode (или Community Offline). Это запустит локальную одиночную сессию без необходимости сервера.
Шаг 9: Проверка в логе скриптов
После запуска DayZ с вашим модом движок записывает весь вывод Print() в файлы логов.
Поиск файлов логов
DayZ хранит логи в вашем локальном каталоге AppData:
C:\Users\<ВашеИмяWindowsПользователя>\AppData\Local\DayZ\Чтобы быстро туда попасть:
- Нажмите Win + R для открытия диалога «Выполнить»
- Введите
%localappdata%\DayZи нажмите Enter
Ищите самый свежий файл с именем вроде:
script_<дата>_<время>.logНапример: script_2025-01-15_14-30-22.log
Что искать
Откройте файл лога в текстовом редакторе и найдите [MyFirstMod]. Вы должны увидеть одно из этих сообщений:
[MyFirstMod] Hello World! The SERVER mission has started.или (если вы загрузились как клиент):
[MyFirstMod] Hello World! The CLIENT mission has started.Если вы видите ваше сообщение: поздравляем! Ваш первый мод DayZ работает. Вы успешно:
- Создали структуру каталогов мода
- Написали конфиг, который движок читает
- Подключились к ванильному коду игры с помощью
modded class - Вывели текст в лог скриптов
Что если вы видите ошибки?
Если лог содержит строки, начинающиеся с SCRIPT (E):, что-то пошло не так. Читайте следующий раздел.
Шаг 10: Устранение частых проблем
Проблема: нет вывода в логе (мод, похоже, не загружается)
Проверьте параметры запуска. Путь -mod= должен указывать на правильную папку. При использовании file patching убедитесь, что путь указывает на папку, непосредственно содержащую Scripts/config.cpp (а не на папку с @).
Проверьте, что config.cpp находится на правильном уровне. Он должен быть в Scripts/config.cpp внутри корня вашего мода. Если он в неправильной папке, движок молча игнорирует ваш мод.
Проверьте имя класса CfgPatches. Если блока CfgPatches нет или его синтаксис неверен, весь PBO пропускается.
Просмотрите основной лог DayZ (не только лог скриптов). Проверьте:
C:\Users\<ВашеИмя>\AppData\Local\DayZ\DayZ_<дата>_<время>.RPTНайдите имя вашего мода. Вы можете увидеть сообщения вроде "Addon MyFirstMod_Scripts requires addon DZ_Data which is not loaded."
Проблема: SCRIPT (E): Undefined variable или Undefined type
Это означает, что ваш код ссылается на что-то, что движок не распознаёт. Частые причины:
- Опечатка в имени класса.
MisionServerвместоMissionServer(обратите внимание на двойную 's'). - Неправильный слой скриптов. Если вы ссылаетесь на
PlayerBaseиз5_Mission, это должно работать. Но если вы случайно поместили файл в3_Gameи ссылаетесь на типы миссий, вы получите эту ошибку. - Отсутствует вызов
super.OnInit(). Его пропуск может вызвать каскадные сбои.
Проблема: SCRIPT (E): Member not found
Метод, который вы вызываете, не существует в этом классе. Перепроверьте имя метода и убедитесь, что вы переопределяете реальный ванильный метод. OnInit существует в MissionServer и MissionGameplay -- но не в каждом классе.
Проблема: мод загружается, но скрипт не выполняется
- Расширение файла: убедитесь, что файл скрипта заканчивается на
.c(не.c.txtили.cs). Windows может скрывать расширения по умолчанию. - Несовпадение пути скрипта: путь
files[]вconfig.cppдолжен совпадать с вашим реальным каталогом."MyFirstMod/Scripts/5_Mission"означает, что движок ищет папку по этому точному пути относительно корня мода. - Имя класса:
modded class MissionServerчувствительно к регистру. Оно должно точно совпадать с именем ванильного класса.
Проблема: ошибки упаковки PBO
- Убедитесь, что
config.cppнаходится на корневом уровне того, что вы упаковываете (папкаScripts/). - Проверьте, что префикс в Addon Builder совпадает с путём вашего мода.
- Убедитесь, что в папке Scripts нет нетекстовых файлов (
.exe,.dllили бинарных файлов).
Проблема: игра вылетает при запуске
- Проверьте синтаксические ошибки в
config.cpp. Пропущенная точка с запятой, скобка или кавычка может привести к краху парсера конфигов. - Убедитесь, что
requiredAddonsсодержит правильные имена аддонов. Ошибка в написании имени аддона вызывает критический сбой. - Уберите ваш мод из параметров запуска и подтвердите, что игра запускается без него. Затем добавьте его обратно для изоляции проблемы.
Полный справочник файлов
Вот все три файла в полном виде, для удобного копирования:
Файл 1: MyFirstMod/mod.cpp
name = "My First Mod";
author = "YourName";
version = "1.0";
overview = "My very first DayZ mod. Prints Hello World to the script log.";Файл 2: MyFirstMod/Scripts/config.cpp
class CfgPatches
{
class MyFirstMod_Scripts
{
units[] = {};
weapons[] = {};
requiredVersion = 0.1;
requiredAddons[] =
{
"DZ_Data"
};
};
};
class CfgMods
{
class MyFirstMod
{
dir = "MyFirstMod";
name = "My First Mod";
author = "YourName";
type = "mod";
dependencies[] = { "Mission" };
class defs
{
class missionScriptModule
{
value = "";
files[] = { "MyFirstMod/Scripts/5_Mission" };
};
};
};
};Файл 3: MyFirstMod/Scripts/5_Mission/MyFirstMod/MissionHello.c
modded class MissionServer
{
override void OnInit()
{
super.OnInit();
Print("[MyFirstMod] Hello World! The SERVER mission has started.");
}
};
modded class MissionGameplay
{
override void OnInit()
{
super.OnInit();
Print("[MyFirstMod] Hello World! The CLIENT mission has started.");
}
};Следующие шаги
Теперь, когда у вас есть работающий мод, вот естественные направления развития:
- Глава 8.2: Создание пользовательского предмета -- определите новый игровой предмет с текстурами и появлением.
- Добавьте больше слоёв скриптов -- создайте папки
3_Gameи4_Worldдля организации конфигурации, классов данных и логики сущностей. См. Глава 2.1: Иерархия 5 слоёв скриптов. - Добавьте привязки клавиш -- создайте файл
Inputs.xmlи зарегистрируйте пользовательские действия клавиш. - Создайте UI -- постройте внутриигровые панели с помощью файлов layout и
ScriptedWidgetEventHandler. См. Глава 3: Система GUI. - Используйте фреймворк -- интегрируйтесь с Community Framework (CF) или другим фреймворком для продвинутых возможностей: RPC, управление конфигами и панели администратора.
Лучшие практики
- Всегда тестируйте с
-filePatchingперед сборкой PBO. Это убирает цикл «упаковать-скопировать-перезапустить» и сокращает время итерации с минут до секунд. - Начинайте со слоя
5_Missionдля быстрейшей итерации. Хуки миссий вродеOnInit()-- это простейший способ убедиться, что ваш мод загружается и работает. Добавляйте3_Gameи4_Worldтолько когда они действительно нужны. - Всегда вызывайте
superпервым в переопределённых методах. Пропускsuper.OnInit()молча ломает ванильное поведение и каждый другой мод, подключённый к тому же методу. - Используйте уникальный префикс в выводе Print (например,
[MyFirstMod]). Логи скриптов содержат тысячи строк от ванильной игры и других модов -- префикс это единственный способ быстро найти ваш вывод. - Держите синтаксис
config.cppпростым и правильным. Пропущенная точка с запятой или скобка в config.cpp вызывает аварийный выход или молчаливый пропуск мода без чёткого сообщения об ошибке.
Теория vs Практика
| Концепция | Теория | Реальность |
|---|---|---|
Поля mod.cpp | version используется для разрешения зависимостей | Движок полностью игнорирует строку версии -- она чисто косметическая для лаунчера. |
requiredAddons в CfgPatches | Перечисляет зависимости, чтобы ваш мод загружался в правильном порядке | Если вы ошибётесь в написании имени аддона, весь PBO молча пропускается без ошибки в логе скриптов. Проверяйте файл .RPT. |
| File patching | Отредактируйте файл .c и переподключитесь, чтобы увидеть изменения мгновенно | config.cpp и вновь добавленные файлы НЕ покрываются file patching. Для них всё ещё нужна пересборка PBO. |
| Тестирование в оффлайн-режиме | Быстрый способ проверить работу мода | Некоторые API (например, GetGame().GetPlayer().GetIdentity()) возвращают NULL в оффлайн-режиме, вызывая вылеты, которые не происходят на реальном сервере. |
Что вы узнали
В этом руководстве вы узнали:
- Как установить DayZ Tools и настроить рабочее пространство на диске P:
- Три необходимых файла для каждого мода:
mod.cpp,config.cppи хотя бы один скрипт.c - Как
modded classрасширяет ванильные классы без их замены - Как упаковать PBO, загрузить мод и проверить его работу, прочитав лог скриптов
