MAATRIX GAMES / Блог / DayZ — types.xml и балансировка лута

DayZ — types.xml и балансировка лута

MAATRIX GAMES

Стандартный лут-баланс DayZ рассчитан на ванильную карту и ванильный онлайн, а у тебя, скорее всего, ни то ни другое — свой модпак, своя посещаемость, свои правила. В итоге либо сервер завален M4 и консервами так, что выживание превращается в симулятор мародёра, либо игроки бегают по пустым городам и матерятся в чат. Разбираемся, как устроен types.xml, что реально влияет на спавн, и как не положить сервер кривым тегом.

Где лежит types.xml и что в нём вообще есть

Файл находится в папке миссии сервера — там же, где cfgeconomycore.xml, cfgspawnabletypes.xml и cfgeventspawns.xml. Для дефолтной карты Chernarus путь обычно такой:

/serverfiles/mpmissions/dayzOffline.chernarusplus/db/types.xml

Если у тебя кастомная карта (Namalsk, Deer Isle, Livonia) — папка миссии будет называться иначе, и часто у модпака есть собственный types.xml, который подключается через cfgeconomycore.xml отдельной секцией <ce>. Это важно: если правишь не тот файл, изменения просто не применятся, а ты будешь полчаса гадать, почему.

types.xml — это плоский список записей <type>, по одной на каждый classname предмета: оружие, патроны, еда, одежда, стройка, транспортные части. Никакой вложенности по категориям тут нет, всё регулируется атрибутами внутри записи и её позицией относительно usage/value.

Анатомия одной записи

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

<type name="Mosin9130">
	<nominal>4</nominal>
	<lifetime>10800</lifetime>
	<restock>1800</restock>
	<min>2</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="weapons"/>
	<usage name="Military"/>
	<usage name="Police"/>
</type>

Разберём поля, которые реально управляют спавном:

  • nominal — целевое количество предметов данного типа, которое система лута старается поддерживать на карте одновременно. Это не жёсткий лимит, а ориентир, к которому стремится респ.
  • min — минимальный порог. Когда живых экземпляров становится меньше min, система начинает досыпать предметы до nominal. Если min равен nominal, респ практически непрерывный; если min сильно ниже nominal — предметы будут появляться волнами.
  • lifetime — время жизни предмета в секундах с момента спавна до деспавна, если его никто не подобрал и не переместил. У консервов оно обычно короче, чем у оружия — еда портится быстрее логически, да и разработчики закладывали более активный оборот.
  • restock — задержка в секундах перед тем, как система попробует заспавнить новую порцию предметов после того, как количество упало ниже min. Здесь часто и кроется ощущение "лута нет" — если restock большой (скажем, 1800 секунд), а сервер маленький и все подчищают лут быстро, у тебя будут долгие окна пустоты.
  • quantmin/quantmax — диапазон "наполненности" предмета при спавне: для магазина это патроны, для консервы — доля содержимого. -1 означает "без переопределения", то есть используется дефолт из конфига предмета.
  • cost — приоритет предмета в очереди на респ относительно других типов с той же категорией/usage. Чем выше, тем раньше система пытается его заспавнить при прочих равных.

Поднять сервер DayZ за пару минут

Готовый образ MAATRIX GAMES: NVMe, AMD EPYC, DDoS-защита, панель управления. Локации UK, US, RU. Оплата картой РФ, СБП или криптой.

Создать сервер

flags: где лут физически появляется

Блок <flags> определяет, в каких контекстах предмет может заспавниться:

<flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/>
  • count_in_cargo — считать ли предметы, лежащие в контейнерах (рюкзаки, ящики), при подсчёте текущего количества относительно nominal.
  • count_in_hoarder — учитывать ли предметы в "схронах" (закопанные тайники, бочки).
  • count_in_map — учитывать ли предметы, лежащие открыто на земле/в статичных точках лута.
  • count_in_player — учитывать ли предметы в инвентаре живых игроков.

Тонкость, которая ломает баланс многим админам: если count_in_cargo="0", а игроки массово перетаскивают лут в рюкзаки и ящики, система лута эти предметы "не видит" и продолжает спавнить новые, как будто их не существует. В итоге на карте физически накапливается куча вещей сверх задуманного nominal, сервер раздувается по числу активных объектов, и в какой-то момент это бьёт по производительности — лишние объекты на карте увеличивают нагрузку на симуляцию, особенно если их тысячи.

Для дефолтного оружия и брони обычно держат count_in_cargo="1", чтобы система честно считала весь лут независимо от того, где он лежит.

category и usage/tier: география спавна

Одних числовых порогов недостаточно — нужно ещё сказать системе, *где именно* на карте предмет может появиться:

<category name="weapons"/>
<usage name="Military"/>
<usage name="Police"/>
<value name="Tier2"/>
<value name="Tier3"/>
  • category — крупная группа (weapons, food, tools, clothes, containers...), в основном используется для UI-фильтров и общей классификации.
  • usage — тип локации: Military, Police, Medic, Industrial, Farm, Village, Hunting, Firefighter и так далее. Точки лута на карте (задаются в mapgroupproto.xml, который ты обычно не трогаешь) помечены соответствующим usage, и предмет заспавнится только там, где usage совпадает.
  • value (Tier1–Tier4) — географическая зона отдалённости от побережья. Tier1 — прибрежные новичковые зоны, Tier4 — глубокий север и военные локации. Хочешь, чтобы топовое оружие не валялось на старте у берега — убери у него Tier1/Tier2, оставь только Tier3/Tier4.

Комбинация usage + value — это твой главный рычаг балансировки без изменения nominal. Можно оставить количество прежним, но сместить военку подальше от новичковых зон, и ощущение баланса сильно изменится без риска сломать общий оборот лута.

Практика: балансируем оружие и еду

Возьмём частую задачу — на сервере слишком много огнестрела и слишком мало консервов, игроки жалуются, что приходится часами искать еду.

Для еды — увеличиваем nominal и снижаем restock, чтобы досыпало быстрее:

<type name="TunaCan">
	<nominal>40</nominal>
	<lifetime>3600</lifetime>
	<restock>600</restock>
	<min>25</min>
	...
</type>

Для оружия — снижаем nominal и min, чуть поднимаем restock, чтобы редкость ощущалась дольше:

<type name="M4A1">
	<nominal>3</nominal>
	<lifetime>10800</lifetime>
	<restock>3600</restock>
	<min>1</min>
	...
</type>

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

storage_1/storage_2 и когда правки реально применяются

DayZ сохраняет состояние всей персистентной экономики (лут, транспорт, палатки, трупы) в файлы storage_1.db и storage_2.db в папке миссии. Это работает как двойной буфер: сервер поочерёдно пишет то в один, то в другой файл, чтобы не потерять данные при краше во время записи.

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

Частые ошибки синтаксиса XML

XML — формат, к которому DayZ (точнее, движок Enfusion) относится строго: одна незакрытая скобка или лишний символ — и файл экономики просто не грузится, сервер либо стартует без лута, либо не стартует вовсе, с ошибкой в консоли/логе.

Самые частые грабли:

  • Незакрытый тег. <nominal>4</nominal без финальной > — сервер молча игнорирует файл или крашится при загрузке миссии.
  • Дублирующийся classname. Один и тот же <type name="..."> встречается дважды в файле — обычно результат copy-paste при массовой правке. Парсер либо возьмёт первую запись, либо (в зависимости от версии) выдаст ошибку — поведение не гарантировано, поэтому дубли лучше вычищать сразу.
  • Кириллица или спецсимволы в атрибутах. Комментарии <!-- ... --> с кириллицей обычно безопасны, а вот значения атрибутов лучше держать строго ASCII.
  • Опечатка в имени usage/value. <usage name="Militery"/> вместо Military — не вызовет краша, но предмет просто никогда не заспавнится, потому что ни одна точка лута не подпадёт под несуществующий тег. Такие ошибки — самые коварные, потому что сервер работает нормально, а конкретный предмет молча выпадает из ротации.
  • Числа с пробелами или запятой вместо точки. <cost>100 </cost> с завершающим пробелом иногда проходит, а <quantmin>-1,0</quantmin> с запятой вместо точки — почти всегда нет.

Перед заливкой на прод правки стоит проверить любым XML-валидатором (хватит даже встроенной проверки в VS Code с расширением XML или xmllint --noout types.xml в консоли) — это долей секунды экономит вечер разбора логов.

Массовая правка через сторонние тулы

Руками редактировать сотни записей в types.xml реально, но долго и чревато опечатками. На практике админы чаще используют:

  • Notepad++ / VS Code с массовым поиском-заменой по регулярным выражениям для однотипных правок (например, поднять всем записям с usage="Military" значение restock на фиксированную величину).
  • Онлайн/десктопные редакторы types.xml от комьюнити — они дают таблицу вместо голого XML, но перед использованием стоит свериться, под какую версию DayZ и структуру полей заточен конкретный инструмент, потому что после патчей игры набор classname иногда меняется.
  • Экспорт из существующей карты — если ставишь модпак вроде Namalsk или Deer Isle, у них обычно есть свой рекомендованный types.xml или патч к нему, и лучше отталкиваться от него, а не от ванильного, чтобы избежать конфликтов classname с объектами карты.

После установки модов — оружия, построек, новых точек лута — не забывай, что каждый мод, добавляющий предметы, обычно поставляется со своим куском types.xml, который нужно смёржить с основным файлом. Подробно про сам процесс установки модов и подключение -serverMod= — в статье про установку модов на DayZ-сервер.

Поднять сервер DayZ за пару минут

Готовый образ MAATRIX GAMES: NVMe, AMD EPYC, DDoS-защита, панель управления. Локации UK, US, RU. Оплата картой РФ, СБП или криптой.

Создать сервер

Частые вопросы

После правки types.xml лут не изменился, почему?

Значения nominal/min — это цель, к которой система стремится постепенно, а не мгновенный сброс. Дождись естественного оборота по lifetime/restock или почисти storage_1.db/storage_2.db для мгновенного эффекта (со сбросом текущей экономики).

Можно ли добавить в types.xml предмет, которого там нет?

Да, если у предмета есть валидный classname из конфига игры или мода — просто добавь новую запись <type name="..."> с нужными параметрами. Без существующего classname запись работать не будет.

Сервер не стартует после правки types.xml, что делать?

В первую очередь проверь файл валидатором XML на незакрытые теги и дубли classname — это причина девяти из десяти таких крашей. Ошибка в логе сервера обычно указывает примерную строку.

Как понять, что restock слишком большой?

Если игроки массово жалуются на пустые точки лута сразу после того, как кто-то там прошёлся, и предметы не появляются подолгу — это симптом завышенного restock относительно текущего онлайна. Снижай постепенно и наблюдай пару дней, а не меняй сразу в разы.

Влияет ли количество заспавненного лута на производительность сервера?

Да, каждый активный объект на карте — это нагрузка на симуляцию. Если из-за count_in_cargo="0" предметы бесконтрольно накапливаются в рюкзаках и ящиках, это может сказаться на стабильности, особенно в связке с другими проблемами — если сталкиваешься с крашами при плановом рестарте, вот разбор краша DayZ-сервера при рестарте, там частая причина именно в раздутой персистентности.