Cookbook: готовые рецепты и примеры модов

Практические примеры мини-модов от А до Я: Счастливый блок, Магический кристалл, кастомные чат-команды и чеклист публикации.

Cookbook: готовые рецепты и примеры модов

В этой главе собраны полностью готовые к использованию примеры модов, объединяющие декларативные данные, рецепты и Lua-логику.


Пример 1. Мод «Счастливый блок» (Lucky Block)

Мод добавляет золотистый блок, при разрушении которого игрок получает случайную награду прямо в инвентарь!

1. datapacks/lucky_mod/pack.ron

RON
(
    id: "lucky_mod",
    name: "Lucky Block Mod",
    version: "1.0.0",
    author: "Metron Modder",
    description: "Испытай свою удачу!",
)

2. datapacks/lucky_mod/blocks/lucky_block.ron

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

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

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/.