diff --git a/core/src/main/java/com/volmit/iris/Iris.java b/core/src/main/java/com/volmit/iris/Iris.java index 81ad04fdd..457494909 100644 --- a/core/src/main/java/com/volmit/iris/Iris.java +++ b/core/src/main/java/com/volmit/iris/Iris.java @@ -672,10 +672,12 @@ public class Iris extends VolmitPlugin implements Listener { metrics.addCustomChart(new DrilldownPie("used_packs", () -> Bukkit.getWorlds().stream() .map(IrisToolbelt::access) .filter(Objects::nonNull) - .map(PlatformChunkGenerator::getTarget) - .collect(Collectors.toMap(target -> target.getDimension().getLoadKey(), target -> { - int version = target.getDimension().getVersion(); - String checksum = IO.hashRecursive(target.getData().getDataFolder()); + .map(PlatformChunkGenerator::getEngine) + .collect(Collectors.toMap(engine -> engine.getDimension().getLoadKey(), engine -> { + var hash32 = engine.getHash32().getNow(null); + if (hash32 == null) return Map.of(); + int version = engine.getDimension().getVersion(); + String checksum = Long.toHexString(hash32); return Map.of("v" + version + " (" + checksum + ")", 1); }, (a, b) -> { diff --git a/core/src/main/java/com/volmit/iris/engine/IrisEngine.java b/core/src/main/java/com/volmit/iris/engine/IrisEngine.java index 54c9ce912..88c5fdc14 100644 --- a/core/src/main/java/com/volmit/iris/engine/IrisEngine.java +++ b/core/src/main/java/com/volmit/iris/engine/IrisEngine.java @@ -21,10 +21,10 @@ package com.volmit.iris.engine; import com.google.common.util.concurrent.AtomicDouble; import com.google.gson.Gson; import com.volmit.iris.Iris; -import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.ServerConfigurator; import com.volmit.iris.core.events.IrisEngineHotloadEvent; import com.volmit.iris.core.gui.PregeneratorJob; +import com.volmit.iris.core.loader.ResourceLoader; import com.volmit.iris.core.nms.container.BlockPos; import com.volmit.iris.core.nms.container.Pair; import com.volmit.iris.core.project.IrisProject; @@ -53,7 +53,6 @@ import com.volmit.iris.util.scheduling.PrecisionStopwatch; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; -import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; @@ -63,11 +62,10 @@ import java.io.File; import java.io.IOException; import java.util.HashSet; import java.util.Set; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; -import java.util.regex.Matcher; -import java.util.regex.Pattern; @Data @EqualsAndHashCode(exclude = "context") @@ -92,6 +90,7 @@ public class IrisEngine implements Engine { private final AtomicBoolean cleaning; private final ChronoLatch cleanLatch; private final SeedManager seedManager; + private CompletableFuture hash32; private EngineMode mode; private EngineEffects effects; private EngineExecutionEnvironment execution; @@ -174,8 +173,17 @@ public class IrisEngine implements Engine { complex = new IrisComplex(this); execution = new IrisExecutionEnvironment(this); effects = new IrisEngineEffects(this); + hash32 = new CompletableFuture<>(); setupMode(); J.a(this::computeBiomeMaxes); + J.a(() -> { + File[] roots = getData().getLoaders() + .values() + .stream() + .map(ResourceLoader::getRoot) + .toArray(File[]::new); + hash32.complete(IO.hashRecursive(roots)); + }); } catch (Throwable e) { Iris.error("FAILED TO SETUP ENGINE!"); e.printStackTrace(); diff --git a/core/src/main/java/com/volmit/iris/engine/decorator/IrisCeilingDecorator.java b/core/src/main/java/com/volmit/iris/engine/decorator/IrisCeilingDecorator.java index 362a3ea69..5c8c31945 100644 --- a/core/src/main/java/com/volmit/iris/engine/decorator/IrisCeilingDecorator.java +++ b/core/src/main/java/com/volmit/iris/engine/decorator/IrisCeilingDecorator.java @@ -23,13 +23,11 @@ import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.object.IrisBiome; import com.volmit.iris.engine.object.IrisDecorationPart; import com.volmit.iris.engine.object.IrisDecorator; -import com.volmit.iris.util.data.B; import com.volmit.iris.util.documentation.BlockCoordinates; import com.volmit.iris.util.hunk.Hunk; import org.bukkit.Material; import org.bukkit.block.BlockFace; import org.bukkit.block.data.BlockData; -import org.bukkit.block.data.MultipleFacing; import org.bukkit.block.data.type.PointedDripstone; public class IrisCeilingDecorator extends IrisEngineDecorator { @@ -43,7 +41,7 @@ public class IrisCeilingDecorator extends IrisEngineDecorator { IrisDecorator decorator = getDecorator(biome, realX, realZ); if (decorator != null) { if (!decorator.isStacking()) { - data.set(x, height, z, fixFaces(decorator.getBlockData100(biome, getRng(), realX, height, realZ, getData()), realX, height, realZ)); + data.set(x, height, z, fixFaces(decorator.getBlockData100(biome, getRng(), realX, height, realZ, getData()), data, x, z, realX, height, realZ)); } else { int stack = decorator.getHeight(getRng().nextParallelRNG(Cache.key(realX, realZ)), realX, realZ, getData()); if (decorator.isScaleStack()) { @@ -97,24 +95,4 @@ public class IrisCeilingDecorator extends IrisEngineDecorator { } } } - - private BlockData fixFaces(BlockData b, int x, int y, int z) { - if (B.isVineBlock(b)) { - MultipleFacing data = (MultipleFacing) b.clone(); - boolean found = false; - for (BlockFace f : BlockFace.values()) { - if (!f.isCartesian()) - continue; - Material m = getEngine().getMantle().get(x + f.getModX(), y + f.getModY(), z + f.getModZ()).getMaterial(); - if (m.isSolid()) { - found = true; - data.setFace(f, m.isSolid()); - } - } - if (!found) - data.setFace(BlockFace.UP, true); - return data; - } - return b; - } } diff --git a/core/src/main/java/com/volmit/iris/engine/decorator/IrisEngineDecorator.java b/core/src/main/java/com/volmit/iris/engine/decorator/IrisEngineDecorator.java index b41e6522b..8abb56a23 100644 --- a/core/src/main/java/com/volmit/iris/engine/decorator/IrisEngineDecorator.java +++ b/core/src/main/java/com/volmit/iris/engine/decorator/IrisEngineDecorator.java @@ -27,8 +27,14 @@ import com.volmit.iris.engine.object.IrisBiome; import com.volmit.iris.engine.object.IrisDecorationPart; import com.volmit.iris.engine.object.IrisDecorator; import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.data.B; +import com.volmit.iris.util.hunk.Hunk; import com.volmit.iris.util.math.RNG; import lombok.Getter; +import org.bukkit.block.BlockFace; +import org.bukkit.block.BlockSupport; +import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.MultipleFacing; public abstract class IrisEngineDecorator extends EngineAssignedComponent implements EngineDecorator { @@ -65,4 +71,40 @@ public abstract class IrisEngineDecorator extends EngineAssignedComponent implem return null; } + + protected BlockData fixFaces(BlockData b, Hunk hunk, int rX, int rZ, int x, int y, int z) { + if (B.isVineBlock(b)) { + MultipleFacing data = (MultipleFacing) b.clone(); + data.getFaces().forEach(f -> data.setFace(f, false)); + + boolean found = false; + for (BlockFace f : BlockFace.values()) { + if (!f.isCartesian()) + continue; + int yy = y + f.getModY(); + + BlockData r = getEngine().getMantle().get(x + f.getModX(), yy, z + f.getModZ()); + if (r.isFaceSturdy(f.getOppositeFace(), BlockSupport.FULL)) { + found = true; + data.setFace(f, true); + continue; + } + + int xx = rX + f.getModX(); + int zz = rZ + f.getModZ(); + if (xx < 0 || xx > 15 || zz < 0 || zz > 15 || yy < 0 || yy > hunk.getHeight()) + continue; + + r = hunk.get(xx, yy, zz); + if (r.isFaceSturdy(f.getOppositeFace(), BlockSupport.FULL)) { + found = true; + data.setFace(f, true); + } + } + if (!found) + data.setFace(BlockFace.DOWN, true); + return data; + } + return b; + } } diff --git a/core/src/main/java/com/volmit/iris/engine/decorator/IrisSurfaceDecorator.java b/core/src/main/java/com/volmit/iris/engine/decorator/IrisSurfaceDecorator.java index 49e636220..73f81f0fe 100644 --- a/core/src/main/java/com/volmit/iris/engine/decorator/IrisSurfaceDecorator.java +++ b/core/src/main/java/com/volmit/iris/engine/decorator/IrisSurfaceDecorator.java @@ -32,7 +32,6 @@ import org.bukkit.Material; import org.bukkit.block.BlockFace; import org.bukkit.block.data.Bisected; import org.bukkit.block.data.BlockData; -import org.bukkit.block.data.MultipleFacing; import org.bukkit.block.data.type.PointedDripstone; public class IrisSurfaceDecorator extends IrisEngineDecorator { @@ -68,7 +67,7 @@ public class IrisSurfaceDecorator extends IrisEngineDecorator { } if (decorator.getForceBlock() != null) { - data.set(x, height, z, fixFaces(decorator.getForceBlock().getBlockData(getData()), x, height, z)); + data.set(x, height, z, fixFaces(decorator.getForceBlock().getBlockData(getData()), data, x, z, realX, height, realZ)); } else if (!decorator.isForcePlace()) { if (decorator.getWhitelist() != null && decorator.getWhitelist().stream().noneMatch(d -> d.getBlockData(getData()).equals(bdx))) { return; @@ -91,7 +90,7 @@ public class IrisSurfaceDecorator extends IrisEngineDecorator { } if (B.isAir(data.get(x, height + 1, z))) { - data.set(x, height + 1, z, fixFaces(bd, x, height + 1, z)); + data.set(x, height + 1, z, fixFaces(bd, data, x, z, realX, height + 1, realZ)); } } else { if (height < getDimension().getFluidHeight()) { @@ -158,24 +157,4 @@ public class IrisSurfaceDecorator extends IrisEngineDecorator { } } } - - private BlockData fixFaces(BlockData b, int x, int y, int z) { - if (B.isVineBlock(b)) { - MultipleFacing data = (MultipleFacing) b.clone(); - boolean found = false; - for (BlockFace f : BlockFace.values()) { - if (!f.isCartesian()) - continue; - Material m = getEngine().getMantle().get(x + f.getModX(), y + f.getModY(), z + f.getModZ()).getMaterial(); - if (m.isSolid()) { - found = true; - data.setFace(f, m.isSolid()); - } - } - if (!found) - data.setFace(BlockFace.UP, true); - return data; - } - return b; - } } diff --git a/core/src/main/java/com/volmit/iris/engine/framework/Engine.java b/core/src/main/java/com/volmit/iris/engine/framework/Engine.java index 145fdd4e7..56ed99c0c 100644 --- a/core/src/main/java/com/volmit/iris/engine/framework/Engine.java +++ b/core/src/main/java/com/volmit/iris/engine/framework/Engine.java @@ -80,6 +80,7 @@ import java.awt.Color; import java.util.Arrays; import java.util.Set; import java.util.UUID; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.Semaphore; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; @@ -611,6 +612,8 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat int getGenerated(); + CompletableFuture getHash32(); + default IrisPosition lookForStreamResult(T find, ProceduralStream stream, Function2 matcher, long timeout) { AtomicInteger checked = new AtomicInteger(); AtomicLong time = new AtomicLong(M.ms()); diff --git a/core/src/main/java/com/volmit/iris/engine/modifier/IrisCarveModifier.java b/core/src/main/java/com/volmit/iris/engine/modifier/IrisCarveModifier.java index 8fe8d1405..c5a5f9e5f 100644 --- a/core/src/main/java/com/volmit/iris/engine/modifier/IrisCarveModifier.java +++ b/core/src/main/java/com/volmit/iris/engine/modifier/IrisCarveModifier.java @@ -211,14 +211,6 @@ public class IrisCarveModifier extends EngineAssignedModifier { biome.setInferredType(InferredType.CAVE); - for (IrisDecorator i : biome.getDecorators()) { - if (i.getPartOf().equals(IrisDecorationPart.NONE) && B.isSolid(output.get(rx, zone.getFloor() - 1, rz))) { - decorant.getSurfaceDecorator().decorate(rx, rz, xx, xx, xx, zz, zz, zz, output, biome, zone.getFloor() - 1, zone.airThickness()); - } else if (i.getPartOf().equals(IrisDecorationPart.CEILING) && B.isSolid(output.get(rx, zone.getCeiling() + 1, rz))) { - decorant.getCeilingDecorator().decorate(rx, rz, xx, xx, xx, zz, zz, zz, output, biome, zone.getCeiling(), zone.airThickness()); - } - } - KList blocks = biome.generateLayers(getDimension(), xx, zz, rng, 3, zone.floor, getData(), getComplex()); for (int i = 0; i < zone.floor - 1; i++) { @@ -260,6 +252,14 @@ public class IrisCarveModifier extends EngineAssignedModifier { output.set(rx, zone.ceiling + i + 1, rz, b); } } + + for (IrisDecorator i : biome.getDecorators()) { + if (i.getPartOf().equals(IrisDecorationPart.NONE) && B.isSolid(output.get(rx, zone.getFloor() - 1, rz))) { + decorant.getSurfaceDecorator().decorate(rx, rz, xx, xx, xx, zz, zz, zz, output, biome, zone.getFloor() - 1, zone.airThickness()); + } else if (i.getPartOf().equals(IrisDecorationPart.CEILING) && B.isSolid(output.get(rx, zone.getCeiling() + 1, rz))) { + decorant.getCeilingDecorator().decorate(rx, rz, xx, xx, xx, zz, zz, zz, output, biome, zone.getCeiling(), zone.airThickness()); + } + } } @Data diff --git a/core/src/main/java/com/volmit/iris/util/io/IO.java b/core/src/main/java/com/volmit/iris/util/io/IO.java index 32983d7f7..a8f718885 100644 --- a/core/src/main/java/com/volmit/iris/util/io/IO.java +++ b/core/src/main/java/com/volmit/iris/util/io/IO.java @@ -111,10 +111,12 @@ public class IO { return "¯\\_(ツ)_/¯"; } - public static String hashRecursive(File base) { + public static long hashRecursive(File... bases) { LinkedList files = new LinkedList<>(); Set processed = new HashSet<>(); - files.add(base); + Arrays.parallelSort(bases, Comparator.comparing(File::getName)); + files.addAll(Arrays.asList(bases)); + try { CRC32 crc = new CRC32(); while (!files.isEmpty()) { @@ -141,13 +143,13 @@ public class IO { } } - return Long.toHexString(crc.getValue()); + return crc.getValue(); } catch (Throwable e) { Iris.reportError(e); e.printStackTrace(); } - return ""; + return 0; } public static String hash(File b) {