From effb0f5b91458bccfe918d6e5e7c9fd108d642a3 Mon Sep 17 00:00:00 2001 From: Julian Krings Date: Sun, 18 Aug 2024 17:02:34 +0200 Subject: [PATCH] fix biome colors --- .../iris/util/reflect/WrappedField.java | 12 ++++++ .../core/nms/v1_19_R1/IrisChunkGenerator.java | 37 +++++++++++++---- .../core/nms/v1_19_R2/IrisChunkGenerator.java | 41 ++++++++++++++----- .../core/nms/v1_19_R3/IrisChunkGenerator.java | 37 +++++++++++++---- .../core/nms/v1_20_R1/IrisChunkGenerator.java | 37 +++++++++++++---- .../core/nms/v1_20_R2/IrisChunkGenerator.java | 37 +++++++++++++---- .../core/nms/v1_20_R3/IrisChunkGenerator.java | 37 +++++++++++++---- .../core/nms/v1_20_R4/IrisChunkGenerator.java | 37 +++++++++++++---- .../core/nms/v1_21_R1/IrisChunkGenerator.java | 37 +++++++++++++---- 9 files changed, 245 insertions(+), 67 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/util/reflect/WrappedField.java b/core/src/main/java/com/volmit/iris/util/reflect/WrappedField.java index 3249fa07f..0aad874ad 100644 --- a/core/src/main/java/com/volmit/iris/util/reflect/WrappedField.java +++ b/core/src/main/java/com/volmit/iris/util/reflect/WrappedField.java @@ -36,6 +36,18 @@ public class WrappedField { } } + public void set(T value) throws IllegalAccessException { + set(null, value); + } + + public void set(C instance, T value) throws IllegalAccessException { + if (field == null) { + return; + } + + field.set(instance, value); + } + public boolean hasFailed() { return field == null; } diff --git a/nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/IrisChunkGenerator.java b/nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/IrisChunkGenerator.java index 040d588df..df23a6d05 100644 --- a/nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/IrisChunkGenerator.java +++ b/nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/IrisChunkGenerator.java @@ -13,6 +13,7 @@ import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.mantle.MantleFlag; import com.volmit.iris.util.math.Position2; +import com.volmit.iris.util.reflect.WrappedField; import net.minecraft.core.*; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; @@ -42,6 +43,7 @@ import org.bukkit.craftbukkit.v1_19_R1.CraftWorld; import org.bukkit.craftbukkit.v1_19_R1.generator.CustomChunkGenerator; import javax.annotation.Nullable; +import java.lang.reflect.Field; import java.util.List; import java.util.Objects; import java.util.concurrent.CompletableFuture; @@ -49,16 +51,15 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor; public class IrisChunkGenerator extends CustomChunkGenerator { + private static final WrappedField BIOME_SOURCE; private final ChunkGenerator delegate; private final Engine engine; - private final BiomeSource biomeSource; private final KMap, KSet> structures = new KMap<>(); public IrisChunkGenerator(ChunkGenerator delegate, long seed, Engine engine, World world) { - super(((CraftWorld) world).getHandle(), delegate, null); + super(((CraftWorld) world).getHandle(), edit(delegate, new CustomBiomeSource(seed, engine, world)), null); this.delegate = delegate; this.engine = engine; - this.biomeSource = new CustomBiomeSource(seed, engine, world); var dimension = engine.getDimension(); KSet placements = new KSet<>(); @@ -159,11 +160,6 @@ public class IrisChunkGenerator extends CustomChunkGenerator { return delegate; } - @Override - public BiomeSource getBiomeSource() { - return biomeSource; - } - @Override public int getMinY() { return delegate.getMinY(); @@ -233,4 +229,29 @@ public class IrisChunkGenerator extends CustomChunkGenerator { public NoiseColumn getBaseColumn(int i, int j, LevelHeightAccessor levelheightaccessor, RandomState randomstate) { return delegate.getBaseColumn(i, j, levelheightaccessor, randomstate); } + + static { + Field biomeSource = null; + for (Field field : ChunkGenerator.class.getDeclaredFields()) { + if (!field.getType().equals(BiomeSource.class)) + continue; + biomeSource = field; + break; + } + if (biomeSource == null) + throw new RuntimeException("Could not find biomeSource field in ChunkGenerator!"); + BIOME_SOURCE = new WrappedField<>(ChunkGenerator.class, biomeSource.getName()); + } + + private static ChunkGenerator edit(ChunkGenerator generator, BiomeSource source) { + try { + BIOME_SOURCE.set(generator, source); + if (generator instanceof CustomChunkGenerator custom) + BIOME_SOURCE.set(custom.getDelegate(), source); + + return generator; + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } } diff --git a/nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/IrisChunkGenerator.java b/nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/IrisChunkGenerator.java index 9bb31ef8c..92b7b2b32 100644 --- a/nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/IrisChunkGenerator.java +++ b/nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/IrisChunkGenerator.java @@ -13,6 +13,7 @@ import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.mantle.MantleFlag; import com.volmit.iris.util.math.Position2; +import com.volmit.iris.util.reflect.WrappedField; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; import net.minecraft.core.HolderSet; @@ -47,23 +48,21 @@ import org.bukkit.craftbukkit.v1_19_R2.CraftWorld; import org.bukkit.craftbukkit.v1_19_R2.generator.CustomChunkGenerator; import javax.annotation.Nullable; +import java.lang.reflect.Field; import java.util.List; import java.util.Objects; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Executor; +import java.util.concurrent.*; public class IrisChunkGenerator extends CustomChunkGenerator { + private static final WrappedField BIOME_SOURCE; private final ChunkGenerator delegate; private final Engine engine; - private final BiomeSource biomeSource; private final KMap, KSet> structures = new KMap<>(); public IrisChunkGenerator(ChunkGenerator delegate, long seed, Engine engine, World world) { - super(((CraftWorld) world).getHandle(), delegate, null); + super(((CraftWorld) world).getHandle(), edit(delegate, new CustomBiomeSource(seed, engine, world)), null); this.delegate = delegate; this.engine = engine; - this.biomeSource = new CustomBiomeSource(seed, engine, world); var dimension = engine.getDimension(); KSet placements = new KSet<>(); @@ -164,11 +163,6 @@ public class IrisChunkGenerator extends CustomChunkGenerator { return delegate; } - @Override - public BiomeSource getBiomeSource() { - return biomeSource; - } - @Override public int getMinY() { return delegate.getMinY(); @@ -238,4 +232,29 @@ public class IrisChunkGenerator extends CustomChunkGenerator { public NoiseColumn getBaseColumn(int i, int j, LevelHeightAccessor levelheightaccessor, RandomState randomstate) { return delegate.getBaseColumn(i, j, levelheightaccessor, randomstate); } + + static { + Field biomeSource = null; + for (Field field : ChunkGenerator.class.getDeclaredFields()) { + if (!field.getType().equals(BiomeSource.class)) + continue; + biomeSource = field; + break; + } + if (biomeSource == null) + throw new RuntimeException("Could not find biomeSource field in ChunkGenerator!"); + BIOME_SOURCE = new WrappedField<>(ChunkGenerator.class, biomeSource.getName()); + } + + private static ChunkGenerator edit(ChunkGenerator generator, BiomeSource source) { + try { + BIOME_SOURCE.set(generator, source); + if (generator instanceof CustomChunkGenerator custom) + BIOME_SOURCE.set(custom.getDelegate(), source); + + return generator; + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } } diff --git a/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/IrisChunkGenerator.java b/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/IrisChunkGenerator.java index 358ef9829..f4f0b4502 100644 --- a/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/IrisChunkGenerator.java +++ b/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/IrisChunkGenerator.java @@ -13,6 +13,7 @@ import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.mantle.MantleFlag; import com.volmit.iris.util.math.Position2; +import com.volmit.iris.util.reflect.WrappedField; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; import net.minecraft.core.HolderSet; @@ -47,6 +48,7 @@ import org.bukkit.craftbukkit.v1_19_R3.CraftWorld; import org.bukkit.craftbukkit.v1_19_R3.generator.CustomChunkGenerator; import javax.annotation.Nullable; +import java.lang.reflect.Field; import java.util.List; import java.util.Objects; import java.util.concurrent.CompletableFuture; @@ -54,16 +56,15 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor; public class IrisChunkGenerator extends CustomChunkGenerator { + private static final WrappedField BIOME_SOURCE; private final ChunkGenerator delegate; private final Engine engine; - private final BiomeSource biomeSource; private final KMap, KSet> structures = new KMap<>(); public IrisChunkGenerator(ChunkGenerator delegate, long seed, Engine engine, World world) { - super(((CraftWorld) world).getHandle(), delegate, null); + super(((CraftWorld) world).getHandle(), edit(delegate, new CustomBiomeSource(seed, engine, world)), null); this.delegate = delegate; this.engine = engine; - this.biomeSource = new CustomBiomeSource(seed, engine, world); var dimension = engine.getDimension(); KSet placements = new KSet<>(); @@ -164,11 +165,6 @@ public class IrisChunkGenerator extends CustomChunkGenerator { return delegate; } - @Override - public BiomeSource getBiomeSource() { - return biomeSource; - } - @Override public int getMinY() { return delegate.getMinY(); @@ -238,4 +234,29 @@ public class IrisChunkGenerator extends CustomChunkGenerator { public NoiseColumn getBaseColumn(int i, int j, LevelHeightAccessor levelheightaccessor, RandomState randomstate) { return delegate.getBaseColumn(i, j, levelheightaccessor, randomstate); } + + static { + Field biomeSource = null; + for (Field field : ChunkGenerator.class.getDeclaredFields()) { + if (!field.getType().equals(BiomeSource.class)) + continue; + biomeSource = field; + break; + } + if (biomeSource == null) + throw new RuntimeException("Could not find biomeSource field in ChunkGenerator!"); + BIOME_SOURCE = new WrappedField<>(ChunkGenerator.class, biomeSource.getName()); + } + + private static ChunkGenerator edit(ChunkGenerator generator, BiomeSource source) { + try { + BIOME_SOURCE.set(generator, source); + if (generator instanceof CustomChunkGenerator custom) + BIOME_SOURCE.set(custom.getDelegate(), source); + + return generator; + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } } diff --git a/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/IrisChunkGenerator.java b/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/IrisChunkGenerator.java index f415bbe69..30873ea31 100644 --- a/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/IrisChunkGenerator.java +++ b/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/IrisChunkGenerator.java @@ -13,6 +13,7 @@ import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.mantle.MantleFlag; import com.volmit.iris.util.math.Position2; +import com.volmit.iris.util.reflect.WrappedField; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; import net.minecraft.core.HolderSet; @@ -47,6 +48,7 @@ import org.bukkit.craftbukkit.v1_20_R1.CraftWorld; import org.bukkit.craftbukkit.v1_20_R1.generator.CustomChunkGenerator; import javax.annotation.Nullable; +import java.lang.reflect.Field; import java.util.List; import java.util.Objects; import java.util.concurrent.CompletableFuture; @@ -54,16 +56,15 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor; public class IrisChunkGenerator extends CustomChunkGenerator { + private static final WrappedField BIOME_SOURCE; private final ChunkGenerator delegate; private final Engine engine; - private final BiomeSource biomeSource; private final KMap, KSet> structures = new KMap<>(); public IrisChunkGenerator(ChunkGenerator delegate, long seed, Engine engine, World world) { - super(((CraftWorld) world).getHandle(), delegate, null); + super(((CraftWorld) world).getHandle(), edit(delegate, new CustomBiomeSource(seed, engine, world)), null); this.delegate = delegate; this.engine = engine; - this.biomeSource = new CustomBiomeSource(seed, engine, world); var dimension = engine.getDimension(); KSet placements = new KSet<>(); @@ -164,11 +165,6 @@ public class IrisChunkGenerator extends CustomChunkGenerator { return delegate; } - @Override - public BiomeSource getBiomeSource() { - return biomeSource; - } - @Override public int getMinY() { return delegate.getMinY(); @@ -238,4 +234,29 @@ public class IrisChunkGenerator extends CustomChunkGenerator { public NoiseColumn getBaseColumn(int i, int j, LevelHeightAccessor levelheightaccessor, RandomState randomstate) { return delegate.getBaseColumn(i, j, levelheightaccessor, randomstate); } + + static { + Field biomeSource = null; + for (Field field : ChunkGenerator.class.getDeclaredFields()) { + if (!field.getType().equals(BiomeSource.class)) + continue; + biomeSource = field; + break; + } + if (biomeSource == null) + throw new RuntimeException("Could not find biomeSource field in ChunkGenerator!"); + BIOME_SOURCE = new WrappedField<>(ChunkGenerator.class, biomeSource.getName()); + } + + private static ChunkGenerator edit(ChunkGenerator generator, BiomeSource source) { + try { + BIOME_SOURCE.set(generator, source); + if (generator instanceof CustomChunkGenerator custom) + BIOME_SOURCE.set(custom.getDelegate(), source); + + return generator; + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } } diff --git a/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/IrisChunkGenerator.java b/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/IrisChunkGenerator.java index 27afcb0f7..0d44523fe 100644 --- a/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/IrisChunkGenerator.java +++ b/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/IrisChunkGenerator.java @@ -13,6 +13,7 @@ import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.mantle.MantleFlag; import com.volmit.iris.util.math.Position2; +import com.volmit.iris.util.reflect.WrappedField; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; import net.minecraft.core.HolderSet; @@ -47,6 +48,7 @@ import org.bukkit.craftbukkit.v1_20_R2.CraftWorld; import org.bukkit.craftbukkit.v1_20_R2.generator.CustomChunkGenerator; import javax.annotation.Nullable; +import java.lang.reflect.Field; import java.util.List; import java.util.Objects; import java.util.concurrent.CompletableFuture; @@ -54,16 +56,15 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor; public class IrisChunkGenerator extends CustomChunkGenerator { + private static final WrappedField BIOME_SOURCE; private final ChunkGenerator delegate; private final Engine engine; - private final BiomeSource biomeSource; private final KMap, KSet> structures = new KMap<>(); public IrisChunkGenerator(ChunkGenerator delegate, long seed, Engine engine, World world) { - super(((CraftWorld) world).getHandle(), delegate, null); + super(((CraftWorld) world).getHandle(), edit(delegate, new CustomBiomeSource(seed, engine, world)), null); this.delegate = delegate; this.engine = engine; - this.biomeSource = new CustomBiomeSource(seed, engine, world); var dimension = engine.getDimension(); KSet placements = new KSet<>(); @@ -164,11 +165,6 @@ public class IrisChunkGenerator extends CustomChunkGenerator { return delegate; } - @Override - public BiomeSource getBiomeSource() { - return biomeSource; - } - @Override public int getMinY() { return delegate.getMinY(); @@ -238,4 +234,29 @@ public class IrisChunkGenerator extends CustomChunkGenerator { public NoiseColumn getBaseColumn(int i, int j, LevelHeightAccessor levelheightaccessor, RandomState randomstate) { return delegate.getBaseColumn(i, j, levelheightaccessor, randomstate); } + + static { + Field biomeSource = null; + for (Field field : ChunkGenerator.class.getDeclaredFields()) { + if (!field.getType().equals(BiomeSource.class)) + continue; + biomeSource = field; + break; + } + if (biomeSource == null) + throw new RuntimeException("Could not find biomeSource field in ChunkGenerator!"); + BIOME_SOURCE = new WrappedField<>(ChunkGenerator.class, biomeSource.getName()); + } + + private static ChunkGenerator edit(ChunkGenerator generator, BiomeSource source) { + try { + BIOME_SOURCE.set(generator, source); + if (generator instanceof CustomChunkGenerator custom) + BIOME_SOURCE.set(custom.getDelegate(), source); + + return generator; + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } } diff --git a/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/IrisChunkGenerator.java b/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/IrisChunkGenerator.java index e61cbae71..26826709b 100644 --- a/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/IrisChunkGenerator.java +++ b/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/IrisChunkGenerator.java @@ -13,6 +13,7 @@ import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.mantle.MantleFlag; import com.volmit.iris.util.math.Position2; +import com.volmit.iris.util.reflect.WrappedField; import com.volmit.iris.util.scheduling.S; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; @@ -50,6 +51,7 @@ import org.bukkit.craftbukkit.v1_20_R3.CraftWorld; import org.bukkit.craftbukkit.v1_20_R3.generator.CustomChunkGenerator; import javax.annotation.Nullable; +import java.lang.reflect.Field; import java.util.List; import java.util.Objects; import java.util.concurrent.CompletableFuture; @@ -57,16 +59,15 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.Executor; public class IrisChunkGenerator extends CustomChunkGenerator { + private static final WrappedField BIOME_SOURCE; private final ChunkGenerator delegate; private final Engine engine; - private final BiomeSource biomeSource; private final KMap, KSet> structures = new KMap<>(); public IrisChunkGenerator(ChunkGenerator delegate, long seed, Engine engine, World world) { - super(((CraftWorld) world).getHandle(), delegate, null); + super(((CraftWorld) world).getHandle(), edit(delegate, new CustomBiomeSource(seed, engine, world)), null); this.delegate = delegate; this.engine = engine; - this.biomeSource = new CustomBiomeSource(seed, engine, world); var dimension = engine.getDimension(); KSet placements = new KSet<>(); @@ -167,11 +168,6 @@ public class IrisChunkGenerator extends CustomChunkGenerator { return delegate; } - @Override - public BiomeSource getBiomeSource() { - return biomeSource; - } - @Override public int getMinY() { return delegate.getMinY(); @@ -241,4 +237,29 @@ public class IrisChunkGenerator extends CustomChunkGenerator { public NoiseColumn getBaseColumn(int i, int j, LevelHeightAccessor levelheightaccessor, RandomState randomstate) { return delegate.getBaseColumn(i, j, levelheightaccessor, randomstate); } + + static { + Field biomeSource = null; + for (Field field : ChunkGenerator.class.getDeclaredFields()) { + if (!field.getType().equals(BiomeSource.class)) + continue; + biomeSource = field; + break; + } + if (biomeSource == null) + throw new RuntimeException("Could not find biomeSource field in ChunkGenerator!"); + BIOME_SOURCE = new WrappedField<>(ChunkGenerator.class, biomeSource.getName()); + } + + private static ChunkGenerator edit(ChunkGenerator generator, BiomeSource source) { + try { + BIOME_SOURCE.set(generator, source); + if (generator instanceof CustomChunkGenerator custom) + BIOME_SOURCE.set(custom.getDelegate(), source); + + return generator; + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } } diff --git a/nms/v1_20_R4/src/main/java/com/volmit/iris/core/nms/v1_20_R4/IrisChunkGenerator.java b/nms/v1_20_R4/src/main/java/com/volmit/iris/core/nms/v1_20_R4/IrisChunkGenerator.java index 54382df77..537acc9d9 100644 --- a/nms/v1_20_R4/src/main/java/com/volmit/iris/core/nms/v1_20_R4/IrisChunkGenerator.java +++ b/nms/v1_20_R4/src/main/java/com/volmit/iris/core/nms/v1_20_R4/IrisChunkGenerator.java @@ -13,6 +13,7 @@ import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.mantle.MantleFlag; import com.volmit.iris.util.math.Position2; +import com.volmit.iris.util.reflect.WrappedField; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; import net.minecraft.core.HolderSet; @@ -47,21 +48,21 @@ import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; import org.bukkit.craftbukkit.v1_20_R4.generator.CustomChunkGenerator; import javax.annotation.Nullable; +import java.lang.reflect.Field; import java.util.List; import java.util.Objects; import java.util.concurrent.*; public class IrisChunkGenerator extends CustomChunkGenerator { + private static final WrappedField BIOME_SOURCE; private final ChunkGenerator delegate; private final Engine engine; - private final BiomeSource biomeSource; private final KMap, KSet> structures = new KMap<>(); public IrisChunkGenerator(ChunkGenerator delegate, long seed, Engine engine, World world) { - super(((CraftWorld) world).getHandle(), delegate, null); + super(((CraftWorld) world).getHandle(), edit(delegate, new CustomBiomeSource(seed, engine, world)), null); this.delegate = delegate; this.engine = engine; - this.biomeSource = new CustomBiomeSource(seed, engine, world); var dimension = engine.getDimension(); KSet placements = new KSet<>(); @@ -162,11 +163,6 @@ public class IrisChunkGenerator extends CustomChunkGenerator { return delegate; } - @Override - public BiomeSource getBiomeSource() { - return biomeSource; - } - @Override public int getMinY() { return delegate.getMinY(); @@ -236,4 +232,29 @@ public class IrisChunkGenerator extends CustomChunkGenerator { public NoiseColumn getBaseColumn(int i, int j, LevelHeightAccessor levelheightaccessor, RandomState randomstate) { return delegate.getBaseColumn(i, j, levelheightaccessor, randomstate); } + + static { + Field biomeSource = null; + for (Field field : ChunkGenerator.class.getDeclaredFields()) { + if (!field.getType().equals(BiomeSource.class)) + continue; + biomeSource = field; + break; + } + if (biomeSource == null) + throw new RuntimeException("Could not find biomeSource field in ChunkGenerator!"); + BIOME_SOURCE = new WrappedField<>(ChunkGenerator.class, biomeSource.getName()); + } + + private static ChunkGenerator edit(ChunkGenerator generator, BiomeSource source) { + try { + BIOME_SOURCE.set(generator, source); + if (generator instanceof CustomChunkGenerator custom) + BIOME_SOURCE.set(custom.getDelegate(), source); + + return generator; + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } } diff --git a/nms/v1_21_R1/src/main/java/com/volmit/iris/core/nms/v1_21_R1/IrisChunkGenerator.java b/nms/v1_21_R1/src/main/java/com/volmit/iris/core/nms/v1_21_R1/IrisChunkGenerator.java index 872daac16..461446ed2 100644 --- a/nms/v1_21_R1/src/main/java/com/volmit/iris/core/nms/v1_21_R1/IrisChunkGenerator.java +++ b/nms/v1_21_R1/src/main/java/com/volmit/iris/core/nms/v1_21_R1/IrisChunkGenerator.java @@ -13,6 +13,7 @@ import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.mantle.MantleFlag; import com.volmit.iris.util.math.Position2; +import com.volmit.iris.util.reflect.WrappedField; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; import net.minecraft.core.HolderSet; @@ -47,22 +48,22 @@ import org.bukkit.craftbukkit.v1_21_R1.CraftWorld; import org.bukkit.craftbukkit.v1_21_R1.generator.CustomChunkGenerator; import javax.annotation.Nullable; +import java.lang.reflect.Field; import java.util.List; import java.util.Objects; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; public class IrisChunkGenerator extends CustomChunkGenerator { + private static final WrappedField BIOME_SOURCE; private final ChunkGenerator delegate; private final Engine engine; - private final BiomeSource biomeSource; private final KMap, KSet> structures = new KMap<>(); public IrisChunkGenerator(ChunkGenerator delegate, long seed, Engine engine, World world) { - super(((CraftWorld) world).getHandle(), delegate, null); + super(((CraftWorld) world).getHandle(), edit(delegate, new CustomBiomeSource(seed, engine, world)), null); this.delegate = delegate; this.engine = engine; - this.biomeSource = new CustomBiomeSource(seed, engine, world); var dimension = engine.getDimension(); KSet placements = new KSet<>(); @@ -163,11 +164,6 @@ public class IrisChunkGenerator extends CustomChunkGenerator { return delegate; } - @Override - public BiomeSource getBiomeSource() { - return biomeSource; - } - @Override public int getMinY() { return delegate.getMinY(); @@ -237,4 +233,29 @@ public class IrisChunkGenerator extends CustomChunkGenerator { public NoiseColumn getBaseColumn(int i, int j, LevelHeightAccessor levelheightaccessor, RandomState randomstate) { return delegate.getBaseColumn(i, j, levelheightaccessor, randomstate); } + + static { + Field biomeSource = null; + for (Field field : ChunkGenerator.class.getDeclaredFields()) { + if (!field.getType().equals(BiomeSource.class)) + continue; + biomeSource = field; + break; + } + if (biomeSource == null) + throw new RuntimeException("Could not find biomeSource field in ChunkGenerator!"); + BIOME_SOURCE = new WrappedField<>(ChunkGenerator.class, biomeSource.getName()); + } + + private static ChunkGenerator edit(ChunkGenerator generator, BiomeSource source) { + try { + BIOME_SOURCE.set(generator, source); + if (generator instanceof CustomChunkGenerator custom) + BIOME_SOURCE.set(custom.getDelegate(), source); + + return generator; + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } }