Как настроить 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— базовое время жизни выброш