[Changes] Cleanup of old SurfaceRule code

This commit is contained in:
Frank 2022-06-22 00:00:38 +02:00
parent da1d4c6b40
commit cc36c090a1
19 changed files with 305 additions and 147 deletions

View file

@ -1,10 +1,7 @@
package org.betterx.bclib.api.v2.generator;
import org.betterx.bclib.BCLib;
import org.betterx.bclib.api.v2.levelgen.biomes.InternalBiomeAPI;
import org.betterx.bclib.api.v2.levelgen.surface.SurfaceRuleUtil;
import org.betterx.bclib.interfaces.NoiseGeneratorSettingsProvider;
import org.betterx.bclib.interfaces.SurfaceRuleProvider;
import org.betterx.bclib.mixin.common.ChunkGeneratorAccessor;
import org.betterx.worlds.together.WorldsTogether;
import org.betterx.worlds.together.world.WorldGenUtil;
@ -32,9 +29,7 @@ import net.minecraft.world.level.levelgen.synth.NormalNoise;
import com.google.common.base.Suppliers;
import java.util.List;
import java.util.Optional;
import java.util.function.Function;
import java.util.function.Predicate;
public class BCLChunkGenerator extends NoiseBasedChunkGenerator {
@ -101,7 +96,7 @@ public class BCLChunkGenerator extends NoiseBasedChunkGenerator {
if (initialBiomeSource != getBiomeSource()) {
if (this instanceof ChunkGeneratorAccessor acc) {
BiomeSource bs = WorldGenUtil.getWorldSettings()
.fixBiomeSource(initialBiomeSource, getBiomeSource().possibleBiomes());
.addDatapackBiomes(initialBiomeSource, getBiomeSource().possibleBiomes());
acc.bcl_setBiomeSource(bs);
rebuildFeaturesPerStep(getBiomeSource());
}
@ -109,43 +104,6 @@ public class BCLChunkGenerator extends NoiseBasedChunkGenerator {
}
public static void injectNoiseSettings(
ResourceKey<LevelStem> dimensionKey,
ChunkGenerator loadedChunkGenerator
) {
BCLib.LOGGER.debug("Checking Noise Settings for " + dimensionKey.location().toString());
final BiomeSource loadedBiomeSource = loadedChunkGenerator.getBiomeSource();
InternalBiomeAPI.applyModifications(loadedBiomeSource, dimensionKey);
if (loadedChunkGenerator instanceof NoiseBasedChunkGenerator nbc) {
if (((Object) nbc.generatorSettings().value()) instanceof SurfaceRuleProvider srp) {
srp.bclib_overwrite(SurfaceRuleUtil.addRulesForBiomeSource(nbc
.generatorSettings()
.value()
.surfaceRule(), loadedBiomeSource));
}
}
}
public static final Predicate<ResourceKey<LevelStem>> NON_MANAGED_DIMENSIONS = dim -> dim != LevelStem.NETHER && dim != LevelStem.END;
public static void injectNoiseSettings(WorldGenSettings settings, Predicate<ResourceKey<LevelStem>> filter) {
List<ResourceKey<LevelStem>> otherDimensions = settings
.dimensions()
.entrySet()
.stream()
.map(e -> e.getKey())
.filter(filter)
.toList();
for (ResourceKey<LevelStem> key : otherDimensions) {
Optional<Holder<LevelStem>> stem = settings.dimensions().getHolder(key);
if (stem.isPresent()) {
injectNoiseSettings(key, stem.get().value().generator());
}
}
}
@Override
protected Codec<? extends ChunkGenerator> codec() {
return CODEC;

View file

@ -9,6 +9,7 @@ import org.betterx.bclib.util.CollectionsUtil;
import org.betterx.bclib.util.ColorUtil;
import org.betterx.bclib.util.Pair;
import org.betterx.bclib.util.TriFunction;
import org.betterx.worlds.together.surfaceRules.SurfaceRuleRegistry;
import net.minecraft.core.Holder;
import net.minecraft.core.HolderSet;
@ -737,6 +738,7 @@ public class BCLBiomeBuilder {
*
* @param biomeConstructor {@link BiFunction} biome constructor.
* @return created {@link BCLBiome} instance.
* @deprecated Replaced with {@link #build(BiomeSupplier)}
*/
@Deprecated(forRemoval = true)
public <T extends BCLBiome> T build(BiFunction<ResourceLocation, Biome, T> biomeConstructor) {
@ -787,9 +789,11 @@ public class BCLBiomeBuilder {
final Biome biome = builder.build();
final T res = biomeConstructor.apply(biomeID, biome, settings);
res.addBiomeTags(tags);
res.setSurface(surfaceRule);
//res.setSurface(surfaceRule);
SurfaceRuleRegistry.registerRule(biomeID, surfaceRule, biomeID);
res.addClimateParameters(parameters);
//carvers.forEach(cfg -> BiomeAPI.addBiomeCarver(biome, cfg.second, cfg.first));
return res;
}

View file

@ -3,8 +3,8 @@ package org.betterx.bclib.api.v2.levelgen.biomes;
import org.betterx.bclib.BCLib;
import org.betterx.bclib.interfaces.BiomeSourceAccessor;
import org.betterx.bclib.interfaces.NoiseGeneratorSettingsProvider;
import org.betterx.bclib.interfaces.SurfaceRuleProvider;
import org.betterx.bclib.mixin.common.BiomeGenerationSettingsAccessor;
import org.betterx.worlds.together.surfaceRules.SurfaceRuleProvider;
import net.minecraft.core.Holder;
import net.minecraft.core.Registry;
@ -205,7 +205,8 @@ public class InternalBiomeAPI {
// This happens for example when using the MiningDimensions, which reuses the generator for the
// Nethering Dimension
//MODIFIED_SURFACE_PROVIDERS.add(provider);
provider.bclib_addBiomeSource(source);
//provider.bclib_addBiomeSource(source);
} else {
BCLib.LOGGER.warning("No generator for " + source);
}

View file

@ -2,14 +2,13 @@ package org.betterx.bclib.api.v2.levelgen.surface;
import org.betterx.bclib.api.v2.levelgen.biomes.BiomeAPI;
import org.betterx.bclib.api.v2.levelgen.biomes.InternalBiomeAPI;
import org.betterx.bclib.mixin.common.NoiseGeneratorSettingsMixin;
import org.betterx.worlds.together.mixin.common.NoiseGeneratorSettingsMixin;
import net.minecraft.core.Holder;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.biome.BiomeSource;
import net.minecraft.world.level.levelgen.SurfaceRules;
import net.minecraft.world.level.levelgen.SurfaceRules.RuleSource;
import com.google.common.collect.Lists;
@ -77,22 +76,12 @@ public class SurfaceRuleUtil {
SURFACE_RULES.put(biomeID, source);
}
public static RuleSource addRulesForBiomeSource(RuleSource org, BiomeSource biomeSource) {
public static RuleSource addRulesForBiomeSource(RuleSource orgiginalSource, BiomeSource biomeSource) {
List<RuleSource> additionalRules = getRuleSources(biomeSource);
if (org instanceof SurfaceRules.SequenceRuleSource sequenceRule) {
List<RuleSource> existingSequence = sequenceRule.sequence();
additionalRules = additionalRules
.stream()
.filter(r -> existingSequence.indexOf(r) < 0)
.collect(Collectors.toList());
if (additionalRules.size() == 0) return org;
additionalRules.addAll(sequenceRule.sequence());
} else {
if (additionalRules.size() == 0) return org;
if (!additionalRules.contains(org))
additionalRules.add(org);
}
return SurfaceRules.sequence(additionalRules.toArray(new RuleSource[additionalRules.size()]));
return org.betterx.worlds.together.surfaceRules.SurfaceRuleUtil.mergeSurfaceRules(
orgiginalSource,
additionalRules
);
}
}

View file

@ -12,10 +12,14 @@ import net.minecraft.commands.CommandSourceStack;
import net.minecraft.core.Holder;
import net.minecraft.core.RegistryAccess;
import net.minecraft.resources.RegistryOps;
import net.minecraft.tags.TagEntry;
import net.minecraft.tags.TagFile;
import net.minecraft.util.KeyDispatchDataCodec;
import net.minecraft.world.effect.MobEffect;
import net.minecraft.world.level.gameevent.GameEvent;
import net.minecraft.world.level.levelgen.structure.Structure;
import net.minecraft.world.level.levelgen.structure.templatesystem.PosRuleTestType;
import net.minecraft.world.level.levelgen.structure.templatesystem.RuleTestType;
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorList;
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorType;
import net.minecraft.world.level.material.Fluid;
@ -55,20 +59,37 @@ public class DumpDatapack {
File base = new File(System.getProperty("user.dir"), "bclib_datapack_dump");
BCLib.LOGGER.info(registry.key().toString());
// Tag Output
// registry.value()
// .getTagNames()
// .map(tagKey -> registry.value().getTag(tagKey))
// .filter(tag -> tag.isPresent())
// .map(tag -> tag.get())
// .forEach(tag -> {
// tag.stream()
// .map(holder -> holder.unwrapKey())
// .filter(k -> k.isPresent())
// .map(k -> k.get())
// .forEach(key -> {
//
// });
// });
registry.value()
.getTagNames()
.map(tagKey -> registry.value().getTag(tagKey))
.filter(tag -> tag.isPresent())
.map(tag -> tag.get())
.forEach(tag -> {
File f1 = new File(base, tag.key().location().getNamespace());
f1 = new File(f1, "tags");
f1 = new File(f1, registry.key().location().getPath());
f1.mkdirs();
f1 = new File(f1, tag.key().location().getPath() + ".json");
TagFile tf = new TagFile(
tag.stream()
.map(holder -> holder.unwrapKey())
.filter(k -> k.isPresent())
.map(k -> TagEntry.element(k.get().location()))
.toList(),
true
);
var o = TagFile.CODEC
.encodeStart(registryOps, tf)
.result()
.orElse(new JsonObject());
String content = gson.toJson(o);
try {
Files.writeString(f1.toPath(), content, StandardCharsets.UTF_8);
} catch (IOException e) {
BCLib.LOGGER.error(" ->> Unable to WRITE: " + e.getMessage());
}
});
registry
.value()
@ -102,6 +123,10 @@ public class DumpDatapack {
return;
} else if (obj instanceof BaseStairsBlock) {
return;
} else if (obj instanceof RuleTestType<?>) {
codec[0] = registry.value().byNameCodec();
} else if (obj instanceof PosRuleTestType<?>) {
codec[0] = registry.value().byNameCodec();
}
if (codec[0] == null) {
@ -113,6 +138,7 @@ public class DumpDatapack {
try {
codec[0] = (Codec) m.invoke(obj);
BCLib.LOGGER.info(" Got Codec from " + m);
break;
} catch (Exception e) {
BCLib.LOGGER.error(" !!! Unable to get Codec from " + m);
}
@ -120,6 +146,7 @@ public class DumpDatapack {
try {
codec[0] = ((KeyDispatchCodec) m.invoke(obj)).codec();
BCLib.LOGGER.info(" Got Codec from " + m);
break;
} catch (Exception e) {
BCLib.LOGGER.error(" !!! Unable to get Codec from " + m);
}
@ -127,6 +154,7 @@ public class DumpDatapack {
try {
codec[0] = ((KeyDispatchDataCodec) m.invoke(obj)).codec();
BCLib.LOGGER.info(" Got Codec from " + m);
break;
} catch (Exception e) {
BCLib.LOGGER.error(" !!! Unable to get Codec from " + m);
}
@ -138,7 +166,7 @@ public class DumpDatapack {
if (codec[0] == null) {
//Try to find DIRECT_CODEC field
for (Field f : obj.getClass().getDeclaredFields()) {
for (Field f : obj.getClass().getFields()) {
if (Modifier.isStatic(f.getModifiers())) {
if ("DIRECT_CODEC".equals(f.getName())) {
f.setAccessible(true);
@ -155,7 +183,7 @@ public class DumpDatapack {
//Try to find CODEC field
if (codec[0] == null) {
for (Field f : obj.getClass().getDeclaredFields()) {
for (Field f : obj.getClass().getFields()) {
if (Modifier.isStatic(f.getModifiers())) {
if ("CODEC".equals(f.getName())) {
try {
@ -172,7 +200,7 @@ public class DumpDatapack {
//Try to find any Codec field
if (codec[0] == null) {
for (Field f : obj.getClass().getDeclaredFields()) {
for (Field f : obj.getClass().getFields()) {
if (Modifier.isStatic(f.getModifiers())) {
if (Codec.class.isAssignableFrom(f.getType())) {
f.setAccessible(true);
@ -187,6 +215,10 @@ public class DumpDatapack {
}
}
if (codec[0] == null) {
codec[0] = registry.value().byNameCodec();
}
if (codec[0] != null) {
try {

View file

@ -1,10 +0,0 @@
package org.betterx.bclib.interfaces;
import net.minecraft.world.level.biome.BiomeSource;
import net.minecraft.world.level.levelgen.SurfaceRules;
public interface SurfaceRuleProvider {
void bclib_addBiomeSource(BiomeSource source);
void bclib_clearBiomeSources();
void bclib_overwrite(SurfaceRules.RuleSource surfaceRule);
}

View file

@ -1,104 +0,0 @@
package org.betterx.bclib.mixin.common;
import org.betterx.bclib.api.v2.levelgen.surface.SurfaceRuleUtil;
import org.betterx.bclib.interfaces.SurfaceRuleProvider;
import net.minecraft.world.level.biome.BiomeSource;
import net.minecraft.world.level.levelgen.NoiseGeneratorSettings;
import net.minecraft.world.level.levelgen.SurfaceRules;
import net.minecraft.world.level.levelgen.SurfaceRules.RuleSource;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.Shadow;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
@Mixin(NoiseGeneratorSettings.class)
public class NoiseGeneratorSettingsMixin implements SurfaceRuleProvider {
@Mutable
@Final
@Shadow
private SurfaceRules.RuleSource surfaceRule;
private SurfaceRules.RuleSource bclib_originalSurfaceRule;
private final Set<BiomeSource> bclib_biomeSources = new HashSet<>();
private void bclib_updateCustomRules() {
bclib_setCustomRules(SurfaceRuleUtil.getRuleSources(bclib_biomeSources));
}
@Override
public void bclib_addBiomeSource(BiomeSource source) {
bclib_biomeSources.add(source);
bclib_updateCustomRules();
}
@Override
public void bclib_clearBiomeSources() {
bclib_biomeSources.clear();
bclib_clearCustomRules();
}
private void bclib_clearCustomRules() {
if (bclib_originalSurfaceRule != null) {
this.surfaceRule = bclib_originalSurfaceRule;
bclib_originalSurfaceRule = null;
}
}
private void bclib_setCustomRules(List<RuleSource> rules) {
if (rules.size() == 0) {
bclib_clearCustomRules();
return;
}
RuleSource org = bclib_getOriginalSurfaceRule();
if (org instanceof SurfaceRules.SequenceRuleSource sequenceRule) {
List<RuleSource> currentSequence = sequenceRule.sequence();
rules = rules.stream().filter(r -> currentSequence.indexOf(r) < 0).collect(Collectors.toList());
rules.addAll(sequenceRule.sequence());
} else {
rules.add(org);
}
bclib_setSurfaceRule(SurfaceRules.sequence(rules.toArray(new RuleSource[rules.size()])));
}
public void bclib_overwrite(SurfaceRules.RuleSource surfaceRule) {
if (surfaceRule == this.surfaceRule) return;
if (this.bcl_containsOverride) {
System.out.println("Adding another override");
}
this.bcl_containsOverride = true;
this.surfaceRule = surfaceRule;
}
void bclib_setSurfaceRule(SurfaceRules.RuleSource surfaceRule) {
if (bclib_originalSurfaceRule == null) {
bclib_originalSurfaceRule = this.surfaceRule;
}
this.surfaceRule = surfaceRule;
}
private boolean bcl_containsOverride = false;
RuleSource bclib_getOriginalSurfaceRule() {
if (bclib_originalSurfaceRule == null) {
return surfaceRule;
}
return bclib_originalSurfaceRule;
}
// @Inject(method = "surfaceRule", at = @At("HEAD"), cancellable = true)
// private void bclib_surfaceRule(CallbackInfoReturnable<SurfaceRules.RuleSource> info) {
// if (bclib_surfaceRule != null) {
// info.setReturnValue(bclib_surfaceRule);
// }
// }
}

View file

@ -6,9 +6,10 @@ import org.betterx.bclib.api.v2.generator.BCLChunkGenerator;
import org.betterx.bclib.api.v2.generator.BCLibEndBiomeSource;
import org.betterx.bclib.api.v2.levelgen.LevelGenUtil;
import org.betterx.bclib.api.v2.levelgen.biomes.InternalBiomeAPI;
import org.betterx.bclib.api.v2.levelgen.surface.SurfaceRuleUtil;
import org.betterx.bclib.interfaces.ChunkGeneratorAccessor;
import org.betterx.bclib.interfaces.NoiseGeneratorSettingsProvider;
import org.betterx.worlds.together.surfaceRules.SurfaceRuleRegistry;
import org.betterx.worlds.together.surfaceRules.SurfaceRuleUtil;
import org.betterx.worlds.together.world.WorldGenUtil;
import org.betterx.worlds.together.worldPreset.TogetherWorldPreset;
import org.betterx.worlds.together.worldPreset.settings.WorldPresetSettings;
@ -125,35 +126,38 @@ public class BCLWorldPresetSettings extends WorldPresetSettings {
return LevelGenUtil.getBCLEndLevelStem(ctx, Optional.of(endVersion));
}
public BiomeSource fixBiomeSource(BiomeSource biomeSource, Set<Holder<Biome>> datapackBiomes) {
public BiomeSource addDatapackBiomes(BiomeSource biomeSource, Set<Holder<Biome>> datapackBiomes) {
if (biomeSource instanceof BCLBiomeSource bs) {
return bs.createCopyForDatapack(datapackBiomes);
}
return biomeSource;
}
private Holder<NoiseGeneratorSettings> fixNoiseSettings(
private static Holder<NoiseGeneratorSettings> injectSurfaceRules(
Holder<NoiseGeneratorSettings> reference,
Holder<NoiseGeneratorSettings> settings,
BiomeSource biomeSource
) {
NoiseGeneratorSettings old = settings.value();
NoiseGeneratorSettings noise = new NoiseGeneratorSettings(
old.noiseSettings(),
old.defaultBlock(),
old.defaultFluid(),
old.noiseRouter(),
SurfaceRuleUtil.addRulesForBiomeSource(old.surfaceRule(), biomeSource),
old.spawnTarget(),
old.seaLevel(),
old.disableMobGeneration(),
old.aquifersEnabled(),
old.oreVeinsEnabled(),
old.useLegacyRandomSource()
);
return Holder.direct(noise);
SurfaceRuleUtil.injectSurfaceRules(settings.value(), biomeSource);
return settings;
// NoiseGeneratorSettings old = settings.value();
// NoiseGeneratorSettings noise = new NoiseGeneratorSettings(
// old.noiseSettings(),
// old.defaultBlock(),
// old.defaultFluid(),
// old.noiseRouter(),
// SurfaceRuleRegistry.mergeSurfaceRulesFromBiomes(old.surfaceRule(), biomeSource),
// //SurfaceRuleUtil.addRulesForBiomeSource(old.surfaceRule(), biomeSource),
// old.spawnTarget(),
// old.seaLevel(),
// old.disableMobGeneration(),
// old.aquifersEnabled(),
// old.oreVeinsEnabled(),
// old.useLegacyRandomSource()
// );
//
//
// return Holder.direct(noise);
}
@ -200,13 +204,13 @@ public class BCLWorldPresetSettings extends WorldPresetSettings {
if (loadedChunkGenerator instanceof NoiseGeneratorSettingsProvider noiseProvider) {
if (referenceGenerator instanceof NoiseGeneratorSettingsProvider referenceProvider) {
final Set<Holder<Biome>> biomes = loadedChunkGenerator.getBiomeSource().possibleBiomes();
final BiomeSource bs = fixBiomeSource(referenceGenerator.getBiomeSource(), biomes);
final BiomeSource bs = addDatapackBiomes(referenceGenerator.getBiomeSource(), biomes);
InternalBiomeAPI.applyModifications(bs, dimensionKey);
referenceGenerator = new BCLChunkGenerator(
generator.bclib_getStructureSetsRegistry(),
noiseProvider.bclib_getNoises(),
bs,
fixNoiseSettings(
injectSurfaceRules(
referenceProvider.bclib_getNoiseGeneratorSettingHolders(),
noiseProvider.bclib_getNoiseGeneratorSettingHolders(),
bs
@ -224,7 +228,7 @@ public class BCLWorldPresetSettings extends WorldPresetSettings {
referenceGenerator
);
} else {
BCLChunkGenerator.injectNoiseSettings(dimensionKey, loadedChunkGenerator);
SurfaceRuleUtil.injectSurfaceRules(dimensionKey, loadedChunkGenerator);
}
return settings;
}
@ -232,7 +236,7 @@ public class BCLWorldPresetSettings extends WorldPresetSettings {
public WorldGenSettings repairSettingsOnLoad(RegistryAccess registryAccess, WorldGenSettings settings) {
settings = fixSettingsInCurrentWorld(registryAccess, LevelStem.NETHER, BuiltinDimensionTypes.NETHER, settings);
settings = fixSettingsInCurrentWorld(registryAccess, LevelStem.END, BuiltinDimensionTypes.END, settings);
BCLChunkGenerator.injectNoiseSettings(settings, BCLChunkGenerator.NON_MANAGED_DIMENSIONS);
SurfaceRuleUtil.injectSurfaceRules(settings, SurfaceRuleRegistry.NON_MANAGED_DIMENSIONS);
return settings;
}