From 2ad9a525bd3420c54d8cc4c2abb61fbc005427bf Mon Sep 17 00:00:00 2001 From: DanMB Date: Wed, 14 Sep 2022 03:56:06 -0400 Subject: [PATCH] Biome holder injection post gen --- .../com/volmit/iris/core/nms/INMSBinding.java | 4 + .../iris/core/nms/v19_2/NMSBinding19_2.java | 20 +++++ .../iris/core/nms/v1X/NMSBinding1X.java | 7 ++ .../volmit/iris/engine/IrisWorldManager.java | 20 ++++- .../engine/actuator/IrisBiomeActuator.java | 63 +++------------ .../iris/util/matter/MatterBiomeInject.java | 31 +++++++ .../util/matter/slices/BiomeInjectMatter.java | 80 +++++++++++++++++++ 7 files changed, 170 insertions(+), 55 deletions(-) create mode 100644 src/main/java/com/volmit/iris/util/matter/MatterBiomeInject.java create mode 100644 src/main/java/com/volmit/iris/util/matter/slices/BiomeInjectMatter.java diff --git a/src/main/java/com/volmit/iris/core/nms/INMSBinding.java b/src/main/java/com/volmit/iris/core/nms/INMSBinding.java index 031766349..5cb491a2e 100644 --- a/src/main/java/com/volmit/iris/core/nms/INMSBinding.java +++ b/src/main/java/com/volmit/iris/core/nms/INMSBinding.java @@ -18,9 +18,11 @@ package com.volmit.iris.core.nms; +import com.volmit.iris.util.mantle.Mantle; import com.volmit.iris.util.nbt.mca.palette.MCABiomeContainer; import com.volmit.iris.util.nbt.mca.palette.MCAPaletteAccess; import com.volmit.iris.util.nbt.tag.CompoundTag; +import org.bukkit.Chunk; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.WorldCreator; @@ -83,4 +85,6 @@ public interface INMSBinding { } MCAPaletteAccess createPalette(); + + void injectBiomesFromMantle(Chunk e, Mantle mantle); } diff --git a/src/main/java/com/volmit/iris/core/nms/v19_2/NMSBinding19_2.java b/src/main/java/com/volmit/iris/core/nms/v19_2/NMSBinding19_2.java index c595ca6ac..9dab95d52 100644 --- a/src/main/java/com/volmit/iris/core/nms/v19_2/NMSBinding19_2.java +++ b/src/main/java/com/volmit/iris/core/nms/v19_2/NMSBinding19_2.java @@ -25,6 +25,8 @@ import com.volmit.iris.engine.data.cache.AtomicCache; import com.volmit.iris.engine.object.IrisBiome; import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.hunk.Hunk; +import com.volmit.iris.util.mantle.Mantle; +import com.volmit.iris.util.matter.MatterBiomeInject; import com.volmit.iris.util.nbt.io.NBTUtil; import com.volmit.iris.util.nbt.mca.NBTWorld; import com.volmit.iris.util.nbt.mca.palette.MCABiomeContainer; @@ -399,6 +401,24 @@ public class NMSBinding19_2 implements INMSBinding { i -> ((CraftBlockData) NBTWorld.getBlockData(i)).getState()); } + @Override + public void injectBiomesFromMantle(Chunk e, Mantle mantle) { + LevelChunk chunk = ((CraftChunk)e).getHandle(); + mantle.iterateChunk(e.getX(), e.getZ(), MatterBiomeInject.class, (x,y,z,b) -> { + if(b != null) { + if(b.isCustom()) { + chunk.setBiome(x, y, z, (Holder) getBiomeBaseFromId(b.getBiomeId())); + } + + else { + chunk.setBiome(x, y, z, (Holder) getBiomeBase(e.getWorld(), b.getBiome())); + } + } + }); + + chunk.setUnsaved(true); + } + private static Object getFor(Class type, Object source) { Object o = fieldFor(type, source); diff --git a/src/main/java/com/volmit/iris/core/nms/v1X/NMSBinding1X.java b/src/main/java/com/volmit/iris/core/nms/v1X/NMSBinding1X.java index 6db7933ca..59cf364fc 100644 --- a/src/main/java/com/volmit/iris/core/nms/v1X/NMSBinding1X.java +++ b/src/main/java/com/volmit/iris/core/nms/v1X/NMSBinding1X.java @@ -20,9 +20,11 @@ package com.volmit.iris.core.nms.v1X; import com.volmit.iris.Iris; import com.volmit.iris.core.nms.INMSBinding; +import com.volmit.iris.util.mantle.Mantle; import com.volmit.iris.util.nbt.mca.palette.MCABiomeContainer; import com.volmit.iris.util.nbt.mca.palette.MCAPaletteAccess; import com.volmit.iris.util.nbt.tag.CompoundTag; +import org.bukkit.Chunk; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.block.Biome; @@ -57,6 +59,11 @@ public class NMSBinding1X implements INMSBinding { return null; } + @Override + public void injectBiomesFromMantle(Chunk e, Mantle mantle) { + + } + @Override public void deserializeTile(CompoundTag s, Location newPosition) { diff --git a/src/main/java/com/volmit/iris/engine/IrisWorldManager.java b/src/main/java/com/volmit/iris/engine/IrisWorldManager.java index fe8920c60..c03b3c51a 100644 --- a/src/main/java/com/volmit/iris/engine/IrisWorldManager.java +++ b/src/main/java/com/volmit/iris/engine/IrisWorldManager.java @@ -21,6 +21,7 @@ package com.volmit.iris.engine; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.loader.IrisData; +import com.volmit.iris.core.nms.INMS; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.framework.EngineAssignedWorldManager; import com.volmit.iris.engine.object.*; @@ -31,14 +32,14 @@ import com.volmit.iris.util.format.Form; import com.volmit.iris.util.mantle.Mantle; import com.volmit.iris.util.mantle.MantleFlag; import com.volmit.iris.util.math.M; +import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.math.RNG; +import com.volmit.iris.util.matter.MatterBiomeInject; import com.volmit.iris.util.matter.MatterMarker; import com.volmit.iris.util.parallel.MultiBurst; import com.volmit.iris.util.plugin.Chunks; import com.volmit.iris.util.plugin.VolmitSender; -import com.volmit.iris.util.scheduling.ChronoLatch; -import com.volmit.iris.util.scheduling.J; -import com.volmit.iris.util.scheduling.Looper; +import com.volmit.iris.util.scheduling.*; import com.volmit.iris.util.scheduling.jobs.QueueJob; import io.papermc.lib.PaperLib; import lombok.Data; @@ -81,6 +82,7 @@ public class IrisWorldManager extends EngineAssignedWorldManager { private int actuallySpawned = 0; private int cooldown = 0; private List precount = new KList<>(); + private KSet injectBiomes = new KSet<>(); public IrisWorldManager() { super(null); @@ -463,6 +465,10 @@ public class IrisWorldManager extends EngineAssignedWorldManager { getEngine().getMantle().save(); } + public void requestBiomeInject(Position2 p) { + injectBiomes.add(p); + } + @Override public void onChunkLoad(Chunk e, boolean generated) { if(getEngine().isClosed()) { @@ -472,6 +478,14 @@ public class IrisWorldManager extends EngineAssignedWorldManager { energy += 0.3; fixEnergy(); getEngine().cleanupMantleChunk(e.getX(), e.getZ()); + + if(generated && !injectBiomes.isEmpty()) { + Position2 p = new Position2(e.getX(), e.getZ()); + + if(injectBiomes.remove(p)) { + INMS.get().injectBiomesFromMantle(e, getMantle()); + } + } } private void spawn(IrisPosition block, IrisSpawner spawner, boolean initial) { diff --git a/src/main/java/com/volmit/iris/engine/actuator/IrisBiomeActuator.java b/src/main/java/com/volmit/iris/engine/actuator/IrisBiomeActuator.java index 71d0ffb43..c3946d3a5 100644 --- a/src/main/java/com/volmit/iris/engine/actuator/IrisBiomeActuator.java +++ b/src/main/java/com/volmit/iris/engine/actuator/IrisBiomeActuator.java @@ -31,6 +31,8 @@ import com.volmit.iris.util.hunk.Hunk; import com.volmit.iris.util.hunk.view.BiomeGridHunkHolder; import com.volmit.iris.util.hunk.view.BiomeGridHunkView; import com.volmit.iris.util.math.RNG; +import com.volmit.iris.util.matter.MatterBiomeInject; +import com.volmit.iris.util.matter.slices.BiomeInjectMatter; import com.volmit.iris.util.parallel.BurstExecutor; import com.volmit.iris.util.scheduling.ChronoLatch; import com.volmit.iris.util.scheduling.PrecisionStopwatch; @@ -47,33 +49,6 @@ public class IrisBiomeActuator extends EngineAssignedActuator { rng = new RNG(engine.getSeedManager().getBiome()); } - @BlockCoordinates - private boolean injectBiome(Hunk h, int x, int y, int z, Object bb) { - try { - if(h instanceof BiomeGridHunkView hh) { - ChunkGenerator.BiomeGrid g = hh.getChunk(); - if(g instanceof TerrainChunk) { - ((TerrainChunk) g).getBiomeBaseInjector().setBiome(x, y, z, bb); - } else { - hh.forceBiomeBaseInto(x, y, z, bb); - } - return true; - } else if(h instanceof BiomeGridHunkHolder hh) { - ChunkGenerator.BiomeGrid g = hh.getChunk(); - if(g instanceof TerrainChunk) { - ((TerrainChunk) g).getBiomeBaseInjector().setBiome(x, y, z, bb); - } else { - hh.forceBiomeBaseInto(x, y, z, bb); - } - return true; - } - } catch(Throwable e) { - e.printStackTrace(); - } - - return false; - } - @BlockCoordinates @Override public void onActuate(int x, int z, Hunk h, boolean multicore, ChunkContext context) { @@ -84,35 +59,19 @@ public class IrisBiomeActuator extends EngineAssignedActuator { for(int zf = 0; zf < h.getDepth(); zf++) { ib = context.getBiome().get(xf, zf); int maxHeight = (int) (getComplex().getFluidHeight() + ib.getMaxWithObjectHeight(getData())); + MatterBiomeInject matter = null; + if(ib.isCustom()) { - try { - IrisBiomeCustom custom = ib.getCustomBiome(rng, x, 0, z); - Object biomeBase = INMS.get().getCustomBiomeBaseHolderFor(getDimension().getLoadKey() + ":" + custom.getId()); - - if(biomeBase == null || !injectBiome(h, x, 0, z, biomeBase)) { - throw new RuntimeException("Cant inject biome!"); - } - - for(int i = 0; i < maxHeight; i++) { - injectBiome(h, xf, i, zf, biomeBase); - } - } catch(Throwable e) { - Iris.reportError(e); - Biome v = ib.getSkyBiome(rng, x, 0, z); - for(int i = 0; i < maxHeight; i++) { - h.set(xf, i, zf, v); - } - } + IrisBiomeCustom custom = ib.getCustomBiome(rng, x, 0, z); + Object biomeBase = INMS.get().getCustomBiomeBaseHolderFor(getDimension().getLoadKey() + ":" + custom.getId()); + matter = BiomeInjectMatter.get(INMS.get().getTrueBiomeBaseId(biomeBase)); } else { Biome v = ib.getSkyBiome(rng, x, 0, z); + matter = BiomeInjectMatter.get(v); + } - if(v != null) { - for(int i = 0; i < maxHeight; i++) { - h.set(xf, i, zf, v); - } - } else if(cl.flip()) { - Iris.error("No biome provided for " + ib.getLoadKey()); - } + for(int i = 0; i < maxHeight; i++) { + getEngine().getMantle().getMantle().set(x, i, z, matter); } } } diff --git a/src/main/java/com/volmit/iris/util/matter/MatterBiomeInject.java b/src/main/java/com/volmit/iris/util/matter/MatterBiomeInject.java new file mode 100644 index 000000000..038dad4ba --- /dev/null +++ b/src/main/java/com/volmit/iris/util/matter/MatterBiomeInject.java @@ -0,0 +1,31 @@ +/* + * Iris is a World Generator for Minecraft Bukkit Servers + * Copyright (c) 2022 Arcane Arts (Volmit Software) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.volmit.iris.util.matter; + +import lombok.AllArgsConstructor; +import lombok.Data; +import org.bukkit.block.Biome; + +@Data +@AllArgsConstructor +public class MatterBiomeInject { + private final boolean custom; + private final Integer biomeId; + private final Biome biome; +} diff --git a/src/main/java/com/volmit/iris/util/matter/slices/BiomeInjectMatter.java b/src/main/java/com/volmit/iris/util/matter/slices/BiomeInjectMatter.java new file mode 100644 index 000000000..2db4194b3 --- /dev/null +++ b/src/main/java/com/volmit/iris/util/matter/slices/BiomeInjectMatter.java @@ -0,0 +1,80 @@ +/* + * Iris is a World Generator for Minecraft Bukkit Servers + * Copyright (c) 2022 Arcane Arts (Volmit Software) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.volmit.iris.util.matter.slices; + +import com.volmit.iris.util.data.palette.Palette; +import com.volmit.iris.util.matter.MatterBiomeInject; +import com.volmit.iris.util.matter.MatterCavern; +import com.volmit.iris.util.matter.Sliced; +import org.bukkit.block.Biome; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +@Sliced +public class BiomeInjectMatter extends RawMatter { + public BiomeInjectMatter() { + this(1, 1, 1); + } + + @Override + public Palette getGlobalPalette() { + return null; + } + + public BiomeInjectMatter(int width, int height, int depth) { + super(width, height, depth, MatterBiomeInject.class); + } + + public static MatterBiomeInject get(Biome biome) + { + return get(false, 0, biome); + } + + public static MatterBiomeInject get(int customBiome) { + return get(true, customBiome, null); + } + + public static MatterBiomeInject get(boolean custom, int customBiome, Biome biome) { + return new MatterBiomeInject(custom, customBiome, biome); + } + + @Override + public void writeNode(MatterBiomeInject b, DataOutputStream dos) throws IOException { + dos.writeBoolean(b.isCustom()); + + if(b.isCustom()) { + dos.writeShort(b.getBiomeId()); + } + + else { + dos.writeByte(b.getBiome().ordinal()); + } + } + + @Override + public MatterBiomeInject readNode(DataInputStream din) throws IOException { + boolean b = din.readBoolean(); + int id = b ? din.readShort() : 0; + Biome biome = !b ? Biome.values()[din.readByte()] : Biome.PLAINS; + + return new MatterBiomeInject(b, id, biome); + } +}