Как добавить предметы в добычу через KR CoreOS
KR CoreOS позволяет автору мода зарегистрировать предметы в группах контейнеров, не редактируя вручную каждую таблицу добычи. Ниже — последовательность из документации проекта для Build 41 и Build 42; выполнение кода и появление предметов в игре отдельно не проверялись.
Подключите библиотеку и создайте файл
- Добавьте в mod.info строку require=KRCoreOS. Зависимость задаёт порядок загрузки CoreOS перед вашим модом.
- Создайте серверный Lua-файл: для Build 42 — 42/media/lua/server/YourMod_Distribution.lua, для Build 41 — media/lua/server/YourMod_Distribution.lua. Имя файла можно выбрать, но каталог server обязателен.
- Проверьте полный тип каждого предмета, например Base.MilitaryGPS, и добавьте защиту от отсутствующего KRCore.
Зарегистрируйте предметы
Ниже пример из руководства. dist.add получает полный тип предмета и таблицу групп с весами; первая проверка завершает файл без ошибки, если KRCore не загружен.
-- YourMod_Distribution.lua
local TAG = "[YourMod] "
-- Guard: if CoreOS isn't installed, KRCore is nil. Abort cleanly instead of
-- crashing on the first dist.add call.
if not KRCore then
print(TAG .. "ERROR: KRCore not loaded. Items NOT registered.")
return
end
-- A military-grade GPS — electronics stores + military/survival spots.
KRCore.dist.add("Base.MilitaryGPS", {
TACTICAL = 0.20, -- combo: MILITARY + SURVIVAL
ELECTRONIC = 0.15,
})
-- A bag of chips — general stores + break rooms.
KRCore.dist.add("Base.ChipsBag", {
STORES = 0.40,
BREAKROOM = 0.25,
})
print(TAG .. "2 items registered with KRCore.")
TACTICAL разворачивается в объединение MILITARY и SURVIVAL без дублей, ELECTRONIC и другие ключи разрешаются библиотекой как группы или комбинации. Число — вес появления в контейнере. Автор приводит 0.20 как приблизительный ориентир около 20% для контейнера, а не гарантированную вероятность каждого предмета.
Переопределите отдельный контейнер
Для custom укажите внутреннее имя из ProceduralDistributions.list и prob. Для каждого предмета custom обрабатывается раньше групп; первая запись для конкретного контейнера побеждает. Так можно задать CrateBatteries отдельный вес, даже если он входит в выбранную группу. Неизвестное имя в custom вызывает WARN; отсутствующие имена внутри групп пропускаются без предупреждения.
Для настройки нескольких весов можно собрать уровни H, M и L в таблице P и менять их в одном месте. Пример ниже сохраняет DEV_MODE = false; тестовый режим принудительно выставляет 10.0 и его нельзя оставлять включённым в поставке.
-- YourMod_Distribution.lua (.../media/lua/server/)
local TAG = "[YourMod] "
-- ---- config ----
local DEV_MODE = false
local DEV = 10.0
local P = {
GPS = { H = 0.20, M = 0.10, L = 0.05 },
VAN = { RESIDENTIAL = 1, TRAFFIC = 1 },
}
if DEV_MODE then
P.GPS.H, P.GPS.M, P.GPS.L = DEV, DEV, DEV
print(TAG .. "DEV_MODE ON")
end
-- ---- guard ----
if not KRCore then
print(TAG .. "ERROR: KRCore not loaded. Nothing registered.")
return
end
-- ---- items ----
KRCore.dist.add("Base.MilitaryGPS", {
TACTICAL = P.GPS.H, -- MILITARY + SURVIVAL (combo)
ELECTRONIC = P.GPS.M,
SPECIAL = P.GPS.H,
custom = {
{ name = "GunStoreCounter", prob = P.GPS.M },
{ name = "PawnShopTools", prob = P.GPS.L },
},
})
-- ---- vehicles ----
KRCore.dist.addVehicle("Base.SupplyVan", P.VAN) -- RESIDENTIAL + TRAFFIC groups
print(TAG .. "Registration queued.")
Когда появляются записи
dist.add ставит операцию в очередь. На OnPostDistributionMerge CoreOS разворачивает группы и рекурсивные комбинации, сначала применяет custom и дедуплицирует контейнеры для каждого предмета. В Build 42 событие происходит до ItemPickerJava.Parse. Автомобили обрабатываются отдельно и позже, на OnInitWorld.
Для B41 и B42 документация описывает одинаковый вызов dist.add и определения групп для соответствующей сборки. Подробные группы вида *_POWER рассчитаны на B42; для общего кода автор рекомендует крупные группы или комбинации ELECTRONIC, POWER, MEDICAL и FOOD. Отсутствующие в сборке контейнеры пропускаются.
Проверьте интеграцию
- Проверьте наличие зависимости, серверную папку и точное совпадение Base.Xyz с типом предмета в его скрипте.
- После запуска найдите в консоли строку [KRCore] Distribution complete: N entries added, M skipped. Ненулевой skipped может означать контейнеры, отсутствующие в текущей сборке.
- Проверяйте появление в новых контейнерах: уже сгенерированные контейнеры не получают предмет задним числом. В debug автор предлагает создать один из контейнеров и осмотреть добычу либо создать сам предмет для проверки его типа.