Skip to content

Commit 4a97f91

Browse files
authored
Update ExprGameRule (#7943)
1 parent 29a47dd commit 4a97f91

File tree

1 file changed

+62
-46
lines changed

1 file changed

+62
-46
lines changed
Lines changed: 62 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package ch.njol.skript.expressions;
22

3+
import ch.njol.skript.registrations.Classes;
4+
import ch.njol.skript.util.Utils;
35
import org.bukkit.GameRule;
46
import org.bukkit.World;
57
import org.bukkit.event.Event;
@@ -10,82 +12,95 @@
1012
import ch.njol.skript.doc.Description;
1113
import ch.njol.skript.doc.Examples;
1214
import ch.njol.skript.doc.Name;
13-
import ch.njol.skript.doc.RequiredPlugins;
1415
import ch.njol.skript.doc.Since;
1516
import ch.njol.skript.lang.Expression;
1617
import ch.njol.skript.lang.ExpressionType;
1718
import ch.njol.skript.lang.SkriptParser.ParseResult;
1819
import ch.njol.skript.lang.util.SimpleExpression;
1920
import ch.njol.skript.util.GameruleValue;
2021
import ch.njol.util.Kleenean;
21-
import ch.njol.util.coll.CollectionUtils;
2222

2323
@Name("Gamerule Value")
2424
@Description("The gamerule value of a world.")
2525
@Examples({"set the gamerule commandBlockOutput of world \"world\" to false"})
2626
@Since("2.5")
27-
@RequiredPlugins("Minecraft 1.13+")
2827
public class ExprGameRule extends SimpleExpression<GameruleValue> {
2928

3029
static {
31-
if (Skript.classExists("org.bukkit.GameRule")) {
32-
Skript.registerExpression(ExprGameRule.class, GameruleValue.class, ExpressionType.COMBINED,
33-
"[the] gamerule %gamerule% of %worlds%");
34-
}
30+
Skript.registerExpression(ExprGameRule.class, GameruleValue.class, ExpressionType.COMBINED, "[the] gamerule %gamerule% of %worlds%");
3531
}
36-
37-
@SuppressWarnings("null")
38-
private Expression<GameRule> gamerule;
39-
@SuppressWarnings("null")
40-
private Expression<World> world;
32+
33+
private Expression<GameRule<?>> gamerule;
34+
private Expression<World> worlds;
4135

4236
@Override
4337
public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) {
44-
gamerule = (Expression<GameRule>) exprs[0];
45-
world = (Expression<World>) exprs[1];
38+
// noinspection unchecked
39+
gamerule = (Expression<GameRule<?>>) exprs[0];
40+
// noinspection unchecked
41+
worlds = (Expression<World>) exprs[1];
4642
return true;
4743
}
48-
44+
4945
@Override
50-
@Nullable
51-
public Class<?>[] acceptChange(final ChangeMode mode) {
52-
if (mode == ChangeMode.SET)
53-
return CollectionUtils.array(Boolean.class, Number.class);
54-
return null;
46+
protected GameruleValue<?> @Nullable [] get(Event event) {
47+
GameRule<?> gamerule = this.gamerule.getSingle(event);
48+
if (gamerule == null) {
49+
return null;
50+
}
51+
52+
World[] worlds = this.worlds.getArray(event);
53+
GameruleValue<?>[] gameruleValues = new GameruleValue[worlds.length];
54+
55+
for (int i = 0; i < worlds.length; i++) {
56+
Object gameruleValue = worlds[i].getGameRuleValue(gamerule);
57+
assert gameruleValue != null;
58+
gameruleValues[i] = new GameruleValue<>(gameruleValue);
59+
}
60+
61+
return gameruleValues;
5562
}
56-
63+
5764
@Override
58-
public void change(final Event e, final @Nullable Object[] delta, final ChangeMode mode) {
59-
assert delta != null;
65+
public Class<?> @Nullable [] acceptChange(ChangeMode mode) {
6066
if (mode == ChangeMode.SET) {
61-
GameRule bukkitGamerule = gamerule.getSingle(e);
62-
if (bukkitGamerule == null)
63-
return;
64-
for (World gameruleWorld : world.getArray(e))
65-
gameruleWorld.setGameRule(bukkitGamerule, delta[0]);
67+
return new Class[]{Boolean.class, Integer.class};
6668
}
69+
return null;
6770
}
68-
69-
@Nullable
71+
7072
@Override
71-
protected GameruleValue[] get(Event e) {
72-
GameRule<?> bukkitGamerule = gamerule.getSingle(e);
73-
if (bukkitGamerule == null)
74-
return null;
75-
World[] gameruleWorlds = world.getArray(e);
76-
GameruleValue[] gameruleValues = new GameruleValue[gameruleWorlds.length];
77-
int index = 0;
78-
for (World gameruleWorld : gameruleWorlds) {
79-
Object gameruleValue = gameruleWorld.getGameRuleValue(bukkitGamerule);
80-
assert gameruleValue != null;
81-
gameruleValues[index++] = new GameruleValue<>(gameruleValue);
73+
public void change(Event event, Object @Nullable [] delta, ChangeMode mode) {
74+
if (mode != ChangeMode.SET) {
75+
return;
76+
}
77+
78+
GameRule gamerule = this.gamerule.getSingle(event);
79+
if (gamerule == null) {
80+
return;
81+
}
82+
83+
assert delta != null;
84+
Object value = delta[0];
85+
if (!gamerule.getType().isAssignableFrom(value.getClass())) {
86+
String currentClassName = Classes.toString(Classes.getSuperClassInfo(value.getClass()));
87+
currentClassName = Utils.a(currentClassName);
88+
89+
String targetClassName = Classes.toString(Classes.getSuperClassInfo(gamerule.getType()));
90+
targetClassName = Utils.a(targetClassName);
91+
92+
error("The " + gamerule.getName() + " gamerule can only be set to " + targetClassName + ", not " + currentClassName + ".");
93+
return;
94+
}
95+
96+
for (World gameruleWorld : worlds.getArray(event)) {
97+
gameruleWorld.setGameRule(gamerule, value);
8298
}
83-
return gameruleValues;
8499
}
85-
100+
86101
@Override
87102
public boolean isSingle() {
88-
return false;
103+
return worlds.isSingle();
89104
}
90105

91106
@Override
@@ -94,7 +109,8 @@ public Class<? extends GameruleValue> getReturnType() {
94109
}
95110

96111
@Override
97-
public String toString(@Nullable Event e, boolean debug) {
98-
return "the gamerule value of " + gamerule.toString(e, debug) + " for world " + world.toString(e, debug);
112+
public String toString(@Nullable Event event, boolean debug) {
113+
return "the gamerule " + gamerule.toString(event, debug) + " of " + worlds.toString(event, debug);
99114
}
115+
100116
}

0 commit comments

Comments
 (0)