觉得内置事件太少,没有符合您需求的事件? 在本教程,将叫你创建属于您自己的事件。
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事件!