Plugin API
Plugins are loaded dynamically and interact with the server through a versioned API.Plugin API Version
pumpkin/src/plugin/mod.rs:24
The API version ensures binary compatibility between plugins and server versions.
Creating a Plugin
Plugin Trait
Implement thePlugin trait:
pumpkin/src/plugin/api/mod.rs:33-58
Plugin Metadata
Define plugin information:pumpkin/src/plugin/api/mod.rs:15-24
Example Plugin
Plugin Context
Plugins receive aContext providing access to server features:
pumpkin/src/plugin/api/context.rs
Event System
Plugins can listen to and handle server events.Event Handler Trait
pumpkin/src/plugin/mod.rs:66-86
Event Types
Two types of events:- Non-blocking Events: Read-only event data
- Blocking Events: Can modify event data or cancel
Event Priorities
Registering Event Handlers
Available Events
Pumpkin provides events for various gameplay aspects.Block Events
BlockBreakEvent
Fired when a player breaks a block.pumpkin/src/plugin/api/events/block/block_break.rs
BlockPlaceEvent
Fired when a player places a block.pumpkin/src/plugin/api/events/block/block_place.rs
BlockBurnEvent
Fired when a block is destroyed by fire. Source:pumpkin/src/plugin/api/events/block/block_burn.rs
BlockCanBuildEvent
Fired to check if a block can be built at a location. Source:pumpkin/src/plugin/api/events/block/block_can_build.rs
BlockGrowEvent
Fired when a block grows naturally (crops, plants). Source:pumpkin/src/plugin/api/events/block/block_grow.rs
Player Events
Player-related events include:- Player join/quit
- Player chat
- Player movement
- Player interactions
Entity Events
Entity events cover:- Entity spawn/despawn
- Entity damage
- Entity death
- Entity target change
World Events
World events for:- Chunk load/unload
- World save
- Time change
- Weather change
pumpkin/src/plugin/api/events/
Plugin Loading
Plugins are loaded from shared libraries (.so, .dll, .dylib).Native Plugin Loader
pumpkin/src/plugin/loader/native.rs
Loading Process
- Discovery: Scan plugins directory
- Validation: Check API version compatibility
- Loading: Load shared library
- Initialization: Call
on_loadhook - Registration: Register event handlers
Plugin States
pumpkin/src/plugin/mod.rs:150
Plugin Management
Manage plugins at runtime:List Plugins
pumpkin/src/command/commands/plugins.rs
Plugin Commands
pumpkin/src/command/commands/plugin.rs
Plugin Manager
Central plugin management:pumpkin/src/plugin/mod.rs:146-148
Features:
- Load/unload plugins
- Event handler registration
- Plugin dependency resolution
- Hot-reload support
Error Handling
pumpkin/src/plugin/loader/
Proper error handling ensures:
- Graceful plugin failures
- Server stability
- Debug information
Best Practices
Thread Safety
All plugin code must be thread-safe:- Use
Arcfor shared state - Prefer
RwLockoverMutexfor read-heavy data - Avoid blocking operations in event handlers
Async Operations
Plugin hooks are async:Box::pin(async move { ... }) for async code.
Resource Cleanup
Always clean up inon_unload:
- Unregister event handlers
- Close file handles
- Cancel background tasks
- Free allocated resources
Versioning
Follow semantic versioning:- Major: Breaking API changes
- Minor: New features, backwards compatible
- Patch: Bug fixes
Security Considerations
- Plugins run with full server privileges
- Validate all user input in event handlers
- Avoid loading untrusted plugins
- Review plugin source code before use
- Use permission checks for sensitive operations
Performance Tips
- Cache frequently accessed data
- Use event priorities to control execution order
- Avoid heavy computation in high-frequency events
- Profile plugin performance impact
- Consider async tasks for long-running operations
Plugin Development Resources
- Review built-in command implementations for patterns
- Study entity AI goals for behavior examples
- Examine block event handlers for world interaction
- Use Pumpkin’s existing APIs before reimplementing
pumpkin/src/plugin/