Skip to content

Глава 9.5: Спавн транспорта и динамические события

Главная | << Назад: Лут-экономика | Далее: Спавн игроков >>


Краткое содержание: Транспорт и динамические события (крушения вертолётов, конвои, полицейские машины) НЕ используют types.xml. Они используют отдельную систему из трёх файлов: events.xml определяет, что появляется и в каком количестве, cfgeventspawns.xml определяет где, а cfgeventgroups.xml определяет групповые формации. Эта глава охватывает все три файла с реальными ванильными значениями.


Содержание


Как работает спавн транспорта

Транспорт не определяется в types.xml. Если вы добавите класс транспорта в types.xml, он не появится. Транспорт использует выделенный трёхфайловый конвейер:

  1. events.xml -- Определяет каждое событие транспорта: сколько должно существовать на карте (nominal), какие варианты могут появиться (children) и флаги поведения -- lifetime и безопасный радиус.

  2. cfgeventspawns.xml -- Определяет физические мировые позиции, где события транспорта могут размещать сущности. Каждое имя события связано со списком записей <pos> с координатами x, z и углом.

  3. cfgeventgroups.xml -- Определяет групповой спавн, где несколько объектов появляются вместе с относительными смещениями позиций (например, разбитые поезда).

CE читает events.xml, выбирает событие, требующее спавна, ищет подходящие позиции в cfgeventspawns.xml, выбирает случайную позицию, удовлетворяющую ограничениям saferadius и distanceradius, затем спавнит случайно выбранную дочернюю сущность в этой позиции.

Все три файла находятся в mpmissions/<ваша_миссия>/db/.


Записи транспорта в events.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>

Все ванильные события транспорта

Все события транспорта используют ту же структуру, что и седан выше. Различаются только значения:

Имя событияNominalMinMaxLifetimeВарианты (дочерние)
VehicleCivilianSedan8511300CivilianSedan, _Black, _Wine
VehicleOffroadHatchback8511300OffroadHatchback, _Blue, _White
VehicleHatchback028511300Варианты Hatchback02
VehicleSedan028511300Варианты Sedan02
VehicleTruck018511300Варианты грузовика V3S
VehicleOffroad02323300Gunter -- меньше спавнится
VehicleBoat221824600Лодки -- наибольшее количество, больший lifetime

У VehicleOffroad02 nominal ниже (3), чем у других наземных транспортных средств (8). У VehicleBoat и наибольший nominal (22), и больший lifetime (600 против 300).


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

Поля уровня события

ПолеТипОписание
namestringИдентификатор события. Должен совпадать с записью в cfgeventspawns.xml, когда position="fixed".
nominalintЦелевое количество активных экземпляров этого события на карте.
minintCE попытается заспавнить ещё, когда количество упадёт ниже этого значения.
maxintЖёсткий верхний предел. CE никогда не превысит это количество.
lifetimeintСекунды между проверками респавна. Для транспорта это НЕ время жизни самого транспорта -- это интервал, с которым CE переоценивает, нужно ли спавнить или удалять.
restockintМинимальные секунды между попытками респавна. 0 = следующий цикл.
saferadiusintМинимальное расстояние (в метрах) от любого игрока для спавна события. Предотвращает появление транспорта на глазах у игроков.
distanceradiusintМинимальное расстояние (в метрах) между двумя экземплярами одного события. Предотвращает появление двух седанов рядом друг с другом.
cleanupradiusintЕсли игрок находится в пределах этого расстояния (в метрах), сущность события защищена от удаления.

Флаги

ФлагЗначенияОписание
deletable0, 1Может ли CE удалить эту сущность события. Транспорт использует 0 (не удаляется CE).
init_random0, 1Рандомизировать начальные позиции при первом спавне. 0 = использовать фиксированные позиции из cfgeventspawns.xml.
remove_damaged0, 1Удалить сущность при разрушении. Критично для транспорта -- см. Распространённые ошибки.

Прочие поля

ПолеЗначенияОписание
positionfixed, playerfixed = спавн в позициях из cfgeventspawns.xml. player = спавн относительно позиций игроков.
limitchild, mixed, customchild = min/max применяются к каждому типу дочернего элемента. mixed = min/max общие для всех дочерних. custom = специфическое поведение движка.
active0, 1Включить или отключить это событие. 0 = событие полностью пропускается.

Поля дочерних элементов

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

cfgeventspawns.xml -- позиции спавна

Этот файл связывает имена событий с мировыми координатами. Каждый блок <event> содержит список допустимых позиций спавна для этого типа события. Когда CE нужно заспавнить транспорт, она выбирает случайную позицию из этого списка, удовлетворяющую ограничениям saferadius и distanceradius.

xml
<event name="VehicleCivilianSedan">
    <pos x="4509.1" z="9321.5" a="172"/>
    <pos x="6283.7" z="2468.3" a="90"/>
    <pos x="11447.2" z="11203.8" a="45"/>
    <pos x="2961.4" z="5107.6" a="0"/>
    <!-- ... больше позиций ... -->
