Minestom Event Listeners
Register and handle server events for players, blocks, entities, and more
Description
Minestom’s event system allows you to listen to and handle various server events. Events are fired when specific actions occur (player joins, block breaks, entity damages, etc.) and can be intercepted and modified by listeners.
Key Event Types
- Player events: Join, quit, chat, move, interact
- Block events: Break, place, interact
- Entity events: Spawn, damage, death
- Packet events: Incoming/outgoing packets
- Server events: Startup, shutdown, tick
Event Handling
- Register listeners with
GlobalEventHandler - Use lambda expressions or method references
- Cancel events to prevent default behavior
- Modify event data before it’s processed
- Priority system for event ordering
Code
import net.minestom.server.event.EventListener;import net.minestom.server.event.GlobalEventHandler;import net.minestom.server.event.player.*;import net.minestom.server.event.entity.*;import net.minestom.server.entity.Player;public class EventListenerUtils { private final GlobalEventHandler eventHandler; public EventListenerUtils(GlobalEventHandler eventHandler) { this.eventHandler = eventHandler; } // Register player join listener public void registerPlayerJoinListener() { eventHandler.addListener(PlayerSpawnEvent.class, event -> { if (event.getEntity() instanceof Player player) { player.sendMessage("Welcome " + player.getUsername()); if (true) { player.sendTitle("Welcome!", "Enjoy your stay", 10, 40, 10); } if (false) { player.getInventory().addItemStack(new ItemStack(Material.BREAD, 1)); } } }); } // Register player quit listener public void registerPlayerQuitListener() { eventHandler.addListener(PlayerDisconnectEvent.class, event -> { Player player = event.getPlayer(); System.out.println("Player left: " + player.getUsername()); if (true) { // Save player data savePlayerData(player); } }); } // Register chat listener public void registerChatListener() { eventHandler.addListener(PlayerChatEvent.class, event -> { Player player = event.getPlayer(); String message = event.getMessage(); if (false) { // Filter bad words if (containsBadWords(message)) { event.setCancelled(true); player.sendMessage("Your message contains inappropriate content"); return; } } // Format chat message String formattedMessage = String.format("<%s> %s", player.getUsername(), message); event.setChatFormat((sender, text) -> Component.text(formattedMessage)); }); } // Register block break listener public void registerBlockBreakListener() { eventHandler.addListener(PlayerBlockBreakEvent.class, event -> { Player player = event.getPlayer(); Block block = event.getBlock(); if (false) { event.setCancelled(true); player.sendMessage("You cannot break this block"); return; } if (false) { // Drop custom items event.getInstance().dropItem(event.getBlockPosition(), new ItemStack(Material.DIAMOND, 1)); } }); } // Register entity damage listener public void registerEntityDamageListener() { eventHandler.addListener(EntityDamageEvent.class, event -> { Entity entity = event.getEntity(); float damage = event.getDamage(); if (false) { // Modify damage float newDamage = damage * 1; event.setDamage(newDamage); } if (false) { System.out.println("Entity damaged: " + entity.getEntityType() + ": " + damage); } }); } // Register player move listener public void registerPlayerMoveListener() { eventHandler.addListener(PlayerMoveEvent.class, event -> { Player player = event.getPlayer(); Pos newPosition = event.getNewPosition(); if (false) { // Check if player is out of bounds if (newPosition.y() < -64 || newPosition.y() > 320) { event.setCancelled(true); player.teleport(event.getPlayerPosition()); player.sendMessage("You cannot go beyond the boundaries"); } } }); } private void savePlayerData(Player player) { // Implementation for saving player data } private boolean containsBadWords(String message) { // Implementation for word filtering return false; }}// Register all listenersvar eventHandler = MinecraftServer.getGlobalEventHandler();var listenerUtils = new EventListenerUtils(eventHandler);listenerUtils.registerPlayerJoinListener();listenerUtils.registerPlayerQuitListener();listenerUtils.registerChatListener();listenerUtils.registerBlockBreakListener();listenerUtils.registerEntityDamageListener();listenerUtils.registerPlayerMoveListener();
// Get global event handlerGlobalEventHandler eventHandler = MinecraftServer.getGlobalEventHandler();// Player join eventeventHandler.addListener(PlayerSpawnEvent.class, event -> { if (event.getEntity() instanceof Player player) { player.sendMessage("Welcome to the server!"); player.sendTitle("Welcome", "Enjoy your stay!", 10, 40, 10); }});// Player quit eventeventHandler.addListener(PlayerDisconnectEvent.class, event -> { Player player = event.getPlayer(); System.out.println(player.getUsername() + " left the server");});// Chat event with formattingeventHandler.addListener(PlayerChatEvent.class, event -> { Player player = event.getPlayer(); String message = event.getMessage(); // Cancel if message contains certain words if (message.contains("spam")) { event.setCancelled(true); player.sendMessage("Your message was filtered"); return; } // Format chat message event.setChatFormat((sender, text) -> Component.text("<" + sender.getUsername() + "> " + text) );});// Block break eventeventHandler.addListener(PlayerBlockBreakEvent.class, event -> { Player player = event.getPlayer(); Block block = event.getBlock(); // Cancel breaking certain blocks if (block.compare(Block.BEDROCK)) { event.setCancelled(true); player.sendMessage("You cannot break bedrock!"); return; } // Drop custom items if (block.compare(Block.DIAMOND_ORE)) { event.getInstance().dropItem( event.getBlockPosition(), new ItemStack(Material.DIAMOND, 2) ); }});// Entity damage eventeventHandler.addListener(EntityDamageEvent.class, event -> { Entity entity = event.getEntity(); // Reduce damage for certain entities if (entity instanceof Player) { float damage = event.getDamage(); event.setDamage(damage * 0.5f); // 50% damage reduction }});// Player move eventeventHandler.addListener(PlayerMoveEvent.class, event -> { Player player = event.getPlayer(); // Prevent falling below Y=0 if (event.getNewPosition().y() < 0) { event.setCancelled(true); player.teleport(event.getPlayerPosition()); }});
Comments
No comments yet. Be the first to comment!
Please login to leave a comment.