DayZ — types.xml и балансировка лута
Стандартный лут-баланс 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-сервера при рестарте, там частая причина именно в раздутой персистентности.