diff --git a/src/main/java/com/volmit/iris/engine/modifier/IrisCarveModifier.java b/src/main/java/com/volmit/iris/engine/modifier/IrisCarveModifier.java index d7c30bff7..08dab1a69 100644 --- a/src/main/java/com/volmit/iris/engine/modifier/IrisCarveModifier.java +++ b/src/main/java/com/volmit/iris/engine/modifier/IrisCarveModifier.java @@ -18,11 +18,14 @@ package com.volmit.iris.engine.modifier; +import com.volmit.iris.Iris; import com.volmit.iris.engine.IrisEngine; import com.volmit.iris.engine.actuator.IrisDecorantActuator; import com.volmit.iris.engine.data.cache.Cache; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.framework.EngineAssignedModifier; +import com.volmit.iris.engine.object.basic.IrisPosition; +import com.volmit.iris.engine.object.biome.InferredType; import com.volmit.iris.engine.object.biome.IrisBiome; import com.volmit.iris.engine.object.decoration.IrisDecorationPart; import com.volmit.iris.engine.object.decoration.IrisDecorator; @@ -33,8 +36,10 @@ import com.volmit.iris.util.format.Form; import com.volmit.iris.util.hunk.Hunk; import com.volmit.iris.util.mantle.Mantle; import com.volmit.iris.util.mantle.MantleChunk; +import com.volmit.iris.util.math.M; import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.matter.MatterCavern; +import com.volmit.iris.util.scheduling.J; import com.volmit.iris.util.scheduling.PrecisionStopwatch; import lombok.Data; import org.bukkit.Material; @@ -58,6 +63,7 @@ public class IrisCarveModifier extends EngineAssignedModifier { Mantle mantle = getEngine().getMantle().getMantle(); MantleChunk mc = getEngine().getMantle().getMantle().getChunk(x, z); KMap> positions = new KMap<>(); + KMap walls = new KMap<>(); mc.iterate(MatterCavern.class, (xx, yy, zz, c) -> { if(yy > 256 || yy < 0) @@ -76,6 +82,18 @@ public class IrisCarveModifier extends EngineAssignedModifier { positions.compute(Cache.key(rx, rz), (k,v) -> Objects.requireNonNullElseGet(v, (Supplier>) KList::new).qadd(yy)); + if(rz < 15 && mantle.get(xx, yy, zz + 1, MatterCavern.class) == null) + {walls.put(new IrisPosition(rx, yy, rz + 1), c);} + + if(rx < 15 && mantle.get(xx + 1, yy, zz, MatterCavern.class) == null) + {walls.put(new IrisPosition(rx + 1, yy, rz), c);} + + if(rz > 0 && mantle.get(xx, yy, zz - 1, MatterCavern.class) == null) + {walls.put(new IrisPosition(rx, yy, rz - 1), c);} + + if(rx > 0 && mantle.get(xx - 1, yy, zz, MatterCavern.class) == null) + {walls.put(new IrisPosition(rx - 1, yy, rz), c);} + if(current.getMaterial().isAir()) { return; @@ -84,6 +102,22 @@ public class IrisCarveModifier extends EngineAssignedModifier { output.set(rx, yy, rz, AIR); }); + walls.forEach((i, v) -> { + IrisBiome biome = v.getCustomBiome().isEmpty() + ? getEngine().getCaveBiome(i.getX() + (x << 4), i.getZ() + (z << 4)) + : getEngine().getData().getBiomeLoader().load(v.getCustomBiome()); + + if(biome != null) + { + biome.setInferredType(InferredType.CAVE); + BlockData d = biome.getWall().get(rng, i.getX() + (x << 4), i.getY(), i.getZ() + (z << 4), getData()); + + if(d != null && B.isSolid(output.get(i.getX(), i.getY(), i.getZ()))) { + output.set(i.getX(), i.getY(), i.getZ(), d); + } + } + }); + positions.forEach((k, v) -> { if(v.isEmpty()) { @@ -96,6 +130,7 @@ public class IrisCarveModifier extends EngineAssignedModifier { CaveZone zone = new CaveZone(); zone.setFloor(v.get(0)); int buf = v.get(0) - 1; + for(Integer i : v) { if (i < 0 || i > 255) { continue; @@ -115,6 +150,11 @@ public class IrisCarveModifier extends EngineAssignedModifier { buf = i; } } + + if(zone.isValid()) + { + processZone(output, mc, zone, rx, rz, rx + (x << 4), rz + (z << 4)); + } }); getEngine().getMetrics().getDeposit().put(p.getMilliseconds()); @@ -125,22 +165,37 @@ public class IrisCarveModifier extends EngineAssignedModifier { boolean decCeiling = B.isSolid(output.get(rx, zone.ceiling + 1, rz)); int center = (zone.floor + zone.ceiling) / 2; int thickness = zone.airThickness(); - MatterCavern cavernData = (MatterCavern) mc.getOrCreate(center >> 4).slice(MatterCavern.class) - .get(rx, center & 15, rz); - IrisBiome biome = cavernData.getCustomBiome().isEmpty() ? getEngine().getCaveBiome(xx, zz) - : getEngine().getData().getBiomeLoader().load(cavernData.getCustomBiome()); + String customBiome = ""; + + for(int i = zone.floor; i <= zone.ceiling; i++) + { + MatterCavern cavernData = (MatterCavern) mc.getOrCreate(i >> 4).slice(MatterCavern.class) + .get(rx, i & 15, rz); + + if(cavernData != null && !cavernData.getCustomBiome().isEmpty()) + { + customBiome = cavernData.getCustomBiome(); + break; + } + } + + IrisBiome biome = customBiome.isEmpty() + ? getEngine().getCaveBiome(xx, zz) + : getEngine().getData().getBiomeLoader().load(customBiome); if(biome == null) { return; } + biome.setInferredType(InferredType.CAVE); + IrisDecorantActuator actuator = (IrisDecorantActuator) ((IrisEngine)getEngine()).getDecorantActuator(); for(IrisDecorator i : biome.getDecorators()) { - if (i.getPartOf().equals(IrisDecorationPart.NONE)) { - actuator.getSurfaceDecorator().decorate(rx, rz, xx, xx, xx, zz, zz, zz, output, biome, zone.getFloor() - 1, zone.getCeiling()); - } else if (i.getPartOf().equals(IrisDecorationPart.CEILING)) { - actuator.getCeilingDecorator().decorate(rx, rz, xx, xx, xx, zz, zz, zz, output, biome, zone.getCeiling() + 1, zone.getFloor()); + if (i.getPartOf().equals(IrisDecorationPart.NONE) && B.isSolid(output.get(rx, zone.getFloor()-1, rz))) { + actuator.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))) { + actuator.getCeilingDecorator().decorate(rx, rz, xx, xx, xx, zz, zz, zz, output, biome, zone.getCeiling(), zone.airThickness()); } } @@ -153,20 +208,40 @@ public class IrisCarveModifier extends EngineAssignedModifier { break; } - output.set(rx, zone.floor - i, rz, blocks.get(i)); + if(!B.isSolid(output.get(rx, zone.floor - i - 1, rz))) + { + continue; + } + + if(B.isOre(output.get(rx, zone.floor - i - 1, rz))) + { + continue; + } + + output.set(rx, zone.floor - i - 1, rz, blocks.get(i)); } -// blocks = biome.generateCeilingLayers(getDimension(), xx, zz, rng, 3, zone.floor, getData(), getComplex()).reverse(); -// -// for(int i = 0; i < zone.ceiling-1; i++) -// { -// if(!blocks.hasIndex(i)) -// { -// break; -// } -// -// output.set(rx, zone.ceiling + i, rz, blocks.get(i)); -// } + blocks = biome.generateCeilingLayers(getDimension(), xx, zz, rng, 3, zone.ceiling, getData(), getComplex()); + + for(int i = 0; i < zone.ceiling+1; i++) + { + if(!blocks.hasIndex(i)) + { + break; + } + + if(!B.isSolid(output.get(rx, zone.ceiling + i + 1, rz))) + { + continue; + } + + if(B.isOre(output.get(rx, zone.ceiling + i + 1, rz))) + { + continue; + } + + output.set(rx, zone.ceiling + i + 1, rz, blocks.get(i)); + } } @Data @@ -184,5 +259,10 @@ public class IrisCarveModifier extends EngineAssignedModifier { { return floor < ceiling && ceiling - floor >= 1 && floor >= 0 && ceiling <= 255 && airThickness() > 0; } + + public String toString() + { + return floor + "-" + ceiling; + } } }