Skip to content

Ваш первый мод на Rust ​

Моды на Rust компилируются в компонент WebAssembly. Они работают в песочнице, как и Lua-моды, и могут вызывать Lua-моды и наоборот.

Серверы запускают WASM-моды

Blockheads Server запускает WASM-моды в сборках для разработки, наравне с Lua-модами. Они выйдут в релизе вместе со всей системой модов.

1. Подготовка ​

sh
cargo install --git https://github.com/Blockheads-Club/mod-sdk bhmod
rustup target add wasm32-wasip2

2. Создайте и соберите ​

sh
bhmod new my-mod --lang rust
cd my-mod
./build.sh          # cargo build --target wasm32-wasip2, затем копирует server/mod.wasm
bhmod check .
bhmod pack .        # my-mod-0.1.0.bhmod

В .bhmod попадают только mod.toml, LICENSE и папки пакета; src/, Cargo.toml и target/ остаются снаружи.

3. Код ​

Привязки создаются из WIT-файлов API с помощью wit-bindgen. Мод реализует интерфейс guest:

rust
wit_bindgen::generate!({ path: "bindings/blockheads-api", world: "server-mod" }); // bhmod new копирует сюда WIT

use blockheads::api::events::{self, Event, EventKind, Outcome};
use blockheads::api::types::Priority;
use exports::blockheads::api::guest::Guest;

struct MyMod;

impl Guest for MyMod {
    fn on_enable() -> Result<(), String> {
        events::subscribe(EventKind::PlayerJoin, Priority::Normal, false).map_err(|e| format!("{e:?}"))?;
        Ok(())
    }

    fn handle_event(_sub: u32, ev: Event) -> Outcome {
        if let Event::PlayerJoin(join) = ev {
            let _ = join.player.send_chat(&format!("Welcome, {}!", join.player.alias()));
        }
        Outcome { cancelled: false, mutation: None }
    }

    // on_disable, run_command, run_task, call_service, on_channel_message: см. шаблон.
}

export!(MyMod);

В Lua вы передаёте функции (bh.events.on(kind, fn)); в Rust каждое событие приходит в handle_event, а каждая команда в run_command, и различаются они по id, который вернул subscribe или register. Все функции: справочник API, guest.

Примеры ​

Неофициальный проект сообщества. Не связан с Majic Jungle Software или Noodlecake. Файлы игры не включены.