Skip to content

Глава 9.4: Подробно о лут-экономике

Главная | << Назад: Справочник serverDZ.cfg | Подробно о лут-экономике


Краткое содержание: Центральная Экономика (CE) -- это система, управляющая каждым спавном предметов в DayZ -- от банки фасоли на полке до АКМ в военных казармах. Эта глава объясняет полный цикл спавна, документирует каждое поле в types.xml, globals.xml, events.xml и cfgspawnabletypes.xml с реальными примерами из ванильных серверных файлов и описывает самые распространённые ошибки экономики.


Содержание


Как работает Центральная Экономика

Центральная Экономика (CE) -- это серверная система, работающая в непрерывном цикле. Её задача -- поддерживать популяцию предметов мира на уровнях, определённых в ваших конфигурационных файлах.

CE не размещает предметы при входе игрока в здание. Вместо этого она работает по глобальному таймеру и создаёт предметы по всей карте, независимо от близости игроков. У предметов есть время жизни -- когда этот таймер истекает и ни один игрок не взаимодействовал с предметом, CE удаляет его. Затем на следующем цикле она обнаруживает, что количество ниже целевого, и создаёт замену в другом месте.

Ключевые понятия:

  • Nominal -- целевое количество копий предмета, которое должно существовать на карте
  • Min -- порог, ниже которого CE попытается заспавнить предмет заново
  • Lifetime -- как долго (в секундах) нетронутый предмет сохраняется перед удалением
  • Restock -- минимальное время (в секундах) перед тем, как CE сможет заспавнить замену
  • Flags -- что учитывается в общем счёте (на карте, в контейнерах, в инвентаре игроков, в тайниках)

Цикл спавна

Вкратце: CE подсчитывает, сколько каждого предмета существует, сравнивает с целями nominal/min и создаёт замены, когда количество падает ниже min и таймер restock истёк.


types.xml -- определения спавна предметов

Это самый важный файл экономики. Каждый предмет, который может появиться в мире, нуждается в записи здесь. Ванильный types.xml для Чернаруси содержит приблизительно 23 000 строк, охватывающих тысячи предметов.

Реальные примеры types.xml

Оружие -- AKM

xml
<type name="AKM">
    <nominal>3</nominal>
    <lifetime>7200</lifetime>
    <restock>3600</restock>
    <min>2</min>
    <quantmin>30</quantmin>
    <quantmax>80</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"/>
    <value name="Tier4"/>
</type>

AKM -- редкое оружие высокого уровня. На карте может существовать только 3 экземпляра одновременно (nominal). Оно появляется в военных зданиях в зонах Tier 4 (северо-запад). Когда игрок подбирает его, CE видит, что количество на карте упало ниже min=2, и заспавнит замену через минимум 3600 секунд (1 час). Оружие появляется с 30-80% патронов во внутреннем магазине (quantmin/quantmax).

Еда -- BakedBeansCan

xml
<type name="BakedBeansCan">
    <nominal>15</nominal>
    <lifetime>14400</lifetime>
    <restock>0</restock>
    <min>12</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="food"/>
    <tag name="shelves"/>
    <usage name="Town"/>
    <usage name="Village"/>
    <value name="Tier1"/>
    <value name="Tier2"/>
    <value name="Tier3"/>
</type>

Консервированная фасоль -- распространённая еда. 15 банок должно существовать в любой момент. Они появляются на полках в зданиях Town и Village в зонах Tier 1-3 (побережье и центр карты). restock=0 означает мгновенную готовность к респавну. quantmin=-1 и quantmax=-1 означают, что предмет не использует систему количества (это не жидкость и не боеприпасы).

Одежда -- RidersJacket_Black

xml
<type name="RidersJacket_Black">
    <nominal>14</nominal>
    <lifetime>28800</lifetime>
    <restock>0</restock>
    <min>10</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="clothes"/>
    <usage name="Town"/>
    <value name="Tier1"/>
    <value name="Tier2"/>
