Всё, что связано с лутом
Все необходимые параметры для настройки, от батона до патрона.
globals.xml
Отвечает за настройку глобальных параметров игры. Он находится по пути mpmissions\dayzOffline.chernarusplus\db.
Рассмотрим его параметры:
<var name="AnimalMaxCount" type="0" value="200"/> — максимальное количество животных, которые могут быть на карте одновременно. Значение по умолчанию: 200.
<var name="CleanupAvoidance" type="0" value="100"/> — радиус в метрах, в котором предметы не удаляются. Значение по умолчанию: 100 метров.
<var name="CleanupLifetimeDeadAnimal" type="0" value="1200"/> — время в секундах, через которое исчезают мертвые животные. Значение по умолчанию: 1200 секунд (20 минут).
<var name="CleanupLifetimeDeadInfected" type="0" value="330"/> — время в секундах, через которое исчезают мертвые зомби. Значение по умолчанию: 330 секунд (5,5 минут).
<var name="CleanupLifetimeDeadPlayer" type="0" value="3600"/> — время в секундах, через которое исчезает тело мертвого игрока. Значение по умолчанию: 3600 секунд (1 час).
<var name="CleanupLifetimeDefault" type="0" value="45"/> — время в секундах для удаления обычных предметов с полным уроном. Значение по умолчанию: 45 секунд.
<var name="CleanupLifetimeLimit" type="0" value="50"/> — максимальное количество предметов, которые можно удалить за один цикл очистки. Значение по умолчанию: 50.
<var name="CleanupLifetimeRuined" type="0" value="330"/> — время в секундах, через которое исчезают испорченные (ruined) предметы. Значение по умолчанию: 330 секунд (5.5 минут).
<var name="FlagRefreshFrequency" type="0" value="432000"/> — частота в секундах, с которой флаг продлевает срок жизни предметов в зоне его действия. Значение по умолчанию: 432000 секунд (5 дней).
<var name="FlagRefreshMaxDuration" type="0" value="3456000"/> — максимальный срок в секундах, на который флаг может продлить жизнь предметов. Значение по умолчанию: 3456000 секунд (40 дней).
<var name="FoodDecay" type="0" value="1"/> — разрешает ли порчу еды. Требует, чтобы WorldWetTempUpdate был включен. Значение по умолчанию: 1 (включено).
<var name="IdleModeCountdown" type="0" value="60"/> — время в секундах, после которого сервер переходит в режим простоя, если на нем нет игроков. Значение по умолчанию: 60 секунд.
<var name="IdleModeStartup" type="0" value="1"/> — включать ли режим простоя сразу при запуске сервера. Значение по умолчанию: 1 (включено).
<var name="InitialSpawn" type="0" value="100"/> — процент лута, который появляется при первом запуске сервера. Значение по умолчанию: 100%.
<var name="LootDamageMax" type="1" value="0.82"/> — максимальный урон (от 0 до 1), который может быть у появившегося лута. Значение по умолчанию: 0.82 (82%).
<var name="LootDamageMin" type="1" value="0.0"/> — минимальный урон (от 0 до 1), который может быть у появившегося лута. Значение по умолчанию: 0.0 (без урона).
<var name="LootProxyPlacement" type="0" value="1"/> — разрешает ли контейнерам (например, ящикам) получать лут. Значение по умолчанию: 1 (включено).
<var name="LootSpawnAvoidance" type="0" value="100"/> — радиус в метрах, в котором лут не будет появляться рядом с игроком. Значение по умолчанию: 100 метров.
<var name="RespawnAttempt" type="0" value="2"/> — количество попыток, которые сервер делает для спавна игрока при неудаче. Значение по умолчанию: 2.
<var name="RespawnLimit" type="0" value="20"/> — максимальное количество предметов одного типа, которые могут появиться за один раз. Значение по умолчанию: 20.
<var name="RespawnTypes" type="0" value="12"/> — сколько разных типов предметов может быть создано за один раз. Значение по умолчанию: 12.
<var name="RestartSpawn" type="0" value="0"/> — процент лута, который появляется при перезапуске сервера. Значение по умолчанию: 0%.
<var name="SpawnInitial" type="0" value="1200"/> — начальный радиус в метрах для появления предметов и сущностей вокруг игрока. Значение по умолчанию: 1200 метров.
<var name="TimeHopping" type="0" value="60"/> — штрафное время в секундах за смену сервера (server hopping). Значение по умолчанию: 60 секунд (1 минута).
<var name="TimeLogin" type="0" value="15"/> — задержка в секундах при входе в игру. Значение по умолчанию: 15 секунд.
<var name="TimeLogout" type="0" value="15"/> — задержка в секундах при выходе из игры. Значение по умолчанию: 15 секунд.
<var name="TimePenalty" type="0" value="20"/> — штрафное время в секундах для игрока. Значение по умолчанию: 20 секунд.
<var name="WorldWetTempUpdate" type="0" value="1"/> — разрешает ли обновление влажности и температуры предметов. Значение по умолчанию: 1 (включено).
<var name="ZombieMaxCount" type="0" value="1000"/> — максимальное количество зомби на карте. Значение по умолчанию: 1000.
<var name="ZoneSpawnDist" type="0" value="300"/> — расстояние в метрах, на котором запускается спавн зомби в зоне. Значение по умолчанию: 300 метров.
types.xml
Cодержит настройки всех ванильных предметов, с помощью этого файла вы можете полностью контролировать, что, где и в каком количестве будет спавниться на карте. Находится по пути mpmissions\dayzOffline.chernarusplus\db.
Рассмотрим параметры файла:
<type name="ACOGOptic_6x">
<nominal>5</nominal>
<lifetime>14400</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"/>
<value name="Tier3"/>
<value name="Tier4"/>
</type>nominal — выполняет две функции:
- Количество предметов, которое создается на сервере при первом запуске после вайпа.
- Значение, до которого сервер будет доспавнивать предметы, когда сработает пополнение.
lifetime — время, в течение которого предмет может находиться на земле. По истечении этого времени предмет исчезнет.
restock — таймер, который запускает проверку. По его истечении сервер смотрит, хватает ли предметов на карте.
min — критический лимит. Если количество предметов на карте падает ниже этой отметки, срабатывает система пополнения.
quantmin и quantmax — определяют минимальное и максимальное количество (стак) предмета при его спавне. Это относится к патронам, гвоздям, бинтам и другим предметам, которые имеют стакинг.
Значение -1 означает, что предмет считается целым или не имеет изменяемого количества. Например оружие, бинты или еда.
cost — всегда должен быть равен 100. Это параметр, который изначально предназначался для установки приоритета спавна, но не был доработан разработчиками.
flags — определяет, где сервер должен учитывать количество предметов для min и nominal.
Правило — count_in_map="1" для предметов, лежащих на земле. Остальные параметры должны быть 0.
Исключение — deloot="1" разрешает предмету появляться на динамических событиях (ивентах), 0 запрещает это.
Исключение — crafted="1" помечает предмет как крафтовый. Такие предметы не спавнятся, и на них действует только lifetime.
category name — устанавливает общую категорию предмета (например, "оружие" или "еда").
<category name="tools"/>
<category name="containers"/>
<category name="clothes"/>
<category name="lootdispatch"/>
<category name="food"/>
<category name="weapons"/>
<category name="books"/>
<category name="explosives"/>usage name — определяет тип игровой зоны, где может появиться предмет (например, "военная" или "полицейская").
<usage name="Military"/>
<usage name="Police"/>
<usage name="Medic"/>
<usage name="Firefighter"/>
<usage name="Industrial"/>
<usage name="Farm"/>
<usage name="Coast"/>
<usage name="Town"/>
<usage name="Village"/>
<usage name="Hunting"/>
<usage name="Office"/>
<usage name="School"/>
<usage name="Prison"/>
<usage name="Lunapark"/>
<usage name="SeasonalEvent"/>
<usage name="ContaminatedArea"/>
<usage name="Historical"/>value name — отвечает за то, в каких тирах по карте будут спавниться предметы.
<value name="Tier1"/>
<value name="Tier2"/>
<value name="Tier3"/>
<value name="Tier4"/>
<value name="Unique"/>Также существует tag — указывает конкретное место, где предмет может появиться в пределах usage name или value name.
<tag name="floor"/>
<tag name="shelves"/>
<tag name="ground"/>Если tag не указан, предмет может появиться во всех доступных для его зоны местах. Если указан — только в конкретном.
Как работает эта система:
- При первом запуске сервера создается количество предметов, равное
nominal. - Далее,
restockзапускает регулярные проверки: Если количество предметов на карте падает нижеmin, сервер доспавнивает недостающее количество, чтобы снова достичьnominal.
Если количество предметов равно или больше min — ничего не происходит и цикл проверки повторяется.
lifetimeработает независимо от этой логики: если предмет не подобран игроком в течение этого времени, он просто исчезает.
Таким образом, nominal — это стартовая точка и конечная цель пополнения, а min — это нижний порог, который запускает этот процесс.
Для создания стабильной экономики вы можете установить min и nominal одинаковыми. Это гарантирует, что сервер будет всегда поддерживать одно и то же количество предмета.
Предметы из модов необходимо настраивать в отдельном файле.
cfgspawnabletypes.xml
Дополняет types.xml и отвечает за спавн дочерних предметов внутри родительских, например прицелы и магазины в оружии, а также за содержимое динамических событий. Находится по пути mpmissions\dayzOffline.chernarusplus.
Рассмотрим на примере параметров предмета AKM:
<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><type name="AKM"> — главный блок с названием предмета, который хранит все настройки внутренних предметов.
<damage min="0.45" max="0.85" /> — случайный диапазон повреждения предмета в момент его появления. В нашем случае от 45% до 85%.
<attachments chance="0.50"> — задаёт группу внутренних предметов с шансом. Например, группа прицелов:
<attachments chance="0.50">
<item name="KashtanOptic" chance="0.30" />
<item name="PSO11Optic" chance="0.20" />
</attachments>В нашем примере, вероятность того, что на спавнящемся AKM будет установлен прицел, составляет 50%.
Если этот шанс срабатывает, система распределяет вероятность появления конкретного прицела: либо KashtanOptic с шансом 30%, либо PSO11Optic с шансом 20%.
Если вы хотите дать равные условия дочерним элементам, то сумма их шансов внутри одного родительского элемента <attachments> должна составлять 1.00.
Если предмета 2, то chance = 0.50.
Если предмета 3, то chance = 0.33.
Шкала состояний предметов:
Pristine (Нетронутое) — 0.0
Worn (Немного поношенное) — от 0.01 до 0.25
Damaged (Повреждённое) — от 0.26 до 0.50
Badly Damaged (Сильно повреждённое) — от 0.51 до 0.75
Ruined (Уничтоженное) — от 0.76 до 1.0Как увеличить/уменьшить спавн лута?
В изменении количества лута участвуют следующие параметры, о которых мы упомянали выше:
nominal— желаемое количество лутаmin— значение равноеnominalusage name— тип игровой зоны. Military, Police, Medic и так далее.value name— Tier1, Tier2, Tier3, Tier4, Unique
При изменении этих значений мы достигнем лимита позиций, за который отвечает файл mapgroupproto по расположению mpmissions\dayzOffline.chernarusplus. Рекомендуется не изменять его.
После внесения изменений необходимо сделать вайп.
Предметы из модов необходимо настраивать в отдельном файле.
Как настроить спавн вещей из модов?
- Создать папку
mod_typesдля модовых конфигураций по путиmpmissions\dayzOffline.chernarusplus - Подключить её в файле
cfgeconomycore.xmlс указанием файлов после тега</defaults>:
<ce folder="mod_types">
<file name="SNAFU_types.xml" type="types"/>
<file name="SNAFU_spawnabletypes.xml" type="spawnabletypes"/>
</ce>Итоговый код должен выглядеть так:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<economycore>
<classes>
<!--
These are rootclasses to be used by economy.
Do not forget to add attribute act="character", if root class represents character (player, infected, animal)
Do not forget to add attribute act="car", if root class represents moveable vehicles
-->
<rootclass name="DefaultWeapon" /> <!-- weapons -->
<rootclass name="DefaultMagazine" /> <!-- magazines -->
<rootclass name="Inventory_Base" /> <!-- inventory items -->
<rootclass name="HouseNoDestruct" reportMemoryLOD="no" /> <!-- houses, wrecks -->
<rootclass name="SurvivorBase" act="character" reportMemoryLOD="no" /> <!-- player characters -->
<rootclass name="DZ_LightAI" act="character" reportMemoryLOD="no" /> <!-- infected, animals -->
<rootclass name="CarScript" act="car" reportMemoryLOD="no" /> <!-- cars (sedan, hatchback, transitBus, V3S, ...) -->
<rootclass name="BoatScript" act="car" reportMemoryLOD="no" /> <!-- boats -->
</classes>
<defaults>
<default name="dyn_radius" value="30" />
<default name="dyn_smin" value="0" />
<default name="dyn_smax" value="0" />
<default name="dyn_dmin" value="1" />
<default name="dyn_dmax" value="5" />
<default name="log_ce_loop" value="false"/>
<default name="log_ce_dynamicevent" value="false"/>
<default name="log_ce_vehicle" value="false"/>
<default name="log_ce_lootspawn" value="false"/>
<default name="log_ce_lootcleanup" value="false"/>
<default name="log_ce_lootrespawn" value="false"/>
<default name="log_ce_statistics" value="false"/>
<default name="log_ce_zombie" value="false"/>
<default name="log_storageinfo" value="false"/>
<default name="log_hivewarning" value="true"/>
<default name="log_missionfilewarning" value="true"/>
<default name="save_events_startup" value="true"/>
<default name="save_types_startup" value="true"/>
</defaults>
<!-- ПОДКЛЮЧАЕМ МОДОВЫЕ TYPES -->
<ce folder="mod_types">
<file name="SNAFU_types.xml" type="types"/>
<file name="SNAFU_spawnabletypes.xml" type="spawnabletypes"/>
</ce>
</economycore>- Перенести модовые файлы
types.xmlиspawnabletypes.xmlв нашу директорию и при необходимости переименовать.

