diff --git a/Iris.iml b/Iris.iml index 74f3f131c..f54c3d5a6 100644 --- a/Iris.iml +++ b/Iris.iml @@ -1,2 +1,23 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gource.bat b/gource.bat index 6786239d7..8d5f1f5f3 100644 --- a/gource.bat +++ b/gource.bat @@ -1,3 +1,3 @@ @echo off cd gource -gource -f -a 1 -s 0.5 --colour-images --max-file-lag 10 --title MyGuide --user-scale 1.67 --max-user-speed 725 --filename-time 2 \ No newline at end of file +gource -f -a 1 -s 0.01 -t 100000 --colour-images --max-file-lag 35 --title MyGuide --user-scale 1.67 --max-user-speed 725 --filename-time 2 -title Chimera --user-friction 2.5 --padding 1.2 --user-scale 1.25 --filename-time 2 --bloom-intensity 0.1 --bloom-multiplier 3 --hide filenames,dirnames \ No newline at end of file diff --git a/pom.xml b/pom.xml index 97bd20b9f..f0f82bae7 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.volmit Iris - 1.1.5 + 1.1.6 Iris false diff --git a/src/main/java/com/volmit/iris/IrisSettings.java b/src/main/java/com/volmit/iris/IrisSettings.java index a977348bb..aa91d316a 100644 --- a/src/main/java/com/volmit/iris/IrisSettings.java +++ b/src/main/java/com/volmit/iris/IrisSettings.java @@ -34,7 +34,7 @@ public class IrisSettings public String defaultWorldType = "overworld"; @DontObfuscate - public int maxAsyncChunkPregenThreads = 32; + public int maxAsyncChunkPregenThreads = 128; @DontObfuscate public boolean maximumPregenGuiFPS = false; diff --git a/src/main/java/com/volmit/iris/generator/IrisEngine.java b/src/main/java/com/volmit/iris/generator/IrisEngine.java index dcb0195e3..aa9ddcb37 100644 --- a/src/main/java/com/volmit/iris/generator/IrisEngine.java +++ b/src/main/java/com/volmit/iris/generator/IrisEngine.java @@ -1,10 +1,10 @@ package com.volmit.iris.generator; import com.volmit.iris.Iris; +import com.volmit.iris.IrisSettings; import com.volmit.iris.scaffold.engine.*; import com.volmit.iris.scaffold.hunk.Hunk; import com.volmit.iris.scaffold.parallel.MultiBurst; -import com.volmit.iris.util.ChronoLatch; import com.volmit.iris.util.J; import com.volmit.iris.util.PrecisionStopwatch; import com.volmit.iris.util.RNG; @@ -52,7 +52,6 @@ public class IrisEngine extends BlockPopulator implements Engine private volatile int minHeight; private int permits; private boolean failing; - private ChronoLatch cl = new ChronoLatch(10000); private boolean closed; private int cacheId; private Semaphore s; @@ -62,7 +61,7 @@ public class IrisEngine extends BlockPopulator implements Engine { Iris.info("Initializing Engine: " + target.getWorld().getName() + "/" + target.getDimension().getLoadKey() + " (" + target.getHeight() + " height)"); metrics = new EngineMetrics(32); - permits = 1000; + permits = 10000; this.s = new Semaphore(permits); this.target = target; this.framework = new IrisEngineFramework(this); @@ -110,36 +109,49 @@ public class IrisEngine extends BlockPopulator implements Engine public void generate(int x, int z, Hunk vblocks, Hunk postblocks, Hunk vbiomes) { try { + boolean multicore = !IrisSettings.get().isUseGleamPregenerator(); //TODO: LATER s.acquire(1); PrecisionStopwatch p = PrecisionStopwatch.start(); Hunk biomes = vbiomes; Hunk blocks = vblocks.synchronize().listen((xx,y,zz,t) -> catchBlockUpdates(x+xx,y+getMinHeight(),z+zz, t)); Hunk pblocks = postblocks.synchronize().listen((xx,y,zz,t) -> catchBlockUpdates(x+xx,y+getMinHeight(),z+zz, t)); Hunk fringe = Hunk.fringe(blocks, pblocks); - getFramework().getEngineParallax().generateParallaxArea(x, z); - getFramework().getBiomeActuator().actuate(x, z, biomes); - getFramework().getTerrainActuator().actuate(x, z, blocks); - getFramework().getCaveModifier().modify(x, z, blocks); - getFramework().getRavineModifier().modify(x, z, blocks); + + if(multicore) + { + MultiBurst.burst.burst( + () -> getFramework().getEngineParallax().generateParallaxArea(x, z), + () -> getFramework().getBiomeActuator().actuate(x, z, biomes), + () -> getFramework().getTerrainActuator().actuate(x, z, blocks) + ); + + + + MultiBurst.burst.burst( + () -> getFramework().getCaveModifier().modify(x, z, blocks), + () -> getFramework().getRavineModifier().modify(x, z, blocks), + () -> getFramework().getPostModifier().modify(x, z, blocks), + () -> getFramework().getDecorantActuator().actuate(x, z, fringe), + () -> getFramework().getEngineParallax().insertParallax(x, z, fringe) + ); + } + + else + { + getFramework().getEngineParallax().generateParallaxArea(x, z); + getFramework().getBiomeActuator().actuate(x, z, biomes); + getFramework().getTerrainActuator().actuate(x, z, blocks); + getFramework().getCaveModifier().modify(x, z, blocks); + getFramework().getRavineModifier().modify(x, z, blocks); + getFramework().getPostModifier().modify(x, z, blocks); + getFramework().getDecorantActuator().actuate(x, z, fringe); + getFramework().getEngineParallax().insertParallax(x, z, fringe); + } + getFramework().getDepositModifier().modify(x, z, blocks); - getFramework().getPostModifier().modify(x, z, blocks); - getFramework().getDecorantActuator().actuate(x, z, fringe); - getFramework().getEngineParallax().insertParallax(x, z, fringe); getMetrics().getTotal().put(p.getMilliseconds()); s.release(1); - - if(cl.flip()) - { - MultiBurst.burst.lazy(() -> { - try { - s.acquire(permits); - getFramework().recycle(); - s.release(permits); - } catch (InterruptedException e) { - e.printStackTrace(); - } - }); - } + getFramework().recycle(); } catch(Throwable e) diff --git a/src/main/java/com/volmit/iris/generator/IrisEngineFramework.java b/src/main/java/com/volmit/iris/generator/IrisEngineFramework.java index 2281abb5d..bbbb614d4 100644 --- a/src/main/java/com/volmit/iris/generator/IrisEngineFramework.java +++ b/src/main/java/com/volmit/iris/generator/IrisEngineFramework.java @@ -1,15 +1,22 @@ package com.volmit.iris.generator; -import com.volmit.iris.generator.actuator.*; +import com.volmit.iris.Iris; +import com.volmit.iris.IrisSettings; +import com.volmit.iris.generator.actuator.IrisBiomeActuator; +import com.volmit.iris.generator.actuator.IrisDecorantActuator; +import com.volmit.iris.generator.actuator.IrisTerrainActuator; import com.volmit.iris.generator.modifier.IrisCaveModifier; import com.volmit.iris.generator.modifier.IrisDepositModifier; import com.volmit.iris.generator.modifier.IrisPostModifier; import com.volmit.iris.generator.modifier.IrisRavineModifier; import com.volmit.iris.scaffold.engine.*; +import com.volmit.iris.util.ChronoLatch; import lombok.Getter; import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; +import java.util.concurrent.atomic.AtomicBoolean; + public class IrisEngineFramework implements EngineFramework { @Getter @@ -42,6 +49,9 @@ public class IrisEngineFramework implements EngineFramework { @Getter private final EngineModifier postModifier; + private final AtomicBoolean cleaning; + private final ChronoLatch cleanLatch; + public IrisEngineFramework(Engine engine) { this.engine = engine; @@ -54,6 +64,38 @@ public class IrisEngineFramework implements EngineFramework { this.ravineModifier = new IrisRavineModifier(getEngine()); this.caveModifier = new IrisCaveModifier(engine); this.postModifier = new IrisPostModifier(engine); + cleaning = new AtomicBoolean(false); + cleanLatch = new ChronoLatch(Math.max(10000, Math.min(IrisSettings.get().parallaxChunkEvictionMS, IrisSettings.get().parallaxRegionEvictionMS))); + } + + @Override + public synchronized void recycle() { + if(!cleanLatch.flip()) + { + return; + } + + if (cleaning.get()) + { + cleanLatch.flipDown(); + return; + } + + cleaning.set(true); + + try + { + getEngine().getParallax().cleanup(); + getData().getObjectLoader().clean(); + } + + catch(Throwable e) + { + Iris.error("Cleanup failed!"); + e.printStackTrace(); + } + + cleaning.lazySet(false); } @Override diff --git a/src/main/java/com/volmit/iris/generator/decorator/IrisEngineDecorator.java b/src/main/java/com/volmit/iris/generator/decorator/IrisEngineDecorator.java index a375bd5c6..35ad5e8d9 100644 --- a/src/main/java/com/volmit/iris/generator/decorator/IrisEngineDecorator.java +++ b/src/main/java/com/volmit/iris/generator/decorator/IrisEngineDecorator.java @@ -3,6 +3,8 @@ package com.volmit.iris.generator.decorator; import com.volmit.iris.object.DecorationPart; import com.volmit.iris.object.IrisBiome; import com.volmit.iris.object.IrisDecorator; +import com.volmit.iris.scaffold.cache.Cache; +import com.volmit.iris.util.KList; import com.volmit.iris.util.RNG; import com.volmit.iris.scaffold.engine.Engine; import com.volmit.iris.scaffold.engine.EngineAssignedComponent; @@ -25,17 +27,21 @@ public abstract class IrisEngineDecorator extends EngineAssignedComponent implem protected IrisDecorator getDecorator(IrisBiome biome, double realX, double realZ) { + KList v = new KList<>(); + RNG rng = new RNG(Cache.key((int)realX, (int)realZ)); + for(IrisDecorator i : biome.getDecorators()) { - if(i.getPartOf().equals(part)) + if(i.getPartOf().equals(part) && i.getBlockData(biome, this.rng, realX, realZ, getData()) != null) { - if(i.getBlockData(biome, rng, realX, realZ, getData()) != null) - { - return i; - } + v.add(i); } } + if(v.isNotEmpty()) { + return v.get(rng.nextInt(v.size())); + } + return null; } } diff --git a/src/main/java/com/volmit/iris/scaffold/IrisWorldCreator.java b/src/main/java/com/volmit/iris/scaffold/IrisWorldCreator.java index 9f46ff437..0586ed35c 100644 --- a/src/main/java/com/volmit/iris/scaffold/IrisWorldCreator.java +++ b/src/main/java/com/volmit/iris/scaffold/IrisWorldCreator.java @@ -70,6 +70,14 @@ public class IrisWorldCreator { return World.Environment.NORMAL; } + else if(dimensionName == "NETHER") + { + return World.Environment.NETHER; + } + else if(dimensionName == "END") + { + return World.Environment.THE_END; + } IrisDimension dim = IrisDataManager.loadAnyDimension(dimensionName); diff --git a/src/main/java/com/volmit/iris/scaffold/engine/EngineCompositeGenerator.java b/src/main/java/com/volmit/iris/scaffold/engine/EngineCompositeGenerator.java index 249efab0a..cf7bfedb1 100644 --- a/src/main/java/com/volmit/iris/scaffold/engine/EngineCompositeGenerator.java +++ b/src/main/java/com/volmit/iris/scaffold/engine/EngineCompositeGenerator.java @@ -614,12 +614,14 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce @Override public void close() { J.car(art); - getComposite().close(); + if (getComposite() != null) { + getComposite().close(); - if(isStudio()) - { - IrisWorlds.evacuate(getComposite().getWorld()); - Bukkit.unloadWorld(getComposite().getWorld(), !isStudio()); + + if (isStudio()) { + IrisWorlds.evacuate(getComposite().getWorld()); + Bukkit.unloadWorld(getComposite().getWorld(), !isStudio()); + } } } diff --git a/src/main/java/com/volmit/iris/scaffold/engine/EngineFramework.java b/src/main/java/com/volmit/iris/scaffold/engine/EngineFramework.java index 97f3288ef..71b3b7e97 100644 --- a/src/main/java/com/volmit/iris/scaffold/engine/EngineFramework.java +++ b/src/main/java/com/volmit/iris/scaffold/engine/EngineFramework.java @@ -3,7 +3,6 @@ package com.volmit.iris.scaffold.engine; import com.volmit.iris.generator.IrisComplex; import com.volmit.iris.manager.IrisDataManager; import com.volmit.iris.scaffold.data.DataProvider; -import com.volmit.iris.util.M; import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; @@ -21,15 +20,8 @@ public interface EngineFramework extends DataProvider default void recycle() { - if(M.r(0.1)) - { - synchronized (getEngine().getParallax()) - { - getEngine().getParallax().cleanup(); - } - - getData().getObjectLoader().clean(); - } + getEngine().getParallax().cleanup(); + getData().getObjectLoader().clean(); } public EngineActuator getTerrainActuator(); diff --git a/src/main/java/com/volmit/iris/scaffold/hunk/io/HunkRegionSlice.java b/src/main/java/com/volmit/iris/scaffold/hunk/io/HunkRegionSlice.java index 3b9a438ab..1329333ec 100644 --- a/src/main/java/com/volmit/iris/scaffold/hunk/io/HunkRegionSlice.java +++ b/src/main/java/com/volmit/iris/scaffold/hunk/io/HunkRegionSlice.java @@ -9,9 +9,9 @@ import java.io.IOException; public class HunkRegionSlice { - public static final Function2> BLOCKDATA = (h, c) -> new HunkRegionSlice<>(h, Hunk::newMappedHunk, new BlockDataHunkIOAdapter(), c, "blockdata"); - 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); + public static final Function2> BLOCKDATA = (h, c) -> new HunkRegionSlice<>(h, Hunk::newAtomicHunk, new BlockDataHunkIOAdapter(), c, "blockdata"); + public static final Function3> STRING = (h, c, t) -> new HunkRegionSlice<>(h, Hunk::newAtomicHunk, new StringHunkIOAdapter(), c, t); + public static final Function3> BOOLEAN = (h, c, t) -> new HunkRegionSlice<>(h, Hunk::newAtomicHunk, new BooleanHunkIOAdapter(), c, t); private final Function3> factory; private final HunkIOAdapter adapter; private final CompoundTag compound; diff --git a/src/main/java/com/volmit/iris/scaffold/hunk/io/PaletteHunkIOAdapter.java b/src/main/java/com/volmit/iris/scaffold/hunk/io/PaletteHunkIOAdapter.java index 2e28cab8b..78dbe0c91 100644 --- a/src/main/java/com/volmit/iris/scaffold/hunk/io/PaletteHunkIOAdapter.java +++ b/src/main/java/com/volmit/iris/scaffold/hunk/io/PaletteHunkIOAdapter.java @@ -66,14 +66,18 @@ public abstract class PaletteHunkIOAdapter implements HunkIOAdapter { int x = din.readShort() - Short.MIN_VALUE; int y = din.readShort() - Short.MIN_VALUE; int z = din.readShort() - Short.MIN_VALUE; - T v = palette.getPalette().get(din.readShort() - Short.MIN_VALUE); + int vf = din.readShort() - Short.MIN_VALUE; - if(v == null) + T v = null; + if( palette.getPalette().hasIndex(vf)) { - throw new IOException("NULL VALUE AT " + x + " " + y + " " + z); + v = palette.getPalette().get(vf); } - t.setRaw(x,y,z, v); + if(v != null) + { + t.setRaw(x,y,z, v); + } } in.close(); diff --git a/src/main/java/com/volmit/iris/scaffold/parallax/ParallaxRegion.java b/src/main/java/com/volmit/iris/scaffold/parallax/ParallaxRegion.java index 28abe35da..6c7dc6ed9 100644 --- a/src/main/java/com/volmit/iris/scaffold/parallax/ParallaxRegion.java +++ b/src/main/java/com/volmit/iris/scaffold/parallax/ParallaxRegion.java @@ -90,7 +90,7 @@ public class ParallaxRegion extends HunkRegion return getMetaHunkR(); } - public synchronized Hunk loadMetaHunk() + public Hunk loadMetaHunk() { lastUse = M.ms(); if(meta == null) @@ -115,7 +115,7 @@ public class ParallaxRegion extends HunkRegion return meta; } - public synchronized void unloadMetaHunk() + public void unloadMetaHunk() { if(dirtyMeta) { @@ -126,7 +126,7 @@ public class ParallaxRegion extends HunkRegion meta = null; } - public synchronized void saveMetaHunk() + public void saveMetaHunk() { if(meta != null && dirtyMeta) { diff --git a/src/main/java/com/volmit/iris/scaffold/parallax/ParallaxWorld.java b/src/main/java/com/volmit/iris/scaffold/parallax/ParallaxWorld.java index 2e06abddb..3e4f6c6d7 100644 --- a/src/main/java/com/volmit/iris/scaffold/parallax/ParallaxWorld.java +++ b/src/main/java/com/volmit/iris/scaffold/parallax/ParallaxWorld.java @@ -54,7 +54,7 @@ public class ParallaxWorld implements ParallaxAccess return m; } - public synchronized void close() + public void close() { for(ParallaxRegion i : loadedRegions.v()) { @@ -65,7 +65,7 @@ public class ParallaxWorld implements ParallaxAccess loadedRegions.clear(); } - public synchronized void save(ParallaxRegion region) + public void save(ParallaxRegion region) { try { @@ -83,7 +83,7 @@ public class ParallaxWorld implements ParallaxAccess return loadedRegions.containsKey(key(x, z)); } - public synchronized void save(int x, int z) + public void save(int x, int z) { if(isLoaded(x, z)) { @@ -91,7 +91,7 @@ public class ParallaxWorld implements ParallaxAccess } } - public synchronized void unload(int x, int z) + public void unload(int x, int z) { long key = key(x, z); @@ -107,7 +107,7 @@ public class ParallaxWorld implements ParallaxAccess } } - public synchronized ParallaxRegion load(int x, int z) + public ParallaxRegion load(int x, int z) { if(isLoaded(x, z)) { @@ -157,7 +157,7 @@ public class ParallaxWorld implements ParallaxAccess } @Override - public synchronized Hunk getBlocksRW(int x, int z) + public Hunk getBlocksRW(int x, int z) { return getRW(x >> 5, z >> 5).getBlockSlice().getRW(x & 31, z & 31); } @@ -169,7 +169,7 @@ public class ParallaxWorld implements ParallaxAccess } @Override - public synchronized Hunk getObjectsRW(int x, int z) + public Hunk getObjectsRW(int x, int z) { return getRW(x >> 5, z >> 5).getObjectSlice().getRW(x & 31, z & 31); } @@ -181,7 +181,7 @@ public class ParallaxWorld implements ParallaxAccess } @Override - public synchronized Hunk getUpdatesRW(int x, int z) + public Hunk getUpdatesRW(int x, int z) { return getRW(x >> 5, z >> 5).getUpdateSlice().getRW(x & 31, z & 31); } @@ -227,15 +227,12 @@ public class ParallaxWorld implements ParallaxAccess } @Override - public synchronized void saveAllNOW() { + public void saveAllNOW() { for(ParallaxRegion i : loadedRegions.v()) { - synchronized (save) + if(save.contains(key(i.getX(), i.getZ()))) { - if(save.contains(key(i.getX(), i.getZ()))) - { - save(i.getX(), i.getZ()); - } + save(i.getX(), i.getZ()); } } } diff --git a/src/main/java/com/volmit/iris/util/PregenJob.java b/src/main/java/com/volmit/iris/util/PregenJob.java index fe0c0bcf8..1ab9d91e2 100644 --- a/src/main/java/com/volmit/iris/util/PregenJob.java +++ b/src/main/java/com/volmit/iris/util/PregenJob.java @@ -52,7 +52,7 @@ public class PregenJob implements Listener private double cps = 0; private int lg = 0; private long lt = M.ms(); - private int cubeSize = IrisSettings.get().isUseGleamPregenerator() ? 11 : 32; + private int cubeSize = (IrisSettings.get().isUseGleamPregenerator() && PaperLib.isPaper()) ? 11 : 32; private long nogen = M.ms(); private KList requeueMCA = new KList(); private RollingSequence acps = new RollingSequence(PaperLib.isPaper() ? 8 : 32); @@ -65,7 +65,7 @@ public class PregenJob implements Listener public PregenJob(World world, int size, MortarSender sender, Runnable onDone) { - gleaming = IrisSettings.get().isUseGleamPregenerator(); + gleaming = (IrisSettings.get().isUseGleamPregenerator() && PaperLib.isPaper()); g.set(0); burst = new MultiBurst(gleaming ? IrisSettings.get().getMaxAsyncChunkPregenThreads() : tc()); instance = this; @@ -431,7 +431,7 @@ public class PregenJob implements Listener consumer.accept(new ChunkPosition(cx, cz), Color.magenta); } - Chunk chunk = PaperLib.getChunkAtAsync(world, cx, cz, true).join(); + Chunk chunk = PaperLib.getChunkAtAsync(world, cx, cz, true, true).join(); working.release(); genned++; nogen = M.ms();