11package ch .njol .skript .expressions ;
22
3+ import ch .njol .skript .registrations .Classes ;
4+ import ch .njol .skript .util .Utils ;
35import org .bukkit .GameRule ;
46import org .bukkit .World ;
57import org .bukkit .event .Event ;
1012import ch .njol .skript .doc .Description ;
1113import ch .njol .skript .doc .Examples ;
1214import ch .njol .skript .doc .Name ;
13- import ch .njol .skript .doc .RequiredPlugins ;
1415import ch .njol .skript .doc .Since ;
1516import ch .njol .skript .lang .Expression ;
1617import ch .njol .skript .lang .ExpressionType ;
1718import ch .njol .skript .lang .SkriptParser .ParseResult ;
1819import ch .njol .skript .lang .util .SimpleExpression ;
1920import ch .njol .skript .util .GameruleValue ;
2021import 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+" )
2827public 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