cleanup and add per-biome exclusions

This commit is contained in:
dfsek 2021-05-17 22:45:39 -07:00
parent d93d064d97
commit 2fdb96a850
5 changed files with 46 additions and 19 deletions

View File

@ -35,7 +35,7 @@ import com.dfsek.terra.config.PluginConfig;
import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.config.lang.LangUtil;
import com.dfsek.terra.config.lang.Language; import com.dfsek.terra.config.lang.Language;
import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.config.pack.ConfigPack;
import com.dfsek.terra.fabric.config.PackFeatureOptionsTemplate; import com.dfsek.terra.fabric.config.PackCompatibilityOptions;
import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper; import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper;
import com.dfsek.terra.fabric.generation.PopulatorFeature; import com.dfsek.terra.fabric.generation.PopulatorFeature;
import com.dfsek.terra.fabric.generation.TerraBiomeSource; import com.dfsek.terra.fabric.generation.TerraBiomeSource;
@ -295,7 +295,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer {
private final TerraPlugin main; private final TerraPlugin main;
private final Map<ConfigPack, PackFeatureOptionsTemplate> templates = new HashMap<>(); private final Map<ConfigPack, PackCompatibilityOptions> templates = new HashMap<>();
private FabricAddon(TerraPlugin main) { private FabricAddon(TerraPlugin main) {
this.main = main; this.main = main;
@ -330,7 +330,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer {
injectTree(treeRegistry, "CRIMSON_FUNGUS", ConfiguredFeatures.CRIMSON_FUNGI); injectTree(treeRegistry, "CRIMSON_FUNGUS", ConfiguredFeatures.CRIMSON_FUNGI);
injectTree(treeRegistry, "WARPED_FUNGUS", ConfiguredFeatures.WARPED_FUNGI); injectTree(treeRegistry, "WARPED_FUNGUS", ConfiguredFeatures.WARPED_FUNGI);
PackFeatureOptionsTemplate template = new PackFeatureOptionsTemplate(); PackCompatibilityOptions template = new PackCompatibilityOptions();
try { try {
event.loadTemplate(template); event.loadTemplate(template);
} catch(ConfigException e) { } catch(ConfigException e) {
@ -359,7 +359,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer {
} }
} }
public Map<ConfigPack, PackFeatureOptionsTemplate> getTemplates() { public Map<ConfigPack, PackCompatibilityOptions> getTemplates() {
return templates; return templates;
} }
} }

View File

@ -3,13 +3,16 @@ package com.dfsek.terra.fabric.config;
import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Default;
import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.annotations.Value;
import com.dfsek.tectonic.config.ConfigTemplate; import com.dfsek.tectonic.config.ConfigTemplate;
import com.dfsek.terra.config.builder.BiomeBuilder;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Map;
import java.util.Set; import java.util.Set;
@SuppressWarnings("FieldMayBeFinal") @SuppressWarnings("FieldMayBeFinal")
public class PackFeatureOptionsTemplate implements ConfigTemplate { public class PackCompatibilityOptions implements ConfigTemplate {
@Value("features.inject-registry.enable") @Value("features.inject-registry.enable")
@Default @Default
private boolean doRegistryInjection = false; private boolean doRegistryInjection = false;
@ -26,6 +29,18 @@ public class PackFeatureOptionsTemplate implements ConfigTemplate {
@Default @Default
private Set<Identifier> excludedBiomeFeatures = new HashSet<>(); private Set<Identifier> excludedBiomeFeatures = new HashSet<>();
@Value("features.inject-biome.exclude-biomes")
@Default
private Map<BiomeBuilder, Set<Identifier>> excludedPerBiomeFeatures = new HashMap<>();
@Value("structures.inject-biome.excluded-features")
@Default
private Set<Identifier> excludedBiomeStructures = new HashSet<>();
@Value("structures.inject-biome.exclude-biomes")
@Default
private Map<BiomeBuilder, Set<Identifier>> excludedPerBiomeStructures = new HashMap<>();
public boolean doBiomeInjection() { public boolean doBiomeInjection() {
return doBiomeInjection; return doBiomeInjection;
} }
@ -41,4 +56,16 @@ public class PackFeatureOptionsTemplate implements ConfigTemplate {
public Set<Identifier> getExcludedRegistryFeatures() { public Set<Identifier> getExcludedRegistryFeatures() {
return excludedRegistryFeatures; return excludedRegistryFeatures;
} }
public Map<BiomeBuilder, Set<Identifier>> getExcludedPerBiomeFeatures() {
return excludedPerBiomeFeatures;
}
public Map<BiomeBuilder, Set<Identifier>> getExcludedPerBiomeStructures() {
return excludedPerBiomeStructures;
}
public Set<Identifier> getExcludedBiomeStructures() {
return excludedBiomeStructures;
}
} }

View File

@ -148,10 +148,9 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener
int cx = FastMath.floorMod(x, 16); int cx = FastMath.floorMod(x, 16);
int cz = FastMath.floorMod(z, 16); int cz = FastMath.floorMod(z, 16);
int height = world.getWorld().getMaxHeight(); int height = world.getWorld().getMaxHeight() - 1;
do height--; while(height >= 0 && sampler.sample(cx, height, cz) < 0) height--;
while(height >= 0 && sampler.sample(cx, height, cz) < 0);
return height; return height;
} }

View File

@ -3,8 +3,8 @@ package com.dfsek.terra.fabric.generation;
import com.dfsek.terra.api.world.biome.UserDefinedBiome; import com.dfsek.terra.api.world.biome.UserDefinedBiome;
import com.dfsek.terra.api.world.biome.provider.BiomeProvider; import com.dfsek.terra.api.world.biome.provider.BiomeProvider;
import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.config.pack.ConfigPack;
import com.dfsek.terra.fabric.util.FabricUtil;
import com.dfsek.terra.fabric.TerraFabricPlugin; import com.dfsek.terra.fabric.TerraFabricPlugin;
import com.dfsek.terra.fabric.util.FabricUtil;
import com.mojang.serialization.Codec; import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder; import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
@ -14,7 +14,6 @@ import net.minecraft.world.biome.Biome;
import net.minecraft.world.biome.source.BiomeSource; import net.minecraft.world.biome.source.BiomeSource;
import net.minecraft.world.gen.feature.StructureFeature; import net.minecraft.world.gen.feature.StructureFeature;
import java.util.Objects;
import java.util.stream.Collectors; import java.util.stream.Collectors;
public class TerraBiomeSource extends BiomeSource { public class TerraBiomeSource extends BiomeSource {
@ -33,9 +32,7 @@ public class TerraBiomeSource extends BiomeSource {
private final ConfigPack pack; private final ConfigPack pack;
public TerraBiomeSource(Registry<Biome> biomes, long seed, ConfigPack pack) { public TerraBiomeSource(Registry<Biome> biomes, long seed, ConfigPack pack) {
super(biomes.stream() super(biomes.stream().collect(Collectors.toList()));
.filter(biome -> Objects.requireNonNull(biomes.getId(biome)).getNamespace().equals("terra")) // Filter out non-Terra biomes.
.collect(Collectors.toList()));
this.biomeRegistry = biomes; this.biomeRegistry = biomes;
this.seed = seed; this.seed = seed;
this.grid = pack.getBiomeProviderBuilder().build(seed); this.grid = pack.getBiomeProviderBuilder().build(seed);

View File

@ -4,7 +4,7 @@ import com.dfsek.terra.config.builder.BiomeBuilder;
import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.config.pack.ConfigPack;
import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.config.templates.BiomeTemplate;
import com.dfsek.terra.fabric.TerraFabricPlugin; import com.dfsek.terra.fabric.TerraFabricPlugin;
import com.dfsek.terra.fabric.config.PackFeatureOptionsTemplate; import com.dfsek.terra.fabric.config.PackCompatibilityOptions;
import com.dfsek.terra.fabric.mixin.access.BiomeEffectsAccessor; import com.dfsek.terra.fabric.mixin.access.BiomeEffectsAccessor;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.registry.BuiltinRegistries; import net.minecraft.util.registry.BuiltinRegistries;
@ -17,6 +17,7 @@ import net.minecraft.world.gen.feature.ConfiguredFeature;
import net.minecraft.world.gen.feature.ConfiguredStructureFeature; import net.minecraft.world.gen.feature.ConfiguredStructureFeature;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.function.Supplier; import java.util.function.Supplier;
@ -52,18 +53,21 @@ public final class FabricUtil {
} }
} }
PackCompatibilityOptions compatibilityOptions = fabricAddon.getTemplates().get(pack);
for(Supplier<ConfiguredStructureFeature<?, ?>> structureFeature : vanilla.getGenerationSettings().getStructureFeatures()) { for(Supplier<ConfiguredStructureFeature<?, ?>> structureFeature : vanilla.getGenerationSettings().getStructureFeatures()) {
Identifier key = BuiltinRegistries.CONFIGURED_STRUCTURE_FEATURE.getId(structureFeature.get());
if(!compatibilityOptions.getExcludedBiomeStructures().contains(key) && !compatibilityOptions.getExcludedPerBiomeStructures().getOrDefault(biome, Collections.emptySet()).contains(key)) {
generationSettings.structureFeature(structureFeature.get()); generationSettings.structureFeature(structureFeature.get());
} }
}
PackFeatureOptionsTemplate optionsTemplate = fabricAddon.getTemplates().get(pack); if(compatibilityOptions.doBiomeInjection()) {
if(optionsTemplate.doBiomeInjection()) {
TerraFabricPlugin.getInstance().getDebugLogger().info("Injecting features into " + biome.getTemplate().getID()); TerraFabricPlugin.getInstance().getDebugLogger().info("Injecting features into " + biome.getTemplate().getID());
for(int step = 0; step < vanilla.getGenerationSettings().getFeatures().size(); step++) { for(int step = 0; step < vanilla.getGenerationSettings().getFeatures().size(); step++) {
for(Supplier<ConfiguredFeature<?, ?>> featureSupplier : vanilla.getGenerationSettings().getFeatures().get(step)) { for(Supplier<ConfiguredFeature<?, ?>> featureSupplier : vanilla.getGenerationSettings().getFeatures().get(step)) {
Identifier key = BuiltinRegistries.CONFIGURED_FEATURE.getId(featureSupplier.get()); Identifier key = BuiltinRegistries.CONFIGURED_FEATURE.getId(featureSupplier.get());
if(!optionsTemplate.getExcludedBiomeFeatures().contains(key)) { if(!compatibilityOptions.getExcludedBiomeFeatures().contains(key) && !compatibilityOptions.getExcludedPerBiomeFeatures().getOrDefault(biome, Collections.emptySet()).contains(key)) {
generationSettings.feature(step, featureSupplier); generationSettings.feature(step, featureSupplier);
TerraFabricPlugin.getInstance().getDebugLogger().info("Injected " + key + " at stage " + step); TerraFabricPlugin.getInstance().getDebugLogger().info("Injected " + key + " at stage " + step);
} }