-
-
Notifications
You must be signed in to change notification settings - Fork 23
/
Copy pathCondAcceptsChange.java
118 lines (107 loc) · 4.74 KB
/
CondAcceptsChange.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
115
116
117
118
package com.btk5h.skriptmirror.skript;
import ch.njol.skript.Skript;
import ch.njol.skript.classes.Changer.ChangeMode;
import ch.njol.skript.classes.ClassInfo;
import ch.njol.skript.lang.Condition;
import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.SkriptParser;
import ch.njol.skript.util.Patterns;
import ch.njol.util.Kleenean;
import com.btk5h.skriptmirror.util.ClassInfoReference;
import com.btk5h.skriptmirror.util.SkriptUtil;
import org.bukkit.event.Event;
import org.eclipse.jdt.annotation.Nullable;
public class CondAcceptsChange extends Condition {
private static final Patterns<ChangeMode> PATTERNS = new Patterns<>(new Object[][] {
{"%classinfo% can be added to %expressions%", ChangeMode.ADD},
{"%classinfo% (can't|cannot) be added to %expressions%", ChangeMode.ADD},
{"%expressions% can be set to %classinfo%", ChangeMode.SET},
{"%expressions% (can't|cannot) be set to %classinfo%", ChangeMode.SET},
{"%classinfo% can be removed from %expressions%", ChangeMode.REMOVE},
{"%classinfo% (can't|cannot) be removed from %expressions%", ChangeMode.REMOVE},
{"all %classinfo% can be removed from %expressions%", ChangeMode.REMOVE_ALL},
{"all %classinfo% (can't|cannot) be removed from %expressions%", ChangeMode.REMOVE_ALL},
{"%expressions% can be deleted", ChangeMode.DELETE},
{"%expressions% (can't|cannot) be deleted", ChangeMode.DELETE},
{"%expressions% can be reset", ChangeMode.RESET},
{"%expressions% (can't|cannot) be reset", ChangeMode.RESET}
});
static {
Skript.registerCondition(CondAcceptsChange.class, PATTERNS.getPatterns());
}
private ChangeMode desiredChangeMode;
private boolean desiredTypeIsPlural;
private Expression<ClassInfoReference> desiredType;
private Expression<Expression<?>> expressions;
@SuppressWarnings("unchecked")
@Override
public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean isDelayed, SkriptParser.ParseResult parseResult) {
setNegated((matchedPattern % 2) != 0);
desiredChangeMode = PATTERNS.getInfo(matchedPattern);
Expression<?> desiredType = null;
switch (desiredChangeMode) {
case ADD:
case REMOVE:
case REMOVE_ALL:
desiredType = exprs[0];
expressions = (Expression<Expression<?>>) exprs[1];
break;
case SET:
expressions = (Expression<Expression<?>>) exprs[0];
desiredType = exprs[1];
break;
case RESET:
case DELETE:
expressions = (Expression<Expression<?>>) exprs[0];
}
if (desiredType != null) {
this.desiredType = SkriptUtil.wrapClassInfoExpression((Expression<ClassInfo<?>>) desiredType);
}
return SkriptUtil.canInitSafely(desiredType);
}
@Override
public boolean check(Event event) {
if (desiredChangeMode == ChangeMode.DELETE || desiredChangeMode == ChangeMode.RESET)
//noinspection ConstantValue
return expressions.check(event, expressions -> expressions.acceptChange(desiredChangeMode) != null, isNegated());
ClassInfoReference desiredType = this.desiredType.getSingle(event);
if (desiredType == null)
return false;
return expressions.check(event, expression -> acceptsChange(expression, desiredChangeMode, desiredType), isNegated());
}
@Override
public String toString(@Nullable Event event, boolean debug) {
String expressionsString = expressions.toString(event, debug);
String desiredTypesString = desiredType == null ? null : desiredType.toString(event, debug);
switch (desiredChangeMode) {
case ADD:
return desiredTypesString + " can be added to " + expressionsString;
case SET:
return expressionsString + " can be set to " + desiredTypesString;
case RESET:
return expressionsString + " can be reset";
case DELETE:
return expressionsString + " can be deleted";
case REMOVE:
return desiredTypesString + " can be removed from " + expressionsString;
case REMOVE_ALL:
return "all " + desiredTypesString + " can be removed from " + expressionsString;
default:
throw new IllegalStateException();
}
}
private boolean acceptsChange(Expression<?> expression, ChangeMode desiredChangeMode, ClassInfoReference desiredType) {
Class<?>[] acceptableTypes = expression.acceptChange(desiredChangeMode);
//noinspection ConstantValue
if (acceptableTypes != null) {
for (Class<?> acceptableType : acceptableTypes) {
if (acceptableType.isArray()
&& acceptableType.getComponentType().isAssignableFrom(desiredType.getClassInfo().getC())) {
return true;
} else if (desiredType.isPlural() && acceptableType.isAssignableFrom(desiredType.getClassInfo().getC()))
return true;
}
}
return false;
}
}