</type>

Обычная гражданская куртка. 14 экземпляров на карте, находится в городских зданиях вблизи побережья (Tier 1-2). Lifetime 28800 секунд (8 часов) означает, что она сохраняется долго, если никто не подберёт.

Медицина -- BandageDressing

xml
<type name="BandageDressing">
    <nominal>40</nominal>
    <lifetime>14400</lifetime>
    <restock>0</restock>
    <min>30</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"/>
    <tag name="shelves"/>
    <usage name="Medic"/>
</type>

Бинты очень распространены (40 nominal). Они появляются в зданиях Medic (больницы, клиники) во всех зонах (отсутствие тега <value> означает все зоны). Обратите внимание, что категория -- "tools", а не "medical" -- в DayZ нет категории medical; медицинские предметы используют категорию tools.

Отключённый предмет (созданный вариант)

xml
<type name="AK101_Black">
    <nominal>0</nominal>
    <lifetime>28800</lifetime>
    <restock>0</restock>
    <min>0</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="1" deloot="0"/>
    <category name="weapons"/>
</type>

nominal=0 и min=0 означают, что CE никогда не заспавнит этот предмет. crafted=1 указывает, что его можно получить только через крафт (покраска оружия). У него всё ещё есть lifetime, чтобы сохранённые экземпляры со временем были удалены.


Справочник полей types.xml

Основные поля

ПолеТипДиапазонОписание
namestring--Имя класса предмета. Должно точно совпадать с именем класса в игре.
nominalint0+Целевое количество этого предмета на карте. Установите 0 для предотвращения спавна.
minint0+Когда количество падает до этого значения или ниже, CE попытается заспавнить ещё.
lifetimeintсекундыКак долго нетронутый предмет существует перед удалением CE.
restockintсекундыМинимальная задержка перед тем, как CE сможет заспавнить замену. 0 = мгновенно.
quantminint-1 до 100Минимальный процент количества при спавне (% патронов, % жидкости). -1 = неприменимо.
quantmaxint-1 до 100Максимальный процент количества при спавне. -1 = неприменимо.
costint0+Вес приоритета для выбора спавна. В настоящее время все ванильные предметы используют 100.

Флаги

xml
<flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/>
ФлагЗначенияОписание
count_in_map0, 1Считать предметы, лежащие на земле или в точках спавна зданий. Почти всегда 1.
count_in_cargo0, 1Считать предметы внутри других контейнеров (рюкзаки, палатки).
count_in_hoarder0, 1Считать предметы в тайниках, бочках, закопанных контейнерах, палатках.
count_in_player0, 1Считать предметы в инвентаре игрока (на теле или в руках).
crafted0, 1При 1 этот предмет можно получить только через крафт, а не через спавн CE.
deloot0, 1Лут динамических событий. При 1 предмет появляется только в местах динамических событий (крушения вертолётов и т.д.).

Стратегия флагов имеет значение. Если count_in_player=1, каждый АКМ, который несёт игрок, считается в номинал. Это означает, что подбор АКМ не вызовет респавн, потому что счёт не изменился. Большинство ванильных предметов используют count_in_player=0, чтобы предметы в руках игроков не блокировали респавн.

Теги

ЭлементНазначениеОпределён в
<category name="..."/>Категория предмета для сопоставления с точками спавнаcfglimitsdefinition.xml
<usage name="..."/>Тип здания, где этот предмет может появитьсяcfglimitsdefinition.xml
<value name="..."/>Зона уровня карты, где этот предмет может появитьсяcfglimitsdefinition.xml
<tag name="..."/>Тип позиции спавна внутри зданияcfglimitsdefinition.xml

Допустимые категории: tools, containers, clothes, food, weapons, books, explosives, lootdispatch

Допустимые флаги usage: Military, Police, Medic, Firefighter, Industrial, Farm, Coast, Town, Village, Hunting, Office, School, Prison, Lunapark, SeasonalEvent, ContaminatedArea, Historical

Допустимые флаги value: Tier1, Tier2, Tier3, Tier4, Unique

Допустимые теги: floor, shelves, ground

Предмет может иметь несколько тегов <usage> и <value>. Несколько usage означают, что он может появиться в любом из этих типов зданий. Несколько value означают, что он может появиться в любой из этих зон.

Если вы полностью опустите <value>, предмет появляется во всех зонах. Если вы опустите <usage>, у предмета нет допустимого места спавна и он не появится.


globals.xml -- параметры экономики

Этот файл управляет глобальным поведением CE. Все параметры из ванильного файла:

xml
<variables>
    <var name="AnimalMaxCount" type="0" value="200"/>
    <var name="CleanupAvoidance" type="0" value="100"/>
    <var name="CleanupLifetimeDeadAnimal" type="0" value="1200"/>
    <var name="CleanupLifetimeDeadInfected" type="0" value="330"/>
    <var name="CleanupLifetimeDeadPlayer" type="0" value="3600"/>
    <var name="CleanupLifetimeDefault" type="0" value="45"/>
    <var name="CleanupLifetimeLimit" type="0" value="50"/>
    <var name="CleanupLifetimeRuined" type="0" value="330"/>
    <var name="FlagRefreshFrequency" type="0" value="432000"/>
    <var name="FlagRefreshMaxDuration" type="0" value="3456000"/>
    <var name="FoodDecay" type="0" value="1"/>
    <var name="IdleModeCountdown" type="0" value="60"/>
    <var name="IdleModeStartup" type="0" value="1"/>
    <var name="InitialSpawn" type="0" value="100"/>
    <var name="LootDamageMax" type="1" value="0.82"/>
    <var name="LootDamageMin" type="1" value="0.0"/>
    <var name="LootProxyPlacement" type="0" value="1"/>
    <var name="LootSpawnAvoidance" type="0" value="100"/>
    <var name="RespawnAttempt" type="0" value="2"/>
    <var name="RespawnLimit" type="0" value="20"/>
    <var name="RespawnTypes" type="0" value="12"/>
    <var name="RestartSpawn" type="0" value="0"/>
    <var name="SpawnInitial" type="0" value="1200"/>
    <var name="TimeHopping" type="0" value="60"/>
    <var name="TimeLogin" type="0" value="15"/>
    <var name="TimeLogout" type="0" value="15"/>
    <var name="TimePenalty" type="0" value="20"/>
    <var name="WorldWetTempUpdate" type="0" value="1"/>
    <var name="ZombieMaxCount" type="0" value="1000"/>
    <var name="ZoneSpawnDist" type="0" value="300"/>
</variables>

Атрибут type указывает тип данных: 0 = целое число, 1 = число с плавающей точкой.

Полный справочник параметров

ПараметрТипПо умолчаниюОписание
AnimalMaxCountint200Максимальное количество животных, живых на карте одновременно.
CleanupAvoidanceint100Расстояние в метрах от игрока, в пределах которого CE НЕ будет удалять предметы. Предметы в этом радиусе защищены от истечения lifetime.
CleanupLifetimeDeadAnimalint1200Секунды до удаления трупа мёртвого животного. (20 минут)
CleanupLifetimeDeadInfectedint330Секунды до удаления трупа мёртвого зомби. (5.5 минут)
CleanupLifetimeDeadPlayerint3600Секунды до удаления тела мёртвого игрока. (1 час)
CleanupLifetimeDefaultint45Время очистки по умолчанию в секундах для предметов без определённого lifetime.
CleanupLifetimeLimitint50Максимальное количество предметов, обрабатываемых за один цикл очистки.
CleanupLifetimeRuinedint330Секунды до удаления разрушенных предметов. (5.5 минут)
FlagRefreshFrequencyint432000Как часто флагшток должен быть "обновлён" взаимодействием для предотвращения разрушения базы, в секундах. (5 дней)
FlagRefreshMaxDurationint3456000Максимальный срок жизни флагштока даже при регулярном обновлении, в секундах. (40 дней)
FoodDecayint1Включить (1) или отключить (0) порчу еды со временем.
IdleModeCountdownint60Секунды до перехода сервера в режим ожидания, когда нет подключённых игроков.
IdleModeStartupint1Запускается ли сервер в режиме ожидания (1) или в активном режиме (0).
InitialSpawnint100Процент от номинальных значений для спавна при первом запуске сервера (0-100).
LootDamageMaxfloat0.82Максимальное состояние повреждения для случайно заспавненного лута (0.0 = новый, 1.0 = разрушен).
LootDamageMinfloat0.0Минимальное состояние повреждения для случайно заспавненного лута.
LootProxyPlacementint1Включить (1) визуальное размещение предметов на полках/столах вместо случайного размещения на полу.
LootSpawnAvoidanceint100Расстояние в метрах от игрока, в пределах которого CE НЕ будет создавать новый лут. Предотвращает появление предметов на глазах у игроков.
RespawnAttemptint2Количество попыток поиска позиции спавна на предмет за цикл CE перед отказом.
RespawnLimitint20Максимальное количество предметов, которые CE будет респавнить за цикл.
RespawnTypesint12Максимальное количество различных типов предметов, обрабатываемых за цикл респавна.
RestartSpawnint0При 1 -- перерандомизировать все позиции лута при перезапуске сервера. При 0 -- загрузить из персистентности.
SpawnInitialint1200Количество предметов для спавна при начальном наполнении экономики при первом запуске.
TimeHoppingint60Задержка в секундах, предотвращающая переподключение игрока к тому же серверу (защита от серверхоппинга).
TimeLoginint15Таймер обратного отсчёта входа в секундах (таймер "Подождите" при подключении).
TimeLogoutint15Таймер обратного отсчёта выхода в секундах. Игрок остаётся в мире в течение этого времени.
TimePenaltyint20Дополнительное штрафное время в секундах, добавляемое к таймеру выхода при некорректном отключении (Alt+F4).
WorldWetTempUpdateint1Включить (1) или отключить (0) обновления симуляции температуры и влажности мира.
ZombieMaxCountint1000Максимальное количество зомби, живых на карте одновременно.
ZoneSpawnDistint300Расстояние в метрах от игрока, на котором активируются зоны спавна зомби.

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

Больше лута (PvP-сервер):

xml
<var name="InitialSpawn" type="0" value="100"/>
<var name="RespawnLimit" type="0" value="50"/>
<var name="RespawnTypes" type="0" value="30"/>
<var name="RespawnAttempt" type="0" value="4"/>

Более длительное сохранение тел (больше времени на лут убитых):

xml
<var name="CleanupLifetimeDeadPlayer" type="0" value="7200"/>

Более быстрое разрушение баз (быстрый вайп неактивных баз):

xml
<var name="FlagRefreshFrequency" type="0" value="259200"/>
<var name="FlagRefreshMaxDuration" type="0" value="1728000"/>

events.xml -- динамические события

События определяют спавн сущностей, требующих специальной обработки: животных, транспорта и крушений вертолётов. В отличие от предметов types.xml, которые появляются внутри зданий, события появляются в заранее определённых мировых позициях, указанных в cfgeventspawns.xml.

Реальный пример события транспорта

xml
<event name="VehicleCivilianSedan">
    <nominal>8</nominal>
    <min>5</min>
    <max>11</max>
    <lifetime>300</lifetime>
    <restock>0</restock>
    <saferadius>500</saferadius>
    <distanceradius>500</distanceradius>
    <cleanupradius>200</cleanupradius>
    <flags deletable="0" init_random="0" remove_damaged="1"/>
    <position>fixed</position>
    <limit>mixed</limit>
    <active>1</active>
    <children>
        <child lootmax="0" lootmin="0" max="5" min="3" type="CivilianSedan"/>
        <child lootmax="0" lootmin="0" max="5" min="3" type="CivilianSedan_Black"/>
        <child lootmax="0" lootmin="0" max="5" min="3" type="CivilianSedan_Wine"/>
    </children>
</event>

Реальный пример события животных

xml
<event name="AnimalBear">
    <nominal>0</nominal>
    <min>2</min>
    <max>2</max>
    <lifetime>180</lifetime>
    <restock>0</restock>
    <saferadius>200</saferadius>
    <distanceradius>0</distanceradius>
    <cleanupradius>0</cleanupradius>
    <flags deletable="0" init_random="0" remove_damaged="1"/>
    <position>fixed</position>
    <limit>custom</limit>
    <active>1</active>
    <children>
        <child lootmax="0" lootmin="0" max="1" min="1" type="Animal_UrsusArctos"/>
    </children>
</event>

Справочник полей событий

ПолеОписание
nameИдентификатор события. Должен совпадать с записью в cfgeventspawns.xml для событий с position="fixed".
nominalЦелевое количество активных групп событий на карте.
minМинимальное количество участников группы на точку спавна.
maxМаксимальное количество участников группы на точку спавна.
lifetimeСекунды до удаления события и повторного спавна. Для транспорта это интервал проверки респавна, а не время жизни самого транспорта.
restockМинимальные секунды между респавнами.
saferadiusМинимальное расстояние в метрах от игрока для спавна события.
distanceradiusМинимальное расстояние между двумя экземплярами одного события.
cleanupradiusРасстояние от любого игрока, в пределах которого событие НЕ будет удалено.
deletableМожет ли CE удалить эту сущность события (0 = нет).
init_randomРандомизировать начальные позиции (0 = использовать фиксированные позиции).
remove_damagedУдалить сущность события при повреждении/разрушении (1 = да).
position"fixed" = использовать позиции из cfgeventspawns.xml. "player" = спавн вблизи игроков.
limit"child" = лимит по типу дочернего элемента. "mixed" = лимит для всех дочерних. "custom" = особое поведение.
active1 = включено, 0 = отключено.

Дочерние элементы

Каждый элемент <child> определяет вариант, который может быть заспавнен:

АтрибутОписание
typeИмя класса сущности для спавна.
minМинимальное количество экземпляров этого варианта (для limit="child").
maxМаксимальное количество экземпляров этого варианта (для limit="child").
lootminМинимальное количество предметов лута, заспавненных внутри/на сущности.
lootmaxМаксимальное количество предметов лута, заспавненных внутри/на сущности.

cfgspawnabletypes.xml -- вложения и содержимое

Этот файл определяет, какие вложения, содержимое и состояние повреждения имеет предмет при спавне. Без записи здесь предметы появляются пустыми и со случайным уроном (в пределах LootDamageMin/LootDamageMax из globals.xml).

Оружие с вложениями -- AKM

xml
<type name="AKM">
    <damage min="0.45" max="0.85" />
    <attachments chance="1.00">
        <item name="AK_PlasticBttstck" chance="1.00" />
    </attachments>
    <attachments chance="1.00">
        <item name="AK_PlasticHndgrd" chance="1.00" />
    </attachments>
    <attachments chance="0.50">
        <item name="KashtanOptic" chance="0.30" />
        <item name="PSO11Optic" chance="0.20" />
    </attachments>
    <attachments chance="0.05">
        <item name="AK_Suppressor" chance="1.00" />
    </attachments>
    <attachments chance="0.30">
        <item name="Mag_AKM_30Rnd" chance="1.00" />
    </attachments>
</type>

Чтение этой записи:

  1. АКМ появляется с повреждением от 45-85% (изношен до сильно повреждённого)
  2. Он всегда (100%) получает пластиковый приклад и цевьё
  3. 50% шанс заполнения слота прицела -- если заполнен, 30% шанс на Kashtan, 20% на PSO-11
  4. 5% шанс глушителя
  5. 30% шанс заряженного магазина

Каждый блок <attachments> представляет один слот вложений. chance в блоке -- вероятность заполнения этого слота вообще. chance у каждого <item> внутри -- относительный вес выбора -- CE выбирает один предмет из списка, используя их как веса.

Оружие с вложениями -- M4A1

xml
<type name="M4A1">
    <damage min="0.45" max="0.85" />
    <attachments chance="1.00">
        <item name="M4_OEBttstck" chance="1.00" />
    </attachments>
    <attachments chance="1.00">
        <item name="M4_PlasticHndgrd" chance="1.00" />
    </attachments>
    <attachments chance="1.00">
        <item name="BUISOptic" chance="0.50" />
        <item name="M4_CarryHandleOptic" chance="1.00" />
    </attachments>
    <attachments chance="0.30">
        <item name="Mag_CMAG_40Rnd" chance="0.15" />
        <item name="Mag_CMAG_10Rnd" chance="0.50" />
        <item name="Mag_CMAG_20Rnd" chance="0.70" />
        <item name="Mag_CMAG_30Rnd" chance="1.00" />
    </attachments>
</type>

Жилет с подсумками -- PlateCarrierVest_Camo

xml
<type name="PlateCarrierVest_Camo">
    <damage min="0.1" max="0.6" />
    <attachments chance="0.85">
        <item name="PlateCarrierHolster_Camo" chance="1.00" />
    </attachments>
    <attachments chance="0.85">
        <item name="PlateCarrierPouches_Camo" chance="1.00" />
    </attachments>
</type>

Рюкзак с содержимым

xml
<type name="AssaultBag_Ttsko">
    <cargo preset="mixArmy" />
    <cargo preset="mixArmy" />
    <cargo preset="mixArmy" />
</type>

Атрибут preset ссылается на пул лута, определённый в cfgrandompresets.xml. Каждая строка <cargo> -- один бросок -- этот рюкзак получает 3 броска из пула mixArmy. Значение chance самого пула определяет, создаст ли каждый бросок предмет.

Предметы только для хранения

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

Тег <hoarder /> помечает предметы как контейнеры для хранения. CE учитывает предметы внутри них отдельно, используя флаг count_in_hoarder из types.xml.

Переопределение урона при спавне

xml
<type name="BandageDressing">
    <damage min="0.0" max="0.0" />
</type>

Принудительно заставляет бинты всегда появляться в состоянии "Новый", переопределяя глобальные значения LootDamageMin/LootDamageMax из globals.xml.


Расширение cfgspawnabletypes.xml (1.28+)

DayZ 1.28 значительно расширил возможности cfgspawnabletypes.xml. Теперь можно спавнить оружие полностью снаряжённым с вложениями, содержимым и даже патроном в патроннике.

quantmin / quantmax для размеров стеков

Управление наполненностью стекируемых предметов (0-100%):

xml
<type name="Ammo_556x45">
    <cargo>
        <item name="Ammo_556x45" quantmin="50" quantmax="100" />
    </cargo>
</type>

Атрибуты quantmin и quantmax у вложенных элементов <item> работают так же, как в types.xml --- задают процентный диапазон для предметов на основе количества, таких как боеприпасы и жидкости. Значение 50 означает, что предмет появляется как минимум наполовину заполненным.

Вложенные содержимое и вложения предметов

Предметы, появляющиеся внутри других предметов, сами могут иметь вложения и содержимое:

xml
<type name="M4A1">
    <attachments>
        <item name="M4_RISHndgrd" />
        <item name="M68Optic" />
    </attachments>
    <cargo>
        <item name="Mag_STANAG_30Rnd" quantmin="50" quantmax="100" />
    </cargo>
</type>

Это спавнит M4A1 с цевьём RIS и прицелом M68, плюс магазин STANAG в содержимом, заполненный на 50-100%. До 1.28 предметы в содержимом не могли иметь собственное количество, заданное инлайн.

Вложенный урон min/max

Управление состоянием повреждённости вложенных предметов независимо от родителя:

xml
<type name="AKM">
    <attachments>
        <item name="AK_Bayonet">
            <damage min="0.0" max="0.3" />
        </item>
    </attachments>
</type>

Штык-нож появляется в состоянии от нового до поношенного, независимо от состояния самого АКМ. Это позволяет гарантировать, что ценные вложения появляются в лучшем состоянии, чем само оружие.

Оружие с патроном в патроннике (1.28+)

Оружие теперь может появляться с патроном в патроннике и патронами во внутреннем магазине:

xml
<type name="Mosin9130">
    <!-- Оружие появляется с патронами во внутреннем магазине -->
</type>

Это настраивается через cfgspawnabletypes.xml в сочетании с randompresets.xml. Система пресетов управляет типом и количеством патронов, а запись spawnable type привязывает оружие к пресету.

Вложенные пресеты через equip="true"

Ссылка на пресеты снаряжения для заспавненных предметов с помощью атрибута equip:

xml
<type name="M4A1">
    <attachments preset="M4Preset" equip="true" />
</type>

Когда установлен equip="true", пресет применяется как полный набор снаряжения на заспавненный предмет, а не выбирает один случайный предмет из пула. Это полезно для определения полных конфигураций оружия как переиспользуемых пресетов.

randompresets.xml теперь дополняем

Начиная с 1.28, randompresets.xml можно дополнять через cfgeconomycore.xml, позволяя модам добавлять пресеты без перезаписи ванильных:

xml
<!-- В cfgeconomycore.xml -->
<ce folder="db">
    <file name="my_presets.xml" type="randompresets" />
</ce>

Это значительное улучшение совместимости модов. Ранее любой мод, которому были нужны пользовательские случайные пресеты, должен был заменять весь файл randompresets.xml, вызывая конфликты при загрузке нескольких модов. Теперь каждый мод может поставлять свой собственный файл пресетов и регистрировать его через cfgeconomycore.xml.


Взаимосвязь nominal/restock

Понимание совместной работы nominal, min и restock критично для настройки экономики.

Формула

ЕСЛИ (текущее_количество < min) И (время_с_последнего_спавна > restock):
    заспавнить новый предмет (до nominal)

Пример с AKM:

  • nominal = 3, min = 2, restock = 3600
  • Сервер запускается: CE спавнит 3 АКМ по карте
  • Игрок подбирает 1 АКМ: количество на карте падает до 2
  • Количество (2) НЕ меньше min (2), поэтому респавна пока нет
  • Игрок подбирает ещё один АКМ: количество на карте падает до 1
  • Количество (1) МЕНЬШЕ min (2), и запускается таймер restock (3600с = 1 час)
  • Через 1 час CE спавнит 2 новых АКМ для достижения nominal (3) снова

Пример с BakedBeansCan:

  • nominal = 15, min = 12, restock = 0
  • Игрок съедает банку: количество на карте падает до 14
  • Количество (14) НЕ меньше min (12), поэтому респавна нет
  • Ещё 3 банки съедены: количество падает до 11
  • Количество (11) МЕНЬШЕ min (12), restock равен 0 (мгновенно)
  • Следующий цикл CE: спавнит 4 банки для достижения nominal (15)

Ключевые выводы

  • Разрыв между nominal и min определяет, сколько предметов может быть "потреблено" до реакции CE. Малый разрыв (как у АКМ: 3/2) означает, что CE реагирует уже после 2 подборов. Большой разрыв означает, что больше предметов может покинуть экономику до начала респавна.

  • restock = 0 делает респавн фактически мгновенным (следующий цикл CE). Высокие значения restock создают дефицит -- CE знает, что нужно спавнить больше, но должна ждать.

  • Lifetime не зависит от nominal/min. Даже если CE заспавнила предмет для достижения nominal, предмет будет удалён при истечении lifetime, если никто его не тронет. Это создаёт постоянную "ротацию" предметов, появляющихся и исчезающих по всей карте.

  • Предметы, которые игроки подбирают, а затем бросают (в другом месте), всё равно учитываются, если установлен соответствующий флаг. Брошенный АКМ на земле всё ещё считается в общее количество на карте, потому что count_in_map=1.


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

Предмет имеет запись в types.xml, но не появляется

Проверьте по порядку:

  1. nominal больше 0?
  2. У предмета есть хотя бы один тег <usage>? (Нет usage = нет допустимого места спавна)
  3. Тег <usage> определён в cfglimitsdefinition.xml?
  4. Тег <value> (если есть) определён в cfglimitsdefinition.xml?
  5. Тег <category> допустим?
  6. Предмет указан в cfgignorelist.xml? (Перечисленные там предметы заблокированы)
  7. Флаг crafted установлен в 1? (Крафтовые предметы никогда не спавнятся естественно)
  8. RestartSpawn в globals.xml установлен в 0 с существующей персистентностью? (Старая персистентность может блокировать спавн новых предметов до вайпа)

Предметы появляются, но немедленно исчезают

Значение lifetime слишком низкое. Lifetime в 45 секунд (CleanupLifetimeDefault) означает, что предмет удаляется практически сразу. Оружие должно иметь lifetime 7200-28800 секунд.

Слишком много/мало предмета

Настройте nominal и min вместе. Если вы установите nominal=100, но min=1, CE не будет спавнить замены, пока не будет взято 99 предметов. Если вам нужно стабильное снабжение, держите min близко к nominal (например, nominal=20, min=15).

Предметы появляются только в одной области

Проверьте теги <value>. Если у предмета только <value name="Tier4"/>, он будет появляться только в северо-западной военной зоне Чернаруси. Добавьте больше зон для распределения по карте:

xml
<value name="Tier1"/>
<value name="Tier2"/>
<value name="Tier3"/>
<value name="Tier4"/>

Модовые предметы не появляются

При добавлении предметов из мода в types.xml:

  1. Убедитесь, что мод загружен (указан в параметре -mod=)
  2. Проверьте, что имя класса точно совпадает (чувствительно к регистру)
  3. Добавьте теги category/usage/value -- просто наличие записи в types.xml недостаточно
  4. Если мод добавляет новые теги usage или value, добавьте их в cfglimitsdefinitionuser.xml
  5. Проверьте скрипт-лог на предупреждения о неизвестных именах классов

Запчасти не появляются внутри транспорта

Запчасти транспорта спавнятся через cfgspawnabletypes.xml, а не types.xml. Если транспорт появляется без колёс или аккумулятора, проверьте, что у него есть запись в cfgspawnabletypes.xml с соответствующими определениями вложений.

Весь лут в состоянии "Новый" или весь лут "Разрушен"

Проверьте LootDamageMin и LootDamageMax в globals.xml. Ванильные значения -- 0.0 и 0.82. Установка обоих в 0.0 делает всё новым. Установка обоих в 1.0 делает всё разрушенным. Также проверьте переопределения для конкретных предметов в cfgspawnabletypes.xml.

Экономика "зависла" после редактирования types.xml

После редактирования файлов экономики выполните одно из:

  • Удалите storage_1/ для полного вайпа и нового старта экономики
  • Установите RestartSpawn в 1 в globals.xml на один перезапуск для перерандомизации лута, затем верните обратно в 0
  • Дождитесь естественного истечения lifetime предметов (может занять часы)

Назад: Справочник serverDZ.cfg | Главная | Далее: Спавн транспорта и динамические события

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