Открытый код · ядро 0.1 в разработке

Моды, которым можно доверять

Ядро модов для Horizon — Minecraft: Java Edition, переписанного на Rust. Каждый мод живёт в песочнице WebAssembly, ставится одним файлом и перезагружается за секунду, не выходя из мира.

Сделать первый мод → Документация
my-mod — terminal

        
[Horizon] Mods reloaded
<Steve> ломаю алмазный блок…
This block is guarded
1 сдо перезагрузки мода
0доступа без разрешения
1 файл.hmod — весь мод
Rustи WebAssembly

Зачем

То, чего нет у привычных загрузчиков

Forge и Fabric запускают моды как обычный Java-код с полным доступом к компьютеру. Здесь мод — гость.

Песочница

Мод не видит ваши файлы и сеть. Что ему можно, написано рядом с его переключателем.

Перезагрузка за секунду

Пересобрали — игра подхватила. Для установленных модов есть /hmod reload.

Один файл

Положили .hmod в папку и включили. Ничего не компилируется на вашей машине.

Сбой — дело мода

Упавший или зависший мод останавливается сам. Игра и остальные моды работают дальше.

Всё привычное

Блоки, предметы, мобы, механизмы с энергией и жидкостями, окна, события, генерация мира.

Тесты без игры

cargo horizon-mod test гоняет сценарии в той же песочнице, без окна и без мира.

Для игроков

Вы решаете, что можно моду

  • Новые моды выключены. Включаете сами, увидев, что им разрешено.
  • Разрешения — простыми словами: «видит вашу позицию», «рисует текст на экране».
  • Нативные платы помечены красным [UNSAFE]: их включают, только если доверяют автору.

Для авторов

Мод — это обычный Rust

Манифест говорит, что моду нужно, код говорит, что он делает. Вот мод целиком: алмазный блок не сломать.

use horizon_mod_sdk::server::{BlockPos, Player, Registration, ServerMod, players};

struct BlockGuard;

impl ServerMod for BlockGuard {
    fn init() -> Result<(Self, Registration), String> {
        Ok((BlockGuard, Registration::new().on_blocks()))
    }

    // true — блок остаётся на месте
    fn break_block(&mut self, player: &Player, _pos: BlockPos, state: &str) -> bool {
        let guarded = state == "minecraft:diamond_block";
        if guarded {
            players::tell(&player.id, "This block is guarded");
        }
        guarded
    }
}
horizon_mod_sdk::export_server_mod!(BlockGuard);

Начать

Первый мод за десять минут

Нужны Rust и собранный Horizon.

Установите

rustup target add wasm32-unknown-unknown, затем cargo install --git https://github.com/artemspt/horizon-hammer-core cargo-horizon-mod

Создайте

cargo horizon-mod new my-mod — манифест, код и пример теста.

Запустите

cargo horizon-mod run. После каждой правки — build, игра перезагрузит мод сама.

Ядро растёт вместе с модами

Напишите мод, расскажите, чего не хватает API, или пришлите правку.

Открыть на GitHub Предложить идею