From 53c9e7c04c5b2c743536b95e60053e0448dd2feb Mon Sep 17 00:00:00 2001 From: Julian Krings <47589149+CrazyDev05@users.noreply.github.com> Date: Tue, 4 Feb 2025 13:04:48 +0100 Subject: [PATCH] drop 1.19.x support (#1167) --- build.gradle | 3 - .../volmit/iris/core/safeguard/UtilsSFG.java | 2 +- .../core/nms/v1_19_R1/CustomBiomeSource.java | 150 ---- .../core/nms/v1_19_R1/IrisChunkGenerator.java | 257 ------- .../iris/core/nms/v1_19_R1/NMSBinding.java | 626 ----------------- .../core/nms/v1_19_R2/CustomBiomeSource.java | 152 ----- .../core/nms/v1_19_R2/IrisChunkGenerator.java | 260 ------- .../iris/core/nms/v1_19_R2/NMSBinding.java | 628 ----------------- .../core/nms/v1_19_R3/CustomBiomeSource.java | 169 ----- .../core/nms/v1_19_R3/IrisChunkGenerator.java | 262 ------- .../iris/core/nms/v1_19_R3/NMSBinding.java | 638 ------------------ settings.gradle | 3 - 12 files changed, 1 insertion(+), 3149 deletions(-) delete mode 100644 nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/CustomBiomeSource.java delete mode 100644 nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/IrisChunkGenerator.java delete mode 100644 nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/NMSBinding.java delete mode 100644 nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/CustomBiomeSource.java delete mode 100644 nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/IrisChunkGenerator.java delete mode 100644 nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/NMSBinding.java delete mode 100644 nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/CustomBiomeSource.java delete mode 100644 nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/IrisChunkGenerator.java delete mode 100644 nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/NMSBinding.java diff --git a/build.gradle b/build.gradle index f3823e8bc..2af8b701a 100644 --- a/build.gradle +++ b/build.gradle @@ -61,9 +61,6 @@ def NMS_BINDINGS = Map.of( "v1_20_R3", "1.20.4-R0.1-SNAPSHOT", "v1_20_R2", "1.20.2-R0.1-SNAPSHOT", "v1_20_R1", "1.20.1-R0.1-SNAPSHOT", - "v1_19_R3", "1.19.4-R0.1-SNAPSHOT", - "v1_19_R2", "1.19.3-R0.1-SNAPSHOT", - "v1_19_R1", "1.19.2-R0.1-SNAPSHOT" ) def JVM_VERSION = Map.of() NMS_BINDINGS.each { nms -> diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java b/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java index c9284681c..cfff91b62 100644 --- a/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java @@ -37,7 +37,7 @@ public class UtilsSFG { } if (ServerBootSFG.unsuportedversion) { Iris.safeguard(C.RED + "Server Version"); - Iris.safeguard(C.RED + "- Iris only supports 1.19.2 > 1.21.3"); + Iris.safeguard(C.RED + "- Iris only supports 1.20.1 > 1.21.4"); } if (!ServerBootSFG.passedserversoftware) { Iris.safeguard(C.YELLOW + "Unsupported Server Software"); diff --git a/nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/CustomBiomeSource.java b/nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/CustomBiomeSource.java deleted file mode 100644 index a24e62d85..000000000 --- a/nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/CustomBiomeSource.java +++ /dev/null @@ -1,150 +0,0 @@ -package com.volmit.iris.core.nms.v1_19_R1; - -import com.mojang.serialization.Codec; -import com.volmit.iris.Iris; -import com.volmit.iris.engine.data.cache.AtomicCache; -import com.volmit.iris.engine.framework.Engine; -import com.volmit.iris.engine.object.IrisBiome; -import com.volmit.iris.engine.object.IrisBiomeCustom; -import com.volmit.iris.util.collection.KMap; -import com.volmit.iris.util.math.RNG; -import net.minecraft.core.Holder; -import net.minecraft.core.Registry; -import net.minecraft.core.RegistryAccess; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.BiomeSource; -import net.minecraft.world.level.biome.Climate; -import org.bukkit.Bukkit; -import org.bukkit.World; -import org.bukkit.craftbukkit.v1_19_R1.CraftServer; -import org.bukkit.craftbukkit.v1_19_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_19_R1.block.CraftBlock; - -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.List; - -public class CustomBiomeSource extends BiomeSource { - private final long seed; - private final Engine engine; - private final Registry biomeCustomRegistry; - private final Registry biomeRegistry; - private final AtomicCache registryAccess = new AtomicCache<>(); - private final RNG rng; - private final KMap> customBiomes; - - public CustomBiomeSource(long seed, Engine engine, World world) { - super(getAllBiomes( - ((RegistryAccess) getFor(RegistryAccess.Frozen.class, ((CraftServer) Bukkit.getServer()).getHandle().getServer())) - .registry(Registry.BIOME_REGISTRY).orElse(null), - ((CraftWorld) world).getHandle().registryAccess().registry(Registry.BIOME_REGISTRY).orElse(null), - engine)); - this.engine = engine; - this.seed = seed; - this.biomeCustomRegistry = registry().registry(Registry.BIOME_REGISTRY).orElse(null); - this.biomeRegistry = ((CraftWorld) world).getHandle().registryAccess().registry(Registry.BIOME_REGISTRY).orElse(null); - this.rng = new RNG(engine.getSeedManager().getBiome()); - this.customBiomes = fillCustomBiomes(biomeCustomRegistry, engine); - } - - private static List> getAllBiomes(Registry customRegistry, Registry registry, Engine engine) { - List> b = new ArrayList<>(); - - for (IrisBiome i : engine.getAllBiomes()) { - if (i.isCustom()) { - for (IrisBiomeCustom j : i.getCustomDerivitives()) { - b.add(customRegistry.getHolder(customRegistry.getResourceKey(customRegistry - .get(new ResourceLocation(engine.getDimension().getLoadKey() + ":" + j.getId()))).get()).get()); - } - } else { - b.add(CraftBlock.biomeToBiomeBase(registry, i.getVanillaDerivative())); - } - } - - return b; - } - - private static Object getFor(Class type, Object source) { - Object o = fieldFor(type, source); - - if (o != null) { - return o; - } - - return invokeFor(type, source); - } - - private static Object fieldFor(Class returns, Object in) { - return fieldForClass(returns, in.getClass(), in); - } - - private static Object invokeFor(Class returns, Object in) { - for (Method i : in.getClass().getMethods()) { - if (i.getReturnType().equals(returns)) { - i.setAccessible(true); - try { - Iris.debug("[NMS] Found " + returns.getSimpleName() + " in " + in.getClass().getSimpleName() + "." + i.getName() + "()"); - return i.invoke(in); - } catch (Throwable e) { - e.printStackTrace(); - } - } - } - - return null; - } - - @SuppressWarnings("unchecked") - private static T fieldForClass(Class returnType, Class sourceType, Object in) { - for (Field i : sourceType.getDeclaredFields()) { - if (i.getType().equals(returnType)) { - i.setAccessible(true); - try { - Iris.debug("[NMS] Found " + returnType.getSimpleName() + " in " + sourceType.getSimpleName() + "." + i.getName()); - return (T) i.get(in); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - } - } - return null; - } - - private KMap> fillCustomBiomes(Registry customRegistry, Engine engine) { - KMap> m = new KMap<>(); - - for (IrisBiome i : engine.getAllBiomes()) { - if (i.isCustom()) { - for (IrisBiomeCustom j : i.getCustomDerivitives()) { - m.put(j.getId(), customRegistry.getHolder(customRegistry.getResourceKey(customRegistry - .get(new ResourceLocation(engine.getDimension().getLoadKey() + ":" + j.getId()))).get()).get()); - } - } - } - - return m; - } - - private RegistryAccess registry() { - return registryAccess.aquire(() -> (RegistryAccess) getFor(RegistryAccess.Frozen.class, ((CraftServer) Bukkit.getServer()).getHandle().getServer())); - } - - @Override - protected Codec codec() { - throw new UnsupportedOperationException("Not supported"); - } - - @Override - public Holder getNoiseBiome(int x, int y, int z, Climate.Sampler sampler) { - int m = (y - engine.getMinHeight()) << 2; - IrisBiome ib = engine.getComplex().getTrueBiomeStream().get(x << 2, z << 2); - if (ib.isCustom()) { - return customBiomes.get(ib.getCustomBiome(rng, x << 2, m, z << 2).getId()); - } else { - org.bukkit.block.Biome v = ib.getSkyBiome(rng, x << 2, m, z << 2); - return CraftBlock.biomeToBiomeBase(biomeRegistry, v); - } - } -} \ No newline at end of file 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 deleted file mode 100644 index df23a6d05..000000000 --- a/nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/IrisChunkGenerator.java +++ /dev/null @@ -1,257 +0,0 @@ -package com.volmit.iris.core.nms.v1_19_R1; - -import com.mojang.datafixers.util.Pair; -import com.mojang.serialization.Codec; -import com.volmit.iris.Iris; -import com.volmit.iris.engine.framework.Engine; -import com.volmit.iris.engine.framework.ResultLocator; -import com.volmit.iris.engine.framework.WrongEngineBroException; -import com.volmit.iris.engine.object.IrisJigsawStructure; -import com.volmit.iris.engine.object.IrisJigsawStructurePlacement; -import com.volmit.iris.util.collection.KList; -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; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.server.level.WorldGenRegion; -import net.minecraft.tags.TagKey; -import net.minecraft.util.random.WeightedRandomList; -import net.minecraft.world.entity.MobCategory; -import net.minecraft.world.level.LevelHeightAccessor; -import net.minecraft.world.level.NoiseColumn; -import net.minecraft.world.level.StructureManager; -import net.minecraft.world.level.WorldGenLevel; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.BiomeManager; -import net.minecraft.world.level.biome.BiomeSource; -import net.minecraft.world.level.biome.MobSpawnSettings; -import net.minecraft.world.level.chunk.ChunkAccess; -import net.minecraft.world.level.chunk.ChunkGenerator; -import net.minecraft.world.level.levelgen.GenerationStep; -import net.minecraft.world.level.levelgen.Heightmap; -import net.minecraft.world.level.levelgen.RandomState; -import net.minecraft.world.level.levelgen.blending.Blender; -import net.minecraft.world.level.levelgen.structure.Structure; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; -import org.bukkit.World; -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; -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 KMap, KSet> structures = new KMap<>(); - - public IrisChunkGenerator(ChunkGenerator delegate, long seed, Engine engine, World world) { - super(((CraftWorld) world).getHandle(), edit(delegate, new CustomBiomeSource(seed, engine, world)), null); - this.delegate = delegate; - this.engine = engine; - var dimension = engine.getDimension(); - - KSet placements = new KSet<>(); - addAll(dimension.getJigsawStructures(), placements); - for (var region : dimension.getAllRegions(engine)) { - addAll(region.getJigsawStructures(), placements); - for (var biome : region.getAllBiomes(engine)) - addAll(biome.getJigsawStructures(), placements); - } - var stronghold = dimension.getStronghold(); - if (stronghold != null) - placements.add(engine.getData().getJigsawStructureLoader().load(stronghold)); - placements.removeIf(Objects::isNull); - - var registry = ((CraftWorld) world).getHandle().registryAccess().registry(Registry.STRUCTURE_REGISTRY).orElseThrow(); - for (var s : placements) { - try { - String raw = s.getStructureKey(); - if (raw == null) continue; - boolean tag = raw.startsWith("#"); - if (tag) raw = raw.substring(1); - - var location = new ResourceLocation(raw); - if (!tag) { - structures.computeIfAbsent(ResourceKey.create(Registry.STRUCTURE_REGISTRY, location), k -> new KSet<>()).add(s.getLoadKey()); - continue; - } - - var key = TagKey.create(Registry.STRUCTURE_REGISTRY, location); - var set = registry.getTag(key).orElse(null); - if (set == null) { - Iris.error("Could not find structure tag: " + raw); - continue; - } - for (var holder : set) { - var resourceKey = holder.unwrapKey().orElse(null); - if (resourceKey == null) continue; - structures.computeIfAbsent(resourceKey, k -> new KSet<>()).add(s.getLoadKey()); - } - } catch (Throwable e) { - Iris.error("Failed to load structure: " + s.getLoadKey()); - e.printStackTrace(); - } - } - } - - private void addAll(KList placements, KSet structures) { - if (placements == null) return; - placements.stream() - .map(IrisJigsawStructurePlacement::getStructure) - .map(engine.getData().getJigsawStructureLoader()::load) - .filter(Objects::nonNull) - .forEach(structures::add); - } - - @Override - public @Nullable Pair> findNearestMapStructure(ServerLevel level, HolderSet holders, BlockPos pos, int radius, boolean findUnexplored) { - if (engine.getDimension().isDisableExplorerMaps()) - return null; - - KMap> structures = new KMap<>(); - for (var holder : holders) { - if (holder == null) continue; - var key = holder.unwrapKey().orElse(null); - var set = this.structures.get(key); - if (set == null) continue; - for (var structure : set) { - structures.put(structure, holder); - } - } - if (structures.isEmpty()) - return null; - - var locator = ResultLocator.locateStructure(structures.keySet()) - .then((e, p , s) -> structures.get(s.getLoadKey())); - if (findUnexplored) - locator = locator.then((e, p, s) -> e.getMantle().getMantle().getChunk(p.getX(), p.getZ()).isFlagged(MantleFlag.DISCOVERED) ? null : s); - - try { - var result = locator.find(engine, new Position2(pos.getX() >> 4, pos.getZ() >> 4), radius * 10L, i -> {}, false).get(); - if (result == null) return null; - var blockPos = new BlockPos(result.getBlockX(), 0, result.getBlockZ()); - return Pair.of(blockPos, result.obj()); - } catch (WrongEngineBroException | ExecutionException | InterruptedException e) { - return null; - } - } - - @Override - protected Codec codec() { - return Codec.unit(null); - } - - @Override - public ChunkGenerator getDelegate() { - if (delegate instanceof CustomChunkGenerator chunkGenerator) - return chunkGenerator.getDelegate(); - return delegate; - } - - @Override - public int getMinY() { - return delegate.getMinY(); - } - - @Override - public int getSeaLevel() { - return delegate.getSeaLevel(); - } - - @Override - public void createStructures(RegistryAccess iregistrycustom, RandomState randomstate, StructureManager structuremanager, ChunkAccess ichunkaccess, StructureTemplateManager structuretemplatemanager, long i) { - delegate.createStructures(iregistrycustom, randomstate, structuremanager, ichunkaccess, structuretemplatemanager, i); - } - - @Override - public void buildSurface(WorldGenRegion regionlimitedworldaccess, StructureManager structuremanager, RandomState randomstate, ChunkAccess ichunkaccess) { - delegate.buildSurface(regionlimitedworldaccess, structuremanager, randomstate, ichunkaccess); - } - - @Override - public void applyCarvers(WorldGenRegion regionlimitedworldaccess, long seed, RandomState randomstate, BiomeManager biomemanager, StructureManager structuremanager, ChunkAccess ichunkaccess, GenerationStep.Carving worldgenstage_features) { - delegate.applyCarvers(regionlimitedworldaccess, seed, randomstate, biomemanager, structuremanager, ichunkaccess, worldgenstage_features); - } - - @Override - public CompletableFuture fillFromNoise(Executor executor, Blender blender, RandomState randomstate, StructureManager structuremanager, ChunkAccess ichunkaccess) { - return delegate.fillFromNoise(executor, blender, randomstate, structuremanager, ichunkaccess); - } - - @Override - public int getBaseHeight(int i, int j, Heightmap.Types heightmap_type, LevelHeightAccessor levelheightaccessor, RandomState randomstate) { - return delegate.getBaseHeight(i, j, heightmap_type, levelheightaccessor, randomstate); - } - - @Override - public WeightedRandomList getMobsAt(Holder holder, StructureManager structuremanager, MobCategory enumcreaturetype, BlockPos blockposition) { - return delegate.getMobsAt(holder, structuremanager, enumcreaturetype, blockposition); - } - - @Override - public void applyBiomeDecoration(WorldGenLevel generatoraccessseed, ChunkAccess ichunkaccess, StructureManager structuremanager) { - delegate.applyBiomeDecoration(generatoraccessseed, ichunkaccess, structuremanager); - } - - @Override - public void addDebugScreenInfo(List list, RandomState randomstate, BlockPos blockposition) { - delegate.addDebugScreenInfo(list, randomstate, blockposition); - } - - @Override - public void spawnOriginalMobs(WorldGenRegion regionlimitedworldaccess) { - delegate.spawnOriginalMobs(regionlimitedworldaccess); - } - - @Override - public int getSpawnHeight(LevelHeightAccessor levelheightaccessor) { - return delegate.getSpawnHeight(levelheightaccessor); - } - - @Override - public int getGenDepth() { - return delegate.getGenDepth(); - } - - @Override - 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_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/NMSBinding.java b/nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/NMSBinding.java deleted file mode 100644 index 935af6a14..000000000 --- a/nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/NMSBinding.java +++ /dev/null @@ -1,626 +0,0 @@ -package com.volmit.iris.core.nms.v1_19_R1; - -import java.awt.Color; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Vector; -import java.util.concurrent.atomic.AtomicInteger; - -import com.mojang.datafixers.util.Pair; -import com.volmit.iris.core.nms.container.BiomeColor; -import com.volmit.iris.util.scheduling.J; -import net.minecraft.nbt.*; -import net.minecraft.nbt.Tag; -import net.minecraft.server.commands.data.BlockDataAccessor; -import net.minecraft.tags.TagKey; -import net.minecraft.world.level.LevelReader; -import net.minecraft.world.level.block.EntityBlock; -import org.bukkit.*; -import org.bukkit.block.Biome; -import org.bukkit.block.data.BlockData; -import org.bukkit.craftbukkit.v1_19_R1.CraftChunk; -import org.bukkit.craftbukkit.v1_19_R1.CraftServer; -import org.bukkit.craftbukkit.v1_19_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_19_R1.block.CraftBlock; -import org.bukkit.craftbukkit.v1_19_R1.block.CraftBlockState; -import org.bukkit.craftbukkit.v1_19_R1.block.CraftBlockStates; -import org.bukkit.craftbukkit.v1_19_R1.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_19_R1.entity.CraftDolphin; -import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftItemStack; -import org.bukkit.entity.Dolphin; -import org.bukkit.entity.Entity; -import org.bukkit.event.entity.CreatureSpawnEvent; -import org.bukkit.generator.ChunkGenerator; -import org.bukkit.inventory.ItemStack; -import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.NotNull; - -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import com.volmit.iris.Iris; -import com.volmit.iris.core.nms.INMSBinding; -import com.volmit.iris.engine.data.cache.AtomicCache; -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.hunk.Hunk; -import com.volmit.iris.util.json.JSONObject; -import com.volmit.iris.util.mantle.Mantle; -import com.volmit.iris.util.math.Vector3d; -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.*; -import com.volmit.iris.util.nbt.tag.CompoundTag; - -import it.unimi.dsi.fastutil.objects.Object2IntMap; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Holder; -import net.minecraft.core.Registry; -import net.minecraft.core.RegistryAccess; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.level.biome.BiomeSource; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkAccess; -import net.minecraft.world.level.chunk.LevelChunk; -import sun.misc.Unsafe; - -public class NMSBinding implements INMSBinding { - private final KMap baseBiomeCache = new KMap<>(); - private final BlockData AIR = Material.AIR.createBlockData(); - private final AtomicCache> biomeMapCache = new AtomicCache<>(); - private final AtomicCache> registryCache = new AtomicCache<>(); - private final AtomicCache> globalCache = new AtomicCache<>(); - private final AtomicCache registryAccess = new AtomicCache<>(); - private final AtomicCache byIdRef = new AtomicCache<>(); - private Field biomeStorageCache = null; - - private static Object getFor(Class type, Object source) { - Object o = fieldFor(type, source); - - if (o != null) { - return o; - } - - return invokeFor(type, source); - } - - private static Object invokeFor(Class returns, Object in) { - for (Method i : in.getClass().getMethods()) { - if (i.getReturnType().equals(returns)) { - i.setAccessible(true); - try { - Iris.debug("[NMS] Found " + returns.getSimpleName() + " in " + in.getClass().getSimpleName() + "." + i.getName() + "()"); - return i.invoke(in); - } catch (Throwable e) { - e.printStackTrace(); - } - } - } - - return null; - } - - private static Object fieldFor(Class returns, Object in) { - return fieldForClass(returns, in.getClass(), in); - } - - @SuppressWarnings("unchecked") - private static T fieldForClass(Class returnType, Class sourceType, Object in) { - for (Field i : sourceType.getDeclaredFields()) { - if (i.getType().equals(returnType)) { - i.setAccessible(true); - try { - Iris.debug("[NMS] Found " + returnType.getSimpleName() + " in " + sourceType.getSimpleName() + "." + i.getName()); - return (T) i.get(in); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - } - } - return null; - } - - private static Class getClassType(Class type, int ordinal) { - return type.getDeclaredClasses()[ordinal]; - } - - @Override - public boolean hasTile(Material material) { - return !CraftBlockState.class.equals(CraftBlockStates.getBlockStateType(material)); - } - - @Override - public boolean hasTile(Location l) { - return ((CraftWorld) l.getWorld()).getHandle().getBlockEntity(new BlockPos(l.getBlockX(), l.getBlockY(), l.getBlockZ()), false) != null; - } - - @Override - @SuppressWarnings("unchecked") - public KMap serializeTile(Location location) { - BlockEntity e = ((CraftWorld) location.getWorld()).getHandle().getBlockEntity(new BlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ()), false); - - if (e == null) { - return null; - } - - net.minecraft.nbt.CompoundTag tag = e.saveWithoutMetadata(); - return (KMap) convertFromTag(tag, 0, 64); - } - - @Contract(value = "null, _, _ -> null", pure = true) - private Object convertFromTag(net.minecraft.nbt.Tag tag, int depth, int maxDepth) { - if (tag == null || depth > maxDepth) return null; - if (tag instanceof CollectionTag collection) { - KList list = new KList<>(); - - for (Object i : collection) { - if (i instanceof net.minecraft.nbt.Tag t) - list.add(convertFromTag(t, depth + 1, maxDepth)); - else list.add(i); - } - return list; - } - if (tag instanceof net.minecraft.nbt.CompoundTag compound) { - KMap map = new KMap<>(); - - for (String key : compound.getAllKeys()) { - var child = compound.get(key); - if (child == null) continue; - var value = convertFromTag(child, depth + 1, maxDepth); - if (value == null) continue; - map.put(key, value); - } - return map; - } - if (tag instanceof NumericTag numeric) - return numeric.getAsNumber(); - return tag.getAsString(); - } - - @Override - public void deserializeTile(KMap map, Location pos) { - net.minecraft.nbt.CompoundTag tag = (net.minecraft.nbt.CompoundTag) convertToTag(map, 0, 64); - var level = ((CraftWorld) pos.getWorld()).getHandle(); - var blockPos = new BlockPos(pos.getBlockX(), pos.getBlockY(), pos.getBlockZ()); - J.s(() -> merge(level, blockPos, tag)); - } - - private void merge(ServerLevel level, BlockPos blockPos, net.minecraft.nbt.CompoundTag tag) { - var blockEntity = level.getBlockEntity(blockPos); - if (blockEntity == null) { - Iris.warn("[NMS] BlockEntity not found at " + blockPos); - var state = level.getBlockState(blockPos); - if (!state.hasBlockEntity()) - return; - - blockEntity = ((EntityBlock) state.getBlock()) - .newBlockEntity(blockPos, state); - } - var accessor = new BlockDataAccessor(blockEntity, blockPos); - accessor.setData(tag.merge(accessor.getData())); - } - - private Tag convertToTag(Object object, int depth, int maxDepth) { - if (object == null || depth > maxDepth) return EndTag.INSTANCE; - if (object instanceof Map map) { - var tag = new net.minecraft.nbt.CompoundTag(); - for (var i : map.entrySet()) { - tag.put(i.getKey().toString(), convertToTag(i.getValue(), depth + 1, maxDepth)); - } - return tag; - } - if (object instanceof List list) { - var tag = new net.minecraft.nbt.ListTag(); - for (var i : list) { - tag.add(convertToTag(i, depth + 1, maxDepth)); - } - return tag; - } - if (object instanceof Byte number) return ByteTag.valueOf(number); - if (object instanceof Short number) return ShortTag.valueOf(number); - if (object instanceof Integer number) return IntTag.valueOf(number); - if (object instanceof Long number) return LongTag.valueOf(number); - if (object instanceof Float number) return FloatTag.valueOf(number); - if (object instanceof Double number) return DoubleTag.valueOf(number); - if (object instanceof String string) return StringTag.valueOf(string); - return EndTag.INSTANCE; - } - - @Override - public CompoundTag serializeEntity(Entity location) { - return null;// TODO: - } - - @Override - public Entity deserializeEntity(CompoundTag s, Location newPosition) { - return null;// TODO: - } - - @Override - public boolean supportsCustomHeight() { - return true; - } - - private RegistryAccess registry() { - return registryAccess.aquire(() -> (RegistryAccess) getFor(RegistryAccess.Frozen.class, ((CraftServer) Bukkit.getServer()).getHandle().getServer())); - } - - private Registry getCustomBiomeRegistry() { - return registry().registry(Registry.BIOME_REGISTRY).orElse(null); - } - - private Registry getBlockRegistry() { - return registry().registry(Registry.BLOCK_REGISTRY).orElse(null); - } - - @Override - public Object getBiomeBaseFromId(int id) { - return getCustomBiomeRegistry().getHolder(id); - } - - @Override - public int getMinHeight(World world) { - return world.getMinHeight(); - } - - @Override - public boolean supportsCustomBiomes() { - return true; - } - - @Override - public int getTrueBiomeBaseId(Object biomeBase) { - return getCustomBiomeRegistry().getId(((Holder) biomeBase).value()); - } - - @Override - public Object getTrueBiomeBase(Location location) { - return ((CraftWorld) location.getWorld()).getHandle().getBiome(new BlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ())); - } - - @Override - public String getTrueBiomeBaseKey(Location location) { - return getKeyForBiomeBase(getTrueBiomeBase(location)); - } - - @Override - public Object getCustomBiomeBaseFor(String mckey) { - return getCustomBiomeRegistry().get(new ResourceLocation(mckey)); - } - - @Override - public Object getCustomBiomeBaseHolderFor(String mckey) { - return getCustomBiomeRegistry().getHolder(getTrueBiomeBaseId(getCustomBiomeRegistry().get(new ResourceLocation(mckey)))).get(); - } - - public int getBiomeBaseIdForKey(String key) { - return getCustomBiomeRegistry().getId(getCustomBiomeRegistry().get(new ResourceLocation(key))); - } - - @Override - public String getKeyForBiomeBase(Object biomeBase) { - return getCustomBiomeRegistry().getKey((net.minecraft.world.level.biome.Biome) biomeBase).getPath(); // something, not something:something - } - - @Override - public Object getBiomeBase(World world, Biome biome) { - return CraftBlock.biomeToBiomeBase(((CraftWorld) world).getHandle() - .registryAccess().registry(Registry.BIOME_REGISTRY).orElse(null), biome); - } - - @Override - public Object getBiomeBase(Object registry, Biome biome) { - Object v = baseBiomeCache.get(biome); - - if (v != null) { - return v; - } - //noinspection unchecked - v = CraftBlock.biomeToBiomeBase((Registry) registry, biome); - if (v == null) { - // Ok so there is this new biome name called "CUSTOM" in Paper's new releases. - // But, this does NOT exist within CraftBukkit which makes it return an error. - // So, we will just return the ID that the plains biome returns instead. - //noinspection unchecked - return CraftBlock.biomeToBiomeBase((Registry) registry, Biome.PLAINS); - } - baseBiomeCache.put(biome, v); - return v; - } - - @Override - public KList getBiomes() { - return new KList<>(Biome.values()).qdel(Biome.CUSTOM); - } - - @Override - public boolean isBukkit() { - return true; - } - - @Override - public int getBiomeId(Biome biome) { - for (World i : Bukkit.getWorlds()) { - if (i.getEnvironment().equals(World.Environment.NORMAL)) { - Registry registry = ((CraftWorld) i).getHandle().registryAccess().registry(Registry.BIOME_REGISTRY).orElse(null); - return registry.getId((net.minecraft.world.level.biome.Biome) getBiomeBase(registry, biome)); - } - } - - return biome.ordinal(); - } - - private MCAIdMap getBiomeMapping() { - return biomeMapCache.aquire(() -> new MCAIdMap<>() { - @NotNull - @Override - public Iterator iterator() { - return getCustomBiomeRegistry().iterator(); - } - - @Override - public int getId(net.minecraft.world.level.biome.Biome paramT) { - return getCustomBiomeRegistry().getId(paramT); - } - - @Override - public net.minecraft.world.level.biome.Biome byId(int paramInt) { - return (net.minecraft.world.level.biome.Biome) getBiomeBaseFromId(paramInt); - } - }); - } - - @NotNull - private MCABiomeContainer getBiomeContainerInterface(MCAIdMap biomeMapping, MCAChunkBiomeContainer base) { - return new MCABiomeContainer() { - @Override - public int[] getData() { - return base.writeBiomes(); - } - - @Override - public void setBiome(int x, int y, int z, int id) { - base.setBiome(x, y, z, biomeMapping.byId(id)); - } - - @Override - public int getBiome(int x, int y, int z) { - return biomeMapping.getId(base.getBiome(x, y, z)); - } - }; - } - - @Override - public MCABiomeContainer newBiomeContainer(int min, int max) { - MCAChunkBiomeContainer base = new MCAChunkBiomeContainer<>(getBiomeMapping(), min, max); - return getBiomeContainerInterface(getBiomeMapping(), base); - } - - @Override - public MCABiomeContainer newBiomeContainer(int min, int max, int[] data) { - MCAChunkBiomeContainer base = new MCAChunkBiomeContainer<>(getBiomeMapping(), min, max, data); - return getBiomeContainerInterface(getBiomeMapping(), base); - } - - @Override - public int countCustomBiomes() { - AtomicInteger a = new AtomicInteger(0); - - getCustomBiomeRegistry().keySet().forEach((i) -> { - if (i.getNamespace().equals("minecraft")) { - return; - } - - a.incrementAndGet(); - Iris.debug("Custom Biome: " + i); - }); - - return a.get(); - } - - public boolean supportsDataPacks() { - return true; - } - - public void setBiomes(int cx, int cz, World world, Hunk biomes) { - LevelChunk c = ((CraftWorld) world).getHandle().getChunk(cx, cz); - biomes.iterateSync((x, y, z, b) -> c.setBiome(x, y, z, (Holder) b)); - c.setUnsaved(true); - } - - @Override - public void forceBiomeInto(int x, int y, int z, Object somethingVeryDirty, ChunkGenerator.BiomeGrid chunk) { - try { - ChunkAccess s = (ChunkAccess) getFieldForBiomeStorage(chunk).get(chunk); - Holder biome = (Holder) somethingVeryDirty; - s.setBiome(x, y, z, biome); - } catch (IllegalAccessException e) { - Iris.reportError(e); - e.printStackTrace(); - } - } - - private Field getFieldForBiomeStorage(Object storage) { - Field f = biomeStorageCache; - - if (f != null) { - return f; - } - try { - f = storage.getClass().getDeclaredField("biome"); - f.setAccessible(true); - return f; - } catch (Throwable e) { - Iris.reportError(e); - e.printStackTrace(); - Iris.error(storage.getClass().getCanonicalName()); - } - - biomeStorageCache = f; - return null; - } - - @Override - public MCAPaletteAccess createPalette() { - MCAIdMapper registry = registryCache.aquireNasty(() -> { - Field cf = net.minecraft.core.IdMapper.class.getDeclaredField("tToId"); - Field df = net.minecraft.core.IdMapper.class.getDeclaredField("idToT"); - Field bf = net.minecraft.core.IdMapper.class.getDeclaredField("nextId"); - cf.setAccessible(true); - df.setAccessible(true); - bf.setAccessible(true); - net.minecraft.core.IdMapper blockData = Block.BLOCK_STATE_REGISTRY; - int b = bf.getInt(blockData); - Object2IntMap c = (Object2IntMap) cf.get(blockData); - List d = (List) df.get(blockData); - return new MCAIdMapper(c, d, b); - }); - MCAPalette global = globalCache.aquireNasty(() -> new MCAGlobalPalette<>(registry, ((CraftBlockData) AIR).getState())); - MCAPalettedContainer container = new MCAPalettedContainer<>(global, registry, - i -> ((CraftBlockData) NBTWorld.getBlockData(i)).getState(), - i -> NBTWorld.getCompound(CraftBlockData.fromData(i)), - ((CraftBlockData) AIR).getState()); - return new MCAWrappedPalettedContainer<>(container, - i -> NBTWorld.getCompound(CraftBlockData.fromData(i)), - i -> ((CraftBlockData) NBTWorld.getBlockData(i)).getState()); - } - - @Override - public void injectBiomesFromMantle(Chunk e, Mantle mantle) { - ChunkAccess chunk = ((CraftChunk) e).getHandle(); - AtomicInteger c = new AtomicInteger(); - AtomicInteger r = new AtomicInteger(); - mantle.iterateChunk(e.getX(), e.getZ(), MatterBiomeInject.class, (x, y, z, b) -> { - if (b != null) { - if (b.isCustom()) { - chunk.setBiome(x, y, z, getCustomBiomeRegistry().getHolder(b.getBiomeId()).get()); - c.getAndIncrement(); - } else { - chunk.setBiome(x, y, z, (Holder) getBiomeBase(e.getWorld(), b.getBiome())); - r.getAndIncrement(); - } - } - }); - } - - public ItemStack applyCustomNbt(ItemStack itemStack, KMap customNbt) throws IllegalArgumentException { - if (customNbt != null && !customNbt.isEmpty()) { - net.minecraft.world.item.ItemStack s = CraftItemStack.asNMSCopy(itemStack); - - try { - net.minecraft.nbt.CompoundTag tag = TagParser.parseTag((new JSONObject(customNbt)).toString()); - tag.merge(s.getOrCreateTag()); - s.setTag(tag); - } catch (CommandSyntaxException var5) { - throw new IllegalArgumentException(var5); - } - - return CraftItemStack.asBukkitCopy(s); - } else { - return itemStack; - } - } - - public void inject(long seed, Engine engine, World world) { - var chunkMap = ((CraftWorld)world).getHandle().getChunkSource().chunkMap; - chunkMap.generator = new IrisChunkGenerator(chunkMap.generator, seed, engine, world); - } - - public Vector3d getBoundingbox(org.bukkit.entity.EntityType entity) { - Field[] fields = EntityType.class.getDeclaredFields(); - for (Field field : fields) { - if (Modifier.isStatic(field.getModifiers()) && field.getType().equals(EntityType.class)) { - try { - EntityType entityType = (EntityType) field.get(null); - if (entityType.getDescriptionId().equals("entity.minecraft." + entity.name().toLowerCase())) { - Vector v1 = new Vector<>(); - v1.add(entityType.getHeight()); - entityType.getDimensions(); - Vector3d box = new Vector3d( entityType.getWidth(), entityType.getHeight(), entityType.getWidth()); - //System.out.println("Entity Type: " + entityType.getDescriptionId() + ", " + "Height: " + height + ", Width: " + width); - return box; - } - } catch (IllegalAccessException e) { - Iris.error("Unable to get entity dimensions!"); - e.printStackTrace(); - } - } - } - return null; - } - - @Override - public Entity spawnEntity(Location location, org.bukkit.entity.EntityType type, CreatureSpawnEvent.SpawnReason reason) { - return ((CraftWorld) location.getWorld()).spawn(location, type.getEntityClass(), null, reason); - } - - @Override - public Color getBiomeColor(Location location, BiomeColor type) { - LevelReader reader = ((CraftWorld) location.getWorld()).getHandle(); - var holder = reader.getBiome(new BlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ())); - var biome = holder.value(); - if (biome == null) throw new IllegalArgumentException("Invalid biome: " + holder.unwrapKey().orElse(null)); - - int rgba = switch (type) { - case FOG -> biome.getFogColor(); - case WATER -> biome.getWaterColor(); - case WATER_FOG -> biome.getWaterFogColor(); - case SKY -> biome.getSkyColor(); - case FOLIAGE -> biome.getFoliageColor(); - case GRASS -> biome.getGrassColor(location.getBlockX(), location.getBlockZ()); - }; - if (rgba == 0) { - if (BiomeColor.FOLIAGE == type && biome.getSpecialEffects().getFoliageColorOverride().isEmpty()) - return null; - if (BiomeColor.GRASS == type && biome.getSpecialEffects().getGrassColorOverride().isEmpty()) - return null; - } - return new Color(rgba, true); - } - - @Override - public KList getStructureKeys() { - KList keys = new KList<>(); - - var registry = registry().registry(Registry.STRUCTURE_REGISTRY).orElse(null); - if (registry == null) return keys; - registry.keySet().stream().map(ResourceLocation::toString).forEach(keys::add); - registry.getTags() - .map(Pair::getFirst) - .map(TagKey::location) - .map(ResourceLocation::toString) - .map(s -> "#" + s) - .forEach(keys::add); - - return keys; - } - - private static Field getField(Class clazz, Class fieldType) throws NoSuchFieldException { - try { - for (Field f : clazz.getDeclaredFields()) { - if (f.getType().equals(fieldType)) - return f; - } - throw new NoSuchFieldException(fieldType.getName()); - } catch (NoSuchFieldException var4) { - Class superClass = clazz.getSuperclass(); - if (superClass == null) { - throw var4; - } else { - return getField(superClass, fieldType); - } - } - } -} diff --git a/nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/CustomBiomeSource.java b/nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/CustomBiomeSource.java deleted file mode 100644 index 7a82acf42..000000000 --- a/nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/CustomBiomeSource.java +++ /dev/null @@ -1,152 +0,0 @@ -package com.volmit.iris.core.nms.v1_19_R2; - -import com.mojang.serialization.Codec; -import com.volmit.iris.Iris; -import com.volmit.iris.engine.data.cache.AtomicCache; -import com.volmit.iris.engine.framework.Engine; -import com.volmit.iris.engine.object.IrisBiome; -import com.volmit.iris.engine.object.IrisBiomeCustom; -import com.volmit.iris.util.collection.KMap; -import com.volmit.iris.util.math.RNG; -import net.minecraft.core.Holder; -import net.minecraft.core.Registry; -import net.minecraft.core.RegistryAccess; -import net.minecraft.core.registries.Registries; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.BiomeSource; -import net.minecraft.world.level.biome.Climate; -import org.bukkit.Bukkit; -import org.bukkit.World; -import org.bukkit.craftbukkit.v1_19_R2.CraftServer; -import org.bukkit.craftbukkit.v1_19_R2.CraftWorld; -import org.bukkit.craftbukkit.v1_19_R2.block.CraftBlock; - -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.List; - -public class CustomBiomeSource extends BiomeSource { - - private final long seed; - private final Engine engine; - private final Registry biomeCustomRegistry; - private final Registry biomeRegistry; - private final AtomicCache registryAccess = new AtomicCache<>(); - private final RNG rng; - private final KMap> customBiomes; - - public CustomBiomeSource(long seed, Engine engine, World world) { - super(getAllBiomes( - ((RegistryAccess) getFor(RegistryAccess.Frozen.class, ((CraftServer) Bukkit.getServer()).getHandle().getServer())) - .registry(Registries.BIOME).orElse(null), - ((CraftWorld) world).getHandle().registryAccess().registry(Registries.BIOME).orElse(null), - engine)); - this.engine = engine; - this.seed = seed; - this.biomeCustomRegistry = registry().registry(Registries.BIOME).orElse(null); - this.biomeRegistry = ((CraftWorld) world).getHandle().registryAccess().registry(Registries.BIOME).orElse(null); - this.rng = new RNG(engine.getSeedManager().getBiome()); - this.customBiomes = fillCustomBiomes(biomeCustomRegistry, engine); - } - - private static List> getAllBiomes(Registry customRegistry, Registry registry, Engine engine) { - List> b = new ArrayList<>(); - - for (IrisBiome i : engine.getAllBiomes()) { - if (i.isCustom()) { - for (IrisBiomeCustom j : i.getCustomDerivitives()) { - b.add(customRegistry.getHolder(customRegistry.getResourceKey(customRegistry - .get(new ResourceLocation(engine.getDimension().getLoadKey() + ":" + j.getId()))).get()).get()); - } - } else { - b.add(CraftBlock.biomeToBiomeBase(registry, i.getVanillaDerivative())); - } - } - - return b; - } - - private static Object getFor(Class type, Object source) { - Object o = fieldFor(type, source); - - if (o != null) { - return o; - } - - return invokeFor(type, source); - } - - private static Object fieldFor(Class returns, Object in) { - return fieldForClass(returns, in.getClass(), in); - } - - private static Object invokeFor(Class returns, Object in) { - for (Method i : in.getClass().getMethods()) { - if (i.getReturnType().equals(returns)) { - i.setAccessible(true); - try { - Iris.debug("[NMS] Found " + returns.getSimpleName() + " in " + in.getClass().getSimpleName() + "." + i.getName() + "()"); - return i.invoke(in); - } catch (Throwable e) { - e.printStackTrace(); - } - } - } - - return null; - } - - @SuppressWarnings("unchecked") - private static T fieldForClass(Class returnType, Class sourceType, Object in) { - for (Field i : sourceType.getDeclaredFields()) { - if (i.getType().equals(returnType)) { - i.setAccessible(true); - try { - Iris.debug("[NMS] Found " + returnType.getSimpleName() + " in " + sourceType.getSimpleName() + "." + i.getName()); - return (T) i.get(in); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - } - } - return null; - } - - private KMap> fillCustomBiomes(Registry customRegistry, Engine engine) { - KMap> m = new KMap<>(); - - for (IrisBiome i : engine.getAllBiomes()) { - if (i.isCustom()) { - for (IrisBiomeCustom j : i.getCustomDerivitives()) { - m.put(j.getId(), customRegistry.getHolder(customRegistry.getResourceKey(customRegistry - .get(new ResourceLocation(engine.getDimension().getLoadKey() + ":" + j.getId()))).get()).get()); - } - } - } - - return m; - } - - private RegistryAccess registry() { - return registryAccess.aquire(() -> (RegistryAccess) getFor(RegistryAccess.Frozen.class, ((CraftServer) Bukkit.getServer()).getHandle().getServer())); - } - - @Override - protected Codec codec() { - throw new UnsupportedOperationException("Not supported"); - } - - @Override - public Holder getNoiseBiome(int x, int y, int z, Climate.Sampler sampler) { - int m = (y - engine.getMinHeight()) << 2; - IrisBiome ib = engine.getComplex().getTrueBiomeStream().get(x << 2, z << 2); - if (ib.isCustom()) { - return customBiomes.get(ib.getCustomBiome(rng, x << 2, m, z << 2).getId()); - } else { - org.bukkit.block.Biome v = ib.getSkyBiome(rng, x << 2, m, z << 2); - return CraftBlock.biomeToBiomeBase(biomeRegistry, v); - } - } -} \ No newline at end of file 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 deleted file mode 100644 index 92b7b2b32..000000000 --- a/nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/IrisChunkGenerator.java +++ /dev/null @@ -1,260 +0,0 @@ -package com.volmit.iris.core.nms.v1_19_R2; - -import com.mojang.datafixers.util.Pair; -import com.mojang.serialization.Codec; -import com.volmit.iris.Iris; -import com.volmit.iris.engine.framework.Engine; -import com.volmit.iris.engine.framework.ResultLocator; -import com.volmit.iris.engine.framework.WrongEngineBroException; -import com.volmit.iris.engine.object.IrisJigsawStructure; -import com.volmit.iris.engine.object.IrisJigsawStructurePlacement; -import com.volmit.iris.util.collection.KList; -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; -import net.minecraft.core.RegistryAccess; -import net.minecraft.core.registries.Registries; -import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.server.level.WorldGenRegion; -import net.minecraft.tags.TagKey; -import net.minecraft.util.random.WeightedRandomList; -import net.minecraft.world.entity.MobCategory; -import net.minecraft.world.level.LevelHeightAccessor; -import net.minecraft.world.level.NoiseColumn; -import net.minecraft.world.level.StructureManager; -import net.minecraft.world.level.WorldGenLevel; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.BiomeManager; -import net.minecraft.world.level.biome.BiomeSource; -import net.minecraft.world.level.biome.MobSpawnSettings; -import net.minecraft.world.level.chunk.ChunkAccess; -import net.minecraft.world.level.chunk.ChunkGenerator; -import net.minecraft.world.level.chunk.ChunkGeneratorStructureState; -import net.minecraft.world.level.levelgen.GenerationStep; -import net.minecraft.world.level.levelgen.Heightmap; -import net.minecraft.world.level.levelgen.RandomState; -import net.minecraft.world.level.levelgen.blending.Blender; -import net.minecraft.world.level.levelgen.structure.Structure; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; -import org.bukkit.World; -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.*; - -public class IrisChunkGenerator extends CustomChunkGenerator { - private static final WrappedField BIOME_SOURCE; - private final ChunkGenerator delegate; - private final Engine engine; - private final KMap, KSet> structures = new KMap<>(); - - public IrisChunkGenerator(ChunkGenerator delegate, long seed, Engine engine, World world) { - super(((CraftWorld) world).getHandle(), edit(delegate, new CustomBiomeSource(seed, engine, world)), null); - this.delegate = delegate; - this.engine = engine; - var dimension = engine.getDimension(); - - KSet placements = new KSet<>(); - addAll(dimension.getJigsawStructures(), placements); - for (var region : dimension.getAllRegions(engine)) { - addAll(region.getJigsawStructures(), placements); - for (var biome : region.getAllBiomes(engine)) - addAll(biome.getJigsawStructures(), placements); - } - var stronghold = dimension.getStronghold(); - if (stronghold != null) - placements.add(engine.getData().getJigsawStructureLoader().load(stronghold)); - placements.removeIf(Objects::isNull); - - var registry = ((CraftWorld) world).getHandle().registryAccess().registry(Registries.STRUCTURE).orElseThrow(); - for (var s : placements) { - try { - String raw = s.getStructureKey(); - if (raw == null) continue; - boolean tag = raw.startsWith("#"); - if (tag) raw = raw.substring(1); - - var location = new ResourceLocation(raw); - if (!tag) { - structures.computeIfAbsent(ResourceKey.create(Registries.STRUCTURE, location), k -> new KSet<>()).add(s.getLoadKey()); - continue; - } - - var key = TagKey.create(Registries.STRUCTURE, location); - var set = registry.getTag(key).orElse(null); - if (set == null) { - Iris.error("Could not find structure tag: " + raw); - continue; - } - for (var holder : set) { - var resourceKey = holder.unwrapKey().orElse(null); - if (resourceKey == null) continue; - structures.computeIfAbsent(resourceKey, k -> new KSet<>()).add(s.getLoadKey()); - } - } catch (Throwable e) { - Iris.error("Failed to load structure: " + s.getLoadKey()); - e.printStackTrace(); - } - } - } - - private void addAll(KList placements, KSet structures) { - if (placements == null) return; - placements.stream() - .map(IrisJigsawStructurePlacement::getStructure) - .map(engine.getData().getJigsawStructureLoader()::load) - .filter(Objects::nonNull) - .forEach(structures::add); - } - - @Override - public @Nullable Pair> findNearestMapStructure(ServerLevel level, HolderSet holders, BlockPos pos, int radius, boolean findUnexplored) { - if (engine.getDimension().isDisableExplorerMaps()) - return null; - - KMap> structures = new KMap<>(); - for (var holder : holders) { - if (holder == null) continue; - var key = holder.unwrapKey().orElse(null); - var set = this.structures.get(key); - if (set == null) continue; - for (var structure : set) { - structures.put(structure, holder); - } - } - if (structures.isEmpty()) - return null; - - var locator = ResultLocator.locateStructure(structures.keySet()) - .then((e, p , s) -> structures.get(s.getLoadKey())); - if (findUnexplored) - locator = locator.then((e, p, s) -> e.getMantle().getMantle().getChunk(p.getX(), p.getZ()).isFlagged(MantleFlag.DISCOVERED) ? null : s); - - try { - var result = locator.find(engine, new Position2(pos.getX() >> 4, pos.getZ() >> 4), radius * 10L, i -> {}, false).get(); - if (result == null) return null; - var blockPos = new BlockPos(result.getBlockX(), 0, result.getBlockZ()); - return Pair.of(blockPos, result.obj()); - } catch (WrongEngineBroException | ExecutionException | InterruptedException e) { - return null; - } - } - - @Override - protected Codec codec() { - return Codec.unit(null); - } - - @Override - public ChunkGenerator getDelegate() { - if (delegate instanceof CustomChunkGenerator chunkGenerator) - return chunkGenerator.getDelegate(); - return delegate; - } - - @Override - public int getMinY() { - return delegate.getMinY(); - } - - @Override - public int getSeaLevel() { - return delegate.getSeaLevel(); - } - - @Override - public void createStructures(RegistryAccess iregistrycustom, ChunkGeneratorStructureState chunkgeneratorstructurestate, StructureManager structuremanager, ChunkAccess ichunkaccess, StructureTemplateManager structuretemplatemanager) { - delegate.createStructures(iregistrycustom, chunkgeneratorstructurestate, structuremanager, ichunkaccess, structuretemplatemanager); - } - - @Override - public void buildSurface(WorldGenRegion regionlimitedworldaccess, StructureManager structuremanager, RandomState randomstate, ChunkAccess ichunkaccess) { - delegate.buildSurface(regionlimitedworldaccess, structuremanager, randomstate, ichunkaccess); - } - - @Override - public void applyCarvers(WorldGenRegion regionlimitedworldaccess, long seed, RandomState randomstate, BiomeManager biomemanager, StructureManager structuremanager, ChunkAccess ichunkaccess, GenerationStep.Carving worldgenstage_features) { - delegate.applyCarvers(regionlimitedworldaccess, seed, randomstate, biomemanager, structuremanager, ichunkaccess, worldgenstage_features); - } - - @Override - public CompletableFuture fillFromNoise(Executor executor, Blender blender, RandomState randomstate, StructureManager structuremanager, ChunkAccess ichunkaccess) { - return delegate.fillFromNoise(executor, blender, randomstate, structuremanager, ichunkaccess); - } - - @Override - public int getBaseHeight(int i, int j, Heightmap.Types heightmap_type, LevelHeightAccessor levelheightaccessor, RandomState randomstate) { - return delegate.getBaseHeight(i, j, heightmap_type, levelheightaccessor, randomstate); - } - - @Override - public WeightedRandomList getMobsAt(Holder holder, StructureManager structuremanager, MobCategory enumcreaturetype, BlockPos blockposition) { - return delegate.getMobsAt(holder, structuremanager, enumcreaturetype, blockposition); - } - - @Override - public void applyBiomeDecoration(WorldGenLevel generatoraccessseed, ChunkAccess ichunkaccess, StructureManager structuremanager) { - delegate.applyBiomeDecoration(generatoraccessseed, ichunkaccess, structuremanager); - } - - @Override - public void addDebugScreenInfo(List list, RandomState randomstate, BlockPos blockposition) { - delegate.addDebugScreenInfo(list, randomstate, blockposition); - } - - @Override - public void spawnOriginalMobs(WorldGenRegion regionlimitedworldaccess) { - delegate.spawnOriginalMobs(regionlimitedworldaccess); - } - - @Override - public int getSpawnHeight(LevelHeightAccessor levelheightaccessor) { - return delegate.getSpawnHeight(levelheightaccessor); - } - - @Override - public int getGenDepth() { - return delegate.getGenDepth(); - } - - @Override - 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/NMSBinding.java b/nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/NMSBinding.java deleted file mode 100644 index 5d4c44d70..000000000 --- a/nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/NMSBinding.java +++ /dev/null @@ -1,628 +0,0 @@ -package com.volmit.iris.core.nms.v1_19_R2; - -import java.awt.Color; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Vector; -import java.util.concurrent.atomic.AtomicInteger; - -import com.mojang.datafixers.util.Pair; -import com.volmit.iris.core.nms.container.BiomeColor; -import com.volmit.iris.util.scheduling.J; -import net.minecraft.nbt.*; -import net.minecraft.nbt.Tag; -import net.minecraft.server.commands.data.BlockDataAccessor; -import net.minecraft.tags.TagKey; -import net.minecraft.world.level.LevelReader; -import net.minecraft.world.level.block.EntityBlock; -import org.bukkit.*; -import org.bukkit.block.Biome; -import org.bukkit.block.data.BlockData; -import org.bukkit.craftbukkit.v1_19_R2.CraftChunk; -import org.bukkit.craftbukkit.v1_19_R2.CraftServer; -import org.bukkit.craftbukkit.v1_19_R2.CraftWorld; -import org.bukkit.craftbukkit.v1_19_R2.block.CraftBlock; -import org.bukkit.craftbukkit.v1_19_R2.block.CraftBlockState; -import org.bukkit.craftbukkit.v1_19_R2.block.CraftBlockStates; -import org.bukkit.craftbukkit.v1_19_R2.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_19_R2.entity.CraftDolphin; -import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftItemStack; -import org.bukkit.entity.Dolphin; -import org.bukkit.entity.Entity; -import org.bukkit.event.entity.CreatureSpawnEvent; -import org.bukkit.generator.ChunkGenerator; -import org.bukkit.inventory.ItemStack; -import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.NotNull; - -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import com.volmit.iris.Iris; -import com.volmit.iris.core.nms.INMSBinding; -import com.volmit.iris.engine.data.cache.AtomicCache; -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.hunk.Hunk; -import com.volmit.iris.util.json.JSONObject; -import com.volmit.iris.util.mantle.Mantle; -import com.volmit.iris.util.math.Vector3d; -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.*; -import com.volmit.iris.util.nbt.tag.CompoundTag; - -import it.unimi.dsi.fastutil.objects.Object2IntMap; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Holder; -import net.minecraft.core.Registry; -import net.minecraft.core.RegistryAccess; -import net.minecraft.core.registries.Registries; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.level.biome.BiomeSource; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkAccess; -import net.minecraft.world.level.chunk.LevelChunk; -import sun.misc.Unsafe; - -public class NMSBinding implements INMSBinding { - private final KMap baseBiomeCache = new KMap<>(); - private final BlockData AIR = Material.AIR.createBlockData(); - private final AtomicCache> biomeMapCache = new AtomicCache<>(); - private final AtomicCache> registryCache = new AtomicCache<>(); - private final AtomicCache> globalCache = new AtomicCache<>(); - private final AtomicCache registryAccess = new AtomicCache<>(); - private final AtomicCache byIdRef = new AtomicCache<>(); - private Field biomeStorageCache = null; - - private static Object getFor(Class type, Object source) { - Object o = fieldFor(type, source); - - if (o != null) { - return o; - } - - return invokeFor(type, source); - } - - private static Object invokeFor(Class returns, Object in) { - for (Method i : in.getClass().getMethods()) { - if (i.getReturnType().equals(returns)) { - i.setAccessible(true); - try { - Iris.debug("[NMS] Found " + returns.getSimpleName() + " in " + in.getClass().getSimpleName() + "." + i.getName() + "()"); - return i.invoke(in); - } catch (Throwable e) { - e.printStackTrace(); - } - } - } - - return null; - } - - private static Object fieldFor(Class returns, Object in) { - return fieldForClass(returns, in.getClass(), in); - } - - @SuppressWarnings("unchecked") - private static T fieldForClass(Class returnType, Class sourceType, Object in) { - for (Field i : sourceType.getDeclaredFields()) { - if (i.getType().equals(returnType)) { - i.setAccessible(true); - try { - Iris.debug("[NMS] Found " + returnType.getSimpleName() + " in " + sourceType.getSimpleName() + "." + i.getName()); - return (T) i.get(in); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - } - } - return null; - } - - private static Class getClassType(Class type, int ordinal) { - return type.getDeclaredClasses()[ordinal]; - } - - @Override - public boolean hasTile(Material material) { - return !CraftBlockState.class.equals(CraftBlockStates.getBlockStateType(material)); - } - - @Override - public boolean hasTile(Location l) { - return ((CraftWorld) l.getWorld()).getHandle().getBlockEntity(new BlockPos(l.getBlockX(), l.getBlockY(), l.getBlockZ()), false) != null; - } - - @Override - @SuppressWarnings("unchecked") - public KMap serializeTile(Location location) { - BlockEntity e = ((CraftWorld) location.getWorld()).getHandle().getBlockEntity(new BlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ()), false); - - if (e == null) { - return null; - } - - net.minecraft.nbt.CompoundTag tag = e.saveWithoutMetadata(); - return (KMap) convertFromTag(tag, 0, 64); - } - - @Contract(value = "null, _, _ -> null", pure = true) - private Object convertFromTag(net.minecraft.nbt.Tag tag, int depth, int maxDepth) { - if (tag == null || depth > maxDepth) return null; - if (tag instanceof CollectionTag collection) { - KList list = new KList<>(); - - for (Object i : collection) { - if (i instanceof net.minecraft.nbt.Tag t) - list.add(convertFromTag(t, depth + 1, maxDepth)); - else list.add(i); - } - return list; - } - if (tag instanceof net.minecraft.nbt.CompoundTag compound) { - KMap map = new KMap<>(); - - for (String key : compound.getAllKeys()) { - var child = compound.get(key); - if (child == null) continue; - var value = convertFromTag(child, depth + 1, maxDepth); - if (value == null) continue; - map.put(key, value); - } - return map; - } - if (tag instanceof NumericTag numeric) - return numeric.getAsNumber(); - return tag.getAsString(); - } - - @Override - public void deserializeTile(KMap map, Location pos) { - net.minecraft.nbt.CompoundTag tag = (net.minecraft.nbt.CompoundTag) convertToTag(map, 0, 64); - var level = ((CraftWorld) pos.getWorld()).getHandle(); - var blockPos = new BlockPos(pos.getBlockX(), pos.getBlockY(), pos.getBlockZ()); - J.s(() -> merge(level, blockPos, tag)); - } - - private void merge(ServerLevel level, BlockPos blockPos, net.minecraft.nbt.CompoundTag tag) { - var blockEntity = level.getBlockEntity(blockPos); - if (blockEntity == null) { - Iris.warn("[NMS] BlockEntity not found at " + blockPos); - var state = level.getBlockState(blockPos); - if (!state.hasBlockEntity()) - return; - - blockEntity = ((EntityBlock) state.getBlock()) - .newBlockEntity(blockPos, state); - } - var accessor = new BlockDataAccessor(blockEntity, blockPos); - accessor.setData(tag.merge(accessor.getData())); - } - - private Tag convertToTag(Object object, int depth, int maxDepth) { - if (object == null || depth > maxDepth) return EndTag.INSTANCE; - if (object instanceof Map map) { - var tag = new net.minecraft.nbt.CompoundTag(); - for (var i : map.entrySet()) { - tag.put(i.getKey().toString(), convertToTag(i.getValue(), depth + 1, maxDepth)); - } - return tag; - } - if (object instanceof List list) { - var tag = new net.minecraft.nbt.ListTag(); - for (var i : list) { - tag.add(convertToTag(i, depth + 1, maxDepth)); - } - return tag; - } - if (object instanceof Byte number) return ByteTag.valueOf(number); - if (object instanceof Short number) return ShortTag.valueOf(number); - if (object instanceof Integer number) return IntTag.valueOf(number); - if (object instanceof Long number) return LongTag.valueOf(number); - if (object instanceof Float number) return FloatTag.valueOf(number); - if (object instanceof Double number) return DoubleTag.valueOf(number); - if (object instanceof String string) return StringTag.valueOf(string); - return EndTag.INSTANCE; - } - - @Override - public CompoundTag serializeEntity(Entity location) { - return null;// TODO: - } - - @Override - public Entity deserializeEntity(CompoundTag s, Location newPosition) { - return null;// TODO: - } - - @Override - public boolean supportsCustomHeight() { - return true; - } - - private RegistryAccess registry() { - return registryAccess.aquire(() -> (RegistryAccess) getFor(RegistryAccess.Frozen.class, ((CraftServer) Bukkit.getServer()).getHandle().getServer())); - } - - private Registry getCustomBiomeRegistry() { - return registry().registry(Registries.BIOME).orElse(null); - } - - private Registry getBlockRegistry() { - return registry().registry(Registries.BLOCK).orElse(null); - } - - @Override - public Object getBiomeBaseFromId(int id) { - return getCustomBiomeRegistry().getHolder(id); - } - - @Override - public int getMinHeight(World world) { - return world.getMinHeight(); - } - - @Override - public boolean supportsCustomBiomes() { - return true; - } - - @Override - public int getTrueBiomeBaseId(Object biomeBase) { - return getCustomBiomeRegistry().getId(((Holder) biomeBase).value()); - } - - @Override - public Object getTrueBiomeBase(Location location) { - return ((CraftWorld) location.getWorld()).getHandle().getBiome(new BlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ())); - } - - @Override - public String getTrueBiomeBaseKey(Location location) { - return getKeyForBiomeBase(getTrueBiomeBase(location)); - } - - @Override - public Object getCustomBiomeBaseFor(String mckey) { - return getCustomBiomeRegistry().get(new ResourceLocation(mckey)); - } - - @Override - public Object getCustomBiomeBaseHolderFor(String mckey) { - return getCustomBiomeRegistry().getHolder(getTrueBiomeBaseId(getCustomBiomeRegistry().get(new ResourceLocation(mckey)))).get(); - } - - public int getBiomeBaseIdForKey(String key) { - return getCustomBiomeRegistry().getId(getCustomBiomeRegistry().get(new ResourceLocation(key))); - } - - @Override - public String getKeyForBiomeBase(Object biomeBase) { - return getCustomBiomeRegistry().getKey((net.minecraft.world.level.biome.Biome) biomeBase).getPath(); // something, not something:something - } - - @Override - public Object getBiomeBase(World world, Biome biome) { - return CraftBlock.biomeToBiomeBase(((CraftWorld) world).getHandle() - .registryAccess().registry(Registries.BIOME).orElse(null), biome); - } - - @Override - public Object getBiomeBase(Object registry, Biome biome) { - Object v = baseBiomeCache.get(biome); - - if (v != null) { - return v; - } - //noinspection unchecked - v = CraftBlock.biomeToBiomeBase((Registry) registry, biome); - if (v == null) { - // Ok so there is this new biome name called "CUSTOM" in Paper's new releases. - // But, this does NOT exist within CraftBukkit which makes it return an error. - // So, we will just return the ID that the plains biome returns instead. - //noinspection unchecked - return CraftBlock.biomeToBiomeBase((Registry) registry, Biome.PLAINS); - } - baseBiomeCache.put(biome, v); - return v; - } - - @Override - public KList getBiomes() { - return new KList<>(Biome.values()).qdel(Biome.CUSTOM); - } - - @Override - public boolean isBukkit() { - return true; - } - - @Override - public int getBiomeId(Biome biome) { - for (World i : Bukkit.getWorlds()) { - if (i.getEnvironment().equals(World.Environment.NORMAL)) { - Registry registry = ((CraftWorld) i).getHandle().registryAccess().registry(Registries.BIOME).orElse(null); - return registry.getId((net.minecraft.world.level.biome.Biome) getBiomeBase(registry, biome)); - } - } - - return biome.ordinal(); - } - - private MCAIdMap getBiomeMapping() { - return biomeMapCache.aquire(() -> new MCAIdMap<>() { - @NotNull - @Override - public Iterator iterator() { - return getCustomBiomeRegistry().iterator(); - } - - @Override - public int getId(net.minecraft.world.level.biome.Biome paramT) { - return getCustomBiomeRegistry().getId(paramT); - } - - @Override - public net.minecraft.world.level.biome.Biome byId(int paramInt) { - return (net.minecraft.world.level.biome.Biome) getBiomeBaseFromId(paramInt); - } - }); - } - - @NotNull - private MCABiomeContainer getBiomeContainerInterface(MCAIdMap biomeMapping, MCAChunkBiomeContainer base) { - return new MCABiomeContainer() { - @Override - public int[] getData() { - return base.writeBiomes(); - } - - @Override - public void setBiome(int x, int y, int z, int id) { - base.setBiome(x, y, z, biomeMapping.byId(id)); - } - - @Override - public int getBiome(int x, int y, int z) { - return biomeMapping.getId(base.getBiome(x, y, z)); - } - }; - } - - @Override - public MCABiomeContainer newBiomeContainer(int min, int max) { - MCAChunkBiomeContainer base = new MCAChunkBiomeContainer<>(getBiomeMapping(), min, max); - return getBiomeContainerInterface(getBiomeMapping(), base); - } - - @Override - public MCABiomeContainer newBiomeContainer(int min, int max, int[] data) { - MCAChunkBiomeContainer base = new MCAChunkBiomeContainer<>(getBiomeMapping(), min, max, data); - return getBiomeContainerInterface(getBiomeMapping(), base); - } - - @Override - public int countCustomBiomes() { - AtomicInteger a = new AtomicInteger(0); - - getCustomBiomeRegistry().keySet().forEach((i) -> { - if (i.getNamespace().equals("minecraft")) { - return; - } - - a.incrementAndGet(); - Iris.debug("Custom Biome: " + i); - }); - - return a.get(); - } - - public boolean supportsDataPacks() { - return true; - } - - public void setBiomes(int cx, int cz, World world, Hunk biomes) { - LevelChunk c = ((CraftWorld) world).getHandle().getChunk(cx, cz); - biomes.iterateSync((x, y, z, b) -> c.setBiome(x, y, z, (Holder) b)); - c.setUnsaved(true); - } - - @Override - public void forceBiomeInto(int x, int y, int z, Object somethingVeryDirty, ChunkGenerator.BiomeGrid chunk) { - try { - ChunkAccess s = (ChunkAccess) getFieldForBiomeStorage(chunk).get(chunk); - Holder biome = (Holder) somethingVeryDirty; - s.setBiome(x, y, z, biome); - } catch (IllegalAccessException e) { - Iris.reportError(e); - e.printStackTrace(); - } - } - - private Field getFieldForBiomeStorage(Object storage) { - Field f = biomeStorageCache; - - if (f != null) { - return f; - } - try { - f = storage.getClass().getDeclaredField("biome"); - f.setAccessible(true); - return f; - } catch (Throwable e) { - Iris.reportError(e); - e.printStackTrace(); - Iris.error(storage.getClass().getCanonicalName()); - } - - biomeStorageCache = f; - return null; - } - - @Override - public MCAPaletteAccess createPalette() { - MCAIdMapper registry = registryCache.aquireNasty(() -> { - Field cf = net.minecraft.core.IdMapper.class.getDeclaredField("tToId"); - Field df = net.minecraft.core.IdMapper.class.getDeclaredField("idToT"); - Field bf = net.minecraft.core.IdMapper.class.getDeclaredField("nextId"); - cf.setAccessible(true); - df.setAccessible(true); - bf.setAccessible(true); - net.minecraft.core.IdMapper blockData = Block.BLOCK_STATE_REGISTRY; - int b = bf.getInt(blockData); - Object2IntMap c = (Object2IntMap) cf.get(blockData); - List d = (List) df.get(blockData); - return new MCAIdMapper(c, d, b); - }); - MCAPalette global = globalCache.aquireNasty(() -> new MCAGlobalPalette<>(registry, ((CraftBlockData) AIR).getState())); - MCAPalettedContainer container = new MCAPalettedContainer<>(global, registry, - i -> ((CraftBlockData) NBTWorld.getBlockData(i)).getState(), - i -> NBTWorld.getCompound(CraftBlockData.fromData(i)), - ((CraftBlockData) AIR).getState()); - return new MCAWrappedPalettedContainer<>(container, - i -> NBTWorld.getCompound(CraftBlockData.fromData(i)), - i -> ((CraftBlockData) NBTWorld.getBlockData(i)).getState()); - } - - @Override - public void injectBiomesFromMantle(Chunk e, Mantle mantle) { - ChunkAccess chunk = ((CraftChunk) e).getHandle(); - AtomicInteger c = new AtomicInteger(); - AtomicInteger r = new AtomicInteger(); - mantle.iterateChunk(e.getX(), e.getZ(), MatterBiomeInject.class, (x, y, z, b) -> { - if (b != null) { - if (b.isCustom()) { - chunk.setBiome(x, y, z, getCustomBiomeRegistry().getHolder(b.getBiomeId()).get()); - c.getAndIncrement(); - } else { - chunk.setBiome(x, y, z, (Holder) getBiomeBase(e.getWorld(), b.getBiome())); - r.getAndIncrement(); - } - } - }); - } - - public ItemStack applyCustomNbt(ItemStack itemStack, KMap customNbt) throws IllegalArgumentException { - if (customNbt != null && !customNbt.isEmpty()) { - net.minecraft.world.item.ItemStack s = CraftItemStack.asNMSCopy(itemStack); - - try { - net.minecraft.nbt.CompoundTag tag = TagParser.parseTag((new JSONObject(customNbt)).toString()); - tag.merge(s.getOrCreateTag()); - s.setTag(tag); - } catch (CommandSyntaxException var5) { - throw new IllegalArgumentException(var5); - } - - return CraftItemStack.asBukkitCopy(s); - } else { - return itemStack; - } - } - - public void inject(long seed, Engine engine, World world) { - var chunkMap = ((CraftWorld)world).getHandle().getChunkSource().chunkMap; - chunkMap.generator = new IrisChunkGenerator(chunkMap.generator, seed, engine, world); - } - - - public Vector3d getBoundingbox(org.bukkit.entity.EntityType entity) { - Field[] fields = EntityType.class.getDeclaredFields(); - for (Field field : fields) { - if (Modifier.isStatic(field.getModifiers()) && field.getType().equals(EntityType.class)) { - try { - EntityType entityType = (EntityType) field.get(null); - if (entityType.getDescriptionId().equals("entity.minecraft." + entity.name().toLowerCase())) { - Vector v1 = new Vector<>(); - v1.add(entityType.getHeight()); - entityType.getDimensions(); - Vector3d box = new Vector3d( entityType.getWidth(), entityType.getHeight(), entityType.getWidth()); - //System.out.println("Entity Type: " + entityType.getDescriptionId() + ", " + "Height: " + height + ", Width: " + width); - return box; - } - } catch (IllegalAccessException e) { - Iris.error("Unable to get entity dimensions!"); - e.printStackTrace(); - } - } - } - return null; - } - - @Override - public Entity spawnEntity(Location location, org.bukkit.entity.EntityType type, CreatureSpawnEvent.SpawnReason reason) { - return ((CraftWorld) location.getWorld()).spawn(location, type.getEntityClass(), null, reason); - } - - @Override - public Color getBiomeColor(Location location, BiomeColor type) { - LevelReader reader = ((CraftWorld) location.getWorld()).getHandle(); - var holder = reader.getBiome(new BlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ())); - var biome = holder.value(); - if (biome == null) throw new IllegalArgumentException("Invalid biome: " + holder.unwrapKey().orElse(null)); - - int rgba = switch (type) { - case FOG -> biome.getFogColor(); - case WATER -> biome.getWaterColor(); - case WATER_FOG -> biome.getWaterFogColor(); - case SKY -> biome.getSkyColor(); - case FOLIAGE -> biome.getFoliageColor(); - case GRASS -> biome.getGrassColor(location.getBlockX(), location.getBlockZ()); - }; - if (rgba == 0) { - if (BiomeColor.FOLIAGE == type && biome.getSpecialEffects().getFoliageColorOverride().isEmpty()) - return null; - if (BiomeColor.GRASS == type && biome.getSpecialEffects().getGrassColorOverride().isEmpty()) - return null; - } - return new Color(rgba, true); - } - - @Override - public KList getStructureKeys() { - KList keys = new KList<>(); - - var registry = registry().registry(Registries.STRUCTURE).orElse(null); - if (registry == null) return keys; - registry.keySet().stream().map(ResourceLocation::toString).forEach(keys::add); - registry.getTags() - .map(Pair::getFirst) - .map(TagKey::location) - .map(ResourceLocation::toString) - .map(s -> "#" + s) - .forEach(keys::add); - - return keys; - } - - private static Field getField(Class clazz, Class fieldType) throws NoSuchFieldException { - try { - for (Field f : clazz.getDeclaredFields()) { - if (f.getType().equals(fieldType)) - return f; - } - throw new NoSuchFieldException(fieldType.getName()); - } catch (NoSuchFieldException var4) { - Class superClass = clazz.getSuperclass(); - if (superClass == null) { - throw var4; - } else { - return getField(superClass, fieldType); - } - } - } -} diff --git a/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/CustomBiomeSource.java b/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/CustomBiomeSource.java deleted file mode 100644 index f3debbaad..000000000 --- a/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/CustomBiomeSource.java +++ /dev/null @@ -1,169 +0,0 @@ -package com.volmit.iris.core.nms.v1_19_R3; - -import com.mojang.serialization.Codec; -import com.volmit.iris.Iris; -import com.volmit.iris.engine.data.cache.AtomicCache; -import com.volmit.iris.engine.framework.Engine; -import com.volmit.iris.engine.object.IrisBiome; -import com.volmit.iris.engine.object.IrisBiomeCustom; -import com.volmit.iris.util.collection.KMap; -import com.volmit.iris.util.math.RNG; -import net.minecraft.core.Holder; -import net.minecraft.core.Registry; -import net.minecraft.core.RegistryAccess; -import net.minecraft.core.registries.Registries; -import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.BiomeSource; -import net.minecraft.world.level.biome.Climate; -import org.bukkit.Bukkit; -import org.bukkit.World; -import org.bukkit.craftbukkit.v1_19_R3.CraftServer; -import org.bukkit.craftbukkit.v1_19_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_19_R3.block.CraftBlock; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.stream.Stream; - -public class CustomBiomeSource extends BiomeSource { - - private final long seed; - private final Engine engine; - private final Registry biomeCustomRegistry; - private final Registry biomeRegistry; - private final AtomicCache registryAccess = new AtomicCache<>(); - private final RNG rng; - private final KMap> customBiomes; - - public CustomBiomeSource(long seed, Engine engine, World world) { - this.engine = engine; - this.seed = seed; - this.biomeCustomRegistry = registry().registry(Registries.BIOME).orElse(null); - this.biomeRegistry = ((RegistryAccess) getFor(RegistryAccess.Frozen.class, ((CraftServer) Bukkit.getServer()).getHandle().getServer())).registry(Registries.BIOME).orElse(null); - this.rng = new RNG(engine.getSeedManager().getBiome()); - this.customBiomes = fillCustomBiomes(biomeCustomRegistry, engine); - } - - private static List> getAllBiomes(Registry customRegistry, Registry registry, Engine engine) { - List> b = new ArrayList<>(); - - for (IrisBiome i : engine.getAllBiomes()) { - if (i.isCustom()) { - for (IrisBiomeCustom j : i.getCustomDerivitives()) { - b.add(customRegistry.getHolder(customRegistry.getResourceKey(customRegistry - .get(new ResourceLocation(engine.getDimension().getLoadKey() + ":" + j.getId()))).get()).get()); - } - } else { - b.add(CraftBlock.biomeToBiomeBase(registry, i.getVanillaDerivative())); - } - } - - return b; - } - - private static Object getFor(Class type, Object source) { - Object o = fieldFor(type, source); - - if (o != null) { - return o; - } - - return invokeFor(type, source); - } - - private static Object fieldFor(Class returns, Object in) { - return fieldForClass(returns, in.getClass(), in); - } - - private static Object invokeFor(Class returns, Object in) { - for (Method i : in.getClass().getMethods()) { - if (i.getReturnType().equals(returns)) { - i.setAccessible(true); - try { - Iris.debug("[NMS] Found " + returns.getSimpleName() + " in " + in.getClass().getSimpleName() + "." + i.getName() + "()"); - return i.invoke(in); - } catch (Throwable e) { - e.printStackTrace(); - } - } - } - - return null; - } - - @SuppressWarnings("unchecked") - private static T fieldForClass(Class returnType, Class sourceType, Object in) { - for (Field i : sourceType.getDeclaredFields()) { - if (i.getType().equals(returnType)) { - i.setAccessible(true); - try { - Iris.debug("[NMS] Found " + returnType.getSimpleName() + " in " + sourceType.getSimpleName() + "." + i.getName()); - return (T) i.get(in); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - } - } - return null; - } - - @Override - protected Stream> collectPossibleBiomes() { - return getAllBiomes( - ((RegistryAccess) getFor(RegistryAccess.Frozen.class, ((CraftServer) Bukkit.getServer()).getHandle().getServer())) - .registry(Registries.BIOME).orElse(null), - ((CraftWorld) engine.getWorld().realWorld()).getHandle().registryAccess().registry(Registries.BIOME).orElse(null), - engine).stream(); - } - private KMap> fillCustomBiomes(Registry customRegistry, Engine engine) { - KMap> m = new KMap<>(); - - for (IrisBiome i : engine.getAllBiomes()) { - if (i.isCustom()) { - for (IrisBiomeCustom j : i.getCustomDerivitives()) { - ResourceLocation resourceLocation = new ResourceLocation(engine.getDimension().getLoadKey() + ":" + j.getId()); - Biome biome = customRegistry.get(resourceLocation); - Optional> optionalBiomeKey = customRegistry.getResourceKey(biome); - if (optionalBiomeKey.isEmpty()) { - Iris.error("Cannot find biome for IrisBiomeCustom " + j.getId() + " from engine " + engine.getName()); - continue; - } - ResourceKey biomeKey = optionalBiomeKey.get(); - Optional> optionalReferenceHolder = customRegistry.getHolder(biomeKey); - if (optionalReferenceHolder.isEmpty()) { - Iris.error("Cannot find reference to biome " + biomeKey + " for engine " + engine.getName()); - continue; - } - m.put(j.getId(), optionalReferenceHolder.get()); - } - } - } - - return m; - } - - private RegistryAccess registry() { - return registryAccess.aquire(() -> (RegistryAccess) getFor(RegistryAccess.Frozen.class, ((CraftServer) Bukkit.getServer()).getHandle().getServer())); - } - - @Override - protected Codec codec() { - throw new UnsupportedOperationException("Not supported"); - } - - @Override - public Holder getNoiseBiome(int x, int y, int z, Climate.Sampler sampler) { - int m = (y - engine.getMinHeight()) << 2; - IrisBiome ib = engine.getComplex().getTrueBiomeStream().get(x << 2, z << 2); - if (ib.isCustom()) { - return customBiomes.get(ib.getCustomBiome(rng, x << 2, m, z << 2).getId()); - } else { - org.bukkit.block.Biome v = ib.getSkyBiome(rng, x << 2, m, z << 2); - return CraftBlock.biomeToBiomeBase(biomeRegistry, v); - } - } -} \ No newline at end of file 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 deleted file mode 100644 index f4f0b4502..000000000 --- a/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/IrisChunkGenerator.java +++ /dev/null @@ -1,262 +0,0 @@ -package com.volmit.iris.core.nms.v1_19_R3; - -import com.mojang.datafixers.util.Pair; -import com.mojang.serialization.Codec; -import com.volmit.iris.Iris; -import com.volmit.iris.engine.framework.Engine; -import com.volmit.iris.engine.framework.ResultLocator; -import com.volmit.iris.engine.framework.WrongEngineBroException; -import com.volmit.iris.engine.object.IrisJigsawStructure; -import com.volmit.iris.engine.object.IrisJigsawStructurePlacement; -import com.volmit.iris.util.collection.KList; -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; -import net.minecraft.core.RegistryAccess; -import net.minecraft.core.registries.Registries; -import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.server.level.WorldGenRegion; -import net.minecraft.tags.TagKey; -import net.minecraft.util.random.WeightedRandomList; -import net.minecraft.world.entity.MobCategory; -import net.minecraft.world.level.LevelHeightAccessor; -import net.minecraft.world.level.NoiseColumn; -import net.minecraft.world.level.StructureManager; -import net.minecraft.world.level.WorldGenLevel; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.BiomeManager; -import net.minecraft.world.level.biome.BiomeSource; -import net.minecraft.world.level.biome.MobSpawnSettings; -import net.minecraft.world.level.chunk.ChunkAccess; -import net.minecraft.world.level.chunk.ChunkGenerator; -import net.minecraft.world.level.chunk.ChunkGeneratorStructureState; -import net.minecraft.world.level.levelgen.GenerationStep; -import net.minecraft.world.level.levelgen.Heightmap; -import net.minecraft.world.level.levelgen.RandomState; -import net.minecraft.world.level.levelgen.blending.Blender; -import net.minecraft.world.level.levelgen.structure.Structure; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; -import org.bukkit.World; -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; -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 KMap, KSet> structures = new KMap<>(); - - public IrisChunkGenerator(ChunkGenerator delegate, long seed, Engine engine, World world) { - super(((CraftWorld) world).getHandle(), edit(delegate, new CustomBiomeSource(seed, engine, world)), null); - this.delegate = delegate; - this.engine = engine; - var dimension = engine.getDimension(); - - KSet placements = new KSet<>(); - addAll(dimension.getJigsawStructures(), placements); - for (var region : dimension.getAllRegions(engine)) { - addAll(region.getJigsawStructures(), placements); - for (var biome : region.getAllBiomes(engine)) - addAll(biome.getJigsawStructures(), placements); - } - var stronghold = dimension.getStronghold(); - if (stronghold != null) - placements.add(engine.getData().getJigsawStructureLoader().load(stronghold)); - placements.removeIf(Objects::isNull); - - var registry = ((CraftWorld) world).getHandle().registryAccess().registry(Registries.STRUCTURE).orElseThrow(); - for (var s : placements) { - try { - String raw = s.getStructureKey(); - if (raw == null) continue; - boolean tag = raw.startsWith("#"); - if (tag) raw = raw.substring(1); - - var location = new ResourceLocation(raw); - if (!tag) { - structures.computeIfAbsent(ResourceKey.create(Registries.STRUCTURE, location), k -> new KSet<>()).add(s.getLoadKey()); - continue; - } - - var key = TagKey.create(Registries.STRUCTURE, location); - var set = registry.getTag(key).orElse(null); - if (set == null) { - Iris.error("Could not find structure tag: " + raw); - continue; - } - for (var holder : set) { - var resourceKey = holder.unwrapKey().orElse(null); - if (resourceKey == null) continue; - structures.computeIfAbsent(resourceKey, k -> new KSet<>()).add(s.getLoadKey()); - } - } catch (Throwable e) { - Iris.error("Failed to load structure: " + s.getLoadKey()); - e.printStackTrace(); - } - } - } - - private void addAll(KList placements, KSet structures) { - if (placements == null) return; - placements.stream() - .map(IrisJigsawStructurePlacement::getStructure) - .map(engine.getData().getJigsawStructureLoader()::load) - .filter(Objects::nonNull) - .forEach(structures::add); - } - - @Override - public @Nullable Pair> findNearestMapStructure(ServerLevel level, HolderSet holders, BlockPos pos, int radius, boolean findUnexplored) { - if (engine.getDimension().isDisableExplorerMaps()) - return null; - - KMap> structures = new KMap<>(); - for (var holder : holders) { - if (holder == null) continue; - var key = holder.unwrapKey().orElse(null); - var set = this.structures.get(key); - if (set == null) continue; - for (var structure : set) { - structures.put(structure, holder); - } - } - if (structures.isEmpty()) - return null; - - var locator = ResultLocator.locateStructure(structures.keySet()) - .then((e, p , s) -> structures.get(s.getLoadKey())); - if (findUnexplored) - locator = locator.then((e, p, s) -> e.getMantle().getMantle().getChunk(p.getX(), p.getZ()).isFlagged(MantleFlag.DISCOVERED) ? null : s); - - try { - var result = locator.find(engine, new Position2(pos.getX() >> 4, pos.getZ() >> 4), radius * 10L, i -> {}, false).get(); - if (result == null) return null; - var blockPos = new BlockPos(result.getBlockX(), 0, result.getBlockZ()); - return Pair.of(blockPos, result.obj()); - } catch (WrongEngineBroException | ExecutionException | InterruptedException e) { - return null; - } - } - - @Override - protected Codec codec() { - return Codec.unit(null); - } - - @Override - public ChunkGenerator getDelegate() { - if (delegate instanceof CustomChunkGenerator chunkGenerator) - return chunkGenerator.getDelegate(); - return delegate; - } - - @Override - public int getMinY() { - return delegate.getMinY(); - } - - @Override - public int getSeaLevel() { - return delegate.getSeaLevel(); - } - - @Override - public void createStructures(RegistryAccess iregistrycustom, ChunkGeneratorStructureState chunkgeneratorstructurestate, StructureManager structuremanager, ChunkAccess ichunkaccess, StructureTemplateManager structuretemplatemanager) { - delegate.createStructures(iregistrycustom, chunkgeneratorstructurestate, structuremanager, ichunkaccess, structuretemplatemanager); - } - - @Override - public void buildSurface(WorldGenRegion regionlimitedworldaccess, StructureManager structuremanager, RandomState randomstate, ChunkAccess ichunkaccess) { - delegate.buildSurface(regionlimitedworldaccess, structuremanager, randomstate, ichunkaccess); - } - - @Override - public void applyCarvers(WorldGenRegion regionlimitedworldaccess, long seed, RandomState randomstate, BiomeManager biomemanager, StructureManager structuremanager, ChunkAccess ichunkaccess, GenerationStep.Carving worldgenstage_features) { - delegate.applyCarvers(regionlimitedworldaccess, seed, randomstate, biomemanager, structuremanager, ichunkaccess, worldgenstage_features); - } - - @Override - public CompletableFuture fillFromNoise(Executor executor, Blender blender, RandomState randomstate, StructureManager structuremanager, ChunkAccess ichunkaccess) { - return delegate.fillFromNoise(executor, blender, randomstate, structuremanager, ichunkaccess); - } - - @Override - public int getBaseHeight(int i, int j, Heightmap.Types heightmap_type, LevelHeightAccessor levelheightaccessor, RandomState randomstate) { - return delegate.getBaseHeight(i, j, heightmap_type, levelheightaccessor, randomstate); - } - - @Override - public WeightedRandomList getMobsAt(Holder holder, StructureManager structuremanager, MobCategory enumcreaturetype, BlockPos blockposition) { - return delegate.getMobsAt(holder, structuremanager, enumcreaturetype, blockposition); - } - - @Override - public void applyBiomeDecoration(WorldGenLevel generatoraccessseed, ChunkAccess ichunkaccess, StructureManager structuremanager) { - delegate.applyBiomeDecoration(generatoraccessseed, ichunkaccess, structuremanager); - } - - @Override - public void addDebugScreenInfo(List list, RandomState randomstate, BlockPos blockposition) { - delegate.addDebugScreenInfo(list, randomstate, blockposition); - } - - @Override - public void spawnOriginalMobs(WorldGenRegion regionlimitedworldaccess) { - delegate.spawnOriginalMobs(regionlimitedworldaccess); - } - - @Override - public int getSpawnHeight(LevelHeightAccessor levelheightaccessor) { - return delegate.getSpawnHeight(levelheightaccessor); - } - - @Override - public int getGenDepth() { - return delegate.getGenDepth(); - } - - @Override - 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/NMSBinding.java b/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/NMSBinding.java deleted file mode 100644 index 6c151dea8..000000000 --- a/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/NMSBinding.java +++ /dev/null @@ -1,638 +0,0 @@ -package com.volmit.iris.core.nms.v1_19_R3; - -import java.awt.Color; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Vector; -import java.util.concurrent.atomic.AtomicInteger; - -import com.mojang.datafixers.util.Pair; -import com.volmit.iris.core.nms.container.BiomeColor; -import com.volmit.iris.util.scheduling.J; -import net.minecraft.nbt.*; -import net.minecraft.nbt.Tag; -import net.minecraft.server.commands.data.BlockDataAccessor; -import net.minecraft.tags.TagKey; -import net.minecraft.world.level.LevelReader; -import net.minecraft.world.level.block.EntityBlock; -import org.bukkit.*; -import org.bukkit.block.Biome; -import org.bukkit.block.data.BlockData; -import org.bukkit.craftbukkit.v1_19_R3.CraftChunk; -import org.bukkit.craftbukkit.v1_19_R3.CraftServer; -import org.bukkit.craftbukkit.v1_19_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_19_R3.block.CraftBlock; -import org.bukkit.craftbukkit.v1_19_R3.block.CraftBlockState; -import org.bukkit.craftbukkit.v1_19_R3.block.CraftBlockStates; -import org.bukkit.craftbukkit.v1_19_R3.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_19_R3.entity.CraftDolphin; -import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftItemStack; -import org.bukkit.entity.Dolphin; -import org.bukkit.entity.Entity; -import org.bukkit.event.entity.CreatureSpawnEvent; -import org.bukkit.generator.ChunkGenerator; -import org.bukkit.inventory.ItemStack; -import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.NotNull; - -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import com.volmit.iris.Iris; -import com.volmit.iris.core.nms.INMSBinding; -import com.volmit.iris.engine.data.cache.AtomicCache; -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.hunk.Hunk; -import com.volmit.iris.util.json.JSONObject; -import com.volmit.iris.util.mantle.Mantle; -import com.volmit.iris.util.math.Vector3d; -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.*; -import com.volmit.iris.util.nbt.tag.CompoundTag; - -import it.unimi.dsi.fastutil.objects.Object2IntMap; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Holder; -import net.minecraft.core.Registry; -import net.minecraft.core.RegistryAccess; -import net.minecraft.core.registries.Registries; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.level.biome.BiomeSource; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkAccess; -import net.minecraft.world.level.chunk.ChunkStatus; -import net.minecraft.world.level.chunk.LevelChunk; -import sun.misc.Unsafe; - -public class NMSBinding implements INMSBinding { - private final KMap baseBiomeCache = new KMap<>(); - private final BlockData AIR = Material.AIR.createBlockData(); - private final AtomicCache> biomeMapCache = new AtomicCache<>(); - private final AtomicCache> registryCache = new AtomicCache<>(); - private final AtomicCache> globalCache = new AtomicCache<>(); - private final AtomicCache registryAccess = new AtomicCache<>(); - private final AtomicCache byIdRef = new AtomicCache<>(); - private Field biomeStorageCache = null; - - private static Object getFor(Class type, Object source) { - Object o = fieldFor(type, source); - - if (o != null) { - return o; - } - - return invokeFor(type, source); - } - - private static Object invokeFor(Class returns, Object in) { - for (Method i : in.getClass().getMethods()) { - if (i.getReturnType().equals(returns)) { - i.setAccessible(true); - try { - Iris.debug("[NMS] Found " + returns.getSimpleName() + " in " + in.getClass().getSimpleName() + "." + i.getName() + "()"); - return i.invoke(in); - } catch (Throwable e) { - e.printStackTrace(); - } - } - } - - return null; - } - - private static Object fieldFor(Class returns, Object in) { - return fieldForClass(returns, in.getClass(), in); - } - - @SuppressWarnings("unchecked") - private static T fieldForClass(Class returnType, Class sourceType, Object in) { - for (Field i : sourceType.getDeclaredFields()) { - if (i.getType().equals(returnType)) { - i.setAccessible(true); - try { - Iris.debug("[NMS] Found " + returnType.getSimpleName() + " in " + sourceType.getSimpleName() + "." + i.getName()); - return (T) i.get(in); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - } - } - return null; - } - - private static Class getClassType(Class type, int ordinal) { - return type.getDeclaredClasses()[ordinal]; - } - - @Override - public boolean hasTile(Material material) { - return !CraftBlockState.class.equals(CraftBlockStates.getBlockStateType(material)); - } - - @Override - public boolean hasTile(Location l) { - return ((CraftWorld) l.getWorld()).getHandle().getBlockEntity(new BlockPos(l.getBlockX(), l.getBlockY(), l.getBlockZ()), false) != null; - } - - @Override - @SuppressWarnings("unchecked") - public KMap serializeTile(Location location) { - BlockEntity e = ((CraftWorld) location.getWorld()).getHandle().getBlockEntity(new BlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ()), false); - - if (e == null) { - return null; - } - - net.minecraft.nbt.CompoundTag tag = e.saveWithoutMetadata(); - return (KMap) convertFromTag(tag, 0, 64); - } - - @Contract(value = "null, _, _ -> null", pure = true) - private Object convertFromTag(net.minecraft.nbt.Tag tag, int depth, int maxDepth) { - if (tag == null || depth > maxDepth) return null; - if (tag instanceof CollectionTag collection) { - KList list = new KList<>(); - - for (Object i : collection) { - if (i instanceof net.minecraft.nbt.Tag t) - list.add(convertFromTag(t, depth + 1, maxDepth)); - else list.add(i); - } - return list; - } - if (tag instanceof net.minecraft.nbt.CompoundTag compound) { - KMap map = new KMap<>(); - - for (String key : compound.getAllKeys()) { - var child = compound.get(key); - if (child == null) continue; - var value = convertFromTag(child, depth + 1, maxDepth); - if (value == null) continue; - map.put(key, value); - } - return map; - } - if (tag instanceof NumericTag numeric) - return numeric.getAsNumber(); - return tag.getAsString(); - } - - @Override - public void deserializeTile(KMap map, Location pos) { - net.minecraft.nbt.CompoundTag tag = (net.minecraft.nbt.CompoundTag) convertToTag(map, 0, 64); - var level = ((CraftWorld) pos.getWorld()).getHandle(); - var blockPos = new BlockPos(pos.getBlockX(), pos.getBlockY(), pos.getBlockZ()); - J.s(() -> merge(level, blockPos, tag)); - } - - private void merge(ServerLevel level, BlockPos blockPos, net.minecraft.nbt.CompoundTag tag) { - var blockEntity = level.getBlockEntity(blockPos); - if (blockEntity == null) { - Iris.warn("[NMS] BlockEntity not found at " + blockPos); - var state = level.getBlockState(blockPos); - if (!state.hasBlockEntity()) - return; - - blockEntity = ((EntityBlock) state.getBlock()) - .newBlockEntity(blockPos, state); - } - var accessor = new BlockDataAccessor(blockEntity, blockPos); - accessor.setData(tag.merge(accessor.getData())); - } - - private Tag convertToTag(Object object, int depth, int maxDepth) { - if (object == null || depth > maxDepth) return EndTag.INSTANCE; - if (object instanceof Map map) { - var tag = new net.minecraft.nbt.CompoundTag(); - for (var i : map.entrySet()) { - tag.put(i.getKey().toString(), convertToTag(i.getValue(), depth + 1, maxDepth)); - } - return tag; - } - if (object instanceof List list) { - var tag = new net.minecraft.nbt.ListTag(); - for (var i : list) { - tag.add(convertToTag(i, depth + 1, maxDepth)); - } - return tag; - } - if (object instanceof Byte number) return ByteTag.valueOf(number); - if (object instanceof Short number) return ShortTag.valueOf(number); - if (object instanceof Integer number) return IntTag.valueOf(number); - if (object instanceof Long number) return LongTag.valueOf(number); - if (object instanceof Float number) return FloatTag.valueOf(number); - if (object instanceof Double number) return DoubleTag.valueOf(number); - if (object instanceof String string) return StringTag.valueOf(string); - return EndTag.INSTANCE; - } - - @Override - public CompoundTag serializeEntity(Entity location) { - return null;// TODO: - } - - @Override - public Entity deserializeEntity(CompoundTag s, Location newPosition) { - return null;// TODO: - } - - @Override - public boolean supportsCustomHeight() { - return true; - } - - private RegistryAccess registry() { - return registryAccess.aquire(() -> (RegistryAccess) getFor(RegistryAccess.Frozen.class, ((CraftServer) Bukkit.getServer()).getHandle().getServer())); - } - - private Registry getCustomBiomeRegistry() { - return registry().registry(Registries.BIOME).orElse(null); - } - - private Registry getBlockRegistry() { - return registry().registry(Registries.BLOCK).orElse(null); - } - - @Override - public Object getBiomeBaseFromId(int id) { - return getCustomBiomeRegistry().getHolder(id); - } - - @Override - public int getMinHeight(World world) { - return world.getMinHeight(); - } - - @Override - public boolean supportsCustomBiomes() { - return true; - } - - @Override - public int getTrueBiomeBaseId(Object biomeBase) { - return getCustomBiomeRegistry().getId(((Holder) biomeBase).value()); - } - - @Override - public Object getTrueBiomeBase(Location location) { - return ((CraftWorld) location.getWorld()).getHandle().getBiome(new BlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ())); - } - - @Override - public String getTrueBiomeBaseKey(Location location) { - return getKeyForBiomeBase(getTrueBiomeBase(location)); - } - - @Override - public Object getCustomBiomeBaseFor(String mckey) { - return getCustomBiomeRegistry().get(new ResourceLocation(mckey)); - } - - @Override - public Object getCustomBiomeBaseHolderFor(String mckey) { - return getCustomBiomeRegistry().getHolder(getTrueBiomeBaseId(getCustomBiomeRegistry().get(new ResourceLocation(mckey)))).get(); - } - - public int getBiomeBaseIdForKey(String key) { - return getCustomBiomeRegistry().getId(getCustomBiomeRegistry().get(new ResourceLocation(key))); - } - - @Override - public String getKeyForBiomeBase(Object biomeBase) { - return getCustomBiomeRegistry().getKey((net.minecraft.world.level.biome.Biome) biomeBase).getPath(); // something, not something:something - } - - @Override - public Object getBiomeBase(World world, Biome biome) { - return CraftBlock.biomeToBiomeBase(((CraftWorld) world).getHandle() - .registryAccess().registry(Registries.BIOME).orElse(null), biome); - } - - @Override - public Object getBiomeBase(Object registry, Biome biome) { - Object v = baseBiomeCache.get(biome); - - if (v != null) { - return v; - } - //noinspection unchecked - v = CraftBlock.biomeToBiomeBase((Registry) registry, biome); - if (v == null) { - // Ok so there is this new biome name called "CUSTOM" in Paper's new releases. - // But, this does NOT exist within CraftBukkit which makes it return an error. - // So, we will just return the ID that the plains biome returns instead. - //noinspection unchecked - return CraftBlock.biomeToBiomeBase((Registry) registry, Biome.PLAINS); - } - baseBiomeCache.put(biome, v); - return v; - } - - - @Override - public KList getBiomes() { - return new KList<>(Biome.values()).qdel(Biome.CHERRY_GROVE).qdel(Biome.CUSTOM); - } - - @Override - public boolean isBukkit() { - return true; - } - - @Override - public int getBiomeId(Biome biome) { - for (World i : Bukkit.getWorlds()) { - if (i.getEnvironment().equals(World.Environment.NORMAL)) { - Registry registry = ((CraftWorld) i).getHandle().registryAccess().registry(Registries.BIOME).orElse(null); - return registry.getId((net.minecraft.world.level.biome.Biome) getBiomeBase(registry, biome)); - } - } - - return biome.ordinal(); - } - - private MCAIdMap getBiomeMapping() { - return biomeMapCache.aquire(() -> new MCAIdMap<>() { - @NotNull - @Override - public Iterator iterator() { - return getCustomBiomeRegistry().iterator(); - } - - @Override - public int getId(net.minecraft.world.level.biome.Biome paramT) { - return getCustomBiomeRegistry().getId(paramT); - } - - @Override - public net.minecraft.world.level.biome.Biome byId(int paramInt) { - return (net.minecraft.world.level.biome.Biome) getBiomeBaseFromId(paramInt); - } - }); - } - - @NotNull - private MCABiomeContainer getBiomeContainerInterface(MCAIdMap biomeMapping, MCAChunkBiomeContainer base) { - return new MCABiomeContainer() { - @Override - public int[] getData() { - return base.writeBiomes(); - } - - @Override - public void setBiome(int x, int y, int z, int id) { - base.setBiome(x, y, z, biomeMapping.byId(id)); - } - - @Override - public int getBiome(int x, int y, int z) { - return biomeMapping.getId(base.getBiome(x, y, z)); - } - }; - } - - @Override - public MCABiomeContainer newBiomeContainer(int min, int max) { - MCAChunkBiomeContainer base = new MCAChunkBiomeContainer<>(getBiomeMapping(), min, max); - return getBiomeContainerInterface(getBiomeMapping(), base); - } - - @Override - public MCABiomeContainer newBiomeContainer(int min, int max, int[] data) { - MCAChunkBiomeContainer base = new MCAChunkBiomeContainer<>(getBiomeMapping(), min, max, data); - return getBiomeContainerInterface(getBiomeMapping(), base); - } - - @Override - public int countCustomBiomes() { - AtomicInteger a = new AtomicInteger(0); - - getCustomBiomeRegistry().keySet().forEach((i) -> { - if (i.getNamespace().equals("minecraft")) { - return; - } - - a.incrementAndGet(); - Iris.debug("Custom Biome: " + i); - }); - - return a.get(); - } - - public boolean supportsDataPacks() { - return true; - } - - public void setBiomes(int cx, int cz, World world, Hunk biomes) { - LevelChunk c = ((CraftWorld) world).getHandle().getChunk(cx, cz); - biomes.iterateSync((x, y, z, b) -> c.setBiome(x, y, z, (Holder) b)); - c.setUnsaved(true); - } - - @Override - public void forceBiomeInto(int x, int y, int z, Object somethingVeryDirty, ChunkGenerator.BiomeGrid chunk) { - try { - ChunkAccess s = (ChunkAccess) getFieldForBiomeStorage(chunk).get(chunk); - Holder biome = (Holder) somethingVeryDirty; - s.setBiome(x, y, z, biome); - } catch (IllegalAccessException e) { - Iris.reportError(e); - e.printStackTrace(); - } - } - - private Field getFieldForBiomeStorage(Object storage) { - Field f = biomeStorageCache; - - if (f != null) { - return f; - } - try { - f = storage.getClass().getDeclaredField("biome"); - f.setAccessible(true); - return f; - } catch (Throwable e) { - Iris.reportError(e); - e.printStackTrace(); - Iris.error(storage.getClass().getCanonicalName()); - } - - biomeStorageCache = f; - return null; - } - - @Override - public MCAPaletteAccess createPalette() { - MCAIdMapper registry = registryCache.aquireNasty(() -> { - Field cf = net.minecraft.core.IdMapper.class.getDeclaredField("tToId"); - Field df = net.minecraft.core.IdMapper.class.getDeclaredField("idToT"); - Field bf = net.minecraft.core.IdMapper.class.getDeclaredField("nextId"); - cf.setAccessible(true); - df.setAccessible(true); - bf.setAccessible(true); - net.minecraft.core.IdMapper blockData = Block.BLOCK_STATE_REGISTRY; - int b = bf.getInt(blockData); - Object2IntMap c = (Object2IntMap) cf.get(blockData); - List d = (List) df.get(blockData); - return new MCAIdMapper(c, d, b); - }); - MCAPalette global = globalCache.aquireNasty(() -> new MCAGlobalPalette<>(registry, ((CraftBlockData) AIR).getState())); - MCAPalettedContainer container = new MCAPalettedContainer<>(global, registry, - i -> ((CraftBlockData) NBTWorld.getBlockData(i)).getState(), - i -> NBTWorld.getCompound(CraftBlockData.fromData(i)), - ((CraftBlockData) AIR).getState()); - return new MCAWrappedPalettedContainer<>(container, - i -> NBTWorld.getCompound(CraftBlockData.fromData(i)), - i -> ((CraftBlockData) NBTWorld.getBlockData(i)).getState()); - } - - @Override - public void injectBiomesFromMantle(Chunk e, Mantle mantle) { - ChunkAccess chunk = ((CraftChunk) e).getHandle(ChunkStatus.FULL); - AtomicInteger c = new AtomicInteger(); - AtomicInteger r = new AtomicInteger(); - mantle.iterateChunk(e.getX(), e.getZ(), MatterBiomeInject.class, (x, y, z, b) -> { - if (b != null) { - if (b.isCustom()) { - chunk.setBiome(x, y, z, getCustomBiomeRegistry().getHolder(b.getBiomeId()).get()); - c.getAndIncrement(); - } else { - chunk.setBiome(x, y, z, (Holder) getBiomeBase(e.getWorld(), b.getBiome())); - r.getAndIncrement(); - } - } - }); - } - - public ItemStack applyCustomNbt(ItemStack itemStack, KMap customNbt) throws IllegalArgumentException { - if (customNbt != null && !customNbt.isEmpty()) { - net.minecraft.world.item.ItemStack s = CraftItemStack.asNMSCopy(itemStack); - - try { - net.minecraft.nbt.CompoundTag tag = TagParser.parseTag((new JSONObject(customNbt)).toString()); - tag.merge(s.getOrCreateTag()); - s.setTag(tag); - } catch (CommandSyntaxException var5) { - throw new IllegalArgumentException(var5); - } - - return CraftItemStack.asBukkitCopy(s); - } else { - return itemStack; - } - } - - public void setTreasurePos(Dolphin dolphin, com.volmit.iris.core.nms.container.BlockPos pos) { - CraftDolphin cd = (CraftDolphin)dolphin; - cd.getHandle().setTreasurePos(new BlockPos(pos.getX(), pos.getY(), pos.getZ())); - cd.getHandle().setGotFish(true); - } - - public void inject(long seed, Engine engine, World world) { - var chunkMap = ((CraftWorld)world).getHandle().getChunkSource().chunkMap; - chunkMap.generator = new IrisChunkGenerator(chunkMap.generator, seed, engine, world); - } - - public Vector3d getBoundingbox(org.bukkit.entity.EntityType entity) { - Field[] fields = EntityType.class.getDeclaredFields(); - for (Field field : fields) { - if (Modifier.isStatic(field.getModifiers()) && field.getType().equals(EntityType.class)) { - try { - EntityType entityType = (EntityType) field.get(null); - if (entityType.getDescriptionId().equals("entity.minecraft." + entity.name().toLowerCase())) { - Vector v1 = new Vector<>(); - v1.add(entityType.getHeight()); - entityType.getDimensions(); - Vector3d box = new Vector3d( entityType.getWidth(), entityType.getHeight(), entityType.getWidth()); - //System.out.println("Entity Type: " + entityType.getDescriptionId() + ", " + "Height: " + height + ", Width: " + width); - return box; - } - } catch (IllegalAccessException e) { - Iris.error("Unable to get entity dimensions!"); - e.printStackTrace(); - } - } - } - return null; - } - - @Override - public Entity spawnEntity(Location location, org.bukkit.entity.EntityType type, CreatureSpawnEvent.SpawnReason reason) { - if (type == org.bukkit.entity.EntityType.CAMEL) { - return null; - } - return ((CraftWorld) location.getWorld()).spawn(location, type.getEntityClass(), null, reason); - } - - @Override - public Color getBiomeColor(Location location, BiomeColor type) { - LevelReader reader = ((CraftWorld) location.getWorld()).getHandle(); - var holder = reader.getBiome(new BlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ())); - var biome = holder.value(); - if (biome == null) throw new IllegalArgumentException("Invalid biome: " + holder.unwrapKey().orElse(null)); - - int rgba = switch (type) { - case FOG -> biome.getFogColor(); - case WATER -> biome.getWaterColor(); - case WATER_FOG -> biome.getWaterFogColor(); - case SKY -> biome.getSkyColor(); - case FOLIAGE -> biome.getFoliageColor(); - case GRASS -> biome.getGrassColor(location.getBlockX(), location.getBlockZ()); - }; - if (rgba == 0) { - if (BiomeColor.FOLIAGE == type && biome.getSpecialEffects().getFoliageColorOverride().isEmpty()) - return null; - if (BiomeColor.GRASS == type && biome.getSpecialEffects().getGrassColorOverride().isEmpty()) - return null; - } - return new Color(rgba, true); - } - - @Override - public KList getStructureKeys() { - KList keys = new KList<>(); - - var registry = registry().registry(Registries.STRUCTURE).orElse(null); - if (registry == null) return keys; - registry.keySet().stream().map(ResourceLocation::toString).forEach(keys::add); - registry.getTags() - .map(Pair::getFirst) - .map(TagKey::location) - .map(ResourceLocation::toString) - .map(s -> "#" + s) - .forEach(keys::add); - - return keys; - } - - private static Field getField(Class clazz, Class fieldType) throws NoSuchFieldException { - try { - for (Field f : clazz.getDeclaredFields()) { - if (f.getType().equals(fieldType)) - return f; - } - throw new NoSuchFieldException(fieldType.getName()); - } catch (NoSuchFieldException var4) { - Class superClass = clazz.getSuperclass(); - if (superClass == null) { - throw var4; - } else { - return getField(superClass, fieldType); - } - } - } -} diff --git a/settings.gradle b/settings.gradle index 7371bdae6..57ad35b97 100644 --- a/settings.gradle +++ b/settings.gradle @@ -37,7 +37,4 @@ include( ':nms:v1_20_R3', ':nms:v1_20_R2', ':nms:v1_20_R1', - ':nms:v1_19_R3', - ':nms:v1_19_R2', - ':nms:v1_19_R1' ) \ No newline at end of file