XML файлы можно найти в корневой папке мода.

Гонка предметов за спавн
Механизм спавна предметов на карте основан на конкуренции за ограниченный ресурс — предустановленные точки спавна в MapGroupProto.
- Карта содержит ограниченное количество точек для спавна, которое является пределом одновременно существующего на карте лута.
- В момент загрузки карты сервер пытается разместить все запланированные предметы (оружие, аптечки и пр.) в эти точки. Размещение происходит по принципу случайного выбора, мы можем лишь направить лут в нужные зоны с помощью
usage name,value nameиtag name, но не гарантировать его появление в нужном количестве. - Часть предметов занимает доступные точки и появляется, а остальные — не спавнятся. Это приводит к неравномерному распределению ресурсов между точками спавна.
Как сделать вайп?
- Выключить сервер
- Удалить папку
storage_1по путиmpmissions\dayzOffline.chernarusplus - Включить сервер.
Количество запланированного лута часто превышает количество доступных точек.
Как проверить спавн предметов на карте?
Зайдите на сервер и откройте VPPAdminTools с помощью горячих клавиш INSERT - чтобы включить бинды администратора, а затем HOME - чтобы открыть меню инструментов.

Перейдите во вкладку XML Editor, активируйте пункт Enable Preview и введите класснейм предмета, который хотите найти.

