From 8820b02406041440ff2ef6ae84cb9dbd35a255cf Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 1 Aug 2021 13:36:28 -0400 Subject: [PATCH] Engine data saving --- .../com/volmit/iris/engine/IrisEngine.java | 62 +++++++++++++++---- .../volmit/iris/engine/IrisWorldManager.java | 5 +- .../volmit/iris/engine/framework/Engine.java | 6 +- .../engine/object/engine/IrisEngineData.java | 1 + .../engine/IrisEngineSpawnerCooldown.java | 1 - .../object/engine/IrisEngineStatistics.java | 35 +++++++++++ 6 files changed, 92 insertions(+), 18 deletions(-) create mode 100644 src/main/java/com/volmit/iris/engine/object/engine/IrisEngineStatistics.java diff --git a/src/main/java/com/volmit/iris/engine/IrisEngine.java b/src/main/java/com/volmit/iris/engine/IrisEngine.java index c8c277189..c9717a05c 100644 --- a/src/main/java/com/volmit/iris/engine/IrisEngine.java +++ b/src/main/java/com/volmit/iris/engine/IrisEngine.java @@ -18,8 +18,10 @@ package com.volmit.iris.engine; +import com.google.gson.Gson; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; +import com.volmit.iris.engine.cache.AtomicCache; import com.volmit.iris.engine.framework.*; import com.volmit.iris.engine.hunk.Hunk; import com.volmit.iris.engine.object.*; @@ -30,6 +32,7 @@ import com.volmit.iris.util.documentation.BlockCoordinates; import com.volmit.iris.util.documentation.ChunkCoordinates; import com.volmit.iris.util.format.C; import com.volmit.iris.util.format.Form; +import com.volmit.iris.util.io.IO; import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.scheduling.J; import com.volmit.iris.util.scheduling.PrecisionStopwatch; @@ -42,6 +45,8 @@ import org.bukkit.block.data.BlockData; import org.bukkit.generator.BlockPopulator; import org.jetbrains.annotations.NotNull; +import java.io.File; +import java.io.IOException; import java.util.Random; public class IrisEngine extends BlockPopulator implements Engine { @@ -87,12 +92,12 @@ public class IrisEngine extends BlockPopulator implements Engine { @Getter private double maxBiomeDecoratorDensity; - private IrisEngineData engineData; + private AtomicCache engineData = new AtomicCache<>(); public IrisEngine(EngineTarget target, EngineCompound compound, int index) { Iris.info("Initializing Engine: " + target.getWorld().name() + "/" + target.getDimension().getLoadKey() + " (" + target.getHeight() + " height)"); metrics = new EngineMetrics(32); - engineData = new IrisEngineData(); + getEngineData(); this.target = target; this.framework = new IrisEngineFramework(this); worldManager = new IrisWorldManager(this); @@ -107,6 +112,35 @@ public class IrisEngine extends BlockPopulator implements Engine { J.a(this::computeBiomeMaxes); } + @Override + public IrisEngineData getEngineData() { + return engineData.aquire(() -> { + File f = new File(getWorld().worldFolder(), "iris/engine-data/" + getDimension().getLoadKey() + "-" + getIndex() + ".json"); + + if(!f.exists()) + { + try { + f.getParentFile().mkdirs(); + IO.writeAll(f, new Gson().toJson(new IrisEngineData())); + } catch (IOException e) { + e.printStackTrace(); + } + } + + try + { + return new Gson().fromJson(IO.readAll(f), IrisEngineData.class); + } + + catch(Throwable e) + { + e.printStackTrace(); + } + + return new IrisEngineData(); + }); + } + private void computeBiomeMaxes() { for (IrisBiome i : getDimension().getAllBiomes(this)) { double density = 0; @@ -140,6 +174,7 @@ public class IrisEngine extends BlockPopulator implements Engine { getWorldManager().close(); getFramework().close(); getTarget().close(); + saveEngineData(); } @Override @@ -167,6 +202,7 @@ public class IrisEngine extends BlockPopulator implements Engine { @ChunkCoordinates @Override public void generate(int x, int z, Hunk vblocks, Hunk vbiomes, boolean multicore) { + getEngineData().getStatistics().generatedChunk(); try { PrecisionStopwatch p = PrecisionStopwatch.start(); Hunk blocks = vblocks.listen((xx, y, zz, t) -> catchBlockUpdates(x + xx, y + getMinHeight(), z + zz, t)); @@ -208,6 +244,17 @@ public class IrisEngine extends BlockPopulator implements Engine { } } + @Override + public void saveEngineData() { + File f = new File(getWorld().worldFolder(), "iris/engine-data/" + getDimension().getLoadKey() + "-" + getIndex() + ".json"); + f.getParentFile().mkdirs(); + try { + IO.writeAll(f, new Gson().toJson(getEngineData())); + } catch (IOException e) { + e.printStackTrace(); + } + } + @Override public IrisBiome getFocus() { if (getDimension().getFocus() == null || getDimension().getFocus().trim().isEmpty()) { @@ -219,19 +266,10 @@ public class IrisEngine extends BlockPopulator implements Engine { @Override public void hotloading() { + getEngineData().getStatistics().hotloaded(); close(); } - @Override - public void saveProperties() { - - } - - @Override - public IrisEngineData getEngineData() { - return engineData; - } - @ChunkCoordinates @Override public void populate(@NotNull World world, @NotNull Random random, @NotNull Chunk c) { diff --git a/src/main/java/com/volmit/iris/engine/IrisWorldManager.java b/src/main/java/com/volmit/iris/engine/IrisWorldManager.java index 0e3281aed..9541ce06c 100644 --- a/src/main/java/com/volmit/iris/engine/IrisWorldManager.java +++ b/src/main/java/com/volmit/iris/engine/IrisWorldManager.java @@ -48,17 +48,16 @@ import java.util.stream.Collectors; import java.util.stream.Stream; public class IrisWorldManager extends EngineAssignedWorldManager { - private boolean spawnable; private final int art; private final KMap spawnCooldowns; private int entityCount = 0; - private ChronoLatch cl = new ChronoLatch(5000); + private final ChronoLatch cl; private int actuallySpawned = 0; public IrisWorldManager(Engine engine) { super(engine); + cl = new ChronoLatch(5000); spawnCooldowns = new KMap<>(); - spawnable = true; art = J.ar(this::onAsyncTick, 7); } diff --git a/src/main/java/com/volmit/iris/engine/framework/Engine.java b/src/main/java/com/volmit/iris/engine/framework/Engine.java index 46f6cba59..be1738d8a 100644 --- a/src/main/java/com/volmit/iris/engine/framework/Engine.java +++ b/src/main/java/com/volmit/iris/engine/framework/Engine.java @@ -99,12 +99,16 @@ public interface Engine extends DataProvider, Fallible, GeneratorAccess, LootPro default void save() { getParallax().saveAll(); + saveEngineData(); } default void saveNow() { getParallax().saveAllNOW(); + saveEngineData(); } + void saveEngineData(); + default String getName() { return getDimension().getName(); } @@ -404,7 +408,5 @@ public interface Engine extends DataProvider, Fallible, GeneratorAccess, LootPro void hotloading(); - void saveProperties(); - IrisEngineData getEngineData(); } diff --git a/src/main/java/com/volmit/iris/engine/object/engine/IrisEngineData.java b/src/main/java/com/volmit/iris/engine/object/engine/IrisEngineData.java index 7420c646e..da742757f 100644 --- a/src/main/java/com/volmit/iris/engine/object/engine/IrisEngineData.java +++ b/src/main/java/com/volmit/iris/engine/object/engine/IrisEngineData.java @@ -24,5 +24,6 @@ import lombok.Data; @Data public class IrisEngineData { + private IrisEngineStatistics statistics = new IrisEngineStatistics(); private KList spawnerCooldowns = new KList<>(); } diff --git a/src/main/java/com/volmit/iris/engine/object/engine/IrisEngineSpawnerCooldown.java b/src/main/java/com/volmit/iris/engine/object/engine/IrisEngineSpawnerCooldown.java index 7c365d54b..f142a59d4 100644 --- a/src/main/java/com/volmit/iris/engine/object/engine/IrisEngineSpawnerCooldown.java +++ b/src/main/java/com/volmit/iris/engine/object/engine/IrisEngineSpawnerCooldown.java @@ -32,7 +32,6 @@ public class IrisEngineSpawnerCooldown public void spawn(Engine engine) { lastSpawn = M.ms(); - engine.saveProperties(); } public boolean canSpawn(IrisRate s) diff --git a/src/main/java/com/volmit/iris/engine/object/engine/IrisEngineStatistics.java b/src/main/java/com/volmit/iris/engine/object/engine/IrisEngineStatistics.java new file mode 100644 index 000000000..b64f0bca7 --- /dev/null +++ b/src/main/java/com/volmit/iris/engine/object/engine/IrisEngineStatistics.java @@ -0,0 +1,35 @@ +/* + * Iris is a World Generator for Minecraft Bukkit Servers + * Copyright (c) 2021 Arcane Arts (Volmit Software) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.volmit.iris.engine.object.engine; + +import lombok.Data; + +@Data +public class IrisEngineStatistics { + private int totalHotloads = 0; + private int chunksGenerated = 0; + + public void generatedChunk() { + chunksGenerated++; + } + + public void hotloaded() { + totalHotloads++; + } +}