Overview
Sn0w uses a custom event bus system for handling game events and communication between modules. The event system is built around three core components:- Event - Base class for all events
- EventManager - Central registry and dispatcher
- @SubscribeEvent - Annotation for event listeners
Event Architecture
Event Base Class
All events extend fromme.skitttyy.kami.api.event.Event:
- Cancellable events can be stopped from propagating
- Events are posted using the
post()method - Thread-safe implementation using
CopyOnWriteArrayList
Event Manager
Location:api/event/eventbus/EventManager.java
The EventManager handles registration and dispatching:
- Scans all methods in the registered object
- Finds methods annotated with
@SubscribeEvent - Validates method signature (must have exactly one Event parameter)
- Stores method reference with priority for efficient invocation
Event Priorities
Location:api/event/eventbus/Priority.java
Event Types
Tick Events
Location:api/event/events/TickEvent.java
Network Events
Location:api/event/events/network/PacketEvent.java
Render Events
Location:api/event/events/render/
Movement Events
Location:api/event/events/move/
Event Lifecycle
1. Registration
2. Listening
3. Posting
4. Unregistration
Creating Custom Events
Step 1: Define Event Class
Step 2: Post Event from Mixin
Step 3: Listen for Event
Best Practices
Method Signatures
Null Checks
Event Cancellation
Performance
Common Patterns
Conditional Event Listening
Multi-Event Handling
Debugging Events
Event System Internals
EventData Structure
Location:api/event/EventData.java
Event Dispatch Flow
event.post()is called- EventManager looks up all registered listeners for that event type
- Listeners are sorted by priority (already sorted during registration)
- Each listener method is invoked via reflection
- If event is cancelled, subsequent listeners still execute (cancellation is advisory)
Related Files
- Event base class:
api/event/Event.java:10 - EventManager:
api/event/eventbus/EventManager.java:15 - SubscribeEvent annotation:
api/event/eventbus/SubscribeEvent.java:10 - Priority constants:
api/event/eventbus/Priority.java:4 - EventData:
api/event/EventData.java:5