Cookbook: готовые рецепты и примеры модов
Практические примеры мини-модов от А до Я: Счастливый блок, Магический кристалл, кастомные чат-команды и чеклист публикации.
Cookbook: готовые рецепты и примеры модов
В этой главе собраны полностью готовые к использованию примеры модов, объединяющие декларативные данные, рецепты и Lua-логику.
Пример 1. Мод «Счастливый блок» (Lucky Block)
Мод добавляет золотистый блок, при разрушении которого игрок получает случайную награду прямо в инвентарь!
1. datapacks/lucky_mod/pack.ron
(
id: "lucky_mod",
name: "Lucky Block Mod",
version: "1.0.0",
author: "Metron Modder",
description: "Испытай свою удачу!",
)
2. datapacks/lucky_mod/blocks/lucky_block.ron
BlockDef(
id: "lucky_mod:lucky_block",
name: "Счастливый блок",
textures: Some(BlockTextures(
all: Some("textures/blocks/gold_block.png"),
)),
solid: true,
translucent: false,
hardness: 0.8,
light_emission: 4,
sound: Some("stone"),
drop: Some("none"), // Сам блок не выпадает — дроп выдает скрипт!
)
3. datapacks/lucky_mod/scripts/main.lua
print("[LuckyMod] Инициализирован!")
-- Возможные призы: { item_id, count, name }
local PRIZES = {
{ id = 1, count = 64, name = "Гора булыжника" },
{ id = 20, count = 16, name = "Факелы освещения" },
{ id = 200, count = 1, name = "Золотая кирка удачи" },
}
function on_block_break(x, y, z, block_id)
-- Проверяем, сломан ли именно счастливый блок (ID динамических блоков >= 256)
if block_id >= 256 then
local prize_idx = math.random(1, #PRIZES)
local prize = PRIZES[prize_idx]
-- Ищем свободный слот в хотбаре (0..8)
for slot = 0, 8 do
local current = metron.inventory.get(slot)
if not current then
metron.inventory.set(slot, prize.id, prize.count, prize.name)
print(string.format("[LuckyMod] Игрок выиграл: %s x%d в слот %d!", prize.name, prize.count, slot))
return
end
end
print("[LuckyMod] Инвентарь полон! Приз не поместился.")
end
end
Пример 2. Мод «Телепорт домой» (/sethome и /home)
Скриптовый мод, сохраняющий точку дома игрока в оперативной памяти сессии:
datapacks/home_mod/scripts/home.lua
local homes = {}
commands:register("sethome", function(sender, args)
-- Запоминаем факт установки
homes[sender] = { set = true, time = os.time and os.time() or 0 }
return string.format("Точка дома для %s успешно сохранена!", sender)
end)
commands:register("home", function(sender, args)
local h = homes[sender]
if not h then
return "У вас не установлена точка дома! Используйте /sethome"
end
return string.format("Телепортация домой для игрока %s...", sender)
end)
Пример 3. Чеклист перед публикацией мода
Перед отправкой вашего мода друзьям или публикацией в сообществе убедитесь:
- В
pack.ronуказаны валидныйid(латиница, нижний регистр),versionиauthor. - Все пути к текстурам в
BlockDefлибо существуют в ресурспаке, либо присутствуют в ванильном воксельном атласе. - В Lua-скриптах отсутствуют бесконечные циклы
while true doи тяжёлые расчёты (лимит вызова 500 мкс!). - Мод протестирован на горячую перезагрузку по F3+T и в чистом мире.
- Структура папки упакована в
zip-архив или готова к копированию вdatapacks/.