</event>

У каждой <pos> три атрибута:

АтрибутОписание
xМировая координата X (позиция восток-запад на карте).
zМировая координата Z (позиция север-юг на карте).
aУгол в градусах (0-360). Направление, куда смотрит транспорт при спавне.

Ключевые правила:

  • Если у события нет соответствующего блока <event> в cfgeventspawns.xml, оно не появится независимо от конфигурации в events.xml.
  • Вам нужно как минимум столько записей <pos>, сколько ваше значение nominal. Если вы установите nominal=8, но имеете только 3 позиции, появятся только 3.
  • Позиции должны быть на дорогах или ровной поверхности. Позиция внутри здания или на крутом склоне приведёт к тому, что транспорт появится закопанным или перевёрнутым.
  • Значение a (угол) определяет направление транспорта. Выравнивайте его с направлением дороги для естественного вида.

События крушений вертолётов

Крушения вертолётов -- это динамические события, создающие обломки с военным лутом и окружающими заражёнными. Они используют тег <secondary> для определения спавна зомби-окружения вокруг места крушения.

xml
<event name="StaticHeliCrash">
    <nominal>3</nominal>
    <min>1</min>
    <max>3</max>
    <lifetime>2100</lifetime>
    <restock>0</restock>
    <saferadius>1000</saferadius>
    <distanceradius>500</distanceradius>
    <cleanupradius>200</cleanupradius>
    <secondary>InfectedArmy</secondary>
    <flags deletable="1" init_random="0" remove_damaged="0"/>
    <position>fixed</position>
    <limit>mixed</limit>
    <active>1</active>
    <children>
        <child lootmax="15" lootmin="10" max="3" min="1" type="Wreck_UH1Y"/>
    </children>
</event>

Ключевые отличия от событий транспорта

  • <secondary>InfectedArmy</secondary> -- спавнит военных зомби вокруг места крушения. Этот тег ссылается на группу спавна заражённых, которую CE размещает поблизости.
  • lootmin="10" / lootmax="15" -- обломки появляются с 10-15 предметами лута динамических событий. Это предметы с флагом deloot="1" в types.xml (военное снаряжение, редкое оружие).
  • lifetime=2100 -- крушение сохраняется 35 минут, прежде чем CE удалит его и заспавнит новое в другом месте.
  • saferadius=1000 -- крушения никогда не появляются в пределах 1 км от игрока.
  • remove_damaged=0 -- обломки уже "повреждены" по определению, поэтому это должно быть 0, иначе они были бы немедленно удалены.

Военный конвой

Военные конвои -- это статические группы разбитых машин, которые появляются с военным лутом и заражёнными охранниками.

xml
<event name="StaticMilitaryConvoy">
    <nominal>5</nominal>
    <min>3</min>
    <max>5</max>
    <lifetime>1800</lifetime>
    <restock>0</restock>
    <saferadius>1000</saferadius>
    <distanceradius>500</distanceradius>
    <cleanupradius>200</cleanupradius>
    <secondary>InfectedArmy</secondary>
    <flags deletable="1" init_random="0" remove_damaged="0"/>
    <position>fixed</position>
    <limit>mixed</limit>
    <active>1</active>
    <children>
        <child lootmax="10" lootmin="5" max="5" min="3" type="Wreck_V3S"/>
    </children>
</event>

Конвои работают идентично крушениям вертолётов: тег <secondary> спавнит InfectedArmy вокруг места, а предметы лута с deloot="1" появляются на обломках. С nominal=5 до 5 мест конвоев существуют на карте одновременно. Каждый сохраняется 1800 секунд (30 минут) перед перемещением в новое место.


Полицейская машина

События полицейских машин создают разбитые полицейские автомобили с полицейскими заражёнными поблизости. Они отключены по умолчанию.

xml
<event name="StaticPoliceCar">
    <nominal>10</nominal>
    <min>5</min>
    <max>10</max>
    <lifetime>2500</lifetime>
    <restock>0</restock>
    <saferadius>500</saferadius>
    <distanceradius>200</distanceradius>
    <cleanupradius>100</cleanupradius>
    <secondary>InfectedPoliceHard</secondary>
    <flags deletable="1" init_random="0" remove_damaged="0"/>
    <position>fixed</position>
    <limit>mixed</limit>
    <active>0</active>
    <children>
        <child lootmax="5" lootmin="3" max="10" min="5" type="Wreck_PoliceCar"/>
    </children>
</event>

active=0 означает, что это событие отключено по умолчанию -- измените на 1 для включения. Тег <secondary>InfectedPoliceHard</secondary> спавнит усиленных полицейских зомби (более крепких, чем обычные заражённые). С nominal=10 и saferadius=500 полицейские машины более многочисленны, но менее ценны, чем крушения вертолётов.


cfgeventgroups.xml -- групповой спавн

Этот файл определяет события, где несколько объектов появляются вместе с относительными смещениями позиций. Самое распространённое применение -- заброшенные поезда.

xml
<event name="Train_Abandoned_Cherno">
    <children>
        <child type="Land_Train_Wagon_Tanker_Blue" x="0" z="0" a="0"/>
        <child type="Land_Train_Wagon_Box_Brown" x="0" z="15" a="0"/>
        <child type="Land_Train_Wagon_Flatbed_Green" x="0" z="30" a="0"/>
        <child type="Land_Train_Engine_Blue" x="0" z="45" a="0"/>
    </children>
</event>

Первый дочерний элемент размещается в позиции из cfgeventspawns.xml. Последующие элементы смещаются на значения x, z, a относительно этой точки. В этом примере вагоны расположены с интервалом 15 метров вдоль оси z.

У каждого <child> в группе есть:

АтрибутОписание
typeИмя класса объекта для спавна.
xСмещение по X в метрах от начала группы.
zСмещение по Z в метрах от начала группы.
aСмещение угла в градусах от начала группы.

Групповое событие всё ещё нуждается в соответствующей записи в events.xml для управления номинальными количествами, lifetime и состоянием активности.


Корневой класс транспорта в cfgeconomycore.xml

Чтобы CE распознавала транспорт как отслеживаемые сущности, у них должно быть объявление корневого класса в cfgeconomycore.xml:

xml
<economycore>
    <classes>
        <rootclass name="CarScript" act="car"/>
        <rootclass name="BoatScript" act="car"/>
    </classes>
</economycore>
  • CarScript -- базовый класс для всего наземного транспорта в DayZ.
  • BoatScript -- базовый класс для всех лодок.
  • Атрибут act="car" указывает CE обращаться с этими сущностями с поведением, специфичным для транспорта (персистентность, спавн на основе событий).

Без этих записей корневых классов CE не будет отслеживать или управлять экземплярами транспорта. Если вы добавляете модовый транспорт, наследующий от другого базового класса, вам может потребоваться добавить его корневой класс здесь.


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

Это самые частые проблемы со спавном транспорта, с которыми сталкиваются администраторы серверов.

Добавление транспорта в types.xml

Проблема: Вы добавляете CivilianSedan в types.xml с nominal 10. Ни одного седана не появляется.

Решение: Удалите транспорт из types.xml. Добавьте или отредактируйте событие транспорта в events.xml с соответствующими дочерними элементами и убедитесь, что в cfgeventspawns.xml есть подходящие позиции спавна. Транспорт использует систему событий, а не систему спавна предметов.

Нет подходящих позиций спавна в cfgeventspawns.xml

Проблема: Вы создаёте новое событие транспорта в events.xml, но транспорт никогда не появляется.

Решение: Добавьте соответствующий блок <event name="ИмяВашегоСобытия"> в cfgeventspawns.xml с достаточным количеством записей <pos>. Имя name события в обоих файлах должно совпадать точно. Вам нужно как минимум столько позиций, сколько ваше значение nominal.

Установка remove_damaged=0 для управляемого транспорта

Проблема: Вы устанавливаете remove_damaged="0" для события транспорта. Со временем сервер заполняется разбитыми машинами, которые никогда не исчезают, блокируя позиции спавна и снижая производительность.

Решение: Оставляйте remove_damaged="1" для всего управляемого транспорта (седаны, грузовики, хэтчбеки, лодки). Это гарантирует, что при уничтожении транспорта CE удаляет его и спавнит свежий. Устанавливайте remove_damaged="0" только для объектов-обломков (крушения вертолётов, конвои), которые уже повреждены по замыслу.

Забыли установить active=1

Проблема: Вы настраиваете событие транспорта, но оно никогда не спавнится.

Решение: Проверьте тег <active>. Если он установлен в 0, событие отключено. Некоторые ванильные события, такие как StaticPoliceCar, поставляются с active=0. Установите его в 1 для включения спавна.

Недостаточно позиций спавна для номинального количества

Проблема: Вы устанавливаете nominal=15 для события транспорта, но в cfgeventspawns.xml существуют только 6 позиций. Появляется только 6 машин.

Решение: Добавьте больше записей <pos>. Как правило, включайте минимум 2-3x от вашего значения nominal в позициях, чтобы дать CE достаточно вариантов для удовлетворения ограничений saferadius и distanceradius.

Транспорт появляется внутри зданий или под землёй

Проблема: Транспорт появляется вклиненным в здание или закопанным в рельеф.

Решение: Проверьте координаты <pos> в cfgeventspawns.xml. Протестируйте позиции в игре с помощью админ-телепортации перед добавлением их в файл. Позиции должны быть на ровных дорогах или открытой местности, а угол (a) должен совпадать с направлением дороги.


Главная | << Назад: Лут-экономика | Далее: Спавн игроков >>

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