← Blog

Как настроить PvE-режим на сервере DayZ

Par Benjamin D. · PDG

· Mis à jour le 4 сентября 2026 г. · Lecture 7 min

Содержание

Настройка PvE DayZ — это не одна галочка в конфиге, а связка из трёх слоёв: серверный скрипт, который гасит урон между игроками, экономика лута в types.xml и параметры выживания мира. Ниже — рабочая последовательность: что править в serverDZ.cfg, как собрать мод без клиентской зависимости, как не сломать Central Economy и где задать мирные зоны.



Настройка PvE DayZ: логика режима и базовые параметры serverDZ.cfg

В ванильной DayZ нет переключателя «PvE = on». Разработчики дали набор флагов, которые убирают урон по постройкам и контейнерам, но не блокируют выстрел одного выжившего в другого. Поэтому мирный режим собирается вручную из четырёх компонентов: конфигурация мира, серверный скрипт на урон, экономика лута и мирные зоны через мод. Пропустите любой из них — и получите гибрид, где игроки не могут ломать базы, но спокойно расстреливают друг друга у колодца.

Начинаем с serverDZ.cfg в корне игровой директории. Минимальный набор для мирного сценария:

hostname = "PvE Chernarus | Build & Survive";
password = "";
passwordAdmin = "длинный_случайный_пароль";
maxPlayers = 60;

disableBaseDamage = 1;        // постройки нельзя ломать оружием и взрывчаткой
disableContainerDamage = 1;   // палатки, бочки, ящики защищены
disable3rdPerson = 0;
disableCrosshair = 0;
disablePersonalLight = 1;

enableCfgGameplayFile = 1;    // включает cfggameplay.json
serverTime = "SystemTime";
serverTimeAcceleration = 6;
serverNightTimeAcceleration = 4;
respawnTime = 5;
timeStampFormat = "Short";
logAverageFps = 1;
logPlayerListInterval = 300;
storageAutoFix = 1;
instanceId = 1;
verifySignatures = 2;

Обратите внимание на storageAutoFix = 1: на мирных проектах базы стоят месяцами, и повреждённый файл персистентности стоит дороже, чем секунда на автопроверку при старте. Всю работу с этими файлами удобно вести через файловый менеджер и живую консоль панели Pterodactyl — правки видно сразу, а рестарт делается одной кнопкой. Если вы только присматриваетесь к площадке для мирного проекта, посмотрите условия на странице хостинг DayZ — там же указаны характеристики железа (Ryzen с высокой частотой, NVMe), что напрямую влияет на скорость обсчёта Central Economy при большом количестве объектов на карте.

Что делают disableBaseDamage и disableContainerDamage

Эти два флага работают на уровне движка и не требуют модов. disableBaseDamage запрещает разрушение строительных частей (стены, ворота, вышки), disableContainerDamage — уничтожение хранилищ. Они не мешают владельцу разбирать собственную постройку инструментами: демонтаж идёт через отдельный механизм. Это ровно то поведение, которое нужно на мирном проекте — рейд невозможен, а перестроить базу можно.

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



Отключение урона игрокам: серверный скрипт вместо костылей

Самая частая ошибка — попытка отключить урон правкой init.c в миссии. Файл миссии не позволяет переопределить класс PlayerBase, поэтому нужен небольшой мод. Он ставится только на сторону сервера и запускается ключом -serverMod, чтобы игрокам не пришлось ничего скачивать.

Структура мода

@PvE_NoPlayerDamage/
└── Addons/
    └── PvE_NoPlayerDamage/
        ├── config.cpp
        └── scripts/
            └── 4_World/
                └── playerbase.c

Содержимое config.cpp:

class CfgPatches
{
    class PvE_NoPlayerDamage
    {
        units[] = {};
        weapons[] = {};
        requiredVersion = 0.1;
        requiredAddons[] = {"DZ_Data"};
    };
};

class CfgMods
{
    class PvE_NoPlayerDamage
    {
        dir = "PvE_NoPlayerDamage";
        name = "PvE No Player Damage";
        type = "mod";
        dependencies[] = {"World"};
        class defs
        {
            class worldScriptModule
            {
                value = "";
                files[] = {"PvE_NoPlayerDamage/scripts/4_World"};
            };
        };
    };
};

Скрипт playerbase.c перехватывает расчёт урона и отменяет его, если источником оказался другой выживший:

modded class PlayerBase
{
    override bool EEOnDamageCalculated(TotalDamageResult damageResult, int damageType,
        EntityAI source, int component, string dmgZone, string ammo,
        vector modelPos, float speedCoef)
    {
        if (source)
        {
            PlayerBase attacker = PlayerBase.Cast(source.GetHierarchyRootPlayer());
            if (attacker && attacker != this)
            {
                // урон от другого игрока полностью игнорируется
                return false;
            }
        }

        return super.EEOnDamageCalculated(damageResult, damageType, source,
            component, dmgZone, ammo, modelPos, speedCoef);
    }
}

Возврат false означает, что урон не применяется. Проверка attacker != this оставляет самоурон (падение с высоты, собственная граната) — иначе выжившие станут бессмертными, и весь смысл выживания пропадёт. Урон от заражённых, животных, голода, жажды, болезней и радиации проходит как обычно, потому что у этих источников корневой сущностью не является игрок.

Запуск и проверка

./DayZServer -config=serverDZ.cfg -port=2302 \
  -profiles=profiles -BEpath=battleye \
  -serverMod=@PvE_NoPlayerDamage \
  -mod=@CF;@DayZ-Expansion-Core \
  -dologs -adminlog -netlog -freezecheck

