Поиск…


Вступление

Когда что-то происходит внутри Bukkit, событие называется так, что каждый плагин может решить, что делать, когда что-то происходит.

Событие вызывается, когда игрок пытается сыграть блок, когда сущность despawn, когда кто-то входит в систему ... Плагины могут прослушивать определенные события и обрабатывать их разными способами, например, отправлять сообщение администратору, когда игрок входит в систему через PlayerLoginEvent.

Синтаксис

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

замечания

При регистрации события обратите внимание, если вы не регистрируете его дважды! Или ваш плагин будет действовать дважды для зарегистрированного события.

Посмотрите, как обрабатывать определенные события:

Регистрировать события внутри класса Listener

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);
    }
}

Регистрация событий в вашем основном классе

public class Main extends JavaPlugin {

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

Прослушивание событий

Bukkit использует систему, основанную на событиях, которая позволяет разработчикам плагинов взаимодействовать и изменять сервер и конкретные действия, которые происходят в мире.


Создание обработчика событий

Обработчики событий - это методы, вызываемые при возникновении их события. Они обычно общедоступны и недействительны, а также называются on{EventNameStem} по соглашению. Однако все обработчики должны иметь аннотацию @EventHandler , а также содержать свое событие как параметр ONLY. Ниже приведен пример обработчика событий для PlayerJoinEvent

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

Примечание. Формат имен для событий Bukkit - это событие {Source}{Action}({Target})Event . Некоторые примеры этих имен событий: PlayerInteractEvent или BlockBreakEvent или PlayerJoinEvent . Список всех событий можно найти на Spitot Javadocs


Регистрация событий

Простое создание обработчика событий недостаточно, чтобы Bukkit мог начать отправлять вызовы событий вашему методу. Вы также должны зарегистрировать его через интерфейс PluginManager.

Самый распространенный способ регистрации событий - создать класс, который реализует интерфейс Listener и использовать его для переноса обработчиков событий.

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

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

}

Этот класс слушателя и все его события затем могут быть зарегистрированы в вашем основном классе плагина следующим образом:

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

Создание пользовательских событий

Иногда вам нужно создать свое собственное Событие, которое другие плагины могут прослушать (Vault, среди других плагинов, делает это) и даже отменить. API событий Bukkit позволяет это сделать возможным. Все, что вам нужно сделать, это создать новый класс, расширить его Event , добавить обработчики и атрибуты, необходимые вашему событию (например, Player или message).

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;
    }
}

Вызов пользовательского события

Вы контролируете создание и вызывать свои события, где вы называете это полностью зависит от вас. Вот пример

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

Помните: вы контролируете свои события. Если вы не назовете это и не подействуйте на него, этого не произойдет!

Прослушивание пользовательского события

Прослушивание пользовательского события совпадает с прослушиванием обычного события.

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
    }
}

Внедрение CustomEvent Cancellable

Если вы хотите, чтобы ваше событие было boolean cancelled , просто добавьте implements Cancellable , boolean cancelled и getter и 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;
    }
}

После этого вы можете проверить, отменял ли плагин пользовательское событие.

// 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());
}

Основная обработка событий

Bukkit использует систему, основанную на событиях, которая позволяет разработчикам плагинов взаимодействовать и изменять сервер и конкретные действия, которые происходят в мире.


Создание обработчика событий

Обработчики событий - это методы, вызываемые при возникновении их события. Они обычно общедоступны и недействительны, а также называются on{EventNameStem} по соглашению. Однако все обработчики должны иметь аннотацию @EventHandler , а также содержать свое событие как параметр ONLY. Ниже приведен пример обработчика событий для PlayerJoinEvent

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

Примечание. Формат имен для событий Bukkit - это событие {Source}{Action}({Target})Event . Некоторые примеры этих имен событий: PlayerInteractEvent или BlockBreakEvent или PlayerJoinEvent . Список всех событий можно найти на Spitot Javadocs


Регистрация событий

Простое создание обработчика событий недостаточно, чтобы Bukkit мог начать отправлять вызовы событий вашему методу. Вы также должны зарегистрировать его через интерфейс PluginManager.

Самый распространенный способ регистрации событий - создать класс, который реализует интерфейс Listener и использовать его для переноса обработчиков событий.

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

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

}

Этот класс слушателя и все его события затем могут быть зарегистрированы в вашем основном классе плагина следующим образом:

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

Приоритеты событий

У Bukkit есть система под названием « Приоритеты событий», чтобы помочь плагинам обрабатывать события в правильном возрасте. Семь приоритетов (в возрасте от первого до последнего):

  • низший
  • Низкий
  • Обычный (по умолчанию)
  • Высоко
  • Наибольший
  • монитор

Если вы планируете отменить много событий (например, плагин защиты), было бы неплохо использовать более низкий приоритет (или самый низкий), чтобы избежать проблем.

Вы никогда не должны изменять результат события в 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
}

Больше информации:



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow