From d63570544979bc88c6d3cf408ede78cf2e6bbf04 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 17:56:56 -0400 Subject: [PATCH 001/137] Fix pregen speed issue --- build.gradle | 2 +- src/main/java/com/volmit/iris/core/gui/Pregenerator.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index f78189e2e..7b6379a0c 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { } group 'com.volmit.iris' -version '1.5.2' +version '1.5.3' def apiVersion = '1.17' def name = 'Iris' def main = 'com.volmit.iris.Iris' diff --git a/src/main/java/com/volmit/iris/core/gui/Pregenerator.java b/src/main/java/com/volmit/iris/core/gui/Pregenerator.java index 4aa0b77d8..83a24546c 100644 --- a/src/main/java/com/volmit/iris/core/gui/Pregenerator.java +++ b/src/main/java/com/volmit/iris/core/gui/Pregenerator.java @@ -216,7 +216,7 @@ public class Pregenerator implements Listener { int up = m - w; double dur = p.getMilliseconds(); perSecond.put((int) (up / (dur / 1000D))); - perSecond.put((int) (up / (dur / 60000D))); + perMinute.put((int) (up / (dur / 60000D))); p.reset(); p.begin(); updateProgress(); From 1b7658d8f9b3e35c0f7ee314e03100f41f179769 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 18:21:04 -0400 Subject: [PATCH 002/137] Iris Worlds --- .../iris/engine/object/common/IrisWorld.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/main/java/com/volmit/iris/engine/object/common/IrisWorld.java diff --git a/src/main/java/com/volmit/iris/engine/object/common/IrisWorld.java b/src/main/java/com/volmit/iris/engine/object/common/IrisWorld.java new file mode 100644 index 000000000..859aa037d --- /dev/null +++ b/src/main/java/com/volmit/iris/engine/object/common/IrisWorld.java @@ -0,0 +1,45 @@ +/* + * 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.common; + +import lombok.Builder; +import lombok.Data; +import org.bukkit.World; + +import java.io.File; + +@Builder +@Data +public class IrisWorld { + private String name; + private File worldFolder; + private long seed; + private World.Environment environment; + private boolean real; + + public static IrisWorld fromWorld(World world) + { + return IrisWorld.builder() + .name(world.getName()) + .worldFolder(world.getWorldFolder()) + .seed(world.getSeed()) + .environment(world.getEnvironment()) + .build(); + } +} From 879bcdf8d803405314de9b19a227cfd561a55029 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 18:21:41 -0400 Subject: [PATCH 003/137] Update Engine Target to use Iris Worlds --- .../volmit/iris/engine/framework/EngineTarget.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineTarget.java b/src/main/java/com/volmit/iris/engine/framework/EngineTarget.java index bdd833b0b..417ad7b3f 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineTarget.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineTarget.java @@ -20,10 +20,10 @@ package com.volmit.iris.engine.framework; import com.volmit.iris.core.IrisDataManager; import com.volmit.iris.engine.object.IrisDimension; +import com.volmit.iris.engine.object.common.IrisWorld; import com.volmit.iris.engine.parallax.ParallaxWorld; import com.volmit.iris.engine.parallel.MultiBurst; import lombok.Data; -import org.bukkit.World; import java.io.File; @@ -31,13 +31,13 @@ import java.io.File; public class EngineTarget { private final MultiBurst burster; private final IrisDimension dimension; - private World world; + private IrisWorld world; private final int height; private final IrisDataManager data; private final ParallaxWorld parallaxWorld; private final boolean inverted; - public EngineTarget(World world, IrisDimension dimension, IrisDataManager data, int height, boolean inverted, int threads) { + public EngineTarget(IrisWorld world, IrisDimension dimension, IrisDataManager data, int height, boolean inverted, int threads) { this.world = world; this.height = height; this.dimension = dimension; @@ -47,11 +47,7 @@ public class EngineTarget { this.burster = new MultiBurst(threads); } - public void updateWorld(World world) { - this.world = world; - } - - public EngineTarget(World world, IrisDimension dimension, IrisDataManager data, int height, int threads) { + public EngineTarget(IrisWorld world, IrisDimension dimension, IrisDataManager data, int height, int threads) { this(world, dimension, data, height, false, threads); } } From 1bb9090434f2d673f7fd90c53e7b2649de1e02ec Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 18:22:51 -0400 Subject: [PATCH 004/137] Update engine compounds for iris worlds --- .../com/volmit/iris/engine/IrisEngineCompound.java | 10 +++------- .../volmit/iris/engine/framework/EngineCompound.java | 5 ++--- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/volmit/iris/engine/IrisEngineCompound.java b/src/main/java/com/volmit/iris/engine/IrisEngineCompound.java index 2ba9b78ca..2f932b1fc 100644 --- a/src/main/java/com/volmit/iris/engine/IrisEngineCompound.java +++ b/src/main/java/com/volmit/iris/engine/IrisEngineCompound.java @@ -28,6 +28,7 @@ import com.volmit.iris.engine.hunk.Hunk; import com.volmit.iris.engine.object.IrisDimension; import com.volmit.iris.engine.object.IrisDimensionIndex; import com.volmit.iris.engine.object.IrisPosition; +import com.volmit.iris.engine.object.common.IrisWorld; import com.volmit.iris.engine.parallel.MultiBurst; import com.volmit.iris.util.atomics.AtomicRollingSequence; import com.volmit.iris.util.collection.KList; @@ -50,7 +51,7 @@ import java.util.List; public class IrisEngineCompound implements EngineCompound { @Getter - private World world; + private IrisWorld world; private final AtomicRollingSequence wallClock; @@ -77,7 +78,7 @@ public class IrisEngineCompound implements EngineCompound { @Setter private boolean studio; - public IrisEngineCompound(World world, IrisDimension rootDimension, IrisDataManager data, int maximumThreads) { + public IrisEngineCompound(IrisWorld world, IrisDimension rootDimension, IrisDataManager data, int maximumThreads) { wallClock = new AtomicRollingSequence(32); this.rootDimension = rootDimension; Iris.info("Initializing Engine Composite for " + world.getName()); @@ -274,11 +275,6 @@ public class IrisEngineCompound implements EngineCompound { return defaultEngine; } - @Override - public void updateWorld(World world) { - this.world = world; - } - @Override public void hotload() { for (int i = 0; i < getSize(); i++) { diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineCompound.java b/src/main/java/com/volmit/iris/engine/framework/EngineCompound.java index cff9a2dd9..ef0740b62 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineCompound.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineCompound.java @@ -26,6 +26,7 @@ import com.volmit.iris.engine.hunk.Hunk; import com.volmit.iris.engine.object.IrisBiome; import com.volmit.iris.engine.object.IrisDimension; import com.volmit.iris.engine.object.IrisPosition; +import com.volmit.iris.engine.object.common.IrisWorld; import com.volmit.iris.engine.parallel.MultiBurst; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; @@ -43,7 +44,7 @@ public interface EngineCompound extends Listener, Hotloadable, DataProvider { void generate(int x, int z, Hunk blocks, Hunk postblocks, Hunk biomes); - World getWorld(); + IrisWorld getWorld(); List getStrongholdPositions(); @@ -149,8 +150,6 @@ public interface EngineCompound extends Listener, Hotloadable, DataProvider { return v.v(); } - void updateWorld(World world); - default int getLowestBedrock() { int f = Integer.MAX_VALUE; From 08346a2326fc6e927c812b4bff491411d3b81f34 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 18:23:20 -0400 Subject: [PATCH 005/137] V+ --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 7b6379a0c..29eb2e1df 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { } group 'com.volmit.iris' -version '1.5.3' +version '1.5.3-HEADLESS' def apiVersion = '1.17' def name = 'Iris' def main = 'com.volmit.iris.Iris' From 86367298cc1d36094aeb0a7a2cc000bcc6355a8b Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 18:25:46 -0400 Subject: [PATCH 006/137] Support get players --- .../iris/engine/object/common/IrisWorld.java | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/volmit/iris/engine/object/common/IrisWorld.java b/src/main/java/com/volmit/iris/engine/object/common/IrisWorld.java index 859aa037d..b80cfe42e 100644 --- a/src/main/java/com/volmit/iris/engine/object/common/IrisWorld.java +++ b/src/main/java/com/volmit/iris/engine/object/common/IrisWorld.java @@ -18,20 +18,23 @@ package com.volmit.iris.engine.object.common; +import com.volmit.iris.util.collection.KList; import lombok.Builder; import lombok.Data; import org.bukkit.World; +import org.bukkit.entity.Player; import java.io.File; @Builder @Data public class IrisWorld { + private static final KList NO_PLAYERS = new KList<>(); private String name; private File worldFolder; private long seed; private World.Environment environment; - private boolean real; + private World realWorld; public static IrisWorld fromWorld(World world) { @@ -42,4 +45,19 @@ public class IrisWorld { .environment(world.getEnvironment()) .build(); } + + public boolean hasRealWorld() + { + return realWorld != null; + } + + public Iterable getPlayers() { + + if(hasRealWorld()) + { + return getRealWorld().getPlayers(); + } + + return NO_PLAYERS; + } } From bd954e7292041df0c51da2cd3d0ceeb51e36ab2b Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 18:36:59 -0400 Subject: [PATCH 007/137] Support additional world methods --- .../iris/engine/object/common/IrisWorld.java | 36 +++++++++++++++---- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/volmit/iris/engine/object/common/IrisWorld.java b/src/main/java/com/volmit/iris/engine/object/common/IrisWorld.java index b80cfe42e..53c785d0e 100644 --- a/src/main/java/com/volmit/iris/engine/object/common/IrisWorld.java +++ b/src/main/java/com/volmit/iris/engine/object/common/IrisWorld.java @@ -18,9 +18,11 @@ package com.volmit.iris.engine.object.common; +import com.volmit.iris.engine.IrisWorlds; import com.volmit.iris.util.collection.KList; import lombok.Builder; import lombok.Data; +import lombok.experimental.Accessors; import org.bukkit.World; import org.bukkit.entity.Player; @@ -28,6 +30,7 @@ import java.io.File; @Builder @Data +@Accessors(chain = true, fluent = true) public class IrisWorld { private static final KList NO_PLAYERS = new KList<>(); private String name; @@ -35,15 +38,23 @@ public class IrisWorld { private long seed; private World.Environment environment; private World realWorld; + private int minHeight; + private int maxHeight; public static IrisWorld fromWorld(World world) { - return IrisWorld.builder() - .name(world.getName()) - .worldFolder(world.getWorldFolder()) - .seed(world.getSeed()) - .environment(world.getEnvironment()) - .build(); + return bindWorld(IrisWorld.builder().build(), world); + } + + private static IrisWorld bindWorld(IrisWorld iw, World world) + { + return iw.name(world.getName()) + .worldFolder(world.getWorldFolder()) + .seed(world.getSeed()) + .minHeight(world.getMinHeight()) + .maxHeight(world.getMaxHeight()) + .realWorld(world) + .environment(world.getEnvironment()); } public boolean hasRealWorld() @@ -55,9 +66,20 @@ public class IrisWorld { if(hasRealWorld()) { - return getRealWorld().getPlayers(); + return realWorld().getPlayers(); } return NO_PLAYERS; } + + public void evacuate() { + if(hasRealWorld()) + { + IrisWorlds.evacuate(realWorld()); + } + } + + public void bind(World world) { + bindWorld(this, world); + } } From fe2de5d8ae2d83d24d94b22b24b237336f3a87bb Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 18:37:09 -0400 Subject: [PATCH 008/137] Use Iris worlds --- .../volmit/iris/engine/framework/IrisAccess.java | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/volmit/iris/engine/framework/IrisAccess.java b/src/main/java/com/volmit/iris/engine/framework/IrisAccess.java index ebc927194..8c68ce12a 100644 --- a/src/main/java/com/volmit/iris/engine/framework/IrisAccess.java +++ b/src/main/java/com/volmit/iris/engine/framework/IrisAccess.java @@ -25,6 +25,7 @@ import com.volmit.iris.engine.data.DataProvider; import com.volmit.iris.engine.data.mca.NBTWorld; import com.volmit.iris.engine.object.IrisBiome; import com.volmit.iris.engine.object.IrisRegion; +import com.volmit.iris.engine.object.common.IrisWorld; import com.volmit.iris.engine.parallel.MultiBurst; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.math.M; @@ -44,9 +45,9 @@ import java.util.function.Consumer; @SuppressWarnings("EmptyMethod") public interface IrisAccess extends Hotloadable, DataProvider { - void directWriteMCA(World w, int x, int z, NBTWorld writer, MultiBurst burst); + void directWriteMCA(IrisWorld w, int x, int z, NBTWorld writer, MultiBurst burst); - void directWriteChunk(World w, int x, int z, NBTWorld writer); + void directWriteChunk(IrisWorld w, int x, int z, NBTWorld writer); int getGenerated(); @@ -72,8 +73,6 @@ public interface IrisAccess extends Hotloadable, DataProvider { void changeThreadCount(int m); - void regenerate(int x, int z); - void close(); boolean isClosed(); @@ -238,14 +237,6 @@ public interface IrisAccess extends Hotloadable, DataProvider { return location.get(); } - void clearRegeneratedLists(int x, int z); - - void precache(World world, int x, int z); - - int getPrecacheSize(); - - Chunk generatePaper(World world, int cx, int cz); - default int getParallaxChunkCount() { int v = 0; From 6618cdc0adba96076cdac23dc797c365388e0931 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 18:37:17 -0400 Subject: [PATCH 009/137] Composite generator use only iris worlds --- .../framework/EngineCompositeGenerator.java | 236 +++--------------- 1 file changed, 28 insertions(+), 208 deletions(-) diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java b/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java index 0039e714a..93a191302 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java @@ -33,6 +33,7 @@ import com.volmit.iris.engine.hunk.Hunk; import com.volmit.iris.engine.object.IrisBiome; import com.volmit.iris.engine.object.IrisDimension; import com.volmit.iris.engine.object.IrisPosition; +import com.volmit.iris.engine.object.common.IrisWorld; import com.volmit.iris.engine.parallel.BurstExecutor; import com.volmit.iris.engine.parallel.MultiBurst; import com.volmit.iris.util.collection.KList; @@ -79,9 +80,7 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce private long mst = 0; private int generated = 0; private int lgenerated = 0; - private final KMap chunkCache; private final ChronoLatch hotloadcd; - private final AtomicBoolean fake; @Getter private double generatedPerSecond = 0; private final int art; @@ -93,8 +92,6 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce public EngineCompositeGenerator(String query, boolean production) { super(); - chunkCache = new KMap<>(); - fake = new AtomicBoolean(true); hotloadcd = new ChronoLatch(3500); mst = M.ms(); this.production = production; @@ -113,6 +110,7 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce }); } + @Override public void hotload() { if (isStudio()) { Iris.proj.updateWorkspace(); @@ -158,14 +156,14 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce } } - private synchronized IrisDimension getDimension(World world) { + private synchronized IrisDimension getDimension(IrisWorld world) { String query = dimensionQuery; - query = Iris.linkMultiverseCore.getWorldNameType(world.getName(), query); + query = Iris.linkMultiverseCore.getWorldNameType(world.name(), query); IrisDimension dim = null; if (query == null) { - File iris = new File(world.getWorldFolder(), "iris"); + File iris = new File(world.worldFolder(), "iris"); if (iris.exists() && iris.isDirectory()) { for (File i : iris.listFiles()) { @@ -191,7 +189,7 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce } if (query == null) { - Iris.error("Cannot find iris dimension data for world: " + world.getName() + "! Assuming " + IrisSettings.get().getGenerator().getDefaultWorldType() + "!"); + Iris.error("Cannot find iris dimension data for world: " + world.name() + "! Assuming " + IrisSettings.get().getGenerator().getDefaultWorldType() + "!"); query = IrisSettings.get().getGenerator().getDefaultWorldType(); } @@ -213,8 +211,8 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce dim = new IrisDataManager(getDataFolder(world)).getDimensionLoader().load(od.getLoadKey()); if (dim == null) { - Iris.info("Installing Iris pack " + od.getName() + " into world " + world.getName() + "..."); - Iris.proj.installIntoWorld(new VolmitSender(Bukkit.getConsoleSender(), Iris.instance.getTag()), od.getLoadKey(), world.getWorldFolder()); + Iris.info("Installing Iris pack " + od.getName() + " into world " + world.name() + "..."); + Iris.proj.installIntoWorld(new VolmitSender(Bukkit.getConsoleSender(), Iris.instance.getTag()), od.getLoadKey(), world.worldFolder()); dim = new IrisDataManager(getDataFolder(world)).getDimensionLoader().load(od.getLoadKey()); if (dim == null) { @@ -294,20 +292,7 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce return dim; } - public synchronized void initialize(World world) { - if (!(world instanceof FakeWorld) && fake.get() && this.compound.get() != null) { - fake.set(false); - this.compound.get().updateWorld(world); - getTarget().updateWorld(world); - placeStrongholds(world); - - for (int i = 0; i < getComposite().getSize(); i++) { - getComposite().getEngine(i).getTarget().updateWorld(world); - } - - Iris.info("Attached Real World to Engine Target"); - } - + public synchronized void initialize(IrisWorld world) { if (initialized.get()) { return; } @@ -445,8 +430,8 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce ); } - private File getDataFolder(World world) { - return new File(world.getWorldFolder(), "iris/pack"); + private File getDataFolder(IrisWorld world) { + return new File(world.worldFolder(), "iris/pack"); } private File getDataFolder(String world) { @@ -458,7 +443,13 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce public ChunkData generateChunkData(@NotNull World world, @NotNull Random ignored, int x, int z, @NotNull BiomeGrid biome) { PrecisionStopwatch ps = PrecisionStopwatch.start(); TerrainChunk tc = TerrainChunk.create(world, biome); - generateChunkRawData(world, x, z, tc).run(); + + if(!getComposite().getWorld().hasRealWorld()) + { + getComposite().getWorld().bind(world); + } + + generateChunkRawData(getComposite().getWorld(), x, z, tc).run(); generated++; ps.end(); @@ -469,7 +460,8 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce return tc.getRaw(); } - public void directWriteMCA(World w, int x, int z, NBTWorld writer, MultiBurst burst) { + @Override + public void directWriteMCA(IrisWorld w, int x, int z, NBTWorld writer, MultiBurst burst) { BurstExecutor e = burst.burst(1024); int mcaox = x << 5; int mcaoz = z << 5; @@ -485,7 +477,8 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce e.complete(); } - public void directWriteChunk(World w, int x, int z, NBTWorld writer) { + @Override + public void directWriteChunk(IrisWorld w, int x, int z, NBTWorld writer) { int ox = x << 4; int oz = z << 4; com.volmit.iris.engine.data.mca.Chunk cc = writer.getChunk(x, z); @@ -526,12 +519,12 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce @Override public int getMinHeight() { - return w.getMinHeight(); + return w.minHeight(); } @Override public int getMaxHeight() { - return w.getMaxHeight(); + return w.maxHeight(); } @Override @@ -614,50 +607,8 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce }).run(); } - public Chunk generatePaper(World world, int x, int z) { - precache(world, x, z); - Chunk c = PaperLib.getChunkAtAsync(world, x, z, true).join(); - chunkCache.remove(Cache.key(x, z)); - return c; - } - - public void precache(World world, int x, int z) { - synchronized (this) { - initialize(world); - } - - synchronized (chunkCache) { - if (chunkCache.containsKey(Cache.key(x, z))) { - return; - } - } - - PregeneratedData data = new PregeneratedData(getComposite().getHeight() - 1); - compound.get().generate(x * 16, z * 16, data.getBlocks(), data.getPost(), data.getBiomes()); - synchronized (chunkCache) { - chunkCache.put(Cache.key(x, z), data); - } - } - - @Override - public int getPrecacheSize() { - return chunkCache.size(); - } - - public int getCachedChunks() { - return chunkCache.size(); - } - - public Runnable generateChunkRawData(World world, int x, int z, TerrainChunk tc) { + public Runnable generateChunkRawData(IrisWorld world, int x, int z, TerrainChunk tc) { initialize(world); - - synchronized (chunkCache) { - long g = Cache.key(x, z); - if (chunkCache.containsKey(g)) { - return chunkCache.remove(g).inject(tc); - } - } - Hunk blocks = Hunk.view((ChunkData) tc); Hunk biomes = Hunk.view((BiomeGrid) tc); Hunk post = Hunk.newAtomicHunk(biomes.getWidth(), biomes.getHeight(), biomes.getDepth()); @@ -783,146 +734,15 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce // TODO: DO IT } - @Override - public void clearRegeneratedLists(int x, int z) { - for (int i = 0; i < getComposite().getSize(); i++) { - getComposite().getEngine(i).getParallax().delete(x, z); - } - } - - @Override - public void regenerate(int x, int z) { - - clearRegeneratedLists(x, z); - int xx = x * 16; - int zz = z * 16; - BiomeBaseInjector inj = (a, b, c, d) -> { - }; - //noinspection deprecation - generateChunkRawData(getComposite().getWorld(), x, z, new TerrainChunk() { - @Override - public BiomeBaseInjector getBiomeBaseInjector() { - return inj; - } - - @Override - public void setRaw(ChunkData data) { - - } - - @NotNull - @Override - public Biome getBiome(int x, int z) { - return Biome.THE_VOID; - } - - @NotNull - @Override - public Biome getBiome(int x, int y, int z) { - return Biome.THE_VOID; - } - - @Override - public void setBiome(int x, int z, Biome bio) { - - } - - @Override - public void setBiome(int x, int y, int z, Biome bio) { - - } - - @Override - public int getMinHeight() { - return getComposite().getWorld().getMinHeight(); - } - - @Override - public int getMaxHeight() { - return getComposite().getWorld().getMaxHeight(); - } - - @Override - public void setBlock(int x, int y, int z, BlockData blockData) { - if (!getBlockData(x, y, z).matches(blockData)) { - Iris.edit.set(compound.get().getWorld(), x + xx, y, z + zz, blockData); - } - } - - @NotNull - @Override - public BlockData getBlockData(int x, int y, int z) { - return Iris.edit.get(compound.get().getWorld(), x + xx, y, z + zz); - } - - @Override - public ChunkData getRaw() { - return null; - } - - @Override - public void inject(BiomeGrid biome) { - - } - - @Override - public void setBlock(int i, int i1, int i2, @NotNull Material material) { - setBlock(i, i1, i2, material.createBlockData()); - } - - @Override - public void setBlock(int i, int i1, int i2, @NotNull MaterialData materialData) { - setBlock(i, i1, i2, materialData.getItemType()); - } - - @Override - public void setRegion(int i, int i1, int i2, int i3, int i4, int i5, @NotNull Material material) { - - } - - @Override - public void setRegion(int i, int i1, int i2, int i3, int i4, int i5, @NotNull MaterialData materialData) { - - } - - @Override - public void setRegion(int i, int i1, int i2, int i3, int i4, int i5, @NotNull BlockData blockData) { - - } - - @NotNull - @Override - public Material getType(int i, int i1, int i2) { - return getBlockData(i, i1, i2).getMaterial(); - } - - @NotNull - @Override - public MaterialData getTypeAndData(int i, int i1, int i2) { - return null; - } - - @Override - public byte getData(int i, int i1, int i2) { - return 0; - } - }); - - Iris.edit.flushNow(); - - } - - @Override public void close() { J.car(art); if (getComposite() != null) { getComposite().close(); - - if (isStudio()) { - IrisWorlds.evacuate(getComposite().getWorld()); - Bukkit.unloadWorld(getComposite().getWorld(), !isStudio()); + if (isStudio() && getComposite().getWorld().hasRealWorld()) { + getComposite().getWorld().evacuate(); + Bukkit.unloadWorld(getComposite().getWorld().realWorld(), !isStudio()); } } } From f241679087ea60f6d20caccf5402d20e452358ec Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 18:37:55 -0400 Subject: [PATCH 010/137] Fix world method in studio close --- .../volmit/iris/core/command/studio/CommandIrisStudioClose.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioClose.java b/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioClose.java index 6be720bbc..19080e304 100644 --- a/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioClose.java +++ b/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioClose.java @@ -56,7 +56,7 @@ public class CommandIrisStudioClose extends MortarCommand { World f = null; for (World i : Bukkit.getWorlds()) { - if (i.getWorldFolder().getAbsolutePath().equals(Iris.proj.getActiveProject().getActiveProvider().getTarget().getWorld().getWorldFolder().getAbsolutePath())) { + if (i.getWorldFolder().getAbsolutePath().equals(Iris.proj.getActiveProject().getActiveProvider().getTarget().getWorld().worldFolder().getAbsolutePath())) { continue; } From 85b936ead27b072d13815d410991d978752443cf Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 18:38:12 -0400 Subject: [PATCH 011/137] Engine target fix for world folder --- .../java/com/volmit/iris/engine/framework/EngineTarget.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineTarget.java b/src/main/java/com/volmit/iris/engine/framework/EngineTarget.java index 417ad7b3f..6c7f2856c 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineTarget.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineTarget.java @@ -42,7 +42,7 @@ public class EngineTarget { this.height = height; this.dimension = dimension; this.data = data; - this.parallaxWorld = new ParallaxWorld(256, new File(world.getWorldFolder(), "iris/" + dimension.getLoadKey() + "/parallax")); + this.parallaxWorld = new ParallaxWorld(256, new File(world.worldFolder(), "iris/" + dimension.getLoadKey() + "/parallax")); this.inverted = inverted; this.burster = new MultiBurst(threads); } From 986cf025a01823b31cca257544d7619d59f63d2a Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 18:38:47 -0400 Subject: [PATCH 012/137] Seed access for spawns --- .../volmit/iris/engine/object/IrisEntitySpawnOverride.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/volmit/iris/engine/object/IrisEntitySpawnOverride.java b/src/main/java/com/volmit/iris/engine/object/IrisEntitySpawnOverride.java index 488cb519a..1cc0150f9 100644 --- a/src/main/java/com/volmit/iris/engine/object/IrisEntitySpawnOverride.java +++ b/src/main/java/com/volmit/iris/engine/object/IrisEntitySpawnOverride.java @@ -88,8 +88,8 @@ public class IrisEntitySpawnOverride { return null; } - if (rng.aquire(() -> new RNG(g.getTarget().getWorld().getSeed() + 4)).i(1, getRarity()) == 1) { - return getRealEntity(g).spawn(g, at, rng.aquire(() -> new RNG(g.getTarget().getWorld().getSeed() + 4))); + if (rng.aquire(() -> new RNG(g.getTarget().getWorld().seed() + 4)).i(1, getRarity()) == 1) { + return getRealEntity(g).spawn(g, at, rng.aquire(() -> new RNG(g.getTarget().getWorld().seed() + 4))); } return null; From 21d8ceacf0dc3f3942650c14e3d260611d9788e4 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 18:39:36 -0400 Subject: [PATCH 013/137] Initial spawn fixes --- .../com/volmit/iris/engine/object/IrisEntityInitialSpawn.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/volmit/iris/engine/object/IrisEntityInitialSpawn.java b/src/main/java/com/volmit/iris/engine/object/IrisEntityInitialSpawn.java index 8feff8a42..1e72382a3 100644 --- a/src/main/java/com/volmit/iris/engine/object/IrisEntityInitialSpawn.java +++ b/src/main/java/com/volmit/iris/engine/object/IrisEntityInitialSpawn.java @@ -82,7 +82,7 @@ public class IrisEntityInitialSpawn { return null; } - if (rng.aquire(() -> new RNG(g.getTarget().getWorld().getSeed() + 4)).i(1, getRarity()) == 1) { + if (rng.aquire(() -> new RNG(g.getTarget().getWorld().seed() + 4)).i(1, getRarity()) == 1) { return spawn100(g, at); } @@ -90,6 +90,6 @@ public class IrisEntityInitialSpawn { } private Entity spawn100(Engine g, Location at) { - return getRealEntity(g).spawn(g, at.clone().add(0.5, 1, 0.5), rng.aquire(() -> new RNG(g.getTarget().getWorld().getSeed() + 4))); + return getRealEntity(g).spawn(g, at.clone().add(0.5, 1, 0.5), rng.aquire(() -> new RNG(g.getTarget().getWorld().seed() + 4))); } } From ea9fb5bcb0ac64ad04cb71ac24911d8a5d4cfe37 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 18:39:54 -0400 Subject: [PATCH 014/137] Update Engine for Iris Worlds --- src/main/java/com/volmit/iris/engine/framework/Engine.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 d2ad0638a..38ffb462c 100644 --- a/src/main/java/com/volmit/iris/engine/framework/Engine.java +++ b/src/main/java/com/volmit/iris/engine/framework/Engine.java @@ -27,6 +27,7 @@ import com.volmit.iris.engine.data.B; import com.volmit.iris.engine.data.DataProvider; import com.volmit.iris.engine.hunk.Hunk; import com.volmit.iris.engine.object.*; +import com.volmit.iris.engine.object.common.IrisWorld; import com.volmit.iris.engine.parallax.ParallaxAccess; import com.volmit.iris.engine.parallel.MultiBurst; import com.volmit.iris.util.collection.KList; @@ -105,7 +106,7 @@ public interface Engine extends DataProvider, Fallible, GeneratorAccess, LootPro return getTarget().getData(); } - default World getWorld() { + default IrisWorld getWorld() { return getTarget().getWorld(); } From 8a0b7fbc471a38ad2c4d05f50ae5049a92824fc1 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 18:41:39 -0400 Subject: [PATCH 015/137] Patch goto in headless mode --- .../volmit/iris/engine/framework/IrisAccess.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/volmit/iris/engine/framework/IrisAccess.java b/src/main/java/com/volmit/iris/engine/framework/IrisAccess.java index 8c68ce12a..8c6e692f7 100644 --- a/src/main/java/com/volmit/iris/engine/framework/IrisAccess.java +++ b/src/main/java/com/volmit/iris/engine/framework/IrisAccess.java @@ -86,6 +86,12 @@ public interface IrisAccess extends Hotloadable, DataProvider { boolean isStudio(); default Location lookForBiome(IrisBiome biome, long timeout, Consumer triesc) { + if(!getCompound().getWorld().hasRealWorld()) + { + Iris.error("Cannot GOTO without a bound world (headless mode)"); + return null; + } + IrisComplex.cacheLock.set(true); ChronoLatch cl = new ChronoLatch(250, false); long s = M.ms(); @@ -129,7 +135,7 @@ public interface IrisAccess extends Hotloadable, DataProvider { if (b != null && b.getLoadKey().equals(biome.getLoadKey())) { found.lazySet(true); - location.lazySet(new Location(e.getWorld(), x, e.getHeight(x, z), z)); + location.lazySet(new Location(e.getWorld().realWorld(), x, e.getHeight(x, z), z)); } tries.getAndIncrement(); @@ -166,6 +172,12 @@ public interface IrisAccess extends Hotloadable, DataProvider { } default Location lookForRegion(IrisRegion reg, long timeout, Consumer triesc) { + if(!getCompound().getWorld().hasRealWorld()) + { + Iris.error("Cannot GOTO without a bound world (headless mode)"); + return null; + } + IrisComplex.cacheLock.set(true); ChronoLatch cl = new ChronoLatch(3000, false); long s = M.ms(); @@ -203,7 +215,7 @@ public interface IrisAccess extends Hotloadable, DataProvider { if (b != null && b.getLoadKey() != null && b.getLoadKey().equals(reg.getLoadKey())) { found.lazySet(true); - location.lazySet(new Location(e.getWorld(), x, e.getHeight(x, z) + e.getMinHeight(), z)); + location.lazySet(new Location(e.getWorld().realWorld(), x, e.getHeight(x, z) + e.getMinHeight(), z)); } tries.getAndIncrement(); From 63ba5cf39d4617f37dac332d98e3fcc9bca25657 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 18:42:05 -0400 Subject: [PATCH 016/137] Patch engine components --- .../java/com/volmit/iris/engine/framework/EngineComponent.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineComponent.java b/src/main/java/com/volmit/iris/engine/framework/EngineComponent.java index f62641efc..440525632 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineComponent.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineComponent.java @@ -69,7 +69,7 @@ public interface EngineComponent { } default long getSeed() { - return getTarget().getWorld().getSeed(); + return getTarget().getWorld().seed(); } default EngineFramework getFramework() { From 75fe59ef79fecfd7975870eec78af673bbfc6fab Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 18:42:32 -0400 Subject: [PATCH 017/137] Patch complex --- src/main/java/com/volmit/iris/engine/IrisComplex.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/volmit/iris/engine/IrisComplex.java b/src/main/java/com/volmit/iris/engine/IrisComplex.java index 1d2878269..0fe44827b 100644 --- a/src/main/java/com/volmit/iris/engine/IrisComplex.java +++ b/src/main/java/com/volmit/iris/engine/IrisComplex.java @@ -108,14 +108,14 @@ public class IrisComplex implements DataProvider { public IrisComplex(Engine engine, boolean simple) { int cacheSize = 1024 * 128; - this.rng = new RNG(engine.getWorld().getSeed()); + this.rng = new RNG(engine.getWorld().seed()); this.data = engine.getData(); double height = engine.getHeight(); fluidHeight = engine.getDimension().getFluidHeight(); generators = new KList<>(); focus = engine.getFocus(); IrisRegion focusRegion = focus != null ? findRegion(focus, engine) : null; - RNG rng = new RNG(engine.getWorld().getSeed()); + RNG rng = new RNG(engine.getWorld().seed()); //@builder engine.getDimension().getRegions().forEach((i) -> data.getRegionLoader().load(i) .getAllBiomes(this).forEach((b) -> b @@ -124,7 +124,7 @@ public class IrisComplex implements DataProvider { overlayStream = ProceduralStream.ofDouble((x, z) -> 0D); engine.getDimension().getOverlayNoise().forEach((i) -> overlayStream.add((x, z) -> i.get(rng, x, z))); rngStream = ProceduralStream.of((x, z) -> new RNG(((x.longValue()) << 32) | (z.longValue() & 0xffffffffL)) - .nextParallelRNG(engine.getWorld().getSeed()), Interpolated.RNG); + .nextParallelRNG(engine.getWorld().seed()), Interpolated.RNG); chunkRngStream = rngStream.blockToChunkCoords(); rockStream = engine.getDimension().getRockPalette().getLayerGenerator(rng.nextParallelRNG(45), data).stream() .select(engine.getDimension().getRockPalette().getBlockData(data)); @@ -193,7 +193,7 @@ public class IrisComplex implements DataProvider { .convertAware2D(this::implode).cache2D(cacheSize); heightStream = ProceduralStream.of((x, z) -> { IrisBiome b = focus != null ? focus : baseBiomeStream.get(x, z); - return getHeight(engine, b, x, z, engine.getWorld().getSeed()); + return getHeight(engine, b, x, z, engine.getWorld().seed()); }, Interpolated.DOUBLE).cache2D(cacheSize); slopeStream = heightStream.slope(3).interpolate().bilinear(3, 3).cache2D(cacheSize); objectChanceStream = ProceduralStream.ofDouble((x, z) -> { From 957dbecb3d7d1356224a65e04b1bc16302d078ae Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 18:43:14 -0400 Subject: [PATCH 018/137] Plxmgr headless --- .../volmit/iris/engine/framework/EngineParallaxManager.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineParallaxManager.java b/src/main/java/com/volmit/iris/engine/framework/EngineParallaxManager.java index cea30dd0f..9c9d88709 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineParallaxManager.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineParallaxManager.java @@ -271,7 +271,7 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer { if (!getParallaxAccess().isFeatureGenerated(xx, zz)) { burst.queue(() -> { getParallaxAccess().setFeatureGenerated(xx, zz); - RNG rng = new RNG(Cache.key(xx, zz)).nextParallelRNG(getEngine().getTarget().getWorld().getSeed()); + RNG rng = new RNG(Cache.key(xx, zz)).nextParallelRNG(getEngine().getTarget().getWorld().seed()); IrisRegion region = getComplex().getRegionStream().get(xxx, zzz); IrisBiome biome = getComplex().getTrueBiomeStream().get(xxx, zzz); generateParallaxFeatures(rng, xx, zz, region, biome); @@ -332,7 +332,7 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer { if (getEngine().getDimension().isPlaceObjects()) { int xx = x << 4; int zz = z << 4; - RNG rng = new RNG(Cache.key(x, z)).nextParallelRNG(getEngine().getTarget().getWorld().getSeed()); + RNG rng = new RNG(Cache.key(x, z)).nextParallelRNG(getEngine().getTarget().getWorld().seed()); IrisRegion region = getComplex().getRegionStream().get(xx + 8, zz + 8); IrisBiome biome = getComplex().getTrueBiomeStream().get(xx + 8, zz + 8); after.addAll(generateParallaxJigsaw(rng, x, z, biome, region)); @@ -351,7 +351,7 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer { int xx = x << 4; int zz = z << 4; getParallaxAccess().setParallaxGenerated(x, z); - RNG rng = new RNG(Cache.key(x, z)).nextParallelRNG(getEngine().getTarget().getWorld().getSeed()); + RNG rng = new RNG(Cache.key(x, z)).nextParallelRNG(getEngine().getTarget().getWorld().seed()); IrisBiome biome = getComplex().getTrueBiomeStream().get(xx + 8, zz + 8); IrisRegion region = getComplex().getRegionStream().get(xx + 8, zz + 8); generateParallaxSurface(rng, x, z, biome, region, false); From aae47e103b81b63fe7be00c08366356a9ab495db Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 18:44:52 -0400 Subject: [PATCH 019/137] Spawn loc headless --- .../studio/CommandIrisStudioExplorerGenerator.java | 2 +- .../volmit/iris/engine/object/common/IrisWorld.java | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioExplorerGenerator.java b/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioExplorerGenerator.java index 7fe029d98..4f496636d 100644 --- a/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioExplorerGenerator.java +++ b/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioExplorerGenerator.java @@ -63,7 +63,7 @@ public class CommandIrisStudioExplorerGenerator extends MortarCommand { if (Iris.proj.isProjectOpen()) { generator = Iris.proj.getActiveProject().getActiveProvider().getData().getGeneratorLoader().load(args[0]); - seed = Iris.proj.getActiveProject().getActiveProvider().getTarget().getWorld().getSeed(); + seed = Iris.proj.getActiveProject().getActiveProvider().getTarget().getWorld().seed(); } else { generator = IrisDataManager.loadAnyGenerator(args[0]); } diff --git a/src/main/java/com/volmit/iris/engine/object/common/IrisWorld.java b/src/main/java/com/volmit/iris/engine/object/common/IrisWorld.java index 53c785d0e..000c5c25b 100644 --- a/src/main/java/com/volmit/iris/engine/object/common/IrisWorld.java +++ b/src/main/java/com/volmit/iris/engine/object/common/IrisWorld.java @@ -18,11 +18,13 @@ package com.volmit.iris.engine.object.common; +import com.volmit.iris.Iris; import com.volmit.iris.engine.IrisWorlds; import com.volmit.iris.util.collection.KList; import lombok.Builder; import lombok.Data; import lombok.experimental.Accessors; +import org.bukkit.Location; import org.bukkit.World; import org.bukkit.entity.Player; @@ -82,4 +84,14 @@ public class IrisWorld { public void bind(World world) { bindWorld(this, world); } + + public Location getSpawnLocation() { + if(hasRealWorld()) + { + return realWorld().getSpawnLocation(); + } + + Iris.error("This world is not real yet, cannot get spawn location! HEADLESS!"); + return null; + } } From deb75df77a5940d6e65554e66fd274f589b379d2 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 18:45:41 -0400 Subject: [PATCH 020/137] Cleanup unused --- .../iris/core/command/studio/CommandIrisStudioTPStudio.java | 2 +- src/main/java/com/volmit/iris/core/gui/IrisRenderer.java | 4 ---- .../java/com/volmit/iris/engine/object/common/IrisWorld.java | 2 +- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioTPStudio.java b/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioTPStudio.java index 63d0af4bd..f34d11cdc 100644 --- a/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioTPStudio.java +++ b/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioTPStudio.java @@ -57,7 +57,7 @@ public class CommandIrisStudioTPStudio extends MortarCommand { try { sender.sendMessage("Teleporting you to the active studio world."); - sender.player().teleport(Iris.proj.getActiveProject().getActiveProvider().getTarget().getWorld().getSpawnLocation()); + sender.player().teleport(Iris.proj.getActiveProject().getActiveProvider().getTarget().getWorld().spawnLocation()); sender.player().setGameMode(GameMode.SPECTATOR); } catch (Throwable e) { Iris.reportError(e); diff --git a/src/main/java/com/volmit/iris/core/gui/IrisRenderer.java b/src/main/java/com/volmit/iris/core/gui/IrisRenderer.java index 436d57951..977438c9a 100644 --- a/src/main/java/com/volmit/iris/core/gui/IrisRenderer.java +++ b/src/main/java/com/volmit/iris/core/gui/IrisRenderer.java @@ -60,8 +60,4 @@ public class IrisRenderer { return image; } - - public void set(double worldX, double worldZ) { - renderer.getWorld().getBlockAt((int) worldX, 20, (int) worldZ).setType(Material.DIAMOND_BLOCK); - } } diff --git a/src/main/java/com/volmit/iris/engine/object/common/IrisWorld.java b/src/main/java/com/volmit/iris/engine/object/common/IrisWorld.java index 000c5c25b..c5cc9caa4 100644 --- a/src/main/java/com/volmit/iris/engine/object/common/IrisWorld.java +++ b/src/main/java/com/volmit/iris/engine/object/common/IrisWorld.java @@ -85,7 +85,7 @@ public class IrisWorld { bindWorld(this, world); } - public Location getSpawnLocation() { + public Location spawnLocation() { if(hasRealWorld()) { return realWorld().getSpawnLocation(); From fa818d50d170aaad6af5de08df93e4de0dbbf8dd Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 18:48:57 -0400 Subject: [PATCH 021/137] Vision headless support --- .../java/com/volmit/iris/core/gui/IrisVision.java | 5 +++-- .../volmit/iris/engine/object/common/IrisWorld.java | 13 +++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/volmit/iris/core/gui/IrisVision.java b/src/main/java/com/volmit/iris/core/gui/IrisVision.java index d8dacadc7..8d074cc9b 100644 --- a/src/main/java/com/volmit/iris/core/gui/IrisVision.java +++ b/src/main/java/com/volmit/iris/core/gui/IrisVision.java @@ -24,6 +24,7 @@ import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.framework.IrisAccess; import com.volmit.iris.engine.object.IrisBiome; import com.volmit.iris.engine.object.IrisRegion; +import com.volmit.iris.engine.object.common.IrisWorld; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.collection.KSet; @@ -70,7 +71,7 @@ public class IrisVision extends JPanel implements MouseWheelListener, KeyListene private boolean alt = false; private int posX = 0; private IrisRenderer renderer; - private World world; + private IrisWorld world; private double velocity = 0; private int lowq = 12; private int posZ = 0; @@ -726,7 +727,7 @@ public class IrisVision extends JPanel implements MouseWheelListener, KeyListene } } - private static void createAndShowGUI(Engine r, int s, World world) { + private static void createAndShowGUI(Engine r, int s, IrisWorld world) { JFrame frame = new JFrame("Vision"); IrisVision nv = new IrisVision(frame); nv.world = world; diff --git a/src/main/java/com/volmit/iris/engine/object/common/IrisWorld.java b/src/main/java/com/volmit/iris/engine/object/common/IrisWorld.java index c5cc9caa4..d3d00b3d2 100644 --- a/src/main/java/com/volmit/iris/engine/object/common/IrisWorld.java +++ b/src/main/java/com/volmit/iris/engine/object/common/IrisWorld.java @@ -26,15 +26,19 @@ import lombok.Data; import lombok.experimental.Accessors; import org.bukkit.Location; import org.bukkit.World; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import java.io.File; +import java.util.Collection; @Builder @Data @Accessors(chain = true, fluent = true) public class IrisWorld { private static final KList NO_PLAYERS = new KList<>(); + private static final KList NO_ENTITIES = new KList<>(); private String name; private File worldFolder; private long seed; @@ -94,4 +98,13 @@ public class IrisWorld { Iris.error("This world is not real yet, cannot get spawn location! HEADLESS!"); return null; } + + public Collection getEntitiesByClass(Class t) { + if(hasRealWorld()) + { + return realWorld().getEntitiesByClass(t); + } + + return (KList) NO_ENTITIES; + } } From 465ceab271d8811ac751a61d78b09603bbfc3e15 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 18:50:07 -0400 Subject: [PATCH 022/137] Pregen fix but it needs to be recreated --- src/main/java/com/volmit/iris/core/gui/Pregenerator.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/volmit/iris/core/gui/Pregenerator.java b/src/main/java/com/volmit/iris/core/gui/Pregenerator.java index 83a24546c..19bce324f 100644 --- a/src/main/java/com/volmit/iris/core/gui/Pregenerator.java +++ b/src/main/java/com/volmit/iris/core/gui/Pregenerator.java @@ -250,7 +250,7 @@ public class Pregenerator implements Listener { method.set("Direct (Fast)"); mcaIteration.accept(mcaox, mcaoz, (ii, jj) -> e.queue(() -> { draw(ii, jj, COLOR_MCA_GENERATE); - access.directWriteChunk(world, ii, jj, directWriter); + access.directWriteChunk(access.getCompound().getWorld(), ii, jj, directWriter); draw(ii, jj, COLOR_MCA_GENERATED_MCA); generated.getAndIncrement(); vcax.set(ii); @@ -286,7 +286,7 @@ public class Pregenerator implements Listener { int finalJ = j; requeue.add(() -> { draw(((x << 5) + finalI), ((z << 5) + finalJ), COLOR_MCA_GENERATE); - access.directWriteChunk(world, ((x << 5) + finalI), ((z << 5) + finalJ), directWriter); + access.directWriteChunk(access.getCompound().getWorld(), ((x << 5) + finalI), ((z << 5) + finalJ), directWriter); draw(((x << 5) + finalI), ((z << 5) + finalJ), COLOR_MCA_GENERATED_MCA); }); } From 44cf7f733043393f5bea76218d7a4a65737ba1f6 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 18:50:33 -0400 Subject: [PATCH 023/137] Iris Project headless --- src/main/java/com/volmit/iris/core/IrisProject.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/volmit/iris/core/IrisProject.java b/src/main/java/com/volmit/iris/core/IrisProject.java index e300dd604..7f29c9f58 100644 --- a/src/main/java/com/volmit/iris/core/IrisProject.java +++ b/src/main/java/com/volmit/iris/core/IrisProject.java @@ -307,9 +307,9 @@ public class IrisProject { public void close() { activeProvider.close(); - File folder = activeProvider.getTarget().getWorld().getWorldFolder(); - Iris.linkMultiverseCore.removeFromConfig(activeProvider.getTarget().getWorld().getName()); - Bukkit.unloadWorld(activeProvider.getTarget().getWorld().getName(), false); + File folder = activeProvider.getTarget().getWorld().worldFolder(); + Iris.linkMultiverseCore.removeFromConfig(activeProvider.getTarget().getWorld().name()); + Bukkit.unloadWorld(activeProvider.getTarget().getWorld().name(), false); J.attemptAsync(() -> IO.delete(folder)); activeProvider = null; } From 7260e0d0f5d80ff1f71100535b16dcd96cc79dc4 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 18:50:53 -0400 Subject: [PATCH 024/137] Biome actuator headless --- .../java/com/volmit/iris/engine/actuator/IrisBiomeActuator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/volmit/iris/engine/actuator/IrisBiomeActuator.java b/src/main/java/com/volmit/iris/engine/actuator/IrisBiomeActuator.java index 5e9a9dd89..e69d2df0a 100644 --- a/src/main/java/com/volmit/iris/engine/actuator/IrisBiomeActuator.java +++ b/src/main/java/com/volmit/iris/engine/actuator/IrisBiomeActuator.java @@ -37,7 +37,7 @@ public class IrisBiomeActuator extends EngineAssignedActuator { public IrisBiomeActuator(Engine engine) { super(engine, "Biome"); - rng = new RNG(engine.getWorld().getSeed() + 243995); + rng = new RNG(engine.getWorld().seed() + 243995); } private boolean injectBiome(Hunk h, int x, int y, int z, Object bb) { From 2223405e799daf0fc44d03e1fd0d0d19bfef4ac6 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 18:54:42 -0400 Subject: [PATCH 025/137] Decorant support headless --- .../com/volmit/iris/engine/actuator/IrisDecorantActuator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/volmit/iris/engine/actuator/IrisDecorantActuator.java b/src/main/java/com/volmit/iris/engine/actuator/IrisDecorantActuator.java index 7ddde6c93..9ecc0a538 100644 --- a/src/main/java/com/volmit/iris/engine/actuator/IrisDecorantActuator.java +++ b/src/main/java/com/volmit/iris/engine/actuator/IrisDecorantActuator.java @@ -50,7 +50,7 @@ public class IrisDecorantActuator extends EngineAssignedActuator { public IrisDecorantActuator(Engine engine) { super(engine, "Decorant"); shouldRay = shouldRayDecorate(); - this.rng = new RNG(engine.getTarget().getWorld().getSeed()); + this.rng = new RNG(engine.getTarget().getWorld().seed()); surfaceDecorator = new IrisSurfaceDecorator(getEngine()); ceilingDecorator = new IrisCeilingDecorator(getEngine()); seaSurfaceDecorator = new IrisSeaSurfaceDecorator(getEngine()); From b4ddc8e5fcc3b900e16002dca56d63e8a9523ec0 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 18:54:55 -0400 Subject: [PATCH 026/137] Island experiment support headless --- .../volmit/iris/engine/actuator/IrisTerrainIslandActuator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/volmit/iris/engine/actuator/IrisTerrainIslandActuator.java b/src/main/java/com/volmit/iris/engine/actuator/IrisTerrainIslandActuator.java index ee92ad37c..3b1480b5b 100644 --- a/src/main/java/com/volmit/iris/engine/actuator/IrisTerrainIslandActuator.java +++ b/src/main/java/com/volmit/iris/engine/actuator/IrisTerrainIslandActuator.java @@ -45,7 +45,7 @@ public class IrisTerrainIslandActuator extends EngineAssignedActuator public IrisTerrainIslandActuator(Engine engine) { super(engine, "TerrainIsland"); - rng = new RNG(engine.getWorld().getSeed()); + rng = new RNG(engine.getWorld().seed()); carving = getDimension().isCarving() && getDimension().getCarveLayers().isNotEmpty(); hasUnder = getDimension().getUndercarriage() != null && !getDimension().getUndercarriage().getGenerator().isFlat(); } From a5ea58dbf7cec1be76fb7b79c7b1e2e6ffc9e1d0 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 18:55:25 -0400 Subject: [PATCH 027/137] Terrain actuator headless --- .../volmit/iris/engine/actuator/IrisTerrainNormalActuator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/volmit/iris/engine/actuator/IrisTerrainNormalActuator.java b/src/main/java/com/volmit/iris/engine/actuator/IrisTerrainNormalActuator.java index b06397c27..8638ffc3e 100644 --- a/src/main/java/com/volmit/iris/engine/actuator/IrisTerrainNormalActuator.java +++ b/src/main/java/com/volmit/iris/engine/actuator/IrisTerrainNormalActuator.java @@ -42,7 +42,7 @@ public class IrisTerrainNormalActuator extends EngineAssignedActuator public IrisTerrainNormalActuator(Engine engine) { super(engine, "Terrain"); - rng = new RNG(engine.getWorld().getSeed()); + rng = new RNG(engine.getWorld().seed()); carving = getDimension().isCarving() && getDimension().getCarveLayers().isNotEmpty(); hasUnder = getDimension().getUndercarriage() != null && !getDimension().getUndercarriage().getGenerator().isFlat(); } From 35106f5e67cd6893f05b18229e9d227c9554ab8a Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 18:55:40 -0400 Subject: [PATCH 028/137] Engine support headless --- src/main/java/com/volmit/iris/engine/IrisEngine.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/volmit/iris/engine/IrisEngine.java b/src/main/java/com/volmit/iris/engine/IrisEngine.java index cb66c1d98..bcfcf367c 100644 --- a/src/main/java/com/volmit/iris/engine/IrisEngine.java +++ b/src/main/java/com/volmit/iris/engine/IrisEngine.java @@ -88,7 +88,7 @@ public class IrisEngine extends BlockPopulator implements Engine { private double maxBiomeDecoratorDensity; public IrisEngine(EngineTarget target, EngineCompound compound, int index) { - Iris.info("Initializing Engine: " + target.getWorld().getName() + "/" + target.getDimension().getLoadKey() + " (" + target.getHeight() + " height)"); + Iris.info("Initializing Engine: " + target.getWorld().name() + "/" + target.getDimension().getLoadKey() + " (" + target.getHeight() + " height)"); metrics = new EngineMetrics(32); this.target = target; this.framework = new IrisEngineFramework(this); From fb8b5ac6b634294e7069576acc5ec7d1118cd55f Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 18:56:05 -0400 Subject: [PATCH 029/137] Compound headless mode --- src/main/java/com/volmit/iris/engine/IrisEngineCompound.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/volmit/iris/engine/IrisEngineCompound.java b/src/main/java/com/volmit/iris/engine/IrisEngineCompound.java index 2f932b1fc..36dac5f21 100644 --- a/src/main/java/com/volmit/iris/engine/IrisEngineCompound.java +++ b/src/main/java/com/volmit/iris/engine/IrisEngineCompound.java @@ -81,7 +81,7 @@ public class IrisEngineCompound implements EngineCompound { public IrisEngineCompound(IrisWorld world, IrisDimension rootDimension, IrisDataManager data, int maximumThreads) { wallClock = new AtomicRollingSequence(32); this.rootDimension = rootDimension; - Iris.info("Initializing Engine Composite for " + world.getName()); + Iris.info("Initializing Engine Composite for " + world.name()); this.world = world; engineMetadata = EngineData.load(getEngineMetadataFile()); engineMetadata.setDimension(rootDimension.getLoadKey()); @@ -209,7 +209,7 @@ public class IrisEngineCompound implements EngineCompound { } private File getEngineMetadataFile() { - return new File(world.getWorldFolder(), "iris/engine-metadata.json"); + return new File(world.worldFolder(), "iris/engine-metadata.json"); } @Override From 854b13782020e6c1c3ac12a457da2c02a19e7d2b Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 18:57:05 -0400 Subject: [PATCH 030/137] Fix wrong list for worlds --- .../java/com/volmit/iris/engine/object/common/IrisWorld.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/volmit/iris/engine/object/common/IrisWorld.java b/src/main/java/com/volmit/iris/engine/object/common/IrisWorld.java index d3d00b3d2..3d1f5b2c9 100644 --- a/src/main/java/com/volmit/iris/engine/object/common/IrisWorld.java +++ b/src/main/java/com/volmit/iris/engine/object/common/IrisWorld.java @@ -32,6 +32,7 @@ import org.bukkit.entity.Player; import java.io.File; import java.util.Collection; +import java.util.List; @Builder @Data @@ -68,7 +69,7 @@ public class IrisWorld { return realWorld != null; } - public Iterable getPlayers() { + public List getPlayers() { if(hasRealWorld()) { From f58f29389cb3c4ce72be2dcb716db1f0a7c08f56 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 18:58:16 -0400 Subject: [PATCH 031/137] Use IrisWorld instead of FakeWorld om World Creator --- .../java/com/volmit/iris/engine/IrisWorldCreator.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/volmit/iris/engine/IrisWorldCreator.java b/src/main/java/com/volmit/iris/engine/IrisWorldCreator.java index ce830b071..f9c23436a 100644 --- a/src/main/java/com/volmit/iris/engine/IrisWorldCreator.java +++ b/src/main/java/com/volmit/iris/engine/IrisWorldCreator.java @@ -21,6 +21,7 @@ package com.volmit.iris.engine; import com.volmit.iris.core.IrisDataManager; import com.volmit.iris.engine.framework.EngineCompositeGenerator; import com.volmit.iris.engine.object.IrisDimension; +import com.volmit.iris.engine.object.common.IrisWorld; import com.volmit.iris.util.fakenews.FakeWorld; import org.bukkit.World; import org.bukkit.WorldCreator; @@ -78,8 +79,14 @@ public class IrisWorldCreator { public WorldCreator create() { EngineCompositeGenerator g = new EngineCompositeGenerator(dimensionName, !studio); - g.initialize(new FakeWorld(name, minHeight, maxHeight, seed, new File(name), findEnvironment())); - + g.initialize(IrisWorld.builder() + .name(name) + .minHeight(minHeight) + .maxHeight(maxHeight) + .seed(seed) + .worldFolder(new File(name)) + .environment(findEnvironment()) + .build()); return new WorldCreator(name) .environment(findEnvironment()) .generateStructures(true) From 8c272ea0328db802399548f46e383c26f60dff75 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 18:58:36 -0400 Subject: [PATCH 032/137] Cave mod headless support --- .../java/com/volmit/iris/engine/modifier/IrisCaveModifier.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/volmit/iris/engine/modifier/IrisCaveModifier.java b/src/main/java/com/volmit/iris/engine/modifier/IrisCaveModifier.java index 8e2cd9644..1596152f1 100644 --- a/src/main/java/com/volmit/iris/engine/modifier/IrisCaveModifier.java +++ b/src/main/java/com/volmit/iris/engine/modifier/IrisCaveModifier.java @@ -43,7 +43,7 @@ public class IrisCaveModifier extends EngineAssignedModifier { public IrisCaveModifier(Engine engine) { super(engine, "Cave"); - rng = new RNG(engine.getWorld().getSeed() + 28934555); + rng = new RNG(engine.getWorld().seed() + 28934555); gg = new FastNoiseDouble(324895L * rng.nextParallelRNG(49678).imax()); } From 05259eb0d2fb2fc65da2575ec6b13ab66399f279 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 18:58:49 -0400 Subject: [PATCH 033/137] Deposit mod support headless --- .../com/volmit/iris/engine/modifier/IrisDepositModifier.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/volmit/iris/engine/modifier/IrisDepositModifier.java b/src/main/java/com/volmit/iris/engine/modifier/IrisDepositModifier.java index 623678fee..035e95383 100644 --- a/src/main/java/com/volmit/iris/engine/modifier/IrisDepositModifier.java +++ b/src/main/java/com/volmit/iris/engine/modifier/IrisDepositModifier.java @@ -36,7 +36,7 @@ public class IrisDepositModifier extends EngineAssignedModifier { public IrisDepositModifier(Engine engine) { super(engine, "Deposit"); - rng = new RNG(getEngine().getWorld().getSeed() + 12938).nextParallelRNG(28348777); + rng = new RNG(getEngine().getWorld().seed() + 12938).nextParallelRNG(28348777); } @Override From 078ac1abe41d771beccebbc788939951ec83af67 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 18:59:01 -0400 Subject: [PATCH 034/137] Post mod support headless --- .../java/com/volmit/iris/engine/modifier/IrisPostModifier.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/volmit/iris/engine/modifier/IrisPostModifier.java b/src/main/java/com/volmit/iris/engine/modifier/IrisPostModifier.java index 89aeaf6e7..67309d589 100644 --- a/src/main/java/com/volmit/iris/engine/modifier/IrisPostModifier.java +++ b/src/main/java/com/volmit/iris/engine/modifier/IrisPostModifier.java @@ -40,7 +40,7 @@ public class IrisPostModifier extends EngineAssignedModifier { public IrisPostModifier(Engine engine) { super(engine, "Post"); - rng = new RNG(getEngine().getWorld().getSeed() + 12938).nextParallelRNG(28348777); + rng = new RNG(getEngine().getWorld().seed() + 12938).nextParallelRNG(28348777); } @Override From 2bc27bd6f58c0a5ac8e385ea93b7e78970f37c5d Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 18:59:14 -0400 Subject: [PATCH 035/137] Ravine mod support headless --- .../com/volmit/iris/engine/modifier/IrisRavineModifier.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/volmit/iris/engine/modifier/IrisRavineModifier.java b/src/main/java/com/volmit/iris/engine/modifier/IrisRavineModifier.java index 25fcaa5ac..1fd82cdbb 100644 --- a/src/main/java/com/volmit/iris/engine/modifier/IrisRavineModifier.java +++ b/src/main/java/com/volmit/iris/engine/modifier/IrisRavineModifier.java @@ -41,7 +41,7 @@ public class IrisRavineModifier extends EngineAssignedModifier { public IrisRavineModifier(Engine engine) { super(engine, "Ravine"); - rng = new RNG(getEngine().getWorld().getSeed()).nextParallelRNG(29596878); + rng = new RNG(getEngine().getWorld().seed()).nextParallelRNG(29596878); cng = NoiseStyle.IRIS_THICK.create(rng); } From ab06365a81c98a56075d1681b21f490b09b765c7 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 18:59:48 -0400 Subject: [PATCH 036/137] Fix FakeEngine --- .../java/com/volmit/iris/util/fakenews/FakeEngine.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/volmit/iris/util/fakenews/FakeEngine.java b/src/main/java/com/volmit/iris/util/fakenews/FakeEngine.java index b6fb97c02..03f7c7c33 100644 --- a/src/main/java/com/volmit/iris/util/fakenews/FakeEngine.java +++ b/src/main/java/com/volmit/iris/util/fakenews/FakeEngine.java @@ -23,6 +23,7 @@ import com.volmit.iris.engine.IrisEngineFramework; import com.volmit.iris.engine.framework.*; import com.volmit.iris.engine.hunk.Hunk; import com.volmit.iris.engine.object.*; +import com.volmit.iris.engine.object.common.IrisWorld; import lombok.Getter; import org.bukkit.World; import org.bukkit.block.Biome; @@ -30,8 +31,6 @@ import org.bukkit.block.data.BlockData; public class FakeEngine implements Engine { - - @Getter private double maxBiomeObjectDensity; @@ -47,9 +46,9 @@ public class FakeEngine implements Engine { private final EngineFramework framework; @Getter - private final World world; + private final IrisWorld world; - public FakeEngine(IrisDimension dimension, FakeWorld world) { + public FakeEngine(IrisDimension dimension, IrisWorld world) { this.dimension = dimension; this.world = world; computeBiomeMaxes(); From 2f9658fa221e63003da1156172fee8a8f097f3c4 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 19:00:45 -0400 Subject: [PATCH 037/137] No More Fake News --- .../volmit/iris/util/fakenews/FakeEngine.java | 196 --- .../volmit/iris/util/fakenews/FakeWorld.java | 1214 ----------------- .../iris/util/fakenews/HeightedFakeWorld.java | 1200 ---------------- 3 files changed, 2610 deletions(-) delete mode 100644 src/main/java/com/volmit/iris/util/fakenews/FakeEngine.java delete mode 100644 src/main/java/com/volmit/iris/util/fakenews/FakeWorld.java delete mode 100644 src/main/java/com/volmit/iris/util/fakenews/HeightedFakeWorld.java diff --git a/src/main/java/com/volmit/iris/util/fakenews/FakeEngine.java b/src/main/java/com/volmit/iris/util/fakenews/FakeEngine.java deleted file mode 100644 index 03f7c7c33..000000000 --- a/src/main/java/com/volmit/iris/util/fakenews/FakeEngine.java +++ /dev/null @@ -1,196 +0,0 @@ -/* - * 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.util.fakenews; - -import com.volmit.iris.core.IrisDataManager; -import com.volmit.iris.engine.IrisEngineFramework; -import com.volmit.iris.engine.framework.*; -import com.volmit.iris.engine.hunk.Hunk; -import com.volmit.iris.engine.object.*; -import com.volmit.iris.engine.object.common.IrisWorld; -import lombok.Getter; -import org.bukkit.World; -import org.bukkit.block.Biome; -import org.bukkit.block.data.BlockData; - - -public class FakeEngine implements Engine { - @Getter - private double maxBiomeObjectDensity; - - @Getter - private double maxBiomeLayerDensity; - - @Getter - private double maxBiomeDecoratorDensity; - - @Getter - private final IrisDimension dimension; - - private final EngineFramework framework; - - @Getter - private final IrisWorld world; - - public FakeEngine(IrisDimension dimension, IrisWorld world) { - this.dimension = dimension; - this.world = world; - computeBiomeMaxes(); - this.framework = new IrisEngineFramework(this); - } - - private void computeBiomeMaxes() { - for (IrisBiome i : getDimension().getAllBiomes(this)) { - double density = 0; - - for (IrisObjectPlacement j : i.getObjects()) { - density += j.getDensity() * j.getChance(); - } - - maxBiomeObjectDensity = Math.max(maxBiomeObjectDensity, density); - density = 0; - - for (IrisDecorator j : i.getDecorators()) { - density += Math.max(j.getStackMax(), 1) * j.getChance(); - } - - maxBiomeDecoratorDensity = Math.max(maxBiomeDecoratorDensity, density); - density = 0; - - for (IrisBiomePaletteLayer j : i.getLayers()) { - density++; - } - - maxBiomeLayerDensity = Math.max(maxBiomeLayerDensity, density); - } - } - - @Override - public void close() { - } - - @Override - public boolean isClosed() { - return false; - } - - @Override - public IrisDataManager getData() { - return dimension.getLoader().copy(); - } - - @Override - public EngineWorldManager getWorldManager() { - return null; - } - - @Override - public void setParallelism(int parallelism) { - } - - @Override - public int getParallelism() { - return 0; - } - - @Override - public EngineTarget getTarget() { - return null; - } - - @Override - public EngineFramework getFramework() { - return null; - } - - @Override - public void setMinHeight(int min) { - } - - @Override - public void recycle() { - } - - @Override - public int getIndex() { - return 0; - } - - @Override - public int getMinHeight() { - return 0; - } - - @Override - public int getHeight() { - return 64; - } - - @Override - public double modifyX(double x) { - return 0; - } - - @Override - public double modifyZ(double z) { - return 0; - } - - @Override - public void generate(int x, int z, Hunk blocks, Hunk biomes) { - } - - @Override - public EngineMetrics getMetrics() { - return null; - } - - @Override - public EngineEffects getEffects() { - return null; - } - - @Override - public EngineCompound getCompound() { - return null; - } - - @Override - public IrisBiome getFocus() { - return null; - } - - @Override - public void fail(String error, Throwable e) { - } - - @Override - public boolean hasFailed() { - return false; - } - - @Override - public int getCacheID() { - return 0; - } - - @Override - public void hotload() { - } -} diff --git a/src/main/java/com/volmit/iris/util/fakenews/FakeWorld.java b/src/main/java/com/volmit/iris/util/fakenews/FakeWorld.java deleted file mode 100644 index a86b67185..000000000 --- a/src/main/java/com/volmit/iris/util/fakenews/FakeWorld.java +++ /dev/null @@ -1,1214 +0,0 @@ -/* - * 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.util.fakenews; - -import lombok.Setter; -import org.bukkit.*; -import org.bukkit.block.Biome; -import org.bukkit.block.Block; -import org.bukkit.block.data.BlockData; -import org.bukkit.boss.DragonBattle; -import org.bukkit.entity.*; -import org.bukkit.generator.BlockPopulator; -import org.bukkit.generator.ChunkGenerator; -import org.bukkit.inventory.ItemStack; -import org.bukkit.material.MaterialData; -import org.bukkit.metadata.MetadataValue; -import org.bukkit.plugin.Plugin; -import org.bukkit.util.BoundingBox; -import org.bukkit.util.Consumer; -import org.bukkit.util.RayTraceResult; -import org.bukkit.util.Vector; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.io.File; -import java.util.*; -import java.util.function.Predicate; - -@SuppressWarnings("deprecation") -public class FakeWorld implements World { - private final int height; - private final int minHeight; - private final long seed; - private final File worldFolder; - private final Environment environment; - @Setter - private String worldName; - - public FakeWorld(String name, int minHeight, int height, long seed, File worldFolder, Environment environment) { - this.worldName = name; - this.height = height; - this.seed = seed; - this.worldFolder = worldFolder; - this.minHeight = minHeight; - this.environment = environment; - worldFolder.mkdirs(); - } - - @Override - public void sendPluginMessage(@NotNull Plugin source, @NotNull String channel, @NotNull byte[] message) { - - } - - @NotNull - @Override - public Set getListeningPluginChannels() { - - return null; - } - - @Override - public void setMetadata(@NotNull String metadataKey, @NotNull MetadataValue newMetadataValue) { - - } - - @NotNull - @Override - public List getMetadata(@NotNull String metadataKey) { - - return null; - } - - @Override - public boolean hasMetadata(@NotNull String metadataKey) { - - return false; - } - - @Override - public void removeMetadata(@NotNull String metadataKey, @NotNull Plugin owningPlugin) { - - } - - @NotNull - @Override - public Block getBlockAt(int x, int y, int z) { - - return null; - } - - @NotNull - @Override - public Block getBlockAt(@NotNull Location location) { - - return null; - } - - @Override - public int getHighestBlockYAt(int x, int z) { - - return 0; - } - - @Override - public int getHighestBlockYAt(@NotNull Location location) { - - return 0; - } - - @NotNull - @Override - public Block getHighestBlockAt(int x, int z) { - - return null; - } - - @NotNull - @Override - public Block getHighestBlockAt(@NotNull Location location) { - - return null; - } - - @Override - public int getHighestBlockYAt(int x, int z, @NotNull HeightMap heightMap) { - - return 0; - } - - @Override - public int getHighestBlockYAt(@NotNull Location location, @NotNull HeightMap heightMap) { - - return 0; - } - - @NotNull - @Override - public Block getHighestBlockAt(int x, int z, @NotNull HeightMap heightMap) { - - return null; - } - - @NotNull - @Override - public Block getHighestBlockAt(@NotNull Location location, @NotNull HeightMap heightMap) { - - return null; - } - - @NotNull - @Override - public Chunk getChunkAt(int x, int z) { - - return null; - } - - @NotNull - @Override - public Chunk getChunkAt(@NotNull Location location) { - - return null; - } - - @NotNull - @Override - public Chunk getChunkAt(@NotNull Block block) { - - return null; - } - - @Override - public boolean isChunkLoaded(@NotNull Chunk chunk) { - - return false; - } - - @NotNull - @Override - public Chunk[] getLoadedChunks() { - - return null; - } - - @Override - public void loadChunk(@NotNull Chunk chunk) { - - } - - @Override - public boolean isChunkLoaded(int x, int z) { - - return false; - } - - @Override - public boolean isChunkGenerated(int x, int z) { - - return false; - } - - @Override - public boolean isChunkInUse(int x, int z) { - - return false; - } - - @Override - public void loadChunk(int x, int z) { - - } - - @Override - public boolean loadChunk(int x, int z, boolean generate) { - - return false; - } - - @Override - public boolean unloadChunk(@NotNull Chunk chunk) { - - return false; - } - - @Override - public boolean unloadChunk(int x, int z) { - - return false; - } - - @Override - public boolean unloadChunk(int x, int z, boolean save) { - - return false; - } - - @Override - public boolean unloadChunkRequest(int x, int z) { - - return false; - } - - @Override - public boolean regenerateChunk(int x, int z) { - - return false; - } - - @Override - public boolean refreshChunk(int x, int z) { - - return false; - } - - @Override - public boolean isChunkForceLoaded(int x, int z) { - - return false; - } - - @Override - public void setChunkForceLoaded(int x, int z, boolean forced) { - - } - - @NotNull - @Override - public Collection getForceLoadedChunks() { - - return null; - } - - @Override - public boolean addPluginChunkTicket(int x, int z, @NotNull Plugin plugin) { - - return false; - } - - @Override - public boolean removePluginChunkTicket(int x, int z, @NotNull Plugin plugin) { - - return false; - } - - @Override - public void removePluginChunkTickets(@NotNull Plugin plugin) { - - } - - @NotNull - @Override - public Collection getPluginChunkTickets(int x, int z) { - - return null; - } - - @NotNull - @Override - public Map> getPluginChunkTickets() { - - return null; - } - - @NotNull - @Override - public Item dropItem(@NotNull Location location, @NotNull ItemStack item) { - - return null; - } - - @NotNull - @Override - public Item dropItem(@NotNull Location location, @NotNull ItemStack itemStack, @Nullable Consumer consumer) { - return null; - } - - @NotNull - @Override - public Item dropItemNaturally(@NotNull Location location, @NotNull ItemStack item) { - - return null; - } - - @NotNull - @Override - public Item dropItemNaturally(@NotNull Location location, @NotNull ItemStack itemStack, @Nullable Consumer consumer) { - return null; - } - - @NotNull - @Override - public Arrow spawnArrow(@NotNull Location location, @NotNull Vector direction, float speed, float spread) { - - return null; - } - - @NotNull - @Override - public T spawnArrow(@NotNull Location location, @NotNull Vector direction, float speed, float spread, @NotNull Class clazz) { - - return null; - } - - @Override - public boolean generateTree(@NotNull Location location, @NotNull TreeType type) { - - return false; - } - - @Override - public boolean generateTree(@NotNull Location loc, @NotNull TreeType type, @NotNull BlockChangeDelegate delegate) { - - return false; - } - - @NotNull - @Override - public Entity spawnEntity(@NotNull Location loc, @NotNull EntityType type) { - - return null; - } - - @NotNull - @Override - public LightningStrike strikeLightning(@NotNull Location loc) { - - return null; - } - - @NotNull - @Override - public LightningStrike strikeLightningEffect(@NotNull Location loc) { - - return null; - } - - @NotNull - @Override - public List getEntities() { - - return null; - } - - @NotNull - @Override - public List getLivingEntities() { - - return null; - } - - @NotNull - @SuppressWarnings({"RedundantSuppression", "unchecked"}) - @Override - public Collection getEntitiesByClass(@NotNull @SuppressWarnings("unchecked") Class... classes) { - - return null; - } - - @NotNull - @Override - public Collection getEntitiesByClass(@NotNull Class cls) { - - return null; - } - - @NotNull - @Override - public Collection getEntitiesByClasses(@NotNull Class... classes) { - - return null; - } - - @NotNull - @Override - public List getPlayers() { - - return null; - } - - @NotNull - @Override - public Collection getNearbyEntities(@NotNull Location location, double x, double y, double z) { - - return null; - } - - @NotNull - @Override - public Collection getNearbyEntities(@NotNull Location location, double x, double y, double z, Predicate filter) { - - return null; - } - - @NotNull - @Override - public Collection getNearbyEntities(@NotNull BoundingBox boundingBox) { - - return null; - } - - @NotNull - @Override - public Collection getNearbyEntities(@NotNull BoundingBox boundingBox, Predicate filter) { - - return null; - } - - @Override - public RayTraceResult rayTraceEntities(@NotNull Location start, @NotNull Vector direction, double maxDistance) { - - return null; - } - - @Override - public RayTraceResult rayTraceEntities(@NotNull Location start, @NotNull Vector direction, double maxDistance, double raySize) { - - return null; - } - - @Override - public RayTraceResult rayTraceEntities(@NotNull Location start, @NotNull Vector direction, double maxDistance, Predicate filter) { - - return null; - } - - @Override - public RayTraceResult rayTraceEntities(@NotNull Location start, @NotNull Vector direction, double maxDistance, double raySize, Predicate filter) { - - return null; - } - - @Override - public RayTraceResult rayTraceBlocks(@NotNull Location start, @NotNull Vector direction, double maxDistance) { - - return null; - } - - @Override - public RayTraceResult rayTraceBlocks(@NotNull Location start, @NotNull Vector direction, double maxDistance, @NotNull FluidCollisionMode fluidCollisionMode) { - - return null; - } - - @Override - public RayTraceResult rayTraceBlocks(@NotNull Location start, @NotNull Vector direction, double maxDistance, @NotNull FluidCollisionMode fluidCollisionMode, boolean ignorePassableBlocks) { - - return null; - } - - @Override - public RayTraceResult rayTrace(@NotNull Location start, @NotNull Vector direction, double maxDistance, @NotNull FluidCollisionMode fluidCollisionMode, boolean ignorePassableBlocks, double raySize, Predicate filter) { - - return null; - } - - @NotNull - @Override - public String getName() { - - return worldName; - } - - @NotNull - @Override - public UUID getUID() { - - return null; - } - - @NotNull - @Override - public Location getSpawnLocation() { - - return null; - } - - @Override - public boolean setSpawnLocation(@NotNull Location location) { - - return false; - } - - @Override - public boolean setSpawnLocation(int i, int i1, int i2, float v) { - return false; - } - - @Override - public boolean setSpawnLocation(int x, int y, int z) { - - return false; - } - - @Override - public long getTime() { - - return 0; - } - - @Override - public void setTime(long time) { - - } - - @Override - public long getFullTime() { - - return 0; - } - - @Override - public void setFullTime(long time) { - - } - - @Override - public long getGameTime() { - return 0; - } - - @Override - public boolean hasStorm() { - - return false; - } - - @Override - public void setStorm(boolean hasStorm) { - - } - - @Override - public int getWeatherDuration() { - - return 0; - } - - @Override - public void setWeatherDuration(int duration) { - - } - - @Override - public boolean isThundering() { - - return false; - } - - @Override - public void setThundering(boolean thundering) { - - } - - @Override - public int getThunderDuration() { - - return 0; - } - - @Override - public void setThunderDuration(int duration) { - - } - - @Override - public boolean isClearWeather() { - return false; - } - - @Override - public void setClearWeatherDuration(int i) { - - } - - @Override - public int getClearWeatherDuration() { - return 0; - } - - @Override - public boolean createExplosion(double x, double y, double z, float power) { - - return false; - } - - @Override - public boolean createExplosion(double x, double y, double z, float power, boolean setFire) { - - return false; - } - - @Override - public boolean createExplosion(double x, double y, double z, float power, boolean setFire, boolean breakBlocks) { - - return false; - } - - @Override - public boolean createExplosion(double x, double y, double z, float power, boolean setFire, boolean breakBlocks, Entity source) { - - return false; - } - - @Override - public boolean createExplosion(@NotNull Location loc, float power) { - - return false; - } - - @Override - public boolean createExplosion(@NotNull Location loc, float power, boolean setFire) { - - return false; - } - - @Override - public boolean createExplosion(@NotNull Location loc, float power, boolean setFire, boolean breakBlocks) { - - return false; - } - - @Override - public boolean createExplosion(@NotNull Location loc, float power, boolean setFire, boolean breakBlocks, Entity source) { - - return false; - } - - @NotNull - @Override - public Environment getEnvironment() { - - return environment; - } - - @Override - public long getSeed() { - - return seed; - } - - @Override - public boolean getPVP() { - - return false; - } - - @Override - public void setPVP(boolean pvp) { - - } - - @Override - public ChunkGenerator getGenerator() { - - return null; - } - - @Override - public void save() { - - } - - @NotNull - @Override - public List getPopulators() { - - return null; - } - - @NotNull - @Override - public T spawn(@NotNull Location location, @NotNull Class clazz) throws IllegalArgumentException { - - return null; - } - - @NotNull - @Override - public T spawn(@NotNull Location location, @NotNull Class clazz, Consumer function) throws IllegalArgumentException { - - return null; - } - - @NotNull - @Override - public FallingBlock spawnFallingBlock(@NotNull Location location, @NotNull MaterialData data) throws IllegalArgumentException { - - return null; - } - - @NotNull - @Override - public FallingBlock spawnFallingBlock(@NotNull Location location, @NotNull BlockData data) throws IllegalArgumentException { - - return null; - } - - @NotNull - @Override - public FallingBlock spawnFallingBlock(@NotNull Location location, @NotNull Material material, byte data) throws IllegalArgumentException { - - return null; - } - - @Override - public void playEffect(@NotNull Location location, @NotNull Effect effect, int data) { - - } - - @Override - public void playEffect(@NotNull Location location, @NotNull Effect effect, int data, int radius) { - - } - - @Override - public void playEffect(@NotNull Location location, @NotNull Effect effect, T data) { - - } - - @Override - public void playEffect(@NotNull Location location, @NotNull Effect effect, T data, int radius) { - - } - - @NotNull - @Override - public ChunkSnapshot getEmptyChunkSnapshot(int x, int z, boolean includeBiome, boolean includeBiomeTemp) { - - return null; - } - - @Override - public void setSpawnFlags(boolean allowMonsters, boolean allowAnimals) { - - } - - @Override - public boolean getAllowAnimals() { - - return false; - } - - @Override - public boolean getAllowMonsters() { - - return false; - } - - @NotNull - @Override - public Biome getBiome(int x, int z) { - - return null; - } - - @NotNull - @Override - public Biome getBiome(int x, int y, int z) { - - return null; - } - - @Override - public void setBiome(int x, int z, @NotNull Biome bio) { - - } - - @Override - public void setBiome(int x, int y, int z, @NotNull Biome bio) { - - } - - @Override - public double getTemperature(int x, int z) { - - return 0; - } - - @Override - public double getTemperature(int x, int y, int z) { - - return 0; - } - - @Override - public double getHumidity(int x, int z) { - - return 0; - } - - @Override - public double getHumidity(int x, int y, int z) { - - return 0; - } - - @Override - public int getMinHeight() { - return minHeight; - } - - @Override - public int getMaxHeight() { - - return height; - } - - @Override - public int getSeaLevel() { - - return 0; - } - - @Override - public boolean getKeepSpawnInMemory() { - - return false; - } - - @Override - public void setKeepSpawnInMemory(boolean keepLoaded) { - - } - - @Override - public boolean isAutoSave() { - - return false; - } - - @Override - public void setAutoSave(boolean value) { - - } - - @Override - public void setDifficulty(@NotNull Difficulty difficulty) { - - } - - @NotNull - @Override - public Difficulty getDifficulty() { - - return null; - } - - @NotNull - @Override - public File getWorldFolder() { - - return worldFolder; - } - - @Override - public WorldType getWorldType() { - - return null; - } - - @Override - public boolean canGenerateStructures() { - - return false; - } - - @Override - public boolean isHardcore() { - - return false; - } - - @Override - public void setHardcore(boolean hardcore) { - - } - - @Override - public long getTicksPerAnimalSpawns() { - - return 0; - } - - @Override - public void setTicksPerAnimalSpawns(int ticksPerAnimalSpawns) { - - } - - @Override - public long getTicksPerMonsterSpawns() { - - return 0; - } - - @Override - public void setTicksPerMonsterSpawns(int ticksPerMonsterSpawns) { - - } - - @Override - public long getTicksPerWaterSpawns() { - - return 0; - } - - @Override - public void setTicksPerWaterSpawns(int ticksPerWaterSpawns) { - - } - - @Override - public long getTicksPerWaterAmbientSpawns() { - - return 0; - } - - @Override - public void setTicksPerWaterAmbientSpawns(int ticksPerAmbientSpawns) { - - } - - @Override - public long getTicksPerAmbientSpawns() { - - return 0; - } - - @Override - public void setTicksPerAmbientSpawns(int ticksPerAmbientSpawns) { - - } - - @Override - public int getMonsterSpawnLimit() { - - return 0; - } - - @Override - public void setMonsterSpawnLimit(int limit) { - - } - - @Override - public int getAnimalSpawnLimit() { - - return 0; - } - - @Override - public void setAnimalSpawnLimit(int limit) { - - } - - @Override - public int getWaterAnimalSpawnLimit() { - - return 0; - } - - @Override - public void setWaterAnimalSpawnLimit(int limit) { - - } - - @Override - public int getWaterAmbientSpawnLimit() { - - return 0; - } - - @Override - public void setWaterAmbientSpawnLimit(int limit) { - - } - - @Override - public int getAmbientSpawnLimit() { - - return 0; - } - - @Override - public void setAmbientSpawnLimit(int limit) { - - } - - @Override - public void playSound(@NotNull Location location, @NotNull Sound sound, float volume, float pitch) { - - } - - @Override - public void playSound(@NotNull Location location, @NotNull String sound, float volume, float pitch) { - - } - - @Override - public void playSound(@NotNull Location location, @NotNull Sound sound, @NotNull SoundCategory category, float volume, float pitch) { - - } - - @Override - public void playSound(@NotNull Location location, @NotNull String sound, @NotNull SoundCategory category, float volume, float pitch) { - - } - - @NotNull - @Override - public String[] getGameRules() { - - return null; - } - - @Override - public String getGameRuleValue(String rule) { - - return null; - } - - @Override - public boolean setGameRuleValue(@NotNull String rule, @NotNull String value) { - - return false; - } - - @Override - public boolean isGameRule(@NotNull String rule) { - - return false; - } - - @Override - public T getGameRuleValue(@NotNull GameRule rule) { - - return null; - } - - @Override - public T getGameRuleDefault(@NotNull GameRule rule) { - - return null; - } - - @Override - public boolean setGameRule(@NotNull GameRule rule, @NotNull T newValue) { - - return false; - } - - @NotNull - @Override - public WorldBorder getWorldBorder() { - - return null; - } - - @Override - public void spawnParticle(@NotNull Particle particle, @NotNull Location location, int count) { - - } - - @Override - public void spawnParticle(@NotNull Particle particle, double x, double y, double z, int count) { - - } - - @Override - public void spawnParticle(@NotNull Particle particle, @NotNull Location location, int count, T data) { - - } - - @Override - public void spawnParticle(@NotNull Particle particle, double x, double y, double z, int count, T data) { - - } - - @Override - public void spawnParticle(@NotNull Particle particle, @NotNull Location location, int count, double offsetX, double offsetY, double offsetZ) { - - } - - @Override - public void spawnParticle(@NotNull Particle particle, double x, double y, double z, int count, double offsetX, double offsetY, double offsetZ) { - - } - - @Override - public void spawnParticle(@NotNull Particle particle, @NotNull Location location, int count, double offsetX, double offsetY, double offsetZ, T data) { - - } - - @Override - public void spawnParticle(@NotNull Particle particle, double x, double y, double z, int count, double offsetX, double offsetY, double offsetZ, T data) { - - } - - @Override - public void spawnParticle(@NotNull Particle particle, @NotNull Location location, int count, double offsetX, double offsetY, double offsetZ, double extra) { - - } - - @Override - public void spawnParticle(@NotNull Particle particle, double x, double y, double z, int count, double offsetX, double offsetY, double offsetZ, double extra) { - - } - - @Override - public void spawnParticle(@NotNull Particle particle, @NotNull Location location, int count, double offsetX, double offsetY, double offsetZ, double extra, T data) { - - } - - @Override - public void spawnParticle(@NotNull Particle particle, double x, double y, double z, int count, double offsetX, double offsetY, double offsetZ, double extra, T data) { - - } - - @Override - public void spawnParticle(@NotNull Particle particle, @NotNull Location location, int count, double offsetX, double offsetY, double offsetZ, double extra, T data, boolean force) { - - } - - @Override - public void spawnParticle(@NotNull Particle particle, double x, double y, double z, int count, double offsetX, double offsetY, double offsetZ, double extra, T data, boolean force) { - - } - - @Override - public Location locateNearestStructure(@NotNull Location origin, @NotNull StructureType structureType, int radius, boolean findUnexplored) { - return null; - } - - @Override - public int getViewDistance() { - return 0; - } - - @NotNull - @Override - public Spigot spigot() { - return null; - } - - @Override - public Raid locateNearestRaid(@NotNull Location location, int radius) { - return null; - } - - @NotNull - @Override - public List getRaids() { - return null; - } - - @Override - public DragonBattle getEnderDragonBattle() { - return null; - } -} diff --git a/src/main/java/com/volmit/iris/util/fakenews/HeightedFakeWorld.java b/src/main/java/com/volmit/iris/util/fakenews/HeightedFakeWorld.java deleted file mode 100644 index 8176f0cb9..000000000 --- a/src/main/java/com/volmit/iris/util/fakenews/HeightedFakeWorld.java +++ /dev/null @@ -1,1200 +0,0 @@ -/* - * 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.util.fakenews; - -import org.bukkit.*; -import org.bukkit.block.Biome; -import org.bukkit.block.Block; -import org.bukkit.block.data.BlockData; -import org.bukkit.boss.DragonBattle; -import org.bukkit.entity.*; -import org.bukkit.generator.BlockPopulator; -import org.bukkit.generator.ChunkGenerator; -import org.bukkit.inventory.ItemStack; -import org.bukkit.material.MaterialData; -import org.bukkit.metadata.MetadataValue; -import org.bukkit.plugin.Plugin; -import org.bukkit.util.BoundingBox; -import org.bukkit.util.Consumer; -import org.bukkit.util.RayTraceResult; -import org.bukkit.util.Vector; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.io.File; -import java.util.*; -import java.util.function.Predicate; - -@SuppressWarnings({"deprecation", "ClassCanBeRecord", "unchecked"}) -public class HeightedFakeWorld implements World { - private final int height; - - public HeightedFakeWorld(int height) { - this.height = height; - } - - @Override - public void sendPluginMessage(@NotNull Plugin source, @NotNull String channel, @NotNull byte[] message) { - - } - - @NotNull - @Override - public Set getListeningPluginChannels() { - - return null; - } - - @Override - public void setMetadata(@NotNull String metadataKey, @NotNull MetadataValue newMetadataValue) { - - } - - @NotNull - @Override - public List getMetadata(@NotNull String metadataKey) { - - return null; - } - - @Override - public boolean hasMetadata(@NotNull String metadataKey) { - - return false; - } - - @Override - public void removeMetadata(@NotNull String metadataKey, @NotNull Plugin owningPlugin) { - - } - - @NotNull - @Override - public Block getBlockAt(int x, int y, int z) { - - return null; - } - - @NotNull - @Override - public Block getBlockAt(@NotNull Location location) { - - return null; - } - - @Override - public int getHighestBlockYAt(int x, int z) { - - return 0; - } - - @Override - public int getHighestBlockYAt(@NotNull Location location) { - - return 0; - } - - @NotNull - @Override - public Block getHighestBlockAt(int x, int z) { - - return null; - } - - @NotNull - @Override - public Block getHighestBlockAt(@NotNull Location location) { - - return null; - } - - @Override - public int getHighestBlockYAt(int x, int z, @NotNull HeightMap heightMap) { - - return 0; - } - - @Override - public int getHighestBlockYAt(@NotNull Location location, @NotNull HeightMap heightMap) { - - return 0; - } - - @NotNull - @Override - public Block getHighestBlockAt(int x, int z, @NotNull HeightMap heightMap) { - - return null; - } - - @NotNull - @Override - public Block getHighestBlockAt(@NotNull Location location, @NotNull HeightMap heightMap) { - - return null; - } - - @NotNull - @Override - public Chunk getChunkAt(int x, int z) { - - return null; - } - - @NotNull - @Override - public Chunk getChunkAt(@NotNull Location location) { - - return null; - } - - @NotNull - @Override - public Chunk getChunkAt(@NotNull Block block) { - - return null; - } - - @Override - public boolean isChunkLoaded(@NotNull Chunk chunk) { - - return false; - } - - @NotNull - @Override - public Chunk[] getLoadedChunks() { - - return null; - } - - @Override - public void loadChunk(@NotNull Chunk chunk) { - - } - - @Override - public boolean isChunkLoaded(int x, int z) { - - return false; - } - - @Override - public boolean isChunkGenerated(int x, int z) { - - return false; - } - - @Override - public boolean isChunkInUse(int x, int z) { - - return false; - } - - @Override - public void loadChunk(int x, int z) { - - } - - @Override - public boolean loadChunk(int x, int z, boolean generate) { - - return false; - } - - @Override - public boolean unloadChunk(@NotNull Chunk chunk) { - - return false; - } - - @Override - public boolean unloadChunk(int x, int z) { - - return false; - } - - @Override - public boolean unloadChunk(int x, int z, boolean save) { - - return false; - } - - @Override - public boolean unloadChunkRequest(int x, int z) { - - return false; - } - - @Override - public boolean regenerateChunk(int x, int z) { - - return false; - } - - @Override - public boolean refreshChunk(int x, int z) { - - return false; - } - - @Override - public boolean isChunkForceLoaded(int x, int z) { - - return false; - } - - @Override - public void setChunkForceLoaded(int x, int z, boolean forced) { - - } - - @NotNull - @Override - public Collection getForceLoadedChunks() { - - return null; - } - - @Override - public boolean addPluginChunkTicket(int x, int z, @NotNull Plugin plugin) { - - return false; - } - - @Override - public boolean removePluginChunkTicket(int x, int z, @NotNull Plugin plugin) { - - return false; - } - - @Override - public void removePluginChunkTickets(@NotNull Plugin plugin) { - - } - - @NotNull - @Override - public Collection getPluginChunkTickets(int x, int z) { - - return null; - } - - @NotNull - @Override - public Map> getPluginChunkTickets() { - - return null; - } - - @NotNull - @Override - public Item dropItem(@NotNull Location location, @NotNull ItemStack item) { - - return null; - } - - @NotNull - @Override - public Item dropItem(@NotNull Location location, @NotNull ItemStack itemStack, @Nullable Consumer consumer) { - return null; - } - - @NotNull - @Override - public Item dropItemNaturally(@NotNull Location location, @NotNull ItemStack item) { - - return null; - } - - @NotNull - @Override - public Item dropItemNaturally(@NotNull Location location, @NotNull ItemStack itemStack, @Nullable Consumer consumer) { - return null; - } - - @NotNull - @Override - public Arrow spawnArrow(@NotNull Location location, @NotNull Vector direction, float speed, float spread) { - - return null; - } - - @NotNull - @Override - public T spawnArrow(@NotNull Location location, @NotNull Vector direction, float speed, float spread, @NotNull Class clazz) { - - return null; - } - - @Override - public boolean generateTree(@NotNull Location location, @NotNull TreeType type) { - - return false; - } - - @Override - public boolean generateTree(@NotNull Location loc, @NotNull TreeType type, @NotNull BlockChangeDelegate delegate) { - - return false; - } - - @NotNull - @Override - public Entity spawnEntity(@NotNull Location loc, @NotNull EntityType type) { - - return null; - } - - @NotNull - @Override - public LightningStrike strikeLightning(@NotNull Location loc) { - - return null; - } - - @NotNull - @Override - public LightningStrike strikeLightningEffect(@NotNull Location loc) { - - return null; - } - - @NotNull - @Override - public List getEntities() { - - return null; - } - - @NotNull - @Override - public List getLivingEntities() { - - return null; - } - - @NotNull - @Override - public Collection getEntitiesByClass(@NotNull Class... classes) { - - return null; - } - - @NotNull - @Override - public Collection getEntitiesByClass(@NotNull Class cls) { - - return null; - } - - @NotNull - @Override - public Collection getEntitiesByClasses(@NotNull Class... classes) { - - return null; - } - - @NotNull - @Override - public List getPlayers() { - - return null; - } - - @NotNull - @Override - public Collection getNearbyEntities(@NotNull Location location, double x, double y, double z) { - - return null; - } - - @NotNull - @Override - public Collection getNearbyEntities(@NotNull Location location, double x, double y, double z, Predicate filter) { - - return null; - } - - @NotNull - @Override - public Collection getNearbyEntities(@NotNull BoundingBox boundingBox) { - - return null; - } - - @NotNull - @Override - public Collection getNearbyEntities(@NotNull BoundingBox boundingBox, Predicate filter) { - - return null; - } - - @Override - public RayTraceResult rayTraceEntities(@NotNull Location start, @NotNull Vector direction, double maxDistance) { - - return null; - } - - @Override - public RayTraceResult rayTraceEntities(@NotNull Location start, @NotNull Vector direction, double maxDistance, double raySize) { - - return null; - } - - @Override - public RayTraceResult rayTraceEntities(@NotNull Location start, @NotNull Vector direction, double maxDistance, Predicate filter) { - - return null; - } - - @Override - public RayTraceResult rayTraceEntities(@NotNull Location start, @NotNull Vector direction, double maxDistance, double raySize, Predicate filter) { - - return null; - } - - @Override - public RayTraceResult rayTraceBlocks(@NotNull Location start, @NotNull Vector direction, double maxDistance) { - - return null; - } - - @Override - public RayTraceResult rayTraceBlocks(@NotNull Location start, @NotNull Vector direction, double maxDistance, @NotNull FluidCollisionMode fluidCollisionMode) { - - return null; - } - - @Override - public RayTraceResult rayTraceBlocks(@NotNull Location start, @NotNull Vector direction, double maxDistance, @NotNull FluidCollisionMode fluidCollisionMode, boolean ignorePassableBlocks) { - - return null; - } - - @Override - public RayTraceResult rayTrace(@NotNull Location start, @NotNull Vector direction, double maxDistance, @NotNull FluidCollisionMode fluidCollisionMode, boolean ignorePassableBlocks, double raySize, Predicate filter) { - - return null; - } - - @NotNull - @Override - public String getName() { - - return null; - } - - @NotNull - @Override - public UUID getUID() { - - return null; - } - - @NotNull - @Override - public Location getSpawnLocation() { - - return null; - } - - @Override - public boolean setSpawnLocation(@NotNull Location location) { - - return false; - } - - @Override - public boolean setSpawnLocation(int i, int i1, int i2, float v) { - return false; - } - - @Override - public boolean setSpawnLocation(int x, int y, int z) { - - return false; - } - - @Override - public long getTime() { - - return 0; - } - - @Override - public void setTime(long time) { - - } - - @Override - public long getFullTime() { - - return 0; - } - - @Override - public void setFullTime(long time) { - - } - - @Override - public long getGameTime() { - return 0; - } - - @Override - public boolean hasStorm() { - - return false; - } - - @Override - public void setStorm(boolean hasStorm) { - - } - - @Override - public int getWeatherDuration() { - - return 0; - } - - @Override - public void setWeatherDuration(int duration) { - - } - - @Override - public boolean isThundering() { - - return false; - } - - @Override - public void setThundering(boolean thundering) { - - } - - @Override - public int getThunderDuration() { - - return 0; - } - - @Override - public void setThunderDuration(int duration) { - - } - - @Override - public boolean isClearWeather() { - return false; - } - - @Override - public void setClearWeatherDuration(int i) { - - } - - @Override - public int getClearWeatherDuration() { - return 0; - } - - @Override - public boolean createExplosion(double x, double y, double z, float power) { - - return false; - } - - @Override - public boolean createExplosion(double x, double y, double z, float power, boolean setFire) { - - return false; - } - - @Override - public boolean createExplosion(double x, double y, double z, float power, boolean setFire, boolean breakBlocks) { - - return false; - } - - @Override - public boolean createExplosion(double x, double y, double z, float power, boolean setFire, boolean breakBlocks, Entity source) { - - return false; - } - - @Override - public boolean createExplosion(@NotNull Location loc, float power) { - - return false; - } - - @Override - public boolean createExplosion(@NotNull Location loc, float power, boolean setFire) { - - return false; - } - - @Override - public boolean createExplosion(@NotNull Location loc, float power, boolean setFire, boolean breakBlocks) { - - return false; - } - - @Override - public boolean createExplosion(@NotNull Location loc, float power, boolean setFire, boolean breakBlocks, Entity source) { - - return false; - } - - @NotNull - @Override - public Environment getEnvironment() { - - return null; - } - - @Override - public long getSeed() { - - return 0; - } - - @Override - public boolean getPVP() { - - return false; - } - - @Override - public void setPVP(boolean pvp) { - - } - - @Override - public ChunkGenerator getGenerator() { - - return null; - } - - @Override - public void save() { - - } - - @NotNull - @Override - public List getPopulators() { - - return null; - } - - @NotNull - @Override - public T spawn(@NotNull Location location, @NotNull Class clazz) throws IllegalArgumentException { - - return null; - } - - @NotNull - @Override - public T spawn(@NotNull Location location, @NotNull Class clazz, Consumer function) throws IllegalArgumentException { - - return null; - } - - @NotNull - @Override - public FallingBlock spawnFallingBlock(@NotNull Location location, @NotNull MaterialData data) throws IllegalArgumentException { - - return null; - } - - @NotNull - @Override - public FallingBlock spawnFallingBlock(@NotNull Location location, @NotNull BlockData data) throws IllegalArgumentException { - - return null; - } - - @NotNull - @Override - public FallingBlock spawnFallingBlock(@NotNull Location location, @NotNull Material material, byte data) throws IllegalArgumentException { - - return null; - } - - @Override - public void playEffect(@NotNull Location location, @NotNull Effect effect, int data) { - - } - - @Override - public void playEffect(@NotNull Location location, @NotNull Effect effect, int data, int radius) { - - } - - @Override - public void playEffect(@NotNull Location location, @NotNull Effect effect, T data) { - - } - - @Override - public void playEffect(@NotNull Location location, @NotNull Effect effect, T data, int radius) { - - } - - @NotNull - @Override - public ChunkSnapshot getEmptyChunkSnapshot(int x, int z, boolean includeBiome, boolean includeBiomeTemp) { - - return null; - } - - @Override - public void setSpawnFlags(boolean allowMonsters, boolean allowAnimals) { - - } - - @Override - public boolean getAllowAnimals() { - - return false; - } - - @Override - public boolean getAllowMonsters() { - - return false; - } - - @NotNull - @Override - public Biome getBiome(int x, int z) { - - return null; - } - - @NotNull - @Override - public Biome getBiome(int x, int y, int z) { - - return null; - } - - @Override - public void setBiome(int x, int z, @NotNull Biome bio) { - - } - - @Override - public void setBiome(int x, int y, int z, @NotNull Biome bio) { - - } - - @Override - public double getTemperature(int x, int z) { - - return 0; - } - - @Override - public double getTemperature(int x, int y, int z) { - - return 0; - } - - @Override - public double getHumidity(int x, int z) { - - return 0; - } - - @Override - public double getHumidity(int x, int y, int z) { - - return 0; - } - - @Override - public int getMinHeight() { - return 0; - } - - @Override - public int getMaxHeight() { - - return height; - } - - @Override - public int getSeaLevel() { - - return 0; - } - - @Override - public boolean getKeepSpawnInMemory() { - - return false; - } - - @Override - public void setKeepSpawnInMemory(boolean keepLoaded) { - - } - - @Override - public boolean isAutoSave() { - - return false; - } - - @Override - public void setAutoSave(boolean value) { - - } - - @Override - public void setDifficulty(@NotNull Difficulty difficulty) { - - } - - @NotNull - @Override - public Difficulty getDifficulty() { - - return null; - } - - @NotNull - @Override - public File getWorldFolder() { - - return null; - } - - @Override - public WorldType getWorldType() { - - return null; - } - - @Override - public boolean canGenerateStructures() { - - return false; - } - - @Override - public boolean isHardcore() { - - return false; - } - - @Override - public void setHardcore(boolean hardcore) { - - } - - @Override - public long getTicksPerAnimalSpawns() { - - return 0; - } - - @Override - public void setTicksPerAnimalSpawns(int ticksPerAnimalSpawns) { - - } - - @Override - public long getTicksPerMonsterSpawns() { - - return 0; - } - - @Override - public void setTicksPerMonsterSpawns(int ticksPerMonsterSpawns) { - - } - - @Override - public long getTicksPerWaterSpawns() { - - return 0; - } - - @Override - public void setTicksPerWaterSpawns(int ticksPerWaterSpawns) { - - } - - @Override - public long getTicksPerWaterAmbientSpawns() { - - return 0; - } - - @Override - public void setTicksPerWaterAmbientSpawns(int ticksPerAmbientSpawns) { - - } - - @Override - public long getTicksPerAmbientSpawns() { - - return 0; - } - - @Override - public void setTicksPerAmbientSpawns(int ticksPerAmbientSpawns) { - - } - - @Override - public int getMonsterSpawnLimit() { - - return 0; - } - - @Override - public void setMonsterSpawnLimit(int limit) { - - } - - @Override - public int getAnimalSpawnLimit() { - - return 0; - } - - @Override - public void setAnimalSpawnLimit(int limit) { - - } - - @Override - public int getWaterAnimalSpawnLimit() { - - return 0; - } - - @Override - public void setWaterAnimalSpawnLimit(int limit) { - - } - - @Override - public int getWaterAmbientSpawnLimit() { - - return 0; - } - - @Override - public void setWaterAmbientSpawnLimit(int limit) { - - } - - @Override - public int getAmbientSpawnLimit() { - - return 0; - } - - @Override - public void setAmbientSpawnLimit(int limit) { - - } - - @Override - public void playSound(@NotNull Location location, @NotNull Sound sound, float volume, float pitch) { - - } - - @Override - public void playSound(@NotNull Location location, @NotNull String sound, float volume, float pitch) { - - } - - @Override - public void playSound(@NotNull Location location, @NotNull Sound sound, @NotNull SoundCategory category, float volume, float pitch) { - - } - - @Override - public void playSound(@NotNull Location location, @NotNull String sound, @NotNull SoundCategory category, float volume, float pitch) { - - } - - @NotNull - @Override - public String[] getGameRules() { - - return null; - } - - @Override - public String getGameRuleValue(String rule) { - - return null; - } - - @Override - public boolean setGameRuleValue(@NotNull String rule, @NotNull String value) { - - return false; - } - - @Override - public boolean isGameRule(@NotNull String rule) { - - return false; - } - - @Override - public T getGameRuleValue(@NotNull GameRule rule) { - - return null; - } - - @Override - public T getGameRuleDefault(@NotNull GameRule rule) { - - return null; - } - - @Override - public boolean setGameRule(@NotNull GameRule rule, @NotNull T newValue) { - - return false; - } - - @NotNull - @Override - public WorldBorder getWorldBorder() { - - return null; - } - - @Override - public void spawnParticle(@NotNull Particle particle, @NotNull Location location, int count) { - - } - - @Override - public void spawnParticle(@NotNull Particle particle, double x, double y, double z, int count) { - - } - - @Override - public void spawnParticle(@NotNull Particle particle, @NotNull Location location, int count, T data) { - - } - - @Override - public void spawnParticle(@NotNull Particle particle, double x, double y, double z, int count, T data) { - - } - - @Override - public void spawnParticle(@NotNull Particle particle, @NotNull Location location, int count, double offsetX, double offsetY, double offsetZ) { - - } - - @Override - public void spawnParticle(@NotNull Particle particle, double x, double y, double z, int count, double offsetX, double offsetY, double offsetZ) { - - } - - @Override - public void spawnParticle(@NotNull Particle particle, @NotNull Location location, int count, double offsetX, double offsetY, double offsetZ, T data) { - - } - - @Override - public void spawnParticle(@NotNull Particle particle, double x, double y, double z, int count, double offsetX, double offsetY, double offsetZ, T data) { - - } - - @Override - public void spawnParticle(@NotNull Particle particle, @NotNull Location location, int count, double offsetX, double offsetY, double offsetZ, double extra) { - - } - - @Override - public void spawnParticle(@NotNull Particle particle, double x, double y, double z, int count, double offsetX, double offsetY, double offsetZ, double extra) { - - } - - @Override - public void spawnParticle(@NotNull Particle particle, @NotNull Location location, int count, double offsetX, double offsetY, double offsetZ, double extra, T data) { - - } - - @Override - public void spawnParticle(@NotNull Particle particle, double x, double y, double z, int count, double offsetX, double offsetY, double offsetZ, double extra, T data) { - - } - - @Override - public void spawnParticle(@NotNull Particle particle, @NotNull Location location, int count, double offsetX, double offsetY, double offsetZ, double extra, T data, boolean force) { - - } - - @Override - public void spawnParticle(@NotNull Particle particle, double x, double y, double z, int count, double offsetX, double offsetY, double offsetZ, double extra, T data, boolean force) { - - } - - @Override - public Location locateNearestStructure(@NotNull Location origin, @NotNull StructureType structureType, int radius, boolean findUnexplored) { - return null; - } - - @Override - public int getViewDistance() { - return 0; - } - - @NotNull - @Override - public Spigot spigot() { - return null; - } - - @Override - public Raid locateNearestRaid(@NotNull Location location, int radius) { - return null; - } - - @NotNull - @Override - public List getRaids() { - return null; - } - - @Override - public DragonBattle getEnderDragonBattle() { - return null; - } -} From db65a80a7f6e0d8b13f4b2416c4d1e615b4c1f34 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 19:01:53 -0400 Subject: [PATCH 038/137] Drop support for non-world terrain chunks --- .../engine/data/chunk/LinkedTerrainChunk.java | 22 ------------------- 1 file changed, 22 deletions(-) diff --git a/src/main/java/com/volmit/iris/engine/data/chunk/LinkedTerrainChunk.java b/src/main/java/com/volmit/iris/engine/data/chunk/LinkedTerrainChunk.java index 92ca2792e..f1af07874 100644 --- a/src/main/java/com/volmit/iris/engine/data/chunk/LinkedTerrainChunk.java +++ b/src/main/java/com/volmit/iris/engine/data/chunk/LinkedTerrainChunk.java @@ -22,7 +22,6 @@ import com.volmit.iris.Iris; import com.volmit.iris.core.nms.BiomeBaseInjector; import com.volmit.iris.core.nms.INMS; import com.volmit.iris.util.data.IrisBiomeStorage; -import com.volmit.iris.util.fakenews.HeightedFakeWorld; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.Biome; @@ -38,33 +37,12 @@ public class LinkedTerrainChunk implements TerrainChunk { private ChunkData rawChunkData; private final BiomeGrid storage; - public LinkedTerrainChunk(int maxHeight) { - this(null, maxHeight); - } - public LinkedTerrainChunk(BiomeGrid storage, ChunkData data) { this.storage = storage; rawChunkData = data; biome3D = storage != null ? null : new IrisBiomeStorage(); } - public LinkedTerrainChunk(BiomeGrid storage, int maxHeight) { - this.storage = storage; - rawChunkData = createChunkData(maxHeight); - biome3D = storage != null ? null : new IrisBiomeStorage(); - } - - private ChunkData createChunkData(int maxHeight) { - try { - return Bukkit.createChunkData(new HeightedFakeWorld(maxHeight)); - } catch (Throwable e) { - Iris.reportError(e); - e.printStackTrace(); - } - - return null; - } - @Override public BiomeBaseInjector getBiomeBaseInjector() { return (x, y, z, bb) -> INMS.get().forceBiomeInto(x, y, z, bb, storage); From f933aae5624e369828006d203e2386590498c7ab Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 19:02:26 -0400 Subject: [PATCH 039/137] Cleanup imports --- .../volmit/iris/engine/framework/EngineCompositeGenerator.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java b/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java index 93a191302..49ebe3ae8 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java @@ -38,7 +38,6 @@ import com.volmit.iris.engine.parallel.BurstExecutor; import com.volmit.iris.engine.parallel.MultiBurst; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; -import com.volmit.iris.util.fakenews.FakeWorld; import com.volmit.iris.util.format.C; import com.volmit.iris.util.format.Form; import com.volmit.iris.util.io.ReactiveFolder; @@ -49,7 +48,6 @@ import com.volmit.iris.util.scheduling.ChronoLatch; import com.volmit.iris.util.scheduling.J; import com.volmit.iris.util.scheduling.PrecisionStopwatch; import io.netty.util.internal.ConcurrentSet; -import io.papermc.lib.PaperLib; import lombok.Getter; import org.bukkit.*; import org.bukkit.block.Biome; From d5066adb4b425848cf66dbdfe22deb17b50cbda0 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 19:05:22 -0400 Subject: [PATCH 040/137] Fix terrain chunk creation --- .../com/volmit/iris/engine/IrisWorldCreator.java | 1 - .../iris/engine/data/chunk/LinkedTerrainChunk.java | 12 ++++++++++++ .../volmit/iris/engine/data/chunk/TerrainChunk.java | 12 ++---------- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/volmit/iris/engine/IrisWorldCreator.java b/src/main/java/com/volmit/iris/engine/IrisWorldCreator.java index f9c23436a..3eeb54c59 100644 --- a/src/main/java/com/volmit/iris/engine/IrisWorldCreator.java +++ b/src/main/java/com/volmit/iris/engine/IrisWorldCreator.java @@ -22,7 +22,6 @@ import com.volmit.iris.core.IrisDataManager; import com.volmit.iris.engine.framework.EngineCompositeGenerator; import com.volmit.iris.engine.object.IrisDimension; import com.volmit.iris.engine.object.common.IrisWorld; -import com.volmit.iris.util.fakenews.FakeWorld; import org.bukkit.World; import org.bukkit.WorldCreator; diff --git a/src/main/java/com/volmit/iris/engine/data/chunk/LinkedTerrainChunk.java b/src/main/java/com/volmit/iris/engine/data/chunk/LinkedTerrainChunk.java index f1af07874..aa28d7e93 100644 --- a/src/main/java/com/volmit/iris/engine/data/chunk/LinkedTerrainChunk.java +++ b/src/main/java/com/volmit/iris/engine/data/chunk/LinkedTerrainChunk.java @@ -22,8 +22,10 @@ import com.volmit.iris.Iris; import com.volmit.iris.core.nms.BiomeBaseInjector; import com.volmit.iris.core.nms.INMS; import com.volmit.iris.util.data.IrisBiomeStorage; +import net.minecraft.world.level.chunk.BiomeStorage; import org.bukkit.Bukkit; import org.bukkit.Material; +import org.bukkit.World; import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; import org.bukkit.generator.ChunkGenerator.BiomeGrid; @@ -37,6 +39,16 @@ public class LinkedTerrainChunk implements TerrainChunk { private ChunkData rawChunkData; private final BiomeGrid storage; + public LinkedTerrainChunk(World world) + { + this(null, Bukkit.createChunkData(world)); + } + + public LinkedTerrainChunk(World world, BiomeGrid storage) + { + this(storage, Bukkit.createChunkData(world)); + } + public LinkedTerrainChunk(BiomeGrid storage, ChunkData data) { this.storage = storage; rawChunkData = data; diff --git a/src/main/java/com/volmit/iris/engine/data/chunk/TerrainChunk.java b/src/main/java/com/volmit/iris/engine/data/chunk/TerrainChunk.java index 785962413..078a39bef 100644 --- a/src/main/java/com/volmit/iris/engine/data/chunk/TerrainChunk.java +++ b/src/main/java/com/volmit/iris/engine/data/chunk/TerrainChunk.java @@ -28,25 +28,17 @@ import org.jetbrains.annotations.NotNull; public interface TerrainChunk extends BiomeGrid, ChunkData { static TerrainChunk create(World world) { - return create(world.getMaxHeight()); - } - - static TerrainChunk create(int maxHeight) { - return new LinkedTerrainChunk(maxHeight); + return new LinkedTerrainChunk(world); } static TerrainChunk create(World world, BiomeGrid grid) { - return create(world.getMaxHeight(), grid); + return new LinkedTerrainChunk(world, grid); } static TerrainChunk create(ChunkData raw, BiomeGrid grid) { return new LinkedTerrainChunk(grid, raw); } - static TerrainChunk create(int maxHeight, BiomeGrid grid) { - return new LinkedTerrainChunk(grid, maxHeight); - } - BiomeBaseInjector getBiomeBaseInjector(); void setRaw(ChunkData data); From dd54a714cbeb5d2d25cc8a65ca45ee30e2421fc4 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 19:35:56 -0400 Subject: [PATCH 041/137] Fix init errors --- .../volmit/iris/engine/framework/EngineCompositeGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java b/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java index 49ebe3ae8..f16276dcb 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java @@ -441,13 +441,13 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce public ChunkData generateChunkData(@NotNull World world, @NotNull Random ignored, int x, int z, @NotNull BiomeGrid biome) { PrecisionStopwatch ps = PrecisionStopwatch.start(); TerrainChunk tc = TerrainChunk.create(world, biome); + generateChunkRawData(getComposite().getWorld(), x, z, tc).run(); if(!getComposite().getWorld().hasRealWorld()) { getComposite().getWorld().bind(world); } - generateChunkRawData(getComposite().getWorld(), x, z, tc).run(); generated++; ps.end(); From d5f64a79b2bed5aa63d23bbf55ab11ec0576170b Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 19:36:02 -0400 Subject: [PATCH 042/137] Headless worlds --- .../iris/engine/headless/HeadlessWorld.java | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 src/main/java/com/volmit/iris/engine/headless/HeadlessWorld.java diff --git a/src/main/java/com/volmit/iris/engine/headless/HeadlessWorld.java b/src/main/java/com/volmit/iris/engine/headless/HeadlessWorld.java new file mode 100644 index 000000000..b84ddf929 --- /dev/null +++ b/src/main/java/com/volmit/iris/engine/headless/HeadlessWorld.java @@ -0,0 +1,80 @@ +/* + * 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.headless; + +import com.volmit.iris.Iris; +import com.volmit.iris.core.IrisDataManager; +import com.volmit.iris.engine.framework.EngineCompositeGenerator; +import com.volmit.iris.engine.object.IrisDimension; +import com.volmit.iris.engine.object.common.IrisWorld; +import com.volmit.iris.util.plugin.VolmitSender; +import lombok.Data; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.WorldCreator; + +import java.io.File; + +@Data +@SuppressWarnings("ResultOfMethodCallIgnored") +public class HeadlessWorld { + private final IrisDimension dimension; + private final String worldName; + private final IrisWorld world; + + public HeadlessWorld(String worldName, IrisDimension dimension, long seed) + { + this.worldName = worldName; + this.dimension = dimension; + world = IrisWorld.builder() + .environment(dimension.getEnvironment()) + .worldFolder(new File(worldName)) + .seed(seed) + .maxHeight(256) + .minHeight(0) + .name(worldName) + .build(); + world.worldFolder().mkdirs(); + new File(world.worldFolder(), "region").mkdirs(); + + if(!new File(world.worldFolder(), "iris").exists()) + { + Iris.proj.installIntoWorld(new VolmitSender(Bukkit.getConsoleSender(), Iris.instance.getTag("Headless")), dimension.getLoadKey(), world.worldFolder()); + } + } + + public HeadlessGenerator headlessMode() + { + return new HeadlessGenerator(this); + } + + public World load() + { + return new WorldCreator(worldName) + .environment(dimension.getEnvironment()) + .seed(world.seed()) + .generator(new EngineCompositeGenerator(dimension.getLoadKey(), true)) + .createWorld(); + } + + public static HeadlessWorld from(String name, String dimension, long seed) + { + return new HeadlessWorld(name, IrisDataManager.loadAnyDimension(dimension), seed); + } +} From 254b5c963b08936f15fcb879883abedffda02e8a Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 19:36:18 -0400 Subject: [PATCH 043/137] Headless Generator --- .../engine/headless/HeadlessGenerator.java | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java diff --git a/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java b/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java new file mode 100644 index 000000000..b9802da7d --- /dev/null +++ b/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java @@ -0,0 +1,38 @@ +/* + * 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.headless; + +import com.volmit.iris.engine.data.mca.NBTWorld; +import com.volmit.iris.engine.framework.EngineCompositeGenerator; +import lombok.Data; + +@Data +public class HeadlessGenerator { + private final HeadlessWorld world; + private final EngineCompositeGenerator generator; + private final NBTWorld writer; + + public HeadlessGenerator(HeadlessWorld world) + { + this.world = world; + generator = new EngineCompositeGenerator(world.getDimension().getLoadKey(), true); + generator.initialize(world.getWorld()); + writer = new NBTWorld(world.getWorld().worldFolder()); + } +} From 51f333471192b5915ed2a4f09c108e5abcab0dd7 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 18 Jul 2021 19:49:54 -0400 Subject: [PATCH 044/137] Headless generation --- .../engine/headless/HeadlessGenerator.java | 25 +++++++++++++++++++ .../iris/engine/parallel/MultiBurst.java | 18 +++++++++++++ 2 files changed, 43 insertions(+) diff --git a/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java b/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java index b9802da7d..b2f2967a7 100644 --- a/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java +++ b/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java @@ -20,6 +20,7 @@ package com.volmit.iris.engine.headless; import com.volmit.iris.engine.data.mca.NBTWorld; import com.volmit.iris.engine.framework.EngineCompositeGenerator; +import com.volmit.iris.engine.parallel.MultiBurst; import lombok.Data; @Data @@ -27,12 +28,36 @@ public class HeadlessGenerator { private final HeadlessWorld world; private final EngineCompositeGenerator generator; private final NBTWorld writer; + private final MultiBurst burst; public HeadlessGenerator(HeadlessWorld world) { this.world = world; + burst = new MultiBurst("Iris Headless Generator", 9, Runtime.getRuntime().availableProcessors()); generator = new EngineCompositeGenerator(world.getDimension().getLoadKey(), true); generator.initialize(world.getWorld()); writer = new NBTWorld(world.getWorld().worldFolder()); } + + public void generateChunk(int x, int z) + { + generator.directWriteChunk(world.getWorld(), x, z, writer); + } + + public void generateRegion(int x, int z) + { + generator.directWriteMCA(world.getWorld(), x, z, writer, burst); + } + + public void save() + { + writer.save(); + } + + public void close() + { + burst.shutdownAndAwait(); + generator.close(); + writer.close(); + } } diff --git a/src/main/java/com/volmit/iris/engine/parallel/MultiBurst.java b/src/main/java/com/volmit/iris/engine/parallel/MultiBurst.java index da965047b..e79883bd7 100644 --- a/src/main/java/com/volmit/iris/engine/parallel/MultiBurst.java +++ b/src/main/java/com/volmit/iris/engine/parallel/MultiBurst.java @@ -95,4 +95,22 @@ public class MultiBurst { public void shutdown() { service.shutdown(); } + + public void shutdownAndAwait() { + service.shutdown(); + + try + { + while(!service.awaitTermination(10, TimeUnit.SECONDS)) + { + Iris.info("Still waiting to shutdown burster..."); + } + } + + catch(Throwable e) + { + e.printStackTrace(); + Iris.reportError(e); + } + } } From 4e9c44e574c588510465730f40a639c2aa68fdf0 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 01:45:09 -0400 Subject: [PATCH 045/137] V+ --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 29eb2e1df..ec154ef2f 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { } group 'com.volmit.iris' -version '1.5.3-HEADLESS' +version '1.5.4' def apiVersion = '1.17' def name = 'Iris' def main = 'com.volmit.iris.Iris' From e251155f4f2697e70038f83b208499d00eb44e92 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 01:45:21 -0400 Subject: [PATCH 046/137] NBT Force flushing --- .../volmit/iris/engine/data/mca/NBTWorld.java | 31 ++++++++++++++----- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/volmit/iris/engine/data/mca/NBTWorld.java b/src/main/java/com/volmit/iris/engine/data/mca/NBTWorld.java index 2f910e469..3801412a5 100644 --- a/src/main/java/com/volmit/iris/engine/data/mca/NBTWorld.java +++ b/src/main/java/com/volmit/iris/engine/data/mca/NBTWorld.java @@ -84,17 +84,32 @@ public class NBTWorld { } } + public void flushNow() + { + regionLock.lock(); + + for(Long i : loadedRegions.k()) + { + doSaveUnload(Cache.keyX(i), Cache.keyZ(i)); + } + + regionLock.unlock(); + } + public void queueSaveUnload(int x, int z) { - saveQueue.submit(() -> { - MCAFile f = getMCAOrNull(x, z); - if(f != null) - { - unloadRegion(x, z); - } + saveQueue.submit(() -> doSaveUnload(x, z)); + } - saveRegion(x, z, f); - }); + public void doSaveUnload(int x, int z) + { + MCAFile f = getMCAOrNull(x, z); + if(f != null) + { + unloadRegion(x, z); + } + + saveRegion(x, z, f); } public void save() From 627eb556cb54289b18a66d6b1844396709559b68 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 01:45:29 -0400 Subject: [PATCH 047/137] The headless generator --- .../iris/engine/headless/HeadlessGenerator.java | 14 ++++++++++++++ .../volmit/iris/engine/headless/HeadlessWorld.java | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java b/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java index b2f2967a7..68a2dcbc9 100644 --- a/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java +++ b/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java @@ -23,6 +23,8 @@ import com.volmit.iris.engine.framework.EngineCompositeGenerator; import com.volmit.iris.engine.parallel.MultiBurst; import lombok.Data; +import java.io.File; + @Data public class HeadlessGenerator { private final HeadlessWorld world; @@ -49,6 +51,18 @@ public class HeadlessGenerator { generator.directWriteMCA(world.getWorld(), x, z, writer, burst); } + public File generateRegionToFile(int x, int z) + { + generateRegionToFile(x, z); + flush(); + return writer.getRegionFile(x, z); + } + + public void flush() + { + writer.flushNow(); + } + public void save() { writer.save(); diff --git a/src/main/java/com/volmit/iris/engine/headless/HeadlessWorld.java b/src/main/java/com/volmit/iris/engine/headless/HeadlessWorld.java index b84ddf929..c0c09565a 100644 --- a/src/main/java/com/volmit/iris/engine/headless/HeadlessWorld.java +++ b/src/main/java/com/volmit/iris/engine/headless/HeadlessWorld.java @@ -59,7 +59,7 @@ public class HeadlessWorld { } } - public HeadlessGenerator headlessMode() + public HeadlessGenerator generate() { return new HeadlessGenerator(this); } From 2a7720852a7a4bd00762f0cda713b581a00978db Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 01:46:54 -0400 Subject: [PATCH 048/137] Move components --- .../core/command/world/CommandIrisCreate.java | 2 +- .../core/command/world/CommandIrisPregen.java | 2 +- .../iris/core/gui/IrisPregenerator.java | 22 +++++++++++++++++++ .../volmit/iris/core/gui/IrisRenderer.java | 2 +- .../com/volmit/iris/core/gui/IrisVision.java | 2 +- .../gui/{ => components}/Pregenerator.java | 0 .../core/gui/{ => components}/RenderType.java | 0 .../core/gui/{ => components}/Renderer.java | 0 .../core/gui/{ => components}/TileRender.java | 0 .../volmit/iris/engine/framework/Engine.java | 5 ++--- .../engine/framework/GeneratorAccess.java | 2 +- .../volmit/iris/engine/object/IrisBiome.java | 2 +- .../volmit/iris/engine/object/IrisRegion.java | 2 +- 13 files changed, 31 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/volmit/iris/core/gui/IrisPregenerator.java rename src/main/java/com/volmit/iris/core/gui/{ => components}/Pregenerator.java (100%) rename src/main/java/com/volmit/iris/core/gui/{ => components}/RenderType.java (100%) rename src/main/java/com/volmit/iris/core/gui/{ => components}/Renderer.java (100%) rename src/main/java/com/volmit/iris/core/gui/{ => components}/TileRender.java (100%) diff --git a/src/main/java/com/volmit/iris/core/command/world/CommandIrisCreate.java b/src/main/java/com/volmit/iris/core/command/world/CommandIrisCreate.java index e63559b4b..405680592 100644 --- a/src/main/java/com/volmit/iris/core/command/world/CommandIrisCreate.java +++ b/src/main/java/com/volmit/iris/core/command/world/CommandIrisCreate.java @@ -21,7 +21,7 @@ package com.volmit.iris.core.command.world; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisDataManager; import com.volmit.iris.core.IrisSettings; -import com.volmit.iris.core.gui.Pregenerator; +import com.volmit.iris.core.gui.components.Pregenerator; import com.volmit.iris.core.link.MultiverseCoreLink; import com.volmit.iris.core.nms.INMS; import com.volmit.iris.engine.IrisWorldCreator; diff --git a/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java b/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java index 66adeeca2..de70f9ce3 100644 --- a/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java +++ b/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java @@ -19,7 +19,7 @@ package com.volmit.iris.core.command.world; import com.volmit.iris.Iris; -import com.volmit.iris.core.gui.Pregenerator; +import com.volmit.iris.core.gui.components.Pregenerator; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.plugin.MortarCommand; import com.volmit.iris.util.plugin.VolmitSender; diff --git a/src/main/java/com/volmit/iris/core/gui/IrisPregenerator.java b/src/main/java/com/volmit/iris/core/gui/IrisPregenerator.java new file mode 100644 index 000000000..7a7b7eed4 --- /dev/null +++ b/src/main/java/com/volmit/iris/core/gui/IrisPregenerator.java @@ -0,0 +1,22 @@ +/* + * 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.core.gui; + +public class IrisPregenerator { +} diff --git a/src/main/java/com/volmit/iris/core/gui/IrisRenderer.java b/src/main/java/com/volmit/iris/core/gui/IrisRenderer.java index 977438c9a..ac23c0644 100644 --- a/src/main/java/com/volmit/iris/core/gui/IrisRenderer.java +++ b/src/main/java/com/volmit/iris/core/gui/IrisRenderer.java @@ -18,9 +18,9 @@ package com.volmit.iris.core.gui; +import com.volmit.iris.core.gui.components.RenderType; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.interpolation.IrisInterpolation; -import org.bukkit.Material; import java.awt.*; import java.awt.image.BufferedImage; diff --git a/src/main/java/com/volmit/iris/core/gui/IrisVision.java b/src/main/java/com/volmit/iris/core/gui/IrisVision.java index 8d074cc9b..f50272de2 100644 --- a/src/main/java/com/volmit/iris/core/gui/IrisVision.java +++ b/src/main/java/com/volmit/iris/core/gui/IrisVision.java @@ -19,6 +19,7 @@ package com.volmit.iris.core.gui; import com.volmit.iris.Iris; +import com.volmit.iris.core.gui.components.RenderType; import com.volmit.iris.engine.IrisComplex; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.framework.IrisAccess; @@ -37,7 +38,6 @@ import com.volmit.iris.util.scheduling.J; import com.volmit.iris.util.scheduling.O; import com.volmit.iris.util.scheduling.PrecisionStopwatch; import org.bukkit.Location; -import org.bukkit.World; import org.bukkit.attribute.Attribute; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; diff --git a/src/main/java/com/volmit/iris/core/gui/Pregenerator.java b/src/main/java/com/volmit/iris/core/gui/components/Pregenerator.java similarity index 100% rename from src/main/java/com/volmit/iris/core/gui/Pregenerator.java rename to src/main/java/com/volmit/iris/core/gui/components/Pregenerator.java diff --git a/src/main/java/com/volmit/iris/core/gui/RenderType.java b/src/main/java/com/volmit/iris/core/gui/components/RenderType.java similarity index 100% rename from src/main/java/com/volmit/iris/core/gui/RenderType.java rename to src/main/java/com/volmit/iris/core/gui/components/RenderType.java diff --git a/src/main/java/com/volmit/iris/core/gui/Renderer.java b/src/main/java/com/volmit/iris/core/gui/components/Renderer.java similarity index 100% rename from src/main/java/com/volmit/iris/core/gui/Renderer.java rename to src/main/java/com/volmit/iris/core/gui/components/Renderer.java diff --git a/src/main/java/com/volmit/iris/core/gui/TileRender.java b/src/main/java/com/volmit/iris/core/gui/components/TileRender.java similarity index 100% rename from src/main/java/com/volmit/iris/core/gui/TileRender.java rename to src/main/java/com/volmit/iris/core/gui/components/TileRender.java 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 38ffb462c..8a24a67bc 100644 --- a/src/main/java/com/volmit/iris/engine/framework/Engine.java +++ b/src/main/java/com/volmit/iris/engine/framework/Engine.java @@ -20,8 +20,8 @@ package com.volmit.iris.engine.framework; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisDataManager; -import com.volmit.iris.core.gui.RenderType; -import com.volmit.iris.core.gui.Renderer; +import com.volmit.iris.core.gui.components.RenderType; +import com.volmit.iris.core.gui.components.Renderer; import com.volmit.iris.engine.cache.Cache; import com.volmit.iris.engine.data.B; import com.volmit.iris.engine.data.DataProvider; @@ -38,7 +38,6 @@ import com.volmit.iris.util.scheduling.PrecisionStopwatch; import org.bukkit.Chunk; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.World; import org.bukkit.block.Biome; import org.bukkit.block.Block; import org.bukkit.block.data.BlockData; diff --git a/src/main/java/com/volmit/iris/engine/framework/GeneratorAccess.java b/src/main/java/com/volmit/iris/engine/framework/GeneratorAccess.java index 2b455093d..a824fe71e 100644 --- a/src/main/java/com/volmit/iris/engine/framework/GeneratorAccess.java +++ b/src/main/java/com/volmit/iris/engine/framework/GeneratorAccess.java @@ -19,7 +19,7 @@ package com.volmit.iris.engine.framework; import com.volmit.iris.core.IrisDataManager; -import com.volmit.iris.core.gui.Renderer; +import com.volmit.iris.core.gui.components.Renderer; import com.volmit.iris.engine.data.DataProvider; import com.volmit.iris.engine.object.IrisBiome; import com.volmit.iris.engine.object.IrisObjectPlacement; diff --git a/src/main/java/com/volmit/iris/engine/object/IrisBiome.java b/src/main/java/com/volmit/iris/engine/object/IrisBiome.java index 6d098f33a..1199fe1f4 100644 --- a/src/main/java/com/volmit/iris/engine/object/IrisBiome.java +++ b/src/main/java/com/volmit/iris/engine/object/IrisBiome.java @@ -20,7 +20,7 @@ package com.volmit.iris.engine.object; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisDataManager; -import com.volmit.iris.core.gui.RenderType; +import com.volmit.iris.core.gui.components.RenderType; import com.volmit.iris.engine.IrisComplex; import com.volmit.iris.engine.cache.AtomicCache; import com.volmit.iris.engine.data.B; diff --git a/src/main/java/com/volmit/iris/engine/object/IrisRegion.java b/src/main/java/com/volmit/iris/engine/object/IrisRegion.java index 47a587219..4c391eb14 100644 --- a/src/main/java/com/volmit/iris/engine/object/IrisRegion.java +++ b/src/main/java/com/volmit/iris/engine/object/IrisRegion.java @@ -20,7 +20,7 @@ package com.volmit.iris.engine.object; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisDataManager; -import com.volmit.iris.core.gui.RenderType; +import com.volmit.iris.core.gui.components.RenderType; import com.volmit.iris.engine.cache.AtomicCache; import com.volmit.iris.engine.data.DataProvider; import com.volmit.iris.engine.noise.CNG; From 7ecb139dba4b43c63f747ad47d3c08ee6f8537c0 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 01:47:00 -0400 Subject: [PATCH 049/137] CMP --- .../com/volmit/iris/core/gui/components/Pregenerator.java | 4 +--- .../java/com/volmit/iris/core/gui/components/RenderType.java | 2 +- .../java/com/volmit/iris/core/gui/components/Renderer.java | 2 +- .../java/com/volmit/iris/core/gui/components/TileRender.java | 2 +- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/volmit/iris/core/gui/components/Pregenerator.java b/src/main/java/com/volmit/iris/core/gui/components/Pregenerator.java index 19bce324f..0793917c3 100644 --- a/src/main/java/com/volmit/iris/core/gui/components/Pregenerator.java +++ b/src/main/java/com/volmit/iris/core/gui/components/Pregenerator.java @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package com.volmit.iris.core.gui; +package com.volmit.iris.core.gui.components; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; @@ -30,7 +30,6 @@ import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.format.Form; import com.volmit.iris.util.function.Consumer2; import com.volmit.iris.util.function.Consumer3; -import com.volmit.iris.util.io.IO; import com.volmit.iris.util.math.ChunkPosition; import com.volmit.iris.util.math.M; import com.volmit.iris.util.math.RollingSequence; @@ -54,7 +53,6 @@ import java.awt.event.KeyListener; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; -import java.nio.file.Files; import java.util.Comparator; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; diff --git a/src/main/java/com/volmit/iris/core/gui/components/RenderType.java b/src/main/java/com/volmit/iris/core/gui/components/RenderType.java index 99c5098fb..002601621 100644 --- a/src/main/java/com/volmit/iris/core/gui/components/RenderType.java +++ b/src/main/java/com/volmit/iris/core/gui/components/RenderType.java @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package com.volmit.iris.core.gui; +package com.volmit.iris.core.gui.components; public enum RenderType { BIOME, BIOME_LAND, BIOME_SEA, REGION, CAVE_LAND, HEIGHT, OBJECT_LOAD, DECORATOR_LOAD, LAYER_LOAD diff --git a/src/main/java/com/volmit/iris/core/gui/components/Renderer.java b/src/main/java/com/volmit/iris/core/gui/components/Renderer.java index 956b68e31..ca33e0ec5 100644 --- a/src/main/java/com/volmit/iris/core/gui/components/Renderer.java +++ b/src/main/java/com/volmit/iris/core/gui/components/Renderer.java @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package com.volmit.iris.core.gui; +package com.volmit.iris.core.gui.components; import java.awt.*; diff --git a/src/main/java/com/volmit/iris/core/gui/components/TileRender.java b/src/main/java/com/volmit/iris/core/gui/components/TileRender.java index caca47173..ec7eddd65 100644 --- a/src/main/java/com/volmit/iris/core/gui/components/TileRender.java +++ b/src/main/java/com/volmit/iris/core/gui/components/TileRender.java @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package com.volmit.iris.core.gui; +package com.volmit.iris.core.gui.components; import lombok.Builder; import lombok.Data; From b25bf702240c90ec144b8458abbb4ec2e3c95641 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 02:00:07 -0400 Subject: [PATCH 050/137] ChunkPosition -> Position2 --- .../studio/CommandIrisStudioExplorer.java | 4 +-- .../CommandIrisStudioExplorerGenerator.java | 4 +-- .../command/studio/CommandIrisStudioMap.java | 6 ++-- .../iris/engine/hunk/io/HunkRegionSlice.java | 31 +++++++++---------- .../engine/modifier/IrisRavineModifier.java | 10 +++--- .../iris/engine/object/IrisDimension.java | 4 +-- .../volmit/iris/engine/object/IrisObject.java | 8 ++--- .../{ChunkPosition.java => Position2.java} | 8 ++--- 8 files changed, 37 insertions(+), 38 deletions(-) rename src/main/java/com/volmit/iris/util/math/{ChunkPosition.java => Position2.java} (90%) diff --git a/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioExplorer.java b/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioExplorer.java index f03483047..1967762af 100644 --- a/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioExplorer.java +++ b/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioExplorer.java @@ -20,7 +20,7 @@ package com.volmit.iris.core.command.studio; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; -import com.volmit.iris.core.gui.IrisExplorer; +import com.volmit.iris.core.gui.NoiseExplorerGUI; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.plugin.Command; import com.volmit.iris.util.plugin.MortarCommand; @@ -57,7 +57,7 @@ public class CommandIrisStudioExplorer extends MortarCommand { return true; } - IrisExplorer.launch(); + NoiseExplorerGUI.launch(); sender.sendMessage("Opening Noise Explorer!"); } return true; diff --git a/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioExplorerGenerator.java b/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioExplorerGenerator.java index 4f496636d..943b400cd 100644 --- a/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioExplorerGenerator.java +++ b/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioExplorerGenerator.java @@ -21,7 +21,7 @@ package com.volmit.iris.core.command.studio; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisDataManager; import com.volmit.iris.core.IrisSettings; -import com.volmit.iris.core.gui.IrisExplorer; +import com.volmit.iris.core.gui.NoiseExplorerGUI; import com.volmit.iris.engine.object.IrisGenerator; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.math.RNG; @@ -70,7 +70,7 @@ public class CommandIrisStudioExplorerGenerator extends MortarCommand { if (generator != null) { long finalSeed = seed; - IrisExplorer.launch((x, z) -> + NoiseExplorerGUI.launch((x, z) -> generator.getHeight(x, z, new RNG(finalSeed).nextParallelRNG(3245).lmax()), "Gen: " + generator.getLoadKey()); sender.sendMessage("Opening Noise Explorer for gen " + generator.getLoadKey() + " (" + generator.getLoader().getDataFolder().getName() + ")"); diff --git a/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioMap.java b/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioMap.java index 94b0b3036..ba49a7d57 100644 --- a/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioMap.java +++ b/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioMap.java @@ -20,7 +20,7 @@ package com.volmit.iris.core.command.studio; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; -import com.volmit.iris.core.gui.IrisVision; +import com.volmit.iris.core.gui.VisionGUI; import com.volmit.iris.engine.IrisWorlds; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.framework.IrisAccess; @@ -57,12 +57,12 @@ public class CommandIrisStudioMap extends MortarCommand { try { IrisAccess g = Iris.proj.getActiveProject().getActiveProvider(); - IrisVision.launch(g, 0); + VisionGUI.launch(g, 0); sender.sendMessage("Opening Map!"); } catch (Throwable e) { Iris.reportError(e); IrisAccess g = IrisWorlds.access(sender.player().getWorld()); - IrisVision.launch(g, 0); + VisionGUI.launch(g, 0); sender.sendMessage("Opening Map!"); } return true; diff --git a/src/main/java/com/volmit/iris/engine/hunk/io/HunkRegionSlice.java b/src/main/java/com/volmit/iris/engine/hunk/io/HunkRegionSlice.java index 9e1dd3706..283123819 100644 --- a/src/main/java/com/volmit/iris/engine/hunk/io/HunkRegionSlice.java +++ b/src/main/java/com/volmit/iris/engine/hunk/io/HunkRegionSlice.java @@ -29,12 +29,11 @@ import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.function.Function2; import com.volmit.iris.util.function.Function3; -import com.volmit.iris.util.math.ChunkPosition; +import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.math.M; import com.volmit.iris.util.oldnbt.ByteArrayTag; import com.volmit.iris.util.oldnbt.CompoundTag; import com.volmit.iris.util.oldnbt.Tag; -import io.papermc.lib.PaperLib; import org.bukkit.block.TileState; import org.bukkit.block.data.BlockData; @@ -51,9 +50,9 @@ public class HunkRegionSlice { private final HunkIOAdapter adapter; private final CompoundTag compound; private final String key; - private final KMap> loadedChunks; - private final KMap lastUse; - private final KSet save; + private final KMap> loadedChunks; + private final KMap lastUse; + private final KSet save; private final int height; public HunkRegionSlice(int height, Function3> factory, HunkIOAdapter adapter, CompoundTag compound, String key) { @@ -73,14 +72,14 @@ public class HunkRegionSlice { if (loadedChunks.size() != lastUse.size()) { Iris.warn("Incorrect chunk use counts in " + key); - for (ChunkPosition i : lastUse.k()) { + for (Position2 i : lastUse.k()) { if (!loadedChunks.containsKey(i)) { Iris.warn(" Missing LoadChunkKey " + i); } } } - for (ChunkPosition i : lastUse.k()) { + for (Position2 i : lastUse.k()) { Long l = lastUse.get(i); if (l == null || M.ms() - l > t) { v++; @@ -104,7 +103,7 @@ public class HunkRegionSlice { try { - for (ChunkPosition i : save.copy()) { + for (Position2 i : save.copy()) { if (i == null) { continue; } @@ -172,7 +171,7 @@ public class HunkRegionSlice { public synchronized int unloadAll() { int v = 0; - for (ChunkPosition i : loadedChunks.k()) { + for (Position2 i : loadedChunks.k()) { unload(i.getX(), i.getZ()); v++; } @@ -193,7 +192,7 @@ public class HunkRegionSlice { } public boolean isLoaded(int x, int z) { - return lock.withResult(x, z, () -> loadedChunks.containsKey(new ChunkPosition(x, z))); + return lock.withResult(x, z, () -> loadedChunks.containsKey(new Position2(x, z))); } public void save(int x, int z) { @@ -206,7 +205,7 @@ public class HunkRegionSlice { public void unload(int x, int z) { lock.with(x, z, () -> { - ChunkPosition key = new ChunkPosition(x, z); + Position2 key = new Position2(x, z); if (isLoaded(x, z)) { if (save.contains(key)) { save(x, z); @@ -222,7 +221,7 @@ public class HunkRegionSlice { public Hunk load(int x, int z) { return lock.withResult(x, z, () -> { if (isLoaded(x, z)) { - return loadedChunks.get(new ChunkPosition(x, z)); + return loadedChunks.get(new Position2(x, z)); } Hunk v = null; @@ -240,7 +239,7 @@ public class HunkRegionSlice { v = factory.apply(16, height, 16); } - loadedChunks.put(new ChunkPosition(x, z), v); + loadedChunks.put(new Position2(x, z), v); return v; }); @@ -248,7 +247,7 @@ public class HunkRegionSlice { public Hunk get(int x, int z) { return lock.withResult(x, z, () -> { - ChunkPosition key = new ChunkPosition(x, z); + Position2 key = new Position2(x, z); Hunk c = loadedChunks.get(key); @@ -256,7 +255,7 @@ public class HunkRegionSlice { c = load(x, z); } - lastUse.put(new ChunkPosition(x, z), M.ms()); + lastUse.put(new Position2(x, z), M.ms()); return c; }); @@ -268,7 +267,7 @@ public class HunkRegionSlice { public Hunk getRW(int x, int z) { return lock.withResult(x, z, () -> { - save.add(new ChunkPosition(x, z)); + save.add(new Position2(x, z)); return get(x, z); }); } diff --git a/src/main/java/com/volmit/iris/engine/modifier/IrisRavineModifier.java b/src/main/java/com/volmit/iris/engine/modifier/IrisRavineModifier.java index 1fd82cdbb..3137de6ab 100644 --- a/src/main/java/com/volmit/iris/engine/modifier/IrisRavineModifier.java +++ b/src/main/java/com/volmit/iris/engine/modifier/IrisRavineModifier.java @@ -25,7 +25,7 @@ import com.volmit.iris.engine.hunk.Hunk; import com.volmit.iris.engine.noise.CNG; import com.volmit.iris.engine.object.NoiseStyle; import com.volmit.iris.util.math.BlockPosition; -import com.volmit.iris.util.math.ChunkPosition; +import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.math.MathHelper; import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.scheduling.PrecisionStopwatch; @@ -76,7 +76,7 @@ public class IrisRavineModifier extends EngineAssignedModifier { private final float[] ravineCache = new float[1024]; - private void doRavine(long seed, int tx, int tz, ChunkPosition pos, double sx, double sy, double sz, float f, float f2, float f3, @SuppressWarnings("SameParameterValue") int n3, @SuppressWarnings("SameParameterValue") int n4, @SuppressWarnings("SameParameterValue") double d4, RNG bbx, Hunk terrain) { + private void doRavine(long seed, int tx, int tz, Position2 pos, double sx, double sy, double sz, float f, float f2, float f3, @SuppressWarnings("SameParameterValue") int n3, @SuppressWarnings("SameParameterValue") int n4, @SuppressWarnings("SameParameterValue") double d4, RNG bbx, Hunk terrain) { int n5; RNG random = new RNG(seed); double x = tx * 16 + 8; @@ -248,7 +248,7 @@ public class IrisRavineModifier extends EngineAssignedModifier { //@done } - public void genRavines(int n, int n2, ChunkPosition chunkSnapshot, RNG bbb, Hunk terrain) { + public void genRavines(int n, int n2, Position2 chunkSnapshot, RNG bbb, Hunk terrain) { RNG b = this.rng.nextParallelRNG(21949666); RNG bx = this.rng.nextParallelRNG(6676121); long l = b.nextLong(); @@ -263,7 +263,7 @@ public class IrisRavineModifier extends EngineAssignedModifier { } } - private void doRavines(int tx, int tz, int sx, int sz, ChunkPosition chunkSnapshot, RNG b, Hunk terrain) { + private void doRavines(int tx, int tz, int sx, int sz, Position2 chunkSnapshot, RNG b, Hunk terrain) { if (b.nextInt(getDimension().getRavineRarity()) != 0) { return; } @@ -281,6 +281,6 @@ public class IrisRavineModifier extends EngineAssignedModifier { } public void generateRavines(RNG nextParallelRNG, int x, int z, Hunk terrain) { - genRavines(x, z, new ChunkPosition(x, z), nextParallelRNG.nextParallelRNG(x).nextParallelRNG(z), terrain); + genRavines(x, z, new Position2(x, z), nextParallelRNG.nextParallelRNG(x).nextParallelRNG(z), terrain); } } diff --git a/src/main/java/com/volmit/iris/engine/object/IrisDimension.java b/src/main/java/com/volmit/iris/engine/object/IrisDimension.java index 28c83b070..887a099a0 100644 --- a/src/main/java/com/volmit/iris/engine/object/IrisDimension.java +++ b/src/main/java/com/volmit/iris/engine/object/IrisDimension.java @@ -26,7 +26,7 @@ import com.volmit.iris.engine.noise.CNG; import com.volmit.iris.engine.object.annotations.*; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.io.IO; -import com.volmit.iris.util.math.ChunkPosition; +import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.math.RNG; import lombok.AllArgsConstructor; import lombok.Data; @@ -336,7 +336,7 @@ public class IrisDimension extends IrisRegistrant { @Desc("Define biome mutations for this dimension") private KList mutations = new KList<>(); - private final transient AtomicCache parallaxSize = new AtomicCache<>(); + private final transient AtomicCache parallaxSize = new AtomicCache<>(); private final transient AtomicCache rockLayerGenerator = new AtomicCache<>(); private final transient AtomicCache fluidLayerGenerator = new AtomicCache<>(); private final transient AtomicCache coordFracture = new AtomicCache<>(); diff --git a/src/main/java/com/volmit/iris/engine/object/IrisObject.java b/src/main/java/com/volmit/iris/engine/object/IrisObject.java index 9832af511..720fe760c 100644 --- a/src/main/java/com/volmit/iris/engine/object/IrisObject.java +++ b/src/main/java/com/volmit/iris/engine/object/IrisObject.java @@ -30,7 +30,7 @@ import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.math.AxisAlignedBB; import com.volmit.iris.util.math.BlockPosition; -import com.volmit.iris.util.math.ChunkPosition; +import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.scheduling.IrisLock; import lombok.Data; @@ -466,7 +466,7 @@ public class IrisObject extends IrisRegistrant { boolean warped = !config.getWarp().isFlat(); boolean stilting = (config.getMode().equals(ObjectPlaceMode.STILT) || config.getMode().equals(ObjectPlaceMode.FAST_STILT)); - KMap heightmap = config.getSnow() > 0 ? new KMap<>() : null; + KMap heightmap = config.getSnow() > 0 ? new KMap<>() : null; int spinx = rng.imax() / 1000; int spiny = rng.imax() / 1000; int spinz = rng.imax() / 1000; @@ -638,7 +638,7 @@ public class IrisObject extends IrisRegistrant { } if (heightmap != null) { - ChunkPosition pos = new ChunkPosition(xx, zz); + Position2 pos = new Position2(xx, zz); if (!heightmap.containsKey(pos)) { heightmap.put(pos, yy); @@ -727,7 +727,7 @@ public class IrisObject extends IrisRegistrant { if (heightmap != null) { RNG rngx = rng.nextParallelRNG(3468854); - for (ChunkPosition i : heightmap.k()) { + for (Position2 i : heightmap.k()) { int vx = i.getX(); int vy = heightmap.get(i); int vz = i.getZ(); diff --git a/src/main/java/com/volmit/iris/util/math/ChunkPosition.java b/src/main/java/com/volmit/iris/util/math/Position2.java similarity index 90% rename from src/main/java/com/volmit/iris/util/math/ChunkPosition.java rename to src/main/java/com/volmit/iris/util/math/Position2.java index 65098093f..94be84e6e 100644 --- a/src/main/java/com/volmit/iris/util/math/ChunkPosition.java +++ b/src/main/java/com/volmit/iris/util/math/Position2.java @@ -18,11 +18,11 @@ package com.volmit.iris.util.math; -public class ChunkPosition { +public class Position2 { private int x; private int z; - public ChunkPosition(int x, int z) { + public Position2(int x, int z) { this.x = x; this.z = z; } @@ -57,13 +57,13 @@ public class ChunkPosition { if (this == obj) { return true; } - if (!(obj instanceof ChunkPosition other)) { + if (!(obj instanceof Position2 other)) { return false; } return x == other.x && z == other.z; } - public double distance(ChunkPosition center) { + public double distance(Position2 center) { return Math.pow(center.getX() - x, 2) + Math.pow(center.getZ() - z, 2); } } From 1208b25b66fc9ac8ab190dc38ceb033b5f8b48ad Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 02:00:15 -0400 Subject: [PATCH 051/137] Move around guis --- ...risExplorer.java => NoiseExplorerGUI.java} | 10 ++--- ...Pregenerator.java => PregeneratorGUI.java} | 2 +- .../gui/{IrisVision.java => VisionGUI.java} | 7 +-- .../gui/{ => components}/IrisRenderer.java | 2 +- .../core/gui/components/Pregenerator.java | 45 ++++++++++--------- 5 files changed, 34 insertions(+), 32 deletions(-) rename src/main/java/com/volmit/iris/core/gui/{IrisExplorer.java => NoiseExplorerGUI.java} (97%) rename src/main/java/com/volmit/iris/core/gui/{IrisPregenerator.java => PregeneratorGUI.java} (96%) rename src/main/java/com/volmit/iris/core/gui/{IrisVision.java => VisionGUI.java} (99%) rename src/main/java/com/volmit/iris/core/gui/{ => components}/IrisRenderer.java (98%) diff --git a/src/main/java/com/volmit/iris/core/gui/IrisExplorer.java b/src/main/java/com/volmit/iris/core/gui/NoiseExplorerGUI.java similarity index 97% rename from src/main/java/com/volmit/iris/core/gui/IrisExplorer.java rename to src/main/java/com/volmit/iris/core/gui/NoiseExplorerGUI.java index c45dc8742..ddc23e332 100644 --- a/src/main/java/com/volmit/iris/core/gui/IrisExplorer.java +++ b/src/main/java/com/volmit/iris/core/gui/NoiseExplorerGUI.java @@ -38,7 +38,7 @@ import java.io.File; import java.io.IOException; import java.util.concurrent.locks.ReentrantLock; -public class IrisExplorer extends JPanel implements MouseWheelListener { +public class NoiseExplorerGUI extends JPanel implements MouseWheelListener { private static final long serialVersionUID = 2094606939770332040L; @@ -74,7 +74,7 @@ public class IrisExplorer extends JPanel implements MouseWheelListener { double t; double tz; - public IrisExplorer() { + public NoiseExplorerGUI() { addMouseWheelListener(this); addMouseMotionListener(new MouseMotionListener() { @Override @@ -237,7 +237,7 @@ public class IrisExplorer extends JPanel implements MouseWheelListener { private static void createAndShowGUI(Function2 gen, String genName) { JFrame frame = new JFrame("Noise Explorer: " + genName); - IrisExplorer nv = new IrisExplorer(); + NoiseExplorerGUI nv = new NoiseExplorerGUI(); frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); JLayeredPane pane = new JLayeredPane(); nv.setSize(new Dimension(1440, 820)); @@ -259,7 +259,7 @@ public class IrisExplorer extends JPanel implements MouseWheelListener { private static void createAndShowGUI() { JFrame frame = new JFrame("Noise Explorer"); - IrisExplorer nv = new IrisExplorer(); + NoiseExplorerGUI nv = new NoiseExplorerGUI(); frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); KList li = new KList<>(NoiseStyle.values()).toStringList(); combo = new JComboBox<>(li.toArray(new String[0])); @@ -296,7 +296,7 @@ public class IrisExplorer extends JPanel implements MouseWheelListener { } public static void launch() { - EventQueue.invokeLater(IrisExplorer::createAndShowGUI); + EventQueue.invokeLater(NoiseExplorerGUI::createAndShowGUI); } static class HandScrollListener extends MouseAdapter { diff --git a/src/main/java/com/volmit/iris/core/gui/IrisPregenerator.java b/src/main/java/com/volmit/iris/core/gui/PregeneratorGUI.java similarity index 96% rename from src/main/java/com/volmit/iris/core/gui/IrisPregenerator.java rename to src/main/java/com/volmit/iris/core/gui/PregeneratorGUI.java index 7a7b7eed4..0aada2f15 100644 --- a/src/main/java/com/volmit/iris/core/gui/IrisPregenerator.java +++ b/src/main/java/com/volmit/iris/core/gui/PregeneratorGUI.java @@ -18,5 +18,5 @@ package com.volmit.iris.core.gui; -public class IrisPregenerator { +public class PregeneratorGUI { } diff --git a/src/main/java/com/volmit/iris/core/gui/IrisVision.java b/src/main/java/com/volmit/iris/core/gui/VisionGUI.java similarity index 99% rename from src/main/java/com/volmit/iris/core/gui/IrisVision.java rename to src/main/java/com/volmit/iris/core/gui/VisionGUI.java index f50272de2..3209177b6 100644 --- a/src/main/java/com/volmit/iris/core/gui/IrisVision.java +++ b/src/main/java/com/volmit/iris/core/gui/VisionGUI.java @@ -19,6 +19,7 @@ package com.volmit.iris.core.gui; import com.volmit.iris.Iris; +import com.volmit.iris.core.gui.components.IrisRenderer; import com.volmit.iris.core.gui.components.RenderType; import com.volmit.iris.engine.IrisComplex; import com.volmit.iris.engine.framework.Engine; @@ -55,7 +56,7 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.function.BiFunction; -public class IrisVision extends JPanel implements MouseWheelListener, KeyListener, MouseMotionListener, MouseInputListener { +public class VisionGUI extends JPanel implements MouseWheelListener, KeyListener, MouseMotionListener, MouseInputListener { private static final long serialVersionUID = 2094606939770332040L; private RenderType currentType = RenderType.BIOME; @@ -129,7 +130,7 @@ public class IrisVision extends JPanel implements MouseWheelListener, KeyListene }); private BufferedImage texture; - public IrisVision(JFrame frame) { + public VisionGUI(JFrame frame) { m.set(8); rs.put(1); addMouseWheelListener(this); @@ -729,7 +730,7 @@ public class IrisVision extends JPanel implements MouseWheelListener, KeyListene private static void createAndShowGUI(Engine r, int s, IrisWorld world) { JFrame frame = new JFrame("Vision"); - IrisVision nv = new IrisVision(frame); + VisionGUI nv = new VisionGUI(frame); nv.world = world; nv.engine = r; nv.renderer = new IrisRenderer(r); diff --git a/src/main/java/com/volmit/iris/core/gui/IrisRenderer.java b/src/main/java/com/volmit/iris/core/gui/components/IrisRenderer.java similarity index 98% rename from src/main/java/com/volmit/iris/core/gui/IrisRenderer.java rename to src/main/java/com/volmit/iris/core/gui/components/IrisRenderer.java index ac23c0644..ad84946d3 100644 --- a/src/main/java/com/volmit/iris/core/gui/IrisRenderer.java +++ b/src/main/java/com/volmit/iris/core/gui/components/IrisRenderer.java @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package com.volmit.iris.core.gui; +package com.volmit.iris.core.gui.components; import com.volmit.iris.core.gui.components.RenderType; import com.volmit.iris.engine.framework.Engine; diff --git a/src/main/java/com/volmit/iris/core/gui/components/Pregenerator.java b/src/main/java/com/volmit/iris/core/gui/components/Pregenerator.java index 0793917c3..096530a2a 100644 --- a/src/main/java/com/volmit/iris/core/gui/components/Pregenerator.java +++ b/src/main/java/com/volmit/iris/core/gui/components/Pregenerator.java @@ -30,7 +30,7 @@ import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.format.Form; import com.volmit.iris.util.function.Consumer2; import com.volmit.iris.util.function.Consumer3; -import com.volmit.iris.util.math.ChunkPosition; +import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.math.M; import com.volmit.iris.util.math.RollingSequence; import com.volmit.iris.util.math.Spiraler; @@ -60,6 +60,7 @@ import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.locks.ReentrantLock; +@Deprecated @Data public class Pregenerator implements Listener { private static Pregenerator instance; @@ -78,12 +79,12 @@ public class Pregenerator implements Listener { private final NBTWorld directWriter; private final AtomicBoolean active; private final AtomicBoolean running; - private final KList errors; + private final KList errors; private final KList onComplete; - private final ChunkPosition max; - private final ChunkPosition min; + private final Position2 max; + private final Position2 min; private final MCAPregenGui gui; - private final KList mcaDefer; + private final KList mcaDefer; private final AtomicInteger generated; private final AtomicInteger generatedLast; private final RollingSequence perSecond; @@ -99,8 +100,8 @@ public class Pregenerator implements Listener { private final long elapsed; private final ChronoLatch latch; private IrisAccess access; - private final KList regionReload; - private KList wait = new KList<>(); + private final KList regionReload; + private KList wait = new KList<>(); public Pregenerator(World world, int blockSize, Runnable onComplete) { this(world, blockSize); @@ -137,8 +138,8 @@ public class Pregenerator implements Listener { MultiBurst burst = new MultiBurst("Iris Pregenerator", 9, Runtime.getRuntime().availableProcessors()); int mcaSize = (((blockSize >> 4) + 2) >> 5) + 1; onComplete = new KList<>(); - max = new ChunkPosition(0, 0); - min = new ChunkPosition(0, 0); + max = new Position2(0, 0); + min = new Position2(0, 0); KList draw = new KList<>(); new Spiraler(mcaSize, mcaSize, (xx, zz) -> { min.setX(Math.min(xx << 5, min.getX())); @@ -153,7 +154,7 @@ public class Pregenerator implements Listener { } gui = dogui ? (IrisSettings.get().getGui().isLocalPregenGui() && IrisSettings.get().getGui().isUseServerLaunchedGuis() ? MCAPregenGui.createAndShowGUI(this) : null) : null; flushWorld(); - KList order = computeChunkOrder(); + KList order = computeChunkOrder(); Consumer3> mcaIteration = (ox, oz, r) -> order.forEach((i) -> r.accept(i.getX() + ox, i.getZ() + oz)); @@ -184,7 +185,7 @@ public class Pregenerator implements Listener { mcaDefer.removeDuplicates(); while (running.get() && mcaDefer.isNotEmpty()) { - ChunkPosition p = mcaDefer.popLast(); + Position2 p = mcaDefer.popLast(); vmcax.set(p.getX()); vmcaz.set(p.getZ()); generateDeferedMCARegion(p.getX(), p.getZ(), burst, mcaIteration); @@ -259,7 +260,7 @@ public class Pregenerator implements Listener { directWriter.save(); } else { totalChunks.getAndAdd(1024); - mcaDefer.add(new ChunkPosition(x, z)); + mcaDefer.add(new Position2(x, z)); e.complete(); return false; } @@ -318,7 +319,7 @@ public class Pregenerator implements Listener { } mcaIteration.accept(mcaox, mcaoz, (ii, jj) -> { - ChunkPosition cx = new ChunkPosition(ii, jj); + Position2 cx = new Position2(ii, jj); PaperLib.getChunkAtAsync(world, ii, jj).thenAccept((c) -> { draw(ii, jj, COLOR_MCA_GENERATE_SLOW_ASYNC); draw(ii, jj, COLOR_MCA_GENERATED); @@ -375,9 +376,9 @@ public class Pregenerator implements Listener { } } - private KList computeChunkOrder() { - ChunkPosition center = new ChunkPosition(15, 15); - KList p = new KList<>(); + private KList computeChunkOrder() { + Position2 center = new Position2(15, 15); + KList p = new KList<>(); new Spiraler(33, 33, (x, z) -> { int xx = x + 15; int zz = z + 15; @@ -385,7 +386,7 @@ public class Pregenerator implements Listener { return; } - p.add(new ChunkPosition(xx, zz)); + p.add(new Position2(xx, zz)); }).drain(); p.sort(Comparator.comparing((i) -> i.distance(center))); return p; @@ -428,7 +429,7 @@ public class Pregenerator implements Listener { private void draw(int cx, int cz, Color color) { if (gui != null) { - gui.func.accept(new ChunkPosition(cx, cz), color); + gui.func.accept(new Position2(cx, cz), color); } } @@ -507,7 +508,7 @@ public class Pregenerator implements Listener { Graphics2D bg; private ReentrantLock l; private final BufferedImage image = new BufferedImage(res, res, BufferedImage.TYPE_INT_RGB); - private Consumer2 func; + private Consumer2 func; private JFrame frame; public MCAPregenGui() { @@ -515,7 +516,7 @@ public class Pregenerator implements Listener { } public void paint(int x, int z, Color c) { - func.accept(new ChunkPosition(x, z), c); + func.accept(new Position2(x, z), c); } @Override @@ -558,7 +559,7 @@ public class Pregenerator implements Listener { repaint(); } - private void draw(ChunkPosition p, Color c, Graphics2D bg) { + private void draw(Position2 p, Color c, Graphics2D bg) { double pw = M.lerpInverse(job.getMin().getX(), job.getMax().getX(), p.getX()); double ph = M.lerpInverse(job.getMin().getZ(), job.getMax().getZ(), p.getZ()); double pwa = M.lerpInverse(job.getMin().getX(), job.getMax().getX(), p.getX() + 1); @@ -582,7 +583,7 @@ public class Pregenerator implements Listener { nv.job = j; nv.func = (c, b) -> { - if (b.equals(Color.pink) && c.equals(new ChunkPosition(Integer.MAX_VALUE, Integer.MAX_VALUE))) { + if (b.equals(Color.pink) && c.equals(new Position2(Integer.MAX_VALUE, Integer.MAX_VALUE))) { frame.hide(); } nv.l.lock(); From 6cfd055becbde4aff9032bdf8054c8367e00d1af Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 04:21:22 -0400 Subject: [PATCH 052/137] Pos utils --- .../com/volmit/iris/util/math/Position2.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/main/java/com/volmit/iris/util/math/Position2.java b/src/main/java/com/volmit/iris/util/math/Position2.java index 94be84e6e..4b1704145 100644 --- a/src/main/java/com/volmit/iris/util/math/Position2.java +++ b/src/main/java/com/volmit/iris/util/math/Position2.java @@ -52,6 +52,26 @@ public class Position2 { return result; } + public Position2 topLeftChunkOfRegion() + { + return new Position2((x >> 5) << 5, (z >> 5) << 5); + } + + public Position2 bottomRightChunkOfRegion() + { + return new Position2((((x >> 5)+1) << 5) - 1, (((z >> 5)+1) << 5) - 1); + } + + public Position2 topRightChunkOfRegion() + { + return new Position2((((x >> 5)+1) << 5) - 1, (z >> 5) << 5); + } + + public Position2 bottomLeftChunkOfRegion() + { + return new Position2((x >> 5) << 5, (((z >> 5)+1) << 5) - 1); + } + @Override public boolean equals(Object obj) { if (this == obj) { @@ -66,4 +86,8 @@ public class Position2 { public double distance(Position2 center) { return Math.pow(center.getX() - x, 2) + Math.pow(center.getZ() - z, 2); } + + public Position2 add(int x, int z) { + return new Position2(this.x + x, this.z + z); + } } From def4e193596507611955a35dd2b5a1bdb7e1bd82 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 04:21:33 -0400 Subject: [PATCH 053/137] Tweaks to headless gens --- .../com/volmit/iris/engine/headless/HeadlessGenerator.java | 6 ++++++ .../java/com/volmit/iris/engine/headless/HeadlessWorld.java | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java b/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java index 68a2dcbc9..95b4e7251 100644 --- a/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java +++ b/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java @@ -18,6 +18,7 @@ package com.volmit.iris.engine.headless; +import com.volmit.iris.core.pregenerator.PregenListener; import com.volmit.iris.engine.data.mca.NBTWorld; import com.volmit.iris.engine.framework.EngineCompositeGenerator; import com.volmit.iris.engine.parallel.MultiBurst; @@ -51,6 +52,11 @@ public class HeadlessGenerator { generator.directWriteMCA(world.getWorld(), x, z, writer, burst); } + public void generateRegion(int x, int z, PregenListener listener) + { + generator.directWriteMCA(world.getWorld(), x, z, writer, burst, listener); + } + public File generateRegionToFile(int x, int z) { generateRegionToFile(x, z); diff --git a/src/main/java/com/volmit/iris/engine/headless/HeadlessWorld.java b/src/main/java/com/volmit/iris/engine/headless/HeadlessWorld.java index c0c09565a..4397274f9 100644 --- a/src/main/java/com/volmit/iris/engine/headless/HeadlessWorld.java +++ b/src/main/java/com/volmit/iris/engine/headless/HeadlessWorld.java @@ -20,7 +20,9 @@ package com.volmit.iris.engine.headless; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisDataManager; +import com.volmit.iris.engine.IrisWorlds; import com.volmit.iris.engine.framework.EngineCompositeGenerator; +import com.volmit.iris.engine.framework.IrisAccess; import com.volmit.iris.engine.object.IrisDimension; import com.volmit.iris.engine.object.common.IrisWorld; import com.volmit.iris.util.plugin.VolmitSender; @@ -73,6 +75,10 @@ public class HeadlessWorld { .createWorld(); } + public static HeadlessWorld from(World world) { + return new HeadlessWorld(world.getName(), IrisWorlds.access(world).getTarget().getDimension(), world.getSeed()); + } + public static HeadlessWorld from(String name, String dimension, long seed) { return new HeadlessWorld(name, IrisDataManager.loadAnyDimension(dimension), seed); From 6d79d3d1f812af0c5365e1910e18ad58c8caa11d Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 04:21:49 -0400 Subject: [PATCH 054/137] Support pregen listeners in iris comp gen --- .../PregenListener.java} | 19 +++++++++++++++++-- .../framework/EngineCompositeGenerator.java | 18 +++++++++++++++++- .../iris/engine/framework/IrisAccess.java | 3 +++ 3 files changed, 37 insertions(+), 3 deletions(-) rename src/main/java/com/volmit/iris/core/{gui/PregeneratorGUI.java => pregenerator/PregenListener.java} (59%) diff --git a/src/main/java/com/volmit/iris/core/gui/PregeneratorGUI.java b/src/main/java/com/volmit/iris/core/pregenerator/PregenListener.java similarity index 59% rename from src/main/java/com/volmit/iris/core/gui/PregeneratorGUI.java rename to src/main/java/com/volmit/iris/core/pregenerator/PregenListener.java index 0aada2f15..5faec9d13 100644 --- a/src/main/java/com/volmit/iris/core/gui/PregeneratorGUI.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/PregenListener.java @@ -16,7 +16,22 @@ * along with this program. If not, see . */ -package com.volmit.iris.core.gui; +package com.volmit.iris.core.pregenerator; -public class PregeneratorGUI { +public interface PregenListener { + void onTick(double chunksPerSecond, double chunksPerMinute, double regionsPerMinute, double percent, int generated, int totalChunks, int chunksRemaining, long eta, long elapsed, String method); + + void onChunkGenerating(int x, int z); + + void onChunkGenerated(int x, int z); + + void onRegionGenerated(int x, int z); + + void onRegionGenerating(int x, int z); + + void onRegionSkipped(int x, int z); + + void onClose(); + + void onSaving(); } diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java b/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java index f16276dcb..bf3067f66 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java @@ -23,6 +23,7 @@ import com.volmit.iris.core.IrisDataManager; import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.nms.BiomeBaseInjector; import com.volmit.iris.core.nms.INMS; +import com.volmit.iris.core.pregenerator.PregenListener; import com.volmit.iris.engine.IrisEngineCompound; import com.volmit.iris.engine.IrisWorlds; import com.volmit.iris.engine.cache.Cache; @@ -460,6 +461,11 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce @Override public void directWriteMCA(IrisWorld w, int x, int z, NBTWorld writer, MultiBurst burst) { + directWriteMCA(w, x, z, writer, burst, null); + } + + @Override + public void directWriteMCA(IrisWorld w, int x, int z, NBTWorld writer, MultiBurst burst, PregenListener l) { BurstExecutor e = burst.burst(1024); int mcaox = x << 5; int mcaoz = z << 5; @@ -468,7 +474,17 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce int ii = i; for (int j = 0; j < 32; j++) { int jj = j; - e.queue(() -> directWriteChunk(w, ii + mcaox, jj + mcaoz, writer)); + e.queue(() -> { + if(l != null) + { + l.onChunkGenerating(ii + mcaox, jj + mcaoz); + } + directWriteChunk(w, ii + mcaox, jj + mcaoz, writer); + if(l != null) + { + l.onChunkGenerated(ii + mcaox, jj + mcaoz); + } + }); } } diff --git a/src/main/java/com/volmit/iris/engine/framework/IrisAccess.java b/src/main/java/com/volmit/iris/engine/framework/IrisAccess.java index 8c6e692f7..1f8919b50 100644 --- a/src/main/java/com/volmit/iris/engine/framework/IrisAccess.java +++ b/src/main/java/com/volmit/iris/engine/framework/IrisAccess.java @@ -20,6 +20,7 @@ package com.volmit.iris.engine.framework; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisDataManager; +import com.volmit.iris.core.pregenerator.PregenListener; import com.volmit.iris.engine.IrisComplex; import com.volmit.iris.engine.data.DataProvider; import com.volmit.iris.engine.data.mca.NBTWorld; @@ -47,6 +48,8 @@ public interface IrisAccess extends Hotloadable, DataProvider { void directWriteMCA(IrisWorld w, int x, int z, NBTWorld writer, MultiBurst burst); + void directWriteMCA(IrisWorld w, int x, int z, NBTWorld writer, MultiBurst burst, PregenListener listener); + void directWriteChunk(IrisWorld w, int x, int z, NBTWorld writer); int getGenerated(); From 98240e910e5506995d679c14d31f5830bdd8162d Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 04:21:54 -0400 Subject: [PATCH 055/137] Pregen tasks --- .../iris/core/pregenerator/PregenTask.java | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/main/java/com/volmit/iris/core/pregenerator/PregenTask.java diff --git a/src/main/java/com/volmit/iris/core/pregenerator/PregenTask.java b/src/main/java/com/volmit/iris/core/pregenerator/PregenTask.java new file mode 100644 index 000000000..ca3b26bf1 --- /dev/null +++ b/src/main/java/com/volmit/iris/core/pregenerator/PregenTask.java @@ -0,0 +1,56 @@ +/* + * 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.core.pregenerator; + +import com.volmit.iris.util.math.Position2; +import com.volmit.iris.util.math.Spiraled; +import com.volmit.iris.util.math.Spiraler; +import lombok.Builder; +import lombok.Data; + +@Builder +@Data +public class PregenTask { + @Builder.Default + private Position2 center = new Position2(0,0); + + @Builder.Default + private int radius = 1; + + public void iterateRegions(Spiraled s) + { + new Spiraler(radius * 2, radius * 2, s) + .setOffset(center.getX(), center.getZ()).drain(); + } + + public void iterateRegion(int x, int z, Spiraled s) + { + new Spiraler(33, 33, (xx, zz) -> { + if (xx < 0 || xx > 31 || zz < 0 || zz > 31) { + s.on(xx+(x<<5), zz+(z<<5)); + } + }).setOffset(15, 15).drain(); + } + + public void iterateAllChunks(Spiraled s) + { + new Spiraler(radius * 2, radius * 2, (x, z) -> iterateRegion(x, z, s)) + .setOffset(center.getX(), center.getZ()).drain(); + } +} From 309f97b44307f03a91681485c309f77ad8647b85 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 04:22:03 -0400 Subject: [PATCH 056/137] Pregen method api --- .../core/pregenerator/PregeneratorMethod.java | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 src/main/java/com/volmit/iris/core/pregenerator/PregeneratorMethod.java diff --git a/src/main/java/com/volmit/iris/core/pregenerator/PregeneratorMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/PregeneratorMethod.java new file mode 100644 index 000000000..9bad0e05a --- /dev/null +++ b/src/main/java/com/volmit/iris/core/pregenerator/PregeneratorMethod.java @@ -0,0 +1,72 @@ +/* + * 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.core.pregenerator; + +/** + * Represents something that is capable of generating in chunks or regions, or both + */ +public interface PregeneratorMethod { + /** + * This is called before any generate methods are called. Setup your generator here + */ + void init(); + + /** + * This is called after the pregenerator is done. Save your work and stop threads + */ + void close(); + + /** + * This is called every X amount of chunks or regions. Save work, + * but no need to save all of it. At the end, close() will still be called. + */ + void save(); + + /** + * Return true if regions can be generated + * @return true if they can be + * @param x the x region + * @param z the z region + */ + boolean supportsRegions(int x, int z); + + /** + * Return the name of the method being used + * @return the name + * @param x the x region + * @param z the z region + */ + String getMethod(int x, int z); + + /** + * Called to generate a region. Execute sync, if multicore internally, wait + * for the task to complete + * @param x the x + * @param z the z + * @param listener signal chunks generating & generated. Parallel capable. + */ + void generateRegion(int x, int z, PregenListener listener); + + /** + * Called to generate a chunk. You can go async so long as save will wait on the threads to finish + * @param x the x + * @param z the z + */ + void generateChunk(int x, int z); +} From e4da11727af3d61cd570c0ad4b31b59dd16b4c5b Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 04:22:14 -0400 Subject: [PATCH 057/137] Pregen methods impl --- .../methods/DummyPregenMethod.java | 59 +++++++++ .../methods/HeadlessPregenMethod.java | 70 +++++++++++ .../methods/HybridPregenMethod.java | 87 +++++++++++++ .../methods/MedievalPregenMethod.java | 80 ++++++++++++ .../methods/PaperAsyncPregenMethod.java | 119 ++++++++++++++++++ .../methods/PaperOrMedievalPregenMethod.java | 68 ++++++++++ 6 files changed, 483 insertions(+) create mode 100644 src/main/java/com/volmit/iris/core/pregenerator/methods/DummyPregenMethod.java create mode 100644 src/main/java/com/volmit/iris/core/pregenerator/methods/HeadlessPregenMethod.java create mode 100644 src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java create mode 100644 src/main/java/com/volmit/iris/core/pregenerator/methods/MedievalPregenMethod.java create mode 100644 src/main/java/com/volmit/iris/core/pregenerator/methods/PaperAsyncPregenMethod.java create mode 100644 src/main/java/com/volmit/iris/core/pregenerator/methods/PaperOrMedievalPregenMethod.java diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/DummyPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/DummyPregenMethod.java new file mode 100644 index 000000000..08c108431 --- /dev/null +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/DummyPregenMethod.java @@ -0,0 +1,59 @@ +/* + * 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.core.pregenerator.methods; + +import com.volmit.iris.core.pregenerator.PregenListener; +import com.volmit.iris.core.pregenerator.PregeneratorMethod; + +public class DummyPregenMethod implements PregeneratorMethod { + @Override + public void init() { + + } + + @Override + public void close() { + + } + + @Override + public String getMethod(int x, int z) { + return "Dummy"; + } + + @Override + public void save() { + + } + + @Override + public boolean supportsRegions(int x, int z) { + return false; + } + + @Override + public void generateRegion(int x, int z, PregenListener listener) { + + } + + @Override + public void generateChunk(int x, int z) { + + } +} diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/HeadlessPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/HeadlessPregenMethod.java new file mode 100644 index 000000000..c42155da0 --- /dev/null +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/HeadlessPregenMethod.java @@ -0,0 +1,70 @@ +/* + * 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.core.pregenerator.methods; + +import com.volmit.iris.core.pregenerator.PregenListener; +import com.volmit.iris.core.pregenerator.PregeneratorMethod; +import com.volmit.iris.engine.headless.HeadlessGenerator; +import com.volmit.iris.engine.headless.HeadlessWorld; + +public class HeadlessPregenMethod implements PregeneratorMethod { + private final HeadlessWorld world; + private final HeadlessGenerator generator; + + public HeadlessPregenMethod(HeadlessWorld world) + { + this.world = world; + this.generator = world.generate(); + } + + @Override + public void init() { + + } + + @Override + public void close() { + generator.close(); + } + + @Override + public void save() { + generator.save(); + } + + @Override + public boolean supportsRegions(int x, int z) { + return true; + } + + @Override + public String getMethod(int x, int z) { + return "Headless"; + } + + @Override + public void generateRegion(int x, int z, PregenListener listener) { + generator.generateRegion(x, z, listener); + } + + @Override + public void generateChunk(int x, int z) { + throw new UnsupportedOperationException(); + } +} diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java new file mode 100644 index 000000000..b6efb1c25 --- /dev/null +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java @@ -0,0 +1,87 @@ +/* + * 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.core.pregenerator.methods; + +import com.volmit.iris.core.pregenerator.PregenListener; +import com.volmit.iris.core.pregenerator.PregeneratorMethod; +import com.volmit.iris.engine.IrisWorlds; +import com.volmit.iris.engine.headless.HeadlessWorld; +import org.bukkit.World; + +import java.io.File; + +public class HybridPregenMethod implements PregeneratorMethod { + private final PregeneratorMethod headless; + private final PregeneratorMethod inWorld; + private final World world; + + public HybridPregenMethod(World world, int threads) + { + this.world = world; + headless = supportsHeadless(world) + ? new HeadlessPregenMethod(HeadlessWorld.from(world)) : new DummyPregenMethod(); + inWorld = new PaperOrMedievalPregenMethod(world, threads); + } + + private boolean supportsHeadless(World world) { + return IrisWorlds.access(world) != null; + } + + @Override + public String getMethod(int x, int z) { + return "Hybrid<" + ((supportsRegions(x, z) ? headless.getMethod(x, z) : inWorld.getMethod(x, z)) + ">"); + } + + @Override + public void init() { + headless.init(); + inWorld.init(); + } + + @Override + public void close() { + headless.close(); + inWorld.close(); + } + + @Override + public void save() { + headless.save(); + inWorld.save(); + } + + @Override + public boolean supportsRegions(int x, int z) { + if (headless instanceof DummyPregenMethod) { + return false; + } + + return !new File(world.getWorldFolder(), "region/r." + x + "." + z + ".mca").exists(); + } + + @Override + public void generateRegion(int x, int z, PregenListener listener) { + headless.generateRegion(x, z, listener); + } + + @Override + public void generateChunk(int x, int z) { + inWorld.generateChunk(x, z); + } +} diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/MedievalPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/MedievalPregenMethod.java new file mode 100644 index 000000000..51ec8086c --- /dev/null +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/MedievalPregenMethod.java @@ -0,0 +1,80 @@ +/* + * 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.core.pregenerator.methods; + +import com.volmit.iris.core.pregenerator.PregenListener; +import com.volmit.iris.core.pregenerator.PregeneratorMethod; +import com.volmit.iris.util.scheduling.J; +import org.bukkit.Chunk; +import org.bukkit.World; + +public class MedievalPregenMethod implements PregeneratorMethod { + private final World world; + + public MedievalPregenMethod(World world) + { + this.world = world; + } + + private void unloadAndSaveAllChunks() { + J.s(() -> { + for(Chunk i : world.getLoadedChunks()) + { + i.unload(true); + } + }); + } + + @Override + public void init() { + unloadAndSaveAllChunks(); + } + + @Override + public void close() { + unloadAndSaveAllChunks(); + world.save(); + } + + @Override + public void save() { + unloadAndSaveAllChunks(); + world.save(); + } + + @Override + public boolean supportsRegions(int x, int z) { + return false; + } + + @Override + public void generateRegion(int x, int z, PregenListener listener) { + throw new UnsupportedOperationException(); + } + + @Override + public String getMethod(int x, int z) { + return "Medieval"; + } + + @Override + public void generateChunk(int x, int z) { + world.getChunkAt(x, z); + } +} diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperAsyncPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperAsyncPregenMethod.java new file mode 100644 index 000000000..f38046a23 --- /dev/null +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperAsyncPregenMethod.java @@ -0,0 +1,119 @@ +/* + * 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.core.pregenerator.methods; + +import com.volmit.iris.core.pregenerator.PregenListener; +import com.volmit.iris.core.pregenerator.PregeneratorMethod; +import com.volmit.iris.engine.parallel.MultiBurst; +import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.scheduling.J; +import io.papermc.lib.PaperLib; +import org.bukkit.Chunk; +import org.bukkit.World; + +import java.util.concurrent.CompletableFuture; + +public class PaperAsyncPregenMethod implements PregeneratorMethod { + private final World world; + private final MultiBurst burst; + private final KList> future; + + public PaperAsyncPregenMethod(World world, int threads) + { + if(!PaperLib.isPaper()) + { + throw new UnsupportedOperationException("Cannot use PaperAsync on non paper!"); + } + + this.world = world; + burst = new MultiBurst("Iris PaperAsync Pregenerator", 6, threads); + future = new KList<>(1024); + } + + private void unloadAndSaveAllChunks() { + J.s(() -> { + for(Chunk i : world.getLoadedChunks()) + { + i.unload(true); + } + }); + } + + private void completeChunk(int x, int z) { + try { + PaperLib.getChunkAtAsync(world, x, z, true).get(); + } catch (Throwable e) { + e.printStackTrace(); + } + } + + private void waitForChunks() + { + for(CompletableFuture i : future) + { + try { + i.get(); + } catch (Throwable e) { + e.printStackTrace(); + } + } + + future.clear(); + } + + @Override + public void init() { + unloadAndSaveAllChunks(); + } + + @Override + public String getMethod(int x, int z) { + return "Async"; + } + + @Override + public void close() { + waitForChunks(); + burst.shutdownAndAwait(); + unloadAndSaveAllChunks(); + world.save(); + } + + @Override + public void save() { + waitForChunks(); + unloadAndSaveAllChunks(); + world.save(); + } + + @Override + public boolean supportsRegions(int x, int z) { + return false; + } + + @Override + public void generateRegion(int x, int z, PregenListener listener) { + throw new UnsupportedOperationException(); + } + + @Override + public void generateChunk(int x, int z) { + future.add(burst.complete(() -> completeChunk(x, z))); + } +} diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperOrMedievalPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperOrMedievalPregenMethod.java new file mode 100644 index 000000000..4608b68e6 --- /dev/null +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperOrMedievalPregenMethod.java @@ -0,0 +1,68 @@ +/* + * 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.core.pregenerator.methods; + +import com.volmit.iris.core.pregenerator.PregenListener; +import com.volmit.iris.core.pregenerator.PregeneratorMethod; +import io.papermc.lib.PaperLib; +import org.bukkit.World; + +public class PaperOrMedievalPregenMethod implements PregeneratorMethod { + private final PregeneratorMethod method; + + public PaperOrMedievalPregenMethod(World world, int threads) + { + method = PaperLib.isPaper() ? new PaperAsyncPregenMethod(world, threads) : new MedievalPregenMethod(world); + } + + @Override + public void init() { + method.init(); + } + + @Override + public void close() { + method.close(); + } + + @Override + public void save() { + method.save(); + } + + @Override + public String getMethod(int x, int z) { + return method.getMethod(x, z); + } + + @Override + public boolean supportsRegions(int x, int z) { + return false; + } + + @Override + public void generateRegion(int x, int z, PregenListener listener) { + throw new UnsupportedOperationException(); + } + + @Override + public void generateChunk(int x, int z) { + method.generateChunk(x, z); + } +} From 2d531c3a153f776b1184fdd094af856ee15bed55 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 04:22:24 -0400 Subject: [PATCH 058/137] The Iris pregenerator (logic) --- .../core/pregenerator/IrisPregenerator.java | 220 ++++++++++++++++++ 1 file changed, 220 insertions(+) create mode 100644 src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java diff --git a/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java b/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java new file mode 100644 index 000000000..c1cedf84c --- /dev/null +++ b/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java @@ -0,0 +1,220 @@ +/* + * 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.core.pregenerator; + +import com.google.common.util.concurrent.AtomicDouble; +import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.collection.KSet; +import com.volmit.iris.util.math.M; +import com.volmit.iris.util.math.Position2; +import com.volmit.iris.util.math.RollingSequence; +import com.volmit.iris.util.scheduling.ChronoLatch; +import com.volmit.iris.util.scheduling.J; +import com.volmit.iris.util.scheduling.Looper; + +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.atomic.AtomicReference; + +public class IrisPregenerator { + private final PregenTask task; + private final PregeneratorMethod generator; + private final PregenListener listener; + private final Looper ticker; + private final AtomicBoolean paused; + private final AtomicBoolean shutdown; + private final RollingSequence chunksPerSecond; + private final RollingSequence chunksPerMinute; + private final RollingSequence regionsPerMinute; + private final AtomicInteger generated; + private final AtomicInteger generatedLast; + private final AtomicInteger generatedLastMinute; + private final AtomicInteger totalChunks; + private final AtomicLong startTime; + private final ChronoLatch minuteLatch; + private final AtomicReference currentGeneratorMethod; + + public IrisPregenerator(PregenTask task, PregeneratorMethod generator, PregenListener listener) + { + this.listener = listenify(listener); + this.shutdown = new AtomicBoolean(false); + this.paused = new AtomicBoolean(false); + this.task = task; + this.generator = generator; + currentGeneratorMethod = new AtomicReference<>("Void"); + minuteLatch = new ChronoLatch(60000, false); + chunksPerSecond = new RollingSequence(10); + chunksPerMinute = new RollingSequence(10); + regionsPerMinute = new RollingSequence(10); + generated = new AtomicInteger(0); + generatedLast = new AtomicInteger(0); + generatedLastMinute = new AtomicInteger(0); + totalChunks = new AtomicInteger(0); + startTime = new AtomicLong(M.ms()); + ticker = new Looper() { + @Override + protected long loop() { + long eta = computeETA(); + int secondGenerated = generated.get() - generatedLast.get(); + generatedLast.set(generated.get()); + chunksPerSecond.put(secondGenerated); + + if(minuteLatch.flip()) + { + int minuteGenerated = generated.get() - generatedLastMinute.get(); + generatedLastMinute.set(generated.get()); + chunksPerMinute.put(minuteGenerated); + regionsPerMinute.put((double)minuteGenerated / 1024D); + } + + listener.onTick(chunksPerSecond.getAverage(), chunksPerMinute.getAverage(), + regionsPerMinute.getAverage(), + (double)generated.get() / (double)totalChunks.get(), + generated.get(), totalChunks.get(), + totalChunks.get() - generated.get(), + eta, M.ms() - startTime.get(), currentGeneratorMethod.get()); + return 1000; + } + }; + } + + private long computeETA() { + return (long) ((totalChunks.get() - generated.get()) * + ((double) (M.ms() - startTime.get()) / (double) generated.get())); + } + + public void close() + { + shutdown.set(true); + } + + public void start() + { + init(); + task.iterateRegions((__, ___) -> totalChunks.addAndGet(1024)); + ticker.start(); + task.iterateRegions(this::visitRegion); + shutdown(); + } + + private void init() { + generator.init(); + } + + private void shutdown() { + listener.onSaving(); + generator.close(); + ticker.interrupt(); + listener.onClose(); + } + + private void visitRegion(int x, int z) { + while(paused.get() && !shutdown.get()) + { + J.sleep(50); + } + + if(shutdown.get()) + { + listener.onRegionSkipped(x, z); + return; + } + + listener.onRegionGenerating(x, z); + currentGeneratorMethod.set(generator.getMethod(x, z)); + + if(generator.supportsRegions(x, z)) + { + generator.generateRegion(x, z, listener); + } + + else + { + task.iterateRegion(x, z, (xx, zz) -> { + listener.onChunkGenerating(xx, zz); + generator.generateChunk(xx, zz); + listener.onChunkGenerated(xx, zz); + }); + } + + listener.onRegionGenerated(x, z); + listener.onSaving(); + generator.save(); + } + + public void pause() + { + paused.set(true); + } + + public void resume() + { + paused.set(false); + } + + private PregenListener listenify(PregenListener listener) { + return new PregenListener() { + @Override + public void onTick(double chunksPerSecond, double chunksPerMinute, double regionsPerMinute, double percent, int generated, int totalChunks, int chunksRemaining, long eta, long elapsed, String method) { + listener.onTick( chunksPerSecond, chunksPerMinute, regionsPerMinute, percent, generated, totalChunks, chunksRemaining, eta, elapsed, method); + } + + @Override + public void onChunkGenerating(int x, int z) { + listener.onChunkGenerating(x, z); + } + + @Override + public void onChunkGenerated(int x, int z) { + listener.onChunkGenerated(x, z); + generated.addAndGet(1); + } + + @Override + public void onRegionGenerated(int x, int z) { + listener.onRegionGenerated(x, z); + } + + @Override + public void onRegionGenerating(int x, int z) { + listener.onRegionGenerating(x, z); + } + + @Override + public void onRegionSkipped(int x, int z) { + listener.onRegionSkipped(x, z); + } + + @Override + public void onClose() { + listener.onClose(); + } + + @Override + public void onSaving() { + listener.onSaving(); + } + }; + } + + public boolean paused() { + return paused.get(); + } +} From 5d5a1fadd98479e26934f6db2fd17606da4a2f1b Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 04:22:33 -0400 Subject: [PATCH 059/137] The Iris Pregenerator (job) --- .../volmit/iris/core/gui/PregeneratorJob.java | 299 ++++++++++++++++++ 1 file changed, 299 insertions(+) create mode 100644 src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java diff --git a/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java b/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java new file mode 100644 index 000000000..bd3f110f9 --- /dev/null +++ b/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java @@ -0,0 +1,299 @@ +/* + * 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.core.gui; + +import com.volmit.iris.Iris; +import com.volmit.iris.core.IrisSettings; +import com.volmit.iris.core.gui.components.Pregenerator; +import com.volmit.iris.core.pregenerator.IrisPregenerator; +import com.volmit.iris.core.pregenerator.PregenListener; +import com.volmit.iris.core.pregenerator.PregenTask; +import com.volmit.iris.core.pregenerator.PregeneratorMethod; +import com.volmit.iris.engine.object.IrisBiomeCustom; +import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.format.Form; +import com.volmit.iris.util.function.Consumer2; +import com.volmit.iris.util.math.M; +import com.volmit.iris.util.math.Position2; +import com.volmit.iris.util.scheduling.J; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.awt.image.BufferedImage; +import java.util.concurrent.locks.ReentrantLock; + +public class PregeneratorJob implements PregenListener { + public static PregeneratorJob instance; + private static final Color COLOR_GENERATING = parseColor("#346beb"); + private static final Color COLOR_GENERATED = parseColor("#34eb93"); + private JFrame frame; + private final PregenTask task; + private boolean saving; + private final IrisPregenerator pregenerator; + private PregenRenderer renderer; + private String[] info; + + public PregeneratorJob(PregenTask task, PregeneratorMethod method) + { + instance = this; + saving = false; + info = new String[]{"Initializing..."}; + this.task = task; + this.pregenerator = new IrisPregenerator(task, method, this); + this.pregenerator.start(); + } + + public void draw(int x, int z, Color color) + { + try + { + if(renderer != null && frame != null && frame.isVisible()) + { + renderer.func.accept(new Position2(x, z), color); + } + } + + catch(Throwable ignored) + { + + } + } + + public void stop() + { + J.a(() -> { + pregenerator.close(); + close(); + instance = null; + }); + } + + public void close() + { + J.a(() -> { + try + { + frame.setVisible(false); + } + + catch(Throwable e) + { + + } + }); + } + + public void open() + { + J.a(() -> { + try + { + frame = new JFrame("Pregen View"); + renderer = new PregenRenderer(); + frame.addKeyListener(renderer); + renderer.l = new ReentrantLock(); + renderer.frame = frame; + renderer.job = this; + renderer.func = (c, b) -> + { + renderer.l.lock(); + renderer.order.add(() -> renderer.draw(c, b, renderer.bg)); + renderer.l.unlock(); + }; + frame.add(renderer); + frame.setSize(1000, 1000); + frame.setVisible(true); + } + + catch(Throwable e) + { + + } + }); + } + + @Override + public void onTick(double chunksPerSecond, double chunksPerMinute, double regionsPerMinute, double percent, int generated, int totalChunks, int chunksRemaining, long eta, long elapsed, String method) { + info = new String[] { + (paused() ? "PAUSED" : (saving ? "Saving... " : "Generating")) + " " + Form.f(generated) + " of " + Form.f(totalChunks) + " (" + Form.pc(percent, 0) + " Complete)", + "Speed: " + Form.f(chunksPerSecond, 0) + " Chunks/s, " + Form.f(regionsPerMinute, 1) + " Regions/m, " + Form.f(chunksPerMinute, 0) + " Chunks/m", + Form.duration(eta, 2) + " Remaining " + " (" + Form.duration(elapsed, 2) + " Elapsed)", + "Generation Method: " + method, + }; + } + + @Override + public void onChunkGenerating(int x, int z) { + draw(x, z, COLOR_GENERATING); + } + + @Override + public void onChunkGenerated(int x, int z) { + draw(x, z, COLOR_GENERATED); + } + + @Override + public void onRegionGenerated(int x, int z) { + + } + + @Override + public void onRegionGenerating(int x, int z) { + + } + + @Override + public void onRegionSkipped(int x, int z) { + + } + + @Override + public void onClose() { + close(); + instance = null; + } + + @Override + public void onSaving() { + saving = true; + } + + private Position2 getMax() { + return task.getCenter().add(task.getRadius(), task.getRadius()).bottomRightChunkOfRegion(); + } + + private Position2 getMin() { + return task.getCenter().add(-task.getRadius(), -task.getRadius()).topLeftChunkOfRegion(); + } + + private boolean paused() { + return pregenerator.paused(); + } + + private String[] getProgress() { + return info; + } + + public static class PregenRenderer extends JPanel implements KeyListener { + private PregeneratorJob job; + private static final long serialVersionUID = 2094606939770332040L; + private final KList order = new KList<>(); + private final int res = 512; + Graphics2D bg; + private ReentrantLock l; + private final BufferedImage image = new BufferedImage(res, res, BufferedImage.TYPE_INT_RGB); + private Consumer2 func; + private JFrame frame; + + public PregenRenderer() { + + } + + public void paint(int x, int z, Color c) { + func.accept(new Position2(x, z), c); + } + + @Override + public void paint(Graphics gx) { + Graphics2D g = (Graphics2D) gx; + bg = (Graphics2D) image.getGraphics(); + l.lock(); + + while (order.isNotEmpty()) { + try { + order.pop().run(); + } catch (Throwable e) { + Iris.reportError(e); + + } + } + + l.unlock(); + g.drawImage(image, 0, 0, getParent().getWidth(), getParent().getHeight(), (img, infoflags, x, y, width, height) -> true); + g.setColor(Color.WHITE); + g.setFont(new Font("Hevetica", Font.BOLD, 28)); + String[] prog = job.getProgress(); + int h = g.getFontMetrics().getHeight() + 5; + int hh = 20; + + if (job.paused()) { + g.drawString("PAUSED", 20, hh += h); + + g.drawString("Press P to Resume", 20, hh += h); + } else { + for (String i : prog) { + g.drawString(i, 20, hh += h); + } + + g.drawString("Press P to Pause", 20, hh += h); + } + + J.sleep(IrisSettings.get().getGui().isMaximumPregenGuiFPS() ? 4 : 250); + repaint(); + } + + private void draw(Position2 p, Color c, Graphics2D bg) { + double pw = M.lerpInverse(job.getMin().getX(), job.getMax().getX(), p.getX()); + double ph = M.lerpInverse(job.getMin().getZ(), job.getMax().getZ(), p.getZ()); + double pwa = M.lerpInverse(job.getMin().getX(), job.getMax().getX(), p.getX() + 1); + double pha = M.lerpInverse(job.getMin().getZ(), job.getMax().getZ(), p.getZ() + 1); + int x = (int) M.lerp(0, res, pw); + int z = (int) M.lerp(0, res, ph); + int xa = (int) M.lerp(0, res, pwa); + int za = (int) M.lerp(0, res, pha); + bg.setColor(c); + bg.fillRect(x, z, xa - x, za - z); + } + + @Override + public void keyTyped(KeyEvent e) { + + } + + @Override + public void keyPressed(KeyEvent e) { + + } + + @Override + public void keyReleased(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_P) { + Pregenerator.pauseResume(); + } + } + + public void close() { + frame.setVisible(false); + } + } + + private static Color parseColor(String c) { + String v = (c.startsWith("#") ? c : "#" + c).trim(); + try { + return Color.decode(v); + } catch (Throwable e) { + Iris.reportError(e); + Iris.error("Error Parsing 'color', (" + c + ")"); + } + + return Color.RED; + } +} From 66894c2e8a00ac56ae0ce90898b7254d7a831fed Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 04:30:59 -0400 Subject: [PATCH 060/137] Pregen utils for commands --- .../volmit/iris/core/gui/PregeneratorJob.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java b/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java index bd3f110f9..3f5cb15a7 100644 --- a/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java +++ b/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java @@ -18,6 +18,7 @@ package com.volmit.iris.core.gui; +import com.sk89q.worldedit.function.factory.ApplyRegion; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.gui.components.Pregenerator; @@ -61,6 +62,46 @@ public class PregeneratorJob implements PregenListener { this.pregenerator.start(); } + public static boolean shutdownInstance() { + if(instance == null) + { + return false; + } + + J.a(() -> instance.pregenerator.close()); + return true; + } + + public static PregeneratorJob getInstance() { + return instance; + } + + public static void pauseResume() { + if(instance == null) + { + return; + } + + if(isPaused()) + { + instance.pregenerator.resume(); + } + + else + { + instance.pregenerator.pause(); + } + } + + public static boolean isPaused() { + if(instance == null) + { + return true; + } + + return instance.paused(); + } + public void draw(int x, int z, Color color) { try From 482ca5ed15b72d71799d4fdc9d42f723ee200c04 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 04:31:06 -0400 Subject: [PATCH 061/137] Command tests --- .../core/command/world/CommandIrisPregen.java | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java b/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java index de70f9ce3..3cd7571c9 100644 --- a/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java +++ b/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java @@ -19,8 +19,12 @@ package com.volmit.iris.core.command.world; import com.volmit.iris.Iris; +import com.volmit.iris.core.gui.PregeneratorJob; import com.volmit.iris.core.gui.components.Pregenerator; +import com.volmit.iris.core.pregenerator.PregenTask; +import com.volmit.iris.core.pregenerator.methods.PaperOrMedievalPregenMethod; import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.plugin.MortarCommand; import com.volmit.iris.util.plugin.VolmitSender; import org.bukkit.Bukkit; @@ -69,17 +73,17 @@ public class CommandIrisPregen extends MortarCommand { } if (args[0].equalsIgnoreCase("stop") || args[0].equalsIgnoreCase("x")) { - if (Pregenerator.shutdownInstance()) { + if (PregeneratorJob.shutdownInstance()) { sender.sendMessage("Stopped Pregen."); } else { sender.sendMessage("No Active Pregens."); } return true; } else if (args[0].equalsIgnoreCase("pause") || args[0].equalsIgnoreCase("resume")) { - if (Pregenerator.getInstance() != null) { - Pregenerator.pauseResume(); + if (PregeneratorJob.getInstance() != null) { + PregeneratorJob.pauseResume(); - if (Pregenerator.isPaused()) { + if (PregeneratorJob.isPaused()) { sender.sendMessage("Pregen Paused"); } else { sender.sendMessage("Pregen Resumed"); @@ -105,7 +109,12 @@ public class CommandIrisPregen extends MortarCommand { } } try { - new Pregenerator(world, getVal(args[0]) * 2); + new PregeneratorJob(PregenTask + .builder() + .center(new Position2(0, 0)) + .radius(getVal(args[0])) + .build(), + new PaperOrMedievalPregenMethod(world, 16)); } catch (NumberFormatException e) { Iris.reportError(e); sender.sendMessage("Invalid argument in command"); From bc3aaa94de735d55baff6224c3b8c9967755a8e7 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 04:33:14 -0400 Subject: [PATCH 062/137] Actual command tests --- .../volmit/iris/core/command/world/CommandIrisPregen.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java b/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java index 3cd7571c9..f34d9a189 100644 --- a/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java +++ b/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java @@ -140,7 +140,12 @@ public class CommandIrisPregen extends MortarCommand { } World world = Bukkit.getWorld(args[1]); try { - new Pregenerator(world, getVal(args[0]) * 2); + new PregeneratorJob(PregenTask + .builder() + .center(new Position2(0, 0)) + .radius(getVal(args[0])) + .build(), + new PaperOrMedievalPregenMethod(world, 16)); } catch (NumberFormatException e) { Iris.reportError(e); sender.sendMessage("Invalid argument in command"); From a0ecf72a1c01f61a0b643549ec9cfa03049910bc Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 04:34:34 -0400 Subject: [PATCH 063/137] Open gui on pregen start --- src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java b/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java index 3f5cb15a7..af3666557 100644 --- a/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java +++ b/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java @@ -60,6 +60,7 @@ public class PregeneratorJob implements PregenListener { this.task = task; this.pregenerator = new IrisPregenerator(task, method, this); this.pregenerator.start(); + open(); } public static boolean shutdownInstance() { From 658043690057672f6795deff4ed99a8010dc1769 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 04:37:06 -0400 Subject: [PATCH 064/137] Async pregen start --- src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java b/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java index af3666557..f491f76fe 100644 --- a/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java +++ b/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java @@ -59,7 +59,7 @@ public class PregeneratorJob implements PregenListener { info = new String[]{"Initializing..."}; this.task = task; this.pregenerator = new IrisPregenerator(task, method, this); - this.pregenerator.start(); + J.a(this.pregenerator::start); open(); } From 579e2e95e3f0d8026f8fa9d6701b883de07915a9 Mon Sep 17 00:00:00 2001 From: CocoTheOwner Date: Mon, 19 Jul 2021 11:07:24 +0200 Subject: [PATCH 065/137] Remove old, shove in new. --- .github/ISSUE_TEMPLATE/bug.yml | 71 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/bug_report.md | 34 ----------- .github/ISSUE_TEMPLATE/feature.yml | 46 +++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 17 ------ 4 files changed, 117 insertions(+), 51 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/bug.yml delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature.yml delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml new file mode 100644 index 000000000..b9104754f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -0,0 +1,71 @@ +name: Iris Bug Report +description: File a bug report for Iris +labels: [bug] +body: + - type: markdown + attributes: + value: | + Thank you for taking the time to fill this out! + If this does not work for you, feel free to use the [blank](https://github.com/VolmitSoftware/Iris/issues/new) format. + - type: textarea + id: how + attributes: + label: Problem + description: Please give a text description of how you reached the problem + value: | + 1. Install Iris... + 2. Do this... + 3. Do that... + 4. Observe the error... + render: txt + validations: + required: true + - type: textarea + id: what + attributes: + label: Solution + description: Explain where you think the problem comes from (optional) + placeholder: The code to place a is missing b and c... + validations: + required: false + - type: dropdown + id: mcversion + attributes: + label: Minecraft Version + description: What version of Minecraft is the server on? + options: + - 1.14 to 1.16.5 + - 1.17.x + - 1.18.x + validations: + required: true + - type: input + id: irisversion + attributes: + label: Iris Version + description: What version of Iris are you running? (see console) + placeholder: DO NOT SAY "LATEST" + validations: + required: true + - type: input + id: logs + attributes: + label: Log + description: Paste a full log. Always use [mclogs](https://mclo.gs) Or [Pastebin](https://pastebin.com/). Must not be a crash report. Must be a full log. Must not be a screenshot of a log. + placeholder: https://mslog.gs/... + validations: + required: true + - type: checkboxes + id: checksum + attributes: + label: Checklist + description: Please ensure you meet each of the requirements below + options: + - label: I am using an unmodified version of Iris. (If you modified the plugin and see an issue, make sure it is reproducable on the latest spigot version or contact [support](discord.gg/volmit)) + required: true + - label: I am using Spigot, Paper, Tuinity, or Purpur. (If you are not, and still think it is a valid issue, contact [support](discord.gg/volmit)) + required: true + - type: markdown + id: thanks + attributes: + value: "Thank you for filling out the form! We will be with you soon. Please do not ask support to review your report." diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index c07dfb6be..000000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -name: Bug report about: Create a report to help us improve title: '' -labels: Bug assignees: '' - ---- - -**Describe the bug** -A clear and concise description of what the bug is. - -**To Reproduce** -Steps to reproduce the behavior: - -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots or Video Recordings** -If applicable, add screenshots or video recordings to help explain your problem. - -**Server and Plugin Information** - -- Installed plugins: -- Iris Version: -- Server Platform and Version [eg: PaperSpigot 1.16.3 #240]: -- Operating System (if applicable): -- Server Logs: - -**Additional context** -Add any other context about the problem here, server timings reports, Iris dump information, complete console log etc. -Please do not make Pastebin dumps or screenshot expire. diff --git a/.github/ISSUE_TEMPLATE/feature.yml b/.github/ISSUE_TEMPLATE/feature.yml new file mode 100644 index 000000000..afcfb2031 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature.yml @@ -0,0 +1,46 @@ +name: Iris Feature Request +description: File a feature request for Iris. If you want to report a bug this is not the place. +labels: [feature] +body: + - type: markdown + attributes: + value: | + Thank you for taking the time to fill this out! + If this does not work for you, feel free to use the [blank](https://github.com/VolmitSoftware/Iris/issues/new) format. + - type: dropdown + id: arc + attributes: + label: Adding, Removing, or Changing + description: What are you doing + options: + - Adding + - Removing + - Changing + validations: + required: true + - type: input + id: atype + attributes: + label: Type of Modification + description: What is it for? + value: I want to ... + validations: + required: true + - type: textarea + id: desc + attributes: + label: What are you trying to modify + description: Give as detailed of a description as you can for the modification that you want done (include pictures if applicable) + value: The way I would implement this is ... + validations: + required: true + - type: textarea + id: alternative + attributes: + label: Alternatives + description: What alternatives have you considered? + value: If this could not be implemented I would ... + - type: markdown + id: thanks + attributes: + value: "Thank you for filling out the form! We will be with you soon. Please do not ask support to review your report." diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index aab81ed77..000000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -name: Feature request about: Suggest an idea for this project title: '' -labels: Enhancement, Addition assignees: '' - ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. From b2630cfb498e78981db1e741be40a221073f252c Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 05:40:43 -0400 Subject: [PATCH 066/137] Pos tostring --- src/main/java/com/volmit/iris/util/math/Position2.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/volmit/iris/util/math/Position2.java b/src/main/java/com/volmit/iris/util/math/Position2.java index 4b1704145..2acd4148f 100644 --- a/src/main/java/com/volmit/iris/util/math/Position2.java +++ b/src/main/java/com/volmit/iris/util/math/Position2.java @@ -43,6 +43,11 @@ public class Position2 { this.z = z; } + public String toString() + { + return "[" + x + "," + z + "]"; + } + @Override public int hashCode() { final int prime = 31; From 126481833b9fe0df5fb05645d1fa3d59591cf6ef Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 05:40:48 -0400 Subject: [PATCH 067/137] Sync get future --- src/main/java/com/volmit/iris/util/scheduling/J.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/com/volmit/iris/util/scheduling/J.java b/src/main/java/com/volmit/iris/util/scheduling/J.java index a9706c505..583492d51 100644 --- a/src/main/java/com/volmit/iris/util/scheduling/J.java +++ b/src/main/java/com/volmit/iris/util/scheduling/J.java @@ -208,6 +208,15 @@ public class J { Bukkit.getScheduler().scheduleSyncDelayedTask(Iris.instance, r); } + public static CompletableFuture sfut(Runnable r) { + CompletableFuture f = new CompletableFuture(); + Bukkit.getScheduler().scheduleSyncDelayedTask(Iris.instance, () -> { + r.run(); + f.complete(null); + }); + return f; + } + /** * Queue a sync task * From 37e70fd5bb3902f08b85a35a7afb12caaaccb547 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 05:41:01 -0400 Subject: [PATCH 068/137] fix pregen command to use mca coords --- .../com/volmit/iris/core/command/world/CommandIrisPregen.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java b/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java index f34d9a189..422150803 100644 --- a/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java +++ b/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java @@ -112,7 +112,7 @@ public class CommandIrisPregen extends MortarCommand { new PregeneratorJob(PregenTask .builder() .center(new Position2(0, 0)) - .radius(getVal(args[0])) + .radius(((getVal(args[0])>>4)>>5) + 1) .build(), new PaperOrMedievalPregenMethod(world, 16)); } catch (NumberFormatException e) { @@ -143,7 +143,7 @@ public class CommandIrisPregen extends MortarCommand { new PregeneratorJob(PregenTask .builder() .center(new Position2(0, 0)) - .radius(getVal(args[0])) + .radius(((getVal(args[0])>>4)>>5) + 1) .build(), new PaperOrMedievalPregenMethod(world, 16)); } catch (NumberFormatException e) { From 90d2cf497027773a7cabc93cc7f70df51e50d61f Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 05:41:10 -0400 Subject: [PATCH 069/137] Pregen job tweaks --- .../java/com/volmit/iris/core/gui/PregeneratorJob.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java b/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java index f491f76fe..c86cf8633 100644 --- a/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java +++ b/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java @@ -18,15 +18,12 @@ package com.volmit.iris.core.gui; -import com.sk89q.worldedit.function.factory.ApplyRegion; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; -import com.volmit.iris.core.gui.components.Pregenerator; import com.volmit.iris.core.pregenerator.IrisPregenerator; import com.volmit.iris.core.pregenerator.PregenListener; import com.volmit.iris.core.pregenerator.PregenTask; import com.volmit.iris.core.pregenerator.PregeneratorMethod; -import com.volmit.iris.engine.object.IrisBiomeCustom; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.format.Form; import com.volmit.iris.util.function.Consumer2; @@ -215,11 +212,11 @@ public class PregeneratorJob implements PregenListener { @Override public void onSaving() { - saving = true; + } private Position2 getMax() { - return task.getCenter().add(task.getRadius(), task.getRadius()).bottomRightChunkOfRegion(); + return task.getCenter().add(task.getRadius(), task.getRadius()).topLeftChunkOfRegion(); } private Position2 getMin() { @@ -318,7 +315,7 @@ public class PregeneratorJob implements PregenListener { @Override public void keyReleased(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_P) { - Pregenerator.pauseResume(); + PregeneratorJob.pauseResume(); } } From 756f395158e133852853b5e472af2eed183db2e9 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 05:41:19 -0400 Subject: [PATCH 070/137] Method api & impl changes --- .../core/pregenerator/PregeneratorMethod.java | 3 +- .../methods/DummyPregenMethod.java | 2 +- .../methods/HeadlessPregenMethod.java | 2 +- .../methods/HybridPregenMethod.java | 4 +-- .../methods/MedievalPregenMethod.java | 36 ++++++++++++++++--- .../methods/PaperAsyncPregenMethod.java | 16 ++++++--- .../methods/PaperOrMedievalPregenMethod.java | 4 +-- 7 files changed, 51 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/volmit/iris/core/pregenerator/PregeneratorMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/PregeneratorMethod.java index 9bad0e05a..a5c698ba8 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/PregeneratorMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/PregeneratorMethod.java @@ -67,6 +67,7 @@ public interface PregeneratorMethod { * Called to generate a chunk. You can go async so long as save will wait on the threads to finish * @param x the x * @param z the z + * @param listener */ - void generateChunk(int x, int z); + void generateChunk(int x, int z, PregenListener listener); } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/DummyPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/DummyPregenMethod.java index 08c108431..0147a0441 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/DummyPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/DummyPregenMethod.java @@ -53,7 +53,7 @@ public class DummyPregenMethod implements PregeneratorMethod { } @Override - public void generateChunk(int x, int z) { + public void generateChunk(int x, int z, PregenListener listener) { } } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/HeadlessPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/HeadlessPregenMethod.java index c42155da0..bac3fe69c 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/HeadlessPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/HeadlessPregenMethod.java @@ -64,7 +64,7 @@ public class HeadlessPregenMethod implements PregeneratorMethod { } @Override - public void generateChunk(int x, int z) { + public void generateChunk(int x, int z, PregenListener listener) { throw new UnsupportedOperationException(); } } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java index b6efb1c25..a50538405 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java @@ -81,7 +81,7 @@ public class HybridPregenMethod implements PregeneratorMethod { } @Override - public void generateChunk(int x, int z) { - inWorld.generateChunk(x, z); + public void generateChunk(int x, int z, PregenListener listener) { + inWorld.generateChunk(x, z, listener); } } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/MedievalPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/MedievalPregenMethod.java index 51ec8086c..49d2ed28a 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/MedievalPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/MedievalPregenMethod.java @@ -20,24 +20,45 @@ package com.volmit.iris.core.pregenerator.methods; import com.volmit.iris.core.pregenerator.PregenListener; import com.volmit.iris.core.pregenerator.PregeneratorMethod; +import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.scheduling.J; import org.bukkit.Chunk; import org.bukkit.World; +import java.util.concurrent.CompletableFuture; + public class MedievalPregenMethod implements PregeneratorMethod { private final World world; + private final KList> futures; public MedievalPregenMethod(World world) { this.world = world; + futures = new KList<>(); + } + + private void waitForChunks() + { + for(CompletableFuture i : futures) + { + try { + i.get(); + } catch (Throwable e) { + e.printStackTrace(); + } + } + + futures.clear(); } private void unloadAndSaveAllChunks() { + waitForChunks(); J.s(() -> { for(Chunk i : world.getLoadedChunks()) { i.unload(true); } + world.save(); }); } @@ -49,13 +70,11 @@ public class MedievalPregenMethod implements PregeneratorMethod { @Override public void close() { unloadAndSaveAllChunks(); - world.save(); } @Override public void save() { unloadAndSaveAllChunks(); - world.save(); } @Override @@ -74,7 +93,16 @@ public class MedievalPregenMethod implements PregeneratorMethod { } @Override - public void generateChunk(int x, int z) { - world.getChunkAt(x, z); + public void generateChunk(int x, int z, PregenListener listener) { + if(futures.size() > 32) + { + waitForChunks(); + } + + listener.onChunkGenerating(x, z); + futures.add(J.sfut(() -> { + world.getChunkAt(x, z); + listener.onChunkGenerated(x, z); + })); } } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperAsyncPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperAsyncPregenMethod.java index f38046a23..7bb41c3c1 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperAsyncPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperAsyncPregenMethod.java @@ -52,12 +52,14 @@ public class PaperAsyncPregenMethod implements PregeneratorMethod { { i.unload(true); } + world.save(); }); } - private void completeChunk(int x, int z) { + private void completeChunk(int x, int z, PregenListener listener) { try { PaperLib.getChunkAtAsync(world, x, z, true).get(); + listener.onChunkGenerated(x, z); } catch (Throwable e) { e.printStackTrace(); } @@ -92,14 +94,12 @@ public class PaperAsyncPregenMethod implements PregeneratorMethod { waitForChunks(); burst.shutdownAndAwait(); unloadAndSaveAllChunks(); - world.save(); } @Override public void save() { waitForChunks(); unloadAndSaveAllChunks(); - world.save(); } @Override @@ -113,7 +113,13 @@ public class PaperAsyncPregenMethod implements PregeneratorMethod { } @Override - public void generateChunk(int x, int z) { - future.add(burst.complete(() -> completeChunk(x, z))); + public void generateChunk(int x, int z, PregenListener listener) { + if(future.size() > 32) + { + waitForChunks(); + } + + listener.onChunkGenerating(x, z); + future.add(burst.complete(() -> completeChunk(x, z, listener))); } } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperOrMedievalPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperOrMedievalPregenMethod.java index 4608b68e6..6df75a9b7 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperOrMedievalPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperOrMedievalPregenMethod.java @@ -62,7 +62,7 @@ public class PaperOrMedievalPregenMethod implements PregeneratorMethod { } @Override - public void generateChunk(int x, int z) { - method.generateChunk(x, z); + public void generateChunk(int x, int z, PregenListener listener) { + method.generateChunk(x, z, listener); } } From 1726d6f59e22b6384fd9182ec285cb4d28ea61be Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 05:41:30 -0400 Subject: [PATCH 071/137] Iterator event fixes --- .../iris/core/pregenerator/IrisPregenerator.java | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java b/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java index c1cedf84c..fec274f1e 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java @@ -18,11 +18,7 @@ package com.volmit.iris.core.pregenerator; -import com.google.common.util.concurrent.AtomicDouble; -import com.volmit.iris.util.collection.KList; -import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.math.M; -import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.math.RollingSequence; import com.volmit.iris.util.scheduling.ChronoLatch; import com.volmit.iris.util.scheduling.J; @@ -147,11 +143,7 @@ public class IrisPregenerator { else { - task.iterateRegion(x, z, (xx, zz) -> { - listener.onChunkGenerating(xx, zz); - generator.generateChunk(xx, zz); - listener.onChunkGenerated(xx, zz); - }); + task.iterateRegion(x, z, (xx, zz) -> generator.generateChunk(xx, zz, listener)); } listener.onRegionGenerated(x, z); From e19ae7af59c020718895a47193d3716b9ec6d3f5 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 05:43:46 -0400 Subject: [PATCH 072/137] Math fixes --- .../volmit/iris/core/gui/PregeneratorJob.java | 4 ++-- .../com/volmit/iris/util/math/Position2.java | 19 ++----------------- 2 files changed, 4 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java b/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java index c86cf8633..5a0eb6da7 100644 --- a/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java +++ b/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java @@ -216,11 +216,11 @@ public class PregeneratorJob implements PregenListener { } private Position2 getMax() { - return task.getCenter().add(task.getRadius(), task.getRadius()).topLeftChunkOfRegion(); + return task.getCenter().add(task.getRadius(), task.getRadius()).regionToChunk(); } private Position2 getMin() { - return task.getCenter().add(-task.getRadius(), -task.getRadius()).topLeftChunkOfRegion(); + return task.getCenter().add(-task.getRadius(), -task.getRadius()).regionToChunk(); } private boolean paused() { diff --git a/src/main/java/com/volmit/iris/util/math/Position2.java b/src/main/java/com/volmit/iris/util/math/Position2.java index 2acd4148f..93b17a101 100644 --- a/src/main/java/com/volmit/iris/util/math/Position2.java +++ b/src/main/java/com/volmit/iris/util/math/Position2.java @@ -57,24 +57,9 @@ public class Position2 { return result; } - public Position2 topLeftChunkOfRegion() + public Position2 regionToChunk() { - return new Position2((x >> 5) << 5, (z >> 5) << 5); - } - - public Position2 bottomRightChunkOfRegion() - { - return new Position2((((x >> 5)+1) << 5) - 1, (((z >> 5)+1) << 5) - 1); - } - - public Position2 topRightChunkOfRegion() - { - return new Position2((((x >> 5)+1) << 5) - 1, (z >> 5) << 5); - } - - public Position2 bottomLeftChunkOfRegion() - { - return new Position2((x >> 5) << 5, (((z >> 5)+1) << 5) - 1); + return new Position2(x << 5, z << 5); } @Override From f9a815bba63d72c5918f5252e3c56de277790093 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 06:31:57 -0400 Subject: [PATCH 073/137] Dont try to load mca regions --- .../java/com/volmit/iris/engine/data/mca/NBTWorld.java | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/main/java/com/volmit/iris/engine/data/mca/NBTWorld.java b/src/main/java/com/volmit/iris/engine/data/mca/NBTWorld.java index 3801412a5..22ed2935d 100644 --- a/src/main/java/com/volmit/iris/engine/data/mca/NBTWorld.java +++ b/src/main/java/com/volmit/iris/engine/data/mca/NBTWorld.java @@ -313,15 +313,7 @@ public class NBTWorld { if(mcaf == null) { - File f = getRegionFile(x, z); - try { - mcaf = f.exists() ? MCAUtil.read(f) : new MCAFile(x, z); - } catch (IOException e) { - Iris.error("Failed to properly read MCA File " + f.getPath() + " Using a blank one."); - e.printStackTrace(); - mcaf = new MCAFile(x, z); - } - + mcaf = new MCAFile(x, z); regionLock.lock(); loadedRegions.put(key, mcaf); regionLock.unlock(); From 280ec22348b897464031d53d002f10ad57a399f1 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 06:32:13 -0400 Subject: [PATCH 074/137] Better mca iteration --- .../framework/EngineCompositeGenerator.java | 29 +++++++------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java b/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java index bf3067f66..145c10abc 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java @@ -24,6 +24,7 @@ import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.nms.BiomeBaseInjector; import com.volmit.iris.core.nms.INMS; import com.volmit.iris.core.pregenerator.PregenListener; +import com.volmit.iris.core.pregenerator.PregenTask; import com.volmit.iris.engine.IrisEngineCompound; import com.volmit.iris.engine.IrisWorlds; import com.volmit.iris.engine.cache.Cache; @@ -467,26 +468,18 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce @Override public void directWriteMCA(IrisWorld w, int x, int z, NBTWorld writer, MultiBurst burst, PregenListener l) { BurstExecutor e = burst.burst(1024); - int mcaox = x << 5; - int mcaoz = z << 5; - for (int i = 0; i < 32; i++) { - int ii = i; - for (int j = 0; j < 32; j++) { - int jj = j; - e.queue(() -> { - if(l != null) - { - l.onChunkGenerating(ii + mcaox, jj + mcaoz); - } - directWriteChunk(w, ii + mcaox, jj + mcaoz, writer); - if(l != null) - { - l.onChunkGenerated(ii + mcaox, jj + mcaoz); - } - }); + PregenTask.iterateRegion(x, z, (ii, jj) -> e.queue(() -> { + if(l != null) + { + l.onChunkGenerating(ii, jj); } - } + directWriteChunk(w, ii, jj, writer); + if(l != null) + { + l.onChunkGenerated(ii, jj); + } + })); e.complete(); } From be2cb5d2f271c57021f490ceb41aefc6e33f1a60 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 06:32:20 -0400 Subject: [PATCH 075/137] Fix pregen thread counts --- .../volmit/iris/core/command/world/CommandIrisPregen.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java b/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java index 422150803..74837c9cb 100644 --- a/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java +++ b/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java @@ -22,6 +22,7 @@ import com.volmit.iris.Iris; import com.volmit.iris.core.gui.PregeneratorJob; import com.volmit.iris.core.gui.components.Pregenerator; import com.volmit.iris.core.pregenerator.PregenTask; +import com.volmit.iris.core.pregenerator.methods.HybridPregenMethod; import com.volmit.iris.core.pregenerator.methods.PaperOrMedievalPregenMethod; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.math.Position2; @@ -114,7 +115,7 @@ public class CommandIrisPregen extends MortarCommand { .center(new Position2(0, 0)) .radius(((getVal(args[0])>>4)>>5) + 1) .build(), - new PaperOrMedievalPregenMethod(world, 16)); + new HybridPregenMethod(world, Runtime.getRuntime().availableProcessors())); } catch (NumberFormatException e) { Iris.reportError(e); sender.sendMessage("Invalid argument in command"); @@ -145,7 +146,7 @@ public class CommandIrisPregen extends MortarCommand { .center(new Position2(0, 0)) .radius(((getVal(args[0])>>4)>>5) + 1) .build(), - new PaperOrMedievalPregenMethod(world, 16)); + new HybridPregenMethod(world, Runtime.getRuntime().availableProcessors())); } catch (NumberFormatException e) { Iris.reportError(e); sender.sendMessage("Invalid argument in command"); From 0a591e748f8f6b63d23a7cd5b02c371d6f6b4eeb Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 06:32:27 -0400 Subject: [PATCH 076/137] Fix rendering issues --- .../volmit/iris/core/gui/PregeneratorJob.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java b/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java index 5a0eb6da7..d4bf7c490 100644 --- a/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java +++ b/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java @@ -29,6 +29,7 @@ import com.volmit.iris.util.format.Form; import com.volmit.iris.util.function.Consumer2; import com.volmit.iris.util.math.M; import com.volmit.iris.util.math.Position2; +import com.volmit.iris.util.math.Spiraler; import com.volmit.iris.util.scheduling.J; import javax.swing.*; @@ -48,6 +49,8 @@ public class PregeneratorJob implements PregenListener { private final IrisPregenerator pregenerator; private PregenRenderer renderer; private String[] info; + private Position2 min; + private Position2 max; public PregeneratorJob(PregenTask task, PregeneratorMethod method) { @@ -57,6 +60,15 @@ public class PregeneratorJob implements PregenListener { this.task = task; this.pregenerator = new IrisPregenerator(task, method, this); J.a(this.pregenerator::start); + max = new Position2(0, 0); + min = new Position2(0, 0); + KList draw = new KList<>(); + task.iterateRegions((xx,zz) -> { + min.setX(Math.min(xx << 5, min.getX())); + min.setZ(Math.min(zz << 5, min.getZ())); + max.setX(Math.max((xx << 5) + 31, max.getX())); + max.setZ(Math.max((zz << 5) + 31, max.getZ())); + }); open(); } @@ -130,6 +142,7 @@ public class PregeneratorJob implements PregenListener { J.a(() -> { try { + J.sleep(3000); frame.setVisible(false); } @@ -216,11 +229,11 @@ public class PregeneratorJob implements PregenListener { } private Position2 getMax() { - return task.getCenter().add(task.getRadius(), task.getRadius()).regionToChunk(); + return max; } private Position2 getMin() { - return task.getCenter().add(-task.getRadius(), -task.getRadius()).regionToChunk(); + return min; } private boolean paused() { From 6d117f824d02a36b5edf272a4efff88a616b244b Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 06:32:38 -0400 Subject: [PATCH 077/137] Fix threading & other issues --- .../iris/core/pregenerator/methods/HybridPregenMethod.java | 2 +- .../iris/core/pregenerator/methods/PaperAsyncPregenMethod.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java index a50538405..ec274d168 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java @@ -72,7 +72,7 @@ public class HybridPregenMethod implements PregeneratorMethod { return false; } - return !new File(world.getWorldFolder(), "region/r." + x + "." + z + ".mca").exists(); + return new File(world.getWorldFolder(), "region/r." + x + "." + z + ".mca").exists(); } @Override diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperAsyncPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperAsyncPregenMethod.java index 7bb41c3c1..51eeb9ac4 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperAsyncPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperAsyncPregenMethod.java @@ -114,7 +114,7 @@ public class PaperAsyncPregenMethod implements PregeneratorMethod { @Override public void generateChunk(int x, int z, PregenListener listener) { - if(future.size() > 32) + if(future.size() > 128) { waitForChunks(); } From aa510489902acc05bc867c88ad474d18996cfd2f Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 06:32:44 -0400 Subject: [PATCH 078/137] Fixes --- .../core/pregenerator/IrisPregenerator.java | 2 +- .../iris/core/pregenerator/PregenTask.java | 32 +++++++++++++++---- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java b/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java index fec274f1e..edded7f24 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java @@ -143,7 +143,7 @@ public class IrisPregenerator { else { - task.iterateRegion(x, z, (xx, zz) -> generator.generateChunk(xx, zz, listener)); + PregenTask.iterateRegion(x, z, (xx, zz) -> generator.generateChunk(xx, zz, listener)); } listener.onRegionGenerated(x, z); diff --git a/src/main/java/com/volmit/iris/core/pregenerator/PregenTask.java b/src/main/java/com/volmit/iris/core/pregenerator/PregenTask.java index ca3b26bf1..007b3a49b 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/PregenTask.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/PregenTask.java @@ -18,12 +18,15 @@ package com.volmit.iris.core.pregenerator; +import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.math.Spiraled; import com.volmit.iris.util.math.Spiraler; import lombok.Builder; import lombok.Data; +import java.util.Comparator; + @Builder @Data public class PregenTask { @@ -33,19 +36,20 @@ public class PregenTask { @Builder.Default private int radius = 1; + private static final KList order = computeChunkOrder(); + public void iterateRegions(Spiraled s) { new Spiraler(radius * 2, radius * 2, s) .setOffset(center.getX(), center.getZ()).drain(); } - public void iterateRegion(int x, int z, Spiraled s) + public static void iterateRegion(int xr, int zr, Spiraled s) { - new Spiraler(33, 33, (xx, zz) -> { - if (xx < 0 || xx > 31 || zz < 0 || zz > 31) { - s.on(xx+(x<<5), zz+(z<<5)); - } - }).setOffset(15, 15).drain(); + for(Position2 i : order) + { + s.on(i.getX() + (xr << 5), i.getZ() + (zr << 5)); + } } public void iterateAllChunks(Spiraled s) @@ -53,4 +57,20 @@ public class PregenTask { new Spiraler(radius * 2, radius * 2, (x, z) -> iterateRegion(x, z, s)) .setOffset(center.getX(), center.getZ()).drain(); } + + private static KList computeChunkOrder() { + Position2 center = new Position2(15, 15); + KList p = new KList<>(); + new Spiraler(33, 33, (x, z) -> { + int xx = x + 15; + int zz = z + 15; + if (xx < 0 || xx > 31 || zz < 0 || zz > 31) { + return; + } + + p.add(new Position2(xx, zz)); + }).drain(); + p.sort(Comparator.comparing((i) -> i.distance(center))); + return p; + } } From 5bf75e122c309a8cab047b00fe3de1ed473257fa Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 06:40:54 -0400 Subject: [PATCH 079/137] Tweaks --- .../com/volmit/iris/core/pregenerator/IrisPregenerator.java | 2 +- .../iris/core/pregenerator/methods/HybridPregenMethod.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java b/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java index edded7f24..16a2052b9 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java @@ -63,6 +63,7 @@ public class IrisPregenerator { generatedLast = new AtomicInteger(0); generatedLastMinute = new AtomicInteger(0); totalChunks = new AtomicInteger(0); + task.iterateRegions((_a, _b) -> totalChunks.addAndGet(1024)); startTime = new AtomicLong(M.ms()); ticker = new Looper() { @Override @@ -104,7 +105,6 @@ public class IrisPregenerator { public void start() { init(); - task.iterateRegions((__, ___) -> totalChunks.addAndGet(1024)); ticker.start(); task.iterateRegions(this::visitRegion); shutdown(); diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java index ec274d168..a50538405 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java @@ -72,7 +72,7 @@ public class HybridPregenMethod implements PregeneratorMethod { return false; } - return new File(world.getWorldFolder(), "region/r." + x + "." + z + ".mca").exists(); + return !new File(world.getWorldFolder(), "region/r." + x + "." + z + ".mca").exists(); } @Override From be5015d16b9d3ab1e0eb64bf8e0503b2653df6ca Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 09:27:43 -0400 Subject: [PATCH 080/137] Patch grasspath --- src/main/java/com/volmit/iris/engine/data/B.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/volmit/iris/engine/data/B.java b/src/main/java/com/volmit/iris/engine/data/B.java index 14bddd451..10480152f 100644 --- a/src/main/java/com/volmit/iris/engine/data/B.java +++ b/src/main/java/com/volmit/iris/engine/data/B.java @@ -25,6 +25,7 @@ import com.volmit.iris.util.collection.KSet; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.type.Farmland; public class B { private static final Material AIR_MATERIAL = Material.AIR; @@ -103,7 +104,6 @@ public class B { public static BlockData getOrNull(String bdxf) { try { String bd = bdxf.trim(); - BlockData bdx = parseBlockData(bd); if (bdx == null) { @@ -151,6 +151,7 @@ public class B { } String i = ix.toUpperCase().trim(); + i = i.equals("GRASS_PATH") ? "DIRT_PATH" : i; i = i.equals("WOOL") ? "WHITE_WOOL" : i; i = i.equals("CONCRETE") ? "WHITE_CONCRETE" : i; From 3f34ac1c75a326a29ef9bda58ced7141f16480d9 Mon Sep 17 00:00:00 2001 From: Dan Date: Mon, 19 Jul 2021 10:43:48 -0400 Subject: [PATCH 081/137] Update README.md --- README.md | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c437ec12e..0d0da5832 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,38 @@ For 1.16 and below, see the 1.14-1.16 branch. The master branch is for the latest version of minecraft. -# [Support](https://discord.gg/3xxPTpT) **|** [Documentation](https://docs.volmit.com/iris/) ** +# [Support](https://discord.gg/3xxPTpT) **|** [Documentation](https://docs.volmit.com/iris/) **|** [Git](https://github.com/IrisDimensions) -|** [Git](https://github.com/IrisDimensions) +## Iris Toolbelt +Everyone needs a toolbelt. -![Iris Image](https://raw.githubusercontent.com/VolmitSoftware/Iris/master/IRIS.png) +```java +package com.volmit.iris.core.tools + +// Get IrisDataManager from a world +IrisToolbelt.access(anyWorld).getCompound().getData(); + +// Get Default Engine from world +IrisToolbelt.access(anyWorld).getCompound().getDefaultEngine(); + +// Get the engine at the given height +IrisToolbelt.access(anyWorld).getCompound().getEngineForHeight(68); + +// IS THIS THING ON? +boolean yes = IrisToolbelt.isIrisWorld(world); + +// GTFO for worlds (moves players to any other world, just not this one) +IrisToolbelt.evacuate(world); + +IrisAccess access = IrisToolbelt.createWorld() // If you like builders... + .name("myWorld") // The world name + .dimension("terrifyinghands") + .seed(69133742) // The world seed + .headless(true) // Headless make gen go fast + .pregen(PregenTask // Define a pregen job to run + .builder() + .center(new Position2(0,0)) // REGION coords (1 region = 32x32 chunks) + .radius(4) // Radius in REGIONS. Rad of 4 means a 9x9 Region map. + .build()) + .create(); +``` From c3e2d343721e4caabf002a10ad04706ac6fee095 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 10:45:52 -0400 Subject: [PATCH 082/137] APIs & such --- src/main/java/com/volmit/iris/Iris.java | 2 +- .../volmit/iris/core/tools/IrisCreator.java | 237 ++++++++++++++++++ .../volmit/iris/core/tools/IrisToolbelt.java | 166 ++++++++++++ .../iris/engine/object/common/IrisWorld.java | 3 +- .../iris/util/exceptions/IrisException.java | 30 +++ .../exceptions/MissingDimensionException.java | 30 +++ 6 files changed, 465 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/volmit/iris/core/tools/IrisCreator.java create mode 100644 src/main/java/com/volmit/iris/core/tools/IrisToolbelt.java create mode 100644 src/main/java/com/volmit/iris/util/exceptions/IrisException.java create mode 100644 src/main/java/com/volmit/iris/util/exceptions/MissingDimensionException.java diff --git a/src/main/java/com/volmit/iris/Iris.java b/src/main/java/com/volmit/iris/Iris.java index 3c158e99f..4dd11a222 100644 --- a/src/main/java/com/volmit/iris/Iris.java +++ b/src/main/java/com/volmit/iris/Iris.java @@ -26,7 +26,7 @@ import com.volmit.iris.core.link.BKLink; import com.volmit.iris.core.link.MultiverseCoreLink; import com.volmit.iris.core.link.MythicMobsLink; import com.volmit.iris.core.nms.INMS; -import com.volmit.iris.engine.IrisWorlds; +import com.volmit.iris.core.tools.IrisWorlds; import com.volmit.iris.engine.framework.EngineCompositeGenerator; import com.volmit.iris.engine.object.IrisBiome; import com.volmit.iris.engine.object.IrisBiomeCustom; diff --git a/src/main/java/com/volmit/iris/core/tools/IrisCreator.java b/src/main/java/com/volmit/iris/core/tools/IrisCreator.java new file mode 100644 index 000000000..1417e3fa7 --- /dev/null +++ b/src/main/java/com/volmit/iris/core/tools/IrisCreator.java @@ -0,0 +1,237 @@ +/* + * 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.core.tools; + +import com.volmit.iris.core.IrisSettings; +import com.volmit.iris.core.pregenerator.PregenTask; +import com.volmit.iris.engine.framework.IrisAccess; +import com.volmit.iris.engine.headless.HeadlessWorld; +import com.volmit.iris.engine.object.IrisDimension; +import com.volmit.iris.util.exceptions.IrisException; +import com.volmit.iris.util.exceptions.MissingDimensionException; +import com.volmit.iris.util.format.C; +import com.volmit.iris.util.format.Form; +import com.volmit.iris.util.math.RNG; +import com.volmit.iris.util.plugin.VolmitSender; +import com.volmit.iris.util.scheduling.J; +import com.volmit.iris.util.scheduling.O; +import lombok.Data; +import lombok.experimental.Accessors; +import net.md_5.bungee.api.ChatMessageType; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.WorldCreator; + +import java.util.function.Consumer; + +/** + * Makes it a lot easier to setup an engine, world, studio or whatever + */ +@Data +@Accessors(fluent = true, chain = true) +public class IrisCreator { + /** + * Specify an area to pregenerate during creation + */ + private PregenTask pregen; + + /** + * Specify a sender to get updates & progress info + tp when world is created. + */ + private VolmitSender sender; + + /** + * The seed to use for this generator + */ + private long seed = RNG.r.nextLong(); + + /** + * The dimension to use. This can be any online dimension, or a dimension in the + * packs folder + */ + private String dimension = IrisSettings.get().getGenerator().getDefaultWorldType(); + + /** + * The name of this world. + */ + private String name = "irisworld"; + + /** + * Headless mode allows Iris to generate / query engine information + * without needing an actual world loaded. This is normally only used + * for pregeneration purposes but it could be used for mapping. + */ + private boolean headless = false; + + /** + * Studio mode makes the engine hotloadable and uses the dimension in + * your Iris/packs folder instead of copying the dimension files into + * the world itself. Studio worlds are deleted when they are unloaded. + */ + private boolean studio = false; + + /** + * Create the IrisAccess (contains the world) + * @return the IrisAccess + * @throws IrisException shit happens + */ + public IrisAccess create() throws IrisException { + IrisDimension d = IrisToolbelt.getDimension(dimension()); + IrisAccess access = null; + Consumer prog = (pxx) -> { + double px = (headless && pregen!=null) ? pxx/2 : pxx; + + if(pregen != null && !headless) + { + px = (px / 2) + 0.5; + } + + if(sender != null) + { + if(sender.isPlayer()) + { + sender.player().spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(C.WHITE + "Generating " + Form.pc(px))); + } + + else + { + sender.sendMessage("Generating " + Form.f(px, 0)); + } + } + }; + + if(d == null) + { + throw new MissingDimensionException("Cannot find dimension '" + dimension() + "'"); + } + + if (headless) + { + HeadlessWorld w = new HeadlessWorld(name, d, seed, studio); + access = w.generate().getGenerator(); + } + + else + { + O done = new O<>(); + done.set(false); + WorldCreator wc = new IrisWorldCreator() + .dimension(dimension) + .name(name) + .seed(seed) + .studio(studio) + .create(); + access = (IrisAccess) wc.generator(); + IrisAccess finalAccess1 = access; + + J.a(() -> + { + int req = 400; + + while (finalAccess1.getGenerated() < req && !done.get()) { + double v = (double) finalAccess1.getGenerated() / (double) req; + + if(pregen != null) + { + v /=2; + } + + if (sender.isPlayer()) { + sender.player().spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(C.WHITE + "Generating " + Form.pc(v) + ((C.GRAY + " (" + (req - finalAccess1.getGenerated()) + " Left)")))); + J.sleep(50); + } else { + sender.sendMessage(C.WHITE + "Generating " + Form.pc(v) + ((C.GRAY + " (" + (req - finalAccess1.getGenerated()) + " Left)"))); + J.sleep(1000); + } + + if (finalAccess1.isFailing()) { + + sender.sendMessage("Generation Failed!"); + break; + } + } + + sender.player().spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(C.WHITE + "Generation Complete")); + }); + + wc.createWorld(); + done.set(true); + } + + if(access == null) + { + throw new IrisException("Access is null. Something bad happened."); + } + + IrisAccess finalAccess = access; + Runnable loadup = () -> { + try { + J.sfut(() -> { + if(headless) + { + O done = new O<>(); + done.set(false); + + J.a(() -> + { + int req = 400; + + while (finalAccess.getGenerated() < req && !done.get()) { + double v = (double) finalAccess.getGenerated() / (double) req; + v = (v/2) + 0.5; + + if (sender.isPlayer()) { + sender.player().spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(C.WHITE + "Generating " + Form.pc(v) + ((C.GRAY + " (" + (req - finalAccess.getGenerated()) + " Left)")))); + J.sleep(50); + } else { + sender.sendMessage(C.WHITE + "Generating " + Form.pc(v) + ((C.GRAY + " (" + (req - finalAccess.getGenerated()) + " Left)"))); + J.sleep(1000); + } + + if (finalAccess.isFailing()) { + + sender.sendMessage("Generation Failed!"); + break; + } + } + + sender.player().spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(C.WHITE + "Generation Complete")); + }); + + finalAccess.getHeadlessGenerator().getWorld().load(); + done.set(true); + } + }).get(); + } catch (Throwable e) { + e.printStackTrace(); + } + }; + + if(pregen != null) + { + IrisToolbelt.pregenerate(pregen, access).onProgress(prog).whenDone(loadup); + } + + else + { + loadup.run(); + } + + return access; + } +} diff --git a/src/main/java/com/volmit/iris/core/tools/IrisToolbelt.java b/src/main/java/com/volmit/iris/core/tools/IrisToolbelt.java new file mode 100644 index 000000000..0ed4da091 --- /dev/null +++ b/src/main/java/com/volmit/iris/core/tools/IrisToolbelt.java @@ -0,0 +1,166 @@ +/* + * 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.core.tools; + +import com.volmit.iris.Iris; +import com.volmit.iris.core.IrisDataManager; +import com.volmit.iris.core.gui.PregeneratorJob; +import com.volmit.iris.core.pregenerator.PregenTask; +import com.volmit.iris.core.pregenerator.PregeneratorMethod; +import com.volmit.iris.core.pregenerator.methods.HeadlessPregenMethod; +import com.volmit.iris.core.pregenerator.methods.HybridPregenMethod; +import com.volmit.iris.engine.framework.IrisAccess; +import com.volmit.iris.engine.object.IrisDimension; +import com.volmit.iris.util.math.Position2; +import com.volmit.iris.util.plugin.VolmitSender; +import org.bukkit.Bukkit; +import org.bukkit.World; + +import java.io.File; + +/** + * Something you really want to wear if working on Iris. Shit gets pretty hectic down there. + * Hope you packed snacks & road sodas. + */ +public class IrisToolbelt { + /** + * Will find / download / search for the dimension or return null + * + * - You can provide a dimenson in the packs folder by the folder name + * - You can provide a github repo by using (assumes branch is master unless specified) + * - GithubUsername/repository + * - GithubUsername/repository/branch + * + * @param dimension the dimension id such as overworld or flat + * @return the IrisDimension or null + */ + public static IrisDimension getDimension(String dimension) + { + File pack = Iris.instance.getDataFolder("packs", dimension); + + if(!pack.exists()) + { + Iris.proj.downloadSearch(new VolmitSender(Bukkit.getConsoleSender(), Iris.instance.getTag()), dimension, false, false); + } + + if(!pack.exists()) + { + return null; + } + + return new IrisDataManager(pack).getDimensionLoader().load(dimension); + } + + /** + * Create a world with plenty of options + * @return the creator builder + */ + public static IrisCreator createWorld() + { + return new IrisCreator(); + } + + /** + * Checks if the given world is an Iris World (same as access(world) != null) + * @param world the world + * @return true if it is an Iris Access world + */ + public static boolean isIrisWorld(World world) + { + return access(world) != null; + } + + /** + * Get the Iris generator for the given world + * @param world the given world + * @return the IrisAccess or null if it's not an Iris World + */ + public static IrisAccess access(World world) + { + return IrisWorlds.access(world); + } + + /** + * Start a pregenerator task + * @param task the scheduled task + * @param method the method to execute the task + * @return the pregenerator job (already started) + */ + public static PregeneratorJob pregenerate(PregenTask task, PregeneratorMethod method) + { + return new PregeneratorJob(task, method); + } + + /** + * Start a pregenerator task. If the supplied generator is headless, headless mode is used, + * otherwise Hybrid mode is used. + * @param task the scheduled task + * @param access the Iris Generator + * @return the pregenerator job (already started) + */ + public static PregeneratorJob pregenerate(PregenTask task, IrisAccess access) + { + if(access.isHeadless()) + { + return pregenerate(task, new HeadlessPregenMethod(access.getHeadlessGenerator().getWorld(), access.getHeadlessGenerator())); + } + + return pregenerate(task, new HybridPregenMethod(access.getCompound().getWorld().realWorld(), Runtime.getRuntime().availableProcessors())); + } + + /** + * Evacuate all players from the world into literally any other world. + * If there are no other worlds, kick them! Not the best but what's mine is mine sometimes... + * @param world the world to evac + */ + public static void evacuate(World world) + { + IrisWorlds.evacuate(world); + } + + public static void test() + { + // Get IrisDataManager from a world + IrisToolbelt.access(anyWorld).getCompound().getData(); + + // Get Default Engine from world + IrisToolbelt.access(anyWorld).getCompound().getDefaultEngine(); + + // Get the engine at the given height + IrisToolbelt.access(anyWorld).getCompound().getEngineForHeight(68); + + // IS THIS THING ON? + boolean yes = IrisToolbelt.isIrisWorld(world); + + // GTFO for worlds (moves players to any other world, just not this one) + IrisToolbelt.evacuate(world); + + IrisAccess access = IrisToolbelt.createWorld() // If you like builders... + .name("myWorld") // The world name + .dimension("terrifyinghands") + .seed(69133742) // The world seed + .headless(true) // Headless make gen go fast + .pregen(PregenTask // Define a pregen job to run + .builder() + .center(new Position2(0,0)) // REGION coords (1 region = 32x32 chunks) + .radius(4) // Radius in REGIONS. Rad of 4 means a 9x9 Region map. + .build()) + .create(); + } +} diff --git a/src/main/java/com/volmit/iris/engine/object/common/IrisWorld.java b/src/main/java/com/volmit/iris/engine/object/common/IrisWorld.java index 3d1f5b2c9..6c091baac 100644 --- a/src/main/java/com/volmit/iris/engine/object/common/IrisWorld.java +++ b/src/main/java/com/volmit/iris/engine/object/common/IrisWorld.java @@ -19,7 +19,7 @@ package com.volmit.iris.engine.object.common; import com.volmit.iris.Iris; -import com.volmit.iris.engine.IrisWorlds; +import com.volmit.iris.core.tools.IrisWorlds; import com.volmit.iris.util.collection.KList; import lombok.Builder; import lombok.Data; @@ -27,7 +27,6 @@ import lombok.experimental.Accessors; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.entity.Entity; -import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import java.io.File; diff --git a/src/main/java/com/volmit/iris/util/exceptions/IrisException.java b/src/main/java/com/volmit/iris/util/exceptions/IrisException.java new file mode 100644 index 000000000..5062f3469 --- /dev/null +++ b/src/main/java/com/volmit/iris/util/exceptions/IrisException.java @@ -0,0 +1,30 @@ +/* + * 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.util.exceptions; + +public class IrisException extends Exception +{ + public IrisException() { + super(); + } + + public IrisException(String message) { + super(message); + } +} diff --git a/src/main/java/com/volmit/iris/util/exceptions/MissingDimensionException.java b/src/main/java/com/volmit/iris/util/exceptions/MissingDimensionException.java new file mode 100644 index 000000000..f8be9797c --- /dev/null +++ b/src/main/java/com/volmit/iris/util/exceptions/MissingDimensionException.java @@ -0,0 +1,30 @@ +/* + * 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.util.exceptions; + +public class MissingDimensionException extends IrisException +{ + public MissingDimensionException() { + super(); + } + + public MissingDimensionException(String message) { + super(message); + } +} From cfe91a87229b99a4614a6da87757e2b1af26c1e6 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 10:46:03 -0400 Subject: [PATCH 083/137] Le Pregenerator with headless mode --- .../volmit/iris/core/IrisBoardManager.java | 2 +- .../com/volmit/iris/core/IrisProject.java | 2 +- .../iris/core/command/CommandIrisMetrics.java | 2 +- .../command/studio/CommandIrisStudioGoto.java | 2 +- .../studio/CommandIrisStudioHotload.java | 2 +- .../command/studio/CommandIrisStudioLoot.java | 2 +- .../command/studio/CommandIrisStudioMap.java | 2 +- .../studio/CommandIrisStudioSummon.java | 2 +- .../command/what/CommandIrisWhatBiome.java | 2 +- .../command/what/CommandIrisWhatObjects.java | 2 +- .../core/command/world/CommandIrisCreate.java | 2 +- .../core/command/world/CommandIrisFix.java | 2 +- .../core/command/world/CommandLocate.java | 2 +- .../volmit/iris/core/edit/DustRevealer.java | 2 +- .../volmit/iris/core/gui/PregeneratorJob.java | 22 +++++++++++++++- .../core/gui/components/Pregenerator.java | 2 +- .../methods/HeadlessPregenMethod.java | 7 +++++- .../methods/HybridPregenMethod.java | 2 +- .../tools}/IrisWorldCreator.java | 7 +++++- .../{engine => core/tools}/IrisWorlds.java | 2 +- .../framework/EngineCompositeGenerator.java | 25 +++++++++++++++++-- .../iris/engine/framework/IrisAccess.java | 9 +++++++ .../engine/headless/HeadlessGenerator.java | 6 +++-- .../iris/engine/headless/HeadlessWorld.java | 14 ++++++++--- .../iris/engine/jigsaw/PlannedPiece.java | 2 +- .../iris/engine/jigsaw/PlannedStructure.java | 2 +- 26 files changed, 98 insertions(+), 30 deletions(-) rename src/main/java/com/volmit/iris/{engine => core/tools}/IrisWorldCreator.java (95%) rename src/main/java/com/volmit/iris/{engine => core/tools}/IrisWorlds.java (98%) diff --git a/src/main/java/com/volmit/iris/core/IrisBoardManager.java b/src/main/java/com/volmit/iris/core/IrisBoardManager.java index 84f70fec0..7d0bec2e5 100644 --- a/src/main/java/com/volmit/iris/core/IrisBoardManager.java +++ b/src/main/java/com/volmit/iris/core/IrisBoardManager.java @@ -19,7 +19,7 @@ package com.volmit.iris.core; import com.volmit.iris.Iris; -import com.volmit.iris.engine.IrisWorlds; +import com.volmit.iris.core.tools.IrisWorlds; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.framework.IrisAccess; import com.volmit.iris.util.board.BoardManager; diff --git a/src/main/java/com/volmit/iris/core/IrisProject.java b/src/main/java/com/volmit/iris/core/IrisProject.java index 7f29c9f58..fa091e065 100644 --- a/src/main/java/com/volmit/iris/core/IrisProject.java +++ b/src/main/java/com/volmit/iris/core/IrisProject.java @@ -23,7 +23,7 @@ import com.volmit.iris.Iris; import com.volmit.iris.core.nms.INMS; import com.volmit.iris.core.report.Report; import com.volmit.iris.core.report.ReportType; -import com.volmit.iris.engine.IrisWorldCreator; +import com.volmit.iris.core.tools.IrisWorldCreator; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.framework.IrisAccess; import com.volmit.iris.engine.object.*; diff --git a/src/main/java/com/volmit/iris/core/command/CommandIrisMetrics.java b/src/main/java/com/volmit/iris/core/command/CommandIrisMetrics.java index df8604d65..557039e41 100644 --- a/src/main/java/com/volmit/iris/core/command/CommandIrisMetrics.java +++ b/src/main/java/com/volmit/iris/core/command/CommandIrisMetrics.java @@ -19,7 +19,7 @@ package com.volmit.iris.core.command; import com.volmit.iris.Iris; -import com.volmit.iris.engine.IrisWorlds; +import com.volmit.iris.core.tools.IrisWorlds; import com.volmit.iris.engine.framework.IrisAccess; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.plugin.MortarCommand; diff --git a/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioGoto.java b/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioGoto.java index 15bb1b02a..1fc66fcd5 100644 --- a/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioGoto.java +++ b/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioGoto.java @@ -20,7 +20,7 @@ package com.volmit.iris.core.command.studio; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisDataManager; -import com.volmit.iris.engine.IrisWorlds; +import com.volmit.iris.core.tools.IrisWorlds; import com.volmit.iris.engine.framework.IrisAccess; import com.volmit.iris.engine.object.IrisBiome; import com.volmit.iris.engine.object.IrisRegion; diff --git a/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioHotload.java b/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioHotload.java index cbac87405..9d1941634 100644 --- a/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioHotload.java +++ b/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioHotload.java @@ -20,7 +20,7 @@ package com.volmit.iris.core.command.studio; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; -import com.volmit.iris.engine.IrisWorlds; +import com.volmit.iris.core.tools.IrisWorlds; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.plugin.MortarCommand; import com.volmit.iris.util.plugin.VolmitSender; diff --git a/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioLoot.java b/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioLoot.java index b66dd685d..f6d4c4bff 100644 --- a/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioLoot.java +++ b/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioLoot.java @@ -20,7 +20,7 @@ package com.volmit.iris.core.command.studio; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; -import com.volmit.iris.engine.IrisWorlds; +import com.volmit.iris.core.tools.IrisWorlds; import com.volmit.iris.engine.framework.IrisAccess; import com.volmit.iris.engine.object.InventorySlotType; import com.volmit.iris.engine.object.IrisLootTable; diff --git a/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioMap.java b/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioMap.java index ba49a7d57..90b4bde2f 100644 --- a/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioMap.java +++ b/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioMap.java @@ -21,7 +21,7 @@ package com.volmit.iris.core.command.studio; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.gui.VisionGUI; -import com.volmit.iris.engine.IrisWorlds; +import com.volmit.iris.core.tools.IrisWorlds; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.framework.IrisAccess; import com.volmit.iris.util.collection.KList; diff --git a/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioSummon.java b/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioSummon.java index 6239eecdc..b029392b0 100644 --- a/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioSummon.java +++ b/src/main/java/com/volmit/iris/core/command/studio/CommandIrisStudioSummon.java @@ -20,7 +20,7 @@ package com.volmit.iris.core.command.studio; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; -import com.volmit.iris.engine.IrisWorlds; +import com.volmit.iris.core.tools.IrisWorlds; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.framework.IrisAccess; import com.volmit.iris.engine.object.IrisEntity; diff --git a/src/main/java/com/volmit/iris/core/command/what/CommandIrisWhatBiome.java b/src/main/java/com/volmit/iris/core/command/what/CommandIrisWhatBiome.java index 39b6727ca..8af9e3b3c 100644 --- a/src/main/java/com/volmit/iris/core/command/what/CommandIrisWhatBiome.java +++ b/src/main/java/com/volmit/iris/core/command/what/CommandIrisWhatBiome.java @@ -20,7 +20,7 @@ package com.volmit.iris.core.command.what; import com.volmit.iris.Iris; import com.volmit.iris.core.nms.INMS; -import com.volmit.iris.engine.IrisWorlds; +import com.volmit.iris.core.tools.IrisWorlds; import com.volmit.iris.engine.framework.IrisAccess; import com.volmit.iris.engine.object.IrisBiome; import com.volmit.iris.util.collection.KList; diff --git a/src/main/java/com/volmit/iris/core/command/what/CommandIrisWhatObjects.java b/src/main/java/com/volmit/iris/core/command/what/CommandIrisWhatObjects.java index b86d8939d..967db3b35 100644 --- a/src/main/java/com/volmit/iris/core/command/what/CommandIrisWhatObjects.java +++ b/src/main/java/com/volmit/iris/core/command/what/CommandIrisWhatObjects.java @@ -19,7 +19,7 @@ package com.volmit.iris.core.command.what; import com.volmit.iris.Iris; -import com.volmit.iris.engine.IrisWorlds; +import com.volmit.iris.core.tools.IrisWorlds; import com.volmit.iris.engine.framework.IrisAccess; import com.volmit.iris.engine.object.IrisBiome; import com.volmit.iris.engine.object.IrisObject; diff --git a/src/main/java/com/volmit/iris/core/command/world/CommandIrisCreate.java b/src/main/java/com/volmit/iris/core/command/world/CommandIrisCreate.java index 405680592..4ac4163f6 100644 --- a/src/main/java/com/volmit/iris/core/command/world/CommandIrisCreate.java +++ b/src/main/java/com/volmit/iris/core/command/world/CommandIrisCreate.java @@ -24,7 +24,7 @@ import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.gui.components.Pregenerator; import com.volmit.iris.core.link.MultiverseCoreLink; import com.volmit.iris.core.nms.INMS; -import com.volmit.iris.engine.IrisWorldCreator; +import com.volmit.iris.core.tools.IrisWorldCreator; import com.volmit.iris.engine.framework.IrisAccess; import com.volmit.iris.engine.object.IrisDimension; import com.volmit.iris.util.collection.KList; diff --git a/src/main/java/com/volmit/iris/core/command/world/CommandIrisFix.java b/src/main/java/com/volmit/iris/core/command/world/CommandIrisFix.java index 97d46bbac..8d91fa0a1 100644 --- a/src/main/java/com/volmit/iris/core/command/world/CommandIrisFix.java +++ b/src/main/java/com/volmit/iris/core/command/world/CommandIrisFix.java @@ -19,7 +19,7 @@ package com.volmit.iris.core.command.world; import com.volmit.iris.Iris; -import com.volmit.iris.engine.IrisWorlds; +import com.volmit.iris.core.tools.IrisWorlds; import com.volmit.iris.engine.framework.IrisAccess; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.format.Form; diff --git a/src/main/java/com/volmit/iris/core/command/world/CommandLocate.java b/src/main/java/com/volmit/iris/core/command/world/CommandLocate.java index 7f6b02a0b..1fd701543 100644 --- a/src/main/java/com/volmit/iris/core/command/world/CommandLocate.java +++ b/src/main/java/com/volmit/iris/core/command/world/CommandLocate.java @@ -19,7 +19,7 @@ package com.volmit.iris.core.command.world; import com.volmit.iris.Iris; -import com.volmit.iris.engine.IrisWorlds; +import com.volmit.iris.core.tools.IrisWorlds; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.plugin.MortarCommand; import com.volmit.iris.util.plugin.VolmitSender; diff --git a/src/main/java/com/volmit/iris/core/edit/DustRevealer.java b/src/main/java/com/volmit/iris/core/edit/DustRevealer.java index 750e975c3..19346e41c 100644 --- a/src/main/java/com/volmit/iris/core/edit/DustRevealer.java +++ b/src/main/java/com/volmit/iris/core/edit/DustRevealer.java @@ -19,7 +19,7 @@ package com.volmit.iris.core.edit; import com.volmit.iris.Iris; -import com.volmit.iris.engine.IrisWorlds; +import com.volmit.iris.core.tools.IrisWorlds; import com.volmit.iris.engine.framework.IrisAccess; import com.volmit.iris.engine.parallax.ParallaxAccess; import com.volmit.iris.util.collection.KList; diff --git a/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java b/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java index d4bf7c490..b107585e5 100644 --- a/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java +++ b/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java @@ -29,7 +29,6 @@ import com.volmit.iris.util.format.Form; import com.volmit.iris.util.function.Consumer2; import com.volmit.iris.util.math.M; import com.volmit.iris.util.math.Position2; -import com.volmit.iris.util.math.Spiraler; import com.volmit.iris.util.scheduling.J; import javax.swing.*; @@ -38,6 +37,7 @@ import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.image.BufferedImage; import java.util.concurrent.locks.ReentrantLock; +import java.util.function.Consumer; public class PregeneratorJob implements PregenListener { public static PregeneratorJob instance; @@ -46,6 +46,8 @@ public class PregeneratorJob implements PregenListener { private JFrame frame; private final PregenTask task; private boolean saving; + private KList> onProgress = new KList<>(); + private KList whenDone = new KList<>(); private final IrisPregenerator pregenerator; private PregenRenderer renderer; private String[] info; @@ -72,6 +74,18 @@ public class PregeneratorJob implements PregenListener { open(); } + public PregeneratorJob onProgress(Consumer c) + { + onProgress.add(c); + return this; + } + + public PregeneratorJob whenDone(Runnable r) + { + whenDone.add(r); + return this; + } + public static boolean shutdownInstance() { if(instance == null) { @@ -190,6 +204,11 @@ public class PregeneratorJob implements PregenListener { Form.duration(eta, 2) + " Remaining " + " (" + Form.duration(elapsed, 2) + " Elapsed)", "Generation Method: " + method, }; + + for(Consumer i : onProgress) + { + i.accept(percent); + } } @Override @@ -221,6 +240,7 @@ public class PregeneratorJob implements PregenListener { public void onClose() { close(); instance = null; + whenDone.forEach(Runnable::run); } @Override diff --git a/src/main/java/com/volmit/iris/core/gui/components/Pregenerator.java b/src/main/java/com/volmit/iris/core/gui/components/Pregenerator.java index 096530a2a..2529a03c1 100644 --- a/src/main/java/com/volmit/iris/core/gui/components/Pregenerator.java +++ b/src/main/java/com/volmit/iris/core/gui/components/Pregenerator.java @@ -20,7 +20,7 @@ package com.volmit.iris.core.gui.components; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; -import com.volmit.iris.engine.IrisWorlds; +import com.volmit.iris.core.tools.IrisWorlds; import com.volmit.iris.engine.data.mca.MCAFile; import com.volmit.iris.engine.data.mca.NBTWorld; import com.volmit.iris.engine.framework.IrisAccess; diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/HeadlessPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/HeadlessPregenMethod.java index bac3fe69c..366f61e8f 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/HeadlessPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/HeadlessPregenMethod.java @@ -28,9 +28,14 @@ public class HeadlessPregenMethod implements PregeneratorMethod { private final HeadlessGenerator generator; public HeadlessPregenMethod(HeadlessWorld world) + { + this(world, world.generate()); + } + + public HeadlessPregenMethod(HeadlessWorld world, HeadlessGenerator generator) { this.world = world; - this.generator = world.generate(); + this.generator = generator; } @Override diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java index a50538405..1114ee8ef 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java @@ -20,7 +20,7 @@ package com.volmit.iris.core.pregenerator.methods; import com.volmit.iris.core.pregenerator.PregenListener; import com.volmit.iris.core.pregenerator.PregeneratorMethod; -import com.volmit.iris.engine.IrisWorlds; +import com.volmit.iris.core.tools.IrisWorlds; import com.volmit.iris.engine.headless.HeadlessWorld; import org.bukkit.World; diff --git a/src/main/java/com/volmit/iris/engine/IrisWorldCreator.java b/src/main/java/com/volmit/iris/core/tools/IrisWorldCreator.java similarity index 95% rename from src/main/java/com/volmit/iris/engine/IrisWorldCreator.java rename to src/main/java/com/volmit/iris/core/tools/IrisWorldCreator.java index 3eeb54c59..07d6aa7d7 100644 --- a/src/main/java/com/volmit/iris/engine/IrisWorldCreator.java +++ b/src/main/java/com/volmit/iris/core/tools/IrisWorldCreator.java @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package com.volmit.iris.engine; +package com.volmit.iris.core.tools; import com.volmit.iris.core.IrisDataManager; import com.volmit.iris.engine.framework.EngineCompositeGenerator; @@ -100,4 +100,9 @@ public class IrisWorldCreator { return dim.getEnvironment(); } } + + public IrisWorldCreator studio(boolean studio) { + this.studio = studio; + return this; + } } diff --git a/src/main/java/com/volmit/iris/engine/IrisWorlds.java b/src/main/java/com/volmit/iris/core/tools/IrisWorlds.java similarity index 98% rename from src/main/java/com/volmit/iris/engine/IrisWorlds.java rename to src/main/java/com/volmit/iris/core/tools/IrisWorlds.java index 5d3b85328..505ae581a 100644 --- a/src/main/java/com/volmit/iris/engine/IrisWorlds.java +++ b/src/main/java/com/volmit/iris/core/tools/IrisWorlds.java @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package com.volmit.iris.engine; +package com.volmit.iris.core.tools; import com.volmit.iris.Iris; import com.volmit.iris.engine.framework.IrisAccess; diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java b/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java index 145c10abc..ab3ef0027 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java @@ -26,11 +26,10 @@ import com.volmit.iris.core.nms.INMS; import com.volmit.iris.core.pregenerator.PregenListener; import com.volmit.iris.core.pregenerator.PregenTask; import com.volmit.iris.engine.IrisEngineCompound; -import com.volmit.iris.engine.IrisWorlds; -import com.volmit.iris.engine.cache.Cache; import com.volmit.iris.engine.data.B; import com.volmit.iris.engine.data.chunk.TerrainChunk; import com.volmit.iris.engine.data.mca.NBTWorld; +import com.volmit.iris.engine.headless.HeadlessGenerator; import com.volmit.iris.engine.hunk.Hunk; import com.volmit.iris.engine.object.IrisBiome; import com.volmit.iris.engine.object.IrisDimension; @@ -78,6 +77,8 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce private final boolean production; private final KList populators; private long mst = 0; + private HeadlessGenerator headlessGenerator; + private NBTWorld nbtWorld; private int generated = 0; private int lgenerated = 0; private final ChronoLatch hotloadcd; @@ -460,6 +461,26 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce return tc.getRaw(); } + public void assignHeadlessGenerator(HeadlessGenerator headlessGenerator) + { + this.headlessGenerator = headlessGenerator; + } + + @Override + public HeadlessGenerator getHeadlessGenerator() { + return headlessGenerator; + } + + public void assignHeadlessNBTWriter(NBTWorld writer) + { + this.nbtWorld = writer; + } + + @Override + public NBTWorld getHeadlessNBTWriter() { + return nbtWorld; + } + @Override public void directWriteMCA(IrisWorld w, int x, int z, NBTWorld writer, MultiBurst burst) { directWriteMCA(w, x, z, writer, burst, null); diff --git a/src/main/java/com/volmit/iris/engine/framework/IrisAccess.java b/src/main/java/com/volmit/iris/engine/framework/IrisAccess.java index 1f8919b50..3c6762dd6 100644 --- a/src/main/java/com/volmit/iris/engine/framework/IrisAccess.java +++ b/src/main/java/com/volmit/iris/engine/framework/IrisAccess.java @@ -24,6 +24,7 @@ import com.volmit.iris.core.pregenerator.PregenListener; import com.volmit.iris.engine.IrisComplex; import com.volmit.iris.engine.data.DataProvider; import com.volmit.iris.engine.data.mca.NBTWorld; +import com.volmit.iris.engine.headless.HeadlessGenerator; import com.volmit.iris.engine.object.IrisBiome; import com.volmit.iris.engine.object.IrisRegion; import com.volmit.iris.engine.object.common.IrisWorld; @@ -46,6 +47,14 @@ import java.util.function.Consumer; @SuppressWarnings("EmptyMethod") public interface IrisAccess extends Hotloadable, DataProvider { + HeadlessGenerator getHeadlessGenerator(); + + default boolean isHeadless(){ + return getHeadlessGenerator() != null; + } + + NBTWorld getHeadlessNBTWriter(); + void directWriteMCA(IrisWorld w, int x, int z, NBTWorld writer, MultiBurst burst); void directWriteMCA(IrisWorld w, int x, int z, NBTWorld writer, MultiBurst burst, PregenListener listener); diff --git a/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java b/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java index 95b4e7251..b02ffd10f 100644 --- a/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java +++ b/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java @@ -37,9 +37,11 @@ public class HeadlessGenerator { { this.world = world; burst = new MultiBurst("Iris Headless Generator", 9, Runtime.getRuntime().availableProcessors()); - generator = new EngineCompositeGenerator(world.getDimension().getLoadKey(), true); - generator.initialize(world.getWorld()); writer = new NBTWorld(world.getWorld().worldFolder()); + generator = new EngineCompositeGenerator(world.getDimension().getLoadKey(), !world.isStudio()); + generator.assignHeadlessGenerator(this); + generator.assignHeadlessNBTWriter(writer); + generator.initialize(world.getWorld()); } public void generateChunk(int x, int z) diff --git a/src/main/java/com/volmit/iris/engine/headless/HeadlessWorld.java b/src/main/java/com/volmit/iris/engine/headless/HeadlessWorld.java index 4397274f9..96eaae93c 100644 --- a/src/main/java/com/volmit/iris/engine/headless/HeadlessWorld.java +++ b/src/main/java/com/volmit/iris/engine/headless/HeadlessWorld.java @@ -20,9 +20,8 @@ package com.volmit.iris.engine.headless; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisDataManager; -import com.volmit.iris.engine.IrisWorlds; +import com.volmit.iris.core.tools.IrisWorlds; import com.volmit.iris.engine.framework.EngineCompositeGenerator; -import com.volmit.iris.engine.framework.IrisAccess; import com.volmit.iris.engine.object.IrisDimension; import com.volmit.iris.engine.object.common.IrisWorld; import com.volmit.iris.util.plugin.VolmitSender; @@ -39,11 +38,18 @@ public class HeadlessWorld { private final IrisDimension dimension; private final String worldName; private final IrisWorld world; + private boolean studio = false; public HeadlessWorld(String worldName, IrisDimension dimension, long seed) + { + this(worldName, dimension, seed, false); + } + + public HeadlessWorld(String worldName, IrisDimension dimension, long seed, boolean studio) { this.worldName = worldName; this.dimension = dimension; + this.studio = studio; world = IrisWorld.builder() .environment(dimension.getEnvironment()) .worldFolder(new File(worldName)) @@ -55,7 +61,7 @@ public class HeadlessWorld { world.worldFolder().mkdirs(); new File(world.worldFolder(), "region").mkdirs(); - if(!new File(world.worldFolder(), "iris").exists()) + if(!studio && !new File(world.worldFolder(), "iris").exists()) { Iris.proj.installIntoWorld(new VolmitSender(Bukkit.getConsoleSender(), Iris.instance.getTag("Headless")), dimension.getLoadKey(), world.worldFolder()); } @@ -71,7 +77,7 @@ public class HeadlessWorld { return new WorldCreator(worldName) .environment(dimension.getEnvironment()) .seed(world.seed()) - .generator(new EngineCompositeGenerator(dimension.getLoadKey(), true)) + .generator(new EngineCompositeGenerator(dimension.getLoadKey(), !studio)) .createWorld(); } diff --git a/src/main/java/com/volmit/iris/engine/jigsaw/PlannedPiece.java b/src/main/java/com/volmit/iris/engine/jigsaw/PlannedPiece.java index 266829c7b..d323ab8c3 100644 --- a/src/main/java/com/volmit/iris/engine/jigsaw/PlannedPiece.java +++ b/src/main/java/com/volmit/iris/engine/jigsaw/PlannedPiece.java @@ -19,7 +19,7 @@ package com.volmit.iris.engine.jigsaw; import com.volmit.iris.core.IrisDataManager; -import com.volmit.iris.engine.IrisWorlds; +import com.volmit.iris.core.tools.IrisWorlds; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.framework.IrisAccess; import com.volmit.iris.engine.object.*; diff --git a/src/main/java/com/volmit/iris/engine/jigsaw/PlannedStructure.java b/src/main/java/com/volmit/iris/engine/jigsaw/PlannedStructure.java index d2b82a939..55c6af355 100644 --- a/src/main/java/com/volmit/iris/engine/jigsaw/PlannedStructure.java +++ b/src/main/java/com/volmit/iris/engine/jigsaw/PlannedStructure.java @@ -20,7 +20,7 @@ package com.volmit.iris.engine.jigsaw; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisDataManager; -import com.volmit.iris.engine.IrisWorlds; +import com.volmit.iris.core.tools.IrisWorlds; import com.volmit.iris.engine.framework.EngineParallaxManager; import com.volmit.iris.engine.framework.IrisAccess; import com.volmit.iris.engine.interpolation.InterpolationMethod; From 79bf3d8d4f54c1d505ed8403746877295f81fee2 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 10:47:20 -0400 Subject: [PATCH 084/137] f --- .../volmit/iris/core/tools/IrisToolbelt.java | 30 ------------------- 1 file changed, 30 deletions(-) diff --git a/src/main/java/com/volmit/iris/core/tools/IrisToolbelt.java b/src/main/java/com/volmit/iris/core/tools/IrisToolbelt.java index 0ed4da091..b51e1acd7 100644 --- a/src/main/java/com/volmit/iris/core/tools/IrisToolbelt.java +++ b/src/main/java/com/volmit/iris/core/tools/IrisToolbelt.java @@ -133,34 +133,4 @@ public class IrisToolbelt { { IrisWorlds.evacuate(world); } - - public static void test() - { - // Get IrisDataManager from a world - IrisToolbelt.access(anyWorld).getCompound().getData(); - - // Get Default Engine from world - IrisToolbelt.access(anyWorld).getCompound().getDefaultEngine(); - - // Get the engine at the given height - IrisToolbelt.access(anyWorld).getCompound().getEngineForHeight(68); - - // IS THIS THING ON? - boolean yes = IrisToolbelt.isIrisWorld(world); - - // GTFO for worlds (moves players to any other world, just not this one) - IrisToolbelt.evacuate(world); - - IrisAccess access = IrisToolbelt.createWorld() // If you like builders... - .name("myWorld") // The world name - .dimension("terrifyinghands") - .seed(69133742) // The world seed - .headless(true) // Headless make gen go fast - .pregen(PregenTask // Define a pregen job to run - .builder() - .center(new Position2(0,0)) // REGION coords (1 region = 32x32 chunks) - .radius(4) // Radius in REGIONS. Rad of 4 means a 9x9 Region map. - .build()) - .create(); - } } From 3b7ef5b2620dd80c94ea96369d590951272a1497 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 11:05:52 -0400 Subject: [PATCH 085/137] Coolstuff --- .../volmit/iris/core/command/CommandIris.java | 3 + .../iris/core/command/CommandIrisDoAFlip.java | 73 +++++++++++++++++++ .../framework/EngineCompositeGenerator.java | 3 +- 3 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/volmit/iris/core/command/CommandIrisDoAFlip.java diff --git a/src/main/java/com/volmit/iris/core/command/CommandIris.java b/src/main/java/com/volmit/iris/core/command/CommandIris.java index 16bde75eb..9f342b13a 100644 --- a/src/main/java/com/volmit/iris/core/command/CommandIris.java +++ b/src/main/java/com/volmit/iris/core/command/CommandIris.java @@ -69,6 +69,9 @@ public class CommandIris extends MortarCommand { @Command private CommandIrisReload reload; + @Command + private CommandIrisDoAFlip doaflip; + public CommandIris() { super("iris", "ir", "irs"); requiresPermission(Iris.perm); diff --git a/src/main/java/com/volmit/iris/core/command/CommandIrisDoAFlip.java b/src/main/java/com/volmit/iris/core/command/CommandIrisDoAFlip.java new file mode 100644 index 000000000..7d11c6648 --- /dev/null +++ b/src/main/java/com/volmit/iris/core/command/CommandIrisDoAFlip.java @@ -0,0 +1,73 @@ +/* + * 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.core.command; + +import com.volmit.iris.Iris; +import com.volmit.iris.core.pregenerator.PregenTask; +import com.volmit.iris.core.tools.IrisToolbelt; +import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.exceptions.IrisException; +import com.volmit.iris.util.format.C; +import com.volmit.iris.util.math.Position2; +import com.volmit.iris.util.plugin.MortarCommand; +import com.volmit.iris.util.plugin.VolmitSender; +import com.volmit.iris.util.scheduling.J; + +public class CommandIrisDoAFlip extends MortarCommand { + public CommandIrisDoAFlip() { + super("doabackflip"); + requiresPermission(Iris.perm.studio); + setDescription("Create a headless pregenerated world"); + setCategory("Studio"); + } + + + @Override + public void addTabOptions(VolmitSender sender, String[] args, KList list) { + + } + + @Override + public boolean handle(VolmitSender sender, String[] args) { + try { + IrisToolbelt.createWorld() + .headless(true) + .name("thebackflip") + .dimension("overworld") + .seed(6969696969L) + .sender(sender) + .studio(false) + .pregen(PregenTask.builder() + .radius(2) + .center(new Position2(0, 0)) + .build()) + .create(); + } catch (IrisException e) { + e.printStackTrace(); + sender.sendMessage("Check Console"); + } + + return true; + } + + @Override + protected String getArgsUsage() { + return " [-t/--trim]"; + } +} diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java b/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java index ab3ef0027..e983c2359 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java @@ -444,7 +444,8 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce public ChunkData generateChunkData(@NotNull World world, @NotNull Random ignored, int x, int z, @NotNull BiomeGrid biome) { PrecisionStopwatch ps = PrecisionStopwatch.start(); TerrainChunk tc = TerrainChunk.create(world, biome); - generateChunkRawData(getComposite().getWorld(), x, z, tc).run(); + IrisWorld ww = (getComposite() == null || getComposite().getWorld() == null) ? IrisWorld.fromWorld(world) : getComposite().getWorld(); + generateChunkRawData(ww, x, z, tc).run(); if(!getComposite().getWorld().hasRealWorld()) { From 9ed246e4824a74b445aa65f5983d40028026668f Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 23:55:28 -0400 Subject: [PATCH 086/137] Drop do a flip --- .../volmit/iris/core/command/CommandIris.java | 3 - .../iris/core/command/CommandIrisDoAFlip.java | 73 ------------------- 2 files changed, 76 deletions(-) delete mode 100644 src/main/java/com/volmit/iris/core/command/CommandIrisDoAFlip.java diff --git a/src/main/java/com/volmit/iris/core/command/CommandIris.java b/src/main/java/com/volmit/iris/core/command/CommandIris.java index 9f342b13a..16bde75eb 100644 --- a/src/main/java/com/volmit/iris/core/command/CommandIris.java +++ b/src/main/java/com/volmit/iris/core/command/CommandIris.java @@ -69,9 +69,6 @@ public class CommandIris extends MortarCommand { @Command private CommandIrisReload reload; - @Command - private CommandIrisDoAFlip doaflip; - public CommandIris() { super("iris", "ir", "irs"); requiresPermission(Iris.perm); diff --git a/src/main/java/com/volmit/iris/core/command/CommandIrisDoAFlip.java b/src/main/java/com/volmit/iris/core/command/CommandIrisDoAFlip.java deleted file mode 100644 index 7d11c6648..000000000 --- a/src/main/java/com/volmit/iris/core/command/CommandIrisDoAFlip.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * 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.core.command; - -import com.volmit.iris.Iris; -import com.volmit.iris.core.pregenerator.PregenTask; -import com.volmit.iris.core.tools.IrisToolbelt; -import com.volmit.iris.util.collection.KList; -import com.volmit.iris.util.exceptions.IrisException; -import com.volmit.iris.util.format.C; -import com.volmit.iris.util.math.Position2; -import com.volmit.iris.util.plugin.MortarCommand; -import com.volmit.iris.util.plugin.VolmitSender; -import com.volmit.iris.util.scheduling.J; - -public class CommandIrisDoAFlip extends MortarCommand { - public CommandIrisDoAFlip() { - super("doabackflip"); - requiresPermission(Iris.perm.studio); - setDescription("Create a headless pregenerated world"); - setCategory("Studio"); - } - - - @Override - public void addTabOptions(VolmitSender sender, String[] args, KList list) { - - } - - @Override - public boolean handle(VolmitSender sender, String[] args) { - try { - IrisToolbelt.createWorld() - .headless(true) - .name("thebackflip") - .dimension("overworld") - .seed(6969696969L) - .sender(sender) - .studio(false) - .pregen(PregenTask.builder() - .radius(2) - .center(new Position2(0, 0)) - .build()) - .create(); - } catch (IrisException e) { - e.printStackTrace(); - sender.sendMessage("Check Console"); - } - - return true; - } - - @Override - protected String getArgsUsage() { - return " [-t/--trim]"; - } -} From 1156b909eba7d45878210ede72b392a8555dc47a Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 00:14:26 -0400 Subject: [PATCH 087/137] Save debugging for plax --- .../java/com/volmit/iris/engine/parallax/ParallaxRegion.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/volmit/iris/engine/parallax/ParallaxRegion.java b/src/main/java/com/volmit/iris/engine/parallax/ParallaxRegion.java index 9b169d18f..0a1f786b1 100644 --- a/src/main/java/com/volmit/iris/engine/parallax/ParallaxRegion.java +++ b/src/main/java/com/volmit/iris/engine/parallax/ParallaxRegion.java @@ -162,6 +162,7 @@ public class ParallaxRegion extends HunkRegion { tileSlice.save(); updateSlice.save(); saveMetaHunk(); + Iris.debug("Saved Parallax Region "+ C.GOLD + getX() + " " + getZ()); super.save(); } From 0ec2f68a96fb9dd97b0d41afcb079805aa8d9afe Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 00:14:39 -0400 Subject: [PATCH 088/137] Proper plax coord checking --- .../framework/EngineParallaxManager.java | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineParallaxManager.java b/src/main/java/com/volmit/iris/engine/framework/EngineParallaxManager.java index 9c9d88709..42c65090d 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineParallaxManager.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineParallaxManager.java @@ -229,14 +229,19 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer { for (j = -s; j <= s; j++) { ParallaxChunkMeta m = getParallaxAccess().getMetaR(i + cx, j + cz); - try { - for (IrisFeaturePositional k : m.getFeatures()) { - if (k.shouldFilter(x, z)) { - pos.add(k); + synchronized (m) + { + try { + for (IrisFeaturePositional k : m.getFeatures()) { + if (k.shouldFilter(x, z)) { + pos.add(k); + } } + } catch (Throwable e) { + Iris.error("FILTER ERROR" + " AT " + (cx + i) + " " + (j + cz)); + e.printStackTrace(); + Iris.reportError(e); } - } catch (Throwable e) { - Iris.reportError(e); } } } @@ -325,7 +330,7 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer { default KList generateParallaxVacuumLayer(int x, int z) { KList after = new KList<>(); - if (getParallaxAccess().isParallaxGenerated(x, z)) { + if (getParallaxAccess().isParallaxGenerated(x >> 4, z >> 4)) { return after; } @@ -344,7 +349,7 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer { } default void generateParallaxLayer(int x, int z, boolean force) { - if (!force && getParallaxAccess().isParallaxGenerated(x, z)) { + if (!force && getParallaxAccess().isParallaxGenerated(x >> 4, z >> 4)) { return; } From f263fe30a4e03604059b3703112a62761d422e6d Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 02:57:52 -0400 Subject: [PATCH 089/137] PRegen tweaks --- .../volmit/iris/core/gui/PregeneratorJob.java | 10 +++- .../core/pregenerator/IrisPregenerator.java | 59 ++++++++++++++++--- .../core/pregenerator/PregenListener.java | 2 + .../core/pregenerator/PregeneratorMethod.java | 2 +- .../methods/DummyPregenMethod.java | 2 +- .../methods/HeadlessPregenMethod.java | 5 +- .../methods/HybridPregenMethod.java | 26 +++++++- .../methods/MedievalPregenMethod.java | 20 ++++--- .../methods/PaperAsyncPregenMethod.java | 23 +++++--- .../methods/PaperOrMedievalPregenMethod.java | 2 +- 10 files changed, 116 insertions(+), 35 deletions(-) diff --git a/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java b/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java index b107585e5..c380286e7 100644 --- a/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java +++ b/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java @@ -41,7 +41,8 @@ import java.util.function.Consumer; public class PregeneratorJob implements PregenListener { public static PregeneratorJob instance; - private static final Color COLOR_GENERATING = parseColor("#346beb"); + private static final Color COLOR_EXISTS = parseColor("#4d7d5b"); + private static final Color COLOR_GENERATING = parseColor("#00ffdd"); private static final Color COLOR_GENERATED = parseColor("#34eb93"); private JFrame frame; private final PregenTask task; @@ -61,7 +62,6 @@ public class PregeneratorJob implements PregenListener { info = new String[]{"Initializing..."}; this.task = task; this.pregenerator = new IrisPregenerator(task, method, this); - J.a(this.pregenerator::start); max = new Position2(0, 0); min = new Position2(0, 0); KList draw = new KList<>(); @@ -72,6 +72,7 @@ public class PregeneratorJob implements PregenListener { max.setZ(Math.max((zz << 5) + 31, max.getZ())); }); open(); + J.a(this.pregenerator::start, 20); } public PregeneratorJob onProgress(Consumer c) @@ -248,6 +249,11 @@ public class PregeneratorJob implements PregenListener { } + @Override + public void onChunkExistsInRegionGen(int x, int z) { + draw(x, z, COLOR_EXISTS); + } + private Position2 getMax() { return max; } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java b/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java index 16a2052b9..e63cade5e 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java @@ -18,7 +18,10 @@ package com.volmit.iris.core.pregenerator; +import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.math.M; +import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.math.RollingSequence; import com.volmit.iris.util.scheduling.ChronoLatch; import com.volmit.iris.util.scheduling.J; @@ -46,10 +49,12 @@ public class IrisPregenerator { private final AtomicLong startTime; private final ChronoLatch minuteLatch; private final AtomicReference currentGeneratorMethod; + private final KSet generatedRegions; public IrisPregenerator(PregenTask task, PregeneratorMethod generator, PregenListener listener) { this.listener = listenify(listener); + generatedRegions = new KSet<>(); this.shutdown = new AtomicBoolean(false); this.paused = new AtomicBoolean(false); this.task = task; @@ -106,12 +111,19 @@ public class IrisPregenerator { { init(); ticker.start(); - task.iterateRegions(this::visitRegion); + checkRegions(); + task.iterateRegions((x,z) -> visitRegion(x, z, true)); + task.iterateRegions((x,z) -> visitRegion(x, z, false)); shutdown(); } + private void checkRegions() { + task.iterateRegions(this::checkRegion); + } + private void init() { generator.init(); + generator.save(); } private void shutdown() { @@ -121,7 +133,7 @@ public class IrisPregenerator { listener.onClose(); } - private void visitRegion(int x, int z) { + private void visitRegion(int x, int z, boolean regions) { while(paused.get() && !shutdown.get()) { J.sleep(50); @@ -133,22 +145,46 @@ public class IrisPregenerator { return; } - listener.onRegionGenerating(x, z); - currentGeneratorMethod.set(generator.getMethod(x, z)); + Position2 pos = new Position2(x, z); - if(generator.supportsRegions(x, z)) + if(generatedRegions.contains(pos)) { + return; + } + + currentGeneratorMethod.set(generator.getMethod(x, z)); + boolean hit = false; + if(generator.supportsRegions(x, z, listener) && regions) + { + hit = true; + listener.onRegionGenerating(x, z); generator.generateRegion(x, z, listener); } - else + else if(!regions) { + hit = true; + listener.onRegionGenerating(x, z); PregenTask.iterateRegion(x, z, (xx, zz) -> generator.generateChunk(xx, zz, listener)); } - listener.onRegionGenerated(x, z); - listener.onSaving(); - generator.save(); + if(hit) + { + listener.onRegionGenerated(x, z); + listener.onSaving(); + generator.save(); + generatedRegions.add(pos); + checkRegions(); + } + } + + private void checkRegion(int x, int z) { + if(generatedRegions.contains(new Position2(x, z))) + { + return; + } + + generator.supportsRegions(x, z, listener); } public void pause() @@ -203,6 +239,11 @@ public class IrisPregenerator { public void onSaving() { listener.onSaving(); } + + @Override + public void onChunkExistsInRegionGen(int x, int z) { + listener.onChunkExistsInRegionGen(x, z); + } }; } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/PregenListener.java b/src/main/java/com/volmit/iris/core/pregenerator/PregenListener.java index 5faec9d13..01ed7cf6a 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/PregenListener.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/PregenListener.java @@ -34,4 +34,6 @@ public interface PregenListener { void onClose(); void onSaving(); + + void onChunkExistsInRegionGen(int x, int z); } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/PregeneratorMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/PregeneratorMethod.java index a5c698ba8..be3fc5c2c 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/PregeneratorMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/PregeneratorMethod.java @@ -44,7 +44,7 @@ public interface PregeneratorMethod { * @param x the x region * @param z the z region */ - boolean supportsRegions(int x, int z); + boolean supportsRegions(int x, int z, PregenListener listener); /** * Return the name of the method being used diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/DummyPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/DummyPregenMethod.java index 0147a0441..1842054fa 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/DummyPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/DummyPregenMethod.java @@ -43,7 +43,7 @@ public class DummyPregenMethod implements PregeneratorMethod { } @Override - public boolean supportsRegions(int x, int z) { + public boolean supportsRegions(int x, int z, PregenListener listener) { return false; } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/HeadlessPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/HeadlessPregenMethod.java index 366f61e8f..9b010d59a 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/HeadlessPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/HeadlessPregenMethod.java @@ -22,9 +22,12 @@ import com.volmit.iris.core.pregenerator.PregenListener; import com.volmit.iris.core.pregenerator.PregeneratorMethod; import com.volmit.iris.engine.headless.HeadlessGenerator; import com.volmit.iris.engine.headless.HeadlessWorld; +import lombok.Getter; public class HeadlessPregenMethod implements PregeneratorMethod { private final HeadlessWorld world; + + @Getter private final HeadlessGenerator generator; public HeadlessPregenMethod(HeadlessWorld world) @@ -54,7 +57,7 @@ public class HeadlessPregenMethod implements PregeneratorMethod { } @Override - public boolean supportsRegions(int x, int z) { + public boolean supportsRegions(int x, int z, PregenListener listener) { return true; } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java index 1114ee8ef..89e0201e9 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java @@ -18,10 +18,12 @@ package com.volmit.iris.core.pregenerator.methods; +import com.volmit.iris.Iris; import com.volmit.iris.core.pregenerator.PregenListener; import com.volmit.iris.core.pregenerator.PregeneratorMethod; import com.volmit.iris.core.tools.IrisWorlds; import com.volmit.iris.engine.headless.HeadlessWorld; +import com.volmit.iris.util.math.Position2; import org.bukkit.World; import java.io.File; @@ -45,7 +47,7 @@ public class HybridPregenMethod implements PregeneratorMethod { @Override public String getMethod(int x, int z) { - return "Hybrid<" + ((supportsRegions(x, z) ? headless.getMethod(x, z) : inWorld.getMethod(x, z)) + ">"); + return "Hybrid<" + ((supportsRegions(x, z, null) ? headless.getMethod(x, z) : inWorld.getMethod(x, z)) + ">"); } @Override @@ -67,12 +69,30 @@ public class HybridPregenMethod implements PregeneratorMethod { } @Override - public boolean supportsRegions(int x, int z) { + public boolean supportsRegions(int x, int z, PregenListener listener) { if (headless instanceof DummyPregenMethod) { return false; } - return !new File(world.getWorldFolder(), "region/r." + x + "." + z + ".mca").exists(); + boolean r = !new File(world.getWorldFolder(), "region/r." + x + "." + z + ".mca").exists(); + + if(!r && listener != null) + { + try + { + for(Position2 i : ((HeadlessPregenMethod) headless).getGenerator().getChunksInRegion(x, z)) + { + listener.onChunkExistsInRegionGen((x << 5) + i.getX(), (z << 5) + i.getZ()); + } + } + + catch(Throwable e) + { + Iris.reportError(e); + } + } + + return r; } @Override diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/MedievalPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/MedievalPregenMethod.java index 49d2ed28a..4dde03ea1 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/MedievalPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/MedievalPregenMethod.java @@ -53,13 +53,17 @@ public class MedievalPregenMethod implements PregeneratorMethod { private void unloadAndSaveAllChunks() { waitForChunks(); - J.s(() -> { - for(Chunk i : world.getLoadedChunks()) - { - i.unload(true); - } - world.save(); - }); + try { + J.sfut(() -> { + for(Chunk i : world.getLoadedChunks()) + { + i.unload(true); + } + world.save(); + }).get(); + } catch (Throwable e) { + e.printStackTrace(); + } } @Override @@ -78,7 +82,7 @@ public class MedievalPregenMethod implements PregeneratorMethod { } @Override - public boolean supportsRegions(int x, int z) { + public boolean supportsRegions(int x, int z, PregenListener listener) { return false; } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperAsyncPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperAsyncPregenMethod.java index 51eeb9ac4..2748edb45 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperAsyncPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperAsyncPregenMethod.java @@ -28,6 +28,7 @@ import org.bukkit.Chunk; import org.bukkit.World; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; public class PaperAsyncPregenMethod implements PregeneratorMethod { private final World world; @@ -47,13 +48,17 @@ public class PaperAsyncPregenMethod implements PregeneratorMethod { } private void unloadAndSaveAllChunks() { - J.s(() -> { - for(Chunk i : world.getLoadedChunks()) - { - i.unload(true); - } - world.save(); - }); + try { + J.sfut(() -> { + for(Chunk i : world.getLoadedChunks()) + { + i.unload(true); + } + world.save(); + }).get(); + } catch (Throwable e) { + e.printStackTrace(); + } } private void completeChunk(int x, int z, PregenListener listener) { @@ -103,7 +108,7 @@ public class PaperAsyncPregenMethod implements PregeneratorMethod { } @Override - public boolean supportsRegions(int x, int z) { + public boolean supportsRegions(int x, int z, PregenListener listener) { return false; } @@ -114,7 +119,7 @@ public class PaperAsyncPregenMethod implements PregeneratorMethod { @Override public void generateChunk(int x, int z, PregenListener listener) { - if(future.size() > 128) + if(future.size() > 16) { waitForChunks(); } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperOrMedievalPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperOrMedievalPregenMethod.java index 6df75a9b7..8ac69148e 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperOrMedievalPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperOrMedievalPregenMethod.java @@ -52,7 +52,7 @@ public class PaperOrMedievalPregenMethod implements PregeneratorMethod { } @Override - public boolean supportsRegions(int x, int z) { + public boolean supportsRegions(int x, int z, PregenListener listener) { return false; } From ec4330aea711956c9ff9f3efe1937b431e532d08 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 02:58:01 -0400 Subject: [PATCH 090/137] Actuator docs --- .../com/volmit/iris/engine/actuator/IrisBiomeActuator.java | 4 ++++ .../com/volmit/iris/engine/actuator/IrisDecorantActuator.java | 2 ++ .../iris/engine/actuator/IrisTerrainIslandActuator.java | 2 ++ .../iris/engine/actuator/IrisTerrainNormalActuator.java | 2 ++ 4 files changed, 10 insertions(+) diff --git a/src/main/java/com/volmit/iris/engine/actuator/IrisBiomeActuator.java b/src/main/java/com/volmit/iris/engine/actuator/IrisBiomeActuator.java index e69d2df0a..8fe672b0a 100644 --- a/src/main/java/com/volmit/iris/engine/actuator/IrisBiomeActuator.java +++ b/src/main/java/com/volmit/iris/engine/actuator/IrisBiomeActuator.java @@ -27,6 +27,8 @@ import com.volmit.iris.engine.hunk.Hunk; import com.volmit.iris.engine.hunk.view.BiomeGridHunkView; import com.volmit.iris.engine.object.IrisBiome; import com.volmit.iris.engine.object.IrisBiomeCustom; +import com.volmit.iris.util.documentation.BlockCoordinates; +import com.volmit.iris.util.documentation.ChunkCoordinates; import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.scheduling.PrecisionStopwatch; import org.bukkit.block.Biome; @@ -40,6 +42,7 @@ public class IrisBiomeActuator extends EngineAssignedActuator { rng = new RNG(engine.getWorld().seed() + 243995); } + @BlockCoordinates private boolean injectBiome(Hunk h, int x, int y, int z, Object bb) { try { if (h instanceof BiomeGridHunkView hh) { @@ -59,6 +62,7 @@ public class IrisBiomeActuator extends EngineAssignedActuator { return false; } + @BlockCoordinates @Override public void onActuate(int x, int z, Hunk h) { PrecisionStopwatch p = PrecisionStopwatch.start(); diff --git a/src/main/java/com/volmit/iris/engine/actuator/IrisDecorantActuator.java b/src/main/java/com/volmit/iris/engine/actuator/IrisDecorantActuator.java index 9ecc0a538..51aaefb61 100644 --- a/src/main/java/com/volmit/iris/engine/actuator/IrisDecorantActuator.java +++ b/src/main/java/com/volmit/iris/engine/actuator/IrisDecorantActuator.java @@ -24,6 +24,7 @@ import com.volmit.iris.engine.framework.EngineAssignedActuator; import com.volmit.iris.engine.framework.EngineDecorator; import com.volmit.iris.engine.hunk.Hunk; import com.volmit.iris.engine.object.IrisBiome; +import com.volmit.iris.util.documentation.BlockCoordinates; import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.scheduling.PrecisionStopwatch; import lombok.Getter; @@ -58,6 +59,7 @@ public class IrisDecorantActuator extends EngineAssignedActuator { seaFloorDecorator = new IrisSeaFloorDecorator(getEngine()); } + @BlockCoordinates @Override public void onActuate(int x, int z, Hunk output) { if (!getEngine().getDimension().isDecorate()) { diff --git a/src/main/java/com/volmit/iris/engine/actuator/IrisTerrainIslandActuator.java b/src/main/java/com/volmit/iris/engine/actuator/IrisTerrainIslandActuator.java index 3b1480b5b..434a49dee 100644 --- a/src/main/java/com/volmit/iris/engine/actuator/IrisTerrainIslandActuator.java +++ b/src/main/java/com/volmit/iris/engine/actuator/IrisTerrainIslandActuator.java @@ -23,6 +23,7 @@ import com.volmit.iris.engine.framework.EngineAssignedActuator; import com.volmit.iris.engine.hunk.Hunk; import com.volmit.iris.engine.object.IrisBiome; import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.documentation.BlockCoordinates; import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.scheduling.PrecisionStopwatch; import lombok.Getter; @@ -50,6 +51,7 @@ public class IrisTerrainIslandActuator extends EngineAssignedActuator hasUnder = getDimension().getUndercarriage() != null && !getDimension().getUndercarriage().getGenerator().isFlat(); } + @BlockCoordinates @Override public void onActuate(int x, int z, Hunk h) { PrecisionStopwatch p = PrecisionStopwatch.start(); diff --git a/src/main/java/com/volmit/iris/engine/actuator/IrisTerrainNormalActuator.java b/src/main/java/com/volmit/iris/engine/actuator/IrisTerrainNormalActuator.java index 8638ffc3e..8530b4402 100644 --- a/src/main/java/com/volmit/iris/engine/actuator/IrisTerrainNormalActuator.java +++ b/src/main/java/com/volmit/iris/engine/actuator/IrisTerrainNormalActuator.java @@ -23,6 +23,7 @@ import com.volmit.iris.engine.framework.EngineAssignedActuator; import com.volmit.iris.engine.hunk.Hunk; import com.volmit.iris.engine.object.IrisBiome; import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.documentation.BlockCoordinates; import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.scheduling.PrecisionStopwatch; import lombok.Getter; @@ -47,6 +48,7 @@ public class IrisTerrainNormalActuator extends EngineAssignedActuator hasUnder = getDimension().getUndercarriage() != null && !getDimension().getUndercarriage().getGenerator().isFlat(); } + @BlockCoordinates @Override public void onActuate(int x, int z, Hunk h) { PrecisionStopwatch p = PrecisionStopwatch.start(); From 60c113b0e85eab82e0803834af2dd2837d681e73 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 02:58:11 -0400 Subject: [PATCH 091/137] Allow reading region chunks without loading mca --- .../volmit/iris/engine/data/mca/MCAFile.java | 24 +++++++++++++++++++ .../volmit/iris/engine/data/mca/MCAUtil.java | 10 ++++++++ 2 files changed, 34 insertions(+) diff --git a/src/main/java/com/volmit/iris/engine/data/mca/MCAFile.java b/src/main/java/com/volmit/iris/engine/data/mca/MCAFile.java index 86b04fe1b..ca4842971 100644 --- a/src/main/java/com/volmit/iris/engine/data/mca/MCAFile.java +++ b/src/main/java/com/volmit/iris/engine/data/mca/MCAFile.java @@ -19,6 +19,9 @@ package com.volmit.iris.engine.data.mca; import com.volmit.iris.engine.data.nbt.tag.CompoundTag; +import com.volmit.iris.engine.hunk.storage.ArrayHunk; +import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.math.Position2; import java.io.IOException; import java.io.RandomAccessFile; @@ -88,6 +91,27 @@ public class MCAFile { } } + public KList samplePositions(RandomAccessFile raf) throws IOException { + KList p2 = new KList<>(); + chunks = new AtomicReferenceArray<>(1024); + int x = 0; + int z = 0; + for (int i = 0; i < 1024; i++) { + x++; + z++; + + raf.seek(i * 4); + int offset = raf.read() << 16; + offset |= (raf.read() & 0xFF) << 8; + offset |= raf.read() & 0xFF; + if (raf.readByte() == 0) { + continue; + } + p2.add(new Position2(x & 31, (z / 32) & 31)); + } + return p2; + } + public AtomicReferenceArray getChunks() { return chunks; } diff --git a/src/main/java/com/volmit/iris/engine/data/mca/MCAUtil.java b/src/main/java/com/volmit/iris/engine/data/mca/MCAUtil.java index e438cae10..68a23e4b8 100644 --- a/src/main/java/com/volmit/iris/engine/data/mca/MCAUtil.java +++ b/src/main/java/com/volmit/iris/engine/data/mca/MCAUtil.java @@ -18,6 +18,9 @@ package com.volmit.iris.engine.data.mca; +import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.math.Position2; + import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; @@ -83,6 +86,13 @@ public final class MCAUtil { } } + public static KList sampleChunkPositions(File file) throws IOException { + MCAFile mcaFile = newMCAFile(file); + try (RandomAccessFile raf = new RandomAccessFile(file, "r")) { + return mcaFile.samplePositions(raf); + } + } + /** * Calls {@link MCAUtil#write(MCAFile, File, boolean)} without changing the timestamps. * From 10a159b31580c06070d213767b154e25ebb9c083 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 02:58:17 -0400 Subject: [PATCH 092/137] Decorator doc --- .../com/volmit/iris/engine/decorator/IrisCeilingDecorator.java | 2 ++ .../com/volmit/iris/engine/decorator/IrisSeaFloorDecorator.java | 2 ++ .../volmit/iris/engine/decorator/IrisSeaSurfaceDecorator.java | 2 ++ .../volmit/iris/engine/decorator/IrisShoreLineDecorator.java | 2 ++ .../com/volmit/iris/engine/decorator/IrisSurfaceDecorator.java | 2 ++ 5 files changed, 10 insertions(+) diff --git a/src/main/java/com/volmit/iris/engine/decorator/IrisCeilingDecorator.java b/src/main/java/com/volmit/iris/engine/decorator/IrisCeilingDecorator.java index 1d7b762a9..0c6703d8b 100644 --- a/src/main/java/com/volmit/iris/engine/decorator/IrisCeilingDecorator.java +++ b/src/main/java/com/volmit/iris/engine/decorator/IrisCeilingDecorator.java @@ -24,6 +24,7 @@ import com.volmit.iris.engine.hunk.Hunk; import com.volmit.iris.engine.object.DecorationPart; import com.volmit.iris.engine.object.IrisBiome; import com.volmit.iris.engine.object.IrisDecorator; +import com.volmit.iris.util.documentation.BlockCoordinates; import org.bukkit.block.data.BlockData; public class IrisCeilingDecorator extends IrisEngineDecorator { @@ -31,6 +32,7 @@ public class IrisCeilingDecorator extends IrisEngineDecorator { super(engine, "Ceiling", DecorationPart.CEILING); } + @BlockCoordinates @Override public void decorate(int x, int z, int realX, int realX1, int realX_1, int realZ, int realZ1, int realZ_1, Hunk data, IrisBiome biome, int height, int max) { IrisDecorator decorator = getDecorator(biome, realX, realZ); diff --git a/src/main/java/com/volmit/iris/engine/decorator/IrisSeaFloorDecorator.java b/src/main/java/com/volmit/iris/engine/decorator/IrisSeaFloorDecorator.java index cd0d09c24..5caa572d0 100644 --- a/src/main/java/com/volmit/iris/engine/decorator/IrisSeaFloorDecorator.java +++ b/src/main/java/com/volmit/iris/engine/decorator/IrisSeaFloorDecorator.java @@ -24,6 +24,7 @@ import com.volmit.iris.engine.hunk.Hunk; import com.volmit.iris.engine.object.DecorationPart; import com.volmit.iris.engine.object.IrisBiome; import com.volmit.iris.engine.object.IrisDecorator; +import com.volmit.iris.util.documentation.BlockCoordinates; import org.bukkit.block.data.BlockData; public class IrisSeaFloorDecorator extends IrisEngineDecorator { @@ -31,6 +32,7 @@ public class IrisSeaFloorDecorator extends IrisEngineDecorator { super(engine, "Sea Floor", DecorationPart.SEA_FLOOR); } + @BlockCoordinates @Override public void decorate(int x, int z, int realX, int realX1, int realX_1, int realZ, int realZ1, int realZ_1, Hunk data, IrisBiome biome, int height, int max) { if (height <= getDimension().getFluidHeight()) { diff --git a/src/main/java/com/volmit/iris/engine/decorator/IrisSeaSurfaceDecorator.java b/src/main/java/com/volmit/iris/engine/decorator/IrisSeaSurfaceDecorator.java index 950f69d66..6c19c5825 100644 --- a/src/main/java/com/volmit/iris/engine/decorator/IrisSeaSurfaceDecorator.java +++ b/src/main/java/com/volmit/iris/engine/decorator/IrisSeaSurfaceDecorator.java @@ -24,6 +24,7 @@ import com.volmit.iris.engine.hunk.Hunk; import com.volmit.iris.engine.object.DecorationPart; import com.volmit.iris.engine.object.IrisBiome; import com.volmit.iris.engine.object.IrisDecorator; +import com.volmit.iris.util.documentation.BlockCoordinates; import org.bukkit.block.data.BlockData; public class IrisSeaSurfaceDecorator extends IrisEngineDecorator { @@ -31,6 +32,7 @@ public class IrisSeaSurfaceDecorator extends IrisEngineDecorator { super(engine, "Sea Surface", DecorationPart.SEA_SURFACE); } + @BlockCoordinates @Override public void decorate(int x, int z, int realX, int realX1, int realX_1, int realZ, int realZ1, int realZ_1, Hunk data, IrisBiome biome, int height, int max) { IrisDecorator decorator = getDecorator(biome, realX, realZ); diff --git a/src/main/java/com/volmit/iris/engine/decorator/IrisShoreLineDecorator.java b/src/main/java/com/volmit/iris/engine/decorator/IrisShoreLineDecorator.java index 0b7f4cccf..7cd34c40a 100644 --- a/src/main/java/com/volmit/iris/engine/decorator/IrisShoreLineDecorator.java +++ b/src/main/java/com/volmit/iris/engine/decorator/IrisShoreLineDecorator.java @@ -24,6 +24,7 @@ import com.volmit.iris.engine.hunk.Hunk; import com.volmit.iris.engine.object.DecorationPart; import com.volmit.iris.engine.object.IrisBiome; import com.volmit.iris.engine.object.IrisDecorator; +import com.volmit.iris.util.documentation.BlockCoordinates; import org.bukkit.block.data.BlockData; public class IrisShoreLineDecorator extends IrisEngineDecorator { @@ -31,6 +32,7 @@ public class IrisShoreLineDecorator extends IrisEngineDecorator { super(engine, "Shore Line", DecorationPart.SHORE_LINE); } + @BlockCoordinates @Override public void decorate(int x, int z, int realX, int realX1, int realX_1, int realZ, int realZ1, int realZ_1, Hunk data, IrisBiome biome, int height, int max) { diff --git a/src/main/java/com/volmit/iris/engine/decorator/IrisSurfaceDecorator.java b/src/main/java/com/volmit/iris/engine/decorator/IrisSurfaceDecorator.java index 84675c40a..caff5114e 100644 --- a/src/main/java/com/volmit/iris/engine/decorator/IrisSurfaceDecorator.java +++ b/src/main/java/com/volmit/iris/engine/decorator/IrisSurfaceDecorator.java @@ -26,6 +26,7 @@ import com.volmit.iris.engine.object.DecorationPart; import com.volmit.iris.engine.object.InferredType; import com.volmit.iris.engine.object.IrisBiome; import com.volmit.iris.engine.object.IrisDecorator; +import com.volmit.iris.util.documentation.BlockCoordinates; import org.bukkit.block.data.Bisected; import org.bukkit.block.data.BlockData; @@ -34,6 +35,7 @@ public class IrisSurfaceDecorator extends IrisEngineDecorator { super(engine, "Surface", DecorationPart.NONE); } + @BlockCoordinates @Override public void decorate(int x, int z, int realX, int realX1, int realX_1, int realZ, int realZ1, int realZ_1, Hunk data, IrisBiome biome, int height, int max) { if (biome.getInferredType().equals(InferredType.SHORE) && height < getDimension().getFluidHeight()) { From 25cfb1f5c0b085778bb44c6048dbc0e7dd86881c Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 02:58:44 -0400 Subject: [PATCH 093/137] Plx fixes --- .../iris/engine/framework/EngineActuator.java | 2 ++ .../engine/framework/EngineAssignedActuator.java | 2 ++ .../iris/engine/framework/EngineDecorator.java | 4 ++++ .../iris/engine/framework/EngineModifier.java | 2 ++ .../engine/framework/EngineParallaxManager.java | 14 ++++++++++---- 5 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineActuator.java b/src/main/java/com/volmit/iris/engine/framework/EngineActuator.java index 242f151b9..c249e4548 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineActuator.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineActuator.java @@ -19,7 +19,9 @@ package com.volmit.iris.engine.framework; import com.volmit.iris.engine.hunk.Hunk; +import com.volmit.iris.util.documentation.BlockCoordinates; public interface EngineActuator extends EngineComponent { + @BlockCoordinates void actuate(int x, int z, Hunk output); } diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineAssignedActuator.java b/src/main/java/com/volmit/iris/engine/framework/EngineAssignedActuator.java index 9496ea1c6..118e98eec 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineAssignedActuator.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineAssignedActuator.java @@ -19,6 +19,7 @@ package com.volmit.iris.engine.framework; import com.volmit.iris.engine.hunk.Hunk; +import com.volmit.iris.util.documentation.BlockCoordinates; public abstract class EngineAssignedActuator extends EngineAssignedComponent implements EngineActuator { public EngineAssignedActuator(Engine engine, String name) { @@ -27,6 +28,7 @@ public abstract class EngineAssignedActuator extends EngineAssignedComponent public abstract void onActuate(int x, int z, Hunk output); + @BlockCoordinates @Override public void actuate(int x, int z, Hunk output) { onActuate(x, z, output); diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineDecorator.java b/src/main/java/com/volmit/iris/engine/framework/EngineDecorator.java index 3affbaea5..feb489a1c 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineDecorator.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineDecorator.java @@ -21,11 +21,15 @@ package com.volmit.iris.engine.framework; import com.volmit.iris.engine.data.B; import com.volmit.iris.engine.hunk.Hunk; import com.volmit.iris.engine.object.IrisBiome; +import com.volmit.iris.util.documentation.BlockCoordinates; import org.bukkit.block.data.BlockData; public interface EngineDecorator extends EngineComponent { + + @BlockCoordinates void decorate(int x, int z, int realX, int realX1, int realX_1, int realZ, int realZ1, int realZ_1, Hunk data, IrisBiome biome, int height, int max); + @BlockCoordinates default void decorate(int x, int z, int realX, int realZ, Hunk data, IrisBiome biome, int height, int max) { decorate(x, z, realX, realX, realX, realZ, realZ, realZ, data, biome, height, max); } diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineModifier.java b/src/main/java/com/volmit/iris/engine/framework/EngineModifier.java index 257f3f2ae..21642ae35 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineModifier.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineModifier.java @@ -19,7 +19,9 @@ package com.volmit.iris.engine.framework; import com.volmit.iris.engine.hunk.Hunk; +import com.volmit.iris.util.documentation.BlockCoordinates; public interface EngineModifier extends EngineComponent { + @BlockCoordinates void modify(int x, int z, Hunk t); } diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineParallaxManager.java b/src/main/java/com/volmit/iris/engine/framework/EngineParallaxManager.java index 42c65090d..70a7f0a73 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineParallaxManager.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineParallaxManager.java @@ -38,6 +38,7 @@ import com.volmit.iris.engine.parallel.MultiBurst; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.collection.KSet; +import com.volmit.iris.util.documentation.ChunkCoordinates; import com.volmit.iris.util.format.Form; import com.volmit.iris.util.function.Consumer4; import com.volmit.iris.util.math.RNG; @@ -165,14 +166,19 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer { }); } + @ChunkCoordinates default void insertParallax(int x, int z, Hunk data) { + if (!getEngine().getDimension().isPlaceObjects()) { + return; + } + try { PrecisionStopwatch p = PrecisionStopwatch.start(); - ParallaxChunkMeta meta = getParallaxAccess().getMetaR(x >> 4, z >> 4); + ParallaxChunkMeta meta = getParallaxAccess().getMetaR(x, z); if (!meta.isParallaxGenerated()) { generateParallaxLayer(x, z, true); - meta = getParallaxAccess().getMetaR(x >> 4, z >> 4); + meta = getParallaxAccess().getMetaR(x, z); } if (!meta.isObjects()) { @@ -180,7 +186,7 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer { return; } - getParallaxAccess().getBlocksR(x >> 4, z >> 4).iterateSync((a, b, c, d) -> { + getParallaxAccess().getBlocksR(x, z).iterateSync((a, b, c, d) -> { if (d != null) { data.set(a, b, c, d); } @@ -349,7 +355,7 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer { } default void generateParallaxLayer(int x, int z, boolean force) { - if (!force && getParallaxAccess().isParallaxGenerated(x >> 4, z >> 4)) { + if (!force && getParallaxAccess().isParallaxGenerated(x, z)) { return; } From d6b2e019c7bee98ed548c58a90b0a3c0cb6cadc0 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 02:58:57 -0400 Subject: [PATCH 094/137] Headless look for existing chunks --- .../iris/engine/headless/HeadlessGenerator.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java b/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java index b02ffd10f..e983bc879 100644 --- a/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java +++ b/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java @@ -19,15 +19,22 @@ package com.volmit.iris.engine.headless; import com.volmit.iris.core.pregenerator.PregenListener; +import com.volmit.iris.engine.data.mca.LoadFlags; +import com.volmit.iris.engine.data.mca.MCAFile; +import com.volmit.iris.engine.data.mca.MCAUtil; import com.volmit.iris.engine.data.mca.NBTWorld; import com.volmit.iris.engine.framework.EngineCompositeGenerator; import com.volmit.iris.engine.parallel.MultiBurst; +import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.math.Position2; import lombok.Data; import java.io.File; +import java.io.IOException; @Data public class HeadlessGenerator { + private static KList EMPTYPOINTS = new KList<>(); private final HeadlessWorld world; private final EngineCompositeGenerator generator; private final NBTWorld writer; @@ -82,4 +89,14 @@ public class HeadlessGenerator { generator.close(); writer.close(); } + + public KList getChunksInRegion(int x, int z) { + try { + return MCAUtil.sampleChunkPositions(writer.getRegionFile(x, z)); + } catch (IOException e) { + e.printStackTrace(); + } + + return EMPTYPOINTS; + } } From 0595008fcee32795ae4fca0e1529297c78e7a49b Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 02:59:15 -0400 Subject: [PATCH 095/137] Stop serious memory leaks --- src/main/java/com/volmit/iris/engine/IrisComplex.java | 3 ++- src/main/java/com/volmit/iris/engine/object/IrisObject.java | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/volmit/iris/engine/IrisComplex.java b/src/main/java/com/volmit/iris/engine/IrisComplex.java index 0fe44827b..67a3b42e7 100644 --- a/src/main/java/com/volmit/iris/engine/IrisComplex.java +++ b/src/main/java/com/volmit/iris/engine/IrisComplex.java @@ -108,6 +108,7 @@ public class IrisComplex implements DataProvider { public IrisComplex(Engine engine, boolean simple) { int cacheSize = 1024 * 128; + IrisBiome emptyBiome = new IrisBiome(); this.rng = new RNG(engine.getWorld().seed()); this.data = engine.getData(); double height = engine.getHeight(); @@ -151,7 +152,7 @@ public class IrisComplex implements DataProvider { .onNull("") .convertCached((s) -> { if (s.isEmpty()) { - return new IrisBiome(); + return emptyBiome; } return data.getBiomeLoader().load(s) diff --git a/src/main/java/com/volmit/iris/engine/object/IrisObject.java b/src/main/java/com/volmit/iris/engine/object/IrisObject.java index 720fe760c..7c03c7847 100644 --- a/src/main/java/com/volmit/iris/engine/object/IrisObject.java +++ b/src/main/java/com/volmit/iris/engine/object/IrisObject.java @@ -992,4 +992,8 @@ public class IrisObject extends IrisRegistrant { } return locations; } + + public int volume() { + return blocks.size(); + } } From b27b26837fc1ed779fb3a6e6f496d2f9e21d1e7b Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 02:59:38 -0400 Subject: [PATCH 096/137] Coord docs & fix serious parallax issue --- .../iris/engine/parallax/ParallaxWorld.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/main/java/com/volmit/iris/engine/parallax/ParallaxWorld.java b/src/main/java/com/volmit/iris/engine/parallax/ParallaxWorld.java index c05f91da7..60f2b350b 100644 --- a/src/main/java/com/volmit/iris/engine/parallax/ParallaxWorld.java +++ b/src/main/java/com/volmit/iris/engine/parallax/ParallaxWorld.java @@ -25,6 +25,8 @@ import com.volmit.iris.engine.object.tile.TileData; import com.volmit.iris.engine.parallel.MultiBurst; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; +import com.volmit.iris.util.documentation.ChunkCoordinates; +import com.volmit.iris.util.documentation.RegionCoordinates; import com.volmit.iris.util.format.C; import com.volmit.iris.util.scheduling.J; import org.bukkit.block.TileState; @@ -85,16 +87,19 @@ public class ParallaxWorld implements ParallaxAccess { } } + @RegionCoordinates public boolean isLoaded(int x, int z) { return loadedRegions.containsKey(key(x, z)); } + @RegionCoordinates public void save(int x, int z) { if (isLoaded(x, z)) { save(getR(x, z)); } } + @RegionCoordinates public int unload(int x, int z) { long key = key(x, z); int v = 0; @@ -114,6 +119,7 @@ public class ParallaxWorld implements ParallaxAccess { return v; } + @RegionCoordinates public ParallaxRegion load(int x, int z) { if (isLoaded(x, z)) { return loadedRegions.get(key(x, z)); @@ -125,6 +131,7 @@ public class ParallaxWorld implements ParallaxAccess { return v; } + @RegionCoordinates public ParallaxRegion getR(int x, int z) { long key = key(x, z); @@ -137,70 +144,84 @@ public class ParallaxWorld implements ParallaxAccess { return region; } + @RegionCoordinates public ParallaxRegion getRW(int x, int z) { save.addIfMissing(key(x, z)); return getR(x, z); } + @RegionCoordinates private long key(int x, int z) { return (((long) x) << 32) | (((long) z) & 0xffffffffL); } + @ChunkCoordinates @Override public Hunk getBlocksR(int x, int z) { return getR(x >> 5, z >> 5).getBlockSlice().getR(x & 31, z & 31); } + @ChunkCoordinates @Override public Hunk getBlocksRW(int x, int z) { return getRW(x >> 5, z >> 5).getBlockSlice().getRW(x & 31, z & 31); } + @ChunkCoordinates @Override public Hunk> getTilesR(int x, int z) { return getR(x >> 5, z >> 5).getTileSlice().getR(x & 31, z & 31); } + @ChunkCoordinates @Override public Hunk> getTilesRW(int x, int z) { return getRW(x >> 5, z >> 5).getTileSlice().getRW(x & 31, z & 31); } + @ChunkCoordinates @Override public Hunk getObjectsR(int x, int z) { return getR(x >> 5, z >> 5).getObjectSlice().getR(x & 31, z & 31); } + @ChunkCoordinates @Override public Hunk getObjectsRW(int x, int z) { return getRW(x >> 5, z >> 5).getObjectSlice().getRW(x & 31, z & 31); } + @ChunkCoordinates @Override public Hunk getEntitiesRW(int x, int z) { return getRW(x >> 5, z >> 5).getEntitySlice().getRW(x & 31, z & 31); } + @ChunkCoordinates @Override public Hunk getEntitiesR(int x, int z) { return getRW(x >> 5, z >> 5).getEntitySlice().getR(x & 31, z & 31); } + @ChunkCoordinates @Override public Hunk getUpdatesR(int x, int z) { return getR(x >> 5, z >> 5).getUpdateSlice().getR(x & 31, z & 31); } + @ChunkCoordinates @Override public Hunk getUpdatesRW(int x, int z) { return getRW(x >> 5, z >> 5).getUpdateSlice().getRW(x & 31, z & 31); } + @ChunkCoordinates @Override public ParallaxChunkMeta getMetaR(int x, int z) { return getR(x >> 5, z >> 5).getMetaR(x & 31, z & 31); } + @ChunkCoordinates @Override public ParallaxChunkMeta getMetaRW(int x, int z) { return getRW(x >> 5, z >> 5).getMetaRW(x & 31, z & 31); From 89406c475472d43f7b9544012d4909764d54f6c8 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 02:59:49 -0400 Subject: [PATCH 097/137] Docs --- .../com/volmit/iris/engine/IrisEngine.java | 4 ++- .../util/documentation/BlockCoordinates.java | 26 +++++++++++++++++++ .../util/documentation/ChunkCoordinates.java | 26 +++++++++++++++++++ .../util/documentation/RegionCoordinates.java | 26 +++++++++++++++++++ 4 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/volmit/iris/util/documentation/BlockCoordinates.java create mode 100644 src/main/java/com/volmit/iris/util/documentation/ChunkCoordinates.java create mode 100644 src/main/java/com/volmit/iris/util/documentation/RegionCoordinates.java diff --git a/src/main/java/com/volmit/iris/engine/IrisEngine.java b/src/main/java/com/volmit/iris/engine/IrisEngine.java index bcfcf367c..9c2c26d55 100644 --- a/src/main/java/com/volmit/iris/engine/IrisEngine.java +++ b/src/main/java/com/volmit/iris/engine/IrisEngine.java @@ -26,6 +26,7 @@ import com.volmit.iris.engine.object.IrisBiomePaletteLayer; import com.volmit.iris.engine.object.IrisDecorator; import com.volmit.iris.engine.object.IrisObjectPlacement; import com.volmit.iris.engine.parallel.MultiBurst; +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.math.RNG; @@ -158,6 +159,7 @@ public class IrisEngine extends BlockPopulator implements Engine { return z / getDimension().getTerrainZoom(); } + @ChunkCoordinates @Override public void generate(int x, int z, Hunk vblocks, Hunk vbiomes) { try { @@ -172,7 +174,7 @@ public class IrisEngine extends BlockPopulator implements Engine { getFramework().getRavineModifier().modify(x, z, vblocks); getFramework().getPostModifier().modify(x, z, vblocks); getFramework().getDecorantActuator().actuate(x, z, vblocks); - getFramework().getEngineParallax().insertParallax(x, z, vblocks); + getFramework().getEngineParallax().insertParallax(x >> 4, z >> 4, vblocks); getFramework().getDepositModifier().modify(x, z, vblocks); } case ISLANDS -> { diff --git a/src/main/java/com/volmit/iris/util/documentation/BlockCoordinates.java b/src/main/java/com/volmit/iris/util/documentation/BlockCoordinates.java new file mode 100644 index 000000000..8b59590b4 --- /dev/null +++ b/src/main/java/com/volmit/iris/util/documentation/BlockCoordinates.java @@ -0,0 +1,26 @@ +/* + * 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.util.documentation; + +/** + * This method expects coords in block + */ +public @interface BlockCoordinates { + +} diff --git a/src/main/java/com/volmit/iris/util/documentation/ChunkCoordinates.java b/src/main/java/com/volmit/iris/util/documentation/ChunkCoordinates.java new file mode 100644 index 000000000..59d30ea7c --- /dev/null +++ b/src/main/java/com/volmit/iris/util/documentation/ChunkCoordinates.java @@ -0,0 +1,26 @@ +/* + * 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.util.documentation; + +/** + * This method expects blocks in chunk coordinates + */ +public @interface ChunkCoordinates { + +} diff --git a/src/main/java/com/volmit/iris/util/documentation/RegionCoordinates.java b/src/main/java/com/volmit/iris/util/documentation/RegionCoordinates.java new file mode 100644 index 000000000..6c04a08b1 --- /dev/null +++ b/src/main/java/com/volmit/iris/util/documentation/RegionCoordinates.java @@ -0,0 +1,26 @@ +/* + * 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.util.documentation; + +/** + * This method expects coordinates in region coords + */ +public @interface RegionCoordinates { + +} From 5ed9a29f816c539b7bc0e49f0fd43b9e7ea50401 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 03:02:18 -0400 Subject: [PATCH 098/137] Color fixes --- src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java b/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java index c380286e7..fedfe0eab 100644 --- a/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java +++ b/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java @@ -42,7 +42,7 @@ import java.util.function.Consumer; public class PregeneratorJob implements PregenListener { public static PregeneratorJob instance; private static final Color COLOR_EXISTS = parseColor("#4d7d5b"); - private static final Color COLOR_GENERATING = parseColor("#00ffdd"); + private static final Color COLOR_GENERATING = parseColor("#0062ff"); private static final Color COLOR_GENERATED = parseColor("#34eb93"); private JFrame frame; private final PregenTask task; From 53b7f33ec441e5fb02de9461bc2275d934c52954 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 04:48:15 -0400 Subject: [PATCH 099/137] IO Write file from stream --- src/main/java/com/volmit/iris/util/io/IO.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/com/volmit/iris/util/io/IO.java b/src/main/java/com/volmit/iris/util/io/IO.java index 2f43b3660..2758b88fb 100644 --- a/src/main/java/com/volmit/iris/util/io/IO.java +++ b/src/main/java/com/volmit/iris/util/io/IO.java @@ -327,6 +327,13 @@ public class IO { pw.close(); } + public static void writeAll(File f, OutputStream c) throws IOException { + f.getParentFile().mkdirs(); + FileInputStream in = new FileInputStream(f); + IO.fullTransfer(in, c, 8192); + in.close(); + } + public static String readAll(File f) throws IOException { FileReader fr; try { From e817d3355cdb23c4464240c43d37c7fb8d3775e4 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 04:48:23 -0400 Subject: [PATCH 100/137] GRTF --- .../com/volmit/iris/engine/headless/HeadlessGenerator.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java b/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java index e983bc879..1d9327248 100644 --- a/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java +++ b/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java @@ -66,9 +66,9 @@ public class HeadlessGenerator { generator.directWriteMCA(world.getWorld(), x, z, writer, burst, listener); } - public File generateRegionToFile(int x, int z) + public File generateRegionToFile(int x, int z, PregenListener listener) { - generateRegionToFile(x, z); + generateRegionToFile(x, z, listener); flush(); return writer.getRegionFile(x, z); } From cf8612c99f35b5a673ee20a2052f352d4ffa254c Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 04:56:20 -0400 Subject: [PATCH 101/137] Net listeners --- .../volmit/iris/core/pregenerator/PregenListener.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/com/volmit/iris/core/pregenerator/PregenListener.java b/src/main/java/com/volmit/iris/core/pregenerator/PregenListener.java index 01ed7cf6a..16b8d0b2c 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/PregenListener.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/PregenListener.java @@ -31,6 +31,16 @@ public interface PregenListener { void onRegionSkipped(int x, int z); + void onNetworkStarted(int x, int z); + + void onNetworkFailed(int x, int z); + + void onNetworkReclaim(int revert); + + void onNetworkGeneratedChunk(int x, int z); + + void onNetworkDownloaded(int x, int z); + void onClose(); void onSaving(); From 680a3a5d131d2d2f11dacecdd790b1fe82c60a51 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 04:56:31 -0400 Subject: [PATCH 102/137] Turbo commands --- .../pregenerator/turbo/command/TurboBusy.java | 22 ++++++++++ .../turbo/command/TurboClose.java | 35 ++++++++++++++++ .../turbo/command/TurboCommand.java | 24 +++++++++++ .../turbo/command/TurboError.java | 22 ++++++++++ .../turbo/command/TurboGenerate.java | 40 ++++++++++++++++++ .../turbo/command/TurboGetProgress.java | 35 ++++++++++++++++ .../turbo/command/TurboInstallFirst.java | 22 ++++++++++ .../turbo/command/TurboInstallPack.java | 42 +++++++++++++++++++ .../pregenerator/turbo/command/TurboOK.java | 22 ++++++++++ .../turbo/command/TurboSendProgress.java | 35 ++++++++++++++++ 10 files changed, 299 insertions(+) create mode 100644 src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboBusy.java create mode 100644 src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboClose.java create mode 100644 src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboCommand.java create mode 100644 src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboError.java create mode 100644 src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboGenerate.java create mode 100644 src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboGetProgress.java create mode 100644 src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboInstallFirst.java create mode 100644 src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboInstallPack.java create mode 100644 src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboOK.java create mode 100644 src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboSendProgress.java diff --git a/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboBusy.java b/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboBusy.java new file mode 100644 index 000000000..b332e2ca4 --- /dev/null +++ b/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboBusy.java @@ -0,0 +1,22 @@ +/* + * 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.core.pregenerator.turbo.command; + +public class TurboBusy implements TurboCommand { +} diff --git a/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboClose.java b/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboClose.java new file mode 100644 index 000000000..55eeb3200 --- /dev/null +++ b/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboClose.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.core.pregenerator.turbo.command; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.UUID; + +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Data +public class TurboClose implements TurboCommand { + @Builder.Default + private UUID pack = UUID.randomUUID(); +} diff --git a/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboCommand.java b/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboCommand.java new file mode 100644 index 000000000..e83039598 --- /dev/null +++ b/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboCommand.java @@ -0,0 +1,24 @@ +/* + * 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.core.pregenerator.turbo.command; + +public interface TurboCommand +{ + +} diff --git a/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboError.java b/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboError.java new file mode 100644 index 000000000..8531e1f99 --- /dev/null +++ b/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboError.java @@ -0,0 +1,22 @@ +/* + * 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.core.pregenerator.turbo.command; + +public class TurboError implements TurboCommand { +} diff --git a/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboGenerate.java b/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboGenerate.java new file mode 100644 index 000000000..105698cce --- /dev/null +++ b/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboGenerate.java @@ -0,0 +1,40 @@ +/* + * 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.core.pregenerator.turbo.command; + +import com.volmit.iris.engine.object.IrisDimension; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.UUID; + +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Data +public class TurboGenerate implements TurboCommand { + @Builder.Default + private int x = 0; + @Builder.Default + private int z = 0; + @Builder.Default + private UUID pack = UUID.randomUUID(); +} diff --git a/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboGetProgress.java b/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboGetProgress.java new file mode 100644 index 000000000..cf6819b1a --- /dev/null +++ b/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboGetProgress.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.core.pregenerator.turbo.command; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.UUID; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class TurboGetProgress implements TurboCommand { + @Builder.Default + private UUID pack = UUID.randomUUID(); +} diff --git a/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboInstallFirst.java b/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboInstallFirst.java new file mode 100644 index 000000000..dfd222fc0 --- /dev/null +++ b/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboInstallFirst.java @@ -0,0 +1,22 @@ +/* + * 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.core.pregenerator.turbo.command; + +public class TurboInstallFirst implements TurboCommand { +} diff --git a/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboInstallPack.java b/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboInstallPack.java new file mode 100644 index 000000000..b3b8b10b7 --- /dev/null +++ b/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboInstallPack.java @@ -0,0 +1,42 @@ +/* + * 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.core.pregenerator.turbo.command; + +import com.volmit.iris.engine.object.IrisDimension; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.UUID; + +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Data +public class TurboInstallPack implements TurboCommand { + @Builder.Default + private UUID pack = UUID.randomUUID(); + + @Builder.Default + private long seed = 1337; + + @Builder.Default + private IrisDimension dimension = null; +} diff --git a/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboOK.java b/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboOK.java new file mode 100644 index 000000000..813a45406 --- /dev/null +++ b/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboOK.java @@ -0,0 +1,22 @@ +/* + * 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.core.pregenerator.turbo.command; + +public class TurboOK implements TurboCommand { +} diff --git a/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboSendProgress.java b/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboSendProgress.java new file mode 100644 index 000000000..b8b34ae2a --- /dev/null +++ b/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboSendProgress.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.core.pregenerator.turbo.command; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TurboSendProgress implements TurboCommand { + @Builder.Default + private double progress = 0; + @Builder.Default + private boolean available = false; +} From de7bc9870d03049603d524bcc31855fa1c82bbf1 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 04:56:37 -0400 Subject: [PATCH 103/137] Turbo connectivity --- .../core/pregenerator/turbo/TurboClient.java | 56 ++++ .../pregenerator/turbo/TurboCommander.java | 40 +++ .../core/pregenerator/turbo/TurboServer.java | 247 ++++++++++++++++++ 3 files changed, 343 insertions(+) create mode 100644 src/main/java/com/volmit/iris/core/pregenerator/turbo/TurboClient.java create mode 100644 src/main/java/com/volmit/iris/core/pregenerator/turbo/TurboCommander.java create mode 100644 src/main/java/com/volmit/iris/core/pregenerator/turbo/TurboServer.java diff --git a/src/main/java/com/volmit/iris/core/pregenerator/turbo/TurboClient.java b/src/main/java/com/volmit/iris/core/pregenerator/turbo/TurboClient.java new file mode 100644 index 000000000..ab0f31060 --- /dev/null +++ b/src/main/java/com/volmit/iris/core/pregenerator/turbo/TurboClient.java @@ -0,0 +1,56 @@ +/* + * 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.core.pregenerator.turbo; + +import com.volmit.iris.core.pregenerator.turbo.command.TurboCommand; +import com.volmit.iris.util.collection.GBiset; +import com.volmit.iris.util.function.Consumer2; +import com.volmit.iris.util.scheduling.J; +import lombok.Builder; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.net.Socket; +import java.util.function.Consumer; +import java.util.function.Supplier; + +@Builder +public class TurboClient { + private String address; + private int port; + private TurboCommand command; + private Consumer output; + + public void go(Consumer2 handler) throws Throwable { + Socket socket = new Socket(address, port); + DataInputStream i = new DataInputStream(socket.getInputStream()); + DataOutputStream o = new DataOutputStream(socket.getOutputStream()); + TurboCommander.write(command, o); + + if(output != null) + { + output.accept(o); + } + + o.flush(); + handler.accept(TurboCommander.read(i), i); + socket.close(); + } +} diff --git a/src/main/java/com/volmit/iris/core/pregenerator/turbo/TurboCommander.java b/src/main/java/com/volmit/iris/core/pregenerator/turbo/TurboCommander.java new file mode 100644 index 000000000..5e0438c57 --- /dev/null +++ b/src/main/java/com/volmit/iris/core/pregenerator/turbo/TurboCommander.java @@ -0,0 +1,40 @@ +/* + * 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.core.pregenerator.turbo; + +import com.google.gson.Gson; +import com.volmit.iris.core.pregenerator.turbo.command.TurboCommand; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +public class TurboCommander { + private static final Gson gson = new Gson(); + + public static TurboCommand read(DataInputStream in) throws IOException, ClassNotFoundException { + String clazz = in.readUTF(); + return (TurboCommand) gson.fromJson(in.readUTF(), Class.forName(clazz)); + } + + public static void write(TurboCommand c, DataOutputStream out) throws IOException { + out.writeUTF(c.getClass().getCanonicalName()); + out.writeUTF(gson.toJson(c)); + } +} diff --git a/src/main/java/com/volmit/iris/core/pregenerator/turbo/TurboServer.java b/src/main/java/com/volmit/iris/core/pregenerator/turbo/TurboServer.java new file mode 100644 index 000000000..85e5e4f74 --- /dev/null +++ b/src/main/java/com/volmit/iris/core/pregenerator/turbo/TurboServer.java @@ -0,0 +1,247 @@ +/* + * 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.core.pregenerator.turbo; + +import com.volmit.iris.core.pregenerator.PregenListener; +import com.volmit.iris.core.pregenerator.turbo.command.*; +import com.volmit.iris.engine.headless.HeadlessGenerator; +import com.volmit.iris.engine.headless.HeadlessWorld; +import com.volmit.iris.util.io.IO; +import com.volmit.iris.util.scheduling.J; +import org.apache.logging.log4j.core.tools.Generate; +import org.zeroturnaround.zip.ZTFileUtil; +import org.zeroturnaround.zip.ZipUtil; + +import java.io.*; +import java.net.ServerSocket; +import java.net.Socket; +import java.net.SocketTimeoutException; +import java.util.Objects; +import java.util.UUID; +import java.util.concurrent.atomic.AtomicInteger; + +public class TurboServer extends Thread implements PregenListener { + private int port; + private String password; + private boolean busy; + private int tc; + private HeadlessGenerator generator; + private ServerSocket server; + private File cache; + private UUID currentId = null; + private AtomicInteger g = new AtomicInteger(0); + private File lastGeneratedRegion = null; + + public TurboServer(File cache, int port, String password, int tc) throws IOException { + this.port = port; + this.cache = cache; + this.password = password; + this.tc = tc; + start(); + server = new ServerSocket(port); + server.setSoTimeout(1000); + } + + public void run() + { + while(!interrupted()) + { + try { + Socket client = server.accept(); + DataInputStream i = new DataInputStream(client.getInputStream()); + DataOutputStream o = new DataOutputStream(client.getOutputStream()); + try { + handle(client, i, o); + o.flush(); + } catch (Throwable throwable) { + throwable.printStackTrace(); + } + client.close(); + } catch (SocketTimeoutException ignored) { + + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + private void handle(Socket client, DataInputStream i, DataOutputStream o) throws Throwable + { + TurboCommand cmd = handle(TurboCommander.read(i), i, o); + + if(cmd != null) + { + TurboCommander.write(cmd, o); + } + + o.flush(); + } + + private File getCachedDim(UUID id) + { + return new File(cache, id.toString().charAt(2) +"/" + id.toString().substring(0, 4)+ "/" + id); + } + + private TurboCommand handle(TurboCommand command, DataInputStream i, DataOutputStream o) throws Throwable { + if(command instanceof TurboInstallPack) + { + if(busy) + { + return new TurboBusy(); + } + + if(generator != null) + { + generator.close(); + IO.delete(generator.getWorld().getWorld().worldFolder()); + generator = null; + } + + UUID id = ((TurboInstallPack) command).getPack(); + File cacheload = new File(cache, id.toString().charAt(2) +"/" + id.toString().substring(0, 4)+ "/" + id + ".zip"); + File cachestore = getCachedDim(id); + IO.delete(cachestore); + int len = i.readInt(); + cacheload.getParentFile().mkdirs(); + byte[] buf = new byte[8192]; + FileOutputStream fos = new FileOutputStream(cacheload); + IO.transfer(i, fos, buf, len); + fos.close(); + ZipUtil.unpack(cacheload, cachestore); + cacheload.deleteOnExit(); + HeadlessWorld w = new HeadlessWorld("turbo/" + id.toString(), ((TurboInstallPack) command).getDimension(), ((TurboInstallPack) command).getSeed()); + w.setStudio(true); + generator = w.generate(); + return new TurboOK(); + } + + if(command instanceof TurboGenerate) + { + if(busy) + { + return new TurboBusy(); + } + + if(generator == null || !Objects.equals(currentId, ((TurboGenerate) command).getPack())) { + return new TurboInstallFirst(); + } + + g.set(0); + busy = true; + J.a(() -> { + busy = false; + lastGeneratedRegion = generator.generateRegionToFile(((TurboGenerate) command).getX(), ((TurboGenerate) command).getZ(), this); + }); + return new TurboOK(); + } + + if(command instanceof TurboClose) + { + if(generator != null && Objects.equals(currentId, ((TurboClose) command).getPack()) && !busy) + { + generator.close(); + IO.delete(generator.getWorld().getWorld().worldFolder()); + generator = null; + currentId = null; + } + } + + if(command instanceof TurboGetProgress) + { + if(generator != null && busy && Objects.equals(currentId, ((TurboGetProgress) command).getPack())) + { + return TurboSendProgress.builder().progress((double)g.get() / 1024D).build(); + } + + else if(generator != null && !busy && Objects.equals(currentId, ((TurboGetProgress) command).getPack()) && lastGeneratedRegion != null && lastGeneratedRegion.exists()) + { + TurboCommander.write(TurboSendProgress + .builder() + .progress(1).available(true) + .build(), o); + o.writeLong(lastGeneratedRegion.length()); + IO.writeAll(lastGeneratedRegion, o); + return null; + } + + else if(generator == null) + { + return new TurboInstallFirst(); + } + + else + { + return new TurboBusy(); + } + } + + throw new IllegalStateException("Unexpected value: " + command.getClass()); + } + + public void close() throws IOException { + interrupt(); + generator.close(); + server.close(); + } + + @Override + public void onTick(double chunksPerSecond, double chunksPerMinute, double regionsPerMinute, double percent, int generated, int totalChunks, int chunksRemaining, long eta, long elapsed, String method) { + + } + + @Override + public void onChunkGenerating(int x, int z) { + + } + + @Override + public void onChunkGenerated(int x, int z) { + g.incrementAndGet(); + } + + @Override + public void onRegionGenerated(int x, int z) { + + } + + @Override + public void onRegionGenerating(int x, int z) { + + } + + @Override + public void onRegionSkipped(int x, int z) { + + } + + @Override + public void onClose() { + + } + + @Override + public void onSaving() { + + } + + @Override + public void onChunkExistsInRegionGen(int x, int z) { + + } +} From 35220e1c4d0345a9161bff945ddeb9d288f74657 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 04:56:45 -0400 Subject: [PATCH 104/137] Slave pregen method --- .../methods/SlavePregenMethod.java | 301 ++++++++++++++++++ 1 file changed, 301 insertions(+) create mode 100644 src/main/java/com/volmit/iris/core/pregenerator/methods/SlavePregenMethod.java diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/SlavePregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/SlavePregenMethod.java new file mode 100644 index 000000000..a2a5eecd6 --- /dev/null +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/SlavePregenMethod.java @@ -0,0 +1,301 @@ +/* + * 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.core.pregenerator.methods; + +import com.google.common.util.concurrent.AtomicDouble; +import com.volmit.iris.Iris; +import com.volmit.iris.core.pregenerator.PregenListener; +import com.volmit.iris.core.pregenerator.PregenTask; +import com.volmit.iris.core.pregenerator.PregeneratorMethod; +import com.volmit.iris.core.pregenerator.turbo.TurboClient; +import com.volmit.iris.core.pregenerator.turbo.command.*; +import com.volmit.iris.engine.data.mca.NBTWorld; +import com.volmit.iris.engine.headless.HeadlessGenerator; +import com.volmit.iris.engine.headless.HeadlessWorld; +import com.volmit.iris.engine.object.IrisDimension; +import com.volmit.iris.util.io.IO; +import com.volmit.iris.util.scheduling.J; +import lombok.Getter; +import org.zeroturnaround.zip.ZipUtil; + +import javax.management.RuntimeErrorException; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.UUID; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; + +public class SlavePregenMethod implements PregeneratorMethod +{ + @Getter + private String address; + private String nickname; + private int port; + private String password; + private IrisDimension dimension; + private boolean ready = false; + private File worldFolder; + private UUID pack = UUID.randomUUID(); + private long seed; + + public SlavePregenMethod(String nickname, File worldFolder, String address, int port, String password, IrisDimension dimension, long seed) + { + this.seed = seed; + this.worldFolder = worldFolder; + this.address = address; + this.port = port; + this.password = password; + this.dimension = dimension; + } + + private TurboClient.TurboClientBuilder connect() + { + return TurboClient.builder().address(address).port(port); + } + + public synchronized void setup() + { + if(ready) + { + return; + } + + ready = false; + try { + connect().command(TurboInstallPack + .builder() + .dimension(dimension) + .pack(pack) + .seed(seed) + .build()) + .output((o) -> { + File to = new File(Iris.getTemp(), "send-" + pack.toString() + ".zip"); + ZipUtil.pack(dimension.getLoader().getDataFolder(), to); + + try { + IO.writeAll(to, o); + } catch (IOException e) { + e.printStackTrace(); + } + + to.deleteOnExit(); + }) + .build().go((response, data) -> { + if(response instanceof TurboBusy) + { + throw new RuntimeException("Service is busy, will try later"); + } + + ready = true; + }); + ready = true; + } catch (Throwable throwable) { + if(throwable instanceof RuntimeException) + { + ready = false; + return; + } + + throwable.printStackTrace(); + } + } + + public boolean canGenerate() + { + if(!ready) + { + J.a(this::setup); + } + + return ready; + } + + @Override + public void init() { + J.a(this::setup); + } + + @Override + public void close() { + if(ready) + { + try { + connect() + .command(TurboClose + .builder() + .pack(pack) + .build()) + .build() + .go((__, __b) -> {}); + } catch (Throwable throwable) { + throwable.printStackTrace(); + } + } + } + + @Override + public void save() { + + } + + @Override + public boolean supportsRegions(int x, int z, PregenListener listener) { + return true; + } + + @Override + public String getMethod(int x, int z) { + return "Remote<" + nickname + ">"; + } + + private double checkProgress(int x, int z) + { + AtomicDouble progress = new AtomicDouble(-1); + try { + connect() + .command(TurboGetProgress.builder() + .pack(pack).build()).output((i) -> { + }).build().go((response, o) -> { + if(response instanceof TurboSendProgress) + { + if(((TurboSendProgress) response).isAvailable()) + { + progress.set(((TurboSendProgress) response).getProgress()); + File f = new File(worldFolder, "region/r." + x + "." + z + ".mca"); + try { + f.getParentFile().mkdirs(); + IO.writeAll(f, o); + progress.set(1000); + } catch (Throwable e) { + e.printStackTrace(); + } + } + } + }); + } catch (Throwable throwable) { + throwable.printStackTrace(); + } + + return progress.get(); + } + + @Override + public void generateRegion(int x, int z, PregenListener listener) { + if(!ready) + { + throw new RuntimeException(); + } + + try { + connect().command(TurboGenerate + .builder() + .x(x).z(z).pack(pack) + .build()) + .build().go((response, data) -> { + if(response instanceof TurboOK) + { + listener.onNetworkStarted(x, z); + J.a(() -> { + double lastp = 0; + int calls = 0; + boolean installed = false; + while(true) + { + J.sleep(100); + double progress = checkProgress(x, z); + + if(progress == 1000) + { + installed = true; + AtomicInteger a = new AtomicInteger(calls); + PregenTask.iterateRegion(x, z, (xx, zz) -> { + if(a.decrementAndGet() < 0) + { + listener.onNetworkGeneratedChunk(xx, zz); + } + }); + calls = 1024; + } + + else if(progress < 0) + { + break; + } + + int change = (int) Math.floor((progress - lastp) * 1024D); + change = change == 0 ? 1 : change; + + AtomicInteger a = new AtomicInteger(calls); + AtomicInteger b = new AtomicInteger(change); + PregenTask.iterateRegion(x, z, (xx, zz) -> { + if(a.decrementAndGet() < 0) + { + if(b.decrementAndGet() >= 0) + { + listener.onNetworkGeneratedChunk(xx, zz); + } + } + }); + calls += change; + } + + if(!installed) + { + // TODO RETRY REGION + return; + } + + listener.onNetworkDownloaded(x, z); + }); + } + + else if(response instanceof TurboInstallFirst) + { + ready = false; + throw new RuntimeException(); + } + + else if(response instanceof TurboBusy) + { + throw new RuntimeException(); + } + + else + { + throw new RuntimeException(); + } + }); + } catch (Throwable throwable) { + + if(throwable instanceof RuntimeException) + { + throw (RuntimeException) throwable; + } + + throwable.printStackTrace(); + } + } + + @Override + public void generateChunk(int x, int z, PregenListener listener) { + + } +} From d3fe0b48d861970b9afad57c7c70bbd5549a20b7 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 04:56:54 -0400 Subject: [PATCH 105/137] Pregenerator tracking nets --- .../volmit/iris/core/gui/PregeneratorJob.java | 37 +++++++++++++++++++ .../core/pregenerator/IrisPregenerator.java | 29 +++++++++++++++ 2 files changed, 66 insertions(+) diff --git a/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java b/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java index fedfe0eab..4a8a43c3a 100644 --- a/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java +++ b/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java @@ -43,6 +43,8 @@ public class PregeneratorJob implements PregenListener { public static PregeneratorJob instance; private static final Color COLOR_EXISTS = parseColor("#4d7d5b"); private static final Color COLOR_GENERATING = parseColor("#0062ff"); + private static final Color COLOR_NETWORK = parseColor("#a863c2"); + private static final Color COLOR_NETWORK_GENERATING = parseColor("#836b8c"); private static final Color COLOR_GENERATED = parseColor("#34eb93"); private JFrame frame; private final PregenTask task; @@ -127,6 +129,16 @@ public class PregeneratorJob implements PregenListener { return instance.paused(); } + public void drawRegion(int x, int z, Color color) + { + J.a(() -> { + PregenTask.iterateRegion(x, z, (xx,zz)->{ + draw(xx,zz,color); + J.sleep(3); + }); + }); + } + public void draw(int x, int z, Color color) { try @@ -237,6 +249,31 @@ public class PregeneratorJob implements PregenListener { } + @Override + public void onNetworkStarted(int x, int z) { + drawRegion(x, z, COLOR_NETWORK); + } + + @Override + public void onNetworkFailed(int x, int z) { + + } + + @Override + public void onNetworkReclaim(int revert) { + + } + + @Override + public void onNetworkGeneratedChunk(int x, int z) { + draw(x, z, COLOR_NETWORK_GENERATING); + } + + @Override + public void onNetworkDownloaded(int x, int z) { + drawRegion(x, z, COLOR_NETWORK); + } + @Override public void onClose() { close(); diff --git a/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java b/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java index e63cade5e..b483e7dce 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java @@ -50,6 +50,8 @@ public class IrisPregenerator { private final ChronoLatch minuteLatch; private final AtomicReference currentGeneratorMethod; private final KSet generatedRegions; + private final KSet retry; + private final KSet net; public IrisPregenerator(PregenTask task, PregeneratorMethod generator, PregenListener listener) { @@ -59,6 +61,8 @@ public class IrisPregenerator { this.paused = new AtomicBoolean(false); this.task = task; this.generator = generator; + retry = new KSet<>(); + net = new KSet<>(); currentGeneratorMethod = new AtomicReference<>("Void"); minuteLatch = new ChronoLatch(60000, false); chunksPerSecond = new RollingSequence(10); @@ -230,6 +234,31 @@ public class IrisPregenerator { listener.onRegionSkipped(x, z); } + @Override + public void onNetworkStarted(int x, int z) { + net.add(new Position2(x, z)); + } + + @Override + public void onNetworkFailed(int x, int z) { + retry.add(new Position2(x, z)); + } + + @Override + public void onNetworkReclaim(int revert) { + generated.addAndGet(-revert); + } + + @Override + public void onNetworkGeneratedChunk(int x, int z) { + generated.addAndGet(1); + } + + @Override + public void onNetworkDownloaded(int x, int z) { + net.remove(new Position2(x, z)); + } + @Override public void onClose() { listener.onClose(); From 4d965333eff6fb4287b22f1c9279b116850e72fd Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Mon, 19 Jul 2021 23:55:28 -0400 Subject: [PATCH 106/137] Revert "Drop do a flip " This reverts commit 9ed246e4824a74b445aa65f5983d40028026668f. --- .../volmit/iris/core/command/CommandIris.java | 3 + .../iris/core/command/CommandIrisDoAFlip.java | 73 +++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 src/main/java/com/volmit/iris/core/command/CommandIrisDoAFlip.java diff --git a/src/main/java/com/volmit/iris/core/command/CommandIris.java b/src/main/java/com/volmit/iris/core/command/CommandIris.java index 16bde75eb..9f342b13a 100644 --- a/src/main/java/com/volmit/iris/core/command/CommandIris.java +++ b/src/main/java/com/volmit/iris/core/command/CommandIris.java @@ -69,6 +69,9 @@ public class CommandIris extends MortarCommand { @Command private CommandIrisReload reload; + @Command + private CommandIrisDoAFlip doaflip; + public CommandIris() { super("iris", "ir", "irs"); requiresPermission(Iris.perm); diff --git a/src/main/java/com/volmit/iris/core/command/CommandIrisDoAFlip.java b/src/main/java/com/volmit/iris/core/command/CommandIrisDoAFlip.java new file mode 100644 index 000000000..7d11c6648 --- /dev/null +++ b/src/main/java/com/volmit/iris/core/command/CommandIrisDoAFlip.java @@ -0,0 +1,73 @@ +/* + * 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.core.command; + +import com.volmit.iris.Iris; +import com.volmit.iris.core.pregenerator.PregenTask; +import com.volmit.iris.core.tools.IrisToolbelt; +import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.exceptions.IrisException; +import com.volmit.iris.util.format.C; +import com.volmit.iris.util.math.Position2; +import com.volmit.iris.util.plugin.MortarCommand; +import com.volmit.iris.util.plugin.VolmitSender; +import com.volmit.iris.util.scheduling.J; + +public class CommandIrisDoAFlip extends MortarCommand { + public CommandIrisDoAFlip() { + super("doabackflip"); + requiresPermission(Iris.perm.studio); + setDescription("Create a headless pregenerated world"); + setCategory("Studio"); + } + + + @Override + public void addTabOptions(VolmitSender sender, String[] args, KList list) { + + } + + @Override + public boolean handle(VolmitSender sender, String[] args) { + try { + IrisToolbelt.createWorld() + .headless(true) + .name("thebackflip") + .dimension("overworld") + .seed(6969696969L) + .sender(sender) + .studio(false) + .pregen(PregenTask.builder() + .radius(2) + .center(new Position2(0, 0)) + .build()) + .create(); + } catch (IrisException e) { + e.printStackTrace(); + sender.sendMessage("Check Console"); + } + + return true; + } + + @Override + protected String getArgsUsage() { + return " [-t/--trim]"; + } +} From 9833d466c49e2688afc3378f460b8ef3982a9a50 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 11:18:35 -0400 Subject: [PATCH 107/137] Iris Syndicate --- ...Method.java => SyndicatePregenMethod.java} | 43 +++++----- .../SyndicateClient.java} | 18 ++--- .../SyndicateCommandIO.java} | 12 +-- .../SyndicateServer.java} | 81 ++++++++++++------- .../command/SyndicateBusy.java} | 4 +- .../command/SyndicateClose.java} | 6 +- .../command/SyndicateCommand.java} | 4 +- .../command/SyndicateError.java} | 4 +- .../command/SyndicateGenerate.java} | 5 +- .../command/SyndicateGetProgress.java} | 6 +- .../command/SyndicateInstallFirst.java | 22 +++++ .../command/SyndicateInstallPack.java} | 4 +- .../command/SyndicateOK.java} | 4 +- .../command/SyndicateSendProgress.java} | 4 +- .../pregenerator/turbo/command/TurboOK.java | 22 ----- 15 files changed, 125 insertions(+), 114 deletions(-) rename src/main/java/com/volmit/iris/core/pregenerator/methods/{SlavePregenMethod.java => SyndicatePregenMethod.java} (85%) rename src/main/java/com/volmit/iris/core/pregenerator/{turbo/TurboClient.java => syndicate/SyndicateClient.java} (73%) rename src/main/java/com/volmit/iris/core/pregenerator/{turbo/TurboCommander.java => syndicate/SyndicateCommandIO.java} (70%) rename src/main/java/com/volmit/iris/core/pregenerator/{turbo/TurboServer.java => syndicate/SyndicateServer.java} (74%) rename src/main/java/com/volmit/iris/core/pregenerator/{turbo/command/TurboInstallFirst.java => syndicate/command/SyndicateBusy.java} (86%) rename src/main/java/com/volmit/iris/core/pregenerator/{turbo/command/TurboGetProgress.java => syndicate/command/SyndicateClose.java} (89%) rename src/main/java/com/volmit/iris/core/pregenerator/{turbo/command/TurboCommand.java => syndicate/command/SyndicateCommand.java} (89%) rename src/main/java/com/volmit/iris/core/pregenerator/{turbo/command/TurboError.java => syndicate/command/SyndicateError.java} (86%) rename src/main/java/com/volmit/iris/core/pregenerator/{turbo/command/TurboGenerate.java => syndicate/command/SyndicateGenerate.java} (87%) rename src/main/java/com/volmit/iris/core/pregenerator/{turbo/command/TurboClose.java => syndicate/command/SyndicateGetProgress.java} (89%) create mode 100644 src/main/java/com/volmit/iris/core/pregenerator/syndicate/command/SyndicateInstallFirst.java rename src/main/java/com/volmit/iris/core/pregenerator/{turbo/command/TurboInstallPack.java => syndicate/command/SyndicateInstallPack.java} (90%) rename src/main/java/com/volmit/iris/core/pregenerator/{turbo/command/TurboBusy.java => syndicate/command/SyndicateOK.java} (86%) rename src/main/java/com/volmit/iris/core/pregenerator/{turbo/command/TurboSendProgress.java => syndicate/command/SyndicateSendProgress.java} (89%) delete mode 100644 src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboOK.java diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/SlavePregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/SyndicatePregenMethod.java similarity index 85% rename from src/main/java/com/volmit/iris/core/pregenerator/methods/SlavePregenMethod.java rename to src/main/java/com/volmit/iris/core/pregenerator/methods/SyndicatePregenMethod.java index a2a5eecd6..98ca715e5 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/SlavePregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/SyndicatePregenMethod.java @@ -23,27 +23,20 @@ import com.volmit.iris.Iris; import com.volmit.iris.core.pregenerator.PregenListener; import com.volmit.iris.core.pregenerator.PregenTask; import com.volmit.iris.core.pregenerator.PregeneratorMethod; -import com.volmit.iris.core.pregenerator.turbo.TurboClient; -import com.volmit.iris.core.pregenerator.turbo.command.*; -import com.volmit.iris.engine.data.mca.NBTWorld; -import com.volmit.iris.engine.headless.HeadlessGenerator; -import com.volmit.iris.engine.headless.HeadlessWorld; +import com.volmit.iris.core.pregenerator.syndicate.SyndicateClient; +import com.volmit.iris.core.pregenerator.syndicate.command.*; import com.volmit.iris.engine.object.IrisDimension; import com.volmit.iris.util.io.IO; import com.volmit.iris.util.scheduling.J; import lombok.Getter; import org.zeroturnaround.zip.ZipUtil; -import javax.management.RuntimeErrorException; import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; import java.io.IOException; import java.util.UUID; -import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; -public class SlavePregenMethod implements PregeneratorMethod +public class SyndicatePregenMethod implements PregeneratorMethod { @Getter private String address; @@ -56,7 +49,7 @@ public class SlavePregenMethod implements PregeneratorMethod private UUID pack = UUID.randomUUID(); private long seed; - public SlavePregenMethod(String nickname, File worldFolder, String address, int port, String password, IrisDimension dimension, long seed) + public SyndicatePregenMethod(String nickname, File worldFolder, String address, int port, String password, IrisDimension dimension, long seed) { this.seed = seed; this.worldFolder = worldFolder; @@ -66,9 +59,9 @@ public class SlavePregenMethod implements PregeneratorMethod this.dimension = dimension; } - private TurboClient.TurboClientBuilder connect() + private SyndicateClient.SyndicateClientBuilder connect() { - return TurboClient.builder().address(address).port(port); + return SyndicateClient.builder().address(address).port(port); } public synchronized void setup() @@ -80,7 +73,7 @@ public class SlavePregenMethod implements PregeneratorMethod ready = false; try { - connect().command(TurboInstallPack + connect().command(SyndicateInstallPack .builder() .dimension(dimension) .pack(pack) @@ -99,7 +92,7 @@ public class SlavePregenMethod implements PregeneratorMethod to.deleteOnExit(); }) .build().go((response, data) -> { - if(response instanceof TurboBusy) + if(response instanceof SyndicateBusy) { throw new RuntimeException("Service is busy, will try later"); } @@ -139,7 +132,7 @@ public class SlavePregenMethod implements PregeneratorMethod { try { connect() - .command(TurboClose + .command(SyndicateClose .builder() .pack(pack) .build()) @@ -163,7 +156,7 @@ public class SlavePregenMethod implements PregeneratorMethod @Override public String getMethod(int x, int z) { - return "Remote<" + nickname + ">"; + return "Syndicate<" + nickname + ">"; } private double checkProgress(int x, int z) @@ -171,14 +164,14 @@ public class SlavePregenMethod implements PregeneratorMethod AtomicDouble progress = new AtomicDouble(-1); try { connect() - .command(TurboGetProgress.builder() + .command(SyndicateGetProgress.builder() .pack(pack).build()).output((i) -> { }).build().go((response, o) -> { - if(response instanceof TurboSendProgress) + if(response instanceof SyndicateSendProgress) { - if(((TurboSendProgress) response).isAvailable()) + if(((SyndicateSendProgress) response).isAvailable()) { - progress.set(((TurboSendProgress) response).getProgress()); + progress.set(((SyndicateSendProgress) response).getProgress()); File f = new File(worldFolder, "region/r." + x + "." + z + ".mca"); try { f.getParentFile().mkdirs(); @@ -205,12 +198,12 @@ public class SlavePregenMethod implements PregeneratorMethod } try { - connect().command(TurboGenerate + connect().command(SyndicateGenerate .builder() .x(x).z(z).pack(pack) .build()) .build().go((response, data) -> { - if(response instanceof TurboOK) + if(response instanceof SyndicateOK) { listener.onNetworkStarted(x, z); J.a(() -> { @@ -267,13 +260,13 @@ public class SlavePregenMethod implements PregeneratorMethod }); } - else if(response instanceof TurboInstallFirst) + else if(response instanceof SyndicateInstallFirst) { ready = false; throw new RuntimeException(); } - else if(response instanceof TurboBusy) + else if(response instanceof SyndicateBusy) { throw new RuntimeException(); } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/turbo/TurboClient.java b/src/main/java/com/volmit/iris/core/pregenerator/syndicate/SyndicateClient.java similarity index 73% rename from src/main/java/com/volmit/iris/core/pregenerator/turbo/TurboClient.java rename to src/main/java/com/volmit/iris/core/pregenerator/syndicate/SyndicateClient.java index ab0f31060..1383d164c 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/turbo/TurboClient.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/syndicate/SyndicateClient.java @@ -16,33 +16,29 @@ * along with this program. If not, see . */ -package com.volmit.iris.core.pregenerator.turbo; +package com.volmit.iris.core.pregenerator.syndicate; -import com.volmit.iris.core.pregenerator.turbo.command.TurboCommand; -import com.volmit.iris.util.collection.GBiset; +import com.volmit.iris.core.pregenerator.syndicate.command.SyndicateCommand; import com.volmit.iris.util.function.Consumer2; -import com.volmit.iris.util.scheduling.J; import lombok.Builder; import java.io.DataInputStream; import java.io.DataOutputStream; -import java.io.IOException; import java.net.Socket; import java.util.function.Consumer; -import java.util.function.Supplier; @Builder -public class TurboClient { +public class SyndicateClient { private String address; private int port; - private TurboCommand command; + private SyndicateCommand command; private Consumer output; - public void go(Consumer2 handler) throws Throwable { + public void go(Consumer2 handler) throws Throwable { Socket socket = new Socket(address, port); DataInputStream i = new DataInputStream(socket.getInputStream()); DataOutputStream o = new DataOutputStream(socket.getOutputStream()); - TurboCommander.write(command, o); + SyndicateCommandIO.write(command, o); if(output != null) { @@ -50,7 +46,7 @@ public class TurboClient { } o.flush(); - handler.accept(TurboCommander.read(i), i); + handler.accept(SyndicateCommandIO.read(i), i); socket.close(); } } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/turbo/TurboCommander.java b/src/main/java/com/volmit/iris/core/pregenerator/syndicate/SyndicateCommandIO.java similarity index 70% rename from src/main/java/com/volmit/iris/core/pregenerator/turbo/TurboCommander.java rename to src/main/java/com/volmit/iris/core/pregenerator/syndicate/SyndicateCommandIO.java index 5e0438c57..a3cc8c97f 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/turbo/TurboCommander.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/syndicate/SyndicateCommandIO.java @@ -16,24 +16,24 @@ * along with this program. If not, see . */ -package com.volmit.iris.core.pregenerator.turbo; +package com.volmit.iris.core.pregenerator.syndicate; import com.google.gson.Gson; -import com.volmit.iris.core.pregenerator.turbo.command.TurboCommand; +import com.volmit.iris.core.pregenerator.syndicate.command.SyndicateCommand; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; -public class TurboCommander { +public class SyndicateCommandIO { private static final Gson gson = new Gson(); - public static TurboCommand read(DataInputStream in) throws IOException, ClassNotFoundException { + public static SyndicateCommand read(DataInputStream in) throws IOException, ClassNotFoundException { String clazz = in.readUTF(); - return (TurboCommand) gson.fromJson(in.readUTF(), Class.forName(clazz)); + return (SyndicateCommand) gson.fromJson(in.readUTF(), Class.forName(clazz)); } - public static void write(TurboCommand c, DataOutputStream out) throws IOException { + public static void write(SyndicateCommand c, DataOutputStream out) throws IOException { out.writeUTF(c.getClass().getCanonicalName()); out.writeUTF(gson.toJson(c)); } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/turbo/TurboServer.java b/src/main/java/com/volmit/iris/core/pregenerator/syndicate/SyndicateServer.java similarity index 74% rename from src/main/java/com/volmit/iris/core/pregenerator/turbo/TurboServer.java rename to src/main/java/com/volmit/iris/core/pregenerator/syndicate/SyndicateServer.java index 85e5e4f74..098a509bc 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/turbo/TurboServer.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/syndicate/SyndicateServer.java @@ -16,16 +16,14 @@ * along with this program. If not, see . */ -package com.volmit.iris.core.pregenerator.turbo; +package com.volmit.iris.core.pregenerator.syndicate; import com.volmit.iris.core.pregenerator.PregenListener; -import com.volmit.iris.core.pregenerator.turbo.command.*; +import com.volmit.iris.core.pregenerator.syndicate.command.*; import com.volmit.iris.engine.headless.HeadlessGenerator; import com.volmit.iris.engine.headless.HeadlessWorld; import com.volmit.iris.util.io.IO; import com.volmit.iris.util.scheduling.J; -import org.apache.logging.log4j.core.tools.Generate; -import org.zeroturnaround.zip.ZTFileUtil; import org.zeroturnaround.zip.ZipUtil; import java.io.*; @@ -36,7 +34,7 @@ import java.util.Objects; import java.util.UUID; import java.util.concurrent.atomic.AtomicInteger; -public class TurboServer extends Thread implements PregenListener { +public class SyndicateServer extends Thread implements PregenListener { private int port; private String password; private boolean busy; @@ -48,7 +46,7 @@ public class TurboServer extends Thread implements PregenListener { private AtomicInteger g = new AtomicInteger(0); private File lastGeneratedRegion = null; - public TurboServer(File cache, int port, String password, int tc) throws IOException { + public SyndicateServer(File cache, int port, String password, int tc) throws IOException { this.port = port; this.cache = cache; this.password = password; @@ -83,11 +81,11 @@ public class TurboServer extends Thread implements PregenListener { private void handle(Socket client, DataInputStream i, DataOutputStream o) throws Throwable { - TurboCommand cmd = handle(TurboCommander.read(i), i, o); + SyndicateCommand cmd = handle(SyndicateCommandIO.read(i), i, o); if(cmd != null) { - TurboCommander.write(cmd, o); + SyndicateCommandIO.write(cmd, o); } o.flush(); @@ -98,12 +96,12 @@ public class TurboServer extends Thread implements PregenListener { return new File(cache, id.toString().charAt(2) +"/" + id.toString().substring(0, 4)+ "/" + id); } - private TurboCommand handle(TurboCommand command, DataInputStream i, DataOutputStream o) throws Throwable { - if(command instanceof TurboInstallPack) + private SyndicateCommand handle(SyndicateCommand command, DataInputStream i, DataOutputStream o) throws Throwable { + if(command instanceof SyndicateInstallPack) { if(busy) { - return new TurboBusy(); + return new SyndicateBusy(); } if(generator != null) @@ -113,7 +111,7 @@ public class TurboServer extends Thread implements PregenListener { generator = null; } - UUID id = ((TurboInstallPack) command).getPack(); + UUID id = ((SyndicateInstallPack) command).getPack(); File cacheload = new File(cache, id.toString().charAt(2) +"/" + id.toString().substring(0, 4)+ "/" + id + ".zip"); File cachestore = getCachedDim(id); IO.delete(cachestore); @@ -125,35 +123,35 @@ public class TurboServer extends Thread implements PregenListener { fos.close(); ZipUtil.unpack(cacheload, cachestore); cacheload.deleteOnExit(); - HeadlessWorld w = new HeadlessWorld("turbo/" + id.toString(), ((TurboInstallPack) command).getDimension(), ((TurboInstallPack) command).getSeed()); + HeadlessWorld w = new HeadlessWorld("turbo/" + id.toString(), ((SyndicateInstallPack) command).getDimension(), ((SyndicateInstallPack) command).getSeed()); w.setStudio(true); generator = w.generate(); - return new TurboOK(); + return new SyndicateOK(); } - if(command instanceof TurboGenerate) + if(command instanceof SyndicateGenerate) { if(busy) { - return new TurboBusy(); + return new SyndicateBusy(); } - if(generator == null || !Objects.equals(currentId, ((TurboGenerate) command).getPack())) { - return new TurboInstallFirst(); + if(generator == null || !Objects.equals(currentId, ((SyndicateGenerate) command).getPack())) { + return new SyndicateInstallFirst(); } g.set(0); busy = true; J.a(() -> { busy = false; - lastGeneratedRegion = generator.generateRegionToFile(((TurboGenerate) command).getX(), ((TurboGenerate) command).getZ(), this); + lastGeneratedRegion = generator.generateRegionToFile(((SyndicateGenerate) command).getX(), ((SyndicateGenerate) command).getZ(), this); }); - return new TurboOK(); + return new SyndicateOK(); } - if(command instanceof TurboClose) + if(command instanceof SyndicateClose) { - if(generator != null && Objects.equals(currentId, ((TurboClose) command).getPack()) && !busy) + if(generator != null && Objects.equals(currentId, ((SyndicateClose) command).getPack()) && !busy) { generator.close(); IO.delete(generator.getWorld().getWorld().worldFolder()); @@ -162,16 +160,16 @@ public class TurboServer extends Thread implements PregenListener { } } - if(command instanceof TurboGetProgress) + if(command instanceof SyndicateGetProgress) { - if(generator != null && busy && Objects.equals(currentId, ((TurboGetProgress) command).getPack())) + if(generator != null && busy && Objects.equals(currentId, ((SyndicateGetProgress) command).getPack())) { - return TurboSendProgress.builder().progress((double)g.get() / 1024D).build(); + return SyndicateSendProgress.builder().progress((double)g.get() / 1024D).build(); } - else if(generator != null && !busy && Objects.equals(currentId, ((TurboGetProgress) command).getPack()) && lastGeneratedRegion != null && lastGeneratedRegion.exists()) + else if(generator != null && !busy && Objects.equals(currentId, ((SyndicateGetProgress) command).getPack()) && lastGeneratedRegion != null && lastGeneratedRegion.exists()) { - TurboCommander.write(TurboSendProgress + SyndicateCommandIO.write(SyndicateSendProgress .builder() .progress(1).available(true) .build(), o); @@ -182,12 +180,12 @@ public class TurboServer extends Thread implements PregenListener { else if(generator == null) { - return new TurboInstallFirst(); + return new SyndicateInstallFirst(); } else { - return new TurboBusy(); + return new SyndicateBusy(); } } @@ -230,6 +228,31 @@ public class TurboServer extends Thread implements PregenListener { } + @Override + public void onNetworkStarted(int x, int z) { + + } + + @Override + public void onNetworkFailed(int x, int z) { + + } + + @Override + public void onNetworkReclaim(int revert) { + + } + + @Override + public void onNetworkGeneratedChunk(int x, int z) { + + } + + @Override + public void onNetworkDownloaded(int x, int z) { + + } + @Override public void onClose() { diff --git a/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboInstallFirst.java b/src/main/java/com/volmit/iris/core/pregenerator/syndicate/command/SyndicateBusy.java similarity index 86% rename from src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboInstallFirst.java rename to src/main/java/com/volmit/iris/core/pregenerator/syndicate/command/SyndicateBusy.java index dfd222fc0..3b0766dee 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboInstallFirst.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/syndicate/command/SyndicateBusy.java @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package com.volmit.iris.core.pregenerator.turbo.command; +package com.volmit.iris.core.pregenerator.syndicate.command; -public class TurboInstallFirst implements TurboCommand { +public class SyndicateBusy implements SyndicateCommand { } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboGetProgress.java b/src/main/java/com/volmit/iris/core/pregenerator/syndicate/command/SyndicateClose.java similarity index 89% rename from src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboGetProgress.java rename to src/main/java/com/volmit/iris/core/pregenerator/syndicate/command/SyndicateClose.java index cf6819b1a..782c356c7 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboGetProgress.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/syndicate/command/SyndicateClose.java @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package com.volmit.iris.core.pregenerator.turbo.command; +package com.volmit.iris.core.pregenerator.syndicate.command; import lombok.AllArgsConstructor; import lombok.Builder; @@ -25,11 +25,11 @@ import lombok.NoArgsConstructor; import java.util.UUID; -@Data @Builder @AllArgsConstructor @NoArgsConstructor -public class TurboGetProgress implements TurboCommand { +@Data +public class SyndicateClose implements SyndicateCommand { @Builder.Default private UUID pack = UUID.randomUUID(); } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboCommand.java b/src/main/java/com/volmit/iris/core/pregenerator/syndicate/command/SyndicateCommand.java similarity index 89% rename from src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboCommand.java rename to src/main/java/com/volmit/iris/core/pregenerator/syndicate/command/SyndicateCommand.java index e83039598..968e82f8b 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboCommand.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/syndicate/command/SyndicateCommand.java @@ -16,9 +16,9 @@ * along with this program. If not, see . */ -package com.volmit.iris.core.pregenerator.turbo.command; +package com.volmit.iris.core.pregenerator.syndicate.command; -public interface TurboCommand +public interface SyndicateCommand { } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboError.java b/src/main/java/com/volmit/iris/core/pregenerator/syndicate/command/SyndicateError.java similarity index 86% rename from src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboError.java rename to src/main/java/com/volmit/iris/core/pregenerator/syndicate/command/SyndicateError.java index 8531e1f99..581e229e8 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboError.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/syndicate/command/SyndicateError.java @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package com.volmit.iris.core.pregenerator.turbo.command; +package com.volmit.iris.core.pregenerator.syndicate.command; -public class TurboError implements TurboCommand { +public class SyndicateError implements SyndicateCommand { } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboGenerate.java b/src/main/java/com/volmit/iris/core/pregenerator/syndicate/command/SyndicateGenerate.java similarity index 87% rename from src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboGenerate.java rename to src/main/java/com/volmit/iris/core/pregenerator/syndicate/command/SyndicateGenerate.java index 105698cce..df73ab983 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboGenerate.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/syndicate/command/SyndicateGenerate.java @@ -16,9 +16,8 @@ * along with this program. If not, see . */ -package com.volmit.iris.core.pregenerator.turbo.command; +package com.volmit.iris.core.pregenerator.syndicate.command; -import com.volmit.iris.engine.object.IrisDimension; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -30,7 +29,7 @@ import java.util.UUID; @AllArgsConstructor @NoArgsConstructor @Data -public class TurboGenerate implements TurboCommand { +public class SyndicateGenerate implements SyndicateCommand { @Builder.Default private int x = 0; @Builder.Default diff --git a/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboClose.java b/src/main/java/com/volmit/iris/core/pregenerator/syndicate/command/SyndicateGetProgress.java similarity index 89% rename from src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboClose.java rename to src/main/java/com/volmit/iris/core/pregenerator/syndicate/command/SyndicateGetProgress.java index 55eeb3200..838b14eff 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboClose.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/syndicate/command/SyndicateGetProgress.java @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package com.volmit.iris.core.pregenerator.turbo.command; +package com.volmit.iris.core.pregenerator.syndicate.command; import lombok.AllArgsConstructor; import lombok.Builder; @@ -25,11 +25,11 @@ import lombok.NoArgsConstructor; import java.util.UUID; +@Data @Builder @AllArgsConstructor @NoArgsConstructor -@Data -public class TurboClose implements TurboCommand { +public class SyndicateGetProgress implements SyndicateCommand { @Builder.Default private UUID pack = UUID.randomUUID(); } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/syndicate/command/SyndicateInstallFirst.java b/src/main/java/com/volmit/iris/core/pregenerator/syndicate/command/SyndicateInstallFirst.java new file mode 100644 index 000000000..c948cfb57 --- /dev/null +++ b/src/main/java/com/volmit/iris/core/pregenerator/syndicate/command/SyndicateInstallFirst.java @@ -0,0 +1,22 @@ +/* + * 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.core.pregenerator.syndicate.command; + +public class SyndicateInstallFirst implements SyndicateCommand { +} diff --git a/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboInstallPack.java b/src/main/java/com/volmit/iris/core/pregenerator/syndicate/command/SyndicateInstallPack.java similarity index 90% rename from src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboInstallPack.java rename to src/main/java/com/volmit/iris/core/pregenerator/syndicate/command/SyndicateInstallPack.java index b3b8b10b7..d399ee546 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboInstallPack.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/syndicate/command/SyndicateInstallPack.java @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package com.volmit.iris.core.pregenerator.turbo.command; +package com.volmit.iris.core.pregenerator.syndicate.command; import com.volmit.iris.engine.object.IrisDimension; import lombok.AllArgsConstructor; @@ -30,7 +30,7 @@ import java.util.UUID; @AllArgsConstructor @NoArgsConstructor @Data -public class TurboInstallPack implements TurboCommand { +public class SyndicateInstallPack implements SyndicateCommand { @Builder.Default private UUID pack = UUID.randomUUID(); diff --git a/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboBusy.java b/src/main/java/com/volmit/iris/core/pregenerator/syndicate/command/SyndicateOK.java similarity index 86% rename from src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboBusy.java rename to src/main/java/com/volmit/iris/core/pregenerator/syndicate/command/SyndicateOK.java index b332e2ca4..ad78888a8 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboBusy.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/syndicate/command/SyndicateOK.java @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package com.volmit.iris.core.pregenerator.turbo.command; +package com.volmit.iris.core.pregenerator.syndicate.command; -public class TurboBusy implements TurboCommand { +public class SyndicateOK implements SyndicateCommand { } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboSendProgress.java b/src/main/java/com/volmit/iris/core/pregenerator/syndicate/command/SyndicateSendProgress.java similarity index 89% rename from src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboSendProgress.java rename to src/main/java/com/volmit/iris/core/pregenerator/syndicate/command/SyndicateSendProgress.java index b8b34ae2a..9014f4c37 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboSendProgress.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/syndicate/command/SyndicateSendProgress.java @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package com.volmit.iris.core.pregenerator.turbo.command; +package com.volmit.iris.core.pregenerator.syndicate.command; import lombok.AllArgsConstructor; import lombok.Builder; @@ -27,7 +27,7 @@ import lombok.NoArgsConstructor; @Builder @NoArgsConstructor @AllArgsConstructor -public class TurboSendProgress implements TurboCommand { +public class SyndicateSendProgress implements SyndicateCommand { @Builder.Default private double progress = 0; @Builder.Default diff --git a/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboOK.java b/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboOK.java deleted file mode 100644 index 813a45406..000000000 --- a/src/main/java/com/volmit/iris/core/pregenerator/turbo/command/TurboOK.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * 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.core.pregenerator.turbo.command; - -public class TurboOK implements TurboCommand { -} From 38c762f7751930fd511c14f03c3453973aabf938 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 11:18:44 -0400 Subject: [PATCH 108/137] Drop doaflip again --- .../volmit/iris/core/command/CommandIris.java | 3 - .../iris/core/command/CommandIrisDoAFlip.java | 73 ------------------- 2 files changed, 76 deletions(-) delete mode 100644 src/main/java/com/volmit/iris/core/command/CommandIrisDoAFlip.java diff --git a/src/main/java/com/volmit/iris/core/command/CommandIris.java b/src/main/java/com/volmit/iris/core/command/CommandIris.java index 9f342b13a..16bde75eb 100644 --- a/src/main/java/com/volmit/iris/core/command/CommandIris.java +++ b/src/main/java/com/volmit/iris/core/command/CommandIris.java @@ -69,9 +69,6 @@ public class CommandIris extends MortarCommand { @Command private CommandIrisReload reload; - @Command - private CommandIrisDoAFlip doaflip; - public CommandIris() { super("iris", "ir", "irs"); requiresPermission(Iris.perm); diff --git a/src/main/java/com/volmit/iris/core/command/CommandIrisDoAFlip.java b/src/main/java/com/volmit/iris/core/command/CommandIrisDoAFlip.java deleted file mode 100644 index 7d11c6648..000000000 --- a/src/main/java/com/volmit/iris/core/command/CommandIrisDoAFlip.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * 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.core.command; - -import com.volmit.iris.Iris; -import com.volmit.iris.core.pregenerator.PregenTask; -import com.volmit.iris.core.tools.IrisToolbelt; -import com.volmit.iris.util.collection.KList; -import com.volmit.iris.util.exceptions.IrisException; -import com.volmit.iris.util.format.C; -import com.volmit.iris.util.math.Position2; -import com.volmit.iris.util.plugin.MortarCommand; -import com.volmit.iris.util.plugin.VolmitSender; -import com.volmit.iris.util.scheduling.J; - -public class CommandIrisDoAFlip extends MortarCommand { - public CommandIrisDoAFlip() { - super("doabackflip"); - requiresPermission(Iris.perm.studio); - setDescription("Create a headless pregenerated world"); - setCategory("Studio"); - } - - - @Override - public void addTabOptions(VolmitSender sender, String[] args, KList list) { - - } - - @Override - public boolean handle(VolmitSender sender, String[] args) { - try { - IrisToolbelt.createWorld() - .headless(true) - .name("thebackflip") - .dimension("overworld") - .seed(6969696969L) - .sender(sender) - .studio(false) - .pregen(PregenTask.builder() - .radius(2) - .center(new Position2(0, 0)) - .build()) - .create(); - } catch (IrisException e) { - e.printStackTrace(); - sender.sendMessage("Check Console"); - } - - return true; - } - - @Override - protected String getArgsUsage() { - return " [-t/--trim]"; - } -} From f4b41a43cfed98c8eb08e7e3b5b0fd62c35f36f6 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 11:18:55 -0400 Subject: [PATCH 109/137] Link pregen --- .../com/volmit/iris/core/command/world/CommandIrisCreate.java | 1 - .../com/volmit/iris/core/command/world/CommandIrisPregen.java | 2 -- 2 files changed, 3 deletions(-) diff --git a/src/main/java/com/volmit/iris/core/command/world/CommandIrisCreate.java b/src/main/java/com/volmit/iris/core/command/world/CommandIrisCreate.java index 4ac4163f6..d4b5bc5e0 100644 --- a/src/main/java/com/volmit/iris/core/command/world/CommandIrisCreate.java +++ b/src/main/java/com/volmit/iris/core/command/world/CommandIrisCreate.java @@ -223,7 +223,6 @@ public class CommandIrisCreate extends MortarCommand { .productionMode().seed(seed).create(); J.s(() -> { - sender.sendMessage("Generating with " + Iris.getThreadCount() + " threads per chunk"); O done = new O<>(); done.set(false); diff --git a/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java b/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java index 74837c9cb..1439f9d3e 100644 --- a/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java +++ b/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java @@ -20,10 +20,8 @@ package com.volmit.iris.core.command.world; import com.volmit.iris.Iris; import com.volmit.iris.core.gui.PregeneratorJob; -import com.volmit.iris.core.gui.components.Pregenerator; import com.volmit.iris.core.pregenerator.PregenTask; import com.volmit.iris.core.pregenerator.methods.HybridPregenMethod; -import com.volmit.iris.core.pregenerator.methods.PaperOrMedievalPregenMethod; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.plugin.MortarCommand; From 326bddad2a1ae8d45e1f5bbf0f3bbe8a3bce97f9 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 11:19:47 -0400 Subject: [PATCH 110/137] Thread counts synced --- src/main/java/com/volmit/iris/Iris.java | 24 ------------------- .../com/volmit/iris/core/IrisSettings.java | 14 +++++++++-- .../core/pregenerator/IrisPregenerator.java | 2 ++ ....java => AsyncOrMedievalPregenMethod.java} | 6 ++--- ...egenMethod.java => AsyncPregenMethod.java} | 7 +++--- .../methods/HybridPregenMethod.java | 2 +- .../methods/MedievalPregenMethod.java | 3 ++- .../com/volmit/iris/engine/IrisComplex.java | 2 +- .../com/volmit/iris/engine/IrisEngine.java | 5 ---- .../framework/EngineCompositeGenerator.java | 2 +- .../framework/EngineParallaxManager.java | 10 ++++---- .../iris/engine/framework/EngineTarget.java | 4 ++-- .../engine/headless/HeadlessGenerator.java | 3 ++- .../iris/engine/hunk/io/HunkRegionSlice.java | 4 ++-- .../engine/lighting/LightingTaskBatch.java | 3 ++- .../iris/engine/parallax/ParallaxRegion.java | 19 +++++++++------ .../iris/engine/parallax/ParallaxWorld.java | 6 +++-- 17 files changed, 55 insertions(+), 61 deletions(-) rename src/main/java/com/volmit/iris/core/pregenerator/methods/{PaperOrMedievalPregenMethod.java => AsyncOrMedievalPregenMethod.java} (87%) rename src/main/java/com/volmit/iris/core/pregenerator/methods/{PaperAsyncPregenMethod.java => AsyncPregenMethod.java} (92%) diff --git a/src/main/java/com/volmit/iris/Iris.java b/src/main/java/com/volmit/iris/Iris.java index 4dd11a222..fa652ee8f 100644 --- a/src/main/java/com/volmit/iris/Iris.java +++ b/src/main/java/com/volmit/iris/Iris.java @@ -155,30 +155,6 @@ public class Iris extends VolmitPlugin implements Listener { Iris.info("Data Packs Setup!"); } - public static int getThreadCount() { - int tc = IrisSettings.get().getConcurrency().getThreadCount(); - - if (tc <= 0) { - int p = Runtime.getRuntime().availableProcessors(); - - return p > 16 ? 16 : Math.max(p, 4); - } - - return tc; - } - - private static boolean doesSupport3DBiomes() { - try { - int v = Integer.parseInt(Bukkit.getBukkitVersion().split("\\Q-\\E")[0].split("\\Q.\\E")[1]); - - return v >= 15; - } catch (Throwable e) { - Iris.reportError(e); - } - - return false; - } - private static boolean doesSupportCustomModels() { try { int v = Integer.parseInt(Bukkit.getBukkitVersion().split("\\Q-\\E")[0].split("\\Q.\\E")[1]); diff --git a/src/main/java/com/volmit/iris/core/IrisSettings.java b/src/main/java/com/volmit/iris/core/IrisSettings.java index 40d625e93..41cf00626 100644 --- a/src/main/java/com/volmit/iris/core/IrisSettings.java +++ b/src/main/java/com/volmit/iris/core/IrisSettings.java @@ -56,14 +56,25 @@ public class IrisSettings { return getParallax().getParallaxRegionEvictionMS(); } + public static int getThreadCount(int c) + { + if(c < 2 && c >= 0) + { + return 2; + } + + return c < 0 ? Runtime.getRuntime().availableProcessors() / -c : c; + } + @Data public static class IrisSettingsCache { - public int streamingCacheSize = 8192; + public int complexCacheSize = 131072; } @Data public static class IrisSettingsConcurrency { public int threadCount = -1; + public int pregenThreadCount = -1; } @Data @@ -100,7 +111,6 @@ public class IrisSettings { public boolean systemEntitySpawnOverrides = true; public boolean systemEntityInitialSpawns = true; public int maxBiomeChildDepth = 5; - } @Data diff --git a/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java b/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java index b483e7dce..41bd8edc9 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java @@ -18,6 +18,7 @@ package com.volmit.iris.core.pregenerator; +import com.volmit.iris.Iris; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.math.M; @@ -96,6 +97,7 @@ public class IrisPregenerator { generated.get(), totalChunks.get(), totalChunks.get() - generated.get(), eta, M.ms() - startTime.get(), currentGeneratorMethod.get()); + return 1000; } }; diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperOrMedievalPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/AsyncOrMedievalPregenMethod.java similarity index 87% rename from src/main/java/com/volmit/iris/core/pregenerator/methods/PaperOrMedievalPregenMethod.java rename to src/main/java/com/volmit/iris/core/pregenerator/methods/AsyncOrMedievalPregenMethod.java index 8ac69148e..5ab362ea4 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperOrMedievalPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/AsyncOrMedievalPregenMethod.java @@ -23,12 +23,12 @@ import com.volmit.iris.core.pregenerator.PregeneratorMethod; import io.papermc.lib.PaperLib; import org.bukkit.World; -public class PaperOrMedievalPregenMethod implements PregeneratorMethod { +public class AsyncOrMedievalPregenMethod implements PregeneratorMethod { private final PregeneratorMethod method; - public PaperOrMedievalPregenMethod(World world, int threads) + public AsyncOrMedievalPregenMethod(World world, int threads) { - method = PaperLib.isPaper() ? new PaperAsyncPregenMethod(world, threads) : new MedievalPregenMethod(world); + method = PaperLib.isPaper() ? new AsyncPregenMethod(world, threads) : new MedievalPregenMethod(world); } @Override diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperAsyncPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/AsyncPregenMethod.java similarity index 92% rename from src/main/java/com/volmit/iris/core/pregenerator/methods/PaperAsyncPregenMethod.java rename to src/main/java/com/volmit/iris/core/pregenerator/methods/AsyncPregenMethod.java index 2748edb45..b8ecabfba 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/PaperAsyncPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/AsyncPregenMethod.java @@ -18,6 +18,7 @@ package com.volmit.iris.core.pregenerator.methods; +import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.pregenerator.PregenListener; import com.volmit.iris.core.pregenerator.PregeneratorMethod; import com.volmit.iris.engine.parallel.MultiBurst; @@ -30,12 +31,12 @@ import org.bukkit.World; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; -public class PaperAsyncPregenMethod implements PregeneratorMethod { +public class AsyncPregenMethod implements PregeneratorMethod { private final World world; private final MultiBurst burst; private final KList> future; - public PaperAsyncPregenMethod(World world, int threads) + public AsyncPregenMethod(World world, int threads) { if(!PaperLib.isPaper()) { @@ -119,7 +120,7 @@ public class PaperAsyncPregenMethod implements PregeneratorMethod { @Override public void generateChunk(int x, int z, PregenListener listener) { - if(future.size() > 16) + if(future.size() > IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getPregenThreadCount())) { waitForChunks(); } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java index 89e0201e9..7d19d8660 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java @@ -38,7 +38,7 @@ public class HybridPregenMethod implements PregeneratorMethod { this.world = world; headless = supportsHeadless(world) ? new HeadlessPregenMethod(HeadlessWorld.from(world)) : new DummyPregenMethod(); - inWorld = new PaperOrMedievalPregenMethod(world, threads); + inWorld = new AsyncOrMedievalPregenMethod(world, threads); } private boolean supportsHeadless(World world) { diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/MedievalPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/MedievalPregenMethod.java index 4dde03ea1..7f40cab66 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/MedievalPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/MedievalPregenMethod.java @@ -18,6 +18,7 @@ package com.volmit.iris.core.pregenerator.methods; +import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.pregenerator.PregenListener; import com.volmit.iris.core.pregenerator.PregeneratorMethod; import com.volmit.iris.util.collection.KList; @@ -98,7 +99,7 @@ public class MedievalPregenMethod implements PregeneratorMethod { @Override public void generateChunk(int x, int z, PregenListener listener) { - if(futures.size() > 32) + if(futures.size() > IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getPregenThreadCount())) { waitForChunks(); } diff --git a/src/main/java/com/volmit/iris/engine/IrisComplex.java b/src/main/java/com/volmit/iris/engine/IrisComplex.java index 67a3b42e7..aa82f6338 100644 --- a/src/main/java/com/volmit/iris/engine/IrisComplex.java +++ b/src/main/java/com/volmit/iris/engine/IrisComplex.java @@ -107,7 +107,7 @@ public class IrisComplex implements DataProvider { } public IrisComplex(Engine engine, boolean simple) { - int cacheSize = 1024 * 128; + int cacheSize = 131072; IrisBiome emptyBiome = new IrisBiome(); this.rng = new RNG(engine.getWorld().seed()); this.data = engine.getData(); diff --git a/src/main/java/com/volmit/iris/engine/IrisEngine.java b/src/main/java/com/volmit/iris/engine/IrisEngine.java index 9c2c26d55..c3e947c94 100644 --- a/src/main/java/com/volmit/iris/engine/IrisEngine.java +++ b/src/main/java/com/volmit/iris/engine/IrisEngine.java @@ -25,10 +25,7 @@ import com.volmit.iris.engine.object.IrisBiome; import com.volmit.iris.engine.object.IrisBiomePaletteLayer; import com.volmit.iris.engine.object.IrisDecorator; import com.volmit.iris.engine.object.IrisObjectPlacement; -import com.volmit.iris.engine.parallel.MultiBurst; 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.math.RNG; import com.volmit.iris.util.scheduling.J; import com.volmit.iris.util.scheduling.PrecisionStopwatch; @@ -42,8 +39,6 @@ import org.bukkit.generator.BlockPopulator; import org.jetbrains.annotations.NotNull; import java.util.Random; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.Future; public class IrisEngine extends BlockPopulator implements Engine { @Getter diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java b/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java index e983c2359..de2197794 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java @@ -302,7 +302,7 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce initialized.set(true); IrisDimension dim = getDimension(world); IrisDataManager data = production ? new IrisDataManager(getDataFolder(world)) : dim.getLoader().copy(); - compound.set(new IrisEngineCompound(world, dim, data, Iris.getThreadCount())); + compound.set(new IrisEngineCompound(world, dim, data, IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getThreadCount()))); compound.get().setStudio(!production); populators.clear(); populators.addAll(compound.get().getPopulators()); diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineParallaxManager.java b/src/main/java/com/volmit/iris/engine/framework/EngineParallaxManager.java index 70a7f0a73..1611bc460 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineParallaxManager.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineParallaxManager.java @@ -272,7 +272,7 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer { int i, j; KList after = new KList<>(); int bs = (int) Math.pow((s * 2) + 1, 2); - BurstExecutor burst = MultiBurst.burst.burst(bs); + BurstExecutor burst = getEngine().getTarget().getBurster().burst(bs); for (i = -s; i <= s; i++) { for (j = -s; j <= s; j++) { int xx = i + x; @@ -294,7 +294,7 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer { burst.complete(); if (getEngine().getDimension().isPlaceObjects()) { - burst = MultiBurst.burst.burst(bs); + burst = getEngine().getTarget().getBurster().burst(bs); for (i = -s; i <= s; i++) { int ii = i; @@ -310,7 +310,7 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer { } burst.complete(); - burst = MultiBurst.burst.burst(bs); + burst = getEngine().getTarget().getBurster().burst(bs); for (i = -s; i <= s; i++) { int ii = i; @@ -323,7 +323,7 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer { burst.complete(); } - MultiBurst.burst.burst(after); + getEngine().getTarget().getBurster().burst(after); getParallaxAccess().setChunkGenerated(x, z); p.end(); getEngine().getMetrics().getParallax().put(p.getMilliseconds()); @@ -677,7 +677,7 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer { } Iris.verbose("Checking sizes for " + Form.f(objects.size()) + " referenced objects."); - BurstExecutor e = MultiBurst.burst.burst(objects.size()); + BurstExecutor e = getEngine().getTarget().getBurster().burst(objects.size()); KMap sizeCache = new KMap<>(); for (String i : objects) { e.queue(() -> { diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineTarget.java b/src/main/java/com/volmit/iris/engine/framework/EngineTarget.java index 6c7f2856c..8ab725b11 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineTarget.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineTarget.java @@ -42,9 +42,9 @@ public class EngineTarget { this.height = height; this.dimension = dimension; this.data = data; - this.parallaxWorld = new ParallaxWorld(256, new File(world.worldFolder(), "iris/" + dimension.getLoadKey() + "/parallax")); this.inverted = inverted; - this.burster = new MultiBurst(threads); + this.burster = new MultiBurst("Iris Engine " + dimension.getName(), threads, 6); + this.parallaxWorld = new ParallaxWorld(burster, 256, new File(world.worldFolder(), "iris/" + dimension.getLoadKey() + "/parallax")); } public EngineTarget(IrisWorld world, IrisDimension dimension, IrisDataManager data, int height, int threads) { diff --git a/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java b/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java index 1d9327248..8a2396ca1 100644 --- a/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java +++ b/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java @@ -18,6 +18,7 @@ package com.volmit.iris.engine.headless; +import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.pregenerator.PregenListener; import com.volmit.iris.engine.data.mca.LoadFlags; import com.volmit.iris.engine.data.mca.MCAFile; @@ -43,7 +44,7 @@ public class HeadlessGenerator { public HeadlessGenerator(HeadlessWorld world) { this.world = world; - burst = new MultiBurst("Iris Headless Generator", 9, Runtime.getRuntime().availableProcessors()); + burst = new MultiBurst("Iris Headless Generator", 9, IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getPregenThreadCount())); writer = new NBTWorld(world.getWorld().worldFolder()); generator = new EngineCompositeGenerator(world.getDimension().getLoadKey(), !world.isStudio()); generator.assignHeadlessGenerator(this); diff --git a/src/main/java/com/volmit/iris/engine/hunk/io/HunkRegionSlice.java b/src/main/java/com/volmit/iris/engine/hunk/io/HunkRegionSlice.java index 283123819..0e857b632 100644 --- a/src/main/java/com/volmit/iris/engine/hunk/io/HunkRegionSlice.java +++ b/src/main/java/com/volmit/iris/engine/hunk/io/HunkRegionSlice.java @@ -98,8 +98,8 @@ public class HunkRegionSlice { } } - public synchronized void save() { - BurstExecutor e = MultiBurst.burst.burst(); + public synchronized void save(MultiBurst burst) { + BurstExecutor e = burst.burst(); try { diff --git a/src/main/java/com/volmit/iris/engine/lighting/LightingTaskBatch.java b/src/main/java/com/volmit/iris/engine/lighting/LightingTaskBatch.java index c95450ad9..042104afb 100644 --- a/src/main/java/com/volmit/iris/engine/lighting/LightingTaskBatch.java +++ b/src/main/java/com/volmit/iris/engine/lighting/LightingTaskBatch.java @@ -25,6 +25,7 @@ import com.bergerkiller.bukkit.common.utils.MathUtil; import com.bergerkiller.bukkit.common.utils.WorldUtil; import com.bergerkiller.bukkit.common.wrappers.LongHashSet; import com.volmit.iris.Iris; +import com.volmit.iris.core.IrisSettings; import org.bukkit.Chunk; import org.bukkit.World; @@ -261,7 +262,7 @@ public class LightingTaskBatch implements LightingTask { LightingChunk nextChunk = null; CompletableFuture nextChunkFuture = null; synchronized (chunks_lock) { - for (; i < chunks.length && numBeingLoaded < Iris.getThreadCount(); i++) { + for (; i < chunks.length && numBeingLoaded < IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getThreadCount()); i++) { LightingChunk lc = chunks[i]; if (lc.loadingStarted) { continue; // Already (being) loaded diff --git a/src/main/java/com/volmit/iris/engine/parallax/ParallaxRegion.java b/src/main/java/com/volmit/iris/engine/parallax/ParallaxRegion.java index 0a1f786b1..81b7fdf71 100644 --- a/src/main/java/com/volmit/iris/engine/parallax/ParallaxRegion.java +++ b/src/main/java/com/volmit/iris/engine/parallax/ParallaxRegion.java @@ -25,6 +25,7 @@ import com.volmit.iris.engine.hunk.io.HunkRegion; import com.volmit.iris.engine.hunk.io.HunkRegionSlice; import com.volmit.iris.engine.object.tile.TileData; import com.volmit.iris.engine.parallel.GridLock; +import com.volmit.iris.engine.parallel.MultiBurst; import com.volmit.iris.util.format.C; import com.volmit.iris.util.format.Form; import com.volmit.iris.util.math.M; @@ -50,16 +51,19 @@ public class ParallaxRegion extends HunkRegion { private final GridLock lock; private long lastUse; private final int height; + private final MultiBurst burst; - public ParallaxRegion(int height, File folder, int x, int z, CompoundTag compound) { + public ParallaxRegion(MultiBurst burst, int height, File folder, int x, int z, CompoundTag compound) { super(folder, x, z, compound); + this.burst = burst; this.height = height; setupSlices(); lock = new GridLock(32, 32); } - public ParallaxRegion(int height, File folder, int x, int z) { + public ParallaxRegion(MultiBurst burst, int height, File folder, int x, int z) { super(folder, x, z); + this.burst = burst; this.height = height; setupSlices(); lock = new GridLock(32, 32); @@ -155,12 +159,13 @@ public class ParallaxRegion extends HunkRegion { } } + @Override public synchronized void save() throws IOException { - blockSlice.save(); - objectSlice.save(); - entitySlice.save(); - tileSlice.save(); - updateSlice.save(); + blockSlice.save(burst); + objectSlice.save(burst); + entitySlice.save(burst); + tileSlice.save(burst); + updateSlice.save(burst); saveMetaHunk(); Iris.debug("Saved Parallax Region "+ C.GOLD + getX() + " " + getZ()); super.save(); diff --git a/src/main/java/com/volmit/iris/engine/parallax/ParallaxWorld.java b/src/main/java/com/volmit/iris/engine/parallax/ParallaxWorld.java index 60f2b350b..68c797f3b 100644 --- a/src/main/java/com/volmit/iris/engine/parallax/ParallaxWorld.java +++ b/src/main/java/com/volmit/iris/engine/parallax/ParallaxWorld.java @@ -40,10 +40,12 @@ public class ParallaxWorld implements ParallaxAccess { private final KMap loadedRegions; private final KList save; private final File folder; + private final MultiBurst burst; private final int height; - public ParallaxWorld(int height, File folder) { + public ParallaxWorld(MultiBurst burst, int height, File folder) { this.height = height; + this.burst = burst; this.folder = folder; save = new KList<>(); loadedRegions = new KMap<>(); @@ -125,7 +127,7 @@ public class ParallaxWorld implements ParallaxAccess { return loadedRegions.get(key(x, z)); } - ParallaxRegion v = new ParallaxRegion(height, folder, x, z); + ParallaxRegion v = new ParallaxRegion(burst, height, folder, x, z); loadedRegions.put(key(x, z), v); return v; From 18195b778a0d0173bbbbdd3e5687b010e5304921 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 11:33:02 -0400 Subject: [PATCH 111/137] Cleanup old compat --- src/main/java/com/volmit/iris/Iris.java | 40 -- .../com/volmit/iris/core/IrisSettings.java | 8 +- .../core/command/world/CommandIrisCreate.java | 13 +- .../core/command/world/CommandIrisPregen.java | 10 +- .../core/gui/components/Pregenerator.java | 638 ------------------ .../methods/AsyncPregenMethod.java | 2 +- .../volmit/iris/core/tools/IrisToolbelt.java | 20 +- .../iris/engine/IrisEngineCompound.java | 3 +- .../volmit/iris/engine/framework/Engine.java | 7 +- .../framework/EngineCompositeGenerator.java | 2 +- .../iris/engine/framework/EngineTarget.java | 3 +- .../engine/lighting/LightingTaskBatch.java | 2 +- .../volmit/iris/engine/object/IrisEntity.java | 2 +- .../volmit/iris/engine/object/IrisLoot.java | 15 +- .../iris/engine/parallax/ParallaxWorld.java | 2 +- .../iris/engine/parallel/MultiBurst.java | 4 +- 16 files changed, 61 insertions(+), 710 deletions(-) delete mode 100644 src/main/java/com/volmit/iris/core/gui/components/Pregenerator.java diff --git a/src/main/java/com/volmit/iris/Iris.java b/src/main/java/com/volmit/iris/Iris.java index fa652ee8f..f96a2796a 100644 --- a/src/main/java/com/volmit/iris/Iris.java +++ b/src/main/java/com/volmit/iris/Iris.java @@ -78,9 +78,6 @@ public class Iris extends VolmitPlugin implements Listener { public static MultiverseCoreLink linkMultiverseCore; public static MythicMobsLink linkMythicMobs; private static final Queue syncJobs = new ShurikenQueue<>(); - public static boolean customModels = doesSupportCustomModels(); - public static boolean awareEntities = doesSupportAwareness(); - public static boolean lowMemoryMode = false; public static IrisCompat compat; public static FileWatcher configWatcher; @@ -94,7 +91,6 @@ public class Iris extends VolmitPlugin implements Listener { instance = this; INMS.get(); IO.delete(new File("iris")); - lowMemoryMode = Runtime.getRuntime().maxMemory() < 4000000000L; // 4 * 1000 * 1000 * 1000 // 4; installDataPacks(); } @@ -155,30 +151,6 @@ public class Iris extends VolmitPlugin implements Listener { Iris.info("Data Packs Setup!"); } - private static boolean doesSupportCustomModels() { - try { - int v = Integer.parseInt(Bukkit.getBukkitVersion().split("\\Q-\\E")[0].split("\\Q.\\E")[1]); - - return v >= 14; - } catch (Throwable e) { - Iris.reportError(e); - } - - return false; - } - - private static boolean doesSupportAwareness() { - try { - int v = Integer.parseInt(Bukkit.getBukkitVersion().split("\\Q-\\E")[0].split("\\Q.\\E")[1]); - - return v >= 15; - } catch (Throwable e) { - Iris.reportError(e); - } - - return false; - } - @Override public void start() { @@ -545,18 +517,6 @@ public class Iris extends VolmitPlugin implements Listener { } Iris.info("\n\n " + new KList<>(splash).toString("\n") + "\n"); - - if (lowMemoryMode) { - Iris.verbose("* Low Memory mode Activated! For better performance, allocate 4gb or more to this server."); - } - - if (!customModels) { - Iris.verbose("* This version of minecraft does not support custom model data in loot items (1.14 and up). Iris will generate as normal, but loot will not have custom models."); - } - - if (!doesSupportAwareness()) { - Iris.verbose("* This version of minecraft does not support entity awareness."); - } } @SuppressWarnings("deprecation") diff --git a/src/main/java/com/volmit/iris/core/IrisSettings.java b/src/main/java/com/volmit/iris/core/IrisSettings.java index 41cf00626..bbff7b48f 100644 --- a/src/main/java/com/volmit/iris/core/IrisSettings.java +++ b/src/main/java/com/volmit/iris/core/IrisSettings.java @@ -63,7 +63,7 @@ public class IrisSettings { return 2; } - return c < 0 ? Runtime.getRuntime().availableProcessors() / -c : c; + return Math.max(2, c < 0 ? Runtime.getRuntime().availableProcessors() / -c : c); } @Data @@ -73,8 +73,12 @@ public class IrisSettings { @Data public static class IrisSettingsConcurrency { - public int threadCount = -1; + public int engineThreadCount = -1; + public int engineThreadPriority = 6; public int pregenThreadCount = -1; + public int pregenThreadPriority = 8; + public int miscThreadCount = -4; + public int miscThreadPriority = 3; } @Data diff --git a/src/main/java/com/volmit/iris/core/command/world/CommandIrisCreate.java b/src/main/java/com/volmit/iris/core/command/world/CommandIrisCreate.java index d4b5bc5e0..a09d5abc4 100644 --- a/src/main/java/com/volmit/iris/core/command/world/CommandIrisCreate.java +++ b/src/main/java/com/volmit/iris/core/command/world/CommandIrisCreate.java @@ -21,7 +21,6 @@ package com.volmit.iris.core.command.world; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisDataManager; import com.volmit.iris.core.IrisSettings; -import com.volmit.iris.core.gui.components.Pregenerator; import com.volmit.iris.core.link.MultiverseCoreLink; import com.volmit.iris.core.nms.INMS; import com.volmit.iris.core.tools.IrisWorldCreator; @@ -161,8 +160,7 @@ public class CommandIrisCreate extends MortarCommand { sender.sendMessage("Pregenerating " + worldName + " " + size + " x " + size); sender.sendMessage("Expect server lag during this time. Use '/iris pregen stop' to cancel"); - new Pregenerator(world.get(), size, () -> - b.set(true)); + } World ww = world.get(); @@ -248,15 +246,6 @@ public class CommandIrisCreate extends MortarCommand { World w = INMS.get().createWorld(wc); world.set(w); - - try { - if (pregen.get() > 0) { - new Pregenerator(w, pregen.get()); - } - } catch (Throwable e) { - Iris.reportError(e); - } - done.set(true); }); } diff --git a/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java b/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java index 1439f9d3e..42a956c1a 100644 --- a/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java +++ b/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java @@ -22,6 +22,7 @@ import com.volmit.iris.Iris; import com.volmit.iris.core.gui.PregeneratorJob; import com.volmit.iris.core.pregenerator.PregenTask; import com.volmit.iris.core.pregenerator.methods.HybridPregenMethod; +import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.plugin.MortarCommand; @@ -108,12 +109,11 @@ public class CommandIrisPregen extends MortarCommand { } } try { - new PregeneratorJob(PregenTask + IrisToolbelt.pregenerate(PregenTask .builder() - .center(new Position2(0, 0)) - .radius(((getVal(args[0])>>4)>>5) + 1) - .build(), - new HybridPregenMethod(world, Runtime.getRuntime().availableProcessors())); + .center(new Position2(0, 0)) + .radius(((getVal(args[0])>>4)>>5) + 1) + .build(), world); } catch (NumberFormatException e) { Iris.reportError(e); sender.sendMessage("Invalid argument in command"); diff --git a/src/main/java/com/volmit/iris/core/gui/components/Pregenerator.java b/src/main/java/com/volmit/iris/core/gui/components/Pregenerator.java deleted file mode 100644 index 2529a03c1..000000000 --- a/src/main/java/com/volmit/iris/core/gui/components/Pregenerator.java +++ /dev/null @@ -1,638 +0,0 @@ -/* - * 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.core.gui.components; - -import com.volmit.iris.Iris; -import com.volmit.iris.core.IrisSettings; -import com.volmit.iris.core.tools.IrisWorlds; -import com.volmit.iris.engine.data.mca.MCAFile; -import com.volmit.iris.engine.data.mca.NBTWorld; -import com.volmit.iris.engine.framework.IrisAccess; -import com.volmit.iris.engine.parallel.BurstExecutor; -import com.volmit.iris.engine.parallel.MultiBurst; -import com.volmit.iris.util.collection.KList; -import com.volmit.iris.util.format.Form; -import com.volmit.iris.util.function.Consumer2; -import com.volmit.iris.util.function.Consumer3; -import com.volmit.iris.util.math.Position2; -import com.volmit.iris.util.math.M; -import com.volmit.iris.util.math.RollingSequence; -import com.volmit.iris.util.math.Spiraler; -import com.volmit.iris.util.scheduling.ChronoLatch; -import com.volmit.iris.util.scheduling.J; -import com.volmit.iris.util.scheduling.PrecisionStopwatch; -import com.volmit.iris.util.scheduling.SR; -import io.papermc.lib.PaperLib; -import lombok.Data; -import org.bukkit.Bukkit; -import org.bukkit.Chunk; -import org.bukkit.World; -import org.bukkit.event.Listener; - -import javax.imageio.ImageIO; -import javax.swing.*; -import java.awt.*; -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; -import java.util.Comparator; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.AtomicLong; -import java.util.concurrent.atomic.AtomicReference; -import java.util.concurrent.locks.ReentrantLock; - -@Deprecated -@Data -public class Pregenerator implements Listener { - private static Pregenerator instance; - private static final Color COLOR_ERROR = Color.decode("#E34113"); - private static final Color COLOR_MCA_PREPARE = Color.decode("#3CAAB5"); - private static final Color COLOR_MCA_RELOAD = Color.decode("#41FF61"); - private static final Color COLOR_MCA_GENERATE = Color.decode("#33FF8F"); - private static final Color COLOR_MCA_GENERATE_SLOW = Color.decode("#13BAE3"); - private static final Color COLOR_MCA_GENERATE_SLOW_ASYNC = Color.decode("#13BAE3"); - private static final Color COLOR_MCA_GENERATED = Color.decode("#33FF8F"); - private static final Color COLOR_MCA_GENERATED_MCA = Color.decode("#13E3C9"); - private static final Color COLOR_MCA_SEALED = Color.decode("#33FF8F"); - private static final Color COLOR_MCA_DEFERRED = Color.decode("#3CB57A"); - private final World world; - private int lowestBedrock; - private final NBTWorld directWriter; - private final AtomicBoolean active; - private final AtomicBoolean running; - private final KList errors; - private final KList onComplete; - private final Position2 max; - private final Position2 min; - private final MCAPregenGui gui; - private final KList mcaDefer; - private final AtomicInteger generated; - private final AtomicInteger generatedLast; - private final RollingSequence perSecond; - private final RollingSequence perMinute; - private final AtomicInteger totalChunks; - private final AtomicLong memory; - private final AtomicReference memoryMetric; - private final AtomicReference method; - private final AtomicInteger vmcax; - private final AtomicInteger vmcaz; - private final AtomicInteger vcax; - private final AtomicInteger vcaz; - private final long elapsed; - private final ChronoLatch latch; - private IrisAccess access; - private final KList regionReload; - private KList wait = new KList<>(); - - public Pregenerator(World world, int blockSize, Runnable onComplete) { - this(world, blockSize); - this.onComplete.add(onComplete); - } - - public Pregenerator(World world, int blockSize) throws HeadlessException { - this(world, blockSize, true); - } - - public Pregenerator(World world, int blockSize, boolean dogui) throws HeadlessException { - instance(); - regionReload = new KList<>(); - latch = new ChronoLatch(5000); - memoryMetric = new AtomicReference<>("..."); - method = new AtomicReference<>("STARTUP"); - memory = new AtomicLong(0); - this.world = world; - errors = new KList<>(); - vmcax = new AtomicInteger(); - vmcaz = new AtomicInteger(); - vcax = new AtomicInteger(); - vcaz = new AtomicInteger(); - perMinute = new RollingSequence(200); - perSecond = new RollingSequence(20); - generatedLast = new AtomicInteger(0); - totalChunks = new AtomicInteger(0); - generated = new AtomicInteger(0); - mcaDefer = new KList<>(); - access = IrisWorlds.access(world); - this.directWriter = new NBTWorld(world.getWorldFolder()); - this.running = new AtomicBoolean(true); - this.active = new AtomicBoolean(true); - MultiBurst burst = new MultiBurst("Iris Pregenerator", 9, Runtime.getRuntime().availableProcessors()); - int mcaSize = (((blockSize >> 4) + 2) >> 5) + 1; - onComplete = new KList<>(); - max = new Position2(0, 0); - min = new Position2(0, 0); - KList draw = new KList<>(); - new Spiraler(mcaSize, mcaSize, (xx, zz) -> { - min.setX(Math.min(xx << 5, min.getX())); - min.setZ(Math.min(zz << 5, min.getZ())); - max.setX(Math.max((xx << 5) + 31, max.getX())); - max.setZ(Math.max((zz << 5) + 31, max.getZ())); - totalChunks.getAndAdd(1024); - draw.add(() -> drawMCA(xx, zz, COLOR_MCA_PREPARE)); - }).drain(); - if (access != null) { - lowestBedrock = access.getCompound().getLowestBedrock(); - } - gui = dogui ? (IrisSettings.get().getGui().isLocalPregenGui() && IrisSettings.get().getGui().isUseServerLaunchedGuis() ? MCAPregenGui.createAndShowGUI(this) : null) : null; - flushWorld(); - KList order = computeChunkOrder(); - Consumer3> mcaIteration = - (ox, oz, r) -> order.forEach((i) - -> r.accept(i.getX() + ox, i.getZ() + oz)); - draw.forEach(Runnable::run); - Spiraler spiraler = new Spiraler(mcaSize, mcaSize, (xx, zz) -> { - vmcax.set(xx); - vmcaz.set(zz); - flushWorld(); - drawMCA(xx, zz, COLOR_MCA_PREPARE); - if (access != null && generateMCARegion(xx, zz, burst, access, mcaIteration)) { - flushWorld(); - } - }); - - elapsed = M.ms(); - - new Thread(() -> { - flushWorld(); - J.sleep(2000); - flushWorld(); - - while (running.get() && spiraler.hasNext()) { - if (active.get()) { - spiraler.next(); - } - } - - mcaDefer.removeDuplicates(); - - while (running.get() && mcaDefer.isNotEmpty()) { - Position2 p = mcaDefer.popLast(); - vmcax.set(p.getX()); - vmcaz.set(p.getZ()); - generateDeferedMCARegion(p.getX(), p.getZ(), burst, mcaIteration); - flushWorld(); - } - - while (wait.isNotEmpty()) { - J.sleep(50); - } - - burst.shutdownNow(); - directWriter.close(); - flushWorld(); - onComplete.forEach(Runnable::run); - running.set(false); - active.set(false); - if (gui != null) { - gui.close(); - } - }).start(); - new Thread(() -> { - PrecisionStopwatch p = PrecisionStopwatch.start(); - - while (running.get() && active.get()) { - int m = generated.get(); - int w = generatedLast.get(); - int up = m - w; - double dur = p.getMilliseconds(); - perSecond.put((int) (up / (dur / 1000D))); - perMinute.put((int) (up / (dur / 60000D))); - p.reset(); - p.begin(); - updateProgress(); - generatedLast.set(m); - J.sleep(100); - long lmem = memory.get(); - memory.set(Runtime.getRuntime().freeMemory()); - - if (memory.get() > lmem) { - long free = memory.get(); - long max = Runtime.getRuntime().maxMemory(); - long total = Runtime.getRuntime().totalMemory(); - long use = total - free; - memoryMetric.set(Form.memSize(use, 2) + " (" + Form.pc((double) use / (double) max, 0) + ")"); - } - } - }).start(); - } - - private boolean generateMCARegion(int x, int z, MultiBurst burst, IrisAccess access, Consumer3> mcaIteration) { - if (!Iris.instance.isMCA()) { - generateDeferedMCARegion(x, z, burst, mcaIteration); - return false; - } - - File mca = directWriter.getRegionFile(x, z); - BurstExecutor e = burst.burst(1024); - int mcaox = x << 5; - int mcaoz = z << 5; - if (isMCAWritable(x, z) && !mca.exists()) { - method.set("Direct (Fast)"); - mcaIteration.accept(mcaox, mcaoz, (ii, jj) -> e.queue(() -> { - draw(ii, jj, COLOR_MCA_GENERATE); - access.directWriteChunk(access.getCompound().getWorld(), ii, jj, directWriter); - draw(ii, jj, COLOR_MCA_GENERATED_MCA); - generated.getAndIncrement(); - vcax.set(ii); - vcaz.set(jj); - })); - e.complete(); - //verifyMCA(x, z, burst); - directWriter.save(); - } else { - totalChunks.getAndAdd(1024); - mcaDefer.add(new Position2(x, z)); - e.complete(); - return false; - } - - return true; - } - - private void verifyMCA(int x, int z, MultiBurst burst) { - MCAFile rg = directWriter.getMCA(x, z); - KList requeue = new KList<>(); - - for (int i = 0; i < 32; i++) - { - for(int j = 0; j < 32; j++) - { - com.volmit.iris.engine.data.mca.Chunk c = rg.getChunk(i, j); - - if(c == null) - { - draw(((x << 5) + i), ((z << 5) + j), COLOR_ERROR); - int finalI = i; - int finalJ = j; - requeue.add(() -> { - draw(((x << 5) + finalI), ((z << 5) + finalJ), COLOR_MCA_GENERATE); - access.directWriteChunk(access.getCompound().getWorld(), ((x << 5) + finalI), ((z << 5) + finalJ), directWriter); - draw(((x << 5) + finalI), ((z << 5) + finalJ), COLOR_MCA_GENERATED_MCA); - }); - } - } - } - - if(requeue.isNotEmpty()) - { - burst.burst(requeue); - verifyMCA(x, z, burst); - } - } - - public void updateProgress() { - if (!latch.flip()) { - return; - } - - String[] v = getProgress(); - Iris.info("Pregeneration " + v[0] + " | " + v[1] + " | " + v[2] + " | " + v[3]); - } - - private void generateDeferedMCARegion(int x, int z, MultiBurst burst, Consumer3> mcaIteration) { - int mcaox = x << 5; - int mcaoz = z << 5; - if (PaperLib.isPaper()) { - method.set("PaperAsync (Slow)"); - - while (wait.size() > 16) { - J.sleep(5); - } - - mcaIteration.accept(mcaox, mcaoz, (ii, jj) -> { - Position2 cx = new Position2(ii, jj); - PaperLib.getChunkAtAsync(world, ii, jj).thenAccept((c) -> { - draw(ii, jj, COLOR_MCA_GENERATE_SLOW_ASYNC); - draw(ii, jj, COLOR_MCA_GENERATED); - generated.getAndIncrement(); - vcax.set(ii); - vcaz.set(jj); - - synchronized (wait) { - wait.remove(cx); - } - }); - - wait.add(cx); - }); - } else { - AtomicInteger m = new AtomicInteger(); - method.set("Spigot (Very Slow)"); - KList q = new KList<>(); - mcaIteration.accept(mcaox, mcaoz, (ii, jj) -> q.add(() -> { - draw(ii, jj, COLOR_MCA_GENERATE_SLOW); - world.getChunkAt(ii, jj).load(true); - Chunk c = world.getChunkAt(ii, jj); - draw(ii, jj, COLOR_MCA_GENERATED); - m.getAndIncrement(); - generated.getAndIncrement(); - vcax.set(ii); - vcaz.set(jj); - })); - ChronoLatch tick = new ChronoLatch(1000); - new SR(0) { - @Override - public void run() { - if (tick.flip()) { - return; - } - - if (q.isEmpty()) { - cancel(); - return; - } - - try { - q.pop().run(); - } catch (Throwable e) { - Iris.reportError(e); - - } - } - }; - - while (m.get() < 1024) { - J.sleep(25); - } - } - } - - private KList computeChunkOrder() { - Position2 center = new Position2(15, 15); - KList p = new KList<>(); - new Spiraler(33, 33, (x, z) -> { - int xx = x + 15; - int zz = z + 15; - if (xx < 0 || xx > 31 || zz < 0 || zz > 31) { - return; - } - - p.add(new Position2(xx, zz)); - }).drain(); - p.sort(Comparator.comparing((i) -> i.distance(center))); - return p; - } - - public static Pregenerator getInstance() { - return instance; - } - - public static boolean shutdownInstance() { - if (instance != null) { - instance.shutdown(); - instance = null; - return true; - } - - return false; - } - - public static void pauseResume() { - instance.active.set(!instance.active.get()); - } - - public static boolean isPaused() { - return instance.paused(); - } - - private void instance() { - if (instance != null) { - instance.shutdown(); - } - - instance = this; - } - - public void shutdown() { - running.set(false); - active.set(false); - } - - private void draw(int cx, int cz, Color color) { - if (gui != null) { - gui.func.accept(new Position2(cx, cz), color); - } - } - - private void drawMCA(int cx, int cz, Color color) { - for (int i = 0; i < 32; i++) { - for (int j = 0; j < 32; j++) { - draw((cx << 5) + i, (cz << 5) + j, color); - } - } - } - - private void flushWorld() { - if (Bukkit.isPrimaryThread()) { - flushWorldSync(); - return; - } - - AtomicBoolean b = new AtomicBoolean(false); - J.s(() -> { - flushWorldSync(); - b.set(true); - }); - - while (!b.get()) { - J.sleep(1); - } - } - - private void flushWorldSync() { - for (Chunk i : world.getLoadedChunks()) { - i.unload(true); - } - - world.save(); - } - - private boolean isMCAWritable(int x, int z) { - File mca = new File(world.getWorldFolder(), "region/r." + x + "." + z + ".mca"); - - if (mca.exists()) { - return false; - } - - for (Chunk i : world.getLoadedChunks()) { - if (i.getX() >> 5 == x && i.getZ() >> 5 == z) { - return false; - } - } - - return true; - } - - public String[] getProgress() { - long eta = (long) ((totalChunks.get() - generated.get()) * ((double) (M.ms() - elapsed) / (double) generated.get())); - - return new String[]{ - "Progress: " + Form.f(generated.get()) + " of " + Form.f(totalChunks.get()) + " (" + Form.pc((double) generated.get() / (double) totalChunks.get(), 0) + ")", - "ETA: " + Form.duration(eta, 0), - "Chunks/s: " + Form.f((int) perSecond.getAverage()) + " (" + Form.f((int)perSecond.getMax()) + " Peak)", - "Chunks/min: " + Form.f((int) perMinute.getAverage())+ " (" + Form.f((int)perMinute.getMax()) + " Peak)", - "Memory: " + memoryMetric.get(), - "Cursor: " + "MCA(" + vmcax.get() + ", " + vmcaz.get() + ") @ (" + vcax.get() + ", " + vcaz.get() + ")", - "Gen Mode: " + method.get(), - }; - } - - public boolean paused() { - return !active.get(); - } - - public static class MCAPregenGui extends JPanel implements KeyListener { - private Pregenerator job; - private static final long serialVersionUID = 2094606939770332040L; - private final KList order = new KList<>(); - private final int res = 512; - Graphics2D bg; - private ReentrantLock l; - private final BufferedImage image = new BufferedImage(res, res, BufferedImage.TYPE_INT_RGB); - private Consumer2 func; - private JFrame frame; - - public MCAPregenGui() { - - } - - public void paint(int x, int z, Color c) { - func.accept(new Position2(x, z), c); - } - - @Override - public void paint(Graphics gx) { - Graphics2D g = (Graphics2D) gx; - bg = (Graphics2D) image.getGraphics(); - - l.lock(); - while (order.isNotEmpty()) { - try { - order.pop().run(); - } catch (Throwable e) { - Iris.reportError(e); - - } - } - l.unlock(); - - g.drawImage(image, 0, 0, getParent().getWidth(), getParent().getHeight(), (img, infoflags, x, y, width, height) -> true); - - g.setColor(Color.WHITE); - g.setFont(new Font("Hevetica", Font.BOLD, 28)); - String[] prog = job.getProgress(); - int h = g.getFontMetrics().getHeight() + 5; - int hh = 20; - - if (job.paused()) { - g.drawString("PAUSED", 20, hh += h); - - g.drawString("Press P to Resume", 20, hh += h); - } else { - for (String i : prog) { - g.drawString(i, 20, hh += h); - } - - g.drawString("Press P to Pause", 20, hh += h); - } - - J.sleep(IrisSettings.get().getGui().isMaximumPregenGuiFPS() ? 4 : 250); - repaint(); - } - - private void draw(Position2 p, Color c, Graphics2D bg) { - double pw = M.lerpInverse(job.getMin().getX(), job.getMax().getX(), p.getX()); - double ph = M.lerpInverse(job.getMin().getZ(), job.getMax().getZ(), p.getZ()); - double pwa = M.lerpInverse(job.getMin().getX(), job.getMax().getX(), p.getX() + 1); - double pha = M.lerpInverse(job.getMin().getZ(), job.getMax().getZ(), p.getZ() + 1); - int x = (int) M.lerp(0, res, pw); - int z = (int) M.lerp(0, res, ph); - int xa = (int) M.lerp(0, res, pwa); - int za = (int) M.lerp(0, res, pha); - bg.setColor(c); - bg.fillRect(x, z, xa - x, za - z); - } - - @SuppressWarnings("deprecation") - private static MCAPregenGui createAndShowGUI(Pregenerator j) throws HeadlessException { - JFrame frame; - frame = new JFrame("Pregen View"); - MCAPregenGui nv = new MCAPregenGui(); - frame.addKeyListener(nv); - nv.l = new ReentrantLock(); - nv.frame = frame; - nv.job = j; - nv.func = (c, b) -> - { - if (b.equals(Color.pink) && c.equals(new Position2(Integer.MAX_VALUE, Integer.MAX_VALUE))) { - frame.hide(); - } - nv.l.lock(); - nv.order.add(() -> nv.draw(c, b, nv.bg)); - nv.l.unlock(); - }; - frame.add(nv); - frame.setSize(1000, 1000); - frame.setVisible(true); - File file = Iris.getCached("Iris Icon", "https://raw.githubusercontent.com/VolmitSoftware/Iris/master/icon.png"); - - if (file != null) { - try { - frame.setIconImage(ImageIO.read(file)); - } catch (IOException ignored) { - Iris.reportError(ignored); - - } - } - - return nv; - } - - public static void launch(Pregenerator g) { - J.a(() -> - { - createAndShowGUI(g); - }); - } - - @Override - public void keyTyped(KeyEvent e) { - - } - - @Override - public void keyPressed(KeyEvent e) { - - } - - @Override - public void keyReleased(KeyEvent e) { - if (e.getKeyCode() == KeyEvent.VK_P) { - Pregenerator.pauseResume(); - } - } - - public void close() { - frame.setVisible(false); - } - } -} \ No newline at end of file diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/AsyncPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/AsyncPregenMethod.java index b8ecabfba..99f842cad 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/AsyncPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/AsyncPregenMethod.java @@ -44,7 +44,7 @@ public class AsyncPregenMethod implements PregeneratorMethod { } this.world = world; - burst = new MultiBurst("Iris PaperAsync Pregenerator", 6, threads); + burst = new MultiBurst("Iris Async Pregenerator", IrisSettings.get().getConcurrency().getPregenThreadPriority(), threads); future = new KList<>(1024); } diff --git a/src/main/java/com/volmit/iris/core/tools/IrisToolbelt.java b/src/main/java/com/volmit/iris/core/tools/IrisToolbelt.java index b51e1acd7..49294d128 100644 --- a/src/main/java/com/volmit/iris/core/tools/IrisToolbelt.java +++ b/src/main/java/com/volmit/iris/core/tools/IrisToolbelt.java @@ -20,6 +20,7 @@ package com.volmit.iris.core.tools; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisDataManager; +import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.gui.PregeneratorJob; import com.volmit.iris.core.pregenerator.PregenTask; import com.volmit.iris.core.pregenerator.PregeneratorMethod; @@ -121,7 +122,24 @@ public class IrisToolbelt { return pregenerate(task, new HeadlessPregenMethod(access.getHeadlessGenerator().getWorld(), access.getHeadlessGenerator())); } - return pregenerate(task, new HybridPregenMethod(access.getCompound().getWorld().realWorld(), Runtime.getRuntime().availableProcessors())); + return pregenerate(task, new HybridPregenMethod(access.getCompound().getWorld().realWorld(), IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getPregenThreadCount()))); + } + + /** + * Start a pregenerator task. If the supplied generator is headless, headless mode is used, + * otherwise Hybrid mode is used. + * @param task the scheduled task + * @param world the World + * @return the pregenerator job (already started) + */ + public static PregeneratorJob pregenerate(PregenTask task, World world) + { + if(isIrisWorld(world)) + { + return pregenerate(task, access(world)); + } + + return pregenerate(task, new HybridPregenMethod(world, IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getPregenThreadCount()))); } /** diff --git a/src/main/java/com/volmit/iris/engine/IrisEngineCompound.java b/src/main/java/com/volmit/iris/engine/IrisEngineCompound.java index 36dac5f21..52900ab4f 100644 --- a/src/main/java/com/volmit/iris/engine/IrisEngineCompound.java +++ b/src/main/java/com/volmit/iris/engine/IrisEngineCompound.java @@ -20,6 +20,7 @@ package com.volmit.iris.engine; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisDataManager; +import com.volmit.iris.core.IrisSettings; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.framework.EngineCompound; import com.volmit.iris.engine.framework.EngineData; @@ -98,7 +99,7 @@ public class IrisEngineCompound implements EngineCompound { } else { double totalWeight = 0D; engines = new Engine[rootDimension.getDimensionalComposite().size()]; - burster = engines.length > 1 ? new MultiBurst(engines.length) : null; + burster = engines.length > 1 ? new MultiBurst("Iris Compound " + rootDimension.getName(), IrisSettings.get().getConcurrency().getEngineThreadPriority(), engines.length) : null; int threadDist = (Math.max(2, maximumThreads - engines.length)) / engines.length; if ((threadDist * engines.length) + engines.length > maximumThreads) { 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 8a24a67bc..3b8965fd6 100644 --- a/src/main/java/com/volmit/iris/engine/framework/Engine.java +++ b/src/main/java/com/volmit/iris/engine/framework/Engine.java @@ -357,8 +357,13 @@ public interface Engine extends DataProvider, Fallible, GeneratorAccess, LootPro return getCompound().isStudio(); } + default MultiBurst burst() + { + return getTarget().getBurster(); + } + default void clean() { - MultiBurst.burst.lazy(() -> getParallax().cleanup()); + burst().lazy(() -> getParallax().cleanup()); } default IrisBiome getBiome(Location l) { diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java b/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java index de2197794..e809f500d 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java @@ -302,7 +302,7 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce initialized.set(true); IrisDimension dim = getDimension(world); IrisDataManager data = production ? new IrisDataManager(getDataFolder(world)) : dim.getLoader().copy(); - compound.set(new IrisEngineCompound(world, dim, data, IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getThreadCount()))); + compound.set(new IrisEngineCompound(world, dim, data, IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getEngineThreadCount()))); compound.get().setStudio(!production); populators.clear(); populators.addAll(compound.get().getPopulators()); diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineTarget.java b/src/main/java/com/volmit/iris/engine/framework/EngineTarget.java index 8ab725b11..3083554aa 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineTarget.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineTarget.java @@ -19,6 +19,7 @@ package com.volmit.iris.engine.framework; import com.volmit.iris.core.IrisDataManager; +import com.volmit.iris.core.IrisSettings; import com.volmit.iris.engine.object.IrisDimension; import com.volmit.iris.engine.object.common.IrisWorld; import com.volmit.iris.engine.parallax.ParallaxWorld; @@ -43,7 +44,7 @@ public class EngineTarget { this.dimension = dimension; this.data = data; this.inverted = inverted; - this.burster = new MultiBurst("Iris Engine " + dimension.getName(), threads, 6); + this.burster = new MultiBurst("Iris Engine " + dimension.getName(), IrisSettings.get().getConcurrency().getEngineThreadPriority(), threads); this.parallaxWorld = new ParallaxWorld(burster, 256, new File(world.worldFolder(), "iris/" + dimension.getLoadKey() + "/parallax")); } diff --git a/src/main/java/com/volmit/iris/engine/lighting/LightingTaskBatch.java b/src/main/java/com/volmit/iris/engine/lighting/LightingTaskBatch.java index 042104afb..0d4e171d9 100644 --- a/src/main/java/com/volmit/iris/engine/lighting/LightingTaskBatch.java +++ b/src/main/java/com/volmit/iris/engine/lighting/LightingTaskBatch.java @@ -262,7 +262,7 @@ public class LightingTaskBatch implements LightingTask { LightingChunk nextChunk = null; CompletableFuture nextChunkFuture = null; synchronized (chunks_lock) { - for (; i < chunks.length && numBeingLoaded < IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getThreadCount()); i++) { + for (; i < chunks.length && numBeingLoaded < IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getEngineThreadCount()); i++) { LightingChunk lc = chunks[i]; if (lc.loadingStarted) { continue; // Already (being) loaded diff --git a/src/main/java/com/volmit/iris/engine/object/IrisEntity.java b/src/main/java/com/volmit/iris/engine/object/IrisEntity.java index f2256a2a6..b12bddea6 100644 --- a/src/main/java/com/volmit/iris/engine/object/IrisEntity.java +++ b/src/main/java/com/volmit/iris/engine/object/IrisEntity.java @@ -279,7 +279,7 @@ public class IrisEntity extends IrisRegistrant { }, 1); } - if (Iris.awareEntities && e instanceof Mob) { + if (e instanceof Mob) { Mob m = (Mob) e; m.setAware(isAware()); } diff --git a/src/main/java/com/volmit/iris/engine/object/IrisLoot.java b/src/main/java/com/volmit/iris/engine/object/IrisLoot.java index e4d69c109..eaf879436 100644 --- a/src/main/java/com/volmit/iris/engine/object/IrisLoot.java +++ b/src/main/java/com/volmit/iris/engine/object/IrisLoot.java @@ -142,10 +142,15 @@ public class IrisLoot { i.apply(rng, m); } - if (Iris.customModels) { + try + { m.setCustomModelData(getCustomModel()); } + catch(Throwable e) + { + Iris.reportError(e); + } m.setLocalizedName(C.translateAlternateColorCodes('&', displayName)); m.setDisplayName(C.translateAlternateColorCodes('&', displayName)); m.setUnbreakable(isUnbreakable()); @@ -226,10 +231,16 @@ public class IrisLoot { i.apply(rng, m); } - if (Iris.customModels) { + try + { m.setCustomModelData(getCustomModel()); } + catch(Throwable e) + { + Iris.reportError(e); + } + m.setLocalizedName(C.translateAlternateColorCodes('&', displayName)); m.setDisplayName(C.translateAlternateColorCodes('&', displayName)); m.setUnbreakable(isUnbreakable()); diff --git a/src/main/java/com/volmit/iris/engine/parallax/ParallaxWorld.java b/src/main/java/com/volmit/iris/engine/parallax/ParallaxWorld.java index 68c797f3b..ef6afe72b 100644 --- a/src/main/java/com/volmit/iris/engine/parallax/ParallaxWorld.java +++ b/src/main/java/com/volmit/iris/engine/parallax/ParallaxWorld.java @@ -257,7 +257,7 @@ public class ParallaxWorld implements ParallaxAccess { @Override public void saveAll() { - MultiBurst.burst.lazy(this::saveAllNOW); + burst.lazy(this::saveAllNOW); } @Override diff --git a/src/main/java/com/volmit/iris/engine/parallel/MultiBurst.java b/src/main/java/com/volmit/iris/engine/parallel/MultiBurst.java index e79883bd7..32531d126 100644 --- a/src/main/java/com/volmit/iris/engine/parallel/MultiBurst.java +++ b/src/main/java/com/volmit/iris/engine/parallel/MultiBurst.java @@ -19,17 +19,17 @@ package com.volmit.iris.engine.parallel; import com.volmit.iris.Iris; +import com.volmit.iris.core.IrisSettings; import com.volmit.iris.util.collection.KList; import java.util.concurrent.*; public class MultiBurst { - public static final MultiBurst burst = new MultiBurst("Iris", 6, Runtime.getRuntime().availableProcessors()); + public static final MultiBurst burst = new MultiBurst("Iris", IrisSettings.get().getConcurrency().getMiscThreadPriority(), IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getMiscThreadCount())); private final ExecutorService service; private ExecutorService syncService; private int tid; - public MultiBurst(int tc) { this("Iris", 6, tc); } From 4e81151e11ca2865d8d23fda85e16f32d5b2bb95 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 11:35:40 -0400 Subject: [PATCH 112/137] Config fixes for pregen --- src/main/java/com/volmit/iris/core/IrisSettings.java | 2 +- .../java/com/volmit/iris/core/gui/PregeneratorJob.java | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/volmit/iris/core/IrisSettings.java b/src/main/java/com/volmit/iris/core/IrisSettings.java index bbff7b48f..ef46eb003 100644 --- a/src/main/java/com/volmit/iris/core/IrisSettings.java +++ b/src/main/java/com/volmit/iris/core/IrisSettings.java @@ -114,7 +114,7 @@ public class IrisSettings { public boolean systemEffects = true; public boolean systemEntitySpawnOverrides = true; public boolean systemEntityInitialSpawns = true; - public int maxBiomeChildDepth = 5; + public int maxBiomeChildDepth = 4; } @Data diff --git a/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java b/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java index 4a8a43c3a..e46455bd6 100644 --- a/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java +++ b/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java @@ -73,7 +73,12 @@ public class PregeneratorJob implements PregenListener { max.setX(Math.max((xx << 5) + 31, max.getX())); max.setZ(Math.max((zz << 5) + 31, max.getZ())); }); - open(); + + if(IrisSettings.get().getGui().isUseServerLaunchedGuis()) + { + open(); + } + J.a(this.pregenerator::start, 20); } From 4d90bd9e31d72b2d01b491bb7ac23dedf7aedd50 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 11:36:44 -0400 Subject: [PATCH 113/137] Cleanup Code --- README.md | 6 +- .../com/volmit/iris/core/IrisSettings.java | 6 +- .../core/command/world/CommandIrisPregen.java | 4 +- .../volmit/iris/core/gui/PregeneratorJob.java | 92 +++---- .../core/gui/components/IrisRenderer.java | 1 - .../core/pregenerator/IrisPregenerator.java | 53 ++--- .../iris/core/pregenerator/PregenTask.java | 14 +- .../core/pregenerator/PregeneratorMethod.java | 16 +- .../methods/AsyncOrMedievalPregenMethod.java | 3 +- .../methods/AsyncPregenMethod.java | 19 +- .../methods/HeadlessPregenMethod.java | 6 +- .../methods/HybridPregenMethod.java | 17 +- .../methods/MedievalPregenMethod.java | 15 +- .../methods/SyndicatePregenMethod.java | 225 ++++++++---------- .../syndicate/SyndicateClient.java | 3 +- .../syndicate/SyndicateServer.java | 69 ++---- .../syndicate/command/SyndicateCommand.java | 3 +- .../volmit/iris/core/tools/IrisCreator.java | 49 ++-- .../volmit/iris/core/tools/IrisToolbelt.java | 58 ++--- .../com/volmit/iris/engine/IrisComplex.java | 3 +- .../iris/engine/IrisEngineCompound.java | 3 +- .../engine/actuator/IrisBiomeActuator.java | 1 - .../java/com/volmit/iris/engine/data/B.java | 1 - .../engine/data/chunk/LinkedTerrainChunk.java | 8 +- .../volmit/iris/engine/data/mca/MCAFile.java | 4 +- .../volmit/iris/engine/data/mca/NBTWorld.java | 70 ++---- .../volmit/iris/engine/framework/Engine.java | 3 +- .../framework/EngineCompositeGenerator.java | 15 +- .../iris/engine/framework/EngineCompound.java | 1 - .../framework/EngineParallaxManager.java | 7 +- .../iris/engine/framework/IrisAccess.java | 10 +- .../engine/headless/HeadlessGenerator.java | 28 +-- .../iris/engine/headless/HeadlessWorld.java | 18 +- .../iris/engine/hunk/io/HunkRegionSlice.java | 10 +- .../engine/modifier/IrisRavineModifier.java | 2 +- .../iris/engine/object/IrisDimension.java | 27 +-- .../volmit/iris/engine/object/IrisLoot.java | 16 +- .../iris/engine/object/common/IrisWorld.java | 33 +-- .../engine/parallax/ParallaxChunkMeta.java | 1 - .../iris/engine/parallax/ParallaxRegion.java | 4 +- .../iris/engine/parallel/MultiBurst.java | 11 +- .../iris/util/exceptions/IrisException.java | 3 +- .../exceptions/MissingDimensionException.java | 3 +- .../com/volmit/iris/util/math/Position2.java | 6 +- .../com/volmit/iris/util/scheduling/J.java | 4 +- 45 files changed, 350 insertions(+), 601 deletions(-) diff --git a/README.md b/README.md index 0d0da5832..b7e56f28c 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,12 @@ For 1.16 and below, see the 1.14-1.16 branch. The master branch is for the latest version of minecraft. -# [Support](https://discord.gg/3xxPTpT) **|** [Documentation](https://docs.volmit.com/iris/) **|** [Git](https://github.com/IrisDimensions) +# [Support](https://discord.gg/3xxPTpT) **|** [Documentation](https://docs.volmit.com/iris/) ** +|** [Git](https://github.com/IrisDimensions) ## Iris Toolbelt -Everyone needs a toolbelt. + +Everyone needs a toolbelt. ```java package com.volmit.iris.core.tools diff --git a/src/main/java/com/volmit/iris/core/IrisSettings.java b/src/main/java/com/volmit/iris/core/IrisSettings.java index ef46eb003..84c583a9f 100644 --- a/src/main/java/com/volmit/iris/core/IrisSettings.java +++ b/src/main/java/com/volmit/iris/core/IrisSettings.java @@ -56,10 +56,8 @@ public class IrisSettings { return getParallax().getParallaxRegionEvictionMS(); } - public static int getThreadCount(int c) - { - if(c < 2 && c >= 0) - { + public static int getThreadCount(int c) { + if (c < 2 && c >= 0) { return 2; } diff --git a/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java b/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java index 42a956c1a..52c7bca0e 100644 --- a/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java +++ b/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java @@ -112,7 +112,7 @@ public class CommandIrisPregen extends MortarCommand { IrisToolbelt.pregenerate(PregenTask .builder() .center(new Position2(0, 0)) - .radius(((getVal(args[0])>>4)>>5) + 1) + .radius(((getVal(args[0]) >> 4) >> 5) + 1) .build(), world); } catch (NumberFormatException e) { Iris.reportError(e); @@ -142,7 +142,7 @@ public class CommandIrisPregen extends MortarCommand { new PregeneratorJob(PregenTask .builder() .center(new Position2(0, 0)) - .radius(((getVal(args[0])>>4)>>5) + 1) + .radius(((getVal(args[0]) >> 4) >> 5) + 1) .build(), new HybridPregenMethod(world, Runtime.getRuntime().availableProcessors())); } catch (NumberFormatException e) { diff --git a/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java b/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java index e46455bd6..c43255ca0 100644 --- a/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java +++ b/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java @@ -57,8 +57,7 @@ public class PregeneratorJob implements PregenListener { private Position2 min; private Position2 max; - public PregeneratorJob(PregenTask task, PregeneratorMethod method) - { + public PregeneratorJob(PregenTask task, PregeneratorMethod method) { instance = this; saving = false; info = new String[]{"Initializing..."}; @@ -67,36 +66,32 @@ public class PregeneratorJob implements PregenListener { max = new Position2(0, 0); min = new Position2(0, 0); KList draw = new KList<>(); - task.iterateRegions((xx,zz) -> { + task.iterateRegions((xx, zz) -> { min.setX(Math.min(xx << 5, min.getX())); min.setZ(Math.min(zz << 5, min.getZ())); max.setX(Math.max((xx << 5) + 31, max.getX())); max.setZ(Math.max((zz << 5) + 31, max.getZ())); }); - if(IrisSettings.get().getGui().isUseServerLaunchedGuis()) - { + if (IrisSettings.get().getGui().isUseServerLaunchedGuis()) { open(); } J.a(this.pregenerator::start, 20); } - public PregeneratorJob onProgress(Consumer c) - { + public PregeneratorJob onProgress(Consumer c) { onProgress.add(c); return this; } - public PregeneratorJob whenDone(Runnable r) - { + public PregeneratorJob whenDone(Runnable r) { whenDone.add(r); return this; } public static boolean shutdownInstance() { - if(instance == null) - { + if (instance == null) { return false; } @@ -109,59 +104,45 @@ public class PregeneratorJob implements PregenListener { } public static void pauseResume() { - if(instance == null) - { + if (instance == null) { return; } - if(isPaused()) - { + if (isPaused()) { instance.pregenerator.resume(); - } - - else - { + } else { instance.pregenerator.pause(); } } public static boolean isPaused() { - if(instance == null) - { + if (instance == null) { return true; } return instance.paused(); } - public void drawRegion(int x, int z, Color color) - { + public void drawRegion(int x, int z, Color color) { J.a(() -> { - PregenTask.iterateRegion(x, z, (xx,zz)->{ - draw(xx,zz,color); + PregenTask.iterateRegion(x, z, (xx, zz) -> { + draw(xx, zz, color); J.sleep(3); }); }); } - public void draw(int x, int z, Color color) - { - try - { - if(renderer != null && frame != null && frame.isVisible()) - { + public void draw(int x, int z, Color color) { + try { + if (renderer != null && frame != null && frame.isVisible()) { renderer.func.accept(new Position2(x, z), color); } - } - - catch(Throwable ignored) - { + } catch (Throwable ignored) { } } - public void stop() - { + public void stop() { J.a(() -> { pregenerator.close(); close(); @@ -169,27 +150,20 @@ public class PregeneratorJob implements PregenListener { }); } - public void close() - { + public void close() { J.a(() -> { - try - { + try { J.sleep(3000); frame.setVisible(false); - } - - catch(Throwable e) - { + } catch (Throwable e) { } }); } - public void open() - { + public void open() { J.a(() -> { - try - { + try { frame = new JFrame("Pregen View"); renderer = new PregenRenderer(); frame.addKeyListener(renderer); @@ -205,10 +179,7 @@ public class PregeneratorJob implements PregenListener { frame.add(renderer); frame.setSize(1000, 1000); frame.setVisible(true); - } - - catch(Throwable e) - { + } catch (Throwable e) { } }); @@ -216,15 +187,14 @@ public class PregeneratorJob implements PregenListener { @Override public void onTick(double chunksPerSecond, double chunksPerMinute, double regionsPerMinute, double percent, int generated, int totalChunks, int chunksRemaining, long eta, long elapsed, String method) { - info = new String[] { - (paused() ? "PAUSED" : (saving ? "Saving... " : "Generating")) + " " + Form.f(generated) + " of " + Form.f(totalChunks) + " (" + Form.pc(percent, 0) + " Complete)", - "Speed: " + Form.f(chunksPerSecond, 0) + " Chunks/s, " + Form.f(regionsPerMinute, 1) + " Regions/m, " + Form.f(chunksPerMinute, 0) + " Chunks/m", - Form.duration(eta, 2) + " Remaining " + " (" + Form.duration(elapsed, 2) + " Elapsed)", - "Generation Method: " + method, + info = new String[]{ + (paused() ? "PAUSED" : (saving ? "Saving... " : "Generating")) + " " + Form.f(generated) + " of " + Form.f(totalChunks) + " (" + Form.pc(percent, 0) + " Complete)", + "Speed: " + Form.f(chunksPerSecond, 0) + " Chunks/s, " + Form.f(regionsPerMinute, 1) + " Regions/m, " + Form.f(chunksPerMinute, 0) + " Chunks/m", + Form.duration(eta, 2) + " Remaining " + " (" + Form.duration(elapsed, 2) + " Elapsed)", + "Generation Method: " + method, }; - for(Consumer i : onProgress) - { + for (Consumer i : onProgress) { i.accept(percent); } } @@ -305,7 +275,7 @@ public class PregeneratorJob implements PregenListener { } private boolean paused() { - return pregenerator.paused(); + return pregenerator.paused(); } private String[] getProgress() { diff --git a/src/main/java/com/volmit/iris/core/gui/components/IrisRenderer.java b/src/main/java/com/volmit/iris/core/gui/components/IrisRenderer.java index ad84946d3..00a31d77c 100644 --- a/src/main/java/com/volmit/iris/core/gui/components/IrisRenderer.java +++ b/src/main/java/com/volmit/iris/core/gui/components/IrisRenderer.java @@ -18,7 +18,6 @@ package com.volmit.iris.core.gui.components; -import com.volmit.iris.core.gui.components.RenderType; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.interpolation.IrisInterpolation; diff --git a/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java b/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java index 41bd8edc9..a0bbf3fb4 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java @@ -18,8 +18,6 @@ package com.volmit.iris.core.pregenerator; -import com.volmit.iris.Iris; -import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.math.M; import com.volmit.iris.util.math.Position2; @@ -54,8 +52,7 @@ public class IrisPregenerator { private final KSet retry; private final KSet net; - public IrisPregenerator(PregenTask task, PregeneratorMethod generator, PregenListener listener) - { + public IrisPregenerator(PregenTask task, PregeneratorMethod generator, PregenListener listener) { this.listener = listenify(listener); generatedRegions = new KSet<>(); this.shutdown = new AtomicBoolean(false); @@ -83,17 +80,16 @@ public class IrisPregenerator { generatedLast.set(generated.get()); chunksPerSecond.put(secondGenerated); - if(minuteLatch.flip()) - { + if (minuteLatch.flip()) { int minuteGenerated = generated.get() - generatedLastMinute.get(); generatedLastMinute.set(generated.get()); chunksPerMinute.put(minuteGenerated); - regionsPerMinute.put((double)minuteGenerated / 1024D); + regionsPerMinute.put((double) minuteGenerated / 1024D); } listener.onTick(chunksPerSecond.getAverage(), chunksPerMinute.getAverage(), regionsPerMinute.getAverage(), - (double)generated.get() / (double)totalChunks.get(), + (double) generated.get() / (double) totalChunks.get(), generated.get(), totalChunks.get(), totalChunks.get() - generated.get(), eta, M.ms() - startTime.get(), currentGeneratorMethod.get()); @@ -108,18 +104,16 @@ public class IrisPregenerator { ((double) (M.ms() - startTime.get()) / (double) generated.get())); } - public void close() - { + public void close() { shutdown.set(true); } - public void start() - { + public void start() { init(); ticker.start(); checkRegions(); - task.iterateRegions((x,z) -> visitRegion(x, z, true)); - task.iterateRegions((x,z) -> visitRegion(x, z, false)); + task.iterateRegions((x, z) -> visitRegion(x, z, true)); + task.iterateRegions((x, z) -> visitRegion(x, z, false)); shutdown(); } @@ -140,42 +134,34 @@ public class IrisPregenerator { } private void visitRegion(int x, int z, boolean regions) { - while(paused.get() && !shutdown.get()) - { + while (paused.get() && !shutdown.get()) { J.sleep(50); } - if(shutdown.get()) - { + if (shutdown.get()) { listener.onRegionSkipped(x, z); return; } Position2 pos = new Position2(x, z); - if(generatedRegions.contains(pos)) - { + if (generatedRegions.contains(pos)) { return; } currentGeneratorMethod.set(generator.getMethod(x, z)); boolean hit = false; - if(generator.supportsRegions(x, z, listener) && regions) - { + if (generator.supportsRegions(x, z, listener) && regions) { hit = true; listener.onRegionGenerating(x, z); generator.generateRegion(x, z, listener); - } - - else if(!regions) - { + } else if (!regions) { hit = true; listener.onRegionGenerating(x, z); PregenTask.iterateRegion(x, z, (xx, zz) -> generator.generateChunk(xx, zz, listener)); } - if(hit) - { + if (hit) { listener.onRegionGenerated(x, z); listener.onSaving(); generator.save(); @@ -185,21 +171,18 @@ public class IrisPregenerator { } private void checkRegion(int x, int z) { - if(generatedRegions.contains(new Position2(x, z))) - { + if (generatedRegions.contains(new Position2(x, z))) { return; } generator.supportsRegions(x, z, listener); } - public void pause() - { + public void pause() { paused.set(true); } - public void resume() - { + public void resume() { paused.set(false); } @@ -207,7 +190,7 @@ public class IrisPregenerator { return new PregenListener() { @Override public void onTick(double chunksPerSecond, double chunksPerMinute, double regionsPerMinute, double percent, int generated, int totalChunks, int chunksRemaining, long eta, long elapsed, String method) { - listener.onTick( chunksPerSecond, chunksPerMinute, regionsPerMinute, percent, generated, totalChunks, chunksRemaining, eta, elapsed, method); + listener.onTick(chunksPerSecond, chunksPerMinute, regionsPerMinute, percent, generated, totalChunks, chunksRemaining, eta, elapsed, method); } @Override diff --git a/src/main/java/com/volmit/iris/core/pregenerator/PregenTask.java b/src/main/java/com/volmit/iris/core/pregenerator/PregenTask.java index 007b3a49b..cc87b439d 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/PregenTask.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/PregenTask.java @@ -31,29 +31,25 @@ import java.util.Comparator; @Data public class PregenTask { @Builder.Default - private Position2 center = new Position2(0,0); + private Position2 center = new Position2(0, 0); @Builder.Default private int radius = 1; private static final KList order = computeChunkOrder(); - public void iterateRegions(Spiraled s) - { + public void iterateRegions(Spiraled s) { new Spiraler(radius * 2, radius * 2, s) .setOffset(center.getX(), center.getZ()).drain(); } - public static void iterateRegion(int xr, int zr, Spiraled s) - { - for(Position2 i : order) - { + public static void iterateRegion(int xr, int zr, Spiraled s) { + for (Position2 i : order) { s.on(i.getX() + (xr << 5), i.getZ() + (zr << 5)); } } - public void iterateAllChunks(Spiraled s) - { + public void iterateAllChunks(Spiraled s) { new Spiraler(radius * 2, radius * 2, (x, z) -> iterateRegion(x, z, s)) .setOffset(center.getX(), center.getZ()).drain(); } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/PregeneratorMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/PregeneratorMethod.java index be3fc5c2c..ceed620cf 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/PregeneratorMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/PregeneratorMethod.java @@ -40,33 +40,37 @@ public interface PregeneratorMethod { /** * Return true if regions can be generated - * @return true if they can be + * * @param x the x region * @param z the z region + * @return true if they can be */ boolean supportsRegions(int x, int z, PregenListener listener); /** * Return the name of the method being used - * @return the name + * * @param x the x region * @param z the z region + * @return the name */ String getMethod(int x, int z); /** * Called to generate a region. Execute sync, if multicore internally, wait * for the task to complete - * @param x the x - * @param z the z + * + * @param x the x + * @param z the z * @param listener signal chunks generating & generated. Parallel capable. */ void generateRegion(int x, int z, PregenListener listener); /** * Called to generate a chunk. You can go async so long as save will wait on the threads to finish - * @param x the x - * @param z the z + * + * @param x the x + * @param z the z * @param listener */ void generateChunk(int x, int z, PregenListener listener); diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/AsyncOrMedievalPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/AsyncOrMedievalPregenMethod.java index 5ab362ea4..bd65bf4c0 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/AsyncOrMedievalPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/AsyncOrMedievalPregenMethod.java @@ -26,8 +26,7 @@ import org.bukkit.World; public class AsyncOrMedievalPregenMethod implements PregeneratorMethod { private final PregeneratorMethod method; - public AsyncOrMedievalPregenMethod(World world, int threads) - { + public AsyncOrMedievalPregenMethod(World world, int threads) { method = PaperLib.isPaper() ? new AsyncPregenMethod(world, threads) : new MedievalPregenMethod(world); } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/AsyncPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/AsyncPregenMethod.java index 99f842cad..ffedcaa5b 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/AsyncPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/AsyncPregenMethod.java @@ -29,17 +29,14 @@ import org.bukkit.Chunk; import org.bukkit.World; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; public class AsyncPregenMethod implements PregeneratorMethod { private final World world; private final MultiBurst burst; private final KList> future; - public AsyncPregenMethod(World world, int threads) - { - if(!PaperLib.isPaper()) - { + public AsyncPregenMethod(World world, int threads) { + if (!PaperLib.isPaper()) { throw new UnsupportedOperationException("Cannot use PaperAsync on non paper!"); } @@ -51,8 +48,7 @@ public class AsyncPregenMethod implements PregeneratorMethod { private void unloadAndSaveAllChunks() { try { J.sfut(() -> { - for(Chunk i : world.getLoadedChunks()) - { + for (Chunk i : world.getLoadedChunks()) { i.unload(true); } world.save(); @@ -71,10 +67,8 @@ public class AsyncPregenMethod implements PregeneratorMethod { } } - private void waitForChunks() - { - for(CompletableFuture i : future) - { + private void waitForChunks() { + for (CompletableFuture i : future) { try { i.get(); } catch (Throwable e) { @@ -120,8 +114,7 @@ public class AsyncPregenMethod implements PregeneratorMethod { @Override public void generateChunk(int x, int z, PregenListener listener) { - if(future.size() > IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getPregenThreadCount())) - { + if (future.size() > IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getPregenThreadCount())) { waitForChunks(); } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/HeadlessPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/HeadlessPregenMethod.java index 9b010d59a..c91071478 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/HeadlessPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/HeadlessPregenMethod.java @@ -30,13 +30,11 @@ public class HeadlessPregenMethod implements PregeneratorMethod { @Getter private final HeadlessGenerator generator; - public HeadlessPregenMethod(HeadlessWorld world) - { + public HeadlessPregenMethod(HeadlessWorld world) { this(world, world.generate()); } - public HeadlessPregenMethod(HeadlessWorld world, HeadlessGenerator generator) - { + public HeadlessPregenMethod(HeadlessWorld world, HeadlessGenerator generator) { this.world = world; this.generator = generator; } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java index 7d19d8660..8720bf19e 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java @@ -33,8 +33,7 @@ public class HybridPregenMethod implements PregeneratorMethod { private final PregeneratorMethod inWorld; private final World world; - public HybridPregenMethod(World world, int threads) - { + public HybridPregenMethod(World world, int threads) { this.world = world; headless = supportsHeadless(world) ? new HeadlessPregenMethod(HeadlessWorld.from(world)) : new DummyPregenMethod(); @@ -76,18 +75,12 @@ public class HybridPregenMethod implements PregeneratorMethod { boolean r = !new File(world.getWorldFolder(), "region/r." + x + "." + z + ".mca").exists(); - if(!r && listener != null) - { - try - { - for(Position2 i : ((HeadlessPregenMethod) headless).getGenerator().getChunksInRegion(x, z)) - { + if (!r && listener != null) { + try { + for (Position2 i : ((HeadlessPregenMethod) headless).getGenerator().getChunksInRegion(x, z)) { listener.onChunkExistsInRegionGen((x << 5) + i.getX(), (z << 5) + i.getZ()); } - } - - catch(Throwable e) - { + } catch (Throwable e) { Iris.reportError(e); } } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/MedievalPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/MedievalPregenMethod.java index 7f40cab66..6a378f786 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/MedievalPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/MedievalPregenMethod.java @@ -32,16 +32,13 @@ public class MedievalPregenMethod implements PregeneratorMethod { private final World world; private final KList> futures; - public MedievalPregenMethod(World world) - { + public MedievalPregenMethod(World world) { this.world = world; futures = new KList<>(); } - private void waitForChunks() - { - for(CompletableFuture i : futures) - { + private void waitForChunks() { + for (CompletableFuture i : futures) { try { i.get(); } catch (Throwable e) { @@ -56,8 +53,7 @@ public class MedievalPregenMethod implements PregeneratorMethod { waitForChunks(); try { J.sfut(() -> { - for(Chunk i : world.getLoadedChunks()) - { + for (Chunk i : world.getLoadedChunks()) { i.unload(true); } world.save(); @@ -99,8 +95,7 @@ public class MedievalPregenMethod implements PregeneratorMethod { @Override public void generateChunk(int x, int z, PregenListener listener) { - if(futures.size() > IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getPregenThreadCount())) - { + if (futures.size() > IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getPregenThreadCount())) { waitForChunks(); } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/SyndicatePregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/SyndicatePregenMethod.java index 98ca715e5..9f1519e08 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/SyndicatePregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/SyndicatePregenMethod.java @@ -36,8 +36,7 @@ import java.io.IOException; import java.util.UUID; import java.util.concurrent.atomic.AtomicInteger; -public class SyndicatePregenMethod implements PregeneratorMethod -{ +public class SyndicatePregenMethod implements PregeneratorMethod { @Getter private String address; private String nickname; @@ -49,8 +48,7 @@ public class SyndicatePregenMethod implements PregeneratorMethod private UUID pack = UUID.randomUUID(); private long seed; - public SyndicatePregenMethod(String nickname, File worldFolder, String address, int port, String password, IrisDimension dimension, long seed) - { + public SyndicatePregenMethod(String nickname, File worldFolder, String address, int port, String password, IrisDimension dimension, long seed) { this.seed = seed; this.worldFolder = worldFolder; this.address = address; @@ -59,50 +57,45 @@ public class SyndicatePregenMethod implements PregeneratorMethod this.dimension = dimension; } - private SyndicateClient.SyndicateClientBuilder connect() - { + private SyndicateClient.SyndicateClientBuilder connect() { return SyndicateClient.builder().address(address).port(port); } - public synchronized void setup() - { - if(ready) - { + public synchronized void setup() { + if (ready) { return; } ready = false; try { connect().command(SyndicateInstallPack - .builder() + .builder() .dimension(dimension) .pack(pack) .seed(seed) - .build()) - .output((o) -> { - File to = new File(Iris.getTemp(), "send-" + pack.toString() + ".zip"); - ZipUtil.pack(dimension.getLoader().getDataFolder(), to); + .build()) + .output((o) -> { + File to = new File(Iris.getTemp(), "send-" + pack.toString() + ".zip"); + ZipUtil.pack(dimension.getLoader().getDataFolder(), to); - try { - IO.writeAll(to, o); - } catch (IOException e) { - e.printStackTrace(); - } + try { + IO.writeAll(to, o); + } catch (IOException e) { + e.printStackTrace(); + } - to.deleteOnExit(); - }) - .build().go((response, data) -> { - if(response instanceof SyndicateBusy) - { - throw new RuntimeException("Service is busy, will try later"); - } + to.deleteOnExit(); + }) + .build().go((response, data) -> { + if (response instanceof SyndicateBusy) { + throw new RuntimeException("Service is busy, will try later"); + } - ready = true; + ready = true; }); ready = true; } catch (Throwable throwable) { - if(throwable instanceof RuntimeException) - { + if (throwable instanceof RuntimeException) { ready = false; return; } @@ -111,10 +104,8 @@ public class SyndicatePregenMethod implements PregeneratorMethod } } - public boolean canGenerate() - { - if(!ready) - { + public boolean canGenerate() { + if (!ready) { J.a(this::setup); } @@ -128,16 +119,16 @@ public class SyndicatePregenMethod implements PregeneratorMethod @Override public void close() { - if(ready) - { + if (ready) { try { connect() - .command(SyndicateClose - .builder() - .pack(pack) - .build()) - .build() - .go((__, __b) -> {}); + .command(SyndicateClose + .builder() + .pack(pack) + .build()) + .build() + .go((__, __b) -> { + }); } catch (Throwable throwable) { throwable.printStackTrace(); } @@ -159,29 +150,26 @@ public class SyndicatePregenMethod implements PregeneratorMethod return "Syndicate<" + nickname + ">"; } - private double checkProgress(int x, int z) - { + private double checkProgress(int x, int z) { AtomicDouble progress = new AtomicDouble(-1); try { connect() - .command(SyndicateGetProgress.builder() - .pack(pack).build()).output((i) -> { - }).build().go((response, o) -> { - if(response instanceof SyndicateSendProgress) - { - if(((SyndicateSendProgress) response).isAvailable()) - { - progress.set(((SyndicateSendProgress) response).getProgress()); - File f = new File(worldFolder, "region/r." + x + "." + z + ".mca"); - try { - f.getParentFile().mkdirs(); - IO.writeAll(f, o); - progress.set(1000); - } catch (Throwable e) { - e.printStackTrace(); - } + .command(SyndicateGetProgress.builder() + .pack(pack).build()).output((i) -> { + }).build().go((response, o) -> { + if (response instanceof SyndicateSendProgress) { + if (((SyndicateSendProgress) response).isAvailable()) { + progress.set(((SyndicateSendProgress) response).getProgress()); + File f = new File(worldFolder, "region/r." + x + "." + z + ".mca"); + try { + f.getParentFile().mkdirs(); + IO.writeAll(f, o); + progress.set(1000); + } catch (Throwable e) { + e.printStackTrace(); } } + } }); } catch (Throwable throwable) { throwable.printStackTrace(); @@ -192,94 +180,73 @@ public class SyndicatePregenMethod implements PregeneratorMethod @Override public void generateRegion(int x, int z, PregenListener listener) { - if(!ready) - { + if (!ready) { throw new RuntimeException(); } try { connect().command(SyndicateGenerate - .builder() + .builder() .x(x).z(z).pack(pack) - .build()) - .build().go((response, data) -> { - if(response instanceof SyndicateOK) - { - listener.onNetworkStarted(x, z); - J.a(() -> { - double lastp = 0; - int calls = 0; - boolean installed = false; - while(true) - { - J.sleep(100); - double progress = checkProgress(x, z); - - if(progress == 1000) - { - installed = true; - AtomicInteger a = new AtomicInteger(calls); - PregenTask.iterateRegion(x, z, (xx, zz) -> { - if(a.decrementAndGet() < 0) - { - listener.onNetworkGeneratedChunk(xx, zz); - } - }); - calls = 1024; - } - - else if(progress < 0) - { - break; - } - - int change = (int) Math.floor((progress - lastp) * 1024D); - change = change == 0 ? 1 : change; + .build()) + .build().go((response, data) -> { + if (response instanceof SyndicateOK) { + listener.onNetworkStarted(x, z); + J.a(() -> { + double lastp = 0; + int calls = 0; + boolean installed = false; + while (true) { + J.sleep(100); + double progress = checkProgress(x, z); + if (progress == 1000) { + installed = true; AtomicInteger a = new AtomicInteger(calls); - AtomicInteger b = new AtomicInteger(change); PregenTask.iterateRegion(x, z, (xx, zz) -> { - if(a.decrementAndGet() < 0) - { - if(b.decrementAndGet() >= 0) - { - listener.onNetworkGeneratedChunk(xx, zz); - } + if (a.decrementAndGet() < 0) { + listener.onNetworkGeneratedChunk(xx, zz); } }); - calls += change; + calls = 1024; + } else if (progress < 0) { + break; } - if(!installed) - { - // TODO RETRY REGION - return; - } + int change = (int) Math.floor((progress - lastp) * 1024D); + change = change == 0 ? 1 : change; - listener.onNetworkDownloaded(x, z); - }); - } + AtomicInteger a = new AtomicInteger(calls); + AtomicInteger b = new AtomicInteger(change); + PregenTask.iterateRegion(x, z, (xx, zz) -> { + if (a.decrementAndGet() < 0) { + if (b.decrementAndGet() >= 0) { + listener.onNetworkGeneratedChunk(xx, zz); + } + } + }); + calls += change; + } - else if(response instanceof SyndicateInstallFirst) - { - ready = false; - throw new RuntimeException(); - } + if (!installed) { + // TODO RETRY REGION + return; + } - else if(response instanceof SyndicateBusy) - { - throw new RuntimeException(); - } - - else - { - throw new RuntimeException(); - } + listener.onNetworkDownloaded(x, z); + }); + } else if (response instanceof SyndicateInstallFirst) { + ready = false; + throw new RuntimeException(); + } else if (response instanceof SyndicateBusy) { + throw new RuntimeException(); + } else { + throw new RuntimeException(); + } }); } catch (Throwable throwable) { - if(throwable instanceof RuntimeException) - { + if (throwable instanceof RuntimeException) { throw (RuntimeException) throwable; } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/syndicate/SyndicateClient.java b/src/main/java/com/volmit/iris/core/pregenerator/syndicate/SyndicateClient.java index 1383d164c..2f7c9e848 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/syndicate/SyndicateClient.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/syndicate/SyndicateClient.java @@ -40,8 +40,7 @@ public class SyndicateClient { DataOutputStream o = new DataOutputStream(socket.getOutputStream()); SyndicateCommandIO.write(command, o); - if(output != null) - { + if (output != null) { output.accept(o); } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/syndicate/SyndicateServer.java b/src/main/java/com/volmit/iris/core/pregenerator/syndicate/SyndicateServer.java index 098a509bc..11ae61fbd 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/syndicate/SyndicateServer.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/syndicate/SyndicateServer.java @@ -56,10 +56,8 @@ public class SyndicateServer extends Thread implements PregenListener { server.setSoTimeout(1000); } - public void run() - { - while(!interrupted()) - { + public void run() { + while (!interrupted()) { try { Socket client = server.accept(); DataInputStream i = new DataInputStream(client.getInputStream()); @@ -79,40 +77,34 @@ public class SyndicateServer extends Thread implements PregenListener { } } - private void handle(Socket client, DataInputStream i, DataOutputStream o) throws Throwable - { + private void handle(Socket client, DataInputStream i, DataOutputStream o) throws Throwable { SyndicateCommand cmd = handle(SyndicateCommandIO.read(i), i, o); - if(cmd != null) - { + if (cmd != null) { SyndicateCommandIO.write(cmd, o); } o.flush(); } - private File getCachedDim(UUID id) - { - return new File(cache, id.toString().charAt(2) +"/" + id.toString().substring(0, 4)+ "/" + id); + private File getCachedDim(UUID id) { + return new File(cache, id.toString().charAt(2) + "/" + id.toString().substring(0, 4) + "/" + id); } private SyndicateCommand handle(SyndicateCommand command, DataInputStream i, DataOutputStream o) throws Throwable { - if(command instanceof SyndicateInstallPack) - { - if(busy) - { + if (command instanceof SyndicateInstallPack) { + if (busy) { return new SyndicateBusy(); } - if(generator != null) - { + if (generator != null) { generator.close(); IO.delete(generator.getWorld().getWorld().worldFolder()); generator = null; } UUID id = ((SyndicateInstallPack) command).getPack(); - File cacheload = new File(cache, id.toString().charAt(2) +"/" + id.toString().substring(0, 4)+ "/" + id + ".zip"); + File cacheload = new File(cache, id.toString().charAt(2) + "/" + id.toString().substring(0, 4) + "/" + id + ".zip"); File cachestore = getCachedDim(id); IO.delete(cachestore); int len = i.readInt(); @@ -129,14 +121,12 @@ public class SyndicateServer extends Thread implements PregenListener { return new SyndicateOK(); } - if(command instanceof SyndicateGenerate) - { - if(busy) - { + if (command instanceof SyndicateGenerate) { + if (busy) { return new SyndicateBusy(); } - if(generator == null || !Objects.equals(currentId, ((SyndicateGenerate) command).getPack())) { + if (generator == null || !Objects.equals(currentId, ((SyndicateGenerate) command).getPack())) { return new SyndicateInstallFirst(); } @@ -149,10 +139,8 @@ public class SyndicateServer extends Thread implements PregenListener { return new SyndicateOK(); } - if(command instanceof SyndicateClose) - { - if(generator != null && Objects.equals(currentId, ((SyndicateClose) command).getPack()) && !busy) - { + if (command instanceof SyndicateClose) { + if (generator != null && Objects.equals(currentId, ((SyndicateClose) command).getPack()) && !busy) { generator.close(); IO.delete(generator.getWorld().getWorld().worldFolder()); generator = null; @@ -160,31 +148,20 @@ public class SyndicateServer extends Thread implements PregenListener { } } - if(command instanceof SyndicateGetProgress) - { - if(generator != null && busy && Objects.equals(currentId, ((SyndicateGetProgress) command).getPack())) - { - return SyndicateSendProgress.builder().progress((double)g.get() / 1024D).build(); - } - - else if(generator != null && !busy && Objects.equals(currentId, ((SyndicateGetProgress) command).getPack()) && lastGeneratedRegion != null && lastGeneratedRegion.exists()) - { + if (command instanceof SyndicateGetProgress) { + if (generator != null && busy && Objects.equals(currentId, ((SyndicateGetProgress) command).getPack())) { + return SyndicateSendProgress.builder().progress((double) g.get() / 1024D).build(); + } else if (generator != null && !busy && Objects.equals(currentId, ((SyndicateGetProgress) command).getPack()) && lastGeneratedRegion != null && lastGeneratedRegion.exists()) { SyndicateCommandIO.write(SyndicateSendProgress - .builder() + .builder() .progress(1).available(true) - .build(), o); + .build(), o); o.writeLong(lastGeneratedRegion.length()); IO.writeAll(lastGeneratedRegion, o); return null; - } - - else if(generator == null) - { + } else if (generator == null) { return new SyndicateInstallFirst(); - } - - else - { + } else { return new SyndicateBusy(); } } diff --git a/src/main/java/com/volmit/iris/core/pregenerator/syndicate/command/SyndicateCommand.java b/src/main/java/com/volmit/iris/core/pregenerator/syndicate/command/SyndicateCommand.java index 968e82f8b..28fa034b9 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/syndicate/command/SyndicateCommand.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/syndicate/command/SyndicateCommand.java @@ -18,7 +18,6 @@ package com.volmit.iris.core.pregenerator.syndicate.command; -public interface SyndicateCommand -{ +public interface SyndicateCommand { } diff --git a/src/main/java/com/volmit/iris/core/tools/IrisCreator.java b/src/main/java/com/volmit/iris/core/tools/IrisCreator.java index 1417e3fa7..8f4cb4622 100644 --- a/src/main/java/com/volmit/iris/core/tools/IrisCreator.java +++ b/src/main/java/com/volmit/iris/core/tools/IrisCreator.java @@ -87,6 +87,7 @@ public class IrisCreator { /** * Create the IrisAccess (contains the world) + * * @return the IrisAccess * @throws IrisException shit happens */ @@ -94,40 +95,29 @@ public class IrisCreator { IrisDimension d = IrisToolbelt.getDimension(dimension()); IrisAccess access = null; Consumer prog = (pxx) -> { - double px = (headless && pregen!=null) ? pxx/2 : pxx; + double px = (headless && pregen != null) ? pxx / 2 : pxx; - if(pregen != null && !headless) - { + if (pregen != null && !headless) { px = (px / 2) + 0.5; } - if(sender != null) - { - if(sender.isPlayer()) - { + if (sender != null) { + if (sender.isPlayer()) { sender.player().spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(C.WHITE + "Generating " + Form.pc(px))); - } - - else - { + } else { sender.sendMessage("Generating " + Form.f(px, 0)); } } }; - if(d == null) - { + if (d == null) { throw new MissingDimensionException("Cannot find dimension '" + dimension() + "'"); } - if (headless) - { + if (headless) { HeadlessWorld w = new HeadlessWorld(name, d, seed, studio); access = w.generate().getGenerator(); - } - - else - { + } else { O done = new O<>(); done.set(false); WorldCreator wc = new IrisWorldCreator() @@ -146,9 +136,8 @@ public class IrisCreator { while (finalAccess1.getGenerated() < req && !done.get()) { double v = (double) finalAccess1.getGenerated() / (double) req; - if(pregen != null) - { - v /=2; + if (pregen != null) { + v /= 2; } if (sender.isPlayer()) { @@ -173,8 +162,7 @@ public class IrisCreator { done.set(true); } - if(access == null) - { + if (access == null) { throw new IrisException("Access is null. Something bad happened."); } @@ -182,8 +170,7 @@ public class IrisCreator { Runnable loadup = () -> { try { J.sfut(() -> { - if(headless) - { + if (headless) { O done = new O<>(); done.set(false); @@ -193,7 +180,7 @@ public class IrisCreator { while (finalAccess.getGenerated() < req && !done.get()) { double v = (double) finalAccess.getGenerated() / (double) req; - v = (v/2) + 0.5; + v = (v / 2) + 0.5; if (sender.isPlayer()) { sender.player().spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(C.WHITE + "Generating " + Form.pc(v) + ((C.GRAY + " (" + (req - finalAccess.getGenerated()) + " Left)")))); @@ -222,13 +209,9 @@ public class IrisCreator { } }; - if(pregen != null) - { + if (pregen != null) { IrisToolbelt.pregenerate(pregen, access).onProgress(prog).whenDone(loadup); - } - - else - { + } else { loadup.run(); } diff --git a/src/main/java/com/volmit/iris/core/tools/IrisToolbelt.java b/src/main/java/com/volmit/iris/core/tools/IrisToolbelt.java index 49294d128..25d6f5c4f 100644 --- a/src/main/java/com/volmit/iris/core/tools/IrisToolbelt.java +++ b/src/main/java/com/volmit/iris/core/tools/IrisToolbelt.java @@ -28,7 +28,6 @@ import com.volmit.iris.core.pregenerator.methods.HeadlessPregenMethod; import com.volmit.iris.core.pregenerator.methods.HybridPregenMethod; import com.volmit.iris.engine.framework.IrisAccess; import com.volmit.iris.engine.object.IrisDimension; -import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.plugin.VolmitSender; import org.bukkit.Bukkit; import org.bukkit.World; @@ -42,83 +41,79 @@ import java.io.File; public class IrisToolbelt { /** * Will find / download / search for the dimension or return null - * + *

* - You can provide a dimenson in the packs folder by the folder name * - You can provide a github repo by using (assumes branch is master unless specified) - * - GithubUsername/repository - * - GithubUsername/repository/branch + * - GithubUsername/repository + * - GithubUsername/repository/branch * * @param dimension the dimension id such as overworld or flat * @return the IrisDimension or null */ - public static IrisDimension getDimension(String dimension) - { + public static IrisDimension getDimension(String dimension) { File pack = Iris.instance.getDataFolder("packs", dimension); - if(!pack.exists()) - { + if (!pack.exists()) { Iris.proj.downloadSearch(new VolmitSender(Bukkit.getConsoleSender(), Iris.instance.getTag()), dimension, false, false); } - if(!pack.exists()) - { + if (!pack.exists()) { return null; } - return new IrisDataManager(pack).getDimensionLoader().load(dimension); + return new IrisDataManager(pack).getDimensionLoader().load(dimension); } /** * Create a world with plenty of options + * * @return the creator builder */ - public static IrisCreator createWorld() - { + public static IrisCreator createWorld() { return new IrisCreator(); } /** * Checks if the given world is an Iris World (same as access(world) != null) + * * @param world the world * @return true if it is an Iris Access world */ - public static boolean isIrisWorld(World world) - { + public static boolean isIrisWorld(World world) { return access(world) != null; } /** * Get the Iris generator for the given world + * * @param world the given world * @return the IrisAccess or null if it's not an Iris World */ - public static IrisAccess access(World world) - { + public static IrisAccess access(World world) { return IrisWorlds.access(world); } /** * Start a pregenerator task - * @param task the scheduled task + * + * @param task the scheduled task * @param method the method to execute the task * @return the pregenerator job (already started) */ - public static PregeneratorJob pregenerate(PregenTask task, PregeneratorMethod method) - { + public static PregeneratorJob pregenerate(PregenTask task, PregeneratorMethod method) { return new PregeneratorJob(task, method); } /** * Start a pregenerator task. If the supplied generator is headless, headless mode is used, * otherwise Hybrid mode is used. - * @param task the scheduled task + * + * @param task the scheduled task * @param access the Iris Generator * @return the pregenerator job (already started) */ - public static PregeneratorJob pregenerate(PregenTask task, IrisAccess access) - { - if(access.isHeadless()) - { + public static PregeneratorJob pregenerate(PregenTask task, IrisAccess access) { + if (access.isHeadless()) { return pregenerate(task, new HeadlessPregenMethod(access.getHeadlessGenerator().getWorld(), access.getHeadlessGenerator())); } @@ -128,14 +123,13 @@ public class IrisToolbelt { /** * Start a pregenerator task. If the supplied generator is headless, headless mode is used, * otherwise Hybrid mode is used. - * @param task the scheduled task + * + * @param task the scheduled task * @param world the World * @return the pregenerator job (already started) */ - public static PregeneratorJob pregenerate(PregenTask task, World world) - { - if(isIrisWorld(world)) - { + public static PregeneratorJob pregenerate(PregenTask task, World world) { + if (isIrisWorld(world)) { return pregenerate(task, access(world)); } @@ -145,10 +139,10 @@ public class IrisToolbelt { /** * Evacuate all players from the world into literally any other world. * If there are no other worlds, kick them! Not the best but what's mine is mine sometimes... + * * @param world the world to evac */ - public static void evacuate(World world) - { + public static void evacuate(World world) { IrisWorlds.evacuate(world); } } diff --git a/src/main/java/com/volmit/iris/engine/IrisComplex.java b/src/main/java/com/volmit/iris/engine/IrisComplex.java index aa82f6338..7dc54ac68 100644 --- a/src/main/java/com/volmit/iris/engine/IrisComplex.java +++ b/src/main/java/com/volmit/iris/engine/IrisComplex.java @@ -198,8 +198,7 @@ public class IrisComplex implements DataProvider { }, Interpolated.DOUBLE).cache2D(cacheSize); slopeStream = heightStream.slope(3).interpolate().bilinear(3, 3).cache2D(cacheSize); objectChanceStream = ProceduralStream.ofDouble((x, z) -> { - if(engine.getDimension().hasFeatures(engine)) - { + if (engine.getDimension().hasFeatures(engine)) { AtomicDouble str = new AtomicDouble(1D); engine.getFramework().getEngineParallax().forEachFeature(x, z, (i) -> str.set(Math.min(str.get(), i.getObjectChanceModifier(x, z)))); diff --git a/src/main/java/com/volmit/iris/engine/IrisEngineCompound.java b/src/main/java/com/volmit/iris/engine/IrisEngineCompound.java index 52900ab4f..4d562646a 100644 --- a/src/main/java/com/volmit/iris/engine/IrisEngineCompound.java +++ b/src/main/java/com/volmit/iris/engine/IrisEngineCompound.java @@ -39,7 +39,6 @@ import com.volmit.iris.util.format.Form; import com.volmit.iris.util.scheduling.PrecisionStopwatch; import lombok.Getter; import lombok.Setter; -import org.bukkit.World; import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; import org.bukkit.command.CommandSender; @@ -99,7 +98,7 @@ public class IrisEngineCompound implements EngineCompound { } else { double totalWeight = 0D; engines = new Engine[rootDimension.getDimensionalComposite().size()]; - burster = engines.length > 1 ? new MultiBurst("Iris Compound " + rootDimension.getName(), IrisSettings.get().getConcurrency().getEngineThreadPriority(), engines.length) : null; + burster = engines.length > 1 ? new MultiBurst("Iris Compound " + rootDimension.getName(), IrisSettings.get().getConcurrency().getEngineThreadPriority(), engines.length) : null; int threadDist = (Math.max(2, maximumThreads - engines.length)) / engines.length; if ((threadDist * engines.length) + engines.length > maximumThreads) { diff --git a/src/main/java/com/volmit/iris/engine/actuator/IrisBiomeActuator.java b/src/main/java/com/volmit/iris/engine/actuator/IrisBiomeActuator.java index 8fe672b0a..4d93858ed 100644 --- a/src/main/java/com/volmit/iris/engine/actuator/IrisBiomeActuator.java +++ b/src/main/java/com/volmit/iris/engine/actuator/IrisBiomeActuator.java @@ -28,7 +28,6 @@ import com.volmit.iris.engine.hunk.view.BiomeGridHunkView; import com.volmit.iris.engine.object.IrisBiome; import com.volmit.iris.engine.object.IrisBiomeCustom; import com.volmit.iris.util.documentation.BlockCoordinates; -import com.volmit.iris.util.documentation.ChunkCoordinates; import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.scheduling.PrecisionStopwatch; import org.bukkit.block.Biome; diff --git a/src/main/java/com/volmit/iris/engine/data/B.java b/src/main/java/com/volmit/iris/engine/data/B.java index 10480152f..c32774bcb 100644 --- a/src/main/java/com/volmit/iris/engine/data/B.java +++ b/src/main/java/com/volmit/iris/engine/data/B.java @@ -25,7 +25,6 @@ import com.volmit.iris.util.collection.KSet; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.data.BlockData; -import org.bukkit.block.data.type.Farmland; public class B { private static final Material AIR_MATERIAL = Material.AIR; diff --git a/src/main/java/com/volmit/iris/engine/data/chunk/LinkedTerrainChunk.java b/src/main/java/com/volmit/iris/engine/data/chunk/LinkedTerrainChunk.java index aa28d7e93..b1e0af0e0 100644 --- a/src/main/java/com/volmit/iris/engine/data/chunk/LinkedTerrainChunk.java +++ b/src/main/java/com/volmit/iris/engine/data/chunk/LinkedTerrainChunk.java @@ -18,11 +18,9 @@ package com.volmit.iris.engine.data.chunk; -import com.volmit.iris.Iris; import com.volmit.iris.core.nms.BiomeBaseInjector; import com.volmit.iris.core.nms.INMS; import com.volmit.iris.util.data.IrisBiomeStorage; -import net.minecraft.world.level.chunk.BiomeStorage; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.World; @@ -39,13 +37,11 @@ public class LinkedTerrainChunk implements TerrainChunk { private ChunkData rawChunkData; private final BiomeGrid storage; - public LinkedTerrainChunk(World world) - { + public LinkedTerrainChunk(World world) { this(null, Bukkit.createChunkData(world)); } - public LinkedTerrainChunk(World world, BiomeGrid storage) - { + public LinkedTerrainChunk(World world, BiomeGrid storage) { this(storage, Bukkit.createChunkData(world)); } diff --git a/src/main/java/com/volmit/iris/engine/data/mca/MCAFile.java b/src/main/java/com/volmit/iris/engine/data/mca/MCAFile.java index ca4842971..7e9f4df13 100644 --- a/src/main/java/com/volmit/iris/engine/data/mca/MCAFile.java +++ b/src/main/java/com/volmit/iris/engine/data/mca/MCAFile.java @@ -19,7 +19,6 @@ package com.volmit.iris.engine.data.mca; import com.volmit.iris.engine.data.nbt.tag.CompoundTag; -import com.volmit.iris.engine.hunk.storage.ArrayHunk; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.math.Position2; @@ -242,8 +241,7 @@ public class MCAFile { return getChunk(getChunkIndex(chunkX, chunkZ)); } - public boolean hasChunk(int chunkX, int chunkZ) - { + public boolean hasChunk(int chunkX, int chunkZ) { return getChunk(chunkX, chunkZ) != null; } diff --git a/src/main/java/com/volmit/iris/engine/data/mca/NBTWorld.java b/src/main/java/com/volmit/iris/engine/data/mca/NBTWorld.java index 22ed2935d..7b1206844 100644 --- a/src/main/java/com/volmit/iris/engine/data/mca/NBTWorld.java +++ b/src/main/java/com/volmit/iris/engine/data/mca/NBTWorld.java @@ -24,21 +24,20 @@ import com.volmit.iris.engine.cache.Cache; import com.volmit.iris.engine.data.B; import com.volmit.iris.engine.data.nbt.tag.CompoundTag; import com.volmit.iris.engine.data.nbt.tag.StringTag; -import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; -import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.format.C; import com.volmit.iris.util.math.M; import com.volmit.iris.util.scheduling.IrisLock; import org.bukkit.NamespacedKey; import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; -import org.jetbrains.annotations.NotNull; import java.io.File; import java.io.IOException; import java.util.Map; -import java.util.concurrent.*; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; public class NBTWorld { private static final BlockData AIR = B.get("AIR"); @@ -50,8 +49,7 @@ public class NBTWorld { private final File worldFolder; private final ExecutorService saveQueue; - public NBTWorld(File worldFolder) - { + public NBTWorld(File worldFolder) { this.worldFolder = worldFolder; this.loadedRegions = new KMap<>(); this.lastUse = new KMap<>(); @@ -63,20 +61,17 @@ public class NBTWorld { }); } - public void close() - { + public void close() { regionLock.lock(); - for(Long i : loadedRegions.k()) - { + for (Long i : loadedRegions.k()) { queueSaveUnload(Cache.keyX(i), Cache.keyZ(i)); } regionLock.unlock(); saveQueue.shutdown(); try { - while(!saveQueue.awaitTermination(3, TimeUnit.SECONDS)) - { + while (!saveQueue.awaitTermination(3, TimeUnit.SECONDS)) { Iris.info("Still Waiting to save MCA Files..."); } } catch (InterruptedException e) { @@ -84,52 +79,43 @@ public class NBTWorld { } } - public void flushNow() - { + public void flushNow() { regionLock.lock(); - for(Long i : loadedRegions.k()) - { + for (Long i : loadedRegions.k()) { doSaveUnload(Cache.keyX(i), Cache.keyZ(i)); } regionLock.unlock(); } - public void queueSaveUnload(int x, int z) - { + public void queueSaveUnload(int x, int z) { saveQueue.submit(() -> doSaveUnload(x, z)); } - public void doSaveUnload(int x, int z) - { + public void doSaveUnload(int x, int z) { MCAFile f = getMCAOrNull(x, z); - if(f != null) - { + if (f != null) { unloadRegion(x, z); } saveRegion(x, z, f); } - public void save() - { + public void save() { regionLock.lock(); boolean saving = true; - for(Long i : loadedRegions.k()) - { + for (Long i : loadedRegions.k()) { int x = Cache.keyX(i); int z = Cache.keyZ(i); - if(!lastUse.containsKey(i)) - { + if (!lastUse.containsKey(i)) { lastUse.put(i, M.ms()); } - if(shouldUnload(x, z)) - { + if (shouldUnload(x, z)) { queueSaveUnload(x, z); } } @@ -139,13 +125,11 @@ public class NBTWorld { regionLock.unlock(); } - public void queueSave() - { + public void queueSave() { } - public synchronized void unloadRegion(int x, int z) - { + public synchronized void unloadRegion(int x, int z) { long key = Cache.key(x, z); regionLock.lock(); loadedRegions.remove(key); @@ -154,8 +138,7 @@ public class NBTWorld { Iris.debug("Unloaded Region " + C.GOLD + x + " " + z); } - public void saveRegion(int x, int z) - { + public void saveRegion(int x, int z) { long k = Cache.key(x, z); MCAFile mca = getMCAOrNull(x, z); try { @@ -167,8 +150,7 @@ public class NBTWorld { } } - public void saveRegion(int x, int z, MCAFile mca) - { + public void saveRegion(int x, int z, MCAFile mca) { try { MCAUtil.write(mca, getRegionFile(x, z), true); Iris.debug("Saved Region " + C.GOLD + x + " " + z); @@ -178,8 +160,7 @@ public class NBTWorld { } } - public boolean shouldUnload(int x, int z) - { + public boolean shouldUnload(int x, int z) { return getIdleDuration(x, z) > 60000; } @@ -296,8 +277,7 @@ public class NBTWorld { return c; } - public long getIdleDuration(int x, int z) - { + public long getIdleDuration(int x, int z) { Long l = lastUse.get(Cache.key(x, z)); return l == null ? 0 : (M.ms() - l); @@ -311,8 +291,7 @@ public class NBTWorld { MCAFile mcaf = loadedRegions.get(key); regionLock.unlock(); - if(mcaf == null) - { + if (mcaf == null) { mcaf = new MCAFile(x, z); regionLock.lock(); loadedRegions.put(key, mcaf); @@ -327,8 +306,7 @@ public class NBTWorld { MCAFile ff = null; regionLock.lock(); - if(loadedRegions.containsKey(key)) - { + if (loadedRegions.containsKey(key)) { lastUse.put(key, M.ms()); ff = loadedRegions.get(key); } 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 3b8965fd6..ae77163b0 100644 --- a/src/main/java/com/volmit/iris/engine/framework/Engine.java +++ b/src/main/java/com/volmit/iris/engine/framework/Engine.java @@ -357,8 +357,7 @@ public interface Engine extends DataProvider, Fallible, GeneratorAccess, LootPro return getCompound().isStudio(); } - default MultiBurst burst() - { + default MultiBurst burst() { return getTarget().getBurster(); } diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java b/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java index e809f500d..b7c21ff6e 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java @@ -447,8 +447,7 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce IrisWorld ww = (getComposite() == null || getComposite().getWorld() == null) ? IrisWorld.fromWorld(world) : getComposite().getWorld(); generateChunkRawData(ww, x, z, tc).run(); - if(!getComposite().getWorld().hasRealWorld()) - { + if (!getComposite().getWorld().hasRealWorld()) { getComposite().getWorld().bind(world); } @@ -462,8 +461,7 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce return tc.getRaw(); } - public void assignHeadlessGenerator(HeadlessGenerator headlessGenerator) - { + public void assignHeadlessGenerator(HeadlessGenerator headlessGenerator) { this.headlessGenerator = headlessGenerator; } @@ -472,8 +470,7 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce return headlessGenerator; } - public void assignHeadlessNBTWriter(NBTWorld writer) - { + public void assignHeadlessNBTWriter(NBTWorld writer) { this.nbtWorld = writer; } @@ -492,13 +489,11 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce BurstExecutor e = burst.burst(1024); PregenTask.iterateRegion(x, z, (ii, jj) -> e.queue(() -> { - if(l != null) - { + if (l != null) { l.onChunkGenerating(ii, jj); } directWriteChunk(w, ii, jj, writer); - if(l != null) - { + if (l != null) { l.onChunkGenerated(ii, jj); } })); diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineCompound.java b/src/main/java/com/volmit/iris/engine/framework/EngineCompound.java index ef0740b62..257e192ff 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineCompound.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineCompound.java @@ -30,7 +30,6 @@ import com.volmit.iris.engine.object.common.IrisWorld; import com.volmit.iris.engine.parallel.MultiBurst; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; -import org.bukkit.World; import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; import org.bukkit.command.CommandSender; diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineParallaxManager.java b/src/main/java/com/volmit/iris/engine/framework/EngineParallaxManager.java index 1611bc460..f9f8ef5f5 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineParallaxManager.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineParallaxManager.java @@ -34,7 +34,6 @@ import com.volmit.iris.engine.object.tile.TileData; import com.volmit.iris.engine.parallax.ParallaxAccess; import com.volmit.iris.engine.parallax.ParallaxChunkMeta; import com.volmit.iris.engine.parallel.BurstExecutor; -import com.volmit.iris.engine.parallel.MultiBurst; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.collection.KSet; @@ -205,8 +204,7 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer { IrisLock getFeatureLock(); default void forEachFeature(double x, double z, Consumer f) { - if(!getEngine().getDimension().hasFeatures(getEngine())) - { + if (!getEngine().getDimension().hasFeatures(getEngine())) { return; } @@ -235,8 +233,7 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer { for (j = -s; j <= s; j++) { ParallaxChunkMeta m = getParallaxAccess().getMetaR(i + cx, j + cz); - synchronized (m) - { + synchronized (m) { try { for (IrisFeaturePositional k : m.getFeatures()) { if (k.shouldFilter(x, z)) { diff --git a/src/main/java/com/volmit/iris/engine/framework/IrisAccess.java b/src/main/java/com/volmit/iris/engine/framework/IrisAccess.java index 3c6762dd6..e064ddc78 100644 --- a/src/main/java/com/volmit/iris/engine/framework/IrisAccess.java +++ b/src/main/java/com/volmit/iris/engine/framework/IrisAccess.java @@ -34,9 +34,7 @@ import com.volmit.iris.util.math.M; import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.scheduling.ChronoLatch; import com.volmit.iris.util.scheduling.J; -import org.bukkit.Chunk; import org.bukkit.Location; -import org.bukkit.World; import org.bukkit.command.CommandSender; import java.util.concurrent.atomic.AtomicBoolean; @@ -49,7 +47,7 @@ public interface IrisAccess extends Hotloadable, DataProvider { HeadlessGenerator getHeadlessGenerator(); - default boolean isHeadless(){ + default boolean isHeadless() { return getHeadlessGenerator() != null; } @@ -98,8 +96,7 @@ public interface IrisAccess extends Hotloadable, DataProvider { boolean isStudio(); default Location lookForBiome(IrisBiome biome, long timeout, Consumer triesc) { - if(!getCompound().getWorld().hasRealWorld()) - { + if (!getCompound().getWorld().hasRealWorld()) { Iris.error("Cannot GOTO without a bound world (headless mode)"); return null; } @@ -184,8 +181,7 @@ public interface IrisAccess extends Hotloadable, DataProvider { } default Location lookForRegion(IrisRegion reg, long timeout, Consumer triesc) { - if(!getCompound().getWorld().hasRealWorld()) - { + if (!getCompound().getWorld().hasRealWorld()) { Iris.error("Cannot GOTO without a bound world (headless mode)"); return null; } diff --git a/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java b/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java index 8a2396ca1..9191fdaa4 100644 --- a/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java +++ b/src/main/java/com/volmit/iris/engine/headless/HeadlessGenerator.java @@ -20,8 +20,6 @@ package com.volmit.iris.engine.headless; import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.pregenerator.PregenListener; -import com.volmit.iris.engine.data.mca.LoadFlags; -import com.volmit.iris.engine.data.mca.MCAFile; import com.volmit.iris.engine.data.mca.MCAUtil; import com.volmit.iris.engine.data.mca.NBTWorld; import com.volmit.iris.engine.framework.EngineCompositeGenerator; @@ -35,14 +33,13 @@ import java.io.IOException; @Data public class HeadlessGenerator { - private static KList EMPTYPOINTS = new KList<>(); + private static KList EMPTYPOINTS = new KList<>(); private final HeadlessWorld world; private final EngineCompositeGenerator generator; private final NBTWorld writer; private final MultiBurst burst; - public HeadlessGenerator(HeadlessWorld world) - { + public HeadlessGenerator(HeadlessWorld world) { this.world = world; burst = new MultiBurst("Iris Headless Generator", 9, IrisSettings.getThreadCount(IrisSettings.get().getConcurrency().getPregenThreadCount())); writer = new NBTWorld(world.getWorld().worldFolder()); @@ -52,40 +49,33 @@ public class HeadlessGenerator { generator.initialize(world.getWorld()); } - public void generateChunk(int x, int z) - { + public void generateChunk(int x, int z) { generator.directWriteChunk(world.getWorld(), x, z, writer); } - public void generateRegion(int x, int z) - { + public void generateRegion(int x, int z) { generator.directWriteMCA(world.getWorld(), x, z, writer, burst); } - public void generateRegion(int x, int z, PregenListener listener) - { + public void generateRegion(int x, int z, PregenListener listener) { generator.directWriteMCA(world.getWorld(), x, z, writer, burst, listener); } - public File generateRegionToFile(int x, int z, PregenListener listener) - { + public File generateRegionToFile(int x, int z, PregenListener listener) { generateRegionToFile(x, z, listener); flush(); return writer.getRegionFile(x, z); } - public void flush() - { + public void flush() { writer.flushNow(); } - public void save() - { + public void save() { writer.save(); } - public void close() - { + public void close() { burst.shutdownAndAwait(); generator.close(); writer.close(); diff --git a/src/main/java/com/volmit/iris/engine/headless/HeadlessWorld.java b/src/main/java/com/volmit/iris/engine/headless/HeadlessWorld.java index 96eaae93c..90e7cb2a4 100644 --- a/src/main/java/com/volmit/iris/engine/headless/HeadlessWorld.java +++ b/src/main/java/com/volmit/iris/engine/headless/HeadlessWorld.java @@ -40,13 +40,11 @@ public class HeadlessWorld { private final IrisWorld world; private boolean studio = false; - public HeadlessWorld(String worldName, IrisDimension dimension, long seed) - { + public HeadlessWorld(String worldName, IrisDimension dimension, long seed) { this(worldName, dimension, seed, false); } - public HeadlessWorld(String worldName, IrisDimension dimension, long seed, boolean studio) - { + public HeadlessWorld(String worldName, IrisDimension dimension, long seed, boolean studio) { this.worldName = worldName; this.dimension = dimension; this.studio = studio; @@ -61,19 +59,16 @@ public class HeadlessWorld { world.worldFolder().mkdirs(); new File(world.worldFolder(), "region").mkdirs(); - if(!studio && !new File(world.worldFolder(), "iris").exists()) - { + if (!studio && !new File(world.worldFolder(), "iris").exists()) { Iris.proj.installIntoWorld(new VolmitSender(Bukkit.getConsoleSender(), Iris.instance.getTag("Headless")), dimension.getLoadKey(), world.worldFolder()); } } - public HeadlessGenerator generate() - { + public HeadlessGenerator generate() { return new HeadlessGenerator(this); } - public World load() - { + public World load() { return new WorldCreator(worldName) .environment(dimension.getEnvironment()) .seed(world.seed()) @@ -85,8 +80,7 @@ public class HeadlessWorld { return new HeadlessWorld(world.getName(), IrisWorlds.access(world).getTarget().getDimension(), world.getSeed()); } - public static HeadlessWorld from(String name, String dimension, long seed) - { + public static HeadlessWorld from(String name, String dimension, long seed) { return new HeadlessWorld(name, IrisDataManager.loadAnyDimension(dimension), seed); } } diff --git a/src/main/java/com/volmit/iris/engine/hunk/io/HunkRegionSlice.java b/src/main/java/com/volmit/iris/engine/hunk/io/HunkRegionSlice.java index 0e857b632..b1de49443 100644 --- a/src/main/java/com/volmit/iris/engine/hunk/io/HunkRegionSlice.java +++ b/src/main/java/com/volmit/iris/engine/hunk/io/HunkRegionSlice.java @@ -29,8 +29,8 @@ import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.function.Function2; import com.volmit.iris.util.function.Function3; -import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.math.M; +import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.oldnbt.ByteArrayTag; import com.volmit.iris.util.oldnbt.CompoundTag; import com.volmit.iris.util.oldnbt.Tag; @@ -101,8 +101,7 @@ public class HunkRegionSlice { public synchronized void save(MultiBurst burst) { BurstExecutor e = burst.burst(); - try - { + try { for (Position2 i : save.copy()) { if (i == null) { continue; @@ -118,10 +117,7 @@ public class HunkRegionSlice { } e.complete(); - } - - catch(Throwable ee) - { + } catch (Throwable ee) { Iris.reportError(ee); } } diff --git a/src/main/java/com/volmit/iris/engine/modifier/IrisRavineModifier.java b/src/main/java/com/volmit/iris/engine/modifier/IrisRavineModifier.java index 3137de6ab..70f64ae8e 100644 --- a/src/main/java/com/volmit/iris/engine/modifier/IrisRavineModifier.java +++ b/src/main/java/com/volmit/iris/engine/modifier/IrisRavineModifier.java @@ -25,8 +25,8 @@ import com.volmit.iris.engine.hunk.Hunk; import com.volmit.iris.engine.noise.CNG; import com.volmit.iris.engine.object.NoiseStyle; import com.volmit.iris.util.math.BlockPosition; -import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.math.MathHelper; +import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.scheduling.PrecisionStopwatch; import org.bukkit.Material; diff --git a/src/main/java/com/volmit/iris/engine/object/IrisDimension.java b/src/main/java/com/volmit/iris/engine/object/IrisDimension.java index 887a099a0..d216274c6 100644 --- a/src/main/java/com/volmit/iris/engine/object/IrisDimension.java +++ b/src/main/java/com/volmit/iris/engine/object/IrisDimension.java @@ -515,37 +515,28 @@ public class IrisDimension extends IrisRegistrant { public boolean hasFeatures(DataProvider data) { return featuresUsed.aquire(() -> { - if(getFeatures().isNotEmpty() || getSpecificFeatures().isNotEmpty()) - { + if (getFeatures().isNotEmpty() || getSpecificFeatures().isNotEmpty()) { return true; } - for(IrisRegion i : getAllRegions(data)) - { - if(i.getFeatures().isNotEmpty()) - { + for (IrisRegion i : getAllRegions(data)) { + if (i.getFeatures().isNotEmpty()) { return true; } - for(IrisObjectPlacement j : i.getObjects()) - { - if(j.isVacuum()) - { + for (IrisObjectPlacement j : i.getObjects()) { + if (j.isVacuum()) { return true; } } - for(IrisBiome j : i.getAllBiomes(data)) - { - if(j.getFeatures().isNotEmpty()) - { + for (IrisBiome j : i.getAllBiomes(data)) { + if (j.getFeatures().isNotEmpty()) { return true; } - for(IrisObjectPlacement k : i.getObjects()) - { - if(k.isVacuum()) - { + for (IrisObjectPlacement k : i.getObjects()) { + if (k.isVacuum()) { return true; } } diff --git a/src/main/java/com/volmit/iris/engine/object/IrisLoot.java b/src/main/java/com/volmit/iris/engine/object/IrisLoot.java index eaf879436..ea5dd7a1a 100644 --- a/src/main/java/com/volmit/iris/engine/object/IrisLoot.java +++ b/src/main/java/com/volmit/iris/engine/object/IrisLoot.java @@ -142,13 +142,9 @@ public class IrisLoot { i.apply(rng, m); } - try - { + try { m.setCustomModelData(getCustomModel()); - } - - catch(Throwable e) - { + } catch (Throwable e) { Iris.reportError(e); } m.setLocalizedName(C.translateAlternateColorCodes('&', displayName)); @@ -231,13 +227,9 @@ public class IrisLoot { i.apply(rng, m); } - try - { + try { m.setCustomModelData(getCustomModel()); - } - - catch(Throwable e) - { + } catch (Throwable e) { Iris.reportError(e); } diff --git a/src/main/java/com/volmit/iris/engine/object/common/IrisWorld.java b/src/main/java/com/volmit/iris/engine/object/common/IrisWorld.java index 6c091baac..182db04fd 100644 --- a/src/main/java/com/volmit/iris/engine/object/common/IrisWorld.java +++ b/src/main/java/com/volmit/iris/engine/object/common/IrisWorld.java @@ -47,31 +47,27 @@ public class IrisWorld { private int minHeight; private int maxHeight; - public static IrisWorld fromWorld(World world) - { + public static IrisWorld fromWorld(World world) { return bindWorld(IrisWorld.builder().build(), world); } - private static IrisWorld bindWorld(IrisWorld iw, World world) - { + private static IrisWorld bindWorld(IrisWorld iw, World world) { return iw.name(world.getName()) - .worldFolder(world.getWorldFolder()) - .seed(world.getSeed()) - .minHeight(world.getMinHeight()) - .maxHeight(world.getMaxHeight()) - .realWorld(world) - .environment(world.getEnvironment()); + .worldFolder(world.getWorldFolder()) + .seed(world.getSeed()) + .minHeight(world.getMinHeight()) + .maxHeight(world.getMaxHeight()) + .realWorld(world) + .environment(world.getEnvironment()); } - public boolean hasRealWorld() - { + public boolean hasRealWorld() { return realWorld != null; } public List getPlayers() { - if(hasRealWorld()) - { + if (hasRealWorld()) { return realWorld().getPlayers(); } @@ -79,8 +75,7 @@ public class IrisWorld { } public void evacuate() { - if(hasRealWorld()) - { + if (hasRealWorld()) { IrisWorlds.evacuate(realWorld()); } } @@ -90,8 +85,7 @@ public class IrisWorld { } public Location spawnLocation() { - if(hasRealWorld()) - { + if (hasRealWorld()) { return realWorld().getSpawnLocation(); } @@ -100,8 +94,7 @@ public class IrisWorld { } public Collection getEntitiesByClass(Class t) { - if(hasRealWorld()) - { + if (hasRealWorld()) { return realWorld().getEntitiesByClass(t); } diff --git a/src/main/java/com/volmit/iris/engine/parallax/ParallaxChunkMeta.java b/src/main/java/com/volmit/iris/engine/parallax/ParallaxChunkMeta.java index f9f169d8b..89865e50d 100644 --- a/src/main/java/com/volmit/iris/engine/parallax/ParallaxChunkMeta.java +++ b/src/main/java/com/volmit/iris/engine/parallax/ParallaxChunkMeta.java @@ -22,7 +22,6 @@ import com.google.gson.Gson; import com.volmit.iris.engine.hunk.io.HunkIOAdapter; import com.volmit.iris.engine.hunk.io.PaletteHunkIOAdapter; import com.volmit.iris.engine.object.IrisFeaturePositional; -import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.oldnbt.CompoundTag; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/com/volmit/iris/engine/parallax/ParallaxRegion.java b/src/main/java/com/volmit/iris/engine/parallax/ParallaxRegion.java index 81b7fdf71..d131a508b 100644 --- a/src/main/java/com/volmit/iris/engine/parallax/ParallaxRegion.java +++ b/src/main/java/com/volmit/iris/engine/parallax/ParallaxRegion.java @@ -27,12 +27,10 @@ import com.volmit.iris.engine.object.tile.TileData; import com.volmit.iris.engine.parallel.GridLock; import com.volmit.iris.engine.parallel.MultiBurst; import com.volmit.iris.util.format.C; -import com.volmit.iris.util.format.Form; import com.volmit.iris.util.math.M; import com.volmit.iris.util.oldnbt.ByteArrayTag; import com.volmit.iris.util.oldnbt.CompoundTag; import com.volmit.iris.util.oldnbt.Tag; -import com.volmit.iris.util.scheduling.PrecisionStopwatch; import org.bukkit.block.TileState; import org.bukkit.block.data.BlockData; @@ -167,7 +165,7 @@ public class ParallaxRegion extends HunkRegion { tileSlice.save(burst); updateSlice.save(burst); saveMetaHunk(); - Iris.debug("Saved Parallax Region "+ C.GOLD + getX() + " " + getZ()); + Iris.debug("Saved Parallax Region " + C.GOLD + getX() + " " + getZ()); super.save(); } diff --git a/src/main/java/com/volmit/iris/engine/parallel/MultiBurst.java b/src/main/java/com/volmit/iris/engine/parallel/MultiBurst.java index 32531d126..180372615 100644 --- a/src/main/java/com/volmit/iris/engine/parallel/MultiBurst.java +++ b/src/main/java/com/volmit/iris/engine/parallel/MultiBurst.java @@ -99,16 +99,11 @@ public class MultiBurst { public void shutdownAndAwait() { service.shutdown(); - try - { - while(!service.awaitTermination(10, TimeUnit.SECONDS)) - { + try { + while (!service.awaitTermination(10, TimeUnit.SECONDS)) { Iris.info("Still waiting to shutdown burster..."); } - } - - catch(Throwable e) - { + } catch (Throwable e) { e.printStackTrace(); Iris.reportError(e); } diff --git a/src/main/java/com/volmit/iris/util/exceptions/IrisException.java b/src/main/java/com/volmit/iris/util/exceptions/IrisException.java index 5062f3469..b6a70e696 100644 --- a/src/main/java/com/volmit/iris/util/exceptions/IrisException.java +++ b/src/main/java/com/volmit/iris/util/exceptions/IrisException.java @@ -18,8 +18,7 @@ package com.volmit.iris.util.exceptions; -public class IrisException extends Exception -{ +public class IrisException extends Exception { public IrisException() { super(); } diff --git a/src/main/java/com/volmit/iris/util/exceptions/MissingDimensionException.java b/src/main/java/com/volmit/iris/util/exceptions/MissingDimensionException.java index f8be9797c..28954faf5 100644 --- a/src/main/java/com/volmit/iris/util/exceptions/MissingDimensionException.java +++ b/src/main/java/com/volmit/iris/util/exceptions/MissingDimensionException.java @@ -18,8 +18,7 @@ package com.volmit.iris.util.exceptions; -public class MissingDimensionException extends IrisException -{ +public class MissingDimensionException extends IrisException { public MissingDimensionException() { super(); } diff --git a/src/main/java/com/volmit/iris/util/math/Position2.java b/src/main/java/com/volmit/iris/util/math/Position2.java index 93b17a101..bea71ea6c 100644 --- a/src/main/java/com/volmit/iris/util/math/Position2.java +++ b/src/main/java/com/volmit/iris/util/math/Position2.java @@ -43,8 +43,7 @@ public class Position2 { this.z = z; } - public String toString() - { + public String toString() { return "[" + x + "," + z + "]"; } @@ -57,8 +56,7 @@ public class Position2 { return result; } - public Position2 regionToChunk() - { + public Position2 regionToChunk() { return new Position2(x << 5, z << 5); } diff --git a/src/main/java/com/volmit/iris/util/scheduling/J.java b/src/main/java/com/volmit/iris/util/scheduling/J.java index 583492d51..614e4ebdf 100644 --- a/src/main/java/com/volmit/iris/util/scheduling/J.java +++ b/src/main/java/com/volmit/iris/util/scheduling/J.java @@ -27,7 +27,9 @@ import com.volmit.iris.util.function.NastyRunnable; import com.volmit.iris.util.math.FinalInteger; import org.bukkit.Bukkit; -import java.util.concurrent.*; +import java.util.concurrent.Callable; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Future; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; From 318a36a831ca6d47a6f467cf99f29ec0cc9ccab2 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 11:40:01 -0400 Subject: [PATCH 114/137] Only use hybrid headless if mca is enabled --- .../iris/core/pregenerator/methods/HybridPregenMethod.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java b/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java index 8720bf19e..bd843feb5 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/methods/HybridPregenMethod.java @@ -19,6 +19,7 @@ package com.volmit.iris.core.pregenerator.methods; import com.volmit.iris.Iris; +import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.pregenerator.PregenListener; import com.volmit.iris.core.pregenerator.PregeneratorMethod; import com.volmit.iris.core.tools.IrisWorlds; @@ -41,7 +42,7 @@ public class HybridPregenMethod implements PregeneratorMethod { } private boolean supportsHeadless(World world) { - return IrisWorlds.access(world) != null; + return IrisWorlds.access(world) != null && IrisSettings.get().getGenerator().isMcaPregenerator(); } @Override From eee2db8ad96f3070b7252f8c4179f5d5516018fc Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 11:52:36 -0400 Subject: [PATCH 115/137] Fix Decays --- src/main/java/com/volmit/iris/engine/data/B.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/com/volmit/iris/engine/data/B.java b/src/main/java/com/volmit/iris/engine/data/B.java index c32774bcb..b6d64d1a2 100644 --- a/src/main/java/com/volmit/iris/engine/data/B.java +++ b/src/main/java/com/volmit/iris/engine/data/B.java @@ -25,6 +25,7 @@ import com.volmit.iris.util.collection.KSet; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.type.Leaves; public class B { private static final Material AIR_MATERIAL = Material.AIR; @@ -142,6 +143,12 @@ public class B { } BlockData bx = Bukkit.createBlockData(ix); + + if(bx instanceof Leaves) + { + ((Leaves) bx).setPersistent(true); + } + blockDataCache.put(ix, bx); return bx; } catch (Throwable e) { From 6948d70d94dbba3a759373aa5e3ba9e7a71024a1 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 12:01:10 -0400 Subject: [PATCH 116/137] V+ --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index ec154ef2f..3d9ce0552 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { } group 'com.volmit.iris' -version '1.5.4' +version '1.5.5' def apiVersion = '1.17' def name = 'Iris' def main = 'com.volmit.iris.Iris' From fc47651c33f877f2a2a56df6ea474251ad82bb2c Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 13:28:17 -0400 Subject: [PATCH 117/137] Fix --- build.gradle | 2 ++ src/main/java/com/volmit/iris/util/io/IO.java | 9 ++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 3d9ce0552..7cffad103 100644 --- a/build.gradle +++ b/build.gradle @@ -81,6 +81,8 @@ shadowJar } } +manifest() + dependencies { compileOnly 'org.projectlombok:lombok:1.18.20' annotationProcessor 'org.projectlombok:lombok:1.18.20' diff --git a/src/main/java/com/volmit/iris/util/io/IO.java b/src/main/java/com/volmit/iris/util/io/IO.java index 2758b88fb..4021315bb 100644 --- a/src/main/java/com/volmit/iris/util/io/IO.java +++ b/src/main/java/com/volmit/iris/util/io/IO.java @@ -321,7 +321,14 @@ public class IO { } public static void writeAll(File f, Object c) throws IOException { - f.getParentFile().mkdirs(); + try { + f.getParentFile().mkdirs(); + } + catch(Throwable ignored) + { + + } + PrintWriter pw = new PrintWriter(new FileWriter(f)); pw.println(c.toString()); pw.close(); From 7e36cb76ba991a1be9357857535ea3395a688147 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 13:48:25 -0400 Subject: [PATCH 118/137] Lock accessors --- src/main/java/com/volmit/iris/util/scheduling/IrisLock.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/volmit/iris/util/scheduling/IrisLock.java b/src/main/java/com/volmit/iris/util/scheduling/IrisLock.java index bfc1cf36a..179ca93ed 100644 --- a/src/main/java/com/volmit/iris/util/scheduling/IrisLock.java +++ b/src/main/java/com/volmit/iris/util/scheduling/IrisLock.java @@ -20,10 +20,14 @@ package com.volmit.iris.util.scheduling; import com.volmit.iris.Iris; import lombok.Data; +import lombok.experimental.Accessors; import java.util.concurrent.locks.ReentrantLock; @Data +@Accessors( + chain = true +) public class IrisLock { private transient final ReentrantLock lock; private transient final String name; From 66d3eb340007c91cf20eeaab5ad472d00a57b437 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 13:48:34 -0400 Subject: [PATCH 119/137] Shutdown engine threads properly --- .../java/com/volmit/iris/engine/framework/EngineTarget.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineTarget.java b/src/main/java/com/volmit/iris/engine/framework/EngineTarget.java index 3083554aa..50c565c93 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineTarget.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineTarget.java @@ -51,4 +51,8 @@ public class EngineTarget { public EngineTarget(IrisWorld world, IrisDimension dimension, IrisDataManager data, int height, int threads) { this(world, dimension, data, height, false, threads); } + + public void close() { + burster.shutdownAndAwait(); + } } From 4e81a6af8377ef9ba04e3005d8dc1eb73c8c46d5 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 13:48:47 -0400 Subject: [PATCH 120/137] Don't interpolate slope --- src/main/java/com/volmit/iris/engine/IrisComplex.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/volmit/iris/engine/IrisComplex.java b/src/main/java/com/volmit/iris/engine/IrisComplex.java index 7dc54ac68..d5b838920 100644 --- a/src/main/java/com/volmit/iris/engine/IrisComplex.java +++ b/src/main/java/com/volmit/iris/engine/IrisComplex.java @@ -196,7 +196,7 @@ public class IrisComplex implements DataProvider { IrisBiome b = focus != null ? focus : baseBiomeStream.get(x, z); return getHeight(engine, b, x, z, engine.getWorld().seed()); }, Interpolated.DOUBLE).cache2D(cacheSize); - slopeStream = heightStream.slope(3).interpolate().bilinear(3, 3).cache2D(cacheSize); + slopeStream = heightStream.slope(3).cache2D(cacheSize); objectChanceStream = ProceduralStream.ofDouble((x, z) -> { if (engine.getDimension().hasFeatures(engine)) { AtomicDouble str = new AtomicDouble(1D); From 7fa45c065836f857d29b47820106700b93853874 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 14:27:36 -0400 Subject: [PATCH 121/137] Stop bounds enforcement --- .../com/volmit/iris/engine/hunk/Hunk.java | 22 ------------------- .../engine/hunk/view/ChunkDataHunkView.java | 1 - 2 files changed, 23 deletions(-) diff --git a/src/main/java/com/volmit/iris/engine/hunk/Hunk.java b/src/main/java/com/volmit/iris/engine/hunk/Hunk.java index 75798328e..695d37ae7 100644 --- a/src/main/java/com/volmit/iris/engine/hunk/Hunk.java +++ b/src/main/java/com/volmit/iris/engine/hunk/Hunk.java @@ -865,18 +865,6 @@ public interface Hunk { return this; } - default void enforceBounds(int x, int y, int z) { - if (x < 0 || x >= getWidth() || y < 0 || y >= getHeight() || z < 0 || z >= getDepth()) { - //Iris.warn(x + "," + y + "," + z + " does not fit within size " + getWidth() + "," + getHeight() + "," + getDepth() + " (0,0,0 to " + (getWidth() - 1) + "," + (getHeight() - 1) + "," + (getDepth() - 1) + ")"); - } - } - - default void enforceBounds(int x, int y, int z, int w, int h, int d) { - if (x < 0 || x >= getWidth() || y < 0 || y >= getHeight() || z < 0 || z >= getDepth() || x + w < 0 || x + w > getWidth() || y + h < 0 || y + h > getHeight() || z + d < 0 || z + d > getDepth()) { - //Iris.warn("The hunk " + w + "," + h + "," + d + " with an offset of " + x + "," + y + "," + z + " does not fit within the parent hunk " + getWidth() + "," + getHeight() + "," + getDepth() + " (0,0,0 to " + (getWidth() - 1) + "," + (getHeight() - 1) + "," + (getDepth() - 1) + ")"); - } - } - /** * Create a new hunk from a section of this hunk. * @@ -890,7 +878,6 @@ public interface Hunk { */ default ArrayHunk crop(int x1, int y1, int z1, int x2, int y2, int z2) { ArrayHunk h = new ArrayHunk(x2 - x1, y2 - y1, z2 - z1); - enforceBounds(x1, y1, z1, x2 - x1, y2 - y1, z2 - z1); for (int i = x1; i < x2; i++) { for (int j = y1; j < y2; j++) { @@ -916,7 +903,6 @@ public interface Hunk { * @return the cropped view of this hunk (x2-x1, y2-y1, z2-z1) */ default Hunk croppedView(int x1, int y1, int z1, int x2, int y2, int z2) { - enforceBounds(x1, y1, z1, x2 - x1, y2 - y1, z2 - z1); return new HunkView(this, x2 - x1, y2 - y1, z2 - z1, x1, y1, z1); } @@ -947,7 +933,6 @@ public interface Hunk { * @param t the value to set */ default void set(int x1, int y1, int z1, int x2, int y2, int z2, T t) { - enforceBounds(x1, y1, z1, x2 - x1, y2 - y1, z2 - z1); for (int i = x1; i <= x2; i++) { for (int j = y1; j <= y2; j++) { for (int k = z1; k <= z2; k++) { @@ -1036,7 +1021,6 @@ public interface Hunk { * @param t the value */ default void set(int x, int y, int z, T t) { - enforceBounds(x, y, z); setRaw(x, y, z, t); } @@ -1089,12 +1073,10 @@ public interface Hunk { * @return the value or null */ default T get(int x, int y, int z) { - enforceBounds(x, y, z); return getRaw(x, y, z); } default T getOr(int x, int y, int z, T t) { - enforceBounds(x, y, z); T v = getRaw(x, y, z); if (v == null) { @@ -1161,8 +1143,6 @@ public interface Hunk { * @param invertY should the inserted hunk be inverted */ default void insert(int offX, int offY, int offZ, Hunk hunk, boolean invertY) { - enforceBounds(offX, offY, offZ, hunk.getWidth(), hunk.getHeight(), hunk.getDepth()); - for (int i = offX; i < offX + hunk.getWidth(); i++) { for (int j = offY; j < offY + hunk.getHeight(); j++) { for (int k = offZ; k < offZ + hunk.getDepth(); k++) { @@ -1183,8 +1163,6 @@ public interface Hunk { * @param invertY should the inserted hunk be inverted */ default void insertSoftly(int offX, int offY, int offZ, Hunk hunk, boolean invertY, Predicate shouldOverwrite) { - enforceBounds(offX, offY, offZ, hunk.getWidth(), hunk.getHeight(), hunk.getDepth()); - for (int i = offX; i < offX + hunk.getWidth(); i++) { for (int j = offY; j < offY + hunk.getHeight(); j++) { for (int k = offZ; k < offZ + hunk.getDepth(); k++) { diff --git a/src/main/java/com/volmit/iris/engine/hunk/view/ChunkDataHunkView.java b/src/main/java/com/volmit/iris/engine/hunk/view/ChunkDataHunkView.java index 6911a956d..c236fa422 100644 --- a/src/main/java/com/volmit/iris/engine/hunk/view/ChunkDataHunkView.java +++ b/src/main/java/com/volmit/iris/engine/hunk/view/ChunkDataHunkView.java @@ -51,7 +51,6 @@ public class ChunkDataHunkView implements Hunk { return; } - enforceBounds(x1, y1, z1, x2 - x1, y2 - y1, z2 - z1); chunk.setRegion(x1, y1, z1, x2, y2, z2, t); } From 509c32db70f8628dd7fb6832d2f668545474a007 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 14:27:45 -0400 Subject: [PATCH 122/137] Close engine targets on shutdown --- src/main/java/com/volmit/iris/engine/IrisEngine.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/volmit/iris/engine/IrisEngine.java b/src/main/java/com/volmit/iris/engine/IrisEngine.java index c3e947c94..6938638dd 100644 --- a/src/main/java/com/volmit/iris/engine/IrisEngine.java +++ b/src/main/java/com/volmit/iris/engine/IrisEngine.java @@ -132,6 +132,7 @@ public class IrisEngine extends BlockPopulator implements Engine { closed = true; getWorldManager().close(); getFramework().close(); + getTarget().close(); } @Override From 72f86069a2c1c656eec74e2752da2e5431cea83a Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 14:27:59 -0400 Subject: [PATCH 123/137] Dont lock objects (for now) --- .../volmit/iris/engine/object/IrisObject.java | 163 ++++++++++-------- 1 file changed, 88 insertions(+), 75 deletions(-) diff --git a/src/main/java/com/volmit/iris/engine/object/IrisObject.java b/src/main/java/com/volmit/iris/engine/object/IrisObject.java index 7c03c7847..aa02db2ee 100644 --- a/src/main/java/com/volmit/iris/engine/object/IrisObject.java +++ b/src/main/java/com/volmit/iris/engine/object/IrisObject.java @@ -44,6 +44,7 @@ import org.bukkit.block.TileState; import org.bukkit.block.data.BlockData; import org.bukkit.block.data.Waterlogged; import org.bukkit.block.data.type.Leaves; +import org.bukkit.entity.ThrownExpBottle; import org.bukkit.util.BlockVector; import org.bukkit.util.Vector; @@ -67,7 +68,7 @@ public class IrisObject extends IrisRegistrant { private int w; private int d; private int h; - private transient final IrisLock readLock = new IrisLock("read-conclock"); + private transient final IrisLock readLock = new IrisLock("read-conclock").setDisabled(true); private transient BlockVector center; private transient volatile boolean smartBored = false; private transient IrisLock lock = new IrisLock("Preloadcache"); @@ -577,97 +578,109 @@ public class IrisObject extends IrisRegistrant { int lowest = Integer.MAX_VALUE; y += yrand; readLock.lock(); - for (BlockVector g : getBlocks().keySet()) { - BlockData d; - TileData tile = null; + try + { + for (BlockVector g : getBlocks().keySet()) { + BlockData d; + TileData tile = null; - try { - d = getBlocks().get(g); - tile = getStates().get(g); - } catch (Throwable e) { - Iris.reportError(e); - Iris.warn("Failed to read block node " + g.getBlockX() + "," + g.getBlockY() + "," + g.getBlockZ() + " in object " + getLoadKey() + " (cme)"); - d = AIR; - } + try { + d = getBlocks().get(g); + tile = getStates().get(g); + } catch (Throwable e) { + Iris.reportError(e); + Iris.warn("Failed to read block node " + g.getBlockX() + "," + g.getBlockY() + "," + g.getBlockZ() + " in object " + getLoadKey() + " (cme)"); + d = AIR; + } - if (d == null) { - Iris.warn("Failed to read block node " + g.getBlockX() + "," + g.getBlockY() + "," + g.getBlockZ() + " in object " + getLoadKey() + " (null)"); - d = AIR; - } + if (d == null) { + Iris.warn("Failed to read block node " + g.getBlockX() + "," + g.getBlockY() + "," + g.getBlockZ() + " in object " + getLoadKey() + " (null)"); + d = AIR; + } - BlockVector i = g.clone(); - BlockData data = d.clone(); - i = config.getRotation().rotate(i.clone(), spinx, spiny, spinz).clone(); - i = config.getTranslate().translate(i.clone(), config.getRotation(), spinx, spiny, spinz).clone(); + BlockVector i = g.clone(); + BlockData data = d.clone(); + i = config.getRotation().rotate(i.clone(), spinx, spiny, spinz).clone(); + i = config.getTranslate().translate(i.clone(), config.getRotation(), spinx, spiny, spinz).clone(); - if (stilting && i.getBlockY() < lowest && !B.isAir(data)) { - lowest = i.getBlockY(); - } + if (stilting && i.getBlockY() < lowest && !B.isAir(data)) { + lowest = i.getBlockY(); + } - if (placer.isPreventingDecay() && (data) instanceof Leaves && !((Leaves) (data)).isPersistent()) { - ((Leaves) data).setPersistent(true); - } + if (placer.isPreventingDecay() && (data) instanceof Leaves && !((Leaves) (data)).isPersistent()) { + ((Leaves) data).setPersistent(true); + } - for (IrisObjectReplace j : config.getEdit()) { - if (rng.chance(j.getChance())) { - for (BlockData k : j.getFind(rdata)) { - if (j.isExact() ? k.matches(data) : k.getMaterial().equals(data.getMaterial())) { - BlockData newData = j.getReplace(rng, i.getX() + x, i.getY() + y, i.getZ() + z, rdata).clone(); + for (IrisObjectReplace j : config.getEdit()) { + if (rng.chance(j.getChance())) { + for (BlockData k : j.getFind(rdata)) { + if (j.isExact() ? k.matches(data) : k.getMaterial().equals(data.getMaterial())) { + BlockData newData = j.getReplace(rng, i.getX() + x, i.getY() + y, i.getZ() + z, rdata).clone(); - if (newData.getMaterial() == data.getMaterial()) - data = data.merge(newData); - else - data = newData; + if (newData.getMaterial() == data.getMaterial()) + { + data = data.merge(newData); + } + else + { + data = newData; + } + } } } } - } - data = config.getRotation().rotate(data, spinx, spiny, spinz); - xx = x + (int) Math.round(i.getX()); - int yy = y + (int) Math.round(i.getY()); - zz = z + (int) Math.round(i.getZ()); + data = config.getRotation().rotate(data, spinx, spiny, spinz); + xx = x + (int) Math.round(i.getX()); + int yy = y + (int) Math.round(i.getY()); + zz = z + (int) Math.round(i.getZ()); - if (warped) { - xx += config.warp(rng, i.getX() + x, i.getY() + y, i.getZ() + z); - zz += config.warp(rng, i.getZ() + z, i.getY() + y, i.getX() + x); - } - - if (yv < 0 && (config.getMode().equals(ObjectPlaceMode.PAINT))) { - yy = (int) Math.round(i.getY()) + Math.floorDiv(h, 2) + placer.getHighest(xx, zz, config.isUnderwater()); - } - - if (heightmap != null) { - Position2 pos = new Position2(xx, zz); - - if (!heightmap.containsKey(pos)) { - heightmap.put(pos, yy); + if (warped) { + xx += config.warp(rng, i.getX() + x, i.getY() + y, i.getZ() + z); + zz += config.warp(rng, i.getZ() + z, i.getY() + y, i.getX() + x); } - if (heightmap.get(pos) < yy) { - heightmap.put(pos, yy); + if (yv < 0 && (config.getMode().equals(ObjectPlaceMode.PAINT))) { + yy = (int) Math.round(i.getY()) + Math.floorDiv(h, 2) + placer.getHighest(xx, zz, config.isUnderwater()); + } + + if (heightmap != null) { + Position2 pos = new Position2(xx, zz); + + if (!heightmap.containsKey(pos)) { + heightmap.put(pos, yy); + } + + if (heightmap.get(pos) < yy) { + heightmap.put(pos, yy); + } + } + + if (config.isMeld() && !placer.isSolid(xx, yy, zz)) { + continue; + } + + if (config.isWaterloggable() && yy <= placer.getFluidHeight() && data instanceof Waterlogged) { + ((Waterlogged) data).setWaterlogged(true); + } + + if (listener != null) { + listener.accept(new BlockPosition(xx, yy, zz)); + } + + if (!data.getMaterial().equals(Material.AIR) && !data.getMaterial().equals(Material.CAVE_AIR)) { + placer.set(xx, yy, zz, data); + + if (tile != null) { + placer.setTile(xx, yy, zz, tile); + } } } + } - if (config.isMeld() && !placer.isSolid(xx, yy, zz)) { - continue; - } - - if (config.isWaterloggable() && yy <= placer.getFluidHeight() && data instanceof Waterlogged) { - ((Waterlogged) data).setWaterlogged(true); - } - - if (listener != null) { - listener.accept(new BlockPosition(xx, yy, zz)); - } - - if (!data.getMaterial().equals(Material.AIR) && !data.getMaterial().equals(Material.CAVE_AIR)) { - placer.set(xx, yy, zz, data); - - if (tile != null) { - placer.setTile(xx, yy, zz, tile); - } - } + catch(Throwable e) + { + Iris.reportError(e); } readLock.unlock(); From 0ae7b9c120f50112d792dda73210a7b1e9635f5c Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Jul 2021 14:28:06 -0400 Subject: [PATCH 124/137] A Friendly reminder... --- .../iris/engine/hunk/io/HunkRegionSlice.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/main/java/com/volmit/iris/engine/hunk/io/HunkRegionSlice.java b/src/main/java/com/volmit/iris/engine/hunk/io/HunkRegionSlice.java index b1de49443..08c2fac94 100644 --- a/src/main/java/com/volmit/iris/engine/hunk/io/HunkRegionSlice.java +++ b/src/main/java/com/volmit/iris/engine/hunk/io/HunkRegionSlice.java @@ -39,6 +39,40 @@ import org.bukkit.block.data.BlockData; import java.io.IOException; import java.util.concurrent.atomic.AtomicReference; +// TODO: THIS IS SO SLOW +// TODO: THIS IS SO SLOW +// TODO: THIS IS SO SLOW +// TODO: THIS IS SO SLOW +// TODO: THIS IS SO SLOW +// TODO: THIS IS SO SLOW +// TODO: THIS IS SO SLOW +// TODO: THIS IS SO SLOW +// TODO: THIS IS SO SLOW +// TODO: THIS IS SO SLOW +// TODO: THIS IS SO SLOW +// TODO: THIS IS SO SLOW +// TODO: THIS IS SO SLOW +// TODO: THIS IS SO SLOW +// TODO: THIS IS SO SLOW +// TODO: THIS IS SO SLOW +// TODO: THIS IS SO SLOW +// TODO: THIS IS SO SLOW +// TODO: THIS IS SO SLOW +// TODO: THIS IS SO SLOW +// TODO: THIS IS SO SLOW +// TODO: THIS IS SO SLOW +// TODO: THIS IS SO SLOW +// TODO: THIS IS SO SLOW +// TODO: THIS IS SO SLOW +// TODO: THIS IS SO SLOW +// TODO: THIS IS SO SLOW +// TODO: THIS IS SO SLOW +// TODO: THIS IS SO SLOW +// TODO: THIS IS SO SLOW +// TODO: THIS IS SO SLOW +// TODO: THIS IS SO SLOW +// TODO: THIS IS SO SLOW +// TODO: THIS IS SO SLOW public class HunkRegionSlice { public static final Function2> BLOCKDATA = (h, c) -> new HunkRegionSlice<>(h, Hunk::newMappedHunkSynced, new BlockDataHunkIOAdapter(), c, "blockdata"); From df4040a96ac49e34372d2f5d496b3e54e8fb6824 Mon Sep 17 00:00:00 2001 From: CocoTheOwner Date: Tue, 20 Jul 2021 21:50:33 +0200 Subject: [PATCH 125/137] Fix sender.player() call without checking if player --- src/main/java/com/volmit/iris/core/IrisProject.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/volmit/iris/core/IrisProject.java b/src/main/java/com/volmit/iris/core/IrisProject.java index fa091e065..446bb3013 100644 --- a/src/main/java/com/volmit/iris/core/IrisProject.java +++ b/src/main/java/com/volmit/iris/core/IrisProject.java @@ -273,8 +273,9 @@ public class IrisProject { break; } } - - sender.player().spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(C.WHITE + "Generation Complete")); + if (sender.isPlayer()) { + sender.player().spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(C.WHITE + "Generation Complete")); + } }); //@builder From 3ba3e5cf764568afdf3d02e15f6f8958503027e9 Mon Sep 17 00:00:00 2001 From: CocoTheOwner Date: Tue, 20 Jul 2021 22:04:21 +0200 Subject: [PATCH 126/137] Fix NPE by checking if null before calling on it. --- .../volmit/iris/engine/framework/EngineCompositeGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java b/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java index b7c21ff6e..4e96e8f03 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java @@ -132,7 +132,7 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce } public void tick() { - if (isClosed()) { + if (getComposite() == null || isClosed()) { return; } From 9c6c27909ddd6df75dc48ecdfe57a748ee1901be Mon Sep 17 00:00:00 2001 From: CocoTheOwner Date: Tue, 20 Jul 2021 23:29:10 +0200 Subject: [PATCH 127/137] Improve some info logs --- .../com/volmit/iris/core/command/world/CommandIrisPregen.java | 2 +- src/main/java/com/volmit/iris/util/scheduling/Looper.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java b/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java index 52c7bca0e..e01eabde8 100644 --- a/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java +++ b/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java @@ -74,7 +74,7 @@ public class CommandIrisPregen extends MortarCommand { if (args[0].equalsIgnoreCase("stop") || args[0].equalsIgnoreCase("x")) { if (PregeneratorJob.shutdownInstance()) { - sender.sendMessage("Stopped Pregen."); + sender.sendMessage("Stopped Pregen. Finishing last region file before shutting down..."); } else { sender.sendMessage("No Active Pregens."); } diff --git a/src/main/java/com/volmit/iris/util/scheduling/Looper.java b/src/main/java/com/volmit/iris/util/scheduling/Looper.java index 6cc9cbcc5..18ac78649 100644 --- a/src/main/java/com/volmit/iris/util/scheduling/Looper.java +++ b/src/main/java/com/volmit/iris/util/scheduling/Looper.java @@ -42,7 +42,7 @@ public abstract class Looper extends Thread { } } - Iris.info("Thread " + getName() + " Shutdown."); + Iris.info("Thread " + getName() + " Shutdown. Pregen stopped / finished."); } protected abstract long loop(); From 8f57364547a0e907957fe8734a9d239e0059a615 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Wed, 21 Jul 2021 08:09:57 -0400 Subject: [PATCH 128/137] Verify MCA Chunks --- .../volmit/iris/core/command/CommandIris.java | 3 + .../core/command/world/CommandIrisVerify.java | 104 ++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 src/main/java/com/volmit/iris/core/command/world/CommandIrisVerify.java diff --git a/src/main/java/com/volmit/iris/core/command/CommandIris.java b/src/main/java/com/volmit/iris/core/command/CommandIris.java index 16bde75eb..d69aa10e3 100644 --- a/src/main/java/com/volmit/iris/core/command/CommandIris.java +++ b/src/main/java/com/volmit/iris/core/command/CommandIris.java @@ -33,6 +33,9 @@ public class CommandIris extends MortarCommand { @Command private CommandIrisCreate create; + @Command + private CommandIrisVerify verify; + @Command private CommandIrisFix fix; diff --git a/src/main/java/com/volmit/iris/core/command/world/CommandIrisVerify.java b/src/main/java/com/volmit/iris/core/command/world/CommandIrisVerify.java new file mode 100644 index 000000000..ab0f56e02 --- /dev/null +++ b/src/main/java/com/volmit/iris/core/command/world/CommandIrisVerify.java @@ -0,0 +1,104 @@ +/* + * 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.core.command.world; + +import com.volmit.iris.Iris; +import com.volmit.iris.core.tools.IrisWorlds; +import com.volmit.iris.engine.data.mca.Chunk; +import com.volmit.iris.engine.data.mca.MCAFile; +import com.volmit.iris.engine.data.mca.MCAUtil; +import com.volmit.iris.engine.framework.IrisAccess; +import com.volmit.iris.engine.parallel.BurstExecutor; +import com.volmit.iris.engine.parallel.MultiBurst; +import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.collection.KSet; +import com.volmit.iris.util.format.Form; +import com.volmit.iris.util.math.Position2; +import com.volmit.iris.util.math.Spiraler; +import com.volmit.iris.util.plugin.MortarCommand; +import com.volmit.iris.util.plugin.VolmitSender; +import com.volmit.iris.util.scheduling.J; + +import java.io.File; +import java.io.IOException; +import java.util.concurrent.atomic.AtomicInteger; + +public class CommandIrisVerify extends MortarCommand { + public CommandIrisVerify() { + super("verifymca"); + requiresPermission(Iris.perm.studio); + setDescription("Fix nearby chunks"); + setCategory("Studio"); + } + + @Override + public void addTabOptions(VolmitSender sender, String[] args, KList list) { + + } + + @Override + public boolean handle(VolmitSender sender, String[] args) { + try { + IrisAccess a = IrisWorlds.access(sender.player().getWorld()); + File folder = a.getTarget().getWorld().worldFolder(); + File r = new File(folder, "region"); + BurstExecutor e = MultiBurst.burst.burst(r.listFiles().length); + AtomicInteger f = new AtomicInteger(0); + for(File i : r.listFiles()) + { + e.queue(() -> { + MCAFile file = null; + try { + file = MCAUtil.read(i); + int rx = Integer.valueOf(i.getName().split("\\Q.\\E")[1]); + int rz = Integer.valueOf(i.getName().split("\\Q.\\E")[2]); + for(int j = 0; j < 32; j++) + { + for(int k = 0; k < 32; k++) + { + f.incrementAndGet(); + Chunk c = file.getChunk(j, k); + if(c == null) + { + sender.sendMessage("Found Missing Chunk " + i.getName() + ", chunk #" + j + "," + k + " (see " + (((rx << 5)<<4)+(j<<4)) + "," + (((rz << 5)<<4)+(k<<4))); + } + } + } + } catch (IOException ioException) { + ioException.printStackTrace(); + sender.sendMessage("Error loading region " + i.getName()); + } + }); + } + + e.complete(); + sender.sendMessage("Done! Checked " + f.get() + " chunks"); + } catch (Throwable e) { + Iris.reportError(e); + sender.sendMessage("Not a valid Iris World (or bad argument)"); + } + + return true; + } + + @Override + protected String getArgsUsage() { + return "[view-distance]"; + } +} From c5262f188e5de8e35329d86bff587b4dfbb8390d Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Wed, 21 Jul 2021 08:10:11 -0400 Subject: [PATCH 129/137] Fix JVM Warnings --- src/main/java/com/volmit/iris/util/io/IO.java | 3 +++ .../java/com/volmit/iris/util/json/JSONArray.java | 12 ++++++------ .../java/com/volmit/iris/util/json/JSONObject.java | 8 ++++---- .../java/com/volmit/iris/util/json/JSONWriter.java | 2 +- src/main/java/com/volmit/iris/util/json/XML.java | 4 ++-- src/main/java/com/volmit/iris/util/math/Tuple3d.java | 10 +++++++++- src/main/java/com/volmit/iris/util/math/Tuple4d.java | 9 +++++++++ 7 files changed, 34 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/volmit/iris/util/io/IO.java b/src/main/java/com/volmit/iris/util/io/IO.java index 4021315bb..46f626eb9 100644 --- a/src/main/java/com/volmit/iris/util/io/IO.java +++ b/src/main/java/com/volmit/iris/util/io/IO.java @@ -635,6 +635,7 @@ public class IO { * @return the requested byte array * @deprecated Use {@link String#getBytes()} */ + @Deprecated public static byte[] toByteArray(String input) { return input.getBytes(); } @@ -770,6 +771,7 @@ public class IO { * @return the requested String * @deprecated Use {@link String#String(byte[])} */ + @Deprecated public static String toString(byte[] input) { return new String(input); } @@ -788,6 +790,7 @@ public class IO { * @throws IOException if an I/O error occurs (never occurs) * @deprecated Use {@link String#String(byte[], String)} */ + @Deprecated public static String toString(byte[] input, String encoding) throws IOException { if (encoding == null) { return new String(input); diff --git a/src/main/java/com/volmit/iris/util/json/JSONArray.java b/src/main/java/com/volmit/iris/util/json/JSONArray.java index 9fff59f9f..170f9c547 100644 --- a/src/main/java/com/volmit/iris/util/json/JSONArray.java +++ b/src/main/java/com/volmit/iris/util/json/JSONArray.java @@ -697,7 +697,7 @@ public class JSONArray implements Iterable { * @throws JSONException if the value is not finite. */ public JSONArray put(double value) throws JSONException { - Double d = new Double(value); + Double d = Double.valueOf(value); JSONObject.testValidity(d); this.put(d); return this; @@ -710,7 +710,7 @@ public class JSONArray implements Iterable { * @return this. */ public JSONArray put(int value) { - this.put(new Integer(value)); + this.put(Integer.valueOf(value)); return this; } @@ -721,7 +721,7 @@ public class JSONArray implements Iterable { * @return this. */ public JSONArray put(long value) { - this.put(new Long(value)); + this.put(Long.valueOf(value)); return this; } @@ -790,7 +790,7 @@ public class JSONArray implements Iterable { * @throws JSONException If the index is negative or if the value is not finite. */ public JSONArray put(int index, double value) throws JSONException { - this.put(index, new Double(value)); + this.put(index, Double.valueOf(value)); return this; } @@ -805,7 +805,7 @@ public class JSONArray implements Iterable { * @throws JSONException If the index is negative. */ public JSONArray put(int index, int value) throws JSONException { - this.put(index, new Integer(value)); + this.put(index, Integer.valueOf(value)); return this; } @@ -820,7 +820,7 @@ public class JSONArray implements Iterable { * @throws JSONException If the index is negative. */ public JSONArray put(int index, long value) throws JSONException { - this.put(index, new Long(value)); + this.put(index, Long.valueOf(value)); return this; } diff --git a/src/main/java/com/volmit/iris/util/json/JSONObject.java b/src/main/java/com/volmit/iris/util/json/JSONObject.java index 9d4501245..440a36a28 100644 --- a/src/main/java/com/volmit/iris/util/json/JSONObject.java +++ b/src/main/java/com/volmit/iris/util/json/JSONObject.java @@ -1115,7 +1115,7 @@ public class JSONObject { * @throws JSONException If the key is null or if the number is invalid. */ public JSONObject put(String key, double value) throws JSONException { - this.put(key, new Double(value)); + this.put(key, Double.valueOf(value)); return this; } @@ -1128,7 +1128,7 @@ public class JSONObject { * @throws JSONException If the key is null. */ public JSONObject put(String key, int value) throws JSONException { - this.put(key, new Integer(value)); + this.put(key, Integer.valueOf(value)); return this; } @@ -1141,7 +1141,7 @@ public class JSONObject { * @throws JSONException If the key is null. */ public JSONObject put(String key, long value) throws JSONException { - this.put(key, new Long(value)); + this.put(key, Long.valueOf(value)); return this; } @@ -1389,7 +1389,7 @@ public class JSONObject { return d; } } else { - Long myLong = new Long(string); + Long myLong = Long.valueOf(string); if (string.equals(myLong.toString())) { if (myLong == myLong.intValue()) { return myLong.intValue(); diff --git a/src/main/java/com/volmit/iris/util/json/JSONWriter.java b/src/main/java/com/volmit/iris/util/json/JSONWriter.java index e359c3854..b45cceb46 100644 --- a/src/main/java/com/volmit/iris/util/json/JSONWriter.java +++ b/src/main/java/com/volmit/iris/util/json/JSONWriter.java @@ -301,7 +301,7 @@ public class JSONWriter { * @throws JSONException If the number is not finite. */ public JSONWriter value(double d) throws JSONException { - return this.value(new Double(d)); + return this.value(Double.valueOf(d)); } /** diff --git a/src/main/java/com/volmit/iris/util/json/XML.java b/src/main/java/com/volmit/iris/util/json/XML.java index 8b4b057cc..50be36dc8 100644 --- a/src/main/java/com/volmit/iris/util/json/XML.java +++ b/src/main/java/com/volmit/iris/util/json/XML.java @@ -318,7 +318,7 @@ public class XML { try { char initial = string.charAt(0); if (initial == '-' || (initial >= '0' && initial <= '9')) { - Long value = new Long(string); + Long value = Long.valueOf(string); if (value.toString().equals(string)) { return value; } @@ -326,7 +326,7 @@ public class XML { } catch (Exception ignore) { Iris.reportError(ignore); try { - Double value = new Double(string); + Double value = Double.valueOf(string); if (value.toString().equals(string)) { return value; } diff --git a/src/main/java/com/volmit/iris/util/math/Tuple3d.java b/src/main/java/com/volmit/iris/util/math/Tuple3d.java index e3c4456fa..3138e1d7c 100644 --- a/src/main/java/com/volmit/iris/util/math/Tuple3d.java +++ b/src/main/java/com/volmit/iris/util/math/Tuple3d.java @@ -288,6 +288,7 @@ public abstract class Tuple3d implements java.io.Serializable, Cloneable { /** * @deprecated Use scaleAdd(double,Tuple3d) instead */ + @Deprecated public final void scaleAdd(double s, Tuple3f t1) { scaleAdd(s, new Point3d(t1)); } @@ -402,6 +403,7 @@ public abstract class Tuple3d implements java.io.Serializable, Cloneable { /** * @deprecated Use clamp(double,double,Tuple3d) instead */ + @Deprecated public final void clamp(float min, float max, Tuple3d t) { clamp(min, (double) max, t); } @@ -434,6 +436,7 @@ public abstract class Tuple3d implements java.io.Serializable, Cloneable { /** * @deprecated Use clampMin(double,Tuple3d) instead */ + @Deprecated public final void clampMin(float min, Tuple3d t) { clampMin((double) min, t); } @@ -459,6 +462,7 @@ public abstract class Tuple3d implements java.io.Serializable, Cloneable { /** * @deprecated Use clampMax(double,Tuple3d) instead */ + @Deprecated public final void clampMax(float max, Tuple3d t) { clampMax((double) max, t); } @@ -498,6 +502,7 @@ public abstract class Tuple3d implements java.io.Serializable, Cloneable { /** * @deprecated Use clamp(double,double) instead */ + @Deprecated public final void clamp(float min, float max) { clamp(min, (double) max); } @@ -534,6 +539,7 @@ public abstract class Tuple3d implements java.io.Serializable, Cloneable { /** * @deprecated Use clampMin(double) instead */ + @Deprecated public final void clampMin(float min) { clampMin((double) min); } @@ -548,13 +554,13 @@ public abstract class Tuple3d implements java.io.Serializable, Cloneable { if (x < min) x = min; if (y < min) y = min; if (z < min) z = min; - } /** * @deprecated Use clampMax(double) instead */ + @Deprecated public final void clampMax(float max) { clampMax((double) max); } @@ -585,6 +591,7 @@ public abstract class Tuple3d implements java.io.Serializable, Cloneable { /** * @deprecated Use interpolate(Tuple3d,Tuple3d,double) instead */ + @Deprecated public final void interpolate(Tuple3d t1, Tuple3d t2, float alpha) { interpolate(t1, t2, (double) alpha); } @@ -608,6 +615,7 @@ public abstract class Tuple3d implements java.io.Serializable, Cloneable { /** * @deprecated Use interpolate(Tuple3d,double) instead */ + @Deprecated public final void interpolate(Tuple3d t1, float alpha) { interpolate(t1, (double) alpha); } diff --git a/src/main/java/com/volmit/iris/util/math/Tuple4d.java b/src/main/java/com/volmit/iris/util/math/Tuple4d.java index 437f85689..16d288205 100644 --- a/src/main/java/com/volmit/iris/util/math/Tuple4d.java +++ b/src/main/java/com/volmit/iris/util/math/Tuple4d.java @@ -328,6 +328,7 @@ public abstract class Tuple4d implements java.io.Serializable, Cloneable { /** * @deprecated Use scaleAdd(double,Tuple4d) instead */ + @Deprecated public final void scaleAdd(float s, Tuple4d t1) { scaleAdd((double) s, t1); } @@ -452,6 +453,7 @@ public abstract class Tuple4d implements java.io.Serializable, Cloneable { /** * @deprecated Use clamp(double,double,Tuple4d) instead */ + @Deprecated public final void clamp(float min, float max, Tuple4d t) { clamp(min, (double) max, t); } @@ -488,6 +490,7 @@ public abstract class Tuple4d implements java.io.Serializable, Cloneable { /** * @deprecated Use clampMin(double,Tuple4d) instead */ + @Deprecated public final void clampMin(float min, Tuple4d t) { clampMin((double) min, t); } @@ -515,6 +518,7 @@ public abstract class Tuple4d implements java.io.Serializable, Cloneable { /** * @deprecated Use clampMax(double,Tuple4d) instead */ + @Deprecated public final void clampMax(float max, Tuple4d t) { clampMax((double) max, t); } @@ -561,6 +565,7 @@ public abstract class Tuple4d implements java.io.Serializable, Cloneable { /** * @deprecated Use clamp(double,double) instead */ + @Deprecated public final void clamp(float min, float max) { clamp(min, (double) max); } @@ -603,6 +608,7 @@ public abstract class Tuple4d implements java.io.Serializable, Cloneable { /** * @deprecated Use clampMin(double) instead */ + @Deprecated public final void clampMin(float min) { clampMin((double) min); } @@ -624,6 +630,7 @@ public abstract class Tuple4d implements java.io.Serializable, Cloneable { /** * @deprecated Use clampMax(double) instead */ + @Deprecated public final void clampMax(float max) { clampMax((double) max); } @@ -658,6 +665,7 @@ public abstract class Tuple4d implements java.io.Serializable, Cloneable { /** * @deprecated Use interpolate(Tuple4d,Tuple4d,double) instead */ + @Deprecated public void interpolate(Tuple4d t1, Tuple4d t2, float alpha) { interpolate(t1, t2, (double) alpha); } @@ -682,6 +690,7 @@ public abstract class Tuple4d implements java.io.Serializable, Cloneable { /** * @deprecated Use interpolate(Tuple4d,double) instead */ + @Deprecated public void interpolate(Tuple4d t1, float alpha) { interpolate(t1, (double) alpha); } From cde9dbe4061f1a2705969060906892e3e32646c4 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Wed, 21 Jul 2021 08:10:26 -0400 Subject: [PATCH 130/137] Fix parallax issues --- .../iris/engine/hunk/io/HunkRegionSlice.java | 169 ++++++------------ .../volmit/iris/engine/object/IrisObject.java | 2 +- .../iris/engine/parallax/ParallaxWorld.java | 27 ++- 3 files changed, 72 insertions(+), 126 deletions(-) diff --git a/src/main/java/com/volmit/iris/engine/hunk/io/HunkRegionSlice.java b/src/main/java/com/volmit/iris/engine/hunk/io/HunkRegionSlice.java index 08c2fac94..7d1632d5f 100644 --- a/src/main/java/com/volmit/iris/engine/hunk/io/HunkRegionSlice.java +++ b/src/main/java/com/volmit/iris/engine/hunk/io/HunkRegionSlice.java @@ -22,7 +22,6 @@ import com.volmit.iris.Iris; import com.volmit.iris.engine.hunk.Hunk; import com.volmit.iris.engine.object.tile.TileData; import com.volmit.iris.engine.parallel.BurstExecutor; -import com.volmit.iris.engine.parallel.GridLock; import com.volmit.iris.engine.parallel.MultiBurst; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; @@ -39,48 +38,13 @@ import org.bukkit.block.data.BlockData; import java.io.IOException; import java.util.concurrent.atomic.AtomicReference; -// TODO: THIS IS SO SLOW -// TODO: THIS IS SO SLOW -// TODO: THIS IS SO SLOW -// TODO: THIS IS SO SLOW -// TODO: THIS IS SO SLOW -// TODO: THIS IS SO SLOW -// TODO: THIS IS SO SLOW -// TODO: THIS IS SO SLOW -// TODO: THIS IS SO SLOW -// TODO: THIS IS SO SLOW -// TODO: THIS IS SO SLOW -// TODO: THIS IS SO SLOW -// TODO: THIS IS SO SLOW -// TODO: THIS IS SO SLOW -// TODO: THIS IS SO SLOW -// TODO: THIS IS SO SLOW -// TODO: THIS IS SO SLOW -// TODO: THIS IS SO SLOW -// TODO: THIS IS SO SLOW -// TODO: THIS IS SO SLOW -// TODO: THIS IS SO SLOW -// TODO: THIS IS SO SLOW -// TODO: THIS IS SO SLOW -// TODO: THIS IS SO SLOW -// TODO: THIS IS SO SLOW -// TODO: THIS IS SO SLOW -// TODO: THIS IS SO SLOW -// TODO: THIS IS SO SLOW -// TODO: THIS IS SO SLOW -// TODO: THIS IS SO SLOW -// TODO: THIS IS SO SLOW -// TODO: THIS IS SO SLOW -// TODO: THIS IS SO SLOW -// TODO: THIS IS SO SLOW public class HunkRegionSlice { - public static final Function2> BLOCKDATA = (h, c) -> new HunkRegionSlice<>(h, Hunk::newMappedHunkSynced, new BlockDataHunkIOAdapter(), c, "blockdata"); - public static final Function2>> TILE = (h, c) -> new HunkRegionSlice<>(h, Hunk::newMappedHunkSynced, new TileDataHunkIOAdapter(), c, "tile"); - public static final Function3> STRING = (h, c, t) -> new HunkRegionSlice<>(h, Hunk::newMappedHunkSynced, new StringHunkIOAdapter(), c, t); - public static final Function3> BOOLEAN = (h, c, t) -> new HunkRegionSlice<>(h, Hunk::newMappedHunkSynced, new BooleanHunkIOAdapter(), c, t); + public static final Function2> BLOCKDATA = (h, c) -> new HunkRegionSlice<>(h, Hunk::newMappedHunk, new BlockDataHunkIOAdapter(), c, "blockdata"); + public static final Function2>> TILE = (h, c) -> new HunkRegionSlice<>(h, Hunk::newMappedHunk, new TileDataHunkIOAdapter(), c, "tile"); + public static final Function3> STRING = (h, c, t) -> new HunkRegionSlice<>(h, Hunk::newMappedHunk, new StringHunkIOAdapter(), c, t); + public static final Function3> BOOLEAN = (h, c, t) -> new HunkRegionSlice<>(h, Hunk::newMappedHunk, new BooleanHunkIOAdapter(), c, t); private final Function3> factory; - private final GridLock lock; private final HunkIOAdapter adapter; private final CompoundTag compound; private final String key; @@ -90,7 +54,6 @@ public class HunkRegionSlice { private final int height; public HunkRegionSlice(int height, Function3> factory, HunkIOAdapter adapter, CompoundTag compound, String key) { - this.lock = new GridLock(32, 32); this.height = height; this.loadedChunks = new KMap<>(); this.factory = factory; @@ -117,7 +80,9 @@ public class HunkRegionSlice { Long l = lastUse.get(i); if (l == null || M.ms() - l > t) { v++; - unload(i.getX(), i.getZ()); + MultiBurst.burst.lazy(() -> { + unload(i.getX(), i.getZ()); + }); } } @@ -133,7 +98,6 @@ public class HunkRegionSlice { } public synchronized void save(MultiBurst burst) { - BurstExecutor e = burst.burst(); try { for (Position2 i : save.copy()) { @@ -141,16 +105,14 @@ public class HunkRegionSlice { continue; } - e.queue(() -> save(i.getX(), i.getZ())); + save(i.getX(), i.getZ()); try { - lock.withNasty(i.getX(), i.getZ(), () -> save.remove(i)); + save.remove(i); } catch (Throwable eer) { Iris.reportError(eer); } } - - e.complete(); } catch (Throwable ee) { Iris.reportError(ee); } @@ -161,28 +123,23 @@ public class HunkRegionSlice { } public void delete(int x, int z) { - lock.with(x, z, () -> compound.getValue().remove(key(x, z))); + compound.getValue().remove(key(x, z)); } public Hunk read(int x, int z) throws IOException { AtomicReference e = new AtomicReference<>(); - Hunk xt = lock.withResult(x, z, () -> { - Tag t = compound.getValue().get(key(x, z)); + Hunk xt = null; - if (!(t instanceof ByteArrayTag)) { - Iris.verbose("NOT BYTE ARRAY!"); - return null; - } + Tag t = compound.getValue().get(key(x, z)); + if ((t instanceof ByteArrayTag)) { try { - return adapter.read(factory, (ByteArrayTag) t); + xt = adapter.read(factory, (ByteArrayTag) t); } catch (IOException xe) { Iris.reportError(xe); e.set(xe); } - - return null; - }); + } if (xt != null) { return xt; @@ -196,7 +153,7 @@ public class HunkRegionSlice { } public void write(Hunk hunk, int x, int z) throws IOException { - lock.withIO(x, z, () -> compound.getValue().put(key(x, z), hunk.writeByteArrayTag(adapter, key(x, z)))); + compound.getValue().put(key(x, z), hunk.writeByteArrayTag(adapter, key(x, z))); } public synchronized int unloadAll() { @@ -214,7 +171,7 @@ public class HunkRegionSlice { public void save(Hunk region, int x, int z) { try { - lock.withIO(x, z, () -> write(region, x, z)); + write(region, x, z); } catch (IOException e) { Iris.reportError(e); e.printStackTrace(); @@ -222,84 +179,74 @@ public class HunkRegionSlice { } public boolean isLoaded(int x, int z) { - return lock.withResult(x, z, () -> loadedChunks.containsKey(new Position2(x, z))); + return loadedChunks.containsKey(new Position2(x, z)); } public void save(int x, int z) { - lock.with(x, z, () -> { - if (isLoaded(x, z)) { - save(get(x, z), x, z); - } - }); + if (isLoaded(x, z)) { + save(get(x, z), x, z); + } } public void unload(int x, int z) { - lock.with(x, z, () -> { - Position2 key = new Position2(x, z); - if (isLoaded(x, z)) { - if (save.contains(key)) { - save(x, z); - save.remove(key); - } - - lastUse.remove(key); - loadedChunks.remove(key); + Position2 key = new Position2(x, z); + if (isLoaded(x, z)) { + if (save.contains(key)) { + save(x, z); + save.remove(key); } - }); + + lastUse.remove(key); + loadedChunks.remove(key); + } } public Hunk load(int x, int z) { - return lock.withResult(x, z, () -> { - if (isLoaded(x, z)) { - return loadedChunks.get(new Position2(x, z)); + if (isLoaded(x, z)) { + return loadedChunks.get(new Position2(x, z)); + } + + Hunk v = null; + + if (contains(x, z)) { + try { + v = read(x, z); + } catch (IOException e) { + Iris.reportError(e); + e.printStackTrace(); } + } - Hunk v = null; + if (v == null) { + v = factory.apply(16, height, 16); + } - if (contains(x, z)) { - try { - v = read(x, z); - } catch (IOException e) { - Iris.reportError(e); - e.printStackTrace(); - } - } + loadedChunks.put(new Position2(x, z), v); - if (v == null) { - v = factory.apply(16, height, 16); - } - - loadedChunks.put(new Position2(x, z), v); - - return v; - }); + return v; } public Hunk get(int x, int z) { - return lock.withResult(x, z, () -> { - Position2 key = new Position2(x, z); + Position2 key = new Position2(x, z); - Hunk c = loadedChunks.get(key); + Hunk c = loadedChunks.get(key); - if (c == null) { - c = load(x, z); - } + if (c == null) { + c = load(x, z); + } - lastUse.put(new Position2(x, z), M.ms()); + lastUse.put(new Position2(x, z), M.ms()); - return c; - }); + return c; } public Hunk getR(int x, int z) { - return lock.withResult(x, z, () -> get(x, z).readOnly()); + return get(x, z).readOnly(); } public Hunk getRW(int x, int z) { - return lock.withResult(x, z, () -> { - save.add(new Position2(x, z)); - return get(x, z); - }); + save.add(new Position2(x, z)); + return get(x, z); } private String key(int x, int z) { diff --git a/src/main/java/com/volmit/iris/engine/object/IrisObject.java b/src/main/java/com/volmit/iris/engine/object/IrisObject.java index aa02db2ee..717747793 100644 --- a/src/main/java/com/volmit/iris/engine/object/IrisObject.java +++ b/src/main/java/com/volmit/iris/engine/object/IrisObject.java @@ -68,7 +68,7 @@ public class IrisObject extends IrisRegistrant { private int w; private int d; private int h; - private transient final IrisLock readLock = new IrisLock("read-conclock").setDisabled(true); + private transient final IrisLock readLock = new IrisLock("read-conclock"); private transient BlockVector center; private transient volatile boolean smartBored = false; private transient IrisLock lock = new IrisLock("Preloadcache"); diff --git a/src/main/java/com/volmit/iris/engine/parallax/ParallaxWorld.java b/src/main/java/com/volmit/iris/engine/parallax/ParallaxWorld.java index ef6afe72b..c0e6065c2 100644 --- a/src/main/java/com/volmit/iris/engine/parallax/ParallaxWorld.java +++ b/src/main/java/com/volmit/iris/engine/parallax/ParallaxWorld.java @@ -28,12 +28,14 @@ import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.documentation.ChunkCoordinates; import com.volmit.iris.util.documentation.RegionCoordinates; import com.volmit.iris.util.format.C; +import com.volmit.iris.util.plugin.Command; import com.volmit.iris.util.scheduling.J; import org.bukkit.block.TileState; import org.bukkit.block.data.BlockData; import java.io.File; import java.io.IOException; +import java.util.concurrent.CompletableFuture; @SuppressWarnings("ALL") public class ParallaxWorld implements ParallaxAccess { @@ -234,25 +236,22 @@ public class ParallaxWorld implements ParallaxAccess { } @Override - public void cleanup(long r, long c) { - J.a(() -> { - try { - int rr = 0; - int cc = 0; - - for (ParallaxRegion i : loadedRegions.v()) { + public synchronized void cleanup(long r, long c) { + try { + int rr = 0; + for (ParallaxRegion i : loadedRegions.v()) { + burst.lazy(() -> { if (i.hasBeenIdleLongerThan(r)) { - rr++; unload(i.getX(), i.getZ()); } else { - cc += i.cleanup(c); + i.cleanup(c); } - } - } catch (Throwable e) { - Iris.reportError(e); - e.printStackTrace(); + }); } - }); + } catch (Throwable e) { + Iris.reportError(e); + e.printStackTrace(); + } } @Override From 434fe894bcc652a1d01af333e5bf7409d8f2951b Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Wed, 21 Jul 2021 08:11:47 -0400 Subject: [PATCH 131/137] Precache Noise double chunk speed! --- .../com/volmit/iris/engine/IrisEngine.java | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/volmit/iris/engine/IrisEngine.java b/src/main/java/com/volmit/iris/engine/IrisEngine.java index 6938638dd..d52619f40 100644 --- a/src/main/java/com/volmit/iris/engine/IrisEngine.java +++ b/src/main/java/com/volmit/iris/engine/IrisEngine.java @@ -25,6 +25,8 @@ import com.volmit.iris.engine.object.IrisBiome; import com.volmit.iris.engine.object.IrisBiomePaletteLayer; import com.volmit.iris.engine.object.IrisDecorator; import com.volmit.iris.engine.object.IrisObjectPlacement; +import com.volmit.iris.engine.parallel.BurstExecutor; +import com.volmit.iris.engine.parallel.MultiBurst; import com.volmit.iris.util.documentation.ChunkCoordinates; import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.scheduling.J; @@ -160,12 +162,29 @@ public class IrisEngine extends BlockPopulator implements Engine { public void generate(int x, int z, Hunk vblocks, Hunk vbiomes) { try { PrecisionStopwatch p = PrecisionStopwatch.start(); + BurstExecutor b = burst().burst(16); + + // This is a very weird optimization, but it works + // Basically we precache multicore the biome stream which effectivley + // makes the biome stream, interpolation & noise engine run in parallel without mca + for(int i = 0; i < vblocks.getWidth(); i++) + { + int finalI = i; + b.queue(() -> { + for(int j = 0; j < vblocks.getDepth(); j++) + { + getFramework().getComplex().getTrueBiomeStream().get(x+ finalI,z+j); + } + }); + } + + b.complete(); switch (getDimension().getTerrainMode()) { case NORMAL -> { getFramework().getEngineParallax().generateParallaxArea(x >> 4, z >> 4); - getFramework().getBiomeActuator().actuate(x, z, vbiomes); getFramework().getTerrainActuator().actuate(x, z, vblocks); + getFramework().getBiomeActuator().actuate(x, z, vbiomes); getFramework().getCaveModifier().modify(x, z, vblocks); getFramework().getRavineModifier().modify(x, z, vblocks); getFramework().getPostModifier().modify(x, z, vblocks); From 886ec9c574b6f2000fc485f719ee2b98dc0468f0 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Wed, 21 Jul 2021 08:12:01 -0400 Subject: [PATCH 132/137] V+ --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 7cffad103..ab94995d0 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { } group 'com.volmit.iris' -version '1.5.5' +version '1.5.6' def apiVersion = '1.17' def name = 'Iris' def main = 'com.volmit.iris.Iris' From 0a78a87a170b05e26e112ee382dbc6d7b0c88ab7 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Wed, 21 Jul 2021 08:37:26 -0400 Subject: [PATCH 133/137] Stop recreating threads without shutting down engine targets --- src/main/java/com/volmit/iris/engine/IrisEngine.java | 5 +++++ src/main/java/com/volmit/iris/engine/framework/Engine.java | 2 ++ .../iris/engine/framework/EngineCompositeGenerator.java | 2 ++ 3 files changed, 9 insertions(+) diff --git a/src/main/java/com/volmit/iris/engine/IrisEngine.java b/src/main/java/com/volmit/iris/engine/IrisEngine.java index d52619f40..f495cf5e7 100644 --- a/src/main/java/com/volmit/iris/engine/IrisEngine.java +++ b/src/main/java/com/volmit/iris/engine/IrisEngine.java @@ -212,6 +212,11 @@ public class IrisEngine extends BlockPopulator implements Engine { return getData().getBiomeLoader().load(getDimension().getFocus()); } + @Override + public void hotloading() { + close(); + } + @Override public void populate(@NotNull World world, @NotNull Random random, @NotNull Chunk c) { getWorldManager().spawnInitialEntities(c); 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 ae77163b0..6f3a00435 100644 --- a/src/main/java/com/volmit/iris/engine/framework/Engine.java +++ b/src/main/java/com/volmit/iris/engine/framework/Engine.java @@ -378,4 +378,6 @@ public interface Engine extends DataProvider, Fallible, GeneratorAccess, LootPro } IrisBiome getFocus(); + + void hotloading(); } diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java b/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java index b7c21ff6e..9d5d97754 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java @@ -127,6 +127,8 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce } }); + + getComposite().close(); initialized.lazySet(false); } } From a30e47d09441c5ebe3356c04a0b8369262364927 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Wed, 21 Jul 2021 08:37:35 -0400 Subject: [PATCH 134/137] Shutdown threads on iris disable --- src/main/java/com/volmit/iris/Iris.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/volmit/iris/Iris.java b/src/main/java/com/volmit/iris/Iris.java index f96a2796a..f205d02ff 100644 --- a/src/main/java/com/volmit/iris/Iris.java +++ b/src/main/java/com/volmit/iris/Iris.java @@ -32,6 +32,7 @@ import com.volmit.iris.engine.object.IrisBiome; import com.volmit.iris.engine.object.IrisBiomeCustom; import com.volmit.iris.engine.object.IrisCompat; import com.volmit.iris.engine.object.IrisDimension; +import com.volmit.iris.engine.parallel.MultiBurst; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.format.C; @@ -222,6 +223,7 @@ public class Iris extends VolmitPlugin implements Listener { board.disable(); Bukkit.getScheduler().cancelTasks(this); HandlerList.unregisterAll((Plugin) this); + MultiBurst.burst.shutdown(); super.onDisable(); } From 2f8a65d364f79980cc5cd6f12983f88f912f4af6 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Wed, 21 Jul 2021 08:39:09 -0400 Subject: [PATCH 135/137] Only install datapacks on init if it is studio --- .../iris/engine/framework/EngineCompositeGenerator.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java b/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java index 9d5d97754..9777bb6e3 100644 --- a/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java +++ b/src/main/java/com/volmit/iris/engine/framework/EngineCompositeGenerator.java @@ -309,7 +309,11 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce populators.clear(); populators.addAll(compound.get().getPopulators()); hotloader = new ReactiveFolder(data.getDataFolder(), (a, c, d) -> hotload()); - dim.installDataPack(() -> data, Iris.instance.getDatapacksFolder()); + + if(isStudio()) + { + dim.installDataPack(() -> data, Iris.instance.getDatapacksFolder()); + } } catch (Throwable e) { Iris.reportError(e); e.printStackTrace(); From ab206b2abf57603392dc76fb15dccbd7b48774a6 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Wed, 21 Jul 2021 09:13:05 -0400 Subject: [PATCH 136/137] Stop threads on vision shutdown --- src/main/java/com/volmit/iris/core/gui/VisionGUI.java | 7 +++++++ .../volmit/iris/engine/stream/utility/CachedStream2D.java | 4 ---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/volmit/iris/core/gui/VisionGUI.java b/src/main/java/com/volmit/iris/core/gui/VisionGUI.java index 3209177b6..5b538a040 100644 --- a/src/main/java/com/volmit/iris/core/gui/VisionGUI.java +++ b/src/main/java/com/volmit/iris/core/gui/VisionGUI.java @@ -144,6 +144,13 @@ public class VisionGUI extends JPanel implements MouseWheelListener, KeyListener help = false; } }); + frame.addWindowListener(new java.awt.event.WindowAdapter() { + @Override + public void windowClosing(java.awt.event.WindowEvent windowEvent) { + e.shutdown(); + eh.shutdown(); + } + }); } @Override diff --git a/src/main/java/com/volmit/iris/engine/stream/utility/CachedStream2D.java b/src/main/java/com/volmit/iris/engine/stream/utility/CachedStream2D.java index 8d1632ec9..216580a08 100644 --- a/src/main/java/com/volmit/iris/engine/stream/utility/CachedStream2D.java +++ b/src/main/java/com/volmit/iris/engine/stream/utility/CachedStream2D.java @@ -50,10 +50,6 @@ public class CachedStream2D extends BasicStream implements ProceduralStrea @Override public T get(double x, double z) { - if (IrisComplex.cacheLock.get()) { - return stream.get((int) x, (int) z); - } - return cache.compute(Cache.key((int) x, (int) z), (k, v) -> v != null ? v : stream.get((int) x, (int) z)); } From aa25feb57eeaaab898eef24e05ad310662546a54 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Wed, 21 Jul 2021 10:39:39 -0400 Subject: [PATCH 137/137] Fixes --- .../engine/parallax/ParallaxChunkMeta.java | 14 +++++++++-- .../volmit/iris/util/math/BlockPosition.java | 24 +++++++++++++++++++ .../com/volmit/iris/util/math/Position2.java | 5 ++++ 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/volmit/iris/engine/parallax/ParallaxChunkMeta.java b/src/main/java/com/volmit/iris/engine/parallax/ParallaxChunkMeta.java index 89865e50d..60c42750f 100644 --- a/src/main/java/com/volmit/iris/engine/parallax/ParallaxChunkMeta.java +++ b/src/main/java/com/volmit/iris/engine/parallax/ParallaxChunkMeta.java @@ -22,13 +22,15 @@ import com.google.gson.Gson; import com.volmit.iris.engine.hunk.io.HunkIOAdapter; import com.volmit.iris.engine.hunk.io.PaletteHunkIOAdapter; import com.volmit.iris.engine.object.IrisFeaturePositional; +import com.volmit.iris.util.io.IO; import com.volmit.iris.util.oldnbt.CompoundTag; import lombok.AllArgsConstructor; import lombok.Data; - import java.io.DataInputStream; import java.io.DataOutputStream; +import java.io.File; import java.io.IOException; +import java.util.UUID; import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.Function; @@ -38,7 +40,15 @@ public class ParallaxChunkMeta { public static final Function> adapter = (c) -> new PaletteHunkIOAdapter<>() { @Override public void write(ParallaxChunkMeta parallaxChunkMeta, DataOutputStream dos) throws IOException { - dos.writeUTF(new Gson().toJson(parallaxChunkMeta)); + try + { + dos.writeUTF(new Gson().toJson(parallaxChunkMeta)); + } + + catch(Throwable e) + { + IO.writeAll(new File("WTF", UUID.randomUUID().toString()), new Gson().toJson(parallaxChunkMeta)); + } } @Override diff --git a/src/main/java/com/volmit/iris/util/math/BlockPosition.java b/src/main/java/com/volmit/iris/util/math/BlockPosition.java index 2729714e5..96415a2e4 100644 --- a/src/main/java/com/volmit/iris/util/math/BlockPosition.java +++ b/src/main/java/com/volmit/iris/util/math/BlockPosition.java @@ -19,6 +19,8 @@ package com.volmit.iris.util.math; import lombok.Data; +import org.bukkit.World; +import org.bukkit.block.Block; import java.util.Objects; @@ -28,6 +30,7 @@ public class BlockPosition { private int y; private int z; + //Magic numbers private static final int m1 = 1 + MathHelper.f(MathHelper.c(30000000)); private static final int m2 = 64 - (m1 * 2); @@ -88,4 +91,25 @@ public class BlockPosition { var3 |= (z & m6) << m2; return var3; } + + public Block toBlock(World world) + { + return world.getBlockAt(x,y,z); + } + + public BlockPosition add(int x, int y, int z) { + return new BlockPosition(x,y,z); + } + + public void min(BlockPosition i) { + setX(Math.min(i.getX(), getX())); + setY(Math.min(i.getY(), getY())); + setZ(Math.min(i.getZ(), getZ())); + } + + public void max(BlockPosition i) { + setX(Math.max(i.getX(), getX())); + setY(Math.max(i.getY(), getY())); + setZ(Math.max(i.getZ(), getZ())); + } } diff --git a/src/main/java/com/volmit/iris/util/math/Position2.java b/src/main/java/com/volmit/iris/util/math/Position2.java index bea71ea6c..835f1e448 100644 --- a/src/main/java/com/volmit/iris/util/math/Position2.java +++ b/src/main/java/com/volmit/iris/util/math/Position2.java @@ -18,6 +18,11 @@ package com.volmit.iris.util.math; +import com.volmit.iris.engine.object.IrisBiomePaletteLayer; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.block.Block; + public class Position2 { private int x; private int z;