Recreated old reset tags method

This commit is contained in:
OakLoaf 2024-11-01 13:36:41 +00:00
parent a385a43250
commit 153f6e5a87
2 changed files with 29 additions and 3 deletions

View File

@ -20,6 +20,7 @@ import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import com.dfsek.terra.bukkit.world.BukkitPlatformBiome; import com.dfsek.terra.bukkit.world.BukkitPlatformBiome;
import com.dfsek.terra.registry.master.ConfigRegistry; import com.dfsek.terra.registry.master.ConfigRegistry;
@ -35,8 +36,10 @@ public class AwfulBukkitHacks {
LOGGER.info("Hacking biome registry..."); LOGGER.info("Hacking biome registry...");
MappedRegistry<Biome> biomeRegistry = (MappedRegistry<Biome>) RegistryFetcher.biomeRegistry(); MappedRegistry<Biome> biomeRegistry = (MappedRegistry<Biome>) RegistryFetcher.biomeRegistry();
// Unfreeze the biome registry to allow modification
Reflection.MAPPED_REGISTRY.setFrozen(biomeRegistry, false); 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) -> { configRegistry.forEach(pack -> pack.getRegistry(com.dfsek.terra.api.world.biome.Biome.class).forEach((key, biome) -> {
try { try {
BukkitPlatformBiome platformBiome = (BukkitPlatformBiome) biome.getPlatformBiome(); 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...."); LOGGER.info("Doing tag garbage....");
Map<TagKey<Biome>, List<Holder<Biome>>> collect = biomeRegistry Map<TagKey<Biome>, List<Holder<Biome>>> collect = biomeRegistry
.getTags() // streamKeysAndEntries .getTags() // streamKeysAndEntries
@ -92,14 +97,17 @@ public class AwfulBukkitHacks {
() -> LOGGER.error("No such biome: {}", tb))), () -> LOGGER.error("No such biome: {}", tb))),
() -> LOGGER.error("No vanilla biome: {}", vb))); () -> LOGGER.error("No vanilla biome: {}", vb)));
biomeRegistry.bindAllTagsToEmpty(); resetTags(biomeRegistry);
ImmutableMap.copyOf(collect).forEach(biomeRegistry::bindTag); ImmutableMap.copyOf(collect).forEach(biomeRegistry::bindTag);
Reflection.MAPPED_REGISTRY.setFrozen(biomeRegistry, true); // freeze registry again :)
} catch(SecurityException | IllegalArgumentException exception) { } catch(SecurityException | IllegalArgumentException exception) {
throw new RuntimeException(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()));
}
} }

View File

@ -4,7 +4,9 @@ import net.minecraft.core.Holder;
import net.minecraft.core.Holder.Reference; import net.minecraft.core.Holder.Reference;
import net.minecraft.core.HolderSet; import net.minecraft.core.HolderSet;
import net.minecraft.core.MappedRegistry; import net.minecraft.core.MappedRegistry;
import net.minecraft.resources.ResourceKey;
import net.minecraft.server.level.ChunkMap; import net.minecraft.server.level.ChunkMap;
import net.minecraft.tags.TagKey;
import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.level.StructureManager; import net.minecraft.world.level.StructureManager;
import net.minecraft.world.level.biome.Biome; 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.MethodName;
import xyz.jpenilla.reflectionremapper.proxy.annotation.Proxies; import xyz.jpenilla.reflectionremapper.proxy.annotation.Proxies;
import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Map;
public class Reflection { public class Reflection {
@ -27,6 +31,7 @@ public class Reflection {
public static final ChunkMapProxy CHUNKMAP; public static final ChunkMapProxy CHUNKMAP;
public static final HolderReferenceProxy HOLDER_REFERENCE;
public static final HolderSetNamedProxy HOLDER_SET; public static final HolderSetNamedProxy HOLDER_SET;
public static final BiomeProxy BIOME; public static final BiomeProxy BIOME;
@ -39,6 +44,7 @@ public class Reflection {
STRUCTURE_MANAGER = reflectionProxyFactory.reflectionProxy(StructureManagerProxy.class); STRUCTURE_MANAGER = reflectionProxyFactory.reflectionProxy(StructureManagerProxy.class);
REFERENCE = reflectionProxyFactory.reflectionProxy(ReferenceProxy.class); REFERENCE = reflectionProxyFactory.reflectionProxy(ReferenceProxy.class);
CHUNKMAP = reflectionProxyFactory.reflectionProxy(ChunkMapProxy.class); CHUNKMAP = reflectionProxyFactory.reflectionProxy(ChunkMapProxy.class);
HOLDER_REFERENCE = reflectionProxyFactory.reflectionProxy(HolderReferenceProxy.class);
HOLDER_SET = reflectionProxyFactory.reflectionProxy(HolderSetNamedProxy.class); HOLDER_SET = reflectionProxyFactory.reflectionProxy(HolderSetNamedProxy.class);
BIOME = reflectionProxyFactory.reflectionProxy(BiomeProxy.class); BIOME = reflectionProxyFactory.reflectionProxy(BiomeProxy.class);
} }
@ -46,6 +52,9 @@ public class Reflection {
@Proxies(MappedRegistry.class) @Proxies(MappedRegistry.class)
public interface MappedRegistryProxy { public interface MappedRegistryProxy {
@FieldGetter("byKey")
<T> Map<ResourceKey<T>, Reference<T>> getByKey(MappedRegistry<T> instance);
@FieldSetter("frozen") @FieldSetter("frozen")
void setFrozen(MappedRegistry<?> instance, boolean frozen); void setFrozen(MappedRegistry<?> instance, boolean frozen);
} }
@ -73,8 +82,17 @@ public class Reflection {
void setWorldGenContext(ChunkMap instance, WorldGenContext worldGenContext); void setWorldGenContext(ChunkMap instance, WorldGenContext worldGenContext);
} }
@Proxies(Holder.Reference.class)
public interface HolderReferenceProxy {
@MethodName("bindTags")
<T> void invokeBindTags(Holder.Reference<T> instance, Collection<TagKey<T>> tags);
}
@Proxies(HolderSet.Named.class) @Proxies(HolderSet.Named.class)
public interface HolderSetNamedProxy { public interface HolderSetNamedProxy {
@MethodName("bind")
<T> void invokeBind(HolderSet.Named<T> instance, List<Holder<T>> entries);
@MethodName("contents") @MethodName("contents")
<T> List<Holder<T>> invokeContents(HolderSet.Named<T> instance); <T> List<Holder<T>> invokeContents(HolderSet.Named<T> instance);
} }