register some tags

This commit is contained in:
dfsek 2022-04-04 17:37:43 -07:00
parent b4d34589d8
commit 0b49bf4dc9
5 changed files with 42 additions and 41 deletions

View File

@ -59,20 +59,6 @@ public final class FabricAddon implements BaseAddon {
.priority(100) .priority(100)
.global(); .global();
terraFabricPlugin.getEventManager()
.getHandler(FunctionalEventHandler.class)
.register(this, BiomeRegistrationEvent.class)
.then(event -> {
logger.info("Registering biomes...");
terraFabricPlugin.getConfigRegistry().forEach(pack -> { // Register all Terra biomes.
pack.getCheckedRegistry(Biome.class)
.forEach((id, biome) -> FabricUtil.registerBiome(biome, pack, event.getRegistryManager(), id));
});
logger.info("Biomes registered.");
})
.global();
terraFabricPlugin.getEventManager() terraFabricPlugin.getEventManager()
.getHandler(FunctionalEventHandler.class) .getHandler(FunctionalEventHandler.class)
.register(this, ConfigurationLoadEvent.class) .register(this, ConfigurationLoadEvent.class)

View File

@ -1,6 +1,7 @@
package com.dfsek.terra.fabric.mixin.lifecycle; package com.dfsek.terra.fabric.mixin.lifecycle;
import com.dfsek.terra.fabric.util.FabricUtil; import com.dfsek.terra.fabric.FabricEntryPoint;
import com.dfsek.terra.fabric.event.BiomeRegistrationEvent;
import net.minecraft.server.DataPackContents; import net.minecraft.server.DataPackContents;
import net.minecraft.util.registry.DynamicRegistryManager; import net.minecraft.util.registry.DynamicRegistryManager;
@ -13,6 +14,8 @@ import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import com.dfsek.terra.fabric.util.FabricUtil;
@Mixin(DataPackContents.class) @Mixin(DataPackContents.class)
public class DataPackContentsMixin { public class DataPackContentsMixin {
@ -22,7 +25,6 @@ public class DataPackContentsMixin {
@Inject(method = "refresh(Lnet/minecraft/util/registry/DynamicRegistryManager;)V", at = @At("RETURN")) @Inject(method = "refresh(Lnet/minecraft/util/registry/DynamicRegistryManager;)V", at = @At("RETURN"))
private void injectReload(DynamicRegistryManager dynamicRegistryManager, CallbackInfo ci) { private void injectReload(DynamicRegistryManager dynamicRegistryManager, CallbackInfo ci) {
LOGGER.info("Doing tag garbage....");
FabricUtil.registerTags(dynamicRegistryManager.get(Registry.BIOME_KEY)); FabricUtil.registerTags(dynamicRegistryManager.get(Registry.BIOME_KEY));
} }
} }

View File

@ -17,12 +17,15 @@
package com.dfsek.terra.fabric.mixin.lifecycle.client; package com.dfsek.terra.fabric.mixin.lifecycle.client;
import com.dfsek.terra.fabric.util.FabricUtil;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.RunArgs; import net.minecraft.client.RunArgs;
import net.minecraft.client.world.GeneratorType; import net.minecraft.client.world.GeneratorType;
import net.minecraft.text.LiteralText; import net.minecraft.text.LiteralText;
import net.minecraft.util.registry.DynamicRegistryManager; import net.minecraft.util.registry.DynamicRegistryManager;
import net.minecraft.util.registry.DynamicRegistryManager.Mutable; import net.minecraft.util.registry.DynamicRegistryManager.Mutable;
import net.minecraft.util.registry.Registry;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
@ -34,7 +37,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent; import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent;
import com.dfsek.terra.fabric.FabricEntryPoint; import com.dfsek.terra.fabric.FabricEntryPoint;
import com.dfsek.terra.fabric.event.BiomeRegistrationEvent;
import com.dfsek.terra.fabric.generation.TerraGeneratorType; import com.dfsek.terra.fabric.generation.TerraGeneratorType;
import com.dfsek.terra.fabric.mixin.access.GeneratorTypeAccessor; import com.dfsek.terra.fabric.mixin.access.GeneratorTypeAccessor;
@ -54,7 +56,7 @@ public class MinecraftClientMixin {
private static Mutable injectBiomes() { private static Mutable injectBiomes() {
Mutable mutable = DynamicRegistryManager.createAndLoad(); Mutable mutable = DynamicRegistryManager.createAndLoad();
LOGGER.info("Injecting Terra biomes..."); LOGGER.info("Injecting Terra biomes...");
FabricEntryPoint.getPlatform().getEventManager().callEvent(new BiomeRegistrationEvent(mutable)); FabricUtil.registerBiomes(mutable.get(Registry.BIOME_KEY));
return mutable; return mutable;
} }

View File

@ -17,9 +17,12 @@
package com.dfsek.terra.fabric.mixin.lifecycle.server; package com.dfsek.terra.fabric.mixin.lifecycle.server;
import com.dfsek.terra.fabric.util.FabricUtil;
import net.minecraft.server.Main; import net.minecraft.server.Main;
import net.minecraft.util.registry.DynamicRegistryManager; import net.minecraft.util.registry.DynamicRegistryManager;
import net.minecraft.util.registry.DynamicRegistryManager.Mutable; import net.minecraft.util.registry.DynamicRegistryManager.Mutable;
import net.minecraft.util.registry.Registry;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
@ -31,7 +34,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent; import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent;
import com.dfsek.terra.fabric.FabricEntryPoint; import com.dfsek.terra.fabric.FabricEntryPoint;
import com.dfsek.terra.fabric.event.BiomeRegistrationEvent;
@Mixin(Main.class) @Mixin(Main.class)
@ -60,7 +62,7 @@ public class ServerMainMixin {
private static Mutable injectBiomes() { private static Mutable injectBiomes() {
Mutable mutable = DynamicRegistryManager.createAndLoad(); Mutable mutable = DynamicRegistryManager.createAndLoad();
LOGGER.info("Injecting Terra biomes..."); LOGGER.info("Injecting Terra biomes...");
FabricEntryPoint.getPlatform().getEventManager().callEvent(new BiomeRegistrationEvent(mutable)); FabricUtil.registerBiomes(mutable.get(Registry.BIOME_KEY));
return mutable; return mutable;
} }
} }

View File

@ -17,28 +17,29 @@
package com.dfsek.terra.fabric.util; package com.dfsek.terra.fabric.util;
import com.google.common.collect.ImmutableMap;
import net.minecraft.block.entity.LootableContainerBlockEntity; import net.minecraft.block.entity.LootableContainerBlockEntity;
import net.minecraft.block.entity.MobSpawnerBlockEntity; import net.minecraft.block.entity.MobSpawnerBlockEntity;
import net.minecraft.block.entity.SignBlockEntity; import net.minecraft.block.entity.SignBlockEntity;
import net.minecraft.tag.TagKey; import net.minecraft.tag.TagKey;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.registry.DynamicRegistryManager;
import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.Registry;
import net.minecraft.util.registry.RegistryEntry; import net.minecraft.util.registry.RegistryEntry;
import net.minecraft.util.registry.RegistryEntryList.Named;
import net.minecraft.world.WorldAccess; import net.minecraft.world.WorldAccess;
import net.minecraft.world.biome.Biome.Builder; import net.minecraft.world.biome.Biome.Builder;
import net.minecraft.world.biome.BiomeEffects; import net.minecraft.world.biome.BiomeEffects;
import net.minecraft.world.biome.GenerationSettings; import net.minecraft.world.biome.GenerationSettings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Stream;
import com.dfsek.terra.api.block.entity.BlockEntity; import com.dfsek.terra.api.block.entity.BlockEntity;
import com.dfsek.terra.api.block.entity.Container; import com.dfsek.terra.api.block.entity.Container;
@ -46,17 +47,29 @@ import com.dfsek.terra.api.block.entity.MobSpawner;
import com.dfsek.terra.api.block.entity.Sign; import com.dfsek.terra.api.block.entity.Sign;
import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.config.ConfigPack;
import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.fabric.FabricEntryPoint;
import com.dfsek.terra.fabric.config.PreLoadCompatibilityOptions; import com.dfsek.terra.fabric.config.PreLoadCompatibilityOptions;
import com.dfsek.terra.fabric.config.VanillaBiomeProperties; import com.dfsek.terra.fabric.config.VanillaBiomeProperties;
import com.dfsek.terra.fabric.mixin.access.BiomeEffectsAccessor; import com.dfsek.terra.fabric.mixin.access.BiomeEffectsAccessor;
public final class FabricUtil { public final class FabricUtil {
private static final Logger logger = LoggerFactory.getLogger(FabricUtil.class);
public static String createBiomeID(ConfigPack pack, com.dfsek.terra.api.registry.key.RegistryKey biomeID) { public static String createBiomeID(ConfigPack pack, com.dfsek.terra.api.registry.key.RegistryKey biomeID) {
return pack.getID() return pack.getID()
.toLowerCase() + "/" + biomeID.getNamespace().toLowerCase(Locale.ROOT) + "/" + biomeID.getID().toLowerCase(Locale.ROOT); .toLowerCase() + "/" + biomeID.getNamespace().toLowerCase(Locale.ROOT) + "/" + biomeID.getID().toLowerCase(Locale.ROOT);
} }
public static void registerBiomes(Registry<net.minecraft.world.biome.Biome> biomeRegistry) {
logger.info("Registering biomes...");
FabricEntryPoint.getPlatform().getConfigRegistry().forEach(pack -> { // Register all Terra biomes.
pack.getCheckedRegistry(Biome.class)
.forEach((id, biome) -> registerBiome(biome, pack, biomeRegistry, id));
});
logger.info("Biomes registered.");
}
private static final Map<RegistryEntry<net.minecraft.world.biome.Biome>, RegistryEntry<net.minecraft.world.biome.Biome>> private static final Map<RegistryEntry<net.minecraft.world.biome.Biome>, RegistryEntry<net.minecraft.world.biome.Biome>>
TERRA_BIOME_MAP = new HashMap<>(); TERRA_BIOME_MAP = new HashMap<>();
private static final Map<Biome, RegistryEntry<net.minecraft.world.biome.Biome>> BIOME_MAP = new HashMap<>(); private static final Map<Biome, RegistryEntry<net.minecraft.world.biome.Biome>> BIOME_MAP = new HashMap<>();
@ -67,9 +80,8 @@ public final class FabricUtil {
* @param biome The Terra BiomeBuilder. * @param biome The Terra BiomeBuilder.
* @param pack The ConfigPack this biome belongs to. * @param pack The ConfigPack this biome belongs to.
*/ */
public static void registerBiome(Biome biome, ConfigPack pack, DynamicRegistryManager registryManager, public static void registerBiome(Biome biome, ConfigPack pack, Registry<net.minecraft.world.biome.Biome> registry,
com.dfsek.terra.api.registry.key.RegistryKey id) { com.dfsek.terra.api.registry.key.RegistryKey id) {
Registry<net.minecraft.world.biome.Biome> registry = registryManager.get(Registry.BIOME_KEY);
RegistryEntry<net.minecraft.world.biome.Biome> vanilla = ((ProtoPlatformBiome) biome.getPlatformBiome()).get(registry); RegistryEntry<net.minecraft.world.biome.Biome> vanilla = ((ProtoPlatformBiome) biome.getPlatformBiome()).get(registry);
@ -97,29 +109,26 @@ public final class FabricUtil {
return BIOME_MAP.get(biome); return BIOME_MAP.get(biome);
} }
private static Stream<RegistryEntry<net.minecraft.world.biome.Biome>> getMatchingBiome(Named<net.minecraft.world.biome.Biome> named) {
return TERRA_BIOME_MAP.keySet()
.stream()
.filter(named::contains)
.map(TERRA_BIOME_MAP::get);
}
public static void registerTags(Registry<net.minecraft.world.biome.Biome> registry) { public static void registerTags(Registry<net.minecraft.world.biome.Biome> registry) {
logger.info("Doing tag garbage....");
Map<TagKey<net.minecraft.world.biome.Biome>, List<RegistryEntry<net.minecraft.world.biome.Biome>>> collect = registry Map<TagKey<net.minecraft.world.biome.Biome>, List<RegistryEntry<net.minecraft.world.biome.Biome>>> collect = registry
.streamTagsAndEntries() .streamTagsAndEntries()
.peek(System.out::println)
.collect(HashMap::new, .collect(HashMap::new,
(map, pair) -> (map, pair) ->
map.put(pair.getFirst(), map.put(pair.getFirst(), new ArrayList<>(pair.getSecond().stream().toList())),
Stream.concat(pair.getSecond().stream(), getMatchingBiome(pair.getSecond())).toList()),
HashMap::putAll); HashMap::putAll);
registry.clearTags();
registry.populateTags(collect);
System.out.println(registry.streamEntries() TERRA_BIOME_MAP.forEach((vanilla, terra) -> getEntry(registry, vanilla.getKey().orElseThrow().getValue()).orElseThrow()
.streamTags()
.forEach(tag -> collect.computeIfAbsent(tag, t -> new ArrayList<>()).add(getEntry(registry, terra.getKey().orElseThrow().getValue()).orElseThrow())));
registry.clearTags();
registry.populateTags(ImmutableMap.copyOf(collect));
registry.streamEntries()
.map(e -> e.registryKey().getValue() + ": " + .map(e -> e.registryKey().getValue() + ": " +
e.streamTags().reduce("", (s, t) -> s + ", " + t, String::concat)) e.streamTags().reduce("", (s, t) -> t.id() + ", " + s, String::concat))
.reduce("", (s, s2) -> s + "\n" + s2)); .forEach(logger::info);
} }
public static net.minecraft.world.biome.Biome createBiome(Biome biome, net.minecraft.world.biome.Biome vanilla) { public static net.minecraft.world.biome.Biome createBiome(Biome biome, net.minecraft.world.biome.Biome vanilla) {