add vanilla bonemeal flowers to Terra biomes

This commit is contained in:
dfsek
2022-05-29 03:05:01 -07:00
parent 414c0b8a38
commit a4d87a428c
6 changed files with 116 additions and 78 deletions

View File

@@ -1,21 +0,0 @@
package com.dfsek.terra.fabric.mixin.access;
import net.minecraft.world.biome.GenerationSettings;
import net.minecraft.world.gen.feature.ConfiguredFeature;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.gen.Accessor;
import java.util.List;
import java.util.function.Supplier;
@Mixin(GenerationSettings.class)
public interface GenerationSettingsAccessor {
@Mutable
@Accessor("flowerFeatures")
void setFlowerFeatures(Supplier<List<ConfiguredFeature<?, ?>>> flowerFeatures);
@Accessor("flowerFeatures")
Supplier<List<ConfiguredFeature<?, ?>>> getFlowerFeaturesSupplier();
}

View File

@@ -0,0 +1,32 @@
package com.dfsek.terra.fabric.mixin.compat;
import com.dfsek.terra.fabric.util.FloraFeatureHolder;
import net.minecraft.world.biome.GenerationSettings;
import net.minecraft.world.gen.feature.ConfiguredFeature;
import org.spongepowered.asm.mixin.Implements;
import org.spongepowered.asm.mixin.Interface;
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.CallbackInfoReturnable;
import java.util.List;
@Mixin(GenerationSettings.class)
@Implements(@Interface(iface = FloraFeatureHolder.class, prefix = "terra$"))
public class GenerationSettingsFloraFeaturesMixin {
private List<ConfiguredFeature<?, ?>> flora;
public void terra$setFloraFeatures(List<ConfiguredFeature<?, ?>> features) {
this.flora = features;
}
@Inject(method = "getFlowerFeatures", cancellable = true, at = @At("HEAD"))
public void inject(CallbackInfoReturnable<List<ConfiguredFeature<?, ?>>> cir) {
if(flora != null) {
cir.setReturnValue(flora);
}
}
}

View File

@@ -21,5 +21,6 @@ public class DataPackContentsMixin {
private void injectReload(DynamicRegistryManager dynamicRegistryManager, CallbackInfo ci) {
Registry<Biome> biomeRegistry = dynamicRegistryManager.get(Registry.BIOME_KEY);
TagUtil.registerTags(biomeRegistry);
BiomeUtil.registerFlora(biomeRegistry);
}
}

View File

@@ -5,7 +5,6 @@ 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.VanillaBiomeProperties;
import com.dfsek.terra.fabric.mixin.access.GenerationSettingsAccessor;
import net.minecraft.util.Identifier;
import net.minecraft.util.registry.BuiltinRegistries;
@@ -14,6 +13,7 @@ import net.minecraft.util.registry.RegistryKey;
import net.minecraft.world.biome.Biome.Builder;
import net.minecraft.world.biome.BiomeEffects;
import net.minecraft.world.biome.GenerationSettings;
import net.minecraft.world.gen.feature.ConfiguredFeature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -41,6 +41,7 @@ public final class BiomeUtil {
pack.getCheckedRegistry(Biome.class)
.forEach((id, biome) -> registerBiome(biome, pack, id));
});
registerFlora(BuiltinRegistries.BIOME);
logger.info("Terra biomes registered.");
}
@@ -50,7 +51,7 @@ public final class BiomeUtil {
* @param biome The Terra BiomeBuilder.
* @param pack The ConfigPack this biome belongs to.
*/
public static void registerBiome(Biome biome, ConfigPack pack,
private static void registerBiome(Biome biome, ConfigPack pack,
com.dfsek.terra.api.registry.key.RegistryKey id) {
Registry<net.minecraft.world.biome.Biome> registry = BuiltinRegistries.BIOME;
RegistryKey<net.minecraft.world.biome.Biome> vanilla = ((ProtoPlatformBiome) biome.getPlatformBiome()).get(registry);
@@ -78,6 +79,26 @@ public final class BiomeUtil {
}
}
public static void registerFlora(Registry<net.minecraft.world.biome.Biome> biomes) {
logger.info("Injecting flora into Terra biomes...");
TERRA_BIOME_MAP
.forEach((vb, terraBiomes) ->
biomes.getOrEmpty(vb)
.ifPresentOrElse(vanilla -> terraBiomes
.forEach(tb -> biomes.getOrEmpty(tb)
.ifPresentOrElse(
terra -> {
List<ConfiguredFeature<?, ?>> flowerFeatures = List.copyOf(vanilla.getGenerationSettings().getFlowerFeatures());
logger.debug("Injecting flora into biome {} : {}", tb, flowerFeatures);
((FloraFeatureHolder) terra.getGenerationSettings()).setFloraFeatures(flowerFeatures);
},
() -> logger.error(
"No such biome: {}",
tb))),
() -> logger.error("No vanilla biome: {}", vb)));
}
public static Map<Identifier, List<Identifier>> getTerraBiomeMap() {
return Map.copyOf(TERRA_BIOME_MAP);
}
@@ -133,18 +154,13 @@ public final class BiomeUtil {
.category(vanilla.getCategory());
}
GenerationSettings settings = generationSettings.build();
((GenerationSettingsAccessor) settings)
.setFlowerFeatures(((GenerationSettingsAccessor) vanilla.getGenerationSettings())
.getFlowerFeaturesSupplier());
return builder
.temperature(vanilla.getTemperature())
.downfall(vanilla.getDownfall())
.effects(effects.build())
.spawnSettings(vanilla.getSpawnSettings())
.generationSettings(settings)
.generationSettings(generationSettings.build())
.build();
}
}

View File

@@ -0,0 +1,10 @@
package com.dfsek.terra.fabric.util;
import net.minecraft.world.gen.feature.ConfiguredFeature;
import java.util.List;
public interface FloraFeatureHolder {
void setFloraFeatures(List<ConfiguredFeature<?, ?>> features);
}

View File

@@ -1,51 +1,51 @@
{
"required": true,
"minVersion": "0.8",
"package": "com.dfsek.terra.fabric.mixin",
"compatibilityLevel": "JAVA_17",
"mixins": [
"access.GenerationSettingsAccessor",
"access.MobSpawnerLogicAccessor",
"access.StateAccessor",
"access.StructureAccessorAccessor",
"implementations.BiomeMixin",
"implementations.HandleImplementationMixin",
"implementations.block.BlockMixin",
"implementations.block.entity.BlockEntityMixin",
"implementations.block.entity.LootableContainerBlockEntityMixin",
"implementations.block.entity.MobSpawnerBlockEntityMixin",
"implementations.block.entity.SignBlockEntityMixin",
"implementations.block.state.BlockStateMixin",
"implementations.block.state.PropertyMixin",
"implementations.chunk.ChunkRegionMixin",
"implementations.chunk.WorldChunkMixin",
"implementations.chunk.data.ProtoChunkMixin",
"implementations.entity.EntityMixin",
"implementations.entity.EntityTypeMixin",
"implementations.entity.PlayerEntityMixin",
"implementations.entity.ServerCommandSourceMixin",
"implementations.inventory.LockableContainerBlockEntityMixin",
"implementations.inventory.item.ItemMixin",
"implementations.inventory.item.ItemStackMixin",
"implementations.inventory.meta.EnchantmentMixin",
"implementations.inventory.meta.ItemStackDamageableMixin",
"implementations.inventory.meta.ItemStackMetaMixin",
"implementations.world.ChunkRegionMixin",
"implementations.world.ServerWorldMixin",
"lifecycle.DataPackContentsMixin",
"lifecycle.MinecraftServerMixin",
"lifecycle.RegistryMixin"
],
"client": [
"access.GeneratorTypeAccessor",
"lifecycle.client.MinecraftClientMixin"
],
"server": [
"lifecycle.server.GeneratorOptionsMixin",
"lifecycle.server.ServerMainMixin"
],
"injectors": {
"defaultRequire": 1
},
"refmap": "terra-refmap.json"
"required": true,
"minVersion": "0.8",
"package": "com.dfsek.terra.fabric.mixin",
"compatibilityLevel": "JAVA_17",
"mixins": [
"access.MobSpawnerLogicAccessor",
"access.StateAccessor",
"access.StructureAccessorAccessor",
"compat.GenerationSettingsFloraFeaturesMixin",
"implementations.BiomeMixin",
"implementations.HandleImplementationMixin",
"implementations.block.BlockMixin",
"implementations.block.entity.BlockEntityMixin",
"implementations.block.entity.LootableContainerBlockEntityMixin",
"implementations.block.entity.MobSpawnerBlockEntityMixin",
"implementations.block.entity.SignBlockEntityMixin",
"implementations.block.state.BlockStateMixin",
"implementations.block.state.PropertyMixin",
"implementations.chunk.ChunkRegionMixin",
"implementations.chunk.WorldChunkMixin",
"implementations.chunk.data.ProtoChunkMixin",
"implementations.entity.EntityMixin",
"implementations.entity.EntityTypeMixin",
"implementations.entity.PlayerEntityMixin",
"implementations.entity.ServerCommandSourceMixin",
"implementations.inventory.LockableContainerBlockEntityMixin",
"implementations.inventory.item.ItemMixin",
"implementations.inventory.item.ItemStackMixin",
"implementations.inventory.meta.EnchantmentMixin",
"implementations.inventory.meta.ItemStackDamageableMixin",
"implementations.inventory.meta.ItemStackMetaMixin",
"implementations.world.ChunkRegionMixin",
"implementations.world.ServerWorldMixin",
"lifecycle.DataPackContentsMixin",
"lifecycle.MinecraftServerMixin",
"lifecycle.RegistryMixin"
],
"client": [
"access.GeneratorTypeAccessor",
"lifecycle.client.MinecraftClientMixin"
],
"server": [
"lifecycle.server.GeneratorOptionsMixin",
"lifecycle.server.ServerMainMixin"
],
"injectors": {
"defaultRequire": 1
},
"refmap": "terra-refmap.json"
}