18
18
*/
19
19
package ch .njol .skript ;
20
20
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
+
26
32
import org .bukkit .Bukkit ;
27
33
import org .bukkit .event .Cancellable ;
28
34
import org .bukkit .event .Event ;
36
42
import org .bukkit .plugin .RegisteredListener ;
37
43
import org .eclipse .jdt .annotation .Nullable ;
38
44
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 ;
49
52
50
53
public final class SkriptEventHandler {
51
54
@@ -110,12 +113,14 @@ private static List<Trigger> getTriggers(Class<? extends Event> event) {
110
113
*/
111
114
private static void check (Event event , EventPriority priority ) {
112
115
List <Trigger > triggers = getTriggers (event .getClass ());
116
+ if (triggers .isEmpty ())
117
+ return ;
113
118
114
119
if (Skript .logVeryHigh ()) {
115
120
boolean hasTrigger = false ;
116
121
for (Trigger trigger : triggers ) {
117
122
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 )) )) {
119
124
hasTrigger = true ;
120
125
break ;
121
126
}
@@ -137,16 +142,31 @@ private static void check(Event event, EventPriority priority) {
137
142
138
143
for (Trigger trigger : triggers ) {
139
144
SkriptEvent triggerEvent = trigger .getEvent ();
140
- if (triggerEvent .getEventPriority () != priority || ! triggerEvent . check ( event ) )
145
+ if (triggerEvent .getEventPriority () != priority )
141
146
continue ;
142
147
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
+ }
150
170
}
151
171
152
172
logEventEnd ();
0 commit comments