register structures to Terra biomes

This commit is contained in:
dfsek
2021-12-05 12:20:04 -07:00
parent 95749bea5d
commit 1442660e49
5 changed files with 63 additions and 21 deletions

View File

@@ -20,10 +20,6 @@ package com.dfsek.terra.fabric;
import ca.solostudios.strata.Versions;
import ca.solostudios.strata.version.Version;
import com.dfsek.tectonic.exception.ConfigException;
import com.dfsek.terra.api.world.biome.Biome;
import net.minecraft.util.Identifier;
import net.minecraft.util.registry.Registry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -37,6 +33,7 @@ import com.dfsek.terra.api.event.events.config.pack.ConfigPackPostLoadEvent;
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;
import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.util.generic.pair.Pair.Mutable;
import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.fabric.config.PostLoadCompatibilityOptions;
import com.dfsek.terra.fabric.config.PreLoadCompatibilityOptions;
import com.dfsek.terra.fabric.event.BiomeRegistrationEvent;
@@ -91,12 +88,7 @@ public final class FabricAddon implements BaseAddon {
Registry<net.minecraft.world.biome.Biome> biomeRegistry = event.getRegistryManager().get(Registry.BIOME_KEY);
terraFabricPlugin.getConfigRegistry().forEach(pack -> { // Register all Terra biomes.
pack.getCheckedRegistry(Biome.class)
.forEach((id, biome) -> {
Identifier identifier = new Identifier("terra", FabricUtil.createBiomeID(pack, id));
net.minecraft.world.biome.Biome fabricBiome = FabricUtil.createBiome(biome, pack, event.getRegistryManager());
FabricUtil.registerOrOverwrite(biomeRegistry, Registry.BIOME_KEY, identifier, fabricBiome);
});
.forEach((id, biome) -> FabricUtil.registerBiome(biome, pack, event.getRegistryManager(), id));
});
logger.info("Biomes registered.");
})

View File

@@ -190,12 +190,6 @@ public class FabricChunkGeneratorWrapper extends net.minecraft.world.gen.chunk.C
}
}
@Override
public void setStructureStarts(DynamicRegistryManager dynamicRegistryManager, StructureAccessor structureAccessor, Chunk chunk,
StructureManager structureManager, long worldSeed) {
super.setStructureStarts(dynamicRegistryManager, structureAccessor, chunk, structureManager, worldSeed);
}
@Override
public CompletableFuture<Chunk> populateNoise(Executor executor, Blender arg, StructureAccessor structureAccessor, Chunk chunk) {
return CompletableFuture.supplyAsync(() -> {

View File

@@ -0,0 +1,41 @@
package com.dfsek.terra.fabric.mixin;
import com.dfsek.terra.fabric.util.FabricUtil;
import net.minecraft.util.registry.RegistryKey;
import net.minecraft.world.biome.Biome;
import net.minecraft.world.gen.feature.ConfiguredStructureFeature;
import net.minecraft.world.gen.feature.ConfiguredStructureFeatures;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.Set;
import java.util.function.BiConsumer;
@Mixin(ConfiguredStructureFeatures.class)
public class ConfiguredStructureFeaturesMixin {
@Inject(method = "register(Ljava/util/function/BiConsumer;Lnet/minecraft/world/gen/feature/ConfiguredStructureFeature;Lnet/minecraft/util/registry/RegistryKey;)V", at = @At("HEAD"))
private static void addStructuresToTerraBiomes(BiConsumer<ConfiguredStructureFeature<?, ?>, RegistryKey<Biome>> registrar,
ConfiguredStructureFeature<?, ?> feature,
RegistryKey<Biome> biome,
CallbackInfo ci) {
if(FabricUtil.getTerraVanillaBiomes().containsKey(biome)) {
FabricUtil.getTerraVanillaBiomes().get(biome).forEach(biomeRegistryKey -> registrar.accept(feature, biomeRegistryKey));
}
}
@Inject(method = "register(Ljava/util/function/BiConsumer;Lnet/minecraft/world/gen/feature/ConfiguredStructureFeature;Ljava/util/Set;)V",
at = @At("HEAD"))
private static void addStructuresToTerraBiomes(BiConsumer<ConfiguredStructureFeature<?, ?>, RegistryKey<Biome>> registrar,
ConfiguredStructureFeature<?, ?> feature, Set<RegistryKey<Biome>> biomes,
CallbackInfo ci) {
biomes.forEach(biome -> {
if(FabricUtil.getTerraVanillaBiomes().containsKey(biome)) {
FabricUtil.getTerraVanillaBiomes().get(biome).forEach(biomeRegistryKey -> registrar.accept(feature, biomeRegistryKey));
}
});
}
}

View File

@@ -33,7 +33,9 @@ import net.minecraft.world.biome.GenerationSettings;
import net.minecraft.world.gen.GenerationStep;
import net.minecraft.world.gen.carver.ConfiguredCarver;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.function.Supplier;
@@ -48,6 +50,10 @@ import com.dfsek.terra.fabric.mixin.access.BiomeEffectsAccessor;
public final class FabricUtil {
private static final Map<RegistryKey<net.minecraft.world.biome.Biome>, List<RegistryKey<net.minecraft.world.biome.Biome>>>
terraVanillaBiomes = new HashMap<>();
public static String createBiomeID(ConfigPack pack, String biomeID) {
return pack.getID().toLowerCase() + "/" + biomeID.toLowerCase(Locale.ROOT);
}
@@ -57,10 +63,8 @@ public final class FabricUtil {
*
* @param biome The Terra BiomeBuilder.
* @param pack The ConfigPack this biome belongs to.
*
* @return The Minecraft delegate biome.
*/
public static net.minecraft.world.biome.Biome createBiome(Biome biome, ConfigPack pack, DynamicRegistryManager registryManager) {
public static void registerBiome(Biome biome, ConfigPack pack, DynamicRegistryManager registryManager, String id) {
// BiomeTemplate template = biome.getTemplate();
Map<String, Integer> colors = new HashMap<>(); // template.getColors();
@@ -133,7 +137,7 @@ public final class FabricUtil {
accessor.getFoliageColor().ifPresent(effects::foliageColor);
}
return new net.minecraft.world.biome.Biome.Builder()
net.minecraft.world.biome.Biome minecraftBiome = new net.minecraft.world.biome.Biome.Builder()
.precipitation(vanilla.getPrecipitation())
.category(vanilla.getCategory())
.temperature(vanilla.getTemperature())
@@ -142,6 +146,16 @@ public final class FabricUtil {
.spawnSettings(vanilla.getSpawnSettings())
.generationSettings(generationSettings.build())
.build();
Identifier identifier = new Identifier("terra", FabricUtil.createBiomeID(pack, id));
FabricUtil.registerOrOverwrite(biomeRegistry, Registry.BIOME_KEY, identifier, minecraftBiome);
terraVanillaBiomes.computeIfAbsent(biomeRegistry.getKey(vanilla).orElseThrow(), b -> new ArrayList<>()).add(
biomeRegistry.getKey(minecraftBiome).orElseThrow());
}
public static Map<RegistryKey<net.minecraft.world.biome.Biome>, List<RegistryKey<net.minecraft.world.biome.Biome>>> getTerraVanillaBiomes() {
return terraVanillaBiomes;
}
public static <T> void registerOrOverwrite(Registry<T> registry, RegistryKey<Registry<T>> key, Identifier identifier, T item) {

View File

@@ -5,11 +5,12 @@
"compatibilityLevel": "JAVA_16",
"mixins": [
"CommandManagerMixin",
"ConfiguredStructureFeaturesMixin",
"ServerWorldMixin",
"access.StructureAccessorAccessor",
"access.BiomeEffectsAccessor",
"access.MobSpawnerLogicAccessor",
"access.StateAccessor",
"access.StructureAccessorAccessor",
"implementations.BiomeMixin",
"implementations.block.BlockEntityMixin",
"implementations.block.BlockMixin",