После старта проверьте в profiles/ лог скриптов: строка вида PvE_NoPlayerDamage в списке загруженных модулей означает, что мод подхватился. Тест делается вдвоём: выстрел из пистолета в напарника не должен снимать здоровье и кровь. Если урон проходит — почти всегда причина в том, что мод попал в -mod вместо -serverMod и не загрузился в серверный скриптовый модуль.

Транспорт и косвенный урон

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

if (source.IsInherited(Transport))
    return false;


Правки types.xml: экономика лута под мирное выживание

Когда PvP выключен, ценность лута смещается: боевое оружие становится вторичным, а инструменты, гвозди, брёвна, семена и медикаменты — основным ресурсом. Central Economy настраивается в mpmissions/dayzOffline.chernarusplus/db/types.xml. Официальное описание полей есть в Source.

Значения полей

ПолеЧто задаётПрактика для мирного режима
nominalЦелевое количество предметов на картеПовышаем для инструментов, топлива, тары
minПорог, ниже которого CE запускает доспавнДержим ~60–70% от nominal
lifetimeВремя жизни предмета на земле (сек.)Стройматериалы — 14400 и выше
restockЗадержка перед возвратом в пул (сек.)0 для расходников, чтобы не было провалов
quantmin / quantmaxДиапазон наполнения (патроны, вода, топливо)50/100 для канистр и аптечек
costПриоритет при выборе точки спавна100 по умолчанию, редкие вещи — ниже
flagsУчёт предмета в карго, у игроков, на картеcount_in_map=1 почти всегда
usage / tierТип локации и уровень зоныИнструменты — Farm, Village, Industrial

Пример записи

<type name="Hatchet">
    <nominal>60</nominal>
    <lifetime>14400</lifetime>
    <restock>0</restock>
    <min>40</min>
    <quantmin>-1</quantmin>
    <quantmax>-1</quantmax>
    <cost>100</cost>
    <flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1"
           count_in_player="0" crafted="0" deloot="0"/>
    <category name="tools"/>
    <usage name="Farm"/>
    <usage name="Village"/>
    <usage name="Industrial"/>
</type>

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

<type name="PlasticExplosive">
    <nominal>0</nominal>
    <min>0</min>
    <lifetime>60</lifetime>
</type>

Отдельный файл вместо правки оригинала

Держите изменения в собственном файле — так обновление игры не затрёт часы работы. Создайте db/types_pve.xml с теми типами, которые вы меняете, и подключите его в cfgeconomycore.xml:

<ce folder="db">
    <file name="types_pve.xml" type="types"/>
</ce>

CE обрабатывает файлы по порядку: значения из подключённого позже файла перекрывают базовые. Перед рестартом проверяйте XML на валидность — незакрытый тег роняет всю экономику, и сервер стартует с пустой картой. Быстрая проверка на машине с Linux:

xmllint --noout db/types_pve.xml && echo "XML OK"

Когда нужен вайп экономики

Изменения nominal и min подхватываются при рестарте, но старые предметы остаются лежать до истечения lifetime. Если правок много, чистится папка storage_1/ — но вместе с ней уходят базы и техника. На живом проекте так делать нельзя без предупреждения: сделайте полную резервную копию миссии и персистентности, а на мирном сервере лучше ограничиться мягким подходом и подождать естественной ротации лута.



Мирные зоны и параметры выживания

Ванильных safe zone в игре нет. Мирные зоны с блокировкой оружия, отключением заражённых и защитой техники дают крупные сборки модов (Expansion и торговые системы). Настройка живёт в JSON внутри profiles/, структура зависит от версии мода, но логика одинаковая: класс зоны, центр в игровых координатах и радиус.

{
    "m_Version": 3,
    "Enabled": 1,
    "SafeZones": [
        {
            "ClassName": "TraderCamp",
            "Position": [ 11845.0, 305.0, 12470.0 ],
            "Radius": 120.0
        }
    ]
}

Координаты берутся из позиции персонажа: встаньте в центр будущей зоны и снимите значения из админ-инструмента или лога. Радиус меньше 60 метров почти всегда мал — игроки будут вываливаться за границу при разгрузке машины.

Запретные территории через cfggameplay.json

Обратная задача — закрыть игрокам доступ в определённые области (аэродром с вертолётными событиями, зоны заражения). При enableCfgGameplayFile = 1 в миссии работает cfggameplay.json:

{
    "version": 124,
    "GeneralData": {
        "disableBaseDamage": true,
        "disableContainerDamage": true,
        "disableRespawnDialog": false
    },
    "PlayerData": {
        "disablePersonalLight": true,
        "StaminaData": {
            "sprintStaminaModifierErc": 1.4,
            "sprintStaminaModifierCro": 1.4,
            "staminaWeightLimitThreshold": 12.0
        }
    },
    "WorldsData": {
        "lightingConfig": 0,
        "playerRestrictedAreaFiles": [ "restricted/pve_zones.json" ]
    }
}

Повышенные модификаторы выносливости — типичная правка для мирного сценария: без перестрелок игроки много бегают за ресурсами, и ванильная стамина превращает игру в марш-бросок.

globals.xml: плотность мира

Файл db/globals.xml задаёт общие лимиты. Ключевые переменные:

  • ZombieMaxCount — количество заражённых. Понижение до 600–800 разгружает CPU и делает мирную застройку комфортнее.
  • AnimalMaxCount — животные; поднимайте, если ставка на охоту и кожевенное дело.
  • CleanupLifetimeDefault — базовое время жизни выброш