ShadowCore Wiki
  • 👋欢迎!!
  • ⚙️指令与权限
  • 🚌事件
  • ☕开发者文档
    • 📄序言1: 参数类型的使用
    • 🖲️自定义事件
Powered by GitBook
On this page
  • 类EventExpansion
  • 执行事件
  • 类EventExpansionAddon
  • 使用监听器
  • 标识符重复
  1. 开发者文档

自定义事件

说明如何创建一个或多个事件

觉得内置事件太少,没有符合您需求的事件? 在本教程,将叫你创建属于您自己的事件。

package top.shadowpixel.shadowcore.api.function;

在该包中,ShadowCore提供了强大的扩展事件的功能,接下来就让我们来学习一下。

准备部分:创建新项目,将ShadowCore作为依赖项导入。

类EventExpansion

这个抽象类是可执行事件的本体,继承这个类需要实现以下的抽象方法:

获取事件的版本

public abstract String getVersion();

获取事件的作者

public abstract String getAuthor();

获取参数列表

public abstract NamedParameterList[] getParametersList();

表示执行该事件需要的参数,可以无参数,一个参数或多个参数。

获取标识符

public abstract String[] getIdentifies();

标识符为事件行里事件的名称,可以有多个。

并且,需要添加一个构造函数

public YourEvent(String name) {
    super(name);
}

执行事件

有三个方法将会调用方法执行事件,调用哪一个方法将取决于调用时传入的参数,参数必须匹配事件的参数列表。

无参数

public void execute(Player player, Set<Player> victim)

单参数

public void execute(Player player, Set<Player> victim, String parameter)

多参数

public void execute(Player player, Set<Player> victim, Map<String, String> parameters) {}

参数说明:

player - 发出事件的玩家,可为null

victim - 事件被执行的玩家,已包含发出事件的玩家

例如,有一个事件Title

public class EventTitle extends EventExpansion {

    private final String[] IDENTIFIES = {"Title"};
    private final NamedParameterList[] PARAMETERS = {
            NamedParameterList.emptyList(),
            NamedParameterList.of(of(String.class, "title")),
            NamedParameterList.of(of(String.class, "title"), of(String.class, "subtitle"), of(Integer.class, "fadein"), of(Integer.class, "stay"), of(Integer.class, "fadeout"))
    };

    public EventTitle() {
        super("Title", ShadowCore.getInstance());
    }
    

    @Override
    public void execute(Player player, Set<Player> victim) {
        // 无参数传入时调用
    }

    @Override
    public void execute(Player player, Set<Player> victim, String parameter) {
        // 传入一个参数时调用
    }
    
    @Override
    public void execute(Player player, Set<Player> victim, Map<String, String> parameters) {
        // 传入多个参数时调用
    }

    @Override
    public String getVersion() {
        // 省略
    }

    @Override
    public String getAuthor() {
        // 省略
    }

    @Override
    public @NotNull NamedParameterList[] getParametersList() {
        return PARAMETERS;
    }

    @Override
    public @NotNull String[] getIdentifies() {
        return IDENTIFIES;
    }
}

可以看出,参数列表的组合有[], [title]和[title, subtitle, fadein, stay, fadeout]

那么,在调用事件时,就会有以下集中情况

Events:
- "[title] "
- "[title] title=主标题"
- "[title] title=主标题 subtitle=副标题 fadein=10 stay=10 fadeout=10"

当执行"[title] "时,会调用该方法:

public void execute(Player player, Set<Player> victim)

当执行"[title] title=主标题"时,会调用该方法,并传入参数parameter=“主标题”:

public void execute(Player player, Set<Player> victim, String parameter)

当执行"[title] title=主标题 subtitle=副标题 fadein=10 stay=10 fadeout=10"时,会调用该方法,

传入一个map参数:

public void execute(Player player, Set<Player> victim, Map<String, String> parameters)

实例代码

import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import top.shadowpixel.shadowcore.api.function.EventExpansion;
import top.shadowpixel.shadowcore.api.util.parameter.NamedParameterList;

import java.util.Set;

public class Bubble extends EventExpansion {
    private final String[] IDENTIFIES = {"bubble"};
    public Bubble() {
        super("Bubble");
    }

    @Override
    public String getVersion() {
        return "1.0";
    }

    @Override
    public String getAuthor() {
        return "XiaoJin_awa_";
    }

    @Override
    public void execute(Player player, Set<Player> victim) {
        player.chat("I bubbled");
    }

    @Override
    public @NotNull NamedParameterList[] getParametersList() {
        return new NamedParameterList[0];
    }

    @Override
    public @NotNull String[] getIdentifies() {
        return IDENTIFIES;
    }
}

类EventExpansionAddon

事件扩展的主类。创建一个主类,并继承该类,实现下列抽象方法:

// 获取扩展名字
public String getName()

// 获取扩展作者
public String getAuthor()

// 获取扩展版本
public String getVersion()

然后, 创建一个集合, 将所有事件的类丢进这个集合, 实现方法getEvents() 然后返回。

private final List<Class<EventExpansion>> events = 
    Arrays.asList(Event1.class, Event2.class)

public Collection<Class<? extends EventExpansion>> getEvents() {
    return events;
}

之后,将项目打包,将得到的jar文件丢到plugins\ShadowCore\Expansions\Functions(可更改)中,使用重载指令,事件就被加载了。

使用监听器

主类中这么写。

@Override
public void doAfterRegistering() {
    super.doAfterRegistering();
        
    Listener listener1 = ...;
    getListeners().register("listener1", listener1);
}

标识符重复

可能会出现这么一个问题:事件扩展A和扩展B都有一个标识符为[bubble]的事件,为了分开调用,可以写成[A:Bubble]和[B:Bubble]来分别调用A和B的Bubble事件!

Previous序言1: 参数类型的使用

Last updated 1 year ago

☕
🖲️