Skip to content

Глава 9.7: Состояние мира и персистентность

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

Персистентность DayZ сохраняет мир живым между перезапусками. Понимание её работы позволяет управлять базами, планировать вайпы и избегать повреждения данных.

Содержание


Как работает персистентность

DayZ хранит состояние мира в каталоге storage_1/ внутри папки профиля вашего сервера. Цикл прост:

  1. Сервер сохраняет состояние мира периодически (по умолчанию примерно каждые ~30 минут) и при штатном завершении работы.
  2. При перезапуске сервер читает storage_1/ и восстанавливает все сохранённые объекты -- транспорт, базы, палатки, бочки, инвентари игроков.
  3. Предметы без персистентности (большинство наземного лута) заново генерируются Центральной Экономикой при каждом перезапуске.

Если storage_1/ не существует при запуске, сервер создаёт свежий мир без данных игроков и без построенных структур.


Каталог storage_1/

Профиль вашего сервера содержит storage_1/ со следующими подкаталогами и файлами:

ПутьСодержимое
data/Двоичные файлы, хранящие мировые объекты -- элементы баз, размещённые предметы, позиции транспорта
players/Файлы .save для каждого игрока, индексированные по SteamID64. Каждый файл хранит позицию, инвентарь, здоровье, эффекты статуса
snapshot/Снимки состояния мира, используемые во время операций сохранения
events.bin / events.xyСостояние динамических событий -- отслеживает местоположения крушений вертолётов, позиции конвоев и других заспавненных событий

Папка data/ составляет основную часть персистентности. Она содержит сериализованные данные объектов, которые сервер читает при загрузке для восстановления мира.


Параметры персистентности в globals.xml

Файл globals.xml (в вашей папке миссии) управляет таймерами очистки и поведением флагов. Вот значения, связанные с персистентностью:

xml
<!-- Обновление территориального флага -->
<var name="FlagRefreshFrequency" type="0" value="432000"/>      <!-- 5 дней (секунды) -->
<var name="FlagRefreshMaxDuration" type="0" value="3456000"/>    <!-- 40 дней (секунды) -->

<!-- Таймеры очистки -->
<var name="CleanupLifetimeDefault" type="0" value="45"/>         <!-- Очистка по умолчанию (секунды) -->
<var name="CleanupLifetimeDeadPlayer" type="0" value="3600"/>    <!-- Тело мёртвого игрока: 1 час -->
<var name="CleanupLifetimeDeadAnimal" type="0" value="1200"/>    <!-- Мёртвое животное: 20 минут -->
<var name="CleanupLifetimeDeadInfected" type="0" value="330"/>   <!-- Мёртвый зомби: 5.5 минут -->
<var name="CleanupLifetimeRuined" type="0" value="330"/>         <!-- Разрушенный предмет: 5.5 минут -->

<!-- Поведение очистки -->
<var name="CleanupLifetimeLimit" type="0" value="50"/>           <!-- Максимум предметов за цикл очистки -->
<var name="CleanupAvoidance" type="0" value="100"/>              <!-- Не удалять в радиусе 100 м от игрока -->

Значение CleanupAvoidance предотвращает удаление объектов вблизи активных игроков. Если тело находится в пределах 100 метров от любого игрока, оно остаётся, пока игрок не отойдёт или таймер не сбросится.


Система территориальных флагов

Территориальные флаги -- это основа персистентности баз в DayZ. Вот как взаимодействуют два ключевых значения:

  • FlagRefreshFrequency (432000 секунд = 5 дней) -- Как часто вы должны взаимодействовать с вашим флагом, чтобы он оставался активным. Подойдите к флагу и используйте действие "Обновить".
  • FlagRefreshMaxDuration (3456000 секунд = 40 дней) -- Максимальное накопленное время защиты. Каждое обновление добавляет до FlagRefreshFrequency времени, но общая сумма не может превысить этот лимит.

Когда таймер флага истекает:

  1. Сам флаг становится доступным для удаления.
  2. Все элементы базы, привязанные к этому флагу, теряют защиту персистентности.
  3. В следующем цикле очистки незащищённые элементы начинают исчезать.

Если вы снижаете FlagRefreshFrequency, игроки должны посещать свои базы чаще. Если вы увеличиваете FlagRefreshMaxDuration, базы сохраняются дольше между визитами. Настраивайте оба значения вместе в соответствии со стилем игры на вашем сервере.


Предметы хранения (Hoarder)

В cfgspawnabletypes.xml определённые контейнеры помечены тегом <hoarder/>. Это отмечает их как предметы, пригодные для хранения, которые учитываются в лимитах хранения на игрока в Центральной Экономике.

Ванильные предметы хранения:

ПредметТип
Barrel_Blue, Barrel_Green, Barrel_Red, Barrel_YellowБочки для хранения
CarTent, LargeTent, MediumTent, PartyTentПалатки
SeaChestПодводное хранилище
SmallProtectorCaseМаленький кейс с замком
UndergroundStashЗакопанный тайник
WoodenCrateКрафтовый ящик

Пример из cfgspawnabletypes.xml:

xml
<type name="SeaChest">
    <hoarder/>
</type>

Сервер отслеживает, сколько предметов хранения каждый игрок разместил. При достижении лимита новые размещения либо не удаются, либо самый старый предмет исчезает (в зависимости от конфигурации сервера).


Настройки персистентности в cfggameplay.json

Файл cfggameplay.json в вашей папке миссии содержит настройки, влияющие на прочность баз и контейнеров:

json
{
  "GeneralData": {
    "disableBaseDamage": false,
    "disableContainerDamage": false
  }
}
НастройкаПо умолчаниюЭффект
disableBaseDamagefalseПри true элементы базы (стены, ворота, сторожевые вышки) не могут быть повреждены. Это фактически отключает рейдерство.
disableContainerDamagefalseПри true контейнеры для хранения (палатки, бочки, ящики) не получают урона. Предметы внутри остаются в безопасности.

Установка обоих в true создаёт PvE-сервер, где базы и хранилища неразрушимы. Большинство PvP-серверов оставляют оба значения false.


Процедуры вайпа сервера

Существует четыре типа вайпа, каждый нацелен на определённую часть storage_1/. Всегда останавливайте сервер перед выполнением любого вайпа.

Полный вайп

Удалите всю папку storage_1/. Сервер создаст свежий мир при следующей загрузке. Все базы, транспорт, палатки, данные игроков и состояние событий будут удалены.

Вайп экономики (сохранить игроков)

Удалите storage_1/data/, но оставьте storage_1/players/ нетронутым. Игроки сохранят своих персонажей и инвентари, но все размещённые объекты (базы, палатки, бочки, транспорт) будут удалены.

Вайп игроков (сохранить мир)

Удалите storage_1/players/. Все персонажи игроков сбрасываются к свежим спавнам. Базы и размещённые объекты остаются в мире.

Сброс погоды / событий

Удалите events.bin или events.xy из storage_1/. Это сбрасывает позиции динамических событий (крушения вертолётов, конвои). Сервер сгенерирует новые позиции событий при следующей загрузке.


Стратегия резервного копирования

Данные персистентности невосстановимы после утраты. Следуйте этим практикам:

  • Копируйте при остановленном сервере. Копируйте всю папку storage_1/, пока сервер не работает. Копирование во время работы рискует захватить частичное или повреждённое состояние.
  • Планируйте резервные копии перед перезапусками. Если вы запускаете автоматические перезапуски (каждые 4-6 часов), добавьте шаг резервного копирования в скрипт перезапуска, который копирует storage_1/ до запуска процесса сервера.
  • Храните несколько поколений. Ротируйте резервные копии, чтобы иметь минимум 3 свежих копии. Если последняя резервная копия повреждена, вы сможете откатиться к более ранней.
  • Храните вне машины. Копируйте резервные копии на отдельный диск или в облачное хранилище. Отказ диска на машине сервера унесёт ваши резервные копии вместе с собой, если они на том же диске.

Минимальный скрипт резервного копирования (запускается перед стартом сервера):

bash
BACKUP_DIR="/path/to/backups/$(date +%Y%m%d_%H%M%S)"
mkdir -p "$BACKUP_DIR"
cp -r /path/to/serverprofile/storage_1 "$BACKUP_DIR/"

Распространённые ошибки

Эти ошибки постоянно встречаются в сообществах администраторов серверов:

ОшибкаЧто происходитПредотвращение
Удаление storage_1/ при работающем сервереПовреждение данных. Сервер пишет в файлы, которых больше нет, вызывая сбои или частичное состояние при следующей загрузке.Всегда сначала останавливайте сервер.
Отсутствие резервной копии перед вайпомЕсли вы случайно удалите не ту папку или вайп пойдёт не так, восстановить данные невозможно.Делайте резервную копию storage_1/ перед каждым вайпом.
Путаница между сбросом погоды и полным вайпомУдаление events.xy только сбрасывает позиции динамических событий. Оно не сбрасывает лут, базы или игроков.Знайте, какие файлы за что отвечают (см. таблицу каталогов выше).
Флаг не обновлён вовремяЧерез 40 дней (FlagRefreshMaxDuration) флаг истекает, и все привязанные элементы базы становятся доступными для удаления. Игроки теряют всю базу.Напоминайте игрокам об интервале обновления. Снизьте FlagRefreshMaxDuration на серверах с малым онлайном.
Редактирование globals.xml при работающем сервереИзменения не применяются до перезапуска. Хуже того -- сервер может перезаписать ваши правки при завершении работы.Редактируйте конфигурационные файлы только при остановленном сервере.

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

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