diff --git a/core/src/main/java/com/volmit/iris/core/link/HMCLeavesDataProvider.java b/core/src/main/java/com/volmit/iris/core/link/HMCLeavesDataProvider.java index 21207a22f..84c47a3f5 100644 --- a/core/src/main/java/com/volmit/iris/core/link/HMCLeavesDataProvider.java +++ b/core/src/main/java/com/volmit/iris/core/link/HMCLeavesDataProvider.java @@ -6,7 +6,7 @@ import com.volmit.iris.core.service.ExternalDataSVC; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; -import com.volmit.iris.util.data.IrisBlockData; +import com.volmit.iris.util.data.IrisCustomData; import com.volmit.iris.util.reflect.WrappedField; import com.volmit.iris.util.reflect.WrappedReturningMethod; import org.bukkit.Bukkit; @@ -62,7 +62,7 @@ public class HMCLeavesDataProvider extends ExternalDataProvider { BlockData blockData = Bukkit.createBlockData(material); if (IrisSettings.get().getGenerator().preventLeafDecay && blockData instanceof Leaves leaves) leaves.setPersistent(true); - return new IrisBlockData(blockData, ExternalDataSVC.buildState(blockId, state)); + return new IrisCustomData(blockData, ExternalDataSVC.buildState(blockId, state)); } @Override diff --git a/core/src/main/java/com/volmit/iris/core/link/OraxenDataProvider.java b/core/src/main/java/com/volmit/iris/core/link/OraxenDataProvider.java index 233701866..f091fb1c5 100644 --- a/core/src/main/java/com/volmit/iris/core/link/OraxenDataProvider.java +++ b/core/src/main/java/com/volmit/iris/core/link/OraxenDataProvider.java @@ -27,7 +27,7 @@ import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.data.B; -import com.volmit.iris.util.data.IrisBlockData; +import com.volmit.iris.util.data.IrisCustomData; import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.reflect.WrappedField; import io.th0rgal.oraxen.api.OraxenItems; @@ -90,7 +90,7 @@ public class OraxenDataProvider extends ExternalDataProvider { } else if (factory instanceof StringBlockMechanicFactory f) { return f.createTripwireData(blockId.key()); } else if (factory instanceof FurnitureFactory) { - return new IrisBlockData(B.getAir(), ExternalDataSVC.buildState(blockId, state)); + return new IrisCustomData(B.getAir(), ExternalDataSVC.buildState(blockId, state)); } else throw new MissingResourceException("Failed to find BlockData!", blockId.namespace(), blockId.key()); } diff --git a/core/src/main/java/com/volmit/iris/engine/IrisComplex.java b/core/src/main/java/com/volmit/iris/engine/IrisComplex.java index a0da316aa..908757c90 100644 --- a/core/src/main/java/com/volmit/iris/engine/IrisComplex.java +++ b/core/src/main/java/com/volmit/iris/engine/IrisComplex.java @@ -41,6 +41,7 @@ import org.bukkit.Material; import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; +import java.util.HashMap; import java.util.UUID; @Data @@ -287,14 +288,15 @@ public class IrisComplex implements DataProvider { return biome; } + private record DPair(double x, double z) {} private double interpolateGenerators(Engine engine, IrisInterpolator interpolator, KSet generators, double x, double z, long seed) { if (generators.isEmpty()) { return 0; } - + var cache = new HashMap(); double hi = interpolator.interpolate(x, z, (xx, zz) -> { try { - IrisBiome bx = baseBiomeStream.get(xx, zz); + IrisBiome bx = cache.computeIfAbsent(new DPair(xx, zz), k -> baseBiomeStream.get(k.x, k.z)); double b = 0; for (IrisGenerator gen : generators) { @@ -313,7 +315,7 @@ public class IrisComplex implements DataProvider { double lo = interpolator.interpolate(x, z, (xx, zz) -> { try { - IrisBiome bx = baseBiomeStream.get(xx, zz); + IrisBiome bx = cache.computeIfAbsent(new DPair(xx, zz), k -> baseBiomeStream.get(k.x, k.z)); double b = 0; for (IrisGenerator gen : generators) { @@ -329,6 +331,7 @@ public class IrisComplex implements DataProvider { return 0; }); + cache.clear(); double d = 0; diff --git a/core/src/main/java/com/volmit/iris/engine/data/chunk/LinkedTerrainChunk.java b/core/src/main/java/com/volmit/iris/engine/data/chunk/LinkedTerrainChunk.java index 015efd0e9..b726610cb 100644 --- a/core/src/main/java/com/volmit/iris/engine/data/chunk/LinkedTerrainChunk.java +++ b/core/src/main/java/com/volmit/iris/engine/data/chunk/LinkedTerrainChunk.java @@ -21,7 +21,7 @@ package com.volmit.iris.engine.data.chunk; 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.data.IrisBlockData; +import com.volmit.iris.util.data.IrisCustomData; import lombok.Setter; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -121,7 +121,7 @@ public class LinkedTerrainChunk implements TerrainChunk { @Override public synchronized void setBlock(int x, int y, int z, BlockData blockData) { - if (blockData instanceof IrisBlockData d) + if (blockData instanceof IrisCustomData d) blockData = d.getBase(); rawChunkData.setBlock(x, y, z, blockData); } diff --git a/core/src/main/java/com/volmit/iris/engine/data/chunk/MCATerrainChunk.java b/core/src/main/java/com/volmit/iris/engine/data/chunk/MCATerrainChunk.java index 2da3db43a..d4c1cbf8d 100644 --- a/core/src/main/java/com/volmit/iris/engine/data/chunk/MCATerrainChunk.java +++ b/core/src/main/java/com/volmit/iris/engine/data/chunk/MCATerrainChunk.java @@ -20,7 +20,7 @@ package com.volmit.iris.engine.data.chunk; import com.volmit.iris.Iris; import com.volmit.iris.core.nms.BiomeBaseInjector; -import com.volmit.iris.util.data.IrisBlockData; +import com.volmit.iris.util.data.IrisCustomData; import com.volmit.iris.util.nbt.mca.Chunk; import com.volmit.iris.util.nbt.mca.NBTWorld; import lombok.AllArgsConstructor; @@ -89,7 +89,7 @@ public class MCATerrainChunk implements TerrainChunk { if (blockData == null) { Iris.error("NULL BD"); } - if (blockData instanceof IrisBlockData data) + if (blockData instanceof IrisCustomData data) blockData = data.getBase(); mcaChunk.setBlockStateAt(xx, y, zz, NBTWorld.getCompound(blockData), false); 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 3fda9ab4b..7bf1356bf 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 @@ -40,7 +40,7 @@ import com.volmit.iris.util.context.ChunkContext; import com.volmit.iris.util.context.IrisContext; import com.volmit.iris.util.data.B; import com.volmit.iris.util.data.DataProvider; -import com.volmit.iris.util.data.IrisBlockData; +import com.volmit.iris.util.data.IrisCustomData; import com.volmit.iris.util.documentation.BlockCoordinates; import com.volmit.iris.util.documentation.ChunkCoordinates; import com.volmit.iris.util.format.C; @@ -257,10 +257,8 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat if (B.isUpdatable(data)) { getMantle().updateBlock(x, y, z); } - if (data instanceof IrisBlockData d) { - getMantle().getMantle().set(x, y, z, d.getCustom()); - } else { - getMantle().getMantle().remove(x, y, z, Identifier.class); + if (data instanceof IrisCustomData) { + getMantle().getMantle().flag(x >> 4, z >> 4, MantleFlag.CUSTOM_ACTIVE, true); } } @@ -282,18 +280,21 @@ public interface Engine extends DataProvider, Fallible, LootProvider, BlockUpdat return; } - getMantle().getMantle().raiseFlag(c.getX(), c.getZ(), MantleFlag.TILE, () -> J.s(() -> { - getMantle().getMantle().iterateChunk(c.getX(), c.getZ(), TileWrapper.class, (x, y, z, tile) -> { + var mc = getMantle().getMantle().getChunk(c.getX(), c.getZ()); + mc.raiseFlag(MantleFlag.TILE, () -> J.s(() -> { + mc.iterate(TileWrapper.class, (x, y, z, tile) -> { int betterY = y + getWorld().minHeight(); if (!TileData.setTileState(c.getBlock(x, betterY, z), tile.getData())) Iris.warn("Failed to set tile entity data at [%d %d %d | %s] for tile %s!", x, betterY, z, c.getBlock(x, betterY, z).getBlockData().getMaterial().getKey(), tile.getData().getTileId()); }); })); - getMantle().getMantle().raiseFlag(c.getX(), c.getZ(), MantleFlag.CUSTOM, () -> J.s(() -> { - getMantle().getMantle().iterateChunk(c.getX(), c.getZ(), Identifier.class, (x, y, z, v) -> { - Iris.service(ExternalDataSVC.class).processUpdate(this, c.getBlock(x & 15, y + getWorld().minHeight(), z & 15), v); - }); - })); + if (mc.isFlagged(MantleFlag.CUSTOM_ACTIVE)) { + mc.raiseFlag(MantleFlag.CUSTOM, () -> J.s(() -> { + getMantle().getMantle().iterateChunk(c.getX(), c.getZ(), Identifier.class, (x, y, z, v) -> { + Iris.service(ExternalDataSVC.class).processUpdate(this, c.getBlock(x & 15, y + getWorld().minHeight(), z & 15), v); + }); + })); + } getMantle().getMantle().raiseFlag(c.getX(), c.getZ(), MantleFlag.UPDATE, () -> J.s(() -> { PrecisionStopwatch p = PrecisionStopwatch.start(); diff --git a/core/src/main/java/com/volmit/iris/engine/jigsaw/PlannedStructure.java b/core/src/main/java/com/volmit/iris/engine/jigsaw/PlannedStructure.java index 9ee15169b..b5b587d47 100644 --- a/core/src/main/java/com/volmit/iris/engine/jigsaw/PlannedStructure.java +++ b/core/src/main/java/com/volmit/iris/engine/jigsaw/PlannedStructure.java @@ -25,7 +25,7 @@ import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.framework.placer.WorldObjectPlacer; import com.volmit.iris.engine.object.*; import com.volmit.iris.util.collection.KList; -import com.volmit.iris.util.data.IrisBlockData; +import com.volmit.iris.util.data.IrisCustomData; import com.volmit.iris.util.mantle.Mantle; import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.math.RNG; @@ -150,9 +150,6 @@ public class PlannedStructure { return v.place(xx, height, zz, placer, options, rng, (b, data) -> { e.set(b.getX(), b.getY(), b.getZ(), v.getLoadKey() + "@" + id); e.set(b.getX(), b.getY(), b.getZ(), container); - if (data instanceof IrisBlockData d) { - e.set(b.getX(), b.getY(), b.getZ(), d.getCustom()); - } }, null, getData().getEngine() != null ? getData() : eng.getData()) != -1; } diff --git a/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleObjectComponent.java b/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleObjectComponent.java index d8ee933f0..fc4b8c4cc 100644 --- a/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleObjectComponent.java +++ b/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleObjectComponent.java @@ -27,7 +27,7 @@ import com.volmit.iris.engine.object.*; import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.context.ChunkContext; import com.volmit.iris.util.data.B; -import com.volmit.iris.util.data.IrisBlockData; +import com.volmit.iris.util.data.IrisCustomData; import com.volmit.iris.util.documentation.BlockCoordinates; import com.volmit.iris.util.documentation.ChunkCoordinates; import com.volmit.iris.util.mantle.MantleFlag; @@ -104,7 +104,7 @@ public class MantleObjectComponent extends IrisMantleComponent { if (objectPlacement.isDolphinTarget() && objectPlacement.isUnderwater() && B.isStorageChest(data)) { writer.setData(b.getX(), b.getY(), b.getZ(), MatterStructurePOI.BURIED_TREASURE); } - if (data instanceof IrisBlockData d) { + if (data instanceof IrisCustomData d) { writer.setData(b.getX(), b.getY(), b.getZ(), d.getCustom()); } }, null, getData()); diff --git a/core/src/main/java/com/volmit/iris/engine/mode/ModeOverworld.java b/core/src/main/java/com/volmit/iris/engine/mode/ModeOverworld.java index 3645b7d8c..7320afc0a 100644 --- a/core/src/main/java/com/volmit/iris/engine/mode/ModeOverworld.java +++ b/core/src/main/java/com/volmit/iris/engine/mode/ModeOverworld.java @@ -25,10 +25,7 @@ import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.framework.EngineMode; import com.volmit.iris.engine.framework.EngineStage; import com.volmit.iris.engine.framework.IrisEngineMode; -import com.volmit.iris.engine.modifier.IrisCarveModifier; -import com.volmit.iris.engine.modifier.IrisDepositModifier; -import com.volmit.iris.engine.modifier.IrisPerfectionModifier; -import com.volmit.iris.engine.modifier.IrisPostModifier; +import com.volmit.iris.engine.modifier.*; import org.bukkit.block.data.BlockData; public class ModeOverworld extends IrisEngineMode implements EngineMode { @@ -41,6 +38,7 @@ public class ModeOverworld extends IrisEngineMode implements EngineMode { var post = new IrisPostModifier(getEngine()); var deposit = new IrisDepositModifier(getEngine()); var perfection = new IrisPerfectionModifier(getEngine()); + var custom = new IrisCustomModifier(getEngine()); EngineStage sBiome = (x, z, k, p, m, c) -> biome.actuate(x, z, p, m, c); EngineStage sGenMatter = (x, z, k, p, m, c) -> generateMatter(x >> 4, z >> 4, m, c); EngineStage sTerrain = (x, z, k, p, m, c) -> terrain.actuate(x, z, k, m, c); @@ -50,6 +48,7 @@ public class ModeOverworld extends IrisEngineMode implements EngineMode { EngineStage sPost = (x, z, k, p, m, c) -> post.modify(x, z, k, m, c); EngineStage sInsertMatter = (x, z, K, p, m, c) -> getMantle().insertMatter(x >> 4, z >> 4, BlockData.class, K, m); EngineStage sPerfection = (x, z, k, p, m, c) -> perfection.modify(x, z, k, m, c); + EngineStage sCustom = (x, z, k, p, m, c) -> custom.modify(x, z, k, m, c); registerStage(burst( sGenMatter, @@ -65,6 +64,7 @@ public class ModeOverworld extends IrisEngineMode implements EngineMode { sDecorant )); registerStage(sPerfection); + registerStage(sCustom); } } diff --git a/core/src/main/java/com/volmit/iris/engine/modifier/IrisCustomModifier.java b/core/src/main/java/com/volmit/iris/engine/modifier/IrisCustomModifier.java new file mode 100644 index 000000000..83cb74ded --- /dev/null +++ b/core/src/main/java/com/volmit/iris/engine/modifier/IrisCustomModifier.java @@ -0,0 +1,44 @@ +package com.volmit.iris.engine.modifier; + +import com.volmit.iris.core.link.Identifier; +import com.volmit.iris.engine.framework.Engine; +import com.volmit.iris.engine.framework.EngineAssignedModifier; +import com.volmit.iris.util.context.ChunkContext; +import com.volmit.iris.util.data.IrisCustomData; +import com.volmit.iris.util.hunk.Hunk; +import com.volmit.iris.util.mantle.MantleFlag; +import com.volmit.iris.util.parallel.BurstExecutor; +import com.volmit.iris.util.parallel.MultiBurst; +import org.bukkit.block.data.BlockData; + +public class IrisCustomModifier extends EngineAssignedModifier { + public IrisCustomModifier(Engine engine) { + super(engine, "Custom"); + } + + @Override + public void onModify(int x, int z, Hunk output, boolean multicore, ChunkContext context) { + var mc = getEngine().getMantle().getMantle().getChunk(x >> 4, z >> 4); + if (!mc.isFlagged(MantleFlag.CUSTOM_ACTIVE)) return; + + BurstExecutor burst = MultiBurst.burst.burst(output.getHeight()); + burst.setMulticore(multicore); + for (int y = 0; y < output.getHeight(); y++) { + int finalY = y; + burst.queue(() -> { + for (int rX = 0; rX < output.getWidth(); rX++) { + for (int rZ = 0; rZ < output.getDepth(); rZ++) { + BlockData b = output.get(rX, finalY, rZ); + if (!(b instanceof IrisCustomData d)) continue; + + mc.getOrCreate(finalY >> 4) + .slice(Identifier.class) + .set(rX, finalY & 15, rZ, d.getCustom()); + output.set(rX, finalY, rZ, d.getBase()); + } + } + }); + } + burst.complete(); + } +} diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisObject.java b/core/src/main/java/com/volmit/iris/engine/object/IrisObject.java index cb85b0d66..a312581d3 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/IrisObject.java +++ b/core/src/main/java/com/volmit/iris/engine/object/IrisObject.java @@ -29,7 +29,7 @@ import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.context.IrisContext; import com.volmit.iris.util.data.B; -import com.volmit.iris.util.data.IrisBlockData; +import com.volmit.iris.util.data.IrisCustomData; import com.volmit.iris.util.format.Form; import com.volmit.iris.util.interpolation.IrisInterpolation; import com.volmit.iris.util.json.JSONObject; @@ -837,7 +837,7 @@ public class IrisObject extends IrisRegistrant { 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() && !(newData instanceof IrisBlockData || data instanceof IrisBlockData)) + if (newData.getMaterial() == data.getMaterial() && !(newData instanceof IrisCustomData || data instanceof IrisCustomData)) data = data.merge(newData); else data = newData; diff --git a/core/src/main/java/com/volmit/iris/util/data/IrisBlockData.java b/core/src/main/java/com/volmit/iris/util/data/IrisCustomData.java similarity index 92% rename from core/src/main/java/com/volmit/iris/util/data/IrisBlockData.java rename to core/src/main/java/com/volmit/iris/util/data/IrisCustomData.java index b5cd4030c..c02ea2879 100644 --- a/core/src/main/java/com/volmit/iris/util/data/IrisBlockData.java +++ b/core/src/main/java/com/volmit/iris/util/data/IrisCustomData.java @@ -15,7 +15,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @Data -public class IrisBlockData implements BlockData { +public class IrisCustomData implements BlockData { private final @NonNull BlockData base; private final @NotNull Identifier custom; @@ -40,12 +40,12 @@ public class IrisBlockData implements BlockData { @NotNull @Override public BlockData merge(@NotNull BlockData blockData) { - return new IrisBlockData(base.merge(blockData), custom); + return new IrisCustomData(base.merge(blockData), custom); } @Override public boolean matches(@Nullable BlockData blockData) { - if (blockData instanceof IrisBlockData b) + if (blockData instanceof IrisCustomData b) return custom.equals(b.custom) && base.matches(b.base); return base.matches(blockData); } @@ -53,7 +53,7 @@ public class IrisBlockData implements BlockData { @NotNull @Override public BlockData clone() { - return new IrisBlockData(base.clone(), custom); + return new IrisCustomData(base.clone(), custom); } @NotNull diff --git a/core/src/main/java/com/volmit/iris/util/hunk/view/ChunkDataHunkView.java b/core/src/main/java/com/volmit/iris/util/hunk/view/ChunkDataHunkView.java index 62cb7fc61..b27c22fa1 100644 --- a/core/src/main/java/com/volmit/iris/util/hunk/view/ChunkDataHunkView.java +++ b/core/src/main/java/com/volmit/iris/util/hunk/view/ChunkDataHunkView.java @@ -19,7 +19,7 @@ package com.volmit.iris.util.hunk.view; import com.volmit.iris.util.data.B; -import com.volmit.iris.util.data.IrisBlockData; +import com.volmit.iris.util.data.IrisCustomData; import com.volmit.iris.util.hunk.Hunk; import org.bukkit.block.data.BlockData; import org.bukkit.generator.ChunkGenerator.ChunkData; @@ -73,7 +73,7 @@ public class ChunkDataHunkView implements Hunk { } try { - if (t instanceof IrisBlockData d) + if (t instanceof IrisCustomData d) t = d.getBase(); chunk.setBlock(x, y + chunk.getMinHeight(), z, t); } catch (Throwable ignored) { diff --git a/core/src/main/java/com/volmit/iris/util/mantle/MantleFlag.java b/core/src/main/java/com/volmit/iris/util/mantle/MantleFlag.java index 6bb5f1e6f..67e980b50 100644 --- a/core/src/main/java/com/volmit/iris/util/mantle/MantleFlag.java +++ b/core/src/main/java/com/volmit/iris/util/mantle/MantleFlag.java @@ -34,7 +34,8 @@ public enum MantleFlag { PLANNED, ETCHED, TILE, - CUSTOM; + CUSTOM, + CUSTOM_ACTIVE; static StateList getStateList() { return new StateList(MantleFlag.values()); diff --git a/core/src/main/java/com/volmit/iris/util/matter/slices/BlockMatter.java b/core/src/main/java/com/volmit/iris/util/matter/slices/BlockMatter.java index cf6eef776..5322ca5de 100644 --- a/core/src/main/java/com/volmit/iris/util/matter/slices/BlockMatter.java +++ b/core/src/main/java/com/volmit/iris/util/matter/slices/BlockMatter.java @@ -18,7 +18,7 @@ package com.volmit.iris.util.matter.slices; -import com.volmit.iris.util.data.IrisBlockData; +import com.volmit.iris.util.data.IrisCustomData; import com.volmit.iris.util.data.palette.Palette; import com.volmit.iris.util.matter.Sliced; import org.bukkit.Bukkit; @@ -41,7 +41,7 @@ public class BlockMatter extends RawMatter { public BlockMatter(int width, int height, int depth) { super(width, height, depth, BlockData.class); registerWriter(World.class, ((w, d, x, y, z) -> { - if (d instanceof IrisBlockData c) + if (d instanceof IrisCustomData c) w.getBlockAt(x, y, z).setBlockData(c.getBase()); else w.getBlockAt(x, y, z).setBlockData(d); })); diff --git a/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/Headless.java b/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/Headless.java index e13c2b2fa..5af84c6fc 100644 --- a/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/Headless.java +++ b/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/Headless.java @@ -2,7 +2,6 @@ package com.volmit.iris.core.nms.v1_20_R3; import com.volmit.iris.Iris; import com.volmit.iris.core.ServerConfigurator; -import com.volmit.iris.core.nms.BiomeBaseInjector; import com.volmit.iris.core.nms.IHeadless; import com.volmit.iris.core.nms.v1_20_R3.mca.MCATerrainChunk; import com.volmit.iris.core.nms.v1_20_R3.mca.RegionFileStorage; @@ -33,7 +32,6 @@ import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.ChunkStatus; import net.minecraft.world.level.chunk.ProtoChunk; import org.bukkit.Material; -import org.bukkit.NamespacedKey; import org.bukkit.block.data.BlockData; import java.io.File; @@ -51,13 +49,15 @@ public class Headless implements IHeadless, LevelHeightAccessor { private final Queue chunkQueue = new ArrayDeque<>(); private final ReentrantLock saveLock = new ReentrantLock(); private final KMap> customBiomes = new KMap<>(); - private final KMap> minecraftBiomes = new KMap<>(); + private final KMap> minecraftBiomes = new KMap<>(); + private final RNG BIOME_RNG; private boolean closed = false; public Headless(NMSBinding binding, Engine engine) { this.binding = binding; this.engine = engine; this.storage = new RegionFileStorage(new File(engine.getWorld().worldFolder(), "region").toPath(), false); + this.BIOME_RNG = new RNG(engine.getSeedManager().getBiome()); var queueLooper = new Looper() { @Override protected long loop() { @@ -78,8 +78,7 @@ public class Headless implements IHeadless, LevelHeightAccessor { } for (var biome : org.bukkit.block.Biome.values()) { if (biome == org.bukkit.block.Biome.CUSTOM) continue; - var key = biome.getKey(); - minecraftBiomes.put(key, binding.getBiomeHolder(key.getNamespace(), key.getKey())); + minecraftBiomes.put(biome, binding.getBiomeHolder(biome.getKey())); } ServerConfigurator.dumpDataPack(); } @@ -165,7 +164,7 @@ public class Headless implements IHeadless, LevelHeightAccessor { blocks.apply(); biomes.apply(); - inject(engine, tc.getBiomeBaseInjector(), chunk, ctx); //TODO improve + inject(engine, chunk, ctx); chunk.setStatus(ChunkStatus.FULL); chunkQueue.add(chunk); } catch (Throwable e) { @@ -214,7 +213,7 @@ public class Headless implements IHeadless, LevelHeightAccessor { return ctx; } - private void inject(Engine engine, BiomeBaseInjector injector, ChunkAccess chunk, ChunkContext ctx) { + private void inject(Engine engine, ChunkAccess chunk, ChunkContext ctx) { var pos = chunk.getPos(); for (int y = engine.getMinHeight(); y < engine.getMaxHeight(); y++) { for (int x = 0; x < 16; x++) { @@ -222,7 +221,7 @@ public class Headless implements IHeadless, LevelHeightAccessor { int wX = pos.getBlockX(x); int wZ = pos.getBlockZ(z); try { - injector.setBiome(x, y, z, getNoiseBiome(engine, ctx, x, z, wX, y, wZ)); + chunk.setBiome(x, y, z, getNoiseBiome(engine, ctx, x, z, wX, y, wZ)); } catch (Throwable e) { Iris.error("Failed to inject biome for " + wX + ", " + y + ", " + wZ); e.printStackTrace(); @@ -233,17 +232,14 @@ public class Headless implements IHeadless, LevelHeightAccessor { } private Holder getNoiseBiome(Engine engine, ChunkContext ctx, int rX, int rZ, int x, int y, int z) { - RNG rng = new RNG(engine.getSeedManager().getBiome()); int m = (y - engine.getMinHeight()) << 2; IrisBiome ib = ctx == null ? engine.getComplex().getTrueBiomeStream().get(x << 2, z << 2) : ctx.getBiome().get(rX, rZ); if (ib.isCustom()) { - return customBiomes.computeIfAbsent(ib.getCustomBiome(rng, x << 2, m, z << 2).getId(), - id -> binding.getBiomeHolder(engine.getDimension().getLoadKey(), id)); + return customBiomes.get(ib.getCustomBiome(BIOME_RNG, x << 2, m, z << 2).getId()); } else { - return minecraftBiomes.computeIfAbsent(ib.getSkyBiome(rng, x << 2, m, z << 2).getKey(), - id -> binding.getBiomeHolder(id.getNamespace(), id.getKey())); + return minecraftBiomes.get(ib.getSkyBiome(BIOME_RNG, x << 2, m, z << 2)); } } diff --git a/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/NMSBinding.java b/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/NMSBinding.java index db52a6c01..92af68d94 100644 --- a/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/NMSBinding.java +++ b/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/NMSBinding.java @@ -906,6 +906,10 @@ public class NMSBinding implements INMSBinding { } } + Holder.Reference getBiomeHolder(NamespacedKey key) { + return getBiomeHolder(key.getNamespace(), key.getKey()); + } + Holder.Reference getBiomeHolder(String namespace, String id) { return getCustomBiomeRegistry().getHolder(ResourceKey.create(Registries.BIOME, new ResourceLocation(namespace, id))).orElse(null); } diff --git a/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/mca/MCATerrainChunk.java b/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/mca/MCATerrainChunk.java index e574c892a..71467a450 100644 --- a/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/mca/MCATerrainChunk.java +++ b/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/mca/MCATerrainChunk.java @@ -3,7 +3,7 @@ package com.volmit.iris.core.nms.v1_20_R3.mca; import com.volmit.iris.Iris; import com.volmit.iris.core.nms.BiomeBaseInjector; import com.volmit.iris.engine.data.chunk.TerrainChunk; -import com.volmit.iris.util.data.IrisBlockData; +import com.volmit.iris.util.data.IrisCustomData; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; import net.minecraft.world.level.LevelHeightAccessor; @@ -22,7 +22,7 @@ public record MCATerrainChunk(ChunkAccess chunk) implements TerrainChunk { @Override public BiomeBaseInjector getBiomeBaseInjector() { - return (x, y, z, biomeBase) -> chunk.setBiome(x, y, z, (Holder) biomeBase); + return null; } @Override @@ -71,7 +71,7 @@ public record MCATerrainChunk(ChunkAccess chunk) implements TerrainChunk { if (blockData == null) { Iris.error("NULL BD"); } - if (blockData instanceof IrisBlockData data) + if (blockData instanceof IrisCustomData data) blockData = data.getBase(); if (!(blockData instanceof CraftBlockData craftBlockData)) throw new IllegalArgumentException("Expected CraftBlockData, got " + blockData.getClass().getSimpleName() + " instead");