DUXPLIMA Documentation

Events

Registering Event Listeners

Async Event Firing

uxmClaims events may be fired asynchronously (off the main thread). If you need to interact with Bukkit APIs that require the main thread (e.g., spawning entities, modifying blocks, sending packets), you must schedule your code back to the main thread using Bukkit.getScheduler().runTask(). Failure to do so may cause IllegalStateException or other threading issues.

Using @ClaimEventHandler

Create a listener class and register it with the API:

import com.uxplima.claim.bukkit.api.UxmClaimBukkitAPI;
import com.uxplima.claim.bukkit.api.annotation.ClaimEventHandler;
import com.uxplima.claim.domain.event.ClaimCreateEvent;

public class MyClaimListener {
    
    @ClaimEventHandler
    public void onClaimCreate(ClaimCreateEvent event) {
        Claim claim = event.getClaim();
        System.out.println("Claim created: " + claim.getName());
    }
}

Register in your plugin:

@Override
public void onEnable() {
    UxmClaimBukkitAPI api = UxmClaimBukkitAPI.getInstance();
    api.registerEvent(new MyClaimListener());
}

@Override
public void onDisable() {
    UxmClaimBukkitAPI api = UxmClaimBukkitAPI.getInstance();
    api.unregisterEvent(myListener);
}

@ClaimEventHandler Options

@ClaimEventHandler(priority = 1, ignoreCancelled = false)
public void onEvent(ClaimEvent event) {
    // ...
}
OptionDefaultDescription
priority1Lower = called first
ignoreCancelledfalseSkip if already cancelled

Cancelling Events

All events are cancellable. Use setCancelled(true) to prevent the action:

import com.uxplima.claim.domain.event.ClaimCreateEvent;

@ClaimEventHandler
public void onClaimCreate(ClaimCreateEvent event) {
    Claim claim = event.getClaim();
    
    // Prevent claims in specific world
    if (claim.getMainChunk().getWorld().equals("event_world")) {
        event.setCancelled(true);
    }
}

All Available Events (All Cancellable ✅)

Claim Lifecycle

EventWhen It Fires
ClaimCreateEventClaim is being created
ClaimDeleteEventClaim is being deleted
ClaimExpireEventClaim has expired
ClaimRenameEventClaim renamed
ClaimRelocateEventSpawn location moved
ClaimRescheduleEventExpiration date changed

Chunk Events

EventWhen It Fires
ClaimChunkExtendEventChunk added
ClaimChunkShrinkEventChunk removed

Member Events

EventWhen It Fires
ClaimMemberBanEventPlayer was banned
ClaimMemberUnbanEventPlayer was unbanned
ClaimMemberKickEventPlayer was kicked
ClaimMemberLeaveEventPlayer left voluntarily
ClaimMemberRoleAssignEventRole changed
ClaimMemberPermissionUpdateEventPermissions changed

Invite Events

EventWhen It Fires
ClaimInviteSendEventInvitation sent
ClaimInviteAcceptEventInvitation accepted
ClaimInviteRevokeEventInvitation cancelled

Role Events

EventWhen It Fires
ClaimRoleCreateEventRole created
ClaimRoleDeleteEventRole deleted
ClaimRoleRenameEventRole renamed
ClaimRolePriorityUpdateEventPriority changed
ClaimRolePermissionUpdateEventPermissions changed

Warp Events

EventWhen It Fires
ClaimWarpCreateEventWarp created
ClaimWarpDeleteEventWarp deleted
ClaimWarpRenameEventWarp renamed
ClaimWarpRelocateEventWarp location moved
ClaimWarpVisibilityEventPublic/private toggled

Block Events

EventWhen It Fires
ClaimBlockPlaceEventClaim block placed
ClaimBlockDestroyEventClaim block destroyed
ClaimBlockChangeEventBlock style changed

Other Events

EventWhen It Fires
ClaimFlagsUpdateEventFlags changed
ClaimVaultUpdateEventVault contents changed
ClaimMoveInsideEventPlayer entered claim
ClaimMoveOutsideEventPlayer left claim

Event Data Access

All events extend ClaimEvent and implement CancellableDomainEvent:

@ClaimEventHandler
public void onAnyEvent(ClaimEvent event) {
    // Get the affected claim
    Claim claim = event.getClaim();
    
    // All events are cancellable
    if (event instanceof CancellableDomainEvent cancellable) {
        boolean isCancelled = cancellable.isCancelled();
        cancellable.setCancelled(true);
    }
}

Example: Welcome Message

@ClaimEventHandler
public void onEnterClaim(ClaimMoveInsideEvent event) {
    Claim claim = event.getClaim();
    Player player = event.getPlayer();
    
    player.sendMessage("Welcome to " + claim.getName() + "!");
}

Example: Prevent Entry for Banned

@ClaimEventHandler
public void onEnterClaim(ClaimMoveInsideEvent event) {
    Claim claim = event.getClaim();
    UUID playerUid = event.getPlayer().getUniqueId();
    
    if (claim.hasBanByUid(playerUid)) {
        event.setCancelled(true);
    }
}

Example: Log All Claim Deletions

@ClaimEventHandler
public void onClaimDelete(ClaimDeleteEvent event) {
    Claim claim = event.getClaim();
    getLogger().info("Claim deleted: " + claim.getName() + 
                     " owned by " + claim.getOwnerUid());
}

Best Practices

  1. Check cancellation first - If already cancelled, skip your logic
  2. Use appropriate priority - Lower numbers run first
  3. Keep handlers fast - Don't block the main thread
  4. Unregister on disable - Clean up when your plugin stops
@ClaimEventHandler(priority = 0, ignoreCancelled = true)
public void onEvent(ClaimCreateEvent event) {
    // priority = 0 runs first
    // ignoreCancelled = true skips if already cancelled
}

Next Steps

Events · UXPLIMA Documentation