From 875da77165e7de4faeed58a8657c430e8d1b062a Mon Sep 17 00:00:00 2001 From: Blue Staggo Date: Tue, 27 May 2025 14:06:57 +0100 Subject: [PATCH] Biome predicates --- .../bluestaggo/modernerbeta/ModernerBeta.java | 16 +-- .../registry/ModernBetaBuiltInRegistries.java | 5 +- .../screen/ModernBetaBiomePreviewScreen.java | 2 +- .../gui/screen/ModernBetaSettingsScreen.java | 4 +- .../settings/ModernBetaSettings.java | 2 +- .../settings/ModernBetaSettingsPresets.java | 23 +++- .../modernerbeta/util/CodecUtil.java | 22 +++ .../util/json/PoolJsonSerializer.java | 18 --- .../biome/provider/BiomeProviderFractal.java | 8 +- .../provider/fractal/ConfiguredLayers.java | 36 +---- .../provider/fractal/ExtendedBiomeId.java | 20 --- .../biome/provider/fractal/LayerType.java | 32 ----- .../provider/fractal/layers/AddLandLayer.java | 35 ++--- .../fractal/layers/BaseZoomLayer.java | 1 - ...yer.java => BiomeToLayerOverlayLayer.java} | 37 ++--- .../provider/fractal/layers/BorderLayer.java | 8 +- .../fractal/layers/ComputeRiverLayer.java | 3 +- .../fractal/layers/ConditionalMaskLayer.java | 78 +++++++++++ .../fractal/layers/ConstantBiomeLayer.java | 4 +- .../layers/DiagonalInnerMaskLayer.java | 35 ----- .../fractal/layers/FuzzyZoomLayer.java | 4 +- .../fractal/layers/InitLandLayer.java | 4 +- .../fractal/layers/InitRiverLayer.java | 4 +- .../fractal/layers/InnerMaskLayer.java | 80 ----------- .../fractal/layers/InverseMaskLayer.java | 65 --------- .../provider/fractal/{ => layers}/Layer.java | 22 +-- .../fractal/{ => layers}/LayerRandom.java | 2 +- .../provider/fractal/layers/LayerType.java | 31 +++++ .../fractal/layers/MixRiverLayer.java | 4 +- .../fractal/layers/ModalZoomLayer.java | 4 +- .../fractal/layers/PointZoomLayer.java | 3 +- .../fractal/layers/PredicateOverlayLayer.java | 130 ++++++++++++++++++ .../fractal/layers/RandomBiomeLayer.java | 5 +- .../layers/SimpleBiomeReplacementLayer.java | 52 +++++++ .../fractal/layers/SingleParentLayer.java | 1 - .../provider/fractal/layers/SmoothLayer.java | 3 +- .../fractal/layers/StackedZoomLayer.java | 14 +- .../fractal/layers/WeightedBiomeLayer.java | 4 +- .../predicates/AllOfBiomePredicate.java | 48 +++++++ .../predicates/AnyOfBiomePredicate.java | 48 +++++++ .../fractal/predicates/BiomePredicate.java | 76 ++++++++++ .../predicates/BiomePredicateType.java | 21 +++ .../predicates/InSetBiomePredicate.java | 37 +++++ .../predicates/InteriorBiomePredicate.java | 80 +++++++++++ .../predicates/InvertedBiomePredicate.java | 35 +++++ .../RandomChanceBiomePredicate.java | 39 ++++++ .../predicates/SingleMatchBiomePredicate.java | 36 +++++ .../SpecificCaseBiomePredicate.java | 40 ++++++ 48 files changed, 863 insertions(+), 418 deletions(-) delete mode 100644 common/src/main/java/mod/bluestaggo/modernerbeta/util/json/PoolJsonSerializer.java delete mode 100644 common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/LayerType.java rename common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/{MaskLayer.java => BiomeToLayerOverlayLayer.java} (57%) create mode 100644 common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/ConditionalMaskLayer.java delete mode 100644 common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/DiagonalInnerMaskLayer.java delete mode 100644 common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/InnerMaskLayer.java delete mode 100644 common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/InverseMaskLayer.java rename common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/{ => layers}/Layer.java (83%) rename common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/{ => layers}/LayerRandom.java (96%) create mode 100644 common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/LayerType.java create mode 100644 common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/PredicateOverlayLayer.java create mode 100644 common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/SimpleBiomeReplacementLayer.java create mode 100644 common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/AllOfBiomePredicate.java create mode 100644 common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/AnyOfBiomePredicate.java create mode 100644 common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/BiomePredicate.java create mode 100644 common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/BiomePredicateType.java create mode 100644 common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/InSetBiomePredicate.java create mode 100644 common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/InteriorBiomePredicate.java create mode 100644 common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/InvertedBiomePredicate.java create mode 100644 common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/RandomChanceBiomePredicate.java create mode 100644 common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/SingleMatchBiomePredicate.java create mode 100644 common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/SpecificCaseBiomePredicate.java diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/ModernerBeta.java b/common/src/main/java/mod/bluestaggo/modernerbeta/ModernerBeta.java index aeff688a..11c1f72e 100644 --- a/common/src/main/java/mod/bluestaggo/modernerbeta/ModernerBeta.java +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/ModernerBeta.java @@ -1,6 +1,5 @@ package mod.bluestaggo.modernerbeta; -import com.google.common.reflect.TypeToken; import com.google.gson.GsonBuilder; import com.mojang.serialization.Codec; import me.shedaniel.autoconfig.AutoConfig; @@ -8,11 +7,9 @@ import me.shedaniel.autoconfig.serializer.GsonConfigSerializer; import mod.bluestaggo.modernerbeta.config.ModernBetaConfig; import mod.bluestaggo.modernerbeta.registry.IRegistryHandler; import mod.bluestaggo.modernerbeta.registry.ModernBetaRegistryKeys; -import mod.bluestaggo.modernerbeta.util.json.PoolJsonDeserializer; -import mod.bluestaggo.modernerbeta.util.json.PoolJsonSerializer; +import mod.bluestaggo.modernerbeta.util.CodecUtil; import mod.bluestaggo.modernerbeta.world.biome.ModernBetaBiomeSource; import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ConfiguredLayers; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ExtendedBiomeId; import mod.bluestaggo.modernerbeta.world.carver.ModernBetaCarvers; import mod.bluestaggo.modernerbeta.world.chunk.ModernBetaChunkGenerator; import mod.bluestaggo.modernerbeta.world.feature.ModernBetaFeatures; @@ -23,7 +20,6 @@ import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKey; import net.minecraft.util.Identifier; import net.minecraft.util.Pair; -import net.minecraft.util.collection.Pool; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.event.Level; @@ -82,14 +78,8 @@ public class ModernerBeta { } public static GsonBuilder getSettingsGson() { - GsonBuilder gson = new GsonBuilder() - .registerTypeAdapter(ConfiguredLayers.class, ConfiguredLayers.JsonSerializer.INSTANCE) - .registerTypeAdapter(ConfiguredLayers.class, ConfiguredLayers.JsonDeserializer.INSTANCE) - .registerTypeAdapter(ExtendedBiomeId.class, ExtendedBiomeId.JsonSerializer.INSTANCE) - .registerTypeAdapter(ExtendedBiomeId.class, ExtendedBiomeId.JsonDeserializer.INSTANCE); - var extendedBiomeIdPool = new TypeToken>() {}.getRawType(); - gson.registerTypeAdapter(extendedBiomeIdPool, new PoolJsonSerializer<>()) - .registerTypeAdapter(extendedBiomeIdPool, new PoolJsonDeserializer<>(ExtendedBiomeId.class)); + GsonBuilder gson = new GsonBuilder(); + CodecUtil.registerTypeAdapter(gson, ConfiguredLayers.class, ConfiguredLayers.CODEC); return gson; } } diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/api/registry/ModernBetaBuiltInRegistries.java b/common/src/main/java/mod/bluestaggo/modernerbeta/api/registry/ModernBetaBuiltInRegistries.java index 83a43a29..df1e5d31 100644 --- a/common/src/main/java/mod/bluestaggo/modernerbeta/api/registry/ModernBetaBuiltInRegistries.java +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/api/registry/ModernBetaBuiltInRegistries.java @@ -10,7 +10,8 @@ import mod.bluestaggo.modernerbeta.settings.ModernBetaSettingsChunk; import mod.bluestaggo.modernerbeta.settings.ModernBetaSettingsPreset; import mod.bluestaggo.modernerbeta.settings.ModernBetaSettingsPresetCategory; import mod.bluestaggo.modernerbeta.world.biome.HeightConfig; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.LayerType; +import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers.LayerType; +import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.predicates.BiomePredicateType; import mod.bluestaggo.modernerbeta.world.chunk.ModernBetaChunkGenerator; import net.minecraft.nbt.NbtCompound; import net.minecraft.registry.RegistryEntryLookup; @@ -28,6 +29,7 @@ public final class ModernBetaBuiltInRegistries { public static final ModernBetaRegistry SETTINGS_PRESET; public static final ModernBetaRegistry SETTINGS_PRESET_CATEGORY; public static final ModernBetaRegistry> FRACTAL_LAYER; + public static final ModernBetaRegistry> BIOME_PREDICATE; static { CHUNK = new ModernBetaRegistry<>("CHUNK"); @@ -40,6 +42,7 @@ public final class ModernBetaBuiltInRegistries { SETTINGS_PRESET = new ModernBetaRegistry<>("SETTINGS_PRESET"); SETTINGS_PRESET_CATEGORY = new ModernBetaRegistry<>("SETTINGS_PRESET_CATEGORIES"); FRACTAL_LAYER = new ModernBetaRegistry<>("FRACTAL_LAYER"); + BIOME_PREDICATE = new ModernBetaRegistry<>("BIOME_FILTER"); } @FunctionalInterface diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/client/gui/screen/ModernBetaBiomePreviewScreen.java b/common/src/main/java/mod/bluestaggo/modernerbeta/client/gui/screen/ModernBetaBiomePreviewScreen.java index 474d2333..d51ddfe7 100644 --- a/common/src/main/java/mod/bluestaggo/modernerbeta/client/gui/screen/ModernBetaBiomePreviewScreen.java +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/client/gui/screen/ModernBetaBiomePreviewScreen.java @@ -191,7 +191,7 @@ public class ModernBetaBiomePreviewScreen extends ModernBetaScreen { ); if (biomeProvider instanceof BiomeResolverStepped resolverStepped) { - MutableText stepName = Text.literal((step + 1) + "/" + resolverStepped.getStepCount() + ": "); + MutableText stepName = Text.literal((step + 1) + "/" + resolverStepped.getStepCount() + " - "); stepName.append(resolverStepped.getStepName(step)); context.fill(this.getX(), this.getY(), this.getX() + textRenderer.getWidth(stepName) + 8, this.getY() + 16, 0xAA000000); context.drawText(textRenderer, stepName, this.getX() + 4, this.getY() + 4, 0xFFFFFF, false); diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/client/gui/screen/ModernBetaSettingsScreen.java b/common/src/main/java/mod/bluestaggo/modernerbeta/client/gui/screen/ModernBetaSettingsScreen.java index 6890238b..acd898fe 100644 --- a/common/src/main/java/mod/bluestaggo/modernerbeta/client/gui/screen/ModernBetaSettingsScreen.java +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/client/gui/screen/ModernBetaSettingsScreen.java @@ -50,8 +50,8 @@ public class ModernBetaSettingsScreen extends ModernBetaScreen { this.client.setScreen(this.parent) ).dimensions(this.width / 2 + 4, this.height - 26, BUTTON_LENGTH, BUTTON_HEIGHT).build()); - int editBoxWidth = (int)(this.width * 0.8); - int editBoxHeight = (int)(this.height * 0.575); + int editBoxWidth = this.width - 16; + int editBoxHeight = this.height - 96; this.widgetSettings = new EditBoxWidget(this.textRenderer, 0, 0, editBoxWidth, editBoxHeight, Text.of(""), Text.translatable(TEXT_SETTINGS)); this.widgetSettings.setText(this.settingsString); diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/settings/ModernBetaSettings.java b/common/src/main/java/mod/bluestaggo/modernerbeta/settings/ModernBetaSettings.java index eaa1e3a9..eaeeefe3 100644 --- a/common/src/main/java/mod/bluestaggo/modernerbeta/settings/ModernBetaSettings.java +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/settings/ModernBetaSettings.java @@ -8,7 +8,7 @@ import org.slf4j.event.Level; public interface ModernBetaSettings { NbtCompound toCompound(); - public static void datafix(String tag, NbtReader reader, Runnable datafixer) { + static void datafix(String tag, NbtReader reader, Runnable datafixer) { if (reader.contains(tag)) { ModernerBeta.log(Level.INFO, String.format("Found old setting '%s', fixing..", tag)); datafixer.run(); diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/settings/ModernBetaSettingsPresets.java b/common/src/main/java/mod/bluestaggo/modernerbeta/settings/ModernBetaSettingsPresets.java index b85d49b1..bc919b6d 100644 --- a/common/src/main/java/mod/bluestaggo/modernerbeta/settings/ModernBetaSettingsPresets.java +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/settings/ModernBetaSettingsPresets.java @@ -7,6 +7,7 @@ import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ConfiguredLayers import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ExtendedBiomeId; import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers.*; import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.legacy.FractalSettings; +import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.predicates.BiomePredicate; import mod.bluestaggo.modernerbeta.world.biome.voronoi.VoronoiPointBiome; import mod.bluestaggo.modernerbeta.world.biome.voronoi.VoronoiPointCaveBiome; import mod.bluestaggo.modernerbeta.world.chunk.provider.indev.IndevTheme; @@ -1438,7 +1439,7 @@ public class ModernBetaSettingsPresets { "moderner_beta:late_beta_plains", "moderner_beta:late_beta_taiga" )), - new MaskLayer("land", 0, "land", Map.of(ExtendedBiomeId.PLAINS, "biome_pool")), + new BiomeToLayerOverlayLayer("land", 0, "land", Map.of(ExtendedBiomeId.PLAINS, "biome_pool")), new StackedZoomLayer("land", 1000, "land", 2, StackedZoomLayer.Type.MODAL), new ModalZoomLayer("land", 1000, "land"), AddLandLayer.forBeta("land", 3, "land"), @@ -1465,7 +1466,7 @@ public class ModernBetaSettingsPresets { new Weighted<>(ExtendedBiomeId.SNOWY_PLAINS, 1), new Weighted<>(ExtendedBiomeId.NULL, 4) )), - new MaskLayer("land", 0, "land", Map.of(ExtendedBiomeId.PLAINS, "snow")), + new BiomeToLayerOverlayLayer("land", 0, "land", Map.of(ExtendedBiomeId.PLAINS, "snow")), new ModalZoomLayer("land", 2002, "land"), AddLandLayer.forIslandScale("land", 3, "land"), new ModalZoomLayer("land", 2003, "land"), @@ -1474,7 +1475,13 @@ public class ModernBetaSettingsPresets { new Weighted<>(ExtendedBiomeId.MUSHROOM_ISLAND, 1), new Weighted<>(ExtendedBiomeId.NULL, 99) )), - new DiagonalInnerMaskLayer("land", 0, "land", Map.of(ExtendedBiomeId.OCEAN, "mushroom_islands")), + new PredicateOverlayLayer("land", 0, "land", List.of( + PredicateOverlayLayer.Target.layer( + BiomePredicate.of(ExtendedBiomeId.OCEAN) + .and(BiomePredicate.diagonalInterior()), + "mushroom_islands" + ) + )), new InitRiverLayer("river", 100, "land", false), new StackedZoomLayer("river", 1000, "river", 6 + biomeScale, StackedZoomLayer.Type.MODAL), new ComputeRiverLayer("river", 0, "river", true), @@ -1488,7 +1495,7 @@ public class ModernBetaSettingsPresets { "moderner_beta:late_beta_taiga" )), new ConstantBiomeLayer("ice_plains", 0, icePlains), - new MaskLayer("land", 0, "land", Map.of( + new BiomeToLayerOverlayLayer("land", 0, "land", Map.of( ExtendedBiomeId.PLAINS, "biome_pool", ExtendedBiomeId.FROZEN_OCEAN, "ice_plains", ExtendedBiomeId.SNOWY_PLAINS, "ice_plains" @@ -1496,7 +1503,13 @@ public class ModernBetaSettingsPresets { new StackedZoomLayer("land", 1000, "land", 2, StackedZoomLayer.Type.MODAL), new ModalZoomLayer("land", 1000, "land"), AddLandLayer.forEarlyRelease("land", 3, "land", icePlains), - new BorderLayer("land", 0, "land", List.of(BorderLayer.Case.MUSHROOM_SHORE)), + new PredicateOverlayLayer("land", 0, "land", List.of( + PredicateOverlayLayer.Target.biome( + BiomePredicate.of(ExtendedBiomeId.MUSHROOM_ISLAND) + .and(BiomePredicate.border()), + ExtendedBiomeId.MUSHROOM_SHORE + ) + )), new StackedZoomLayer("land", 1001, "land", 3 + biomeScale, StackedZoomLayer.Type.MODAL), new SmoothLayer("land", 1000, "land"), MixRiverLayer.forEarlyRelease("land", 0, "land", "river") diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/util/CodecUtil.java b/common/src/main/java/mod/bluestaggo/modernerbeta/util/CodecUtil.java index 4639a186..441df71e 100644 --- a/common/src/main/java/mod/bluestaggo/modernerbeta/util/CodecUtil.java +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/util/CodecUtil.java @@ -1,7 +1,10 @@ package mod.bluestaggo.modernerbeta.util; +import com.google.gson.*; import com.mojang.serialization.Codec; +import com.mojang.serialization.JsonOps; +import java.lang.reflect.Type; import java.util.ArrayList; import java.util.HashSet; import java.util.Set; @@ -10,4 +13,23 @@ public class CodecUtil { public static Codec> set(Codec elementType) { return elementType.listOf().xmap(HashSet::new, ArrayList::new); } + + public static void registerTypeAdapter(GsonBuilder gson, Class clazz, Codec codec) { + gson.registerTypeAdapter(clazz, new JsonSerializer<>(codec)); + gson.registerTypeAdapter(clazz, new JsonDeserializer<>(codec)); + } + + public record JsonSerializer(Codec codec) implements com.google.gson.JsonSerializer { + @Override + public JsonElement serialize(T src, Type typeOfSrc, JsonSerializationContext context) { + return codec.encodeStart(JsonOps.INSTANCE, src).getOrThrow(); + } + } + + public record JsonDeserializer(Codec codec) implements com.google.gson.JsonDeserializer { + @Override + public T deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + return codec.decode(JsonOps.INSTANCE, json).getOrThrow().getFirst(); + } + } } diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/util/json/PoolJsonSerializer.java b/common/src/main/java/mod/bluestaggo/modernerbeta/util/json/PoolJsonSerializer.java deleted file mode 100644 index a553757a..00000000 --- a/common/src/main/java/mod/bluestaggo/modernerbeta/util/json/PoolJsonSerializer.java +++ /dev/null @@ -1,18 +0,0 @@ -package mod.bluestaggo.modernerbeta.util.json; - -import com.google.common.reflect.TypeToken; -import com.google.gson.JsonElement; -import com.google.gson.JsonSerializationContext; -import com.google.gson.JsonSerializer; -import net.minecraft.util.collection.Pool; -import net.minecraft.util.collection.Weighted; - -import java.lang.reflect.Type; -import java.util.List; - -public class PoolJsonSerializer implements JsonSerializer> { - @Override - public JsonElement serialize(Pool src, Type typeOfSrc, JsonSerializationContext context) { - return context.serialize(src.getEntries(), new TypeToken>>() {}.getRawType()); - } -} diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/BiomeProviderFractal.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/BiomeProviderFractal.java index cc8a05bd..5640aa51 100644 --- a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/BiomeProviderFractal.java +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/BiomeProviderFractal.java @@ -1,8 +1,10 @@ package mod.bluestaggo.modernerbeta.world.biome.provider; +import com.google.common.base.Supplier; +import com.google.common.base.Suppliers; import mod.bluestaggo.modernerbeta.api.world.biome.*; import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ExtendedBiomeId; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.Layer; +import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers.Layer; import net.minecraft.nbt.NbtCompound; import net.minecraft.registry.RegistryEntryLookup; import net.minecraft.registry.RegistryKey; @@ -20,6 +22,7 @@ import java.util.Optional; import java.util.Set; public class BiomeProviderFractal extends BiomeProvider implements BiomeResolverBlock, BiomeResolverExtendedIdStepped, BiomeAccess.Storage { + private final Supplier> baseBiome; private final BiomeAccess biomeAccess; private final List> allBiomes; private final List allLayers; @@ -28,6 +31,7 @@ public class BiomeProviderFractal extends BiomeProvider implements BiomeResolver public BiomeProviderFractal(NbtCompound settings, RegistryEntryLookup biomeRegistry, long seed) { super(settings, biomeRegistry, seed); + this.baseBiome = Suppliers.memoize(() -> this.getBiomeEntry(Identifier.of(this.settings.singleBiome)).orElseThrow()); this.biomeAccess = new BiomeAccess(this, seed); this.allLayers = this.settings.fractalLayers.getAllLayers(); this.layer = this.settings.fractalLayers.getFinalLayer(); @@ -51,7 +55,7 @@ public class BiomeProviderFractal extends BiomeProvider implements BiomeResolver @Override public RegistryEntry getBiome(int biomeX, int biomeY, int biomeZ) { - return this.getBiomeEntry(this.getExtendedBiomeId(biomeX, biomeY, biomeZ).baseId()).orElseThrow(); + return this.getBiomeEntry(this.getExtendedBiomeId(biomeX, biomeY, biomeZ).baseId()).orElse(this.baseBiome.get()); } @Override diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/ConfiguredLayers.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/ConfiguredLayers.java index 56e18114..cdfde153 100644 --- a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/ConfiguredLayers.java +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/ConfiguredLayers.java @@ -1,10 +1,8 @@ package mod.bluestaggo.modernerbeta.world.biome.provider.fractal; -import com.google.gson.*; import com.mojang.serialization.Codec; -import mod.bluestaggo.modernerbeta.api.registry.ModernBetaBuiltInRegistries; +import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers.Layer; -import java.lang.reflect.Type; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Function; @@ -43,36 +41,4 @@ public class ConfiguredLayers { public Layer getFinalLayer() { return this.finalLayer; } - - public enum JsonSerializer implements com.google.gson.JsonSerializer { - INSTANCE; - - @Override - public JsonElement serialize(ConfiguredLayers configuredLayers, Type type, JsonSerializationContext jsonSerializationContext) { - JsonArray jsonArray = new JsonArray(); - for (Layer layer : configuredLayers.layers) { - JsonObject jsonLayer = jsonSerializationContext.serialize(layer).getAsJsonObject(); - jsonLayer.addProperty("type", ModernBetaBuiltInRegistries.FRACTAL_LAYER.getKey(layer.getType())); - jsonArray.add(jsonLayer); - } - return jsonArray; - } - } - - public enum JsonDeserializer implements com.google.gson.JsonDeserializer { - INSTANCE; - - @Override - public ConfiguredLayers deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { - List layers = new ArrayList<>(); - for (JsonElement subElement : jsonElement.getAsJsonArray()) { - JsonObject object = subElement.getAsJsonObject(); - String layerTypeId = object.get("type").getAsString(); - LayerType layerType = ModernBetaBuiltInRegistries.FRACTAL_LAYER.get(layerTypeId); - Layer layer = jsonDeserializationContext.deserialize(object, layerType.layerClass()); - layers.add(layer); - } - return new ConfiguredLayers(layers); - } - } } diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/ExtendedBiomeId.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/ExtendedBiomeId.java index e5ec856d..2078ffc3 100644 --- a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/ExtendedBiomeId.java +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/ExtendedBiomeId.java @@ -1,6 +1,5 @@ package mod.bluestaggo.modernerbeta.world.biome.provider.fractal; -import com.google.gson.*; import com.mojang.serialization.Codec; import com.mojang.serialization.DataResult; import net.minecraft.registry.RegistryKey; @@ -8,7 +7,6 @@ import net.minecraft.util.Identifier; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.BiomeKeys; -import java.lang.reflect.Type; import java.util.Arrays; import java.util.List; @@ -100,22 +98,4 @@ public record ExtendedBiomeId(Identifier baseId, String ext) { return Identifier.validate(string).flatMap(id -> DataResult.success(new ExtendedBiomeId(id, ext))); } - - public enum JsonSerializer implements com.google.gson.JsonSerializer { - INSTANCE; - - @Override - public JsonElement serialize(ExtendedBiomeId extendedBiomeId, Type type, JsonSerializationContext jsonSerializationContext) { - return new JsonPrimitive(extendedBiomeId.toString()); - } - } - - public enum JsonDeserializer implements com.google.gson.JsonDeserializer { - INSTANCE; - - @Override - public ExtendedBiomeId deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { - return ExtendedBiomeId.of(jsonElement.getAsString()); - } - } } diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/LayerType.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/LayerType.java deleted file mode 100644 index 23e967a1..00000000 --- a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/LayerType.java +++ /dev/null @@ -1,32 +0,0 @@ -package mod.bluestaggo.modernerbeta.world.biome.provider.fractal; - -import com.mojang.serialization.MapCodec; -import mod.bluestaggo.modernerbeta.api.registry.ModernBetaBuiltInRegistries; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers.*; - -public record LayerType(Class layerClass, MapCodec codec) { - public static final LayerType ADD_LAND = register("add_land", AddLandLayer.class, AddLandLayer.CODEC); - public static final LayerType BORDER = register("border", BorderLayer.class, BorderLayer.CODEC); - public static final LayerType COMPUTE_RIVER = register("compute_river", ComputeRiverLayer.class, ComputeRiverLayer.CODEC); - public static final LayerType CONSTANT_BIOME = register("constant_biome", ConstantBiomeLayer.class, ConstantBiomeLayer.CODEC); - public static final LayerType DIAGONAL_INNER_MASK = register("diagonal_inner_mask", DiagonalInnerMaskLayer.class, DiagonalInnerMaskLayer.CODEC); - public static final LayerType FUZZY_ZOOM = register("fuzzy_zoom", FuzzyZoomLayer.class, FuzzyZoomLayer.CODEC); - public static final LayerType INIT_LAND = register("init_land", InitLandLayer.class, InitLandLayer.CODEC); - public static final LayerType INNER_MASK = register("inner_mask", InnerMaskLayer.class, InnerMaskLayer.CODEC); - public static final LayerType INVERSE_MASK = register("inverse_mask", InverseMaskLayer.class, InverseMaskLayer.CODEC); - public static final LayerType MASK = register("mask", MaskLayer.class, MaskLayer.CODEC); - public static final LayerType MIX_RIVER = register("mix_river", MixRiverLayer.class, MixRiverLayer.CODEC); - public static final LayerType MODAL_ZOOM = register("modal_zoom", ModalZoomLayer.class, ModalZoomLayer.CODEC); - public static final LayerType POINT_ZOOM = register("point_zoom", PointZoomLayer.class, PointZoomLayer.CODEC); - public static final LayerType RANDOM_BIOME = register("random_biome", RandomBiomeLayer.class, RandomBiomeLayer.CODEC); - public static final LayerType INIT_RIVER = register("init_river", InitRiverLayer.class, InitRiverLayer.CODEC); - public static final LayerType SMOOTH = register("smooth", SmoothLayer.class, SmoothLayer.CODEC); - public static final LayerType STACKED_ZOOM = register("stacked_zoom", StackedZoomLayer.class, StackedZoomLayer.CODEC); - public static final LayerType WEIGHTED_BIOME = register("weighted_biome", WeightedBiomeLayer.class, WeightedBiomeLayer.CODEC); - - private static LayerType register(String id, Class layerClass, MapCodec codec) { - LayerType layerType = new LayerType<>(layerClass, codec); - ModernBetaBuiltInRegistries.FRACTAL_LAYER.register(id, layerType); - return layerType; - } -} diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/AddLandLayer.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/AddLandLayer.java index 98eeccf4..75b63dc7 100644 --- a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/AddLandLayer.java +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/AddLandLayer.java @@ -5,8 +5,6 @@ import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import mod.bluestaggo.modernerbeta.world.biome.ModernBetaBiomes; import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ExtendedBiomeId; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.LayerRandom; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.LayerType; import java.util.Map; import java.util.Set; @@ -57,7 +55,7 @@ public class AddLandLayer extends SingleParentLayer { } @Override - protected LayerType getType() { + public LayerType getType() { return LayerType.ADD_LAND; } @@ -66,40 +64,26 @@ public class AddLandLayer extends SingleParentLayer { ExtendedBiomeId base = this.parentLayer.sample(x, z); ExtendedBiomeId[] neighbors = this.parentLayer.sampleDiagonalNeighbors(x, z); - /* - if (this.betaShape) { - boolean addLand; - if (!base.equals(this.ocean) || allNeighborsEqual(neighbors, this.ocean)) { - if (!base.equals(this.land) || allNeighborsEqual(neighbors, this.land)) { - return base; - } - addLand = 1 - this.getRandom(x, z).nextInt(5) / 4 > 0; - } else { - addLand = this.getRandom(x, z).nextInt(3) / 2 > 0; - } - - if (addLand) { - return this.biomeSpecificOceans.containsKey(base) ? base : this.land; - } else { - return this.biomeSpecificOceans.getOrDefault(base, this.ocean); - } - } else { - */ if (base.equals(this.ocean) && !allNeighborsEqual(neighbors, this.ocean)) { int landSampleChance = 1; ExtendedBiomeId sampledLand = this.land; LayerRandom random = this.getRandom(x, z); + boolean addLand = false; + if (this.betaShape) { + addLand = random.nextInt(3) == 2; + } + for (ExtendedBiomeId neighbor : neighbors) { if (!neighbor.equals(this.ocean) && random.nextInt(landSampleChance++) == 0) { sampledLand = neighbor; } } - if (random.nextInt(3) == (this.betaShape ? 2 : 0)) { - return sampledLand; + if (!this.betaShape) { + addLand = random.nextInt(3) == 0; } - return this.biomeSpecificOceans.getOrDefault(sampledLand, this.ocean); + return addLand ? sampledLand : this.biomeSpecificOceans.getOrDefault(sampledLand, this.ocean); } else if (!base.equals(this.ocean) && neighborsContain(neighbors, this.ocean)) { LayerRandom random = this.getRandom(x, z); if (random.nextInt(5) == (this.betaShape ? 4 : 0)) { @@ -107,7 +91,6 @@ public class AddLandLayer extends SingleParentLayer { } } return base; -// } } @Override diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/BaseZoomLayer.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/BaseZoomLayer.java index 2c913c88..ba13b2f7 100644 --- a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/BaseZoomLayer.java +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/BaseZoomLayer.java @@ -1,7 +1,6 @@ package mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers; import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ExtendedBiomeId; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.LayerRandom; public abstract class BaseZoomLayer extends SingleParentLayer { public BaseZoomLayer(String id, long seed, String parent) { diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/MaskLayer.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/BiomeToLayerOverlayLayer.java similarity index 57% rename from common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/MaskLayer.java rename to common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/BiomeToLayerOverlayLayer.java index 7d2771b4..58d39c31 100644 --- a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/MaskLayer.java +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/BiomeToLayerOverlayLayer.java @@ -1,6 +1,5 @@ package mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers; -import com.mojang.datafixers.Products; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; @@ -13,34 +12,24 @@ import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; -public class MaskLayer extends SingleParentLayer { - public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( - instance -> fillMaskLayerFields(instance) - .apply(instance, MaskLayer::new) +public class BiomeToLayerOverlayLayer extends SingleParentLayer { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( + instance -> fillSingleParentLayerFields(instance) + .and(Codec.unboundedMap(ExtendedBiomeId.CODEC, Codec.STRING).fieldOf("targets").forGetter(layer -> layer.targets)) + .apply(instance, BiomeToLayerOverlayLayer::new) ); - protected final Map targets; - protected transient Map targetLayers; + private final Map targets; + private transient Map targetLayers; - protected static Products.P4< - RecordCodecBuilder.Mu, - String, - Long, - String, - Map - > fillMaskLayerFields(RecordCodecBuilder.Instance instance) { - return fillSingleParentLayerFields(instance) - .and(Codec.unboundedMap(ExtendedBiomeId.CODEC, Codec.STRING).fieldOf("targets").forGetter(layer -> layer.targets)); - } - - public MaskLayer(String id, long seed, String parent, Map targets) { + public BiomeToLayerOverlayLayer(String id, long seed, String parent, Map targets) { super(id, seed, parent); this.targets = targets; } @Override - protected LayerType getType() { - return LayerType.MASK; + public LayerType getType() { + return LayerType.BIOME_TO_LAYER_OVERLAY; } @Override @@ -54,7 +43,7 @@ public class MaskLayer extends SingleParentLayer { @Override protected ExtendedBiomeId generate(int x, int z) { ExtendedBiomeId baseBiome = this.parentLayer.sample(x, z); - Layer targetLayer = this.getTargetLayer(baseBiome, x, z); + Layer targetLayer = this.targetLayers.get(baseBiome); if (targetLayer == null) { return baseBiome; } @@ -78,8 +67,4 @@ public class MaskLayer extends SingleParentLayer { protected void addPossibleBiomes(Set biomes) { biomes.addAll(this.targets.keySet()); } - - protected Layer getTargetLayer(ExtendedBiomeId biome, int x, int z) { - return this.targetLayers.get(biome); - } } diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/BorderLayer.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/BorderLayer.java index 8e2eba35..ef29de5b 100644 --- a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/BorderLayer.java +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/BorderLayer.java @@ -1,12 +1,10 @@ package mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers; -import com.google.gson.annotations.SerializedName; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import mod.bluestaggo.modernerbeta.util.CodecUtil; import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ExtendedBiomeId; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.LayerType; import net.minecraft.util.StringIdentifiable; import java.util.*; @@ -26,7 +24,7 @@ public class BorderLayer extends SingleParentLayer { } @Override - protected LayerType getType() { + public LayerType getType() { return LayerType.BORDER; } @@ -76,28 +74,24 @@ public class BorderLayer extends SingleParentLayer { } public enum FilterType implements StringIdentifiable { - @SerializedName("all_match") ALL_MATCH("all_match") { @Override public boolean isSatisfied(ExtendedBiomeId[] neighbors, Set filter) { return allNeighborsInSet(neighbors, filter); } }, - @SerializedName("none_match") NONE_MATCH("none_match") { @Override public boolean isSatisfied(ExtendedBiomeId[] neighbors, Set filter) { return !anyNeighborsInSet(neighbors, filter); } }, - @SerializedName("any_match") ANY_MATCH("any_match") { @Override public boolean isSatisfied(ExtendedBiomeId[] neighbors, Set filter) { return anyNeighborsInSet(neighbors, filter); } }, - @SerializedName("not_all_match") NOT_ALL_MATCH("not_all_match") { @Override public boolean isSatisfied(ExtendedBiomeId[] neighbors, Set filter) { diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/ComputeRiverLayer.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/ComputeRiverLayer.java index fe91294c..210f8114 100644 --- a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/ComputeRiverLayer.java +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/ComputeRiverLayer.java @@ -4,7 +4,6 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ExtendedBiomeId; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.LayerType; import net.minecraft.world.biome.BiomeKeys; import static mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ExtendedBiomeId.*; @@ -24,7 +23,7 @@ public class ComputeRiverLayer extends SingleParentLayer { } @Override - protected LayerType getType() { + public LayerType getType() { return LayerType.COMPUTE_RIVER; } diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/ConditionalMaskLayer.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/ConditionalMaskLayer.java new file mode 100644 index 00000000..389d8fc7 --- /dev/null +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/ConditionalMaskLayer.java @@ -0,0 +1,78 @@ +package mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import mod.bluestaggo.modernerbeta.util.CodecUtil; +import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ExtendedBiomeId; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.function.Function; + +public class ConditionalMaskLayer extends SingleParentLayer { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( + instance -> fillSingleParentLayerFields(instance) + .and(instance.group( + CodecUtil.set(ExtendedBiomeId.CODEC).fieldOf("filter").forGetter(layer -> layer.filter), + Codec.STRING.fieldOf("ifSatisfied").forGetter(layer -> layer.ifSatisfied), + Codec.STRING.fieldOf("otherwise").forGetter(layer -> layer.otherwise) + )) + .apply(instance, ConditionalMaskLayer::new) + ); + + private final Set filter; + private final String ifSatisfied; + private final String otherwise; + private transient Layer ifSatisfiedLayer; + private transient Layer otherwiseLayer; + + public ConditionalMaskLayer(String id, long seed, String parent, Set filter, String ifSatisfied, String otherwise) { + super(id, seed, parent); + this.filter = filter; + this.ifSatisfied = ifSatisfied; + this.otherwise = otherwise; + } + + @Override + public void configure(Function layerMap) { + super.configure(layerMap); + this.ifSatisfiedLayer = !this.ifSatisfied.isEmpty() ? layerMap.apply(this.ifSatisfied) : null; + this.otherwiseLayer = !this.otherwise.isEmpty() ? layerMap.apply(this.otherwise) : null; + } + + @Override + public LayerType getType() { + return LayerType.CONDITIONAL_MASK; + } + + @Override + protected List getParents() { + List parents = new ArrayList<>(); + parents.add(this.parentLayer); + if (this.ifSatisfiedLayer != null) { + parents.add(this.ifSatisfiedLayer); + } + if (this.otherwiseLayer != null) { + parents.add(this.otherwiseLayer); + } + return parents; + } + + @Override + protected ExtendedBiomeId generate(int x, int z) { + ExtendedBiomeId biome = this.parentLayer.sample(x, z); + Layer layer = this.filter.contains(biome) ? this.ifSatisfiedLayer : this.otherwiseLayer; + if (layer == null) { + return biome; + } + + ExtendedBiomeId output = layer.sample(x, z); + if (ExtendedBiomeId.NULL.equals(output)) { + return biome; + } + + return output; + } +} diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/ConstantBiomeLayer.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/ConstantBiomeLayer.java index f9359493..0b5df0cd 100644 --- a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/ConstantBiomeLayer.java +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/ConstantBiomeLayer.java @@ -3,8 +3,6 @@ package mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ExtendedBiomeId; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.Layer; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.LayerType; import java.util.Set; @@ -23,7 +21,7 @@ public class ConstantBiomeLayer extends Layer { } @Override - protected LayerType getType() { + public LayerType getType() { return LayerType.CONSTANT_BIOME; } diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/DiagonalInnerMaskLayer.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/DiagonalInnerMaskLayer.java deleted file mode 100644 index 7192c1ea..00000000 --- a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/DiagonalInnerMaskLayer.java +++ /dev/null @@ -1,35 +0,0 @@ -package mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers; - -import com.mojang.serialization.MapCodec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ExtendedBiomeId; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.LayerType; - -import java.util.List; -import java.util.Map; -import java.util.Set; - -public class DiagonalInnerMaskLayer extends InnerMaskLayer { - public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( - instance -> fillInnerMaskLayerFields(instance) - .apply(instance, DiagonalInnerMaskLayer::new) - ); - - public DiagonalInnerMaskLayer(String id, long seed, String parent, Map targets, List> mergedRegions) { - super(id, seed, parent, targets, mergedRegions); - } - - public DiagonalInnerMaskLayer(String id, long seed, String parent, Map targets) { - super(id, seed, parent, targets); - } - - @Override - protected LayerType getType() { - return LayerType.DIAGONAL_INNER_MASK; - } - - @Override - protected ExtendedBiomeId[] getParentNeighbors(int x, int z) { - return this.parentLayer.sampleDiagonalNeighbors(x, z); - } -} diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/FuzzyZoomLayer.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/FuzzyZoomLayer.java index e9e024ed..9b3ab5f8 100644 --- a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/FuzzyZoomLayer.java +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/FuzzyZoomLayer.java @@ -3,8 +3,6 @@ package mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ExtendedBiomeId; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.LayerRandom; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.LayerType; public class FuzzyZoomLayer extends BaseZoomLayer { public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( @@ -17,7 +15,7 @@ public class FuzzyZoomLayer extends BaseZoomLayer { } @Override - protected LayerType getType() { + public LayerType getType() { return LayerType.FUZZY_ZOOM; } diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/InitLandLayer.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/InitLandLayer.java index c2a578e6..e656d523 100644 --- a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/InitLandLayer.java +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/InitLandLayer.java @@ -4,8 +4,6 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ExtendedBiomeId; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.Layer; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.LayerType; import java.util.Set; @@ -31,7 +29,7 @@ public class InitLandLayer extends Layer { } @Override - protected LayerType getType() { + public LayerType getType() { return LayerType.INIT_LAND; } diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/InitRiverLayer.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/InitRiverLayer.java index 75e42bb7..e664f21a 100644 --- a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/InitRiverLayer.java +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/InitRiverLayer.java @@ -4,8 +4,6 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ExtendedBiomeId; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.LayerRandom; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.LayerType; import static mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ExtendedBiomeId.*; @@ -24,7 +22,7 @@ public class InitRiverLayer extends SingleParentLayer { } @Override - protected LayerType getType() { + public LayerType getType() { return LayerType.INIT_RIVER; } diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/InnerMaskLayer.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/InnerMaskLayer.java deleted file mode 100644 index 8d15031b..00000000 --- a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/InnerMaskLayer.java +++ /dev/null @@ -1,80 +0,0 @@ -package mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers; - -import com.mojang.datafixers.Products; -import com.mojang.serialization.MapCodec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import mod.bluestaggo.modernerbeta.util.CodecUtil; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ExtendedBiomeId; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.Layer; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.LayerType; - -import java.util.*; - -public class InnerMaskLayer extends MaskLayer { - public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( - instance -> fillInnerMaskLayerFields(instance) - .apply(instance, InnerMaskLayer::new) - ); - - protected static Products.P5< - RecordCodecBuilder.Mu, - String, - Long, - String, - Map, - List> - > fillInnerMaskLayerFields(RecordCodecBuilder.Instance instance) { - return fillMaskLayerFields(instance) - .and(CodecUtil.set(ExtendedBiomeId.CODEC).listOf().fieldOf("mergedRegions").forGetter(layer -> layer.mergedRegions)); - } - - protected final List> mergedRegions; - protected transient final Map>> mergedRegionMap; - - public InnerMaskLayer(String id, long seed, String parent, Map targets, List> mergedRegions) { - super(id, seed, parent, targets); - this.mergedRegions = mergedRegions; - - Map>> mergedRegionMap = new HashMap<>(); - for (Set mergedRegion : mergedRegions) { - for (ExtendedBiomeId biome : mergedRegion) { - mergedRegionMap.computeIfAbsent(biome, b -> new ArrayList<>()).add(mergedRegion); - } - } - this.mergedRegionMap = mergedRegionMap; - } - - public InnerMaskLayer(String id, long seed, String parent, Map targets) { - this(id, seed, parent, targets, List.of()); - } - - @Override - protected LayerType getType() { - return LayerType.INNER_MASK; - } - - @Override - protected Layer getTargetLayer(ExtendedBiomeId biome, int x, int z) { - ExtendedBiomeId[] neighbors = this.getParentNeighbors(x, z); - if (allNeighborsEqual(neighbors, biome)) { - return super.getTargetLayer(biome, x, z); - } - - List> mergedRegions = this.mergedRegionMap.get(biome); - if (mergedRegions == null) { - return null; - } - - for (Set mergedRegion : mergedRegions) { - if (allNeighborsInSet(neighbors, mergedRegion)) { - return super.getTargetLayer(biome, x, z); - } - } - - return null; - } - - protected ExtendedBiomeId[] getParentNeighbors(int x, int z) { - return this.parentLayer.sampleNeighbors(x, z); - } -} diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/InverseMaskLayer.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/InverseMaskLayer.java deleted file mode 100644 index ee510630..00000000 --- a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/InverseMaskLayer.java +++ /dev/null @@ -1,65 +0,0 @@ -package mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers; - -import com.mojang.serialization.Codec; -import com.mojang.serialization.MapCodec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import mod.bluestaggo.modernerbeta.util.CodecUtil; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ExtendedBiomeId; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.Layer; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.LayerType; - -import java.util.List; -import java.util.Set; -import java.util.function.Function; - -public class InverseMaskLayer extends SingleParentLayer { - public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( - instance -> fillSingleParentLayerFields(instance) - .and(instance.group( - Codec.STRING.fieldOf("operator").forGetter(layer -> layer.operator), - CodecUtil.set(ExtendedBiomeId.CODEC).fieldOf("excludedBiomes").forGetter(layer -> layer.excludedBiomes) - )) - .apply(instance, InverseMaskLayer::new) - ); - - private final String operator; - private final Set excludedBiomes; - private transient Layer operatorLayer; - - public InverseMaskLayer(String id, long seed, String parent, String operator, Set excludedBiomes) { - super(id, seed, parent); - this.operator = operator; - this.excludedBiomes = excludedBiomes; - } - - @Override - public void configure(Function layerMap) { - super.configure(layerMap); - this.operatorLayer = layerMap.apply(this.operator); - } - - @Override - protected LayerType getType() { - return LayerType.INVERSE_MASK; - } - - @Override - protected List getParents() { - return List.of(this.parentLayer, this.operatorLayer); - } - - @Override - protected ExtendedBiomeId generate(int x, int z) { - ExtendedBiomeId biome = this.parentLayer.sample(x, z); - if (this.excludedBiomes.contains(biome)) { - return biome; - } - - ExtendedBiomeId operatorOutput = this.operatorLayer.sample(x, z); - if (ExtendedBiomeId.NULL.equals(operatorOutput)) { - return biome; - } - - return operatorOutput; - } -} diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/Layer.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/Layer.java similarity index 83% rename from common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/Layer.java rename to common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/Layer.java index 29da6bdc..4d717c75 100644 --- a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/Layer.java +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/Layer.java @@ -1,10 +1,11 @@ -package mod.bluestaggo.modernerbeta.world.biome.provider.fractal; +package mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers; import com.mojang.datafixers.Products; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap; import mod.bluestaggo.modernerbeta.api.registry.ModernBetaBuiltInRegistries; +import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ExtendedBiomeId; import net.minecraft.util.math.ColumnPos; import net.minecraft.world.biome.source.SeedMixer; @@ -17,7 +18,8 @@ import java.util.stream.Collectors; public abstract class Layer { private final static int CACHE_CAPACITY = 25; - public static final Codec TYPE_CODEC = ModernBetaBuiltInRegistries.FRACTAL_LAYER.getCodec().dispatch(Layer::getType, LayerType::codec); + public static final Codec TYPE_CODEC = ModernBetaBuiltInRegistries.FRACTAL_LAYER.getCodec() + .dispatch(Layer::getType, LayerType::codec); public final String id; public final long seed; @@ -49,7 +51,7 @@ public abstract class Layer { this.saltedSeed = saltedSeed; } - protected abstract LayerType getType(); + public abstract LayerType getType(); protected abstract ExtendedBiomeId generate(int x, int z); @@ -121,19 +123,19 @@ public abstract class Layer { }; } - protected static boolean allNeighborsEqual(ExtendedBiomeId[] neighbors, ExtendedBiomeId i) { + public static boolean allNeighborsEqual(ExtendedBiomeId[] neighbors, ExtendedBiomeId i) { return neighbors[0].equals(i) && neighbors[1].equals(i) && neighbors[2].equals(i) && neighbors[3].equals(i); } - protected static boolean allNeighborsInSet(ExtendedBiomeId[] neighbors, Collection set) { + public static boolean allNeighborsInSet(ExtendedBiomeId[] neighbors, Collection set) { return set.contains(neighbors[0]) && set.contains(neighbors[1]) && set.contains(neighbors[2]) && set.contains(neighbors[3]); } - protected static boolean neighborsContain(ExtendedBiomeId[] neighbors, ExtendedBiomeId i) { + public static boolean neighborsContain(ExtendedBiomeId[] neighbors, ExtendedBiomeId i) { return neighbors[0].equals(i) || neighbors[1].equals(i) || neighbors[2].equals(i) || neighbors[3].equals(i); } - protected static boolean anyNeighborsInSet(ExtendedBiomeId[] neighbors, Collection set) { + public static boolean anyNeighborsInSet(ExtendedBiomeId[] neighbors, Collection set) { return set.contains(neighbors[0]) || set.contains(neighbors[1]) || set.contains(neighbors[2]) || set.contains(neighbors[3]); } @@ -144,9 +146,13 @@ public abstract class Layer { this.addPossibleBiomes(biomes); } + protected String getName() { + return ModernBetaBuiltInRegistries.FRACTAL_LAYER.getKey(this.getType()); + } + @Override public String toString() { - String string = this.id + ": " + ModernBetaBuiltInRegistries.FRACTAL_LAYER.getKey(this.getType()) + " " + this.seed; + String string = this.id + ": " + this.getName() + " " + this.seed; List parents = this.getParents(); if (!parents.isEmpty()) { string += " <- " + parents.stream() diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/LayerRandom.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/LayerRandom.java similarity index 96% rename from common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/LayerRandom.java rename to common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/LayerRandom.java index 6fa3ce1e..02c5fbc2 100644 --- a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/LayerRandom.java +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/LayerRandom.java @@ -1,4 +1,4 @@ -package mod.bluestaggo.modernerbeta.world.biome.provider.fractal; +package mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers; import net.minecraft.util.math.random.GaussianGenerator; import net.minecraft.util.math.random.Random; diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/LayerType.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/LayerType.java new file mode 100644 index 00000000..d927c5ad --- /dev/null +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/LayerType.java @@ -0,0 +1,31 @@ +package mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers; + +import com.mojang.serialization.MapCodec; +import mod.bluestaggo.modernerbeta.api.registry.ModernBetaBuiltInRegistries; + +public record LayerType(MapCodec codec) { + public static final LayerType ADD_LAND = register("add_land", AddLandLayer.CODEC); + public static final LayerType BIOME_TO_LAYER_OVERLAY = register("biome_to_layer_overlay", BiomeToLayerOverlayLayer.CODEC); + public static final LayerType BORDER = register("border", BorderLayer.CODEC); + public static final LayerType COMPUTE_RIVER = register("compute_river", ComputeRiverLayer.CODEC); + public static final LayerType CONDITIONAL_MASK = register("conditional_mask", ConditionalMaskLayer.CODEC); + public static final LayerType CONSTANT_BIOME = register("constant_biome", ConstantBiomeLayer.CODEC); + public static final LayerType FUZZY_ZOOM = register("fuzzy_zoom", FuzzyZoomLayer.CODEC); + public static final LayerType INIT_LAND = register("init_land", InitLandLayer.CODEC); + public static final LayerType INIT_RIVER = register("init_river", InitRiverLayer.CODEC); + public static final LayerType MIX_RIVER = register("mix_river", MixRiverLayer.CODEC); + public static final LayerType MODAL_ZOOM = register("modal_zoom", ModalZoomLayer.CODEC); + public static final LayerType POINT_ZOOM = register("point_zoom", PointZoomLayer.CODEC); + public static final LayerType PREDICATE_OVERLAY = register("predicate_overlay", PredicateOverlayLayer.CODEC); + public static final LayerType RANDOM_BIOME = register("random_biome", RandomBiomeLayer.CODEC); + public static final LayerType SIMPLE_BIOME_REPLACEMENT = register("simple_biome_replacement", SimpleBiomeReplacementLayer.CODEC); + public static final LayerType SMOOTH = register("smooth", SmoothLayer.CODEC); + public static final LayerType STACKED_ZOOM = register("stacked_zoom", StackedZoomLayer.CODEC); + public static final LayerType WEIGHTED_BIOME = register("weighted_biome", WeightedBiomeLayer.CODEC); + + private static LayerType register(String id, MapCodec codec) { + LayerType layerType = new LayerType<>(codec); + ModernBetaBuiltInRegistries.FRACTAL_LAYER.register(id, layerType); + return layerType; + } +} diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/MixRiverLayer.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/MixRiverLayer.java index 6c4df896..70894493 100644 --- a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/MixRiverLayer.java +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/MixRiverLayer.java @@ -6,8 +6,6 @@ import com.mojang.serialization.codecs.RecordCodecBuilder; import mod.bluestaggo.modernerbeta.util.CodecUtil; import mod.bluestaggo.modernerbeta.world.biome.ModernBetaBiomes; import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ExtendedBiomeId; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.Layer; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.LayerType; import java.util.*; import java.util.function.Function; @@ -52,7 +50,7 @@ public class MixRiverLayer extends SingleParentLayer { } @Override - protected LayerType getType() { + public LayerType getType() { return LayerType.MIX_RIVER; } diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/ModalZoomLayer.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/ModalZoomLayer.java index 86ccfb1b..d5cc7405 100644 --- a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/ModalZoomLayer.java +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/ModalZoomLayer.java @@ -3,8 +3,6 @@ package mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ExtendedBiomeId; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.LayerRandom; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.LayerType; public class ModalZoomLayer extends FuzzyZoomLayer { public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( @@ -17,7 +15,7 @@ public class ModalZoomLayer extends FuzzyZoomLayer { } @Override - protected LayerType getType() { + public LayerType getType() { return LayerType.MODAL_ZOOM; } diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/PointZoomLayer.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/PointZoomLayer.java index a3e8ab34..81caa12e 100644 --- a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/PointZoomLayer.java +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/PointZoomLayer.java @@ -4,7 +4,6 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ExtendedBiomeId; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.LayerType; public class PointZoomLayer extends SingleParentLayer { public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( @@ -21,7 +20,7 @@ public class PointZoomLayer extends SingleParentLayer { } @Override - protected LayerType getType() { + public LayerType getType() { return LayerType.POINT_ZOOM; } diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/PredicateOverlayLayer.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/PredicateOverlayLayer.java new file mode 100644 index 00000000..a26ad410 --- /dev/null +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/PredicateOverlayLayer.java @@ -0,0 +1,130 @@ +package mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers; + +import com.google.common.base.Suppliers; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ExtendedBiomeId; +import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.predicates.BiomePredicate; +import net.minecraft.util.StringIdentifiable; + +import java.util.List; +import java.util.function.Function; +import java.util.function.Supplier; +import java.util.stream.Stream; + +public class PredicateOverlayLayer extends SingleParentLayer { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( + instance -> fillSingleParentLayerFields(instance) + .and(Target.CODEC.listOf().fieldOf("targets").forGetter(layer -> layer.targets)) + .apply(instance, PredicateOverlayLayer::new) + ); + + private final List targets; + private transient List targetLayers; + + public PredicateOverlayLayer(String id, long seed, String parent, List targets) { + super(id, seed, parent); + this.targets = targets; + } + + @Override + public LayerType getType() { + return LayerType.PREDICATE_OVERLAY; + } + + @Override + protected List getParents() { + return Stream.concat( + Stream.of(this.parentLayer), + this.targetLayers.stream() + .filter(target -> target instanceof ConfiguredLayerTarget) + .map(ConfiguredLayerTarget.class::cast) + .map(ConfiguredLayerTarget::layer) + ).toList(); + } + + @Override + protected ExtendedBiomeId generate(int x, int z) { + ExtendedBiomeId baseBiome = this.parentLayer.sample(x, z); + for (ConfiguredTarget target : this.targetLayers) { + Supplier randomSupplier = Suppliers.memoize(() -> this.getRandom(x, z)); + if (target.predicate().satisfies(baseBiome, this.parentLayer, randomSupplier, x, z)) { + ExtendedBiomeId result = target.sample(x, z); + if (ExtendedBiomeId.NULL.equals(result)) { + return baseBiome; + } + return result; + } + } + return baseBiome; + } + + @Override + public void configure(Function layerMap) { + super.configure(layerMap); + this.targetLayers = this.targets.stream() + .map(target -> target.configure(layerMap)) + .toList(); + } + + public record Target(BiomePredicate predicate, String result, Type type) { + public static final Codec CODEC = RecordCodecBuilder.create( + instance -> instance.group( + BiomePredicate.BASE_CODEC.fieldOf("predicate").forGetter(Target::predicate), + Codec.STRING.fieldOf("result").forGetter(Target::result), + StringIdentifiable.createCodec(Type::values).fieldOf("type").orElse(Type.BIOME).forGetter(Target::type) + ).apply(instance, Target::new) + ); + + public static Target layer(BiomePredicate predicate, String layer) { + return new Target(predicate, layer, Type.LAYER); + } + + public static Target biome(BiomePredicate predicate, ExtendedBiomeId biome) { + return new Target(predicate, biome.toString(), Type.BIOME); + } + + private ConfiguredTarget configure(Function layerMap) { + return switch (this.type) { + case LAYER -> new ConfiguredLayerTarget(this.predicate, layerMap.apply(this.result)); + case BIOME -> new ConfiguredBiomeTarget(this.predicate, ExtendedBiomeId.of(this.result)); + }; + } + + public enum Type implements StringIdentifiable { + LAYER("layer"), + BIOME("biome"); + + private final String id; + + Type(String id) { + this.id = id; + } + + @Override + public String asString() { + return this.id; + } + } + } + + private interface ConfiguredTarget { + BiomePredicate predicate(); + ExtendedBiomeId sample(int x, int z); + } + + private record ConfiguredLayerTarget(BiomePredicate predicate, Layer layer) implements ConfiguredTarget { + @Override + public ExtendedBiomeId sample(int x, int z) { + return this.layer.sample(x, z); + } + } + + private record ConfiguredBiomeTarget(BiomePredicate predicate, ExtendedBiomeId biome) implements ConfiguredTarget { + @Override + public ExtendedBiomeId sample(int x, int z) { + return this.biome; + } + } +} diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/RandomBiomeLayer.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/RandomBiomeLayer.java index f5ba8d2a..c7d936de 100644 --- a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/RandomBiomeLayer.java +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/RandomBiomeLayer.java @@ -3,9 +3,6 @@ package mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ExtendedBiomeId; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.Layer; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.LayerRandom; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.LayerType; import java.util.List; import java.util.Set; @@ -25,7 +22,7 @@ public class RandomBiomeLayer extends Layer { } @Override - protected LayerType getType() { + public LayerType getType() { return LayerType.RANDOM_BIOME; } diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/SimpleBiomeReplacementLayer.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/SimpleBiomeReplacementLayer.java new file mode 100644 index 00000000..a05deed5 --- /dev/null +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/SimpleBiomeReplacementLayer.java @@ -0,0 +1,52 @@ +package mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ExtendedBiomeId; + +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class SimpleBiomeReplacementLayer extends SingleParentLayer { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( + instance -> fillSingleParentLayerFields(instance) + .and(Codec.unboundedMap(ExtendedBiomeId.CODEC, ExtendedBiomeId.CODEC).fieldOf("targets").forGetter(layer -> layer.targets)) + .apply(instance, SimpleBiomeReplacementLayer::new) + ); + + private final Map targets; + + public SimpleBiomeReplacementLayer(String id, long seed, String parent, Map targets) { + super(id, seed, parent); + this.targets = targets; + } + + @Override + public LayerType getType() { + return LayerType.SIMPLE_BIOME_REPLACEMENT; + } + + @Override + protected ExtendedBiomeId generate(int x, int z) { + ExtendedBiomeId biome = this.parentLayer.sample(x, z); + return this.targets.getOrDefault(biome, biome); + } + + @Override + public synchronized ExtendedBiomeId sample(int x, int z) { + return this.generate(x, z); + } + + @Override + protected void addPossibleBiomes(Set biomes) { + this.targets.entrySet().stream() + .filter(target -> biomes.contains(target.getKey())) + .map(Map.Entry::getValue) + .forEach(biomes::add); + } +} diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/SingleParentLayer.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/SingleParentLayer.java index b4d006aa..25da8e60 100644 --- a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/SingleParentLayer.java +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/SingleParentLayer.java @@ -3,7 +3,6 @@ package mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers; import com.mojang.datafixers.Products; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.Layer; import java.util.Collections; import java.util.List; diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/SmoothLayer.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/SmoothLayer.java index 9b1d9979..fb5ae82d 100644 --- a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/SmoothLayer.java +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/SmoothLayer.java @@ -3,7 +3,6 @@ package mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ExtendedBiomeId; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.LayerType; public class SmoothLayer extends SingleParentLayer { public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( @@ -16,7 +15,7 @@ public class SmoothLayer extends SingleParentLayer { } @Override - protected LayerType getType() { + public LayerType getType() { return LayerType.SMOOTH; } diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/StackedZoomLayer.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/StackedZoomLayer.java index b6536719..5564a883 100644 --- a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/StackedZoomLayer.java +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/StackedZoomLayer.java @@ -1,12 +1,9 @@ package mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers; -import com.google.gson.annotations.SerializedName; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ExtendedBiomeId; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.Layer; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.LayerType; import net.minecraft.util.StringIdentifiable; import java.util.List; @@ -18,7 +15,7 @@ public class StackedZoomLayer extends SingleParentLayer { instance -> fillSingleParentLayerFields(instance) .and(instance.group( Codec.INT.fieldOf("level").orElse(1).forGetter(layer -> layer.level), - StringIdentifiable.createCodec(Type::values).fieldOf("fuzzy").orElse(Type.MODAL).forGetter(layer -> layer.zoomType) + StringIdentifiable.createCodec(Type::values).fieldOf("zoomType").orElse(Type.MODAL).forGetter(layer -> layer.zoomType) )) .apply(instance, StackedZoomLayer::new) ); @@ -47,7 +44,7 @@ public class StackedZoomLayer extends SingleParentLayer { } @Override - protected LayerType getType() { + public LayerType getType() { return LayerType.STACKED_ZOOM; } @@ -66,10 +63,13 @@ public class StackedZoomLayer extends SingleParentLayer { return List.of(this.parentLayer, this.stackedLayer); } + @Override + protected String getName() { + return super.getName() + "(" + this.zoomType.id + ")"; + } + public enum Type implements StringIdentifiable { - @SerializedName("modal") MODAL("modal", seed -> new ModalZoomLayer("", seed, "")), - @SerializedName("fuzzy") FUZZY("fuzzy", seed -> new FuzzyZoomLayer("", seed, "")); public final String id; diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/WeightedBiomeLayer.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/WeightedBiomeLayer.java index 6961e1af..4830a3ae 100644 --- a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/WeightedBiomeLayer.java +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/layers/WeightedBiomeLayer.java @@ -3,8 +3,6 @@ package mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ExtendedBiomeId; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.Layer; -import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.LayerType; import net.minecraft.util.collection.Pool; import net.minecraft.util.collection.Weighted; @@ -25,7 +23,7 @@ public class WeightedBiomeLayer extends Layer { } @Override - protected LayerType getType() { + public LayerType getType() { return LayerType.WEIGHTED_BIOME; } diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/AllOfBiomePredicate.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/AllOfBiomePredicate.java new file mode 100644 index 00000000..9d202e8e --- /dev/null +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/AllOfBiomePredicate.java @@ -0,0 +1,48 @@ +package mod.bluestaggo.modernerbeta.world.biome.provider.fractal.predicates; + +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ExtendedBiomeId; +import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers.Layer; +import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers.LayerRandom; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; + +public class AllOfBiomePredicate extends BiomePredicate { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( + instance -> instance + .group( + BiomePredicate.BASE_CODEC.listOf().fieldOf("terms").forGetter(predicate -> predicate.terms) + ) + .apply(instance, AllOfBiomePredicate::new) + ); + + private final List terms; + + public AllOfBiomePredicate(List terms) { + this.terms = terms; + } + + public BiomePredicate and(BiomePredicate other) { + List terms = new ArrayList<>(this.terms); + terms.add(other); + return new AllOfBiomePredicate(terms); + } + + @Override + public BiomePredicateType getType() { + return BiomePredicateType.ALL_OF; + } + + @Override + public boolean satisfies(ExtendedBiomeId biome, Layer layer, Supplier randomSupplier, int x, int z) { + for (BiomePredicate term : this.terms) { + if (!term.satisfies(biome, layer, randomSupplier, x, z)) { + return false; + } + } + return true; + } +} diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/AnyOfBiomePredicate.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/AnyOfBiomePredicate.java new file mode 100644 index 00000000..445e6ffa --- /dev/null +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/AnyOfBiomePredicate.java @@ -0,0 +1,48 @@ +package mod.bluestaggo.modernerbeta.world.biome.provider.fractal.predicates; + +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ExtendedBiomeId; +import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers.Layer; +import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers.LayerRandom; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; + +public class AnyOfBiomePredicate extends BiomePredicate { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( + instance -> instance + .group( + BiomePredicate.BASE_CODEC.listOf().fieldOf("terms").forGetter(predicate -> predicate.terms) + ) + .apply(instance, AnyOfBiomePredicate::new) + ); + + private final List terms; + + public AnyOfBiomePredicate(List terms) { + this.terms = terms; + } + + public BiomePredicate or(BiomePredicate other) { + List terms = new ArrayList<>(this.terms); + terms.add(other); + return new AnyOfBiomePredicate(terms); + } + + @Override + public BiomePredicateType getType() { + return BiomePredicateType.ANY_OF; + } + + @Override + public boolean satisfies(ExtendedBiomeId biome, Layer layer, Supplier randomSupplier, int x, int z) { + for (BiomePredicate term : this.terms) { + if (term.satisfies(biome, layer, randomSupplier, x, z)) { + return true; + } + } + return false; + } +} diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/BiomePredicate.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/BiomePredicate.java new file mode 100644 index 00000000..96a434b0 --- /dev/null +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/BiomePredicate.java @@ -0,0 +1,76 @@ +package mod.bluestaggo.modernerbeta.world.biome.provider.fractal.predicates; + +import com.mojang.serialization.Codec; +import mod.bluestaggo.modernerbeta.api.registry.ModernBetaBuiltInRegistries; +import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ExtendedBiomeId; +import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers.Layer; +import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers.LayerRandom; + +import java.util.List; +import java.util.Set; +import java.util.function.Supplier; + +public abstract class BiomePredicate { + public static final Codec BASE_CODEC = ModernBetaBuiltInRegistries.BIOME_PREDICATE.getCodec() + .dispatch("condition", BiomePredicate::getType, BiomePredicateType::codec); + + public static BiomePredicate allOf(BiomePredicate... predicates) { + return new AllOfBiomePredicate(List.of(predicates)); + } + + public static BiomePredicate anyOf(BiomePredicate... predicates) { + return new AnyOfBiomePredicate(List.of(predicates)); + } + + public static BiomePredicate anyOf(ExtendedBiomeId... biomes) { + return new InSetBiomePredicate(Set.of(biomes)); + } + + public static BiomePredicate border() { + return new InteriorBiomePredicate(InteriorBiomePredicate.Type.BORDER); + } + + public static BiomePredicate diagonalBorder() { + return new InteriorBiomePredicate(InteriorBiomePredicate.Type.DIAGONAL_BORDER); + } + + public static BiomePredicate diagonalInterior() { + return new InteriorBiomePredicate(InteriorBiomePredicate.Type.DIAGONAL_INTERIOR); + } + + public static BiomePredicate interior() { + return new InteriorBiomePredicate(InteriorBiomePredicate.Type.INTERIOR); + } + + public static BiomePredicate of(ExtendedBiomeId biome) { + return new SingleMatchBiomePredicate(biome); + } + + public static BiomePredicate oneIn(int chance) { + return new RandomChanceBiomePredicate(1, chance); + } + + public static BiomePredicate randomChance(int numerator, int denominator) { + return new RandomChanceBiomePredicate(numerator, denominator); + } + + public BiomePredicate and(BiomePredicate other) { + return new AllOfBiomePredicate(List.of(this, other)); + } + + public BiomePredicate or(BiomePredicate other) { + return new AnyOfBiomePredicate(List.of(this, other)); + } + + public BiomePredicate invert() { + return new InvertedBiomePredicate(this); + } + + public BiomePredicate specificCase(ExtendedBiomeId... biomes) { + return new SpecificCaseBiomePredicate(this, Set.of(biomes)); + } + + public abstract BiomePredicateType getType(); + + public abstract boolean satisfies(ExtendedBiomeId biome, Layer layer, Supplier randomSupplier, int x, int z); +} \ No newline at end of file diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/BiomePredicateType.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/BiomePredicateType.java new file mode 100644 index 00000000..ebe2fffa --- /dev/null +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/BiomePredicateType.java @@ -0,0 +1,21 @@ +package mod.bluestaggo.modernerbeta.world.biome.provider.fractal.predicates; + +import com.mojang.serialization.MapCodec; +import mod.bluestaggo.modernerbeta.api.registry.ModernBetaBuiltInRegistries; + +public record BiomePredicateType(MapCodec codec) { + public static final BiomePredicateType ALL_OF = register("all_of", AllOfBiomePredicate.CODEC); + public static final BiomePredicateType ANY_OF = register("any_of", AnyOfBiomePredicate.CODEC); + public static final BiomePredicateType IN_SET = register("in_set", InSetBiomePredicate.CODEC); + public static final BiomePredicateType INTERIOR = register("interior", InteriorBiomePredicate.CODEC); + public static final BiomePredicateType INVERTED = register("inverted", InvertedBiomePredicate.CODEC); + public static final BiomePredicateType RANDOM_CHANCE = register("random_chance", RandomChanceBiomePredicate.CODEC); + public static final BiomePredicateType SINGLE_MATCH = register("single_match", SingleMatchBiomePredicate.CODEC); + public static final BiomePredicateType SPECIFIC_CASE = register("specific_case", SpecificCaseBiomePredicate.CODEC); + + private static BiomePredicateType register(String id, MapCodec codec) { + BiomePredicateType filterType = new BiomePredicateType<>(codec); + ModernBetaBuiltInRegistries.BIOME_PREDICATE.register(id, filterType); + return filterType; + } +} diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/InSetBiomePredicate.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/InSetBiomePredicate.java new file mode 100644 index 00000000..a188dcb2 --- /dev/null +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/InSetBiomePredicate.java @@ -0,0 +1,37 @@ +package mod.bluestaggo.modernerbeta.world.biome.provider.fractal.predicates; + +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import mod.bluestaggo.modernerbeta.util.CodecUtil; +import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ExtendedBiomeId; +import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers.Layer; +import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers.LayerRandom; + +import java.util.Set; +import java.util.function.Supplier; + +public class InSetBiomePredicate extends BiomePredicate { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( + instance -> instance + .group( + CodecUtil.set(ExtendedBiomeId.CODEC).fieldOf("biomes").forGetter(predicate -> predicate.biomes) + ) + .apply(instance, InSetBiomePredicate::new) + ); + + private final Set biomes; + + public InSetBiomePredicate(Set biomes) { + this.biomes = biomes; + } + + @Override + public BiomePredicateType getType() { + return BiomePredicateType.IN_SET; + } + + @Override + public boolean satisfies(ExtendedBiomeId biome, Layer layer, Supplier randomSupplier, int x, int z) { + return this.biomes.contains(biome); + } +} diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/InteriorBiomePredicate.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/InteriorBiomePredicate.java new file mode 100644 index 00000000..7a90863d --- /dev/null +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/InteriorBiomePredicate.java @@ -0,0 +1,80 @@ +package mod.bluestaggo.modernerbeta.world.biome.provider.fractal.predicates; + +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ExtendedBiomeId; +import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers.Layer; +import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers.LayerRandom; +import net.minecraft.util.StringIdentifiable; + +import java.util.function.Supplier; + +public class InteriorBiomePredicate extends BiomePredicate { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( + instance -> instance + .group( + StringIdentifiable.createCodec(Type::values).fieldOf("type").orElse(Type.INTERIOR).forGetter(predicate -> predicate.type) + ) + .apply(instance, InteriorBiomePredicate::new) + ); + + private final Type type; + + public InteriorBiomePredicate(Type type) { + this.type = type; + } + + @Override + public BiomePredicateType getType() { + return BiomePredicateType.INTERIOR; + } + + @Override + public boolean satisfies(ExtendedBiomeId biome, Layer layer, Supplier randomSupplier, int x, int z) { + return this.type.satisfies(biome, layer, x, z); + } + + public enum Type implements StringIdentifiable { + INTERIOR("interior") { + @Override + public boolean satisfies(ExtendedBiomeId biome, Layer layer, int x, int z) { + ExtendedBiomeId[] neighbors = layer.sampleNeighbors(x, z); + return Layer.allNeighborsEqual(neighbors, biome); + } + }, + DIAGONAL_INTERIOR("diagonal_interior") { + @Override + public boolean satisfies(ExtendedBiomeId biome, Layer layer, int x, int z) { + ExtendedBiomeId[] neighbors = layer.sampleDiagonalNeighbors(x, z); + return Layer.allNeighborsEqual(neighbors, biome); + } + }, + BORDER("border") { + @Override + public boolean satisfies(ExtendedBiomeId biome, Layer layer, int x, int z) { + ExtendedBiomeId[] neighbors = layer.sampleNeighbors(x, z); + return !Layer.allNeighborsEqual(neighbors, biome); + } + }, + DIAGONAL_BORDER("diagonal_border") { + @Override + public boolean satisfies(ExtendedBiomeId biome, Layer layer, int x, int z) { + ExtendedBiomeId[] neighbors = layer.sampleDiagonalNeighbors(x, z); + return !Layer.allNeighborsEqual(neighbors, biome); + } + }; + + public final String id; + + Type(String id) { + this.id = id; + } + + public abstract boolean satisfies(ExtendedBiomeId biome, Layer layer, int x, int z); + + @Override + public String asString() { + return this.id; + } + } +} diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/InvertedBiomePredicate.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/InvertedBiomePredicate.java new file mode 100644 index 00000000..23ef0b31 --- /dev/null +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/InvertedBiomePredicate.java @@ -0,0 +1,35 @@ +package mod.bluestaggo.modernerbeta.world.biome.provider.fractal.predicates; + +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ExtendedBiomeId; +import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers.Layer; +import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers.LayerRandom; + +import java.util.function.Supplier; + +public class InvertedBiomePredicate extends BiomePredicate { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( + instance -> instance + .group( + BiomePredicate.BASE_CODEC.fieldOf("term").forGetter(predicate -> predicate.term) + ) + .apply(instance, InvertedBiomePredicate::new) + ); + + private final BiomePredicate term; + + public InvertedBiomePredicate(BiomePredicate term) { + this.term = term; + } + + @Override + public BiomePredicateType getType() { + return BiomePredicateType.INVERTED; + } + + @Override + public boolean satisfies(ExtendedBiomeId biome, Layer layer, Supplier randomSupplier, int x, int z) { + return !this.term.satisfies(biome, layer, randomSupplier, x, z); + } +} diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/RandomChanceBiomePredicate.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/RandomChanceBiomePredicate.java new file mode 100644 index 00000000..92402f94 --- /dev/null +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/RandomChanceBiomePredicate.java @@ -0,0 +1,39 @@ +package mod.bluestaggo.modernerbeta.world.biome.provider.fractal.predicates; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ExtendedBiomeId; +import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers.Layer; +import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers.LayerRandom; + +import java.util.function.Supplier; + +public class RandomChanceBiomePredicate extends BiomePredicate { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( + instance -> instance + .group( + Codec.INT.fieldOf("numerator").orElse(1).forGetter(predicate -> predicate.numerator), + Codec.INT.fieldOf("denominator").forGetter(predicate -> predicate.denominator) + ) + .apply(instance, RandomChanceBiomePredicate::new) + ); + + private final int numerator; + private final int denominator; + + public RandomChanceBiomePredicate(int numerator, int denominator) { + this.numerator = numerator; + this.denominator = denominator; + } + + @Override + public BiomePredicateType getType() { + return BiomePredicateType.RANDOM_CHANCE; + } + + @Override + public boolean satisfies(ExtendedBiomeId biome, Layer layer, Supplier randomSupplier, int x, int z) { + return randomSupplier.get().nextInt(this.denominator) < this.numerator; + } +} diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/SingleMatchBiomePredicate.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/SingleMatchBiomePredicate.java new file mode 100644 index 00000000..31557aa2 --- /dev/null +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/SingleMatchBiomePredicate.java @@ -0,0 +1,36 @@ +package mod.bluestaggo.modernerbeta.world.biome.provider.fractal.predicates; + +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import mod.bluestaggo.modernerbeta.util.CodecUtil; +import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ExtendedBiomeId; +import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers.Layer; +import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers.LayerRandom; + +import java.util.function.Supplier; + +public class SingleMatchBiomePredicate extends BiomePredicate { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( + instance -> instance + .group( + ExtendedBiomeId.CODEC.fieldOf("biome").forGetter(predicate -> predicate.biome) + ) + .apply(instance, SingleMatchBiomePredicate::new) + ); + + private final ExtendedBiomeId biome; + + public SingleMatchBiomePredicate(ExtendedBiomeId biome) { + this.biome = biome; + } + + @Override + public BiomePredicateType getType() { + return BiomePredicateType.SINGLE_MATCH; + } + + @Override + public boolean satisfies(ExtendedBiomeId biome, Layer layer, Supplier randomSupplier, int x, int z) { + return this.biome.equals(biome); + } +} diff --git a/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/SpecificCaseBiomePredicate.java b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/SpecificCaseBiomePredicate.java new file mode 100644 index 00000000..39bc918d --- /dev/null +++ b/common/src/main/java/mod/bluestaggo/modernerbeta/world/biome/provider/fractal/predicates/SpecificCaseBiomePredicate.java @@ -0,0 +1,40 @@ +package mod.bluestaggo.modernerbeta.world.biome.provider.fractal.predicates; + +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import mod.bluestaggo.modernerbeta.util.CodecUtil; +import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.ExtendedBiomeId; +import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers.Layer; +import mod.bluestaggo.modernerbeta.world.biome.provider.fractal.layers.LayerRandom; + +import java.util.Set; +import java.util.function.Supplier; + +public class SpecificCaseBiomePredicate extends BiomePredicate { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( + instance -> instance + .group( + BiomePredicate.BASE_CODEC.fieldOf("predicate").forGetter(predicate -> predicate.predicate), + CodecUtil.set(ExtendedBiomeId.CODEC).fieldOf("biomes").forGetter(predicate -> predicate.biomes) + ) + .apply(instance, SpecificCaseBiomePredicate::new) + ); + + private final BiomePredicate predicate; + private final Set biomes; + + public SpecificCaseBiomePredicate(BiomePredicate predicate, Set biomes) { + this.predicate = predicate; + this.biomes = biomes; + } + + @Override + public BiomePredicateType getType() { + return BiomePredicateType.SPECIFIC_CASE; + } + + @Override + public boolean satisfies(ExtendedBiomeId biome, Layer layer, Supplier randomSupplier, int x, int z) { + return !this.biomes.contains(biome) || this.predicate.satisfies(biome, layer, randomSupplier, x, z); + } +} -- knotmirror 0.0.1