Skip to content

Commit 3f08853

Browse files
AyhamAl-AliTheLimeGlassModerocky
authored
🍒 [2.7] Fixes an exception from being thrown on async events (#5980)
Fixes an exception from being thrown on async events (#5699) Co-authored-by: LimeGlass <[email protected]> Co-authored-by: Moderocky <[email protected]>
1 parent 7148bf2 commit 3f08853

File tree

2 files changed

+51
-24
lines changed

2 files changed

+51
-24
lines changed

src/main/java/ch/njol/skript/SkriptEventHandler.java

+44-24
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,17 @@
1818
*/
1919
package ch.njol.skript;
2020

21-
import ch.njol.skript.lang.SkriptEvent;
22-
import ch.njol.skript.lang.Trigger;
23-
import ch.njol.skript.timings.SkriptTimings;
24-
import com.google.common.collect.ArrayListMultimap;
25-
import com.google.common.collect.Multimap;
21+
import java.lang.ref.WeakReference;
22+
import java.lang.reflect.Method;
23+
import java.util.HashMap;
24+
import java.util.HashSet;
25+
import java.util.Iterator;
26+
import java.util.List;
27+
import java.util.Map;
28+
import java.util.Map.Entry;
29+
import java.util.Set;
30+
import java.util.stream.Collectors;
31+
2632
import org.bukkit.Bukkit;
2733
import org.bukkit.event.Cancellable;
2834
import org.bukkit.event.Event;
@@ -36,16 +42,13 @@
3642
import org.bukkit.plugin.RegisteredListener;
3743
import org.eclipse.jdt.annotation.Nullable;
3844

39-
import java.lang.ref.WeakReference;
40-
import java.lang.reflect.Method;
41-
import java.util.HashMap;
42-
import java.util.HashSet;
43-
import java.util.Iterator;
44-
import java.util.List;
45-
import java.util.Map;
46-
import java.util.Map.Entry;
47-
import java.util.Set;
48-
import java.util.stream.Collectors;
45+
import com.google.common.collect.ArrayListMultimap;
46+
import com.google.common.collect.Multimap;
47+
48+
import ch.njol.skript.lang.SkriptEvent;
49+
import ch.njol.skript.lang.Trigger;
50+
import ch.njol.skript.timings.SkriptTimings;
51+
import ch.njol.skript.util.Task;
4952

5053
public final class SkriptEventHandler {
5154

@@ -110,12 +113,14 @@ private static List<Trigger> getTriggers(Class<? extends Event> event) {
110113
*/
111114
private static void check(Event event, EventPriority priority) {
112115
List<Trigger> triggers = getTriggers(event.getClass());
116+
if (triggers.isEmpty())
117+
return;
113118

114119
if (Skript.logVeryHigh()) {
115120
boolean hasTrigger = false;
116121
for (Trigger trigger : triggers) {
117122
SkriptEvent triggerEvent = trigger.getEvent();
118-
if (triggerEvent.getEventPriority() == priority && triggerEvent.check(event)) {
123+
if (triggerEvent.getEventPriority() == priority && Boolean.TRUE.equals(Task.callSync(() -> triggerEvent.check(event)))) {
119124
hasTrigger = true;
120125
break;
121126
}
@@ -137,16 +142,31 @@ private static void check(Event event, EventPriority priority) {
137142

138143
for (Trigger trigger : triggers) {
139144
SkriptEvent triggerEvent = trigger.getEvent();
140-
if (triggerEvent.getEventPriority() != priority || !triggerEvent.check(event))
145+
if (triggerEvent.getEventPriority() != priority)
141146
continue;
142147

143-
logTriggerStart(trigger);
144-
Object timing = SkriptTimings.start(trigger.getDebugLabel());
145-
146-
trigger.execute(event);
147-
148-
SkriptTimings.stop(timing);
149-
logTriggerEnd(trigger);
148+
// these methods need to be run on whatever thread the trigger is
149+
Runnable execute = () -> {
150+
logTriggerStart(trigger);
151+
Object timing = SkriptTimings.start(trigger.getDebugLabel());
152+
trigger.execute(event);
153+
SkriptTimings.stop(timing);
154+
logTriggerEnd(trigger);
155+
};
156+
157+
if (trigger.getEvent().canExecuteAsynchronously()) {
158+
// check should be performed on the main thread
159+
if (Boolean.FALSE.equals(Task.callSync(() -> triggerEvent.check(event))))
160+
continue;
161+
execute.run();
162+
} else { // Ensure main thread
163+
Task.callSync(() -> {
164+
if (!triggerEvent.check(event))
165+
return null;
166+
execute.run();
167+
return null; // we don't care about a return value
168+
});
169+
}
150170
}
151171

152172
logEventEnd();

src/main/java/ch/njol/skript/lang/SkriptEvent.java

+7
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,13 @@ public boolean isEventPrioritySupported() {
216216
return true;
217217
}
218218

219+
/**
220+
* Override this method to allow Skript to not force synchronization.
221+
*/
222+
public boolean canExecuteAsynchronously() {
223+
return false;
224+
}
225+
219226
/**
220227
* Fixes patterns in event by modifying every {@link ch.njol.skript.patterns.TypePatternElement}
221228
* to be nullable.

0 commit comments

Comments
 (0)