Pumpkin plugin API for Zig
The bindings under src/wit are generated from the pumpkin-plugin-wit submodule by tools/gen.zig. The canonical ABI is handled at comptime in src/abi.zig, so plugins are plain wasm32-freestanding modules and only need wasm-tools to become a component. On top of that there is a small hand written layer: plugin registration, typed event handlers, declarative commands (cmd), text components from struct literals (msg) and std.log support. |
||
|---|---|---|
| example/src | ||
| src | ||
| tools | ||
| wit@2366bb9edb | ||
| .gitignore | ||
| .gitmodules | ||
| build.zig | ||
| build.zig.zon | ||
| LICENSE-APACHE | ||
| LICENSE-MIT | ||
| README.md | ||
Pumpkin API for Zig
This package provides Zig bindings for building Pumpkin plugins using WebAssembly (Wasm) components.
You will need Zig 0.16.0 and wasm-tools in your PATH.
Quick Start
- Setup Your Project
Add the package to your project:
zig fetch --save git+https://github.com/Pumpkin-MC/pumpkin-api-zig
Create a build.zig for your plugin:
const std = @import("std");
const pumpkin_api = @import("pumpkin_api_zig");
pub fn build(b: *std.Build) void {
_ = pumpkin_api.addPlugin(b, b.dependency("pumpkin_api_zig", .{}), .{
.name = "pumpkin-plugin-example",
.root_source_file = b.path("src/main.zig"),
});
}
- Write Your Plugin
Create your source file (e.g. src/main.zig):
const std = @import("std");
const pumpkin = @import("pumpkin");
pub const std_options: std.Options = .{ .logFn = pumpkin.logFn };
const MyPlugin = struct {
pub const metadata: pumpkin.Metadata = .{
.name = "pumpkin-plugin-example",
.version = "0.1.0",
.authors = &.{"You"},
.description = "An example plugin in Zig.",
};
pub const events = .{
.player_join_event = onJoin,
};
pub fn onLoad(_: pumpkin.Context) !void {
std.log.info("Hello from Zig!", .{});
}
fn onJoin(_: pumpkin.Server, ev: *pumpkin.EventData(.player_join_event)) void {
std.log.info("{s} joined", .{ev.player.getName()});
}
};
comptime {
pumpkin.register(MyPlugin);
}
Everything the API returns, handles included, is only valid until the current callback returns. Call keep() on a handle to hold on to it, then release it with deinit() when you're done.
- Build Your Plugin
Compile your plugin into a WebAssembly component:
zig build
This will produce zig-out/pumpkin-plugin-example.wasm ready to be loaded into Pumpkin.