Overview
TheEventManager is a modern, high-performance event system that handles all events in LiquidBounce. It uses lambda handlers for clean, efficient event processing and supports priority-based execution.
Package: net.ccbluex.liquidbounce.event
Object Declaration
Core Methods
Event Registration
registerEventHook()
fun <T : Event> registerEventHook(eventClass: Class<out Event>, eventHook: EventHook<T>): EventHook<T>
Registers an event handler.Usually called through
EventListener.handler() extension.unregisterEventHook()
fun <T : Event> unregisterEventHook(eventClass: Class<out Event>, eventHook: EventHook<T>)
Unregisters a specific event handler.
Unregisters all handlers from an event listener.
Unregisters all event handlers (dangerous!).
Event Calling
Calls an event and notifies all registered handlers.Example:
Event Flows
Gets a Kotlin Flow for the given event type.Example:
Event Types
LiquidBounce includes many built-in event types:Game Events
- GameTickEvent - Called every game tick (20 times/second)
- GameRenderEvent - Called when game is rendered
- WorldChangeEvent - Called when world changes
- DisconnectEvent - Called when disconnecting from server
Player Events
- PlayerTickEvent - Called every player tick
- PlayerMoveEvent - Called when player moves
- PlayerJumpEvent - Called when player jumps
- AttackEntityEvent - Called when attacking entity
- PlayerSafeWalkEvent - Called to check safe walk
Network Events
- PacketEvent - Called for sent/received packets
- ServerConnectEvent - Called when connecting to server
Input Events
- KeyboardKeyEvent - Keyboard input
- MouseButtonEvent - Mouse button input
- MouseScrollEvent - Mouse scroll input
Module Events
- ModuleToggleEvent - Module enabled/disabled
- ModuleActivationEvent - Module activation
- ValueChangedEvent - Config value changed
Render Events
- WorldRenderEvent - World rendering
- OverlayRenderEvent - HUD/Overlay rendering
- ScreenRenderEvent - GUI screen rendering
Combat Events
- TargetChangeEvent - Combat target changed
- RotationUpdateEvent - Rotation update
Creating Event Handlers
Basic Handler
Handler with Priority
One-Time Handler
Repeated Handler
Until Handler
Event Cancellation
Many events can be cancelled:Event Flow Usage
Priority Convention
Performance Considerations
- Event handlers are called frequently - Keep them lightweight
- Use appropriate priority - Don’t always use FIRST_PRIORITY
- Unregister when done - Free resources with
unregister() - Cancel events early - Prevent unnecessary processing
- Use Flow for async - Better for coroutine-based code
Best Practices
- Store handlers as fields - Prevents garbage collection
- Use descriptive names -
tickHandler, nothandler1 - Choose correct event - Use most specific event type
- Check running state - Handler only runs if
EventListener.running - Handle errors - Event errors are logged but don’t crash
- Use priority wisely - Default priority works for most cases
See Also
- EventListener - Creating event listeners
- Event Types - All available events
- ClientModule - Module event handling