// Get global event handler
GlobalEventHandler eventHandler = MinecraftServer.getGlobalEventHandler();

// Register player join event listener
eventHandler.addListener(PlayerSpawnEvent.class, event -> {
    // This code runs when a player joins
    if (event.getEntity() instanceof Player player) {
        player.sendMessage("Welcome to the server!");
    }
});

// Register chat event with modification
eventHandler.addListener(PlayerChatEvent.class, event -> {
    // Modify chat format
    String message = event.getMessage();
    Player player = event.getPlayer();
    
    // Cancel if message contains certain words
    if (message.contains("spam")) {
        event.setCancelled(true);
        player.sendMessage("Your message was filtered");
        return;
    }
    
    // Modify chat format
    event.setChatFormat((sender, text) -> 
        Component.text("<" + sender.getUsername() + "> " + text)
    );
});

// Register block break event with cancellation
eventHandler.addListener(PlayerBlockBreakEvent.class, event -> {
    Block block = event.getBlock();
    
    // Prevent breaking certain blocks
    if (block.compare(Block.BEDROCK)) {
        event.setCancelled(true);
        event.getPlayer().sendMessage("You cannot break bedrock!");
    }
});

// Register event with priority
eventHandler.addListener(PlayerMoveEvent.class, EventPriority.HIGH, event -> {
    // This listener runs early (HIGH priority)
    Player player = event.getPlayer();
    
    // Check boundaries
    if (event.getNewPosition().y() < 0) {
        event.setCancelled(true);
        player.teleport(event.getPlayerPosition());
    }
});

// Multiple listeners for same event
eventHandler.addListener(EntityDamageEvent.class, event -> {
    // First listener: Log damage
    System.out.println("Entity damaged: " + event.getDamage());
});

eventHandler.addListener(EntityDamageEvent.class, event -> {
    // Second listener: Modify damage
    if (event.getEntity() instanceof Player) {
        event.setDamage(event.getDamage() * 0.5f); // Reduce damage by 50%
    }
});

// Unregister listener (if you keep reference)
EventListener<PlayerSpawnEvent> listener = event -> {
    // Listener code
};
eventHandler.addListener(PlayerSpawnEvent.class, listener);
// Later...
eventHandler.removeListener(PlayerSpawnEvent.class, listener);