Possible fix for missing SurfaceRules in Datapack worlds

This commit is contained in:
Frank 2021-12-13 16:33:18 +01:00
parent ff49e1325c
commit 835f4895b3
4 changed files with 82 additions and 32 deletions

View file

@ -40,6 +40,7 @@ import net.minecraft.world.level.levelgen.GenerationStep.Decoration;
import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator;
import net.minecraft.world.level.levelgen.NoiseGeneratorSettings;
import net.minecraft.world.level.levelgen.SurfaceRules;
import net.minecraft.world.level.levelgen.SurfaceRules.RuleSource;
import net.minecraft.world.level.levelgen.carver.ConfiguredWorldCarver;
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature;
@ -483,15 +484,9 @@ public class BiomeAPI {
}
if (generator != null) {
List<SurfaceRules.RuleSource> rules = getRuleSources(biomes, level.dimension());
List<SurfaceRules.RuleSource> rules = getRuleSources(biomes);
SurfaceRuleProvider provider = SurfaceRuleProvider.class.cast(generator);
if (rules.size() > 0) {
rules.add(provider.getSurfaceRule());
provider.setSurfaceRule(SurfaceRules.sequence(rules.toArray(new SurfaceRules.RuleSource[rules.size()])));
}
else {
provider.setSurfaceRule(null);
}
changeSurfaceRules(rules, provider);
}
List<BiConsumer<ResourceLocation, Biome>> modifications = MODIFICATIONS.get(level.dimension());
@ -532,8 +527,14 @@ public class BiomeAPI {
accessor.bclib_setFeatures(featureList);
}
private static List<SurfaceRules.RuleSource> getRuleSources(Set<Biome> biomes, ResourceKey<Level> dimensionType) {
Set<ResourceLocation> biomeIDs = biomes.stream().map(biome -> getBiomeID(biome)).collect(Collectors.toSet());
private static List<SurfaceRules.RuleSource> getRuleSources(Set<Biome> biomes) {
Set<ResourceLocation> biomeIDs = biomes.stream()
.map(biome -> getBiomeID(biome))
.collect(Collectors.toSet());
return getRuleSourcesFromIDs(biomeIDs);
}
private static List<SurfaceRules.RuleSource> getRuleSourcesFromIDs(Set<ResourceLocation> biomeIDs) {
List<SurfaceRules.RuleSource> rules = Lists.newArrayList();
SURFACE_RULES.forEach((biomeID, rule) -> {
if (biomeIDs.contains(biomeID)) {
@ -792,13 +793,31 @@ public class BiomeAPI {
.event(v.get())
.register((rawId, id, object) -> {
//BCLib.LOGGER.info(" #### " + rawId + ", " + object + ", " + id);
//add back modded structures
StructureSettingsAccessor a = (StructureSettingsAccessor)object.structureSettings();
structureStarts.forEach(modifier -> changeStructureStarts(a, modifier));
//add surface rules
if (biomeRegistry!=null) {
List<SurfaceRules.RuleSource> rules = getRuleSourcesFromIDs(biomeRegistry.keySet());
SurfaceRuleProvider provider = SurfaceRuleProvider.class.cast(object);
changeSurfaceRules(rules, provider);
}
});
}
});
}
private static void changeSurfaceRules(List<RuleSource> rules, SurfaceRuleProvider provider) {
if (rules.size() > 0) {
provider.addCustomRules(rules);
}
else {
provider.clearCustomRules();
}
}
public static void clearStructureStarts(){
structureStarts.clear();
}