Skip to content

Глава 8.1: Ваш первый мод (Hello World)

Главная | Ваш первый мод | Далее: Создание пользовательского предмета >>


Краткое содержание: Это руководство проведёт вас через создание вашего самого первого мода для DayZ с нуля. Вы установите инструменты, настроите рабочее пространство, напишете три файла, упакуете PBO, загрузите мод в DayZ и проверите его работу, прочитав лог скриптов. Предыдущий опыт моддинга DayZ не требуется.


Содержание


Предварительные требования

Прежде чем начать, убедитесь, что у вас есть:

  • Steam -- установлен и выполнен вход
  • DayZ -- игра установлена (розничная версия из Steam)
  • Текстовый редактор (VS Code, Notepad++ или даже Notepad)
  • Около 15 ГБ свободного дискового пространства для DayZ Tools

Это всё, что нужно. Для этого руководства не требуется опыт программирования -- каждая строка кода объясняется.


Шаг 1: Установка DayZ Tools

DayZ Tools -- это бесплатное приложение в Steam, которое включает всё необходимое для создания модов: редактор скриптов Workbench, Addon Builder для упаковки PBO, Terrain Builder и Object Builder.

Как установить

  1. Откройте Steam
  2. Перейдите в Библиотеку
  3. В выпадающем фильтре сверху измените Игры на Инструменты
  4. Найдите DayZ Tools
  5. Нажмите Установить
  6. Дождитесь завершения загрузки (примерно 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:

  1. Откройте DayZ Tools из Steam
  2. В главном окне DayZ Tools нажмите P: Drive Management (или найдите кнопку "Mount P drive" / "Setup P drive")
  3. Нажмите Create/Mount P: Drive
  4. Выберите расположение для данных диска P: (по умолчанию подойдёт, или выберите диск с достаточным пространством)
  5. Дождитесь завершения процесса

Проверка работы

Откройте Проводник и перейдите к P:\. Вы должны увидеть каталог с данными игры DayZ. Если диск P: существует и вы можете его просматривать, вы готовы продолжить.

Альтернатива: ручное создание диска P:

Если GUI DayZ Tools не работает, вы можете создать диск P: вручную с помощью командной строки Windows (запуск от администратора):

batch
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

Создание папок

  1. Откройте Проводник
  2. Перейдите к P:\
  3. Создайте новую папку с именем MyFirstMod
  4. Внутри MyFirstMod создайте папку Scripts
  5. Внутри Scripts создайте папку 5_Mission
  6. Внутри 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 в текстовом редакторе и вставьте следующее содержимое:

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 и вставьте следующее содержимое:

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 и вставьте следующее содержимое:

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.");
    }
};

Построчное объяснение

c
modded class MissionServer

Ключевое слово modded -- это сердце моддинга DayZ. Оно говорит: «Возьми существующий класс MissionServer из ванильной игры и добавь мои изменения поверх.» Вы не создаёте новый класс -- вы расширяете существующий.

c
    override void OnInit()

OnInit() вызывается движком при запуске миссии. override сообщает компилятору, что этот метод уже существует в родительском классе, и мы заменяем его нашей версией.

c
        super.OnInit();

Эта строка критически важна. super.OnInit() вызывает оригинальную ванильную реализацию. Если вы пропустите это, ванильный код инициализации миссии никогда не выполнится и игра сломается. Всегда вызывайте super первым.

c
        Print("[MyFirstMod] Hello World! The SERVER mission has started.");

Print() записывает сообщение в файл лога скриптов DayZ. Префикс [MyFirstMod] помогает легко найти ваши сообщения в логе.

c
modded class MissionGameplay

MissionGameplay -- это клиентский аналог 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)

  1. Откройте DayZ Tools из Steam

  2. Нажмите Addon Builder для запуска

  3. Установите Source directory в: P:\MyFirstMod\Scripts\

  4. Установите Output/Destination directory в новую папку: P:\@MyFirstMod\Addons\

    Сначала создайте папку @MyFirstMod\Addons\, если она не существует.

  5. В Addon Builder Options:

    • Установите Prefix в: MyFirstMod\Scripts
    • Остальные настройки оставьте по умолчанию
  6. Нажмите 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 -filePatching

File patching быстрее для итерации, потому что вы редактируете файл .c, перезапускаете игру и сразу видите изменения. Этап упаковки не нужен. Однако file patching работает только с диагностическим исполняемым файлом (DayZDiag_x64.exe) и не подходит для распространения.


Шаг 8: Загрузка мода в DayZ

Есть два способа загрузить ваш мод: через лаунчер или через параметры командной строки.

Вариант A: Лаунчер DayZ

  1. Откройте лаунчер DayZ из Steam
  2. Перейдите на вкладку Mods
  3. Нажмите Add local mod (или "Add mod from local storage")
  4. Перейдите к P:\@MyFirstMod\
  5. Включите мод, поставив галочку
  6. Нажмите Play (убедитесь, что подключаетесь к локальному/оффлайн серверу или запускаете одиночную игру)

Вариант B: Командная строка (рекомендуется для разработки)

Для более быстрой итерации запускайте DayZ напрямую с параметрами командной строки. Создайте ярлык или batch-файл:

Использование диагностического исполняемого файла (с file patching, без PBO):

batch
"C:\Program Files (x86)\Steam\steamapps\common\DayZ\DayZDiag_x64.exe" -mod=P:\MyFirstMod -filePatching -server -config=serverDZ.cfg -port=2302

Использование упакованного PBO:

batch
"C:\Program Files (x86)\Steam\steamapps\common\DayZ\DayZDiag_x64.exe" -mod=P:\@MyFirstMod -server -config=serverDZ.cfg -port=2302

Флаг -server запускает локальный listen-сервер. Флаг -filePatching позволяет загружать скрипты из неупакованных папок.

Быстрый тест: оффлайн-режим

Самый быстрый способ протестировать -- запустить DayZ в оффлайн-режиме:

batch
DayZDiag_x64.exe -mod=P:\MyFirstMod -filePatching

Затем в главном меню нажмите Play и выберите Offline Mode (или Community Offline). Это запустит локальную одиночную сессию без необходимости сервера.


Шаг 9: Проверка в логе скриптов

После запуска DayZ с вашим модом движок записывает весь вывод Print() в файлы логов.

Поиск файлов логов

DayZ хранит логи в вашем локальном каталоге AppData:

C:\Users\<ВашеИмяWindowsПользователя>\AppData\Local\DayZ\

Чтобы быстро туда попасть:

  1. Нажмите Win + R для открытия диалога «Выполнить»
  2. Введите %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 работает. Вы успешно:

  1. Создали структуру каталогов мода
  2. Написали конфиг, который движок читает
  3. Подключились к ванильному коду игры с помощью modded class
  4. Вывели текст в лог скриптов

Что если вы видите ошибки?

Если лог содержит строки, начинающиеся с 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

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

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

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.");
    }
};

Следующие шаги

Теперь, когда у вас есть работающий мод, вот естественные направления развития:

  1. Глава 8.2: Создание пользовательского предмета -- определите новый игровой предмет с текстурами и появлением.
  2. Добавьте больше слоёв скриптов -- создайте папки 3_Game и 4_World для организации конфигурации, классов данных и логики сущностей. См. Глава 2.1: Иерархия 5 слоёв скриптов.
  3. Добавьте привязки клавиш -- создайте файл Inputs.xml и зарегистрируйте пользовательские действия клавиш.
  4. Создайте UI -- постройте внутриигровые панели с помощью файлов layout и ScriptedWidgetEventHandler. См. Глава 3: Система GUI.
  5. Используйте фреймворк -- интегрируйтесь с Community Framework (CF) или другим фреймворком для продвинутых возможностей: RPC, управление конфигами и панели администратора.

Лучшие практики

  • Всегда тестируйте с -filePatching перед сборкой PBO. Это убирает цикл «упаковать-скопировать-перезапустить» и сокращает время итерации с минут до секунд.
  • Начинайте со слоя 5_Mission для быстрейшей итерации. Хуки миссий вроде OnInit() -- это простейший способ убедиться, что ваш мод загружается и работает. Добавляйте 3_Game и 4_World только когда они действительно нужны.
  • Всегда вызывайте super первым в переопределённых методах. Пропуск super.OnInit() молча ломает ванильное поведение и каждый другой мод, подключённый к тому же методу.
  • Используйте уникальный префикс в выводе Print (например, [MyFirstMod]). Логи скриптов содержат тысячи строк от ванильной игры и других модов -- префикс это единственный способ быстро найти ваш вывод.
  • Держите синтаксис config.cpp простым и правильным. Пропущенная точка с запятой или скобка в config.cpp вызывает аварийный выход или молчаливый пропуск мода без чёткого сообщения об ошибке.

Теория vs Практика

КонцепцияТеорияРеальность
Поля mod.cppversion используется для разрешения зависимостейДвижок полностью игнорирует строку версии -- она чисто косметическая для лаунчера.
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, загрузить мод и проверить его работу, прочитав лог скриптов

Далее: Глава 8.2: Создание пользовательского предмета

Released under CC BY-SA 4.0 | Code examples under MIT License