Skip to content

Commit d8c4780

Browse files
committed
Fix EvtByReflection firing twice for 3rd party plugins that don't use Bukkit's event API correctly. This solution is not perfect, and it should be fixed in the plugins. See https://gist.github.com/TPGamesNL/ee79fc4c348721925e2b4cfafb1a9ea0
1 parent 272078c commit d8c4780

File tree

1 file changed

+28
-10
lines changed

1 file changed

+28
-10
lines changed

src/main/java/com/btk5h/skriptmirror/skript/reflect/EvtByReflection.java

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,24 @@ public EventPriority getPriority() {
3838
public Set<Class<? extends Event>> getEvents() {
3939
return events;
4040
}
41+
4142
}
4243

43-
private static final EventExecutor executor = (listener, event) -> Bukkit.getPluginManager()
44-
.callEvent(new BukkitEvent(event, ((PriorityListener) listener).getPriority()));
44+
private static class TypeStrictEventExecutor implements EventExecutor {
45+
46+
private final Class<? extends Event> eventClass;
47+
48+
public TypeStrictEventExecutor(Class<? extends Event> eventClass) {
49+
this.eventClass = eventClass;
50+
}
51+
52+
@Override
53+
public void execute(Listener listener, Event event) throws EventException {
54+
if (eventClass.isInstance(event))
55+
Bukkit.getPluginManager().callEvent(new BukkitEvent(event, ((PriorityListener) listener).getPriority()));
56+
}
57+
58+
}
4559

4660
private static final PriorityListener[] listeners;
4761

@@ -92,14 +106,16 @@ public void setCancelled(boolean cancel) {
92106
}
93107
}
94108

95-
private static void registerEvent(Class<? extends Event> event, EventPriority priority) {
109+
private static void registerEvent(Class<? extends Event> eventClass, EventPriority priority) {
96110
PriorityListener listener = listeners[priority.ordinal()];
97-
Set<Class<? extends Event>> events = listener.getEvents();
111+
Set<Class<? extends Event>> eventClasses = listener.getEvents();
98112

99-
if (!events.contains(event)) {
100-
events.add(event);
113+
if (!eventClasses.contains(eventClass)) {
114+
eventClasses.add(eventClass);
115+
116+
EventExecutor executor = new TypeStrictEventExecutor(eventClass);
101117
Bukkit.getPluginManager()
102-
.registerEvent(event, listener, priority, executor, SkriptMirror.getInstance(), false);
118+
.registerEvent(eventClass, listener, priority, executor, SkriptMirror.getInstance(), false);
103119
}
104120

105121
}
@@ -138,13 +154,14 @@ public boolean init(Literal<?>[] args, int matchedPattern, SkriptParser.ParseRes
138154

139155
@Override
140156
public boolean check(Event e) {
141-
Event extractedEvent = ((BukkitEvent) e).getEvent();
157+
BukkitEvent bukkitEvent = (BukkitEvent) e;
158+
Event extractedEvent = bukkitEvent.getEvent();
142159
Class<? extends Event> eventClass = extractedEvent.getClass();
143160

144-
if (extractedEvent instanceof Cancellable && ((Cancellable) extractedEvent).isCancelled() && ignoreCancelled)
161+
if (ignoreCancelled && extractedEvent instanceof Cancellable && ((Cancellable) extractedEvent).isCancelled())
145162
return false;
146163

147-
if (priority == ((BukkitEvent) e).getPriority()) {
164+
if (priority == bukkitEvent.getPriority()) {
148165
for (Class<? extends Event> cls : classes) {
149166
if (cls.isAssignableFrom(eventClass)) {
150167
return true;
@@ -158,4 +175,5 @@ public boolean check(Event e) {
158175
public String toString(Event e, boolean debug) {
159176
return Arrays.toString(classes) + " priority " + priority;
160177
}
178+
161179
}

0 commit comments

Comments
 (0)