Events
Minecraft Java Plugin Claude SkillsFrom the repository description
npx -y skills add MrPippi/MJP-Claude-Skills --skill eventsAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
6.1 KB, ~1.4k tokens by cl100k_base, as published. Nobody here has run it
Events Skill — Waterfall
Purpose
Reference this skill when handling events in a Waterfall (BungeeCord) proxy plugin. Waterfall's event system resembles Bukkit's @EventHandler pattern but uses BungeeCord-specific event classes.
When to Use This Skill
- Responding to player login, server switch, or disconnect events at the proxy level
- Intercepting chat at the proxy
- Implementing ban checks or authentication before players join the network
API Quick Reference
| Class / Method | Purpose | Notes |
|---|---|---|
Listener | Marker interface for BungeeCord event listeners | net.md_5.bungee.api.plugin.Listener |
@EventHandler | Marks event handler method | net.md_5.bungee.event.EventHandler |
EventPriority | Controls order: LOWEST → LOW → NORMAL → HIGH → HIGHEST | net.md_5.bungee.event.EventPriority |
PluginManager#registerListener(Plugin, Listener) | Register all handlers in a listener | |
PostLoginEvent | Player fully connected to proxy | net.md_5.bungee.api.event.PostLoginEvent |
LoginEvent | Before player is authenticated | Cancellable; set reason to kick |
PlayerDisconnectEvent | Player left the proxy | |
ServerConnectedEvent | Player connected to a backend | |
ServerSwitchEvent | Player switched to a different backend | |
ChatEvent | Player sent a chat message | Cancellable |
PluginMessageEvent | Plugin message received at proxy | |
ProxiedPlayer | BungeeCord player handle | net.md_5.bungee.api.connection.ProxiedPlayer |
Code Pattern
package com.yourorg.waterfallplugin.listeners;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.chat.TextComponent;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.event.ChatEvent;
import net.md_5.bungee.api.event.LoginEvent;
import net.md_5.bungee.api.event.PlayerDisconnectEvent;
import net.md_5.bungee.api.event.PostLoginEvent;
import net.md_5.bungee.api.event.ServerConnectedEvent;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.api.plugin.Plugin;
import net.md_5.bungee.event.EventHandler;
import net.md_5.bungee.event.EventPriority;
import java.util.logging.Logger;
public class ConnectionListener implements Listener {
private final Plugin plugin;
private final Logger logger;
public ConnectionListener(Plugin plugin) {
this.plugin = plugin;
this.logger = plugin.getLogger();
}
// Fires before login — kick players early
@EventHandler(priority = EventPriority.NORMAL)
public void onLogin(LoginEvent event) {
// event.getConnection() gives InboundConnection (no player yet)
String name = event.getConnection().getName();
if (isNetworkBanned(name)) {
// BungeeCord uses legacy chat components
event.setCancelled(true);
event.setCancelReason(new TextComponent("§cYou are banned from this network."));
}
}
// Player fully connected to the proxy
@EventHandler(priority = EventPriority.NORMAL)
public void onPostLogin(PostLoginEvent event) {
ProxiedPlayer player = event.getPlayer();
logger.info(player.getName() + " (" + player.getUniqueId() + ") joined the network.");
// Broadcast in BungeeCord style (legacy chat)
ProxyServer.getInstance().broadcast(
new TextComponent("§a» " + player.getName() + " joined the network.")
);
}
// Player connected to a backend server
@EventHandler
public void onServerConnected(ServerConnectedEvent event) {
ProxiedPlayer player = event.getPlayer();
String serverName = event.getServer().getInfo().getName();
logger.info(player.getName() + " connected to " + serverName);
}
// Player disconnected from the proxy
@EventHandler
public void onDisconnect(PlayerDisconnectEvent event) {
ProxiedPlayer player = event.getPlayer();
logger.info(player.getName() + " disconnected.");
}
// Chat event (fires at proxy level for all messages)
@EventHandler(priority = EventPriority.NORMAL)
public void onChat(ChatEvent event) {
if (event.isCommand()) return; // Skip commands
String message = event.getMessage();
if (containsProfanity(message)) {
event.setCancelled(true);
if (event.getSender() instanceof ProxiedPlayer player) {
player.sendMessage(new TextComponent("§cYour message was blocked."));
}
}
}
private boolean isNetworkBanned(String name) { return false; }
private boolean containsProfanity(String msg) { return false; }
}
Register listener in main class:
@Override
public void onEnable() {
getProxy().getPluginManager().registerListener(this, new ConnectionListener(this));
}
Common Pitfalls
-
Using Bukkit
@EventHandlerannotation: The BungeeCord annotation isnet.md_5.bungee.event.EventHandler, NOTorg.bukkit.event.EventHandler. Using the wrong import means handlers are silently ignored. -
Using Adventure components on Waterfall without the adapter: Waterfall doesn't natively support Adventure. Use legacy
TextComponentandChatColorOR add theadventure-platform-bungeecordadapter to your shaded JAR. -
Cancelling
PlayerDisconnectEvent: This event is NOT cancellable. You cannot prevent a disconnect at this stage. -
Using
ServerConnectedEventvsServerSwitchEvent:ServerConnectedEventfires when a player joins a backend (initial or switch).ServerSwitchEventfires after the switch is complete and provides thefromserver. For most use cases,ServerConnectedEventis preferred.
Version Notes
- Waterfall 1.21: Event API is unchanged from older BungeeCord versions. All events in
net.md_5.bungee.api.event.*are available. LoginEventis async in BungeeCord — blocking in its handler delays login for that player.
Related Skills
- ../OVERVIEW.md — Waterfall platform setup
- ../messaging/SKILL.md — Plugin messaging
- ../../velocity/events/SKILL.md — Equivalent Velocity events
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.