shield-quarteredCore Events

Getting Started

Follow these steps to listen to events in your plugin.

1

Register Event Listeners

Create a listener class that implements Listener.

DungeonEventListener.java
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;

public class DungeonEventListener implements Listener {
    
    private final JavaPlugin plugin;
    
    public DungeonEventListener(JavaPlugin plugin) {
        this.plugin = plugin;
    }
}
2

Register with Event Manager

In your plugin's onEnable, register the listener.

MainPlugin.java
@Override
public void onEnable() {
    Listener eventListener = new DungeonEventListener(this);
    getServer().getPluginManager().registerEvents(eventListener, this);
    getLogger().info("Event listeners registered!");
}
circle-exclamation
3

Safe Async Handling

Some events fire asynchronously. Use proper thread-safety when accessing Bukkit APIs.

AsyncHandlerExample.java
@EventHandler
public void onAsyncEvent(PlayerDamageEvent event) {
    // This event is ASYNC - don't access Bukkit APIs directly
    
    double currentDamage = event.getDamage();
    // Safe: modifying event data
    event.setDamage(currentDamage * 2);
}

Global Events

PlayerDamageEvent

Fired before each auto-hit damage is applied to a mob. Modify damage value or cancel the hit entirely.

PlayerDamageHandler.java
@EventHandler
public void onPlayerDamage(PlayerDamageEvent event) {
    Player player = event.getPlayer();
    double damage = event.getDamage();
    
    // Double damage for premium players
    if (player.hasPermission("360.skibidi.toilet.rizz")) {
        event.setDamage(damage * 2);
        player.sendMessage("§6hi mr rizzler");
    }
    
    // Cancel specific mob hits
    if (event.getMobId().equals("boogey-man")) {
        event.setCancelled(true);
        player.sendMessage("§cnope");
    }
}

PlayerAutoHitStartEvent

Fired when a player starts auto-hitting a mob. Customize the attack speed or prevent auto-hit entirely.


PlayerSwingEvent

Fired when a player swings their sword. Batches multiple swings into one event for performance.

PlayerLevelUpEvent

Fired when a player levels up in any progression system (sword-level, prestige, etc.). Fully modifiable for boosters and reward multipliers.

PlayerCurrencyGainEvent

Fired before a player gains any currency (money, souls, essence, etc.). Modify rewards or cancel entirely.


EntityDeathEvent

Fired when a mob dies. Control respawning, modify currency rewards, or trigger custom logic.

Key Features:

  • Contains zone, stage, and mob information

  • Rewards can be modified before being added

  • Can prevent respawn

PlayerEnchantProcAttemptEvent

Fired before an enchant's proc chance is rolled. Modify proc chance for custom logic or boosters.

PlayerEnterZoneEvent

Fired when a player enters a zone. Can be cancelled to prevent entry.


PlayerLeaveZoneEvent

Fired when a player leaves a zone. Not cancellable (just informational).

PlayerSwordUpgradeEvent

Fired when a player attempts to upgrade their sword. Modify cost, prevent upgrade, or trigger side effects.

Cool Event Stuff

Booster Multiplier Stack

Combine multiple event listeners to apply boosters:

Progressive Difficulty

Scale rewards and difficulty based on progression:

Event Chaining

Perform sequential operations with futures:

FAQ

chevron-rightCan I cancel an event after it's processed?hashtag

No, cancellation must happen in the event handler itself.

chevron-rightAre all events thread-safe?hashtag

Events marked as async are not thread-safe for Bukkit APIs. Use Bukkit.getScheduler() to access them.

chevron-rightDo modifications persist across server restarts?hashtag

Event modifications only affect the current session. Use async methods to persist changes to the database.

chevron-rightCan I create custom events?hashtag

Yes! Extend Event and implement Cancellable if needed. Follow this guide's patterns.

chevron-rightWhat's the performance impact?hashtag

Minimal. Events are optimized. Monitor with /timings if concerned.

Last updated