-
-
Notifications
You must be signed in to change notification settings - Fork 19
/
CustomEvent.java
114 lines (88 loc) · 3.38 KB
/
CustomEvent.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package org.skriptlang.reflect.syntax.event.elements;
import ch.njol.skript.Skript;
import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.Literal;
import ch.njol.skript.lang.SkriptEvent;
import ch.njol.skript.lang.SkriptParser;
import ch.njol.skript.lang.Trigger;
import ch.njol.skript.lang.TriggerItem;
import com.btk5h.skriptmirror.skript.custom.SyntaxParseEvent;
import com.btk5h.skriptmirror.util.SkriptReflection;
import com.btk5h.skriptmirror.util.SkriptUtil;
import org.bukkit.event.Event;
import org.eclipse.jdt.annotation.Nullable;
import org.skriptlang.reflect.syntax.event.BukkitCustomEvent;
import org.skriptlang.reflect.syntax.event.EventSyntaxInfo;
import org.skriptlang.reflect.syntax.event.EventTriggerEvent;
import java.util.Arrays;
/**
* This is the Skript event for all custom events.
* {@link #lastWhich} returns the first EventSyntaxInfo of the last custom event, which is used internally for determining
* which event-values can be used in parse-time.
*/
public class CustomEvent extends SkriptEvent {
public static EventSyntaxInfo lastWhich;
private EventSyntaxInfo which;
private Expression<?>[] exprs;
private SkriptParser.ParseResult parseResult;
private Object variablesMap;
@Override
public boolean init(Literal<?>[] args, int matchedPattern, SkriptParser.ParseResult parseResult) {
which = StructCustomEvent.lookup(SkriptUtil.getCurrentScript(), matchedPattern);
if (which == null) {
return false;
}
this.exprs = Arrays.stream(args)
.map(SkriptUtil::defendExpression)
.toArray(Expression[]::new);
this.parseResult = parseResult;
if (!SkriptUtil.canInitSafely(this.exprs)) {
return false;
}
Boolean bool = StructCustomEvent.parseSectionLoaded.get(which);
if (bool != null && !bool) {
Skript.error("You can't use custom events with parse sections before they're loaded.");
return false;
}
Trigger parseHandler = StructCustomEvent.parserHandlers.get(which);
if (parseHandler == null) {
setLastWhich(which);
return true;
}
SyntaxParseEvent event =
new SyntaxParseEvent(this.exprs, matchedPattern, parseResult, getParser().getCurrentEvents());
setLastWhich(which);
TriggerItem.walk(parseHandler, event);
variablesMap = SkriptReflection.removeLocals(event);
setLastWhich(which);
return event.isMarkedContinue();
}
@Override
public boolean load() {
CustomEvent.setLastWhich(which);
boolean parsed = super.load();
CustomEvent.setLastWhich(null);
return parsed;
}
@Override
public boolean check(Event e) {
BukkitCustomEvent bukkitCustomEvent = (BukkitCustomEvent) e;
if (!bukkitCustomEvent.getName().equalsIgnoreCase(StructCustomEvent.nameValues.get(which)))
return false;
EventTriggerEvent eventTriggerEvent = new EventTriggerEvent(e, exprs, which.getMatchedPattern(), parseResult, which.getPattern());
SkriptReflection.putLocals(SkriptReflection.copyLocals(variablesMap), eventTriggerEvent);
Trigger trigger = StructCustomEvent.eventHandlers.get(which);
if (trigger != null) {
trigger.execute(eventTriggerEvent);
return eventTriggerEvent.isMarkedContinue();
}
return true;
}
public static void setLastWhich(EventSyntaxInfo which) {
lastWhich = which;
}
@Override
public String toString(@Nullable Event e, boolean debug) {
return which.getPattern();
}
}