diff --git a/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/AwfulBukkitHacks.java b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/AwfulBukkitHacks.java index 813d1768b..676c404eb 100644 --- a/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/AwfulBukkitHacks.java +++ b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/AwfulBukkitHacks.java @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import com.dfsek.terra.bukkit.world.BukkitPlatformBiome; import com.dfsek.terra.registry.master.ConfigRegistry; @@ -35,8 +36,10 @@ public class AwfulBukkitHacks { LOGGER.info("Hacking biome registry..."); MappedRegistry biomeRegistry = (MappedRegistry) RegistryFetcher.biomeRegistry(); + // Unfreeze the biome registry to allow modification Reflection.MAPPED_REGISTRY.setFrozen(biomeRegistry, false); + // Register the terra biomes to the registry configRegistry.forEach(pack -> pack.getRegistry(com.dfsek.terra.api.world.biome.Biome.class).forEach((key, biome) -> { try { BukkitPlatformBiome platformBiome = (BukkitPlatformBiome) biome.getPlatformBiome(); @@ -66,6 +69,8 @@ public class AwfulBukkitHacks { } })); + Reflection.MAPPED_REGISTRY.setFrozen(biomeRegistry, true); // freeze registry again :) + LOGGER.info("Doing tag garbage...."); Map, List>> collect = biomeRegistry .getTags() // streamKeysAndEntries @@ -92,14 +97,17 @@ public class AwfulBukkitHacks { () -> LOGGER.error("No such biome: {}", tb))), () -> LOGGER.error("No vanilla biome: {}", vb))); - biomeRegistry.bindAllTagsToEmpty(); + resetTags(biomeRegistry); ImmutableMap.copyOf(collect).forEach(biomeRegistry::bindTag); - Reflection.MAPPED_REGISTRY.setFrozen(biomeRegistry, true); // freeze registry again :) - } catch(SecurityException | IllegalArgumentException exception) { throw new RuntimeException(exception); } } + + private static void resetTags(MappedRegistry registry) { + registry.getTags().forEach(entryList -> Reflection.HOLDER_SET.invokeBind(entryList, List.of())); + Reflection.MAPPED_REGISTRY.getByKey(registry).values().forEach(entry -> Reflection.HOLDER_REFERENCE.invokeBindTags(entry, Set.of())); + } } diff --git a/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/Reflection.java b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/Reflection.java index 2da0011fd..044fb479f 100644 --- a/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/Reflection.java +++ b/platforms/bukkit/nms/v1_21_3/src/main/java/com/dfsek/terra/bukkit/nms/v1_21_3/Reflection.java @@ -4,7 +4,9 @@ import net.minecraft.core.Holder; import net.minecraft.core.Holder.Reference; import net.minecraft.core.HolderSet; import net.minecraft.core.MappedRegistry; +import net.minecraft.resources.ResourceKey; import net.minecraft.server.level.ChunkMap; +import net.minecraft.tags.TagKey; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.StructureManager; import net.minecraft.world.level.biome.Biome; @@ -16,7 +18,9 @@ import xyz.jpenilla.reflectionremapper.proxy.annotation.FieldSetter; import xyz.jpenilla.reflectionremapper.proxy.annotation.MethodName; import xyz.jpenilla.reflectionremapper.proxy.annotation.Proxies; +import java.util.Collection; import java.util.List; +import java.util.Map; public class Reflection { @@ -27,6 +31,7 @@ public class Reflection { public static final ChunkMapProxy CHUNKMAP; + public static final HolderReferenceProxy HOLDER_REFERENCE; public static final HolderSetNamedProxy HOLDER_SET; public static final BiomeProxy BIOME; @@ -39,6 +44,7 @@ public class Reflection { STRUCTURE_MANAGER = reflectionProxyFactory.reflectionProxy(StructureManagerProxy.class); REFERENCE = reflectionProxyFactory.reflectionProxy(ReferenceProxy.class); CHUNKMAP = reflectionProxyFactory.reflectionProxy(ChunkMapProxy.class); + HOLDER_REFERENCE = reflectionProxyFactory.reflectionProxy(HolderReferenceProxy.class); HOLDER_SET = reflectionProxyFactory.reflectionProxy(HolderSetNamedProxy.class); BIOME = reflectionProxyFactory.reflectionProxy(BiomeProxy.class); } @@ -46,6 +52,9 @@ public class Reflection { @Proxies(MappedRegistry.class) public interface MappedRegistryProxy { + @FieldGetter("byKey") + Map, Reference> getByKey(MappedRegistry instance); + @FieldSetter("frozen") void setFrozen(MappedRegistry instance, boolean frozen); } @@ -73,8 +82,17 @@ public class Reflection { void setWorldGenContext(ChunkMap instance, WorldGenContext worldGenContext); } + @Proxies(Holder.Reference.class) + public interface HolderReferenceProxy { + @MethodName("bindTags") + void invokeBindTags(Holder.Reference instance, Collection> tags); + } + @Proxies(HolderSet.Named.class) public interface HolderSetNamedProxy { + @MethodName("bind") + void invokeBind(HolderSet.Named instance, List> entries); + @MethodName("contents") List> invokeContents(HolderSet.Named instance); }