XML-файлы шаг за шагом
Идите по ним по порядку. Каждый файл делает одно дело, и весь фокус в том, чтобы увидеть, как имя в одном файле совпадает с именем в другом - именно это совпадение и заставляет лут и события появляться в мире.
Если вы когда-нибудь открывали конфиг сервера DayZ и видели, как в Discord без объяснений сыплют словами tags, entries, types, events и protos, этот гайд для вас. Мы пройдём по основным XML-файлам экономики по очереди, кратко и понятно, чтобы вы увидели, как они связаны и где менять, когда хотите «забустить» лут или зомби. Это намеренно обзор для новичков - ровно столько, чтобы общая картина сложилась.
Идите по ним по порядку. Каждый файл делает одно дело, и весь фокус в том, чтобы увидеть, как имя в одном файле совпадает с именем в другом - именно это совпадение и заставляет лут и события появляться в мире.
Прежде чем что-либо трогать, проясните слова: tags, entries, types, events и protos. Эти пять терминов встречаются постоянно и именно из-за них файлы кажутся запутанными поначалу. Каждый живёт в конкретном файле и обозначает конкретную вещь; как только вы можете их назвать, вы следите за любым туториалом или веткой Discord, не теряясь.
Модель, от которой всё остальное встаёт на места, такова: Central Economy в DayZ - это огромная игра в «пятнашки». Имя, заданное в одном файле, упоминается именем в другом, и когда имена совпадают, что-то спавнится. Держите эту мысль в голове, читая каждый файл ниже - вы в основном просто узнаёте, где рождается имя и где оно используется.
Каждая запись в types.xml вызывает class name. Это называется class name, потому что скрипты игры создают предмет по классу - запись лишь сообщает экономике, что этот класс существует и как он должен себя вести. Этот файл большинство открывает первым, когда хочет изменить, сколько чего-то спавнится.
Два значения, с которыми экономика работает больше всего, - это nominal и min: nominal - целевое количество, которое экономика стремится держать в мире, а min - нижний порог, запускающий новый спавн. lifetime - сколько секунд предмет существует до очистки. quantmin и quantmax задают, насколько полон предмет при спавне - для фляги, например, от нуля до ста процентов.
Чтобы «забустить» предмет, обычно поднимают его nominal и min. Уже одно это говорит экономике держать больше его в мире, не трогая другие файлы.
Все ваши tags, флаги usage и категории «рождаются» в cfglimitsdefinition.xml. Это их файл определений: как только имя существует здесь, игра распознаёт его во всех остальных файлах. Затем вы ставите эти имена на запись types, чтобы указать, где и как предмет может появляться.
Значения usage - это вещи вроде Military, Medic, Police, Firefighter, Industrial, Farm, Coast, Town, Village, Hunting, Office, School, Prison и Lunapark. Категории и флаги тира (tier один - tier четыре, area flags и так далее) тоже живут здесь. Игре совершенно всё равно, как вы их назовёте - можно назвать usage «hostess snack cake», и это сработает, пока точное имя правильно проставлено на записи предмета дальше по цепочке.
Так куда же попадают записи types в мире? Ответ - proto. Proto именует предмет - скажем, garbage pile - и вы помечаете этот предмет именами usage и категорий, заданными в вашем файле limits. Proto также несёт координаты отдельных точек лута, размеченных вокруг центральной точки предмета.
Имя proto может быть любым. Важен следующий шаг: это имя должно совпасть с именем позиции в другом месте - это мы и рассмотрим дальше. Сам по себе proto - лишь определение, говорящее «этот объект держит лут, помеченный так-то».
mapgrouppos.xml хранит позиции. Пока имя proto (маппинг) совпадает с именем pos (позицией), этот proto стоит в этой позиции и держит лут, помеченный для его совпадающих usage. Это «пятнашки» в действии: proto - тот, кто ловит, а pos - место, где он стоит.
Проще говоря, proto говорит «я garbage pile, который держит лут town и village», а совпадающий pos говорит «поставь этот garbage pile здесь». Если оба имени идентичны, лут появляется в этой точке; ошибётесь в одном - ничего не спавнится. Дальше всё, что используется в событиях, следует той же логике совпадения.
events.xml и cfgeventspawns.xml идут вместе точно как proto и pos. У события есть имя, и это имя несёт префикс: Item, Static или Vehicle. Совпадающее имя event-spawn перечисляет позиции на карте, где это именованное событие может существовать.
Внутри события вы задаёте вывод minimum, maximum и nominal, плюс радиус, в котором заспавненные объекты (или зомби) могут перемещаться, и children - сами вещи, которые событие выдаёт. Три дополнительных поля управляют поведением: safe radius - насколько близко к игроку событие может заспавниться, distance - как далеко оно должно быть от другого события, и cleanup - как далеко надо отойти, прежде чем оно деактивируется.
Когда сам child является лимитом, вывод контролируется между собственными minimum и maximum каждого child вместе с общим nominal - отдельный minimum или maximum на уровне события не нужен.
Событие с префиксом Vehicle работает так же - имя события совпадает с именем event-spawn, поэтому событие идёт в эти позиции. Новое - значение «a=», направление, в которое смотрит транспорт. Капот смотрит по этому углу: 0 или 360 - север, 180 - юг, и немного устного счёта даёт любое направление по кругу.
События транспорта обычно используют лимит «mixed». Вместо того чтобы принуждать каждый перечисленный child в каждой точной позиции (что свалило бы машины в кучу), вы говорите экономике держать общее число в пределах min и max вокруг nominal - например, всего 11–15 машин, цель около 13, и не более одного-трёх каждого типа child в миксе.
Остальное ведёт себя как любое событие: lifetime задаёт, сколько живёт транспорт, и действуют те же правила safe radius, distance и cleanup. Когда транспорт разрушен, событие убирает его и выдаёт новый при следующей ротации.
Событие заражённых (зомби) общается с файлом окружения, известным как territory, который задаёт, куда относится эта группа заражённых. Сторона territory - более глубокая тема, достойная отдельного туториала, но основ хватает, чтобы вносить изменения.
Чтобы просто забустить зомби, поднимите вывод minimum и nominal события заражённых - maximum для этого трогать обычно не нужно. Можно также подмешивать разных children заражённых в другие события, чтобы рассредоточить их по карте там, где их хочется больше.
Random presets - посредник между types.xml и spawnable types. Пресет создаёт именованный пул лута cargo или attachment: список types или классов, у каждого свой hit chance. Когда этот шанс срабатывает, выбирается один из children пула.
Так вы получаете разнообразие внутри или на объекте - например, пресет cargo, наполняющий контейнер, или пресет attachment, надевающий на зомби шапку или рюкзак. Пресет лишь задаёт пул; именно spawnable type, далее, говорит предмету фактически его использовать.
cfgspawnabletypes.xml - это то, что говорит type иметь другие types прикреплёнными к нему или внутри него. Это потребитель только что заданных random presets: spawnable type ссылается по имени на пресет cargo или attachment, и hit chances пресета затем решают, что фактически появится.
Коротко: types.xml говорит, что предмет существует, random preset задаёт пул возможных дополнений, а spawnable type связывает их, чтобы свежезаспавненный предмет прибыл с нужным cargo и attachments.
globals.xml хранит переключатели уровня сервера, и он мощнее, чем кажется. В самом низу - общий счётчик заражённых: поднимите или опустите его, чтобы задать максимально допустимый ИИ. Vanilla где-то 1000–1200; в исходной сборке его понизили до 850. Рядом найдёте animal count и то, как быстро убирается труп.
Ключевая пара значений - настройки idle. Поставьте оба значения idle в ноль, и ваша экономика крутится даже когда никого нет онлайн, так что лут и события остаются свежими на сервере 24/7. Другие переключатели здесь управляют тем, сколько предметов лута спавнится изначально, и позволяют включать или выключать системы вроде wet, world и tents.
Это лишь обзор для новичков - есть больше файлов и куда более глубокие видео по каждому. Но знание того, как эти ключевые файлы ссылаются друг на друга, достаточно, чтобы начать безопасно настраивать лут и зомби своего сервера.
Начните в types.xml и поднимите nominal и min нужного предмета. nominal - целевое количество, которое экономика держит в мире, а min - порог, запускающий новый спавн.
Для общего лимита поднимите счётчик заражённых в globals.xml. Чтобы оживить конкретную область, поднимите minimum и nominal нужного события заражённых в events.xml - maximum обычно трогать не нужно.
Почти всегда несовпадение имён. Имя proto должно точно совпадать с именем pos, а имя события - точно с именем event-spawn. Проверьте написание и регистр с обеих сторон.
Random preset (cfgrandompresets.xml) задаёт именованный пул возможного cargo или attachments с hit chances. Spawnable type (cfgspawnabletypes.xml) говорит реальному предмету использовать этот пул - так что пресет является посредником между types.xml и тем, что предмет несёт при спавне.
В globals.xml поставьте оба значения idle в ноль. Тогда экономика крутится круглосуточно, и сервер 24/7 остаётся наполнен свежим лутом и событиями.