IEventBus (server-wide event bus)
└── EventBusRegistry (manages consumers per event class)
├── SyncEventBusRegistry (synchronous dispatch)
└── AsyncEventBusRegistry (async dispatch via CompletableFuture)
EventRegistry (per-plugin wrapper, auto-cleanup on shutdown)
└── delegates to IEventRegistry (parent bus)
EventRegistry (Plugin API)
Package: com.hypixel.hytale.event
Each plugin gets its own EventRegistry via getEventRegistry(). All registrations are auto-cleaned on plugin shutdown.
// Simple event listener (no key, default priority)
<EventType extends IBaseEvent <Void >> EventRegistration <Void , EventType >
register (Class <? super EventType > eventClass , Consumer <EventType > consumer );
// With priority
<EventType extends IBaseEvent <Void >> EventRegistration <Void , EventType >
register (EventPriority priority , Class <? super EventType > eventClass , Consumer <EventType > consumer );
// With custom priority value
<EventType extends IBaseEvent <Void >> EventRegistration <Void , EventType >
register (short priority , Class <? super EventType > eventClass , Consumer <EventType > consumer );
// Keyed event (entity-scoped)
<KeyType , EventType extends IBaseEvent <KeyType >> EventRegistration <KeyType , EventType >
register (Class <? super EventType > eventClass , KeyType key , Consumer <EventType > consumer );
// Global listener for keyed events (receives all keys)
<KeyType , EventType extends IBaseEvent <KeyType >> EventRegistration <KeyType , EventType >
registerGlobal (Class <? super EventType > eventClass , Consumer <EventType > consumer );
// Async event listener
<EventType extends IAsyncEvent <Void >> EventRegistration <Void , EventType >
registerAsync (Class <? super EventType > eventClass ,
Function <CompletableFuture <EventType >, CompletableFuture <EventType >> function );
// Unhandled event listener (fires only if no keyed handler matched)
<KeyType , EventType extends IBaseEvent <KeyType >> EventRegistration <KeyType , EventType >
registerUnhandled (Class <? super EventType > eventClass , Consumer <EventType > consumer );
public enum EventPriority {
FIRST (-21844 ), // Runs first
EARLY (-10922 ),
NORMAL (0 ), // Default
LATE (10922 ),
LAST (21844 ); // Runs last
}
Custom priority values (short) also supported for fine-grained ordering.
public interface IBaseEvent <KeyType > { } // Base for all events
public interface IEvent <KeyType > extends IBaseEvent <KeyType > { } // Sync events
public interface IAsyncEvent <KeyType > extends IBaseEvent <KeyType > { } // Async events
public interface ICancellable { boolean isCancelled (); void setCancelled (boolean cancelled ); }
public interface IProcessedEvent { boolean isProcessed (); void setProcessed (boolean processed ); }
Player Events (server.core.event.events.player)
Event
Key Type
Description
PlayerConnectEvent
Void
Player connected to server
PlayerDisconnectEvent
Void
Player disconnected
PlayerReadyEvent
Void
Player fully loaded and ready
PlayerSetupConnectEvent
Void
Pre-connection setup
PlayerSetupDisconnectEvent
Void
Pre-disconnect cleanup
AddPlayerToWorldEvent
keyed
Player added to a world
DrainPlayerFromWorldEvent
keyed
Player removed from world
PlayerChatEvent
Void
Player sent chat message
PlayerInteractEvent
keyed
Player interacted with entity/block
PlayerMouseButtonEvent
keyed
Mouse button pressed
PlayerMouseMotionEvent
keyed
Mouse moved
PlayerCraftEvent
keyed
Player crafted item
PlayerConnectEvent Key Methods
PlayerRef getPlayerRef ();
World getWorld (); // Initial world (may be null)
PlayerDisconnectEvent Key Methods
PlayerRef getPlayerRef ();
PlayerChatEvent Key Methods
PlayerRef getPlayerRef ();
String getMessage ();
void setMessage (String message );
Formatter getFormatter (); // Interface for formatting
ECS Events (server.core.event.events.ecs)
Event
Description
BreakBlockEvent
Block broken
PlaceBlockEvent
Block placed
DamageBlockEvent
Block damaged
UseBlockEvent.Pre / .Post
Block used (interaction)
ChangeGameModeEvent
Game mode changed
CraftRecipeEvent.Pre / .Post
Recipe crafted
DropItemEvent
Item dropped
InteractivelyPickupItemEvent
Item picked up
SwitchActiveSlotEvent
Hotbar slot changed
DiscoverZoneEvent
Zone discovered
Permission Events (server.core.event.events.permissions)
Event
Description
PlayerPermissionChangeEvent.PermissionsAdded
Permissions added to player
PlayerPermissionChangeEvent.PermissionsRemoved
Permissions removed from player
PlayerPermissionChangeEvent.GroupAdded
Player added to group
PlayerPermissionChangeEvent.GroupRemoved
Player removed from group
PlayerGroupEvent.Added
Player-group association added
PlayerGroupEvent.Removed
Player-group association removed
GroupPermissionChangeEvent.Added
Permissions added to group
GroupPermissionChangeEvent.Removed
Permissions removed from group
Entity Events (server.core.event.events.entity)
Event
Description
EntityEvent
Base entity event
EntityRemoveEvent
Entity removed from world
LivingEntityInventoryChangeEvent
Inventory changed
LivingEntityUseBlockEvent
Entity used a block
Event
Description
BootEvent
Server boot complete
ShutdownEvent
Server shutting down
PrepareUniverseEvent
Universe initialization
Plugin Events (server.core.plugin.event)
Event
Description
PluginEvent
Base plugin event
PluginSetupEvent
Plugin setup phase complete
Keyed vs Non-keyed Events
Non-keyed (IBaseEvent<Void>): Use register() — all listeners receive the event
Keyed (IBaseEvent<KeyType>): Use register(eventClass, key, consumer) — only listeners matching the key receive the event. Use registerGlobal() to receive all keys.
HyperPerms Usage Patterns
// Non-keyed: all player connects
getEventRegistry ().register (PlayerConnectEvent .class , this ::onPlayerConnect );
// Non-keyed: all player disconnects
getEventRegistry ().register (PlayerDisconnectEvent .class , this ::onPlayerDisconnect );
// Global for keyed events: all world additions
getEventRegistry ().registerGlobal (AddPlayerToWorldEvent .class , this ::onPlayerAddedToWorld );
// Global for keyed events: all game mode changes
getEventRegistry ().registerGlobal (ChangeGameModeEvent .class , this ::onGameModeChange );