Skip to content

Commit ff64327

Browse files
authored
fix: save initial view radius to file to allow restore after crash (#9)
1 parent 1bd459c commit ff64327

File tree

2 files changed

+39
-2
lines changed

2 files changed

+39
-2
lines changed

src/main/java/net/nitrado/hytale/plugins/performance_saver/PerformanceSaverPlugin.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,25 @@
1010
import com.hypixel.hytale.server.core.util.Config;
1111
import net.nitrado.hytale.plugins.performance_saver.chunks.ChunkGarbageCollector;
1212
import net.nitrado.hytale.plugins.performance_saver.config.PerformanceSaverPluginConfig;
13+
import net.nitrado.hytale.plugins.performance_saver.config.RestoreConfig;
1314
import net.nitrado.hytale.plugins.performance_saver.tps.TpsAdjuster;
1415
import net.nitrado.hytale.plugins.performance_saver.viewradius.GcMonitor;
1516
import net.nitrado.hytale.plugins.performance_saver.viewradius.Monitor;
1617
import net.nitrado.hytale.plugins.performance_saver.viewradius.TpsMonitor;
1718
import net.nitrado.hytale.plugins.performance_saver.viewradius.ViewRadiusResult;
1819

1920
import javax.annotation.Nonnull;
21+
import java.io.IOException;
22+
import java.nio.file.Files;
2023
import java.util.concurrent.ScheduledFuture;
2124
import java.util.concurrent.TimeUnit;
2225

2326
public class PerformanceSaverPlugin extends JavaPlugin {
2427

2528
private final Config<PerformanceSaverPluginConfig> _config = withConfig(PerformanceSaverPluginConfig.CODEC);
29+
30+
// _restoreConfig saves the server's initial max view radius to disk to allow a restore after a hard server crash
31+
private final Config<RestoreConfig> _restoreConfig = withConfig("restore", RestoreConfig.CODEC);
2632
private PerformanceSaverPluginConfig config;
2733

2834
private ScheduledFuture<?> viewRadiusTask;
@@ -46,18 +52,18 @@ public PerformanceSaverPlugin(@Nonnull JavaPluginInit init) {
4652
@Override
4753
protected void setup() {
4854
this.config = this._config.get();
55+
this.initialViewRadius = this._restoreConfig.get().getInitialViewRadius();
4956

5057
this.gcMonitor = new GcMonitor(getLogger().getSubLogger("GcMonitor"), this.config.getViewRadiusConfig().getGcMonitorConfig());
5158
this.tpsMonitor = new TpsMonitor(getLogger().getSubLogger("TpsMonitor"), this.config.getViewRadiusConfig().getTpsMonitorConfig());
5259
this.chunkGarbageCollector = new ChunkGarbageCollector(getLogger().getSubLogger("ChunkGarbageCollector"), this.config.getChunkGarbageCollectorConfig());
5360
this.tpsAdjuster = new TpsAdjuster(getLogger().getSubLogger("TpsAdjuster"), this.config.getTpsAdjusterConfig());
5461
this._config.save();
62+
this._restoreConfig.save();
5563
}
5664

5765
@Override
5866
protected void start() {
59-
this.initialViewRadius = HytaleServer.get().getConfig().getMaxViewRadius();
60-
6167
getLogger().atInfo().log("Initial view radius is %d", this.initialViewRadius);
6268
try {
6369

@@ -223,6 +229,13 @@ protected void shutdown() {
223229
getLogger().atInfo().log("Restoring view radius to %d", this.initialViewRadius);
224230
HytaleServer.get().getConfig().setMaxViewRadius(this.initialViewRadius);
225231

232+
try {
233+
// Remove restore.json again to allow manual changes to the view radius in the server config
234+
Files.deleteIfExists(getDataDirectory().resolve("restore.json"));
235+
} catch (IOException e) {
236+
getLogger().atWarning().withCause(e).log("failed to delete restore.json");
237+
}
238+
226239
try {
227240
this.gcMonitor.stop();
228241
this.tpsMonitor.stop();
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package net.nitrado.hytale.plugins.performance_saver.config;
2+
3+
import com.hypixel.hytale.codec.Codec;
4+
import com.hypixel.hytale.codec.KeyedCodec;
5+
import com.hypixel.hytale.codec.builder.BuilderCodec;
6+
import com.hypixel.hytale.server.core.HytaleServer;
7+
8+
import java.time.Duration;
9+
10+
public class RestoreConfig {
11+
public static final BuilderCodec<RestoreConfig> CODEC = BuilderCodec.builder(RestoreConfig.class, RestoreConfig::new)
12+
.append(
13+
new KeyedCodec<>("InitialViewRadius", Codec.INTEGER),
14+
(config, value) -> config.initialViewRadius = value,
15+
config -> config.initialViewRadius
16+
).add()
17+
.build();
18+
19+
private int initialViewRadius = HytaleServer.get().getConfig().getMaxViewRadius();
20+
21+
public int getInitialViewRadius() {
22+
return initialViewRadius;
23+
}
24+
}

0 commit comments

Comments
 (0)