Sök…


Introduktion

När något händer inne i Bukkit kallas en händelse så att varje plugin kan bestämma vad man ska göra när något händer.

En händelse kallas när en spelare försöker spela ett block, när en enhet avskaffas, när någon loggar in ... Plugins kan lyssna på specifika händelser och hantera det på många olika sätt, till exempel skicka ett meddelande till en admin när en spelare loggar in via PlayerLoginEvent.

Syntax

  • Bukkit.getPluginManager (). RegisterEvents (Listener l, Plugin p);

Anmärkningar

När du registrerar ett evenemang, ta en titt om du inte registrerar det två gånger! Eller kommer din plugin att agera två gånger för det registrerade evenemanget.

Ta en extra titt på hur du hanterar specifika händelser:

Registrera händelser i lyssnarklassen

import org.bukkit.event.Listener;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.player.PlayerLoginEvent;
import org.bukkit.event.player.PlayerQuitEvent;

public class MyEventListener implements Listener {

    /**
     * Constructor
     */
    public MyEventListener(Main plugin){
        //register Events of this class
        //with methode: registerEvents(Listener, Plugin);
        plugin.getServer().getPluginManager().registerEvents(this, plugin);
    }      

    /**
     * A Event with HIGH priority
     */
    @EventHandler(priority = EventPriority.HIGH) //An EventHandler annotation
    public void onPlayerLogin(PlayerLoginEvent event){  //A bukkit event
        event.getPlayer().sendMessage("Welcome.");
    }
    /**
     * A Event with NORMAL (default) priority
     */
    @EventHandler    
    public void onPlayerQuit(PlayerQuitEvent event){ 
        Bukkit.broadcastMessage(event.getPlayer().getName() + " left the Server.");
    }
        

}

/**
 * Main class
 */
public class Main extends JavaPlugin {
    public void onEnable(){
        //Register Events
        new MyEventListener(this);
    }
}

Registrera händelser till din huvudklass

public class Main extends JavaPlugin {

    @Override
    public void onEnable() {
        Bukkit.getPluginManager().registerEvents(this, this);   
    }
  
    @EventHandler
    public void yourEvent(Event e) {
    //...
    }
}

Lyssna på händelser

Bukkit använder ett händelsebaserat system som gör det möjligt för plugin-utvecklare att interagera med och ändra servern och specifika åtgärder som sker i världen.


Skapa en evenemangshanterare

Eventhanterare är metoder som blir uppringda när deras händelse inträffar. De är vanligtvis offentliga och ogiltiga samt namnges on{EventNameStem} enligt konvention. Alla hanterare måste emellertid ha @EventHandler anteckningen, samt innehålla dess händelse som BARA parametern. Här är ett exempel på en händelsehanterare för PlayerJoinEvent

@EventHandler
public void onPlayerJoin(PlayerJoinEvent event){
    //Run when a player joins
}

Obs: Namnformatet för Bukkit-händelser är {Source}{Action}({Target})Event . Några exempel på dessa händelsnamn är: PlayerInteractEvent eller BlockBreakEvent eller PlayerJoinEvent . En lista över alla händelser finns på Spigot Javadocs


Registrera händelser

Att bara skapa en händelsehanterare räcker inte för att Bukkit kan börja skicka händelseanrop till din metod. Du måste också registrera det via PluginManager-gränssnittet.

Det vanligaste sättet att registrera händelser är att skapa en klass som implementerar lyssnargränssnittet och använda det genom att packa dina eventhanterare.

public class EventListener implements Listener { //Implements the Listener interface

    @EventHandler
    public void onPlayerJoin(PlayerJoinEvent event){
        //Run when a player joins
    }

}

Den här lyssnarklassen och alla dess händelser kan sedan registreras i din huvudsakliga plugin-klass så här:

@Override
public void onEnable(){
    Bukkit.getPluginManager().registerEvents(new EventListener(), this); //Register your listener and its event handlers
}

Skapa anpassade händelser

Ibland måste du skapa din egen händelse, en som andra plugins kan lyssna på (Vault, bland andra plugins, gör det) och till och med avbryta. Bukkits Event API tillåter att detta är möjligt. Allt du behöver göra är att skapa en ny klass, få den att förlänga Event , lägga till hanterare och attribut som ditt evenemang behöver (som spelare eller meddelande).

import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;

public final class CustomEvent extends Event {
    private static final HandlerList handlers = new HandlerList();
    private String message;

    public CustomEvent(String example) {
        message = example;
    }

    public String getMessage() {
        return message;
    }

    public HandlerList getHandlers() {
        return handlers;
    }

    public static HandlerList getHandlerList() {
        return handlers;
    }
}

Ringa din anpassade händelse

Du har kontroll över att skapa och ringa dina evenemang, där du kallar det är helt upp till dig. Här är ett exempel

// Create the event here
CustomEvent event = new CustomEvent("Sample Message");
// Call the event
Bukkit.getServer().getPluginManager().callEvent(event);
Bukkit.getServer().broadcastMessage(event.getMessage());

Kom ihåg: Du har kontroll över dina händelser. Om du inte kallar det och agerar på det händer det inte!

Lyssna på en anpassad händelse

Lyssna på en anpassad händelse är samma sak som att lyssna på en normal händelse.

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

public final class CustomListener implements Listener {
    
    @EventHandler
    public void onCustomEvent(CustomEvent event) {
    // Some code here
    }
}

Gör ditt CustomEvent avbokningsbart

Om du någonsin vill göra ditt evenemang avbrytbart, lägg bara till implements Cancellable , boolean cancelled och en getter och setter:

import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Cancellable;

public final class CustomEvent extends Event implements Cancellable {
    private static final HandlerList handlers = new HandlerList();
    private String message;
    private boolean cancelled;

    public CustomEvent(String example) {
        message = example;
    }

    public String getMessage() {
        return message;
    }

    public boolean isCancelled() {
        return cancelled;
    }

    public void setCancelled(boolean cancel) {
        cancelled = cancel;
    }

    public HandlerList getHandlers() {
        return handlers;
    }

    public static HandlerList getHandlerList() {
        return handlers;
    }
}

Efteråt skulle du kontrollera om ett plugin hade avbrutit den anpassade händelsen.

// Create the event here
CustomEvent event = new CustomEvent("Sample Message");
// Call the event
Bukkit.getServer().getPluginManager().callEvent(event);
// Check if the event is not cancelled
if (!event.isCancelled()) {
    Bukkit.getServer().broadcastMessage(event.getMessage());
}

Grundläggande händelsehantering

Bukkit använder ett händelsebaserat system som gör det möjligt för plugin-utvecklare att interagera med och ändra servern och specifika åtgärder som sker i världen.


Skapa en evenemangshanterare

Eventhanterare är metoder som blir uppringda när deras händelse inträffar. De är vanligtvis offentliga och ogiltiga samt namnges on{EventNameStem} enligt konvention. Alla hanterare måste emellertid ha @EventHandler anteckningen, samt innehålla dess händelse som BARA parametern. Här är ett exempel på en händelsehanterare för PlayerJoinEvent

@EventHandler
public void onPlayerJoin(PlayerJoinEvent event){
    //Run when a player joins
}

Obs: Namnformatet för Bukkit-händelser är {Source}{Action}({Target})Event . Några exempel på dessa händelsnamn är: PlayerInteractEvent eller BlockBreakEvent eller PlayerJoinEvent . En lista över alla händelser finns på Spigot Javadocs


Registrera händelser

Att bara skapa en händelsehanterare räcker inte för att Bukkit kan börja skicka händelseanrop till din metod. Du måste också registrera det via PluginManager-gränssnittet.

Det vanligaste sättet att registrera händelser är att skapa en klass som implementerar lyssnargränssnittet och använda det genom att packa dina eventhanterare.

public class EventListener implements Listener { //Implements the Listener interface

    @EventHandler
    public void onPlayerJoin(PlayerJoinEvent event){
        //Run when a player joins
    }

}

Den här lyssnarklassen och alla dess händelser kan sedan registreras i din huvudsakliga plugin-klass så här:

@Override
public void onEnable(){
    Bukkit.getPluginManager().registerEvents(new EventListener(), this); //Register your listener and its event handlers
}

Händelseprioriteringar

Bukkit har ett system som heter Event Priorities för att hjälpa plugins att hantera händelser på rätt äldre. De sju prioriteringarna är (i äldre från första exekverade till sista):

  • Lägst
  • Låg
  • Normal (standard)
  • Hög
  • Högsta
  • Övervaka

Om du planerar att avbryta många händelser (t.ex. skyddsplugin) skulle det vara en bra idé att använda lägre prioritet (eller lägsta) för att undvika problem.

Du bör aldrig ändra resultatet av en händelse på MONITOR.

@EventHandler //same as @EventHandler(priority = EventPriority.NORMAL)
public void onLogin(PlayerLoginEvent event) {
    // normal login
}

@EventHandler(priority = EventPriority.HIGH)
public void onLogin(PlayerLoginEvent event) {
    // high login
}

Mer information:



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow