我正在为其他游戏编写API,因此我想创建事件以便更轻松地使用,例如,我查看了spigot(Minecraft)是如何做到的,并将其追溯到作为接口的EventExecutor。< / p>
public interface EventExecutor {
public void execute(Listener listener, Event event) throws EventException;
}
所以现在我迷路了,我已经看到了RegisteredListener类和HandlerList,但不太了解事件是如何自动获取PlayerMessages的?
我正在为已经玩了几年的游戏创建自定义API。
到目前为止,我还没有任何代码,目前正在研究并试图了解Spigot如何进行事件以及如何为我的API创建事件。
我希望能够创建
之类的活动public void onLogEntry(LogEntryEvent event) {
event.getEventName();
event.getStarSystem();
}
答案 0 :(得分:1)
Spigot处理事件的方式基于反射。
每当您将对象注册为侦听器时,都会对其进行反思性分析,以查找标注为@EventHandler
并需要一个Event
子类型的参数的非静态方法。
可以使用listenerObject.getClass().getDeclaredMethods()
然后对其进行过滤(例如,使用Java的Stream API)。
之后,将这些方法添加到某个集合(在Spigot的情况下是有序的)或一个键为事件类型且值是侦听器方法引用的multimap。
通过调用事件管理器的fire-event方法来调用事件,该方法导致类型有效的相关方法的调用。使用Method#invoke(Event)
完成此操作
但是,使用Java的MethodHandles API甚至Lambdametafactory都是一个不错的选择