From dbdf8a97aec8c8854be723a9a9778aa5e14a709b Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Wed, 14 Jul 2021 15:23:04 -0400 Subject: [PATCH] MCA Data Pack Support for custom biomes --- .../generator/actuator/IrisBiomeActuator.java | 41 ++++++++++++++++++- .../volmit/iris/nms/BiomeBaseInjector.java | 11 +++++ .../engine/EngineCompositeGenerator.java | 16 +++++++- .../scaffold/hunk/view/BiomeGridHunkView.java | 2 + .../volmit/iris/util/LinkedTerrainChunk.java | 7 ++++ .../com/volmit/iris/util/TerrainChunk.java | 3 ++ 6 files changed, 77 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/volmit/iris/nms/BiomeBaseInjector.java diff --git a/src/main/java/com/volmit/iris/generator/actuator/IrisBiomeActuator.java b/src/main/java/com/volmit/iris/generator/actuator/IrisBiomeActuator.java index 245d34fbe..160331a2c 100644 --- a/src/main/java/com/volmit/iris/generator/actuator/IrisBiomeActuator.java +++ b/src/main/java/com/volmit/iris/generator/actuator/IrisBiomeActuator.java @@ -1,5 +1,6 @@ package com.volmit.iris.generator.actuator; +import com.volmit.iris.nms.BiomeBaseInjector; import com.volmit.iris.nms.INMS; import com.volmit.iris.object.IrisBiome; import com.volmit.iris.object.IrisBiomeCustom; @@ -11,7 +12,9 @@ import com.volmit.iris.scaffold.parallel.BurstExecutor; import com.volmit.iris.scaffold.parallel.MultiBurst; import com.volmit.iris.util.PrecisionStopwatch; import com.volmit.iris.util.RNG; +import com.volmit.iris.util.TerrainChunk; import org.bukkit.block.Biome; +import org.bukkit.generator.ChunkGenerator; public class IrisBiomeActuator extends EngineAssignedActuator { private final RNG rng; @@ -21,6 +24,36 @@ public class IrisBiomeActuator extends EngineAssignedActuator { rng = new RNG(engine.getWorld().getSeed() + 243995); } + private boolean injectBiome(Hunk h, int x, int y, int z, Object bb) + { + try + { + if(h instanceof BiomeGridHunkView) + { + BiomeGridHunkView hh = (BiomeGridHunkView) h; + ChunkGenerator.BiomeGrid g = hh.getChunk(); + if(g instanceof TerrainChunk) + { + ((TerrainChunk) g).getBiomeBaseInjector().setBiome(x,y,z,bb); + return true; + } + + else + { + hh.forceBiomeBaseInto(x, y, z, bb); + return true; + } + } + } + + catch(Throwable e) + { + e.printStackTrace(); + } + + return false; + } + @Override public void onActuate(int x, int z, Hunk h) { PrecisionStopwatch p = PrecisionStopwatch.start(); @@ -41,10 +74,14 @@ public class IrisBiomeActuator extends EngineAssignedActuator { { IrisBiomeCustom custom = ib.getCustomBiome(rng, x, 0, z); Object biomeBase = INMS.get().getCustomBiomeBaseFor(getDimension().getLoadKey()+":"+custom.getId()); - ((BiomeGridHunkView)h).forceBiomeBaseInto(x, 0, z, biomeBase); + + if(!injectBiome(h, x, 0, z, biomeBase)) + { + throw new RuntimeException("Cant inject biome!"); + } for (int i = 0; i < h.getHeight(); i++) { - ((BiomeGridHunkView)h).forceBiomeBaseInto(xxf, i, zzf, biomeBase); + injectBiome(h, xxf, i, zzf, biomeBase); } } diff --git a/src/main/java/com/volmit/iris/nms/BiomeBaseInjector.java b/src/main/java/com/volmit/iris/nms/BiomeBaseInjector.java new file mode 100644 index 000000000..afa6f2a40 --- /dev/null +++ b/src/main/java/com/volmit/iris/nms/BiomeBaseInjector.java @@ -0,0 +1,11 @@ +package com.volmit.iris.nms; + +@FunctionalInterface +public interface BiomeBaseInjector { + default void setBiome(int x, int z, Object biomeBase) + { + setBiome(x, 0, z, biomeBase); + } + + void setBiome(int x, int y, int z, Object biomeBase); +} 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 c7bb9255f..07ccf6b55 100644 --- a/src/main/java/com/volmit/iris/scaffold/engine/EngineCompositeGenerator.java +++ b/src/main/java/com/volmit/iris/scaffold/engine/EngineCompositeGenerator.java @@ -4,6 +4,8 @@ import com.volmit.iris.Iris; import com.volmit.iris.IrisSettings; import com.volmit.iris.generator.IrisEngineCompound; import com.volmit.iris.manager.IrisDataManager; +import com.volmit.iris.nms.BiomeBaseInjector; +import com.volmit.iris.nms.INMS; import com.volmit.iris.object.IrisBiome; import com.volmit.iris.object.IrisDimension; import com.volmit.iris.object.IrisPosition; @@ -445,7 +447,13 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce int ox = x << 4; int oz = z << 4; com.volmit.iris.scaffold.data.mca.Chunk cc = writer.getChunk(x, z); + BiomeBaseInjector injector = (xx,yy,zz, biomeBase) -> cc.setBiomeAt(ox+xx, yy, oz+zz, INMS.get().getTrueBiomeBaseId(biomeBase)); generateChunkRawData(w, x, z, new TerrainChunk() { + @Override + public BiomeBaseInjector getBiomeBaseInjector() { + return injector; + } + @Override public void setRaw(ChunkData data) { @@ -468,7 +476,7 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce @Override public void setBiome(int x, int y, int z, Biome bio) { - writer.setBiome((ox + x), y, oz + z, bio); + writer.setBiome(ox + x, y, oz + z, bio); } @Override @@ -744,7 +752,13 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce clearRegeneratedLists(x, z); int xx = x * 16; int zz = z * 16; + BiomeBaseInjector inj = (a,b,c,d) -> {}; generateChunkRawData(getComposite().getWorld(), x, z, new TerrainChunk() { + @Override + public BiomeBaseInjector getBiomeBaseInjector() { + return inj; + } + @Override public void setRaw(ChunkData data) { diff --git a/src/main/java/com/volmit/iris/scaffold/hunk/view/BiomeGridHunkView.java b/src/main/java/com/volmit/iris/scaffold/hunk/view/BiomeGridHunkView.java index f5a86d361..b4ab1f14b 100644 --- a/src/main/java/com/volmit/iris/scaffold/hunk/view/BiomeGridHunkView.java +++ b/src/main/java/com/volmit/iris/scaffold/hunk/view/BiomeGridHunkView.java @@ -4,12 +4,14 @@ import com.volmit.iris.nms.INMS; import com.volmit.iris.scaffold.hunk.Hunk; import com.volmit.iris.util.LinkedTerrainChunk; import com.volmit.iris.util.TerrainChunk; +import lombok.Getter; import net.minecraft.world.level.chunk.BiomeStorage; import org.bukkit.block.Biome; import org.bukkit.craftbukkit.v1_17_R1.generator.CustomChunkGenerator; import org.bukkit.generator.ChunkGenerator.BiomeGrid; public class BiomeGridHunkView implements Hunk { + @Getter private final BiomeGrid chunk; public BiomeGridHunkView(BiomeGrid chunk) { diff --git a/src/main/java/com/volmit/iris/util/LinkedTerrainChunk.java b/src/main/java/com/volmit/iris/util/LinkedTerrainChunk.java index c348369ce..7e291e0a6 100644 --- a/src/main/java/com/volmit/iris/util/LinkedTerrainChunk.java +++ b/src/main/java/com/volmit/iris/util/LinkedTerrainChunk.java @@ -1,6 +1,8 @@ package com.volmit.iris.util; import com.volmit.iris.Iris; +import com.volmit.iris.nms.BiomeBaseInjector; +import com.volmit.iris.nms.INMS; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.Biome; @@ -44,6 +46,11 @@ public class LinkedTerrainChunk implements TerrainChunk { return null; } + @Override + public BiomeBaseInjector getBiomeBaseInjector() { + return (x, y, z, bb) -> INMS.get().forceBiomeInto(x, y, z, bb, storage); + } + @Override public Biome getBiome(int x, int z) { if (storage != null) { diff --git a/src/main/java/com/volmit/iris/util/TerrainChunk.java b/src/main/java/com/volmit/iris/util/TerrainChunk.java index bd0b129c2..547a1fd34 100644 --- a/src/main/java/com/volmit/iris/util/TerrainChunk.java +++ b/src/main/java/com/volmit/iris/util/TerrainChunk.java @@ -1,5 +1,6 @@ package com.volmit.iris.util; +import com.volmit.iris.nms.BiomeBaseInjector; import org.bukkit.World; import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; @@ -27,6 +28,8 @@ public interface TerrainChunk extends BiomeGrid, ChunkData { return new LinkedTerrainChunk(grid, maxHeight); } + BiomeBaseInjector getBiomeBaseInjector(); + void setRaw(ChunkData data); /**