Нажмите на кнопку Get Item Stats, чтобы открыть карту на которой отобразятся местоположения предметов.

Как настроить стартовый лут при спавне игрока?
Откроем файл init.c по пути mpmissions\dayzOffline.chernarusplus и копируем туда наш код:
void main()
{
Hive ce = CreateHive();
if ( ce )
ce.InitOffline();
int year, month, day, hour, minute;
int reset_month = 9, reset_day = 20;
GetGame().GetWorld().GetDate(year, month, day, hour, minute);
if ((month == reset_month) && (day < reset_day))
{
GetGame().GetWorld().SetDate(year, reset_month, reset_day, hour, minute);
}
else
{
if ((month == reset_month + 1) && (day > reset_day))
{
GetGame().GetWorld().SetDate(year, reset_month, reset_day, hour, minute);
}
else
{
if ((month < reset_month) || (month > reset_month + 1))
{
GetGame().GetWorld().SetDate(year, reset_month, reset_day, hour, minute);
}
}
}
}
class CustomMission: MissionServer
{
override PlayerBase CreateCharacter(PlayerIdentity identity, vector pos, ParamsReadContext ctx, string characterName)
{
Entity playerEnt;
playerEnt = GetGame().CreatePlayer( identity, characterName, pos, 0, "NONE" );
Class.CastTo( m_player, playerEnt );
GetGame().SelectPlayer( identity, m_player );
return m_player;
}
override void StartingEquipSetup(PlayerBase player, bool clothesChosen)
{
// ПОЛНОСТЬЮ ОЧИЩАЕМ ИНВЕНТАРЬ ИГРОКА
player.RemoveAllItems();
// НАДЕВАЕМ ОДЕЖДУ НА ПУСТОГО ПЕРСОНАЖА
player.GetInventory().CreateInInventory("CowboyHat_Green");
EntityAI shirt = player.GetInventory().CreateInInventory("Shirt_GreenCheck");
EntityAI pants = player.GetInventory().CreateInInventory("CargoPants_Green");
player.GetInventory().CreateInInventory("AthleticShoes_Green");
// КЛАДЕМ ПРЕДМЕТЫ ВНУТРЬ НАШЕЙ ОДЕЖДЫ
if (shirt)
{
EntityAI knife = shirt.GetInventory().CreateEntityInCargo("HuntingKnife");
player.SetQuickBarEntityShortcut(knife, 0); // Хоткей 1
EntityAI bandage = shirt.GetInventory().CreateEntityInCargo("BandageDressing");
player.SetQuickBarEntityShortcut(bandage, 1); // Хоткей 2
}
if (pants)
{
pants.GetInventory().CreateEntityInCargo("PeachesCan");
pants.GetInventory().CreateEntityInCargo("SodaCan_Cola");
}
// УСТАНАВЛИВАЕМ ПОКАЗАТЕЛИ ВЫЖИВАНИЯ
player.GetStatWater().Set(5000); // Устанавливаем полную воду
player.GetStatEnergy().Set(5000); // Устанавливаем полную еду
player.SetHealth(100); // Устанавливаем полное здоровье
}
};
Mission CreateCustomMission(string path)
{
return new CustomMission();
}Наш результат

Как заменить предметы на свои?
Зайдите на сервер и откройте VPPAdminTools с помощью горячих клавиш INSERT - чтобы включить бинды администратора, а затем HOME - чтобы открыть меню инструментов.

Перейдите во вкладку Item Spawner, активируйте пункт Enable Preview. Подберите стартовые предметы и одежду, сразу примеряя её на персонаже, чтобы убедиться, что все выбранные вещи в неё поместятся.

Скопируйте класснеймы выбранных предметов в файл, сохраните его, затем перезагрузите сервер и зайдите в игру снова.
Откройте панель администратора, перейдите во вкладку Player Manager, выберите себя, нажмите кнопку KILL, чтобы возродиться заново и проверьте стартовый лут.


Если вы используете мод с выбором спавна игрока, то настройка стартового лута должна быть выполнена внутри него. Моды могут иметь приоритет над init.c и перезаписывать его.