1515import org .mvplugins .multiverse .core .config .node .ListConfigNode ;
1616import org .mvplugins .multiverse .core .config .node .Node ;
1717import org .mvplugins .multiverse .core .config .node .NodeGroup ;
18+ import org .mvplugins .multiverse .core .config .node .serializer .NodeSerializer ;
1819import org .mvplugins .multiverse .core .world .LoadedMultiverseWorld ;
1920import org .mvplugins .multiverse .core .world .MultiverseWorld ;
2021
@@ -71,25 +72,28 @@ private void applyTickPerSpawns(World bukkitWorld) {
7172 Logging .finer ("World %s %s skipping setTicksPerSpawns due to core config" , world .getName (), spawnCategory );
7273 return ;
7374 }
74- if (!isSpawn ()) {
75- if (getExceptions ().isEmpty ()) {
76- Logging .finer ("World %s %s setTicksPerSpawns: 0" , world .getName (), spawnCategory );
77- bukkitWorld .setTicksPerSpawns (spawnCategory , 0 );
78- } else {
79- Logging .finer ("World %s %s setTicksPerSpawns: -1" , world .getName (), spawnCategory );
80- bukkitWorld .setTicksPerSpawns (spawnCategory , -1 );
81- }
82- } else {
83- Logging .finer ("World %s %s setTicksPerSpawns: %d" , world .getName (), spawnCategory , getTickRate ());
84- bukkitWorld .setTicksPerSpawns (spawnCategory , getTickRate ());
75+ if (!isSpawn () && getExceptions ().isEmpty ()) {
76+ Logging .finer ("World %s %s setTicksPerSpawns: 0" , world .getName (), spawnCategory );
77+ bukkitWorld .setTicksPerSpawns (spawnCategory , 0 );
78+ return ;
79+ }
80+ if (getTickRate () == -2 ) {
81+ Logging .finer ("World %s %s skipping setTicksPerSpawns as tick-rate is UNSET" , world .getName (), spawnCategory );
82+ return ;
8583 }
84+ Logging .finer ("World %s %s setTicksPerSpawns: %d" , world .getName (), spawnCategory , getTickRate ());
85+ bukkitWorld .setTicksPerSpawns (spawnCategory , getTickRate ());
8686 }
8787
8888 private void applySpawnLimit (World bukkitWorld ) {
8989 if (!config .getApplyEntitySpawnLimit ()) {
9090 Logging .finer ("Skipping World %s %s setSpawnLimit due to core config" , world .getName (), spawnCategory );
9191 return ;
9292 }
93+ if (getSpawnLimit () == -2 ) {
94+ Logging .finer ("World %s %s skipping setSpawnLimit as spawn-limit is UNSET" , world .getName (), spawnCategory );
95+ return ;
96+ }
9397 Logging .finer ("World %s %s setSpawnLimit: %d" , world .getName (), spawnCategory , getSpawnLimit ());
9498 bukkitWorld .setSpawnLimit (spawnCategory , getSpawnLimit ());
9599 }
@@ -166,25 +170,33 @@ private <N extends Node> N node(N node) {
166170 .build ());
167171
168172 final ConfigNode <Integer > tickRate = node (ConfigNode .builder ("tick-rate" , Integer .class )
169- .defaultValue (-1 )
170- .suggester (input -> List .of ("-1" , "10" , "100" , "400" , "1000" ))
173+ .defaultValue (-2 )
174+ .suggester (input -> List .of ("@unset" , "@bukkit" , "10" , "100" , "400" , "1000" ))
175+ .serializer (SpawnValueSerializer .INSTANCE )
171176 .onLoadAndChange ((oldValue , newValue ) -> applyConfigToWorld ())
172177 .onChange ((sender , oldValue , newValue ) -> {
173178 if (!config .getApplyEntitySpawnRate ()) {
174179 sender .sendMessage (ChatColor .RED + "Warning: Changing tick rates has no effect because " +
175180 "'apply-entity-spawn-rate' is disabled in the core config." );
181+ } else if (newValue == -2 ) {
182+ sender .sendMessage (ChatColor .YELLOW + "Note: Setting tick-rate to '@unset' may not reset to " +
183+ "the server default until the world is reloaded or server is restarted." );
176184 }
177185 })
178186 .build ());
179187
180188 final ConfigNode <Integer > spawnLimit = node (ConfigNode .builder ("spawn-limit" , Integer .class )
181- .defaultValue (-1 )
182- .suggester (input -> List .of ("-1" , "10" , "100" , "400" , "1000" ))
189+ .defaultValue (-2 )
190+ .suggester (input -> List .of ("@unset" , "@bukkit" , "10" , "100" , "400" , "1000" ))
191+ .serializer (SpawnValueSerializer .INSTANCE )
183192 .onLoadAndChange ((oldValue , newValue ) -> applyConfigToWorld ())
184193 .onChange ((sender , oldValue , newValue ) -> {
185194 if (!config .getApplyEntitySpawnLimit ()) {
186195 sender .sendMessage (ChatColor .RED + "Warning: Changing spawn limits has no effect because " +
187196 "'apply-entity-spawn-limit' is disabled in the core config." );
197+ } else if (newValue == -2 ) {
198+ sender .sendMessage (ChatColor .YELLOW + "Note: Setting spawn-limit to '@unset' may not reset to " +
199+ "the server default until the world is reloaded or server is restarted." );
188200 }
189201 })
190202 .build ());
@@ -197,4 +209,29 @@ private <N extends Node> N node(N node) {
197209 .onLoadAndChange ((oldValue , newValue ) -> applyConfigToWorld ())
198210 .build ());
199211 }
212+
213+ private static class SpawnValueSerializer implements NodeSerializer <Integer > {
214+ private static final SpawnValueSerializer INSTANCE = new SpawnValueSerializer ();
215+
216+ @ Override
217+ public Integer deserialize (Object object , Class <Integer > type ) {
218+ String str = String .valueOf (object );
219+ if (str .equalsIgnoreCase ("@unset" )) {
220+ return -2 ;
221+ }
222+ if (str .equalsIgnoreCase ("@bukkit" )) {
223+ return -1 ;
224+ }
225+ return Integer .parseInt (str );
226+ }
227+
228+ @ Override
229+ public Object serialize (Integer object , Class <Integer > type ) {
230+ return switch (object ) {
231+ case -2 -> "@unset" ;
232+ case -1 -> "@bukkit" ;
233+ default -> object ;
234+ };
235+ }
236+ }
200237}
0 commit comments