From 7729eeb65ce3506513ce90989d153b27c601b1ad Mon Sep 17 00:00:00 2001 From: feldenr <135638674+feldenr@users.noreply.github.com> Date: Sun, 14 Jun 2026 22:59:09 +0200 Subject: [PATCH] feat: latitude biome system with two world types + map validation command Add a latitude-based world generation system: biomes are distributed by Z coordinate (frozen north -> temperate equator -> hot south) with extremely large biomes on a continental scale, plus full Biomes O' Plenty support. World types (selectable in the world creation 'World Type' button): - Ultra Wide Biome: latitude biomes + vanilla terrain (immune to Tectonic via a private noise_settings copy under custom_ore_gen). - Tectonic Ultra Wide Biome: latitude biomes + minecraft:overworld terrain (uses Tectonic when present, vanilla otherwise). Core implementation: - LatitudeBiomeSource: custom BiomeSource distributing biomes by latitude. Temperature derived from Z with a boundary wobble, dual-octave selector noise for a flat biome distribution (no biome dominates), land/ocean mask, underground cave layer, moisture-driven rare swamp/mangrove pockets, and a guaranteed safe spawn zone (plains/forests) around the origin. - BiomeBand: 5 climate bands (FROZEN/COLD/TEMPERATE/WARM/HOT) with vanilla surface pools + dedicated climate tags (latitude_*_surface) for optional BOP biomes via required:false, plus ocean and underground pools. - WorldGenRegistration: DeferredRegister for the 'custom_ore_gen:latitude' BiomeSource codec. - LatitudeSpawnHandler: pins spawn to a plains/forest biome on overworld load. Validation: - /latitude map [radius] [step]: samples the LatitudeBiomeSource on a large grid, renders a top-down PNG map (run/latitude/latitude_map.png) and writes a per-band distribution + invariant report (run/latitude/latitude_report.txt). Constants tuned for a continental scale: TEMPERATURE_SCALE = 16000 (equator->pole) SURFACE_SELECTOR_SCALE = 0.00033 (biomes ~3000 blocks wide) Swamp fix: removed from the common temperate surface tag and made rare (~8% of temperate land via moisture noise), matching vanilla humidity biomes. --- .../customoregen/CustomOreGenMod.java | 2 + .../customoregen/worldgen/BiomeBand.java | 147 + .../worldgen/LatitudeBiomeSource.java | 263 ++ .../worldgen/LatitudeMapCommand.java | 219 ++ .../worldgen/LatitudeSpawnHandler.java | 108 + .../worldgen/WorldGenRegistration.java | 22 + .../assets/custom_ore_gen/lang/en_us.json | 6 +- .../assets/custom_ore_gen/lang/fr_fr.json | 6 +- .../worldgen/biome/latitude_cold_surface.json | 80 + .../worldgen/biome/latitude_hot_surface.json | 60 + .../biome/latitude_temperate_surface.json | 99 + .../worldgen/noise_settings/overworld.json | 2542 +++++++++++++++++ .../tectonic_ultra_wide_biome.json | 36 + .../world_preset/ultra_wide_biome.json | 36 + .../tags/worldgen/world_preset/normal.json | 7 + 15 files changed, 3631 insertions(+), 2 deletions(-) create mode 100644 src/main/java/net/mcreator/customoregen/worldgen/BiomeBand.java create mode 100644 src/main/java/net/mcreator/customoregen/worldgen/LatitudeBiomeSource.java create mode 100644 src/main/java/net/mcreator/customoregen/worldgen/LatitudeMapCommand.java create mode 100644 src/main/java/net/mcreator/customoregen/worldgen/LatitudeSpawnHandler.java create mode 100644 src/main/java/net/mcreator/customoregen/worldgen/WorldGenRegistration.java create mode 100644 src/main/resources/data/custom_ore_gen/tags/worldgen/biome/latitude_cold_surface.json create mode 100644 src/main/resources/data/custom_ore_gen/tags/worldgen/biome/latitude_hot_surface.json create mode 100644 src/main/resources/data/custom_ore_gen/tags/worldgen/biome/latitude_temperate_surface.json create mode 100644 src/main/resources/data/custom_ore_gen/worldgen/noise_settings/overworld.json create mode 100644 src/main/resources/data/custom_ore_gen/worldgen/world_preset/tectonic_ultra_wide_biome.json create mode 100644 src/main/resources/data/custom_ore_gen/worldgen/world_preset/ultra_wide_biome.json create mode 100644 src/main/resources/data/minecraft/tags/worldgen/world_preset/normal.json diff --git a/src/main/java/net/mcreator/customoregen/CustomOreGenMod.java b/src/main/java/net/mcreator/customoregen/CustomOreGenMod.java index e17b66dc1..e77c4d30c 100644 --- a/src/main/java/net/mcreator/customoregen/CustomOreGenMod.java +++ b/src/main/java/net/mcreator/customoregen/CustomOreGenMod.java @@ -29,6 +29,7 @@ import com.mojang.serialization.MapCodec; import net.neoforged.neoforge.registries.DeferredRegister; import net.neoforged.neoforge.registries.NeoForgeRegistries; import net.mcreator.customoregen.loot.CustomOreLootModifier; +import net.mcreator.customoregen.worldgen.WorldGenRegistration; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.List; @@ -58,6 +59,7 @@ public class CustomOreGenMod { LOOT_MODIFIERS.register(modEventBus); // Start of user code block mod init + WorldGenRegistration.BIOME_SOURCES.register(modEventBus); // End of user code block mod init } diff --git a/src/main/java/net/mcreator/customoregen/worldgen/BiomeBand.java b/src/main/java/net/mcreator/customoregen/worldgen/BiomeBand.java new file mode 100644 index 000000000..293fe6e69 --- /dev/null +++ b/src/main/java/net/mcreator/customoregen/worldgen/BiomeBand.java @@ -0,0 +1,147 @@ +package net.mcreator.customoregen.worldgen; + +import net.minecraft.core.Holder; +import net.minecraft.core.HolderGetter; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.core.registries.Registries; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.Biomes; + +import java.util.ArrayList; +import java.util.List; + +/** + * Latitude climate bands used by {@link LatitudeBiomeSource}. + * + *

The world is split along the Z axis (latitude) into climate bands: + * the far north is frozen, the equator is temperate, and the far south is hot. + * Surface biomes are selected from dedicated climate tags (so optional mods such + * as Biomes O' Plenty are supported gracefully). Ocean and underground (cave) pools + * are vanilla-only and resolved eagerly because those biomes always exist.

+ */ +public enum BiomeBand { + FROZEN(-1.0), + COLD(-0.5), + TEMPERATE(0.0), + WARM(0.5), + HOT(1.0); + + /** Mid-temperature of the band, in [-1.0, 1.0]. */ + public final double centerTemperature; + + BiomeBand(double centerTemperature) { + this.centerTemperature = centerTemperature; + } + + public static BiomeBand fromTemperature(double temperature) { + if (temperature <= -0.7) return FROZEN; + if (temperature <= -0.25) return COLD; + if (temperature < 0.25) return TEMPERATE; + if (temperature < 0.7) return WARM; + return HOT; + } + + /** Surface biome tag for this band (vanilla + optional Biomes O' Plenty). */ + public TagKey surfaceTag() { + switch (this) { + case FROZEN: + case COLD: + return tag("latitude_cold_surface"); + case TEMPERATE: + return tag("latitude_temperate_surface"); + case WARM: + case HOT: + return tag("latitude_hot_surface"); + default: + return tag("latitude_temperate_surface"); + } + } + + /** + * Vanilla surface biomes, used to declare {@code possibleBiomes} safely during worldgen + * data loading. The full (mod-aware) surface pool is resolved lazily from {@link #surfaceTag()}. + */ + public List> surfaceVanilla() { + switch (this) { + case FROZEN: + return List.of( + Biomes.SNOWY_PLAINS, Biomes.ICE_SPIKES, Biomes.SNOWY_TAIGA, + Biomes.GROVE, Biomes.SNOWY_SLOPES, Biomes.JAGGED_PEAKS, Biomes.FROZEN_PEAKS + ); + case COLD: + return List.of( + Biomes.TAIGA, Biomes.OLD_GROWTH_PINE_TAIGA, Biomes.OLD_GROWTH_SPRUCE_TAIGA, + Biomes.WINDSWEPT_HILLS, Biomes.WINDSWEPT_FOREST, Biomes.WINDSWEPT_GRAVELLY_HILLS, + Biomes.GROVE, Biomes.SNOWY_SLOPES + ); + case TEMPERATE: + return List.of( + Biomes.PLAINS, Biomes.SUNFLOWER_PLAINS, Biomes.FOREST, Biomes.BIRCH_FOREST, + Biomes.OLD_GROWTH_BIRCH_FOREST, Biomes.DARK_FOREST, Biomes.FLOWER_FOREST, + Biomes.SWAMP, Biomes.MEADOW, Biomes.CHERRY_GROVE + ); + case WARM: + return List.of( + Biomes.SAVANNA, Biomes.SAVANNA_PLATEAU, Biomes.WINDSWEPT_SAVANNA, + Biomes.BIRCH_FOREST, Biomes.FOREST, Biomes.PLAINS, Biomes.MEADOW + ); + case HOT: + return List.of( + Biomes.DESERT, Biomes.BADLANDS, Biomes.WOODED_BADLANDS, Biomes.ERODED_BADLANDS, + Biomes.SAVANNA, Biomes.JUNGLE, Biomes.SPARSE_JUNGLE, Biomes.BAMBOO_JUNGLE, + Biomes.MANGROVE_SWAMP + ); + default: + return List.of(Biomes.PLAINS); + } + } + + public List> ocean() { + switch (this) { + case FROZEN: + return List.of(Biomes.FROZEN_OCEAN, Biomes.DEEP_FROZEN_OCEAN, Biomes.FROZEN_RIVER); + case COLD: + return List.of(Biomes.COLD_OCEAN, Biomes.DEEP_COLD_OCEAN); + case TEMPERATE: + return List.of(Biomes.OCEAN, Biomes.DEEP_OCEAN, Biomes.RIVER); + case WARM: + return List.of(Biomes.LUKEWARM_OCEAN, Biomes.DEEP_LUKEWARM_OCEAN); + case HOT: + return List.of(Biomes.WARM_OCEAN); + default: + return List.of(Biomes.OCEAN); + } + } + + public List> underground() { + switch (this) { + case FROZEN: + return List.of(Biomes.DRIPSTONE_CAVES, Biomes.DEEP_DARK); + case COLD: + return List.of(Biomes.DRIPSTONE_CAVES); + case TEMPERATE: + return List.of(Biomes.LUSH_CAVES, Biomes.DRIPSTONE_CAVES); + case WARM: + return List.of(Biomes.LUSH_CAVES); + case HOT: + return List.of(Biomes.LUSH_CAVES, Biomes.DEEP_DARK); + default: + return List.of(Biomes.LUSH_CAVES); + } + } + + /** Resolve a list of (possibly absent) biome keys into actual holders, skipping missing ones. */ + public static List> resolve(HolderGetter getter, List> keys) { + List> holders = new ArrayList<>(); + for (ResourceKey key : keys) { + getter.get(key).ifPresent(holders::add); + } + return holders; + } + + private static TagKey tag(String name) { + return TagKey.create(Registries.BIOME, ResourceLocation.fromNamespaceAndPath("custom_ore_gen", name)); + } +} diff --git a/src/main/java/net/mcreator/customoregen/worldgen/LatitudeBiomeSource.java b/src/main/java/net/mcreator/customoregen/worldgen/LatitudeBiomeSource.java new file mode 100644 index 000000000..224b2d3ee --- /dev/null +++ b/src/main/java/net/mcreator/customoregen/worldgen/LatitudeBiomeSource.java @@ -0,0 +1,263 @@ +package net.mcreator.customoregen.worldgen; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.Holder; +import net.minecraft.core.HolderGetter; +import net.minecraft.core.HolderSet; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.RegistryOps; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.BiomeSource; +import net.minecraft.world.level.biome.Biomes; +import net.minecraft.world.level.biome.Climate; +import net.minecraft.world.level.levelgen.synth.ImprovedNoise; + +import java.util.ArrayList; +import java.util.EnumMap; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Stream; + +/** + * Custom {@link BiomeSource} that distributes biomes by latitude (Z axis). + * + *
    + *
  • Far north (large negative Z) = frozen / cold biomes
  • + *
  • Equator (Z ≈ 0) = temperate biomes
  • + *
  • Far south (large positive Z) = hot biomes
  • + *
+ * + *

Temperature is derived from the Z coordinate with a gentle boundary perturbation so the + * climate bands are not perfectly straight lines. Inside each band, a very low-frequency + * selector noise picks among the band's biomes, producing extremely large biomes that + * encourage exploration and long-distance travel (railways, roads, nether hubs).

+ * + *

Surface biomes come from dedicated climate tags (see {@code data/custom_ore_gen/tags/ + * worldgen/biome/latitude_*_surface.json}), which support optional Biomes O' Plenty biomes + * via {@code "required": false} without ever creating unbound holders. Ocean and underground + * (cave) pools are vanilla-only.

+ */ +public class LatitudeBiomeSource extends BiomeSource { + + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + Codec.LONG.fieldOf("seed").forGetter(src -> src.seed), + RegistryOps.retrieveGetter(Registries.BIOME) + ).apply(instance, instance.stable(LatitudeBiomeSource::new))); + + // ------------------------------------------------------------------ + // Tunable constants + // ------------------------------------------------------------------ + + /** Number of blocks for the temperature to go from 0 (equator) to +-1 (pole). */ + private static final double TEMPERATURE_SCALE = 16000.0; + + /** Noise frequency for the climate band boundary wobble. */ + private static final double BOUNDARY_NOISE_SCALE = 0.00015; + + /** Amplitude of the boundary wobble (in temperature units). */ + private static final double BOUNDARY_NOISE_AMPLITUDE = 0.15; + + /** Selector noise frequency for surface sub-biomes (very low = very large biomes). */ + private static final double SURFACE_SELECTOR_SCALE = 0.00033; + + /** Frequency of the land/ocean mask noise. */ + private static final double OCEAN_NOISE_SCALE = 0.0011; + + /** Above this ocean-noise value, the column is ocean. */ + private static final double OCEAN_THRESHOLD = 0.30; + + /** Frequency of the moisture noise that carves rare swamp/mangrove pockets. */ + private static final double MOISTURE_SCALE = 0.0009; + + /** Above this moisture value a wet biome (swamp/mangrove) overrides the surface. ~8% of land. */ + private static final double MOISTURE_THRESHOLD = 0.55; + + /** Below this block Y we resolve underground (cave) biomes. */ + private static final int UNDERGROUND_Y = 30; + + /** Half-size of the guaranteed safe spawn square around the origin (plains/forest). */ + private static final int SPAWN_SAFE_RADIUS = 96; + + /** Selector frequency inside the spawn safe zone (finer, for gentle variety). */ + private static final double SPAWN_SELECTOR_SCALE = 0.02; + + // ------------------------------------------------------------------ + // Fields + // ------------------------------------------------------------------ + + private final long seed; + private final HolderGetter biomeGetter; + + private final ImprovedNoise boundaryNoise; + private final ImprovedNoise selectorNoise; + private final ImprovedNoise oceanNoise; + private final ImprovedNoise moistureNoise; + + /** Vanilla-only pools resolved eagerly (safe: vanilla biomes always exist and are bound). */ + private final EnumMap resolvedVanilla; + private final Set> possibleBiomes; + private final Holder fallback; + + /** Safe spawn pool (plains / forests) resolved eagerly. Always near the origin. */ + private final List> spawnSafeBiomes; + + /** Rare wet biomes (swamp = temperate, mangrove = warm/hot), placed by moisture noise. */ + private final Holder swampBiome; + private final Holder mangroveBiome; + + /** Mod-aware surface pools resolved lazily from climate tags (safe: tags are bound by then). */ + private volatile EnumMap>> surfaceFromTag; + + public LatitudeBiomeSource(long seed, HolderGetter biomeGetter) { + this.seed = seed; + this.biomeGetter = biomeGetter; + + RandomSource rng = RandomSource.create(seed); + this.boundaryNoise = new ImprovedNoise(rng); + this.selectorNoise = new ImprovedNoise(RandomSource.create(seed ^ 0x4C415449L)); + this.oceanNoise = new ImprovedNoise(RandomSource.create(seed ^ 0x4F434541L)); + this.moistureNoise = new ImprovedNoise(RandomSource.create(seed ^ 0x57455421L)); + + this.resolvedVanilla = new EnumMap<>(BiomeBand.class); + Set> all = new HashSet<>(); + for (BiomeBand band : BiomeBand.values()) { + List> surface = BiomeBand.resolve(biomeGetter, band.surfaceVanilla()); + List> ocean = BiomeBand.resolve(biomeGetter, band.ocean()); + List> underground = BiomeBand.resolve(biomeGetter, band.underground()); + + resolvedVanilla.put(band, new ResolvedBand(surface, ocean, underground)); + all.addAll(surface); + all.addAll(ocean); + all.addAll(underground); + } + this.possibleBiomes = all; + + List> safe = new ArrayList<>(); + safe.addAll(BiomeBand.resolve(biomeGetter, List.of( + Biomes.PLAINS, Biomes.SUNFLOWER_PLAINS, + Biomes.FOREST, Biomes.BIRCH_FOREST, Biomes.FLOWER_FOREST, + Biomes.MEADOW + ))); + this.spawnSafeBiomes = safe.isEmpty() ? null : safe; + + this.swampBiome = biomeGetter.get(Biomes.SWAMP).orElse(null); + this.mangroveBiome = biomeGetter.get(Biomes.MANGROVE_SWAMP).orElse(null); + + Holder plains = biomeGetter.get(Biomes.PLAINS).orElse(null); + this.fallback = plains != null ? plains : (possibleBiomes.isEmpty() ? null : possibleBiomes.iterator().next()); + } + + @Override + protected MapCodec codec() { + return CODEC; + } + + @Override + protected Stream> collectPossibleBiomes() { + return possibleBiomes.stream(); + } + + @Override + public Holder getNoiseBiome(int quartX, int quartY, int quartZ, Climate.Sampler sampler) { + int blockX = quartX * 4; + int blockZ = quartZ * 4; + int blockY = quartY * 4; + + double latitudeTemp = blockZ / TEMPERATURE_SCALE; + double wobble = boundaryNoise.noise(blockX * BOUNDARY_NOISE_SCALE, 0.0, blockZ * BOUNDARY_NOISE_SCALE) * BOUNDARY_NOISE_AMPLITUDE; + double temperature = clamp(latitudeTemp + wobble, -1.0, 1.0); + + BiomeBand band = BiomeBand.fromTemperature(temperature); + ResolvedBand pool = resolvedVanilla.get(band); + if (pool == null) { + pool = resolvedVanilla.get(BiomeBand.TEMPERATE); + } + + // Guaranteed safe spawn zone (open, buildable biomes) around the origin. + if (spawnSafeBiomes != null && Math.abs(blockX) < SPAWN_SAFE_RADIUS && Math.abs(blockZ) < SPAWN_SAFE_RADIUS) { + return pickBiome(spawnSafeBiomes, blockX, blockZ, SPAWN_SELECTOR_SCALE); + } + + // Underground (caves) layer. + if (blockY < UNDERGROUND_Y && !pool.underground().isEmpty()) { + return pickBiome(pool.underground(), blockX, blockZ, 0.004); + } + + // Land vs ocean mask. + double oceanValue = oceanNoise.noise(blockX * OCEAN_NOISE_SCALE, 0.0, blockZ * OCEAN_NOISE_SCALE); + if (oceanValue > OCEAN_THRESHOLD && !pool.ocean().isEmpty()) { + return pickBiome(pool.ocean(), blockX, blockZ, 0.002); + } + + // Rare wet pockets: high moisture carves a swamp (temperate) or mangrove swamp (warm/hot), + // matching vanilla where these are uncommon humid biomes rather than equal-weighted surface ones. + double moisture = moistureNoise.noise(blockX * MOISTURE_SCALE, 0.0, blockZ * MOISTURE_SCALE); + if (moisture > MOISTURE_THRESHOLD) { + if (band == BiomeBand.TEMPERATE && swampBiome != null) { + return swampBiome; + } + if ((band == BiomeBand.WARM || band == BiomeBand.HOT) && mangroveBiome != null) { + return mangroveBiome; + } + } + + // Surface biome from the (mod-aware) climate tag, with a vanilla fallback. + List> surface = resolveSurfaceTag(band); + if (surface == null || surface.isEmpty()) { + surface = pool.surface(); + if (surface.isEmpty()) { + surface = resolvedVanilla.get(BiomeBand.TEMPERATE).surface(); + } + } + return pickBiome(surface, blockX, blockZ, SURFACE_SELECTOR_SCALE); + } + + /** Lazily resolve surface biomes from climate tags. Tags are bound after the registry freezes, + * so this is safe and never creates unbound holders. */ + private List> resolveSurfaceTag(BiomeBand band) { + EnumMap>> cache = surfaceFromTag; + if (cache != null) { + return cache.get(band); + } + synchronized (this) { + if (surfaceFromTag == null) { + EnumMap>> built = new EnumMap<>(BiomeBand.class); + for (BiomeBand b : BiomeBand.values()) { + List> holders = new ArrayList<>(); + biomeGetter.get(b.surfaceTag()).map(HolderSet::stream).ifPresent(stream -> stream.forEach(holders::add)); + built.put(b, holders); + } + surfaceFromTag = built; + } + return surfaceFromTag.get(band); + } + } + + private Holder pickBiome(List> biomes, int blockX, int blockZ, double scale) { + if (biomes == null || biomes.isEmpty()) { + return fallback; + } + // Dual-octave noise for a flatter, near-uniform index distribution: a single ImprovedNoise + // value is bell-curved around 0, which makes the middle of the biome list dominate. Adding a + // second octave at an offset flattens the curve so no biome is disproportionately common. + double n1 = selectorNoise.noise(blockX * scale, blockZ * scale, 1000.0); + double n2 = selectorNoise.noise(blockX * scale * 1.9 + 137.0, blockZ * scale * 1.9 - 211.0, 2000.0); + double combined = (n1 + n2 * 0.5) / 1.5; + double normalized = combined * 0.5 + 0.5; + int idx = (int) (normalized * biomes.size()); + if (idx >= biomes.size()) idx = biomes.size() - 1; + if (idx < 0) idx = 0; + return biomes.get(idx); + } + + private static double clamp(double value, double min, double max) { + return value < min ? min : (value > max ? max : value); + } + + private record ResolvedBand(List> surface, List> ocean, List> underground) { + } +} diff --git a/src/main/java/net/mcreator/customoregen/worldgen/LatitudeMapCommand.java b/src/main/java/net/mcreator/customoregen/worldgen/LatitudeMapCommand.java new file mode 100644 index 000000000..f858a33fc --- /dev/null +++ b/src/main/java/net/mcreator/customoregen/worldgen/LatitudeMapCommand.java @@ -0,0 +1,219 @@ +package net.mcreator.customoregen.worldgen; + +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.IntegerArgumentType; +import com.mojang.brigadier.context.CommandContext; +import net.mcreator.customoregen.CustomOreGenMod; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; +import net.minecraft.core.Holder; +import net.minecraft.core.HolderGetter; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceKey; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.Biomes; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.event.RegisterCommandsEvent; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.EnumMap; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * {@code /latitude map [radius] [step]} — renders a top-down biome map of the latitude world. + * + *

Samples {@link LatitudeBiomeSource} on a large square grid (independent of the current + * world's biome source, so it works in any world) and writes: + *

    + *
  • {@code run/latitude/latitude_map.png} — one colour per biome category (the "map view"),
  • + *
  • {@code run/latitude/latitude_report.txt} — per-band distribution + validation invariants.
  • + *
+ * + *

Use this to validate the climate distribution without exploring by hand.

+ */ +@EventBusSubscriber(modid = CustomOreGenMod.MODID, bus = EventBusSubscriber.Bus.GAME) +public class LatitudeMapCommand { + + private static final int DEFAULT_RADIUS = 24000; + private static final int DEFAULT_STEP = 60; + + // Biome key -> colour category (kept in sync with BiomeBand pools) + private static final Map, Integer> COLORS = new HashMap<>(); + + static { + col(0xB6E388, Biomes.PLAINS, Biomes.SUNFLOWER_PLAINS, Biomes.FOREST, Biomes.BIRCH_FOREST, + Biomes.FLOWER_FOREST, Biomes.MEADOW, Biomes.CHERRY_GROVE); // safe spawn / temperate + col(0xC8E6FF, Biomes.SNOWY_PLAINS, Biomes.ICE_SPIKES, Biomes.SNOWY_TAIGA, Biomes.GROVE, + Biomes.SNOWY_SLOPES, Biomes.JAGGED_PEAKS, Biomes.FROZEN_PEAKS); // frozen + col(0x8FB8D6, Biomes.TAIGA, Biomes.OLD_GROWTH_PINE_TAIGA, Biomes.OLD_GROWTH_SPRUCE_TAIGA, + Biomes.WINDSWEPT_HILLS, Biomes.WINDSWEPT_FOREST, Biomes.WINDSWEPT_GRAVELLY_HILLS); // cold + col(0x7CC576, Biomes.DARK_FOREST, Biomes.OLD_GROWTH_BIRCH_FOREST); // temperate + col(0xE0C068, Biomes.SAVANNA, Biomes.SAVANNA_PLATEAU, Biomes.WINDSWEPT_SAVANNA); // warm + col(0xE0884C, Biomes.DESERT, Biomes.BADLANDS, Biomes.WOODED_BADLANDS, Biomes.ERODED_BADLANDS, + Biomes.JUNGLE, Biomes.SPARSE_JUNGLE, Biomes.BAMBOO_JUNGLE); // hot + col(0x2B5C8A, Biomes.OCEAN, Biomes.DEEP_OCEAN, Biomes.LUKEWARM_OCEAN, Biomes.DEEP_LUKEWARM_OCEAN, + Biomes.WARM_OCEAN, Biomes.FROZEN_OCEAN, Biomes.DEEP_FROZEN_OCEAN, Biomes.COLD_OCEAN, + Biomes.DEEP_COLD_OCEAN, Biomes.RIVER, Biomes.FROZEN_RIVER); // water + col(0x5B7A3A, Biomes.SWAMP); // swamp (should be rare pockets) + col(0x3A5A3A, Biomes.MANGROVE_SWAMP); // mangrove + col(0x6B4E3A, Biomes.LUSH_CAVES, Biomes.DRIPSTONE_CAVES, Biomes.DEEP_DARK); // underground + } + + private static void col(int rgb, ResourceKey... keys) { + for (ResourceKey k : keys) COLORS.put(k, rgb); + } + + @SubscribeEvent + public static void onRegisterCommands(RegisterCommandsEvent event) { + CommandDispatcher dispatcher = event.getDispatcher(); + dispatcher.register(Commands.literal("latitude") + .requires(source -> source.hasPermission(2)) + .then(Commands.literal("map") + .executes(ctx -> run(ctx, DEFAULT_RADIUS, DEFAULT_STEP)) + .then(Commands.argument("radius", IntegerArgumentType.integer(1000, 100000)) + .executes(ctx -> run(ctx, IntegerArgumentType.getInteger(ctx, "radius"), DEFAULT_STEP)) + .then(Commands.argument("step", IntegerArgumentType.integer(4, 1000)) + .executes(ctx -> run(ctx, + IntegerArgumentType.getInteger(ctx, "radius"), + IntegerArgumentType.getInteger(ctx, "step"))))))); + } + + private static int run(CommandContext ctx, int radius, int step) { + CommandSourceStack src = ctx.getSource(); + if (!(src.getLevel() instanceof ServerLevel serverLevel)) { + src.sendFailure(Component.literal("Must be run on a server level.")); + return 0; + } + + long seed = serverLevel.getSeed(); + HolderGetter getter = serverLevel.registryAccess().lookupOrThrow(Registries.BIOME); + LatitudeBiomeSource source = new LatitudeBiomeSource(seed, getter); + + int dim = (2 * radius) / step + 1; + src.sendSystemMessage(Component.literal( + "\u00A7b[Latitude]\u00A7r Sampling " + dim + "x" + dim + " grid (radius=" + radius + ", step=" + step + ")...")); + + BufferedImage img = new BufferedImage(dim, dim, BufferedImage.TYPE_INT_RGB); + Map, Integer> global = new HashMap<>(); + Map, Integer>> perBand = new EnumMap<>(BiomeBand.class); + for (BiomeBand b : BiomeBand.values()) perBand.put(b, new HashMap<>()); + + for (int zi = 0; zi < dim; zi++) { + for (int xi = 0; xi < dim; xi++) { + int blockX = -radius + xi * step; + int blockZ = -radius + zi * step; + Holder holder = source.getNoiseBiome(blockX >> 2, 64 >> 2, blockZ >> 2, null); + ResourceKey key = holder.unwrapKey().orElse(null); + + global.merge(key, 1, Integer::sum); + perBand.get(BiomeBand.fromTemperature(blockZ / 16000.0)).merge(key, 1, Integer::sum); + + int rgb = key == null ? 0x888888 : COLORS.getOrDefault(key, 0x888888); + img.setRGB(xi, dim - 1 - zi, rgb); // flip Z so north is at the top + } + } + + // ---- Spawn biome ---- + ResourceKey spawnKey = source.getNoiseBiome(0, 64 >> 2, 0, null).unwrapKey().orElse(null); + + // ---- Write PNG ---- + try { + Files.createDirectories(Path.of("latitude")); + ImageIO.write(img, "png", Path.of("latitude", "latitude_map.png").toFile()); + } catch (Exception e) { + CustomOreGenMod.LOGGER.error("Latitude map: failed to write PNG", e); + src.sendFailure(Component.literal("Failed to write PNG: " + e.getMessage())); + return 0; + } + + // ---- Build report ---- + StringBuilder r = new StringBuilder(); + r.append("Latitude World Map Report\n"); + r.append("seed=").append(seed).append(" radius=").append(radius).append(" step=").append(step) + .append(" grid=").append(dim).append("x").append(dim).append("\n\n"); + r.append("Spawn biome @ (0,0): ").append(spawnKey).append("\n\n"); + + int total = global.values().stream().mapToInt(Integer::intValue).sum(); + r.append("Global biome distribution (top 15):\n"); + global.entrySet().stream() + .sorted(Map.Entry., Integer>comparingByValue().reversed()) + .limit(15) + .forEach(e -> r.append(String.format(" %-45s %6.2f%%%n", e.getKey(), 100.0 * e.getValue() / total))); + + List warnings = new ArrayList<>(); + for (BiomeBand band : BiomeBand.values()) { + Map, Integer> m = perBand.get(band); + int bt = m.values().stream().mapToInt(Integer::intValue).sum(); + if (bt == 0) continue; + int swamp = m.getOrDefault(Biomes.SWAMP, 0) + m.getOrDefault(Biomes.MANGROVE_SWAMP, 0); + double swampPct = 100.0 * swamp / bt; + r.append("\nBand ").append(band).append(" (").append(bt).append(" samples, swamp+mangrove ") + .append(String.format("%.2f%%", swampPct)).append("):\n"); + m.entrySet().stream() + .sorted(Map.Entry., Integer>comparingByValue().reversed()) + .limit(6) + .forEach(e -> r.append(String.format(" %-43s %6.2f%%%n", e.getKey(), 100.0 * e.getValue() / bt))); + if (swampPct > 15.0) { + warnings.add(band + " has " + String.format("%.1f%%", swampPct) + " swamp (expected <15%)"); + } + } + + // Invariant checks + r.append("\n=== Validation ===\n"); + boolean spawnOk = spawnKey != null && isSafeSpawn(spawnKey); + r.append("Spawn on safe biome: ").append(spawnOk ? "PASS" : "FAIL (" + spawnKey + ")").append("\n"); + double frozenCold = bandRatio(perBand.get(BiomeBand.FROZEN), Set.of( + Biomes.SNOWY_PLAINS, Biomes.ICE_SPIKES, Biomes.SNOWY_TAIGA, Biomes.GROVE, Biomes.SNOWY_SLOPES, + Biomes.JAGGED_PEAKS, Biomes.FROZEN_PEAKS, Biomes.TAIGA, Biomes.OLD_GROWTH_PINE_TAIGA, + Biomes.OLD_GROWTH_SPRUCE_TAIGA, Biomes.WINDSWEPT_HILLS, Biomes.WINDSWEPT_FOREST, + Biomes.FROZEN_OCEAN, Biomes.DEEP_FROZEN_OCEAN, Biomes.COLD_OCEAN, Biomes.DEEP_COLD_OCEAN, + Biomes.FROZEN_RIVER)); + r.append(String.format("North (FROZEN) cold/frozen ratio: %.1f%% (want >60%%)%n", frozenCold)); + double hotRatio = bandRatio(perBand.get(BiomeBand.HOT), Set.of( + Biomes.DESERT, Biomes.BADLANDS, Biomes.WOODED_BADLANDS, Biomes.ERODED_BADLANDS, + Biomes.JUNGLE, Biomes.SPARSE_JUNGLE, Biomes.BAMBOO_JUNGLE, Biomes.SAVANNA, + Biomes.SAVANNA_PLATEAU, Biomes.WARM_OCEAN)); + r.append(String.format("South (HOT) warm/hot ratio: %.1f%% (want >60%%)%n", hotRatio)); + r.append("Warnings: ").append(warnings.isEmpty() ? "none" : warnings).append("\n"); + + try { + Files.writeString(Path.of("latitude", "latitude_report.txt"), r.toString()); + } catch (Exception e) { + CustomOreGenMod.LOGGER.error("Latitude map: failed to write report", e); + } + + // ---- Summary to chat ---- + src.sendSystemMessage(Component.literal("\u00A7a[Latitude]\u00A7r Map + report saved to /latitude/")); + src.sendSystemMessage(Component.literal(" Spawn: " + spawnKey + (spawnOk ? " \u00A7aOK\u00A7r" : " \u00A7cBAD\u00A7r"))); + src.sendSystemMessage(Component.literal(String.format( + " North cold/frozen: %.0f%% | South hot: %.0f%% | Swamp warnings: %d", + frozenCold, hotRatio, warnings.size()))); + return 1; + } + + private static double bandRatio(Map, Integer> m, Set> expected) { + int total = m.values().stream().mapToInt(Integer::intValue).sum(); + if (total == 0) return 0; + int match = 0; + for (ResourceKey k : expected) match += m.getOrDefault(k, 0); + return 100.0 * match / total; + } + + private static boolean isSafeSpawn(ResourceKey key) { + Set> safe = new HashSet<>(List.of( + Biomes.PLAINS, Biomes.SUNFLOWER_PLAINS, Biomes.FOREST, Biomes.BIRCH_FOREST, + Biomes.FLOWER_FOREST, Biomes.MEADOW, Biomes.CHERRY_GROVE)); + return safe.contains(key); + } +} diff --git a/src/main/java/net/mcreator/customoregen/worldgen/LatitudeSpawnHandler.java b/src/main/java/net/mcreator/customoregen/worldgen/LatitudeSpawnHandler.java new file mode 100644 index 000000000..eccf8eccf --- /dev/null +++ b/src/main/java/net/mcreator/customoregen/worldgen/LatitudeSpawnHandler.java @@ -0,0 +1,108 @@ +package net.mcreator.customoregen.worldgen; + +import net.mcreator.customoregen.CustomOreGenMod; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; +import net.minecraft.resources.ResourceKey; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.tags.TagKey; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.Biomes; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.storage.ServerLevelData; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.event.level.LevelEvent; + +import java.util.Set; + +/** + * Forces the world spawn point to a plains-like biome near the origin. + * + *

Because {@link LatitudeBiomeSource} places temperate biomes around Z=0, a plains + * or forest biome is always available close to spawn. This handler runs once per server + * lifetime when the overworld loads, scans a growing square around the origin and pins + * the default spawn point to the first matching biome. The player therefore always + * starts the game on open, buildable terrain instead of a swamp, mountain or ocean.

+ */ +@EventBusSubscriber(modid = CustomOreGenMod.MODID) +public class LatitudeSpawnHandler { + + /** Biomes considered a good starting point (open, buildable temperate terrain). */ + private static final Set> SPAWN_BIOMES = Set.of( + Biomes.PLAINS, Biomes.SUNFLOWER_PLAINS, + Biomes.FOREST, Biomes.BIRCH_FOREST, Biomes.FLOWER_FOREST, + Biomes.MEADOW, Biomes.CHERRY_GROVE + ); + + /** Maximum search radius (in blocks) around the origin. */ + private static final int MAX_RADIUS = 512; + + /** Step between sampled positions. */ + private static final int STEP = 8; + + private static volatile boolean initialized = false; + + @SubscribeEvent + public static void onLevelLoad(LevelEvent.Load event) { + if (initialized) { + return; + } + if (!(event.getLevel() instanceof ServerLevel level)) { + return; + } + if (level.dimension() != Level.OVERWORLD) { + return; + } + + initialized = true; + + if (!(level.getLevelData() instanceof ServerLevelData levelData)) { + return; + } + + BlockPos current = levelData.getSpawnPos(); + if (isSpawnBiome(level, current)) { + return; // Already on a good biome, leave it alone. + } + + BlockPos found = findSpawnBiome(level); + if (found == null) { + CustomOreGenMod.LOGGER.warn("Latitude: no suitable spawn biome found within {} blocks, keeping {}", MAX_RADIUS, current); + return; + } + + int y = level.getHeight(Heightmap.Types.WORLD_SURFACE_WG, found.getX(), found.getZ()); + BlockPos spawn = new BlockPos(found.getX(), y, found.getZ()); + level.setDefaultSpawnPos(spawn, 0.0f); + CustomOreGenMod.LOGGER.info("Latitude: spawn point set to {} ({})", spawn, + level.getBiome(spawn).unwrapKey().map(Object::toString).orElse("?")); + } + + private static boolean isSpawnBiome(ServerLevel level, BlockPos pos) { + Holder biome = level.getBiome(pos); + return biome.unwrapKey().map(SPAWN_BIOMES::contains).orElse(false); + } + + private static BlockPos findSpawnBiome(ServerLevel level) { + // Concentric square rings starting from the origin. + for (int radius = 0; radius <= MAX_RADIUS; radius += STEP) { + for (int x = -radius; x <= radius; x += STEP) { + for (int z = -radius; z <= radius; z += STEP) { + // Only scan the outer ring of each pass to avoid re-checking inner cells. + if (Math.abs(x) != radius && Math.abs(z) != radius && radius != 0) { + continue; + } + BlockPos pos = new BlockPos(x, 0, z); + if (isSpawnBiome(level, pos)) { + return pos; + } + } + } + } + return null; + } +} diff --git a/src/main/java/net/mcreator/customoregen/worldgen/WorldGenRegistration.java b/src/main/java/net/mcreator/customoregen/worldgen/WorldGenRegistration.java new file mode 100644 index 000000000..8021a7640 --- /dev/null +++ b/src/main/java/net/mcreator/customoregen/worldgen/WorldGenRegistration.java @@ -0,0 +1,22 @@ +package net.mcreator.customoregen.worldgen; + +import com.mojang.serialization.MapCodec; +import net.minecraft.core.registries.Registries; +import net.minecraft.world.level.biome.BiomeSource; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; + +/** + * Registration of the custom latitude {@link BiomeSource} codec. + * + *

The biome source is referenced from world presets as + * {@code "custom_ore_gen:latitude"}.

+ */ +public class WorldGenRegistration { + + public static final DeferredRegister> BIOME_SOURCES = + DeferredRegister.create(Registries.BIOME_SOURCE, "custom_ore_gen"); + + public static final DeferredHolder, MapCodec> LATITUDE = + BIOME_SOURCES.register("latitude", () -> LatitudeBiomeSource.CODEC); +} diff --git a/src/main/resources/assets/custom_ore_gen/lang/en_us.json b/src/main/resources/assets/custom_ore_gen/lang/en_us.json index 0080d7172..d8360eda1 100644 --- a/src/main/resources/assets/custom_ore_gen/lang/en_us.json +++ b/src/main/resources/assets/custom_ore_gen/lang/en_us.json @@ -27,5 +27,9 @@ "item.custom_ore_gen.sharddiamondleggings": "Shard Diamond Leggings", "item.custom_ore_gen.sharddiamondboots": "Shard Diamond Boots", "item.custom_ore_gen.sharddiamondpaxel": "Shard Diamond Paxel", - "itemGroup.custom_ore_gen": "Custom Ore Gen" + "itemGroup.custom_ore_gen": "Custom Ore Gen", + "generator.custom_ore_gen.ultra_wide_biome": "Ultra Wide Biome", + "generator.custom_ore_gen.ultra_wide_biome.info": "Climate bands by latitude: frozen north, temperate equator, hot south. Extremely large biomes.", + "generator.custom_ore_gen.tectonic_ultra_wide_biome": "Tectonic Ultra Wide Biome", + "generator.custom_ore_gen.tectonic_ultra_wide_biome.info": "Latitude climate bands with Tectonic terrain (requires Tectonic)." } \ No newline at end of file diff --git a/src/main/resources/assets/custom_ore_gen/lang/fr_fr.json b/src/main/resources/assets/custom_ore_gen/lang/fr_fr.json index ca50871d8..a1a40a46a 100644 --- a/src/main/resources/assets/custom_ore_gen/lang/fr_fr.json +++ b/src/main/resources/assets/custom_ore_gen/lang/fr_fr.json @@ -27,5 +27,9 @@ "item.custom_ore_gen.sharddiamondleggings": "Jambières en éclat de diamant", "item.custom_ore_gen.sharddiamondboots": "Bottes en éclat de diamant", "item.custom_ore_gen.sharddiamondpaxel": "Paxel en éclat de diamant", - "itemGroup.custom_ore_gen": "Custom Ore Gen" + "itemGroup.custom_ore_gen": "Custom Ore Gen", + "generator.custom_ore_gen.ultra_wide_biome": "Biomes Ultra-Larges", + "generator.custom_ore_gen.ultra_wide_biome.info": "Bandes climatiques par latitude : nord gelé, équateur tempéré, sud chaud. Biomes immenses.", + "generator.custom_ore_gen.tectonic_ultra_wide_biome": "Biomes Ultra-Larges (Tectonic)", + "generator.custom_ore_gen.tectonic_ultra_wide_biome.info": "Bandes climatiques par latitude avec terrain Tectonic (nécessite Tectonic)." } \ No newline at end of file diff --git a/src/main/resources/data/custom_ore_gen/tags/worldgen/biome/latitude_cold_surface.json b/src/main/resources/data/custom_ore_gen/tags/worldgen/biome/latitude_cold_surface.json new file mode 100644 index 000000000..fd770d5c9 --- /dev/null +++ b/src/main/resources/data/custom_ore_gen/tags/worldgen/biome/latitude_cold_surface.json @@ -0,0 +1,80 @@ +{ + "replace": false, + "values": [ + "minecraft:snowy_plains", + "minecraft:ice_spikes", + "minecraft:snowy_taiga", + "minecraft:taiga", + "minecraft:old_growth_pine_taiga", + "minecraft:old_growth_spruce_taiga", + "minecraft:windswept_hills", + "minecraft:windswept_forest", + "minecraft:windswept_gravelly_hills", + "minecraft:grove", + "minecraft:snowy_slopes", + { + "id": "biomesoplenty:snowblossom_grove", + "required": false + }, + { + "id": "biomesoplenty:snowy_coniferous_forest", + "required": false + }, + { + "id": "biomesoplenty:snowy_maple_woods", + "required": false + }, + { + "id": "biomesoplenty:snowy_fir_clearing", + "required": false + }, + { + "id": "biomesoplenty:auroral_garden", + "required": false + }, + { + "id": "biomesoplenty:cold_desert", + "required": false + }, + { + "id": "biomesoplenty:tundra", + "required": false + }, + { + "id": "biomesoplenty:muskeg", + "required": false + }, + { + "id": "biomesoplenty:maple_woods", + "required": false + }, + { + "id": "biomesoplenty:dead_forest", + "required": false + }, + { + "id": "biomesoplenty:old_growth_dead_forest", + "required": false + }, + { + "id": "biomesoplenty:bog", + "required": false + }, + { + "id": "biomesoplenty:coniferous_forest", + "required": false + }, + { + "id": "biomesoplenty:fir_clearing", + "required": false + }, + { + "id": "biomesoplenty:seasonal_forest", + "required": false + }, + { + "id": "biomesoplenty:seasonal_orchard", + "required": false + } + ] +} diff --git a/src/main/resources/data/custom_ore_gen/tags/worldgen/biome/latitude_hot_surface.json b/src/main/resources/data/custom_ore_gen/tags/worldgen/biome/latitude_hot_surface.json new file mode 100644 index 000000000..ab99b8bbc --- /dev/null +++ b/src/main/resources/data/custom_ore_gen/tags/worldgen/biome/latitude_hot_surface.json @@ -0,0 +1,60 @@ +{ + "replace": false, + "values": [ + "minecraft:desert", + "minecraft:badlands", + "minecraft:wooded_badlands", + "minecraft:eroded_badlands", + "minecraft:savanna", + "minecraft:savanna_plateau", + "minecraft:windswept_savanna", + "minecraft:jungle", + "minecraft:sparse_jungle", + "minecraft:bamboo_jungle", + "minecraft:birch_forest", + { + "id": "biomesoplenty:dryland", + "required": false + }, + { + "id": "biomesoplenty:dune_beach", + "required": false + }, + { + "id": "biomesoplenty:bayou", + "required": false + }, + { + "id": "biomesoplenty:fungal_jungle", + "required": false + }, + { + "id": "biomesoplenty:rainforest", + "required": false + }, + { + "id": "biomesoplenty:rocky_rainforest", + "required": false + }, + { + "id": "biomesoplenty:floodplain", + "required": false + }, + { + "id": "biomesoplenty:tropics", + "required": false + }, + { + "id": "biomesoplenty:scrubland", + "required": false + }, + { + "id": "biomesoplenty:rocky_shrubland", + "required": false + }, + { + "id": "biomesoplenty:jade_cliffs", + "required": false + } + ] +} diff --git a/src/main/resources/data/custom_ore_gen/tags/worldgen/biome/latitude_temperate_surface.json b/src/main/resources/data/custom_ore_gen/tags/worldgen/biome/latitude_temperate_surface.json new file mode 100644 index 000000000..600622e3b --- /dev/null +++ b/src/main/resources/data/custom_ore_gen/tags/worldgen/biome/latitude_temperate_surface.json @@ -0,0 +1,99 @@ +{ + "replace": false, + "values": [ + "minecraft:plains", + "minecraft:sunflower_plains", + "minecraft:forest", + "minecraft:birch_forest", + "minecraft:old_growth_birch_forest", + "minecraft:dark_forest", + "minecraft:flower_forest", + "minecraft:meadow", + "minecraft:cherry_grove", + "minecraft:windswept_forest", + { + "id": "biomesoplenty:field", + "required": false + }, + { + "id": "biomesoplenty:forested_field", + "required": false + }, + { + "id": "biomesoplenty:pumpkin_patch", + "required": false + }, + { + "id": "biomesoplenty:grassland", + "required": false + }, + { + "id": "biomesoplenty:highland", + "required": false + }, + { + "id": "biomesoplenty:moor", + "required": false + }, + { + "id": "biomesoplenty:shrubland", + "required": false + }, + { + "id": "biomesoplenty:wetland", + "required": false + }, + { + "id": "biomesoplenty:clover_patch", + "required": false + }, + { + "id": "biomesoplenty:redwood_forest", + "required": false + }, + { + "id": "biomesoplenty:woodland", + "required": false + }, + { + "id": "biomesoplenty:old_growth_woodland", + "required": false + }, + { + "id": "biomesoplenty:marsh", + "required": false + }, + { + "id": "biomesoplenty:meadow", + "required": false + }, + { + "id": "biomesoplenty:orchard", + "required": false + }, + { + "id": "biomesoplenty:mediterranean_forest", + "required": false + }, + { + "id": "biomesoplenty:lavender_field", + "required": false + }, + { + "id": "biomesoplenty:lavender_forest", + "required": false + }, + { + "id": "biomesoplenty:mystic_grove", + "required": false + }, + { + "id": "biomesoplenty:cherry_blossom_grove", + "required": false + }, + { + "id": "biomesoplenty:origin_valley", + "required": false + } + ] +} diff --git a/src/main/resources/data/custom_ore_gen/worldgen/noise_settings/overworld.json b/src/main/resources/data/custom_ore_gen/worldgen/noise_settings/overworld.json new file mode 100644 index 000000000..afacea320 --- /dev/null +++ b/src/main/resources/data/custom_ore_gen/worldgen/noise_settings/overworld.json @@ -0,0 +1,2542 @@ +{ + "aquifers_enabled": true, + "default_block": { + "Name": "minecraft:stone" + }, + "default_fluid": { + "Name": "minecraft:water", + "Properties": { + "level": "0" + } + }, + "disable_mob_generation": false, + "legacy_random_source": false, + "noise": { + "height": 384, + "min_y": -64, + "size_horizontal": 1, + "size_vertical": 2 + }, + "noise_router": { + "barrier": { + "type": "minecraft:noise", + "noise": "minecraft:aquifer_barrier", + "xz_scale": 1.0, + "y_scale": 0.5 + }, + "continents": "minecraft:overworld/continents", + "depth": "minecraft:overworld/depth", + "erosion": "minecraft:overworld/erosion", + "final_density": { + "type": "minecraft:min", + "argument1": { + "type": "minecraft:squeeze", + "argument": { + "type": "minecraft:mul", + "argument1": 0.64, + "argument2": { + "type": "minecraft:interpolated", + "argument": { + "type": "minecraft:blend_density", + "argument": { + "type": "minecraft:add", + "argument1": 0.1171875, + "argument2": { + "type": "minecraft:mul", + "argument1": { + "type": "minecraft:y_clamped_gradient", + "from_value": 0.0, + "from_y": -64, + "to_value": 1.0, + "to_y": -40 + }, + "argument2": { + "type": "minecraft:add", + "argument1": -0.1171875, + "argument2": { + "type": "minecraft:add", + "argument1": -0.078125, + "argument2": { + "type": "minecraft:mul", + "argument1": { + "type": "minecraft:y_clamped_gradient", + "from_value": 1.0, + "from_y": 240, + "to_value": 0.0, + "to_y": 256 + }, + "argument2": { + "type": "minecraft:add", + "argument1": 0.078125, + "argument2": { + "type": "minecraft:range_choice", + "input": "minecraft:overworld/sloped_cheese", + "max_exclusive": 1.5625, + "min_inclusive": -1000000.0, + "when_in_range": { + "type": "minecraft:min", + "argument1": "minecraft:overworld/sloped_cheese", + "argument2": { + "type": "minecraft:mul", + "argument1": 5.0, + "argument2": "minecraft:overworld/caves/entrances" + } + }, + "when_out_of_range": { + "type": "minecraft:max", + "argument1": { + "type": "minecraft:min", + "argument1": { + "type": "minecraft:min", + "argument1": { + "type": "minecraft:add", + "argument1": { + "type": "minecraft:mul", + "argument1": 4.0, + "argument2": { + "type": "minecraft:square", + "argument": { + "type": "minecraft:noise", + "noise": "minecraft:cave_layer", + "xz_scale": 1.0, + "y_scale": 8.0 + } + } + }, + "argument2": { + "type": "minecraft:add", + "argument1": { + "type": "minecraft:clamp", + "input": { + "type": "minecraft:add", + "argument1": 0.27, + "argument2": { + "type": "minecraft:noise", + "noise": "minecraft:cave_cheese", + "xz_scale": 1.0, + "y_scale": 0.6666666666666666 + } + }, + "max": 1.0, + "min": -1.0 + }, + "argument2": { + "type": "minecraft:clamp", + "input": { + "type": "minecraft:add", + "argument1": 1.5, + "argument2": { + "type": "minecraft:mul", + "argument1": -0.64, + "argument2": "minecraft:overworld/sloped_cheese" + } + }, + "max": 0.5, + "min": 0.0 + } + } + }, + "argument2": "minecraft:overworld/caves/entrances" + }, + "argument2": { + "type": "minecraft:add", + "argument1": "minecraft:overworld/caves/spaghetti_2d", + "argument2": "minecraft:overworld/caves/spaghetti_roughness_function" + } + }, + "argument2": { + "type": "minecraft:range_choice", + "input": "minecraft:overworld/caves/pillars", + "max_exclusive": 0.03, + "min_inclusive": -1000000.0, + "when_in_range": -1000000.0, + "when_out_of_range": "minecraft:overworld/caves/pillars" + } + } + } + } + } + } + } + } + } + } + } + } + }, + "argument2": "minecraft:overworld/caves/noodle" + }, + "fluid_level_floodedness": { + "type": "minecraft:noise", + "noise": "minecraft:aquifer_fluid_level_floodedness", + "xz_scale": 1.0, + "y_scale": 0.67 + }, + "fluid_level_spread": { + "type": "minecraft:noise", + "noise": "minecraft:aquifer_fluid_level_spread", + "xz_scale": 1.0, + "y_scale": 0.7142857142857143 + }, + "initial_density_without_jaggedness": { + "type": "minecraft:add", + "argument1": 0.1171875, + "argument2": { + "type": "minecraft:mul", + "argument1": { + "type": "minecraft:y_clamped_gradient", + "from_value": 0.0, + "from_y": -64, + "to_value": 1.0, + "to_y": -40 + }, + "argument2": { + "type": "minecraft:add", + "argument1": -0.1171875, + "argument2": { + "type": "minecraft:add", + "argument1": -0.078125, + "argument2": { + "type": "minecraft:mul", + "argument1": { + "type": "minecraft:y_clamped_gradient", + "from_value": 1.0, + "from_y": 240, + "to_value": 0.0, + "to_y": 256 + }, + "argument2": { + "type": "minecraft:add", + "argument1": 0.078125, + "argument2": { + "type": "minecraft:clamp", + "input": { + "type": "minecraft:add", + "argument1": -0.703125, + "argument2": { + "type": "minecraft:mul", + "argument1": 4.0, + "argument2": { + "type": "minecraft:quarter_negative", + "argument": { + "type": "minecraft:mul", + "argument1": "minecraft:overworld/depth", + "argument2": { + "type": "minecraft:cache_2d", + "argument": "minecraft:overworld/factor" + } + } + } + } + }, + "max": 64.0, + "min": -64.0 + } + } + } + } + } + } + }, + "lava": { + "type": "minecraft:noise", + "noise": "minecraft:aquifer_lava", + "xz_scale": 1.0, + "y_scale": 1.0 + }, + "ridges": "minecraft:overworld/ridges", + "temperature": { + "type": "minecraft:shifted_noise", + "noise": "minecraft:temperature", + "shift_x": "minecraft:shift_x", + "shift_y": 0.0, + "shift_z": "minecraft:shift_z", + "xz_scale": 0.25, + "y_scale": 0.0 + }, + "vegetation": { + "type": "minecraft:shifted_noise", + "noise": "minecraft:vegetation", + "shift_x": "minecraft:shift_x", + "shift_y": 0.0, + "shift_z": "minecraft:shift_z", + "xz_scale": 0.25, + "y_scale": 0.0 + }, + "vein_gap": { + "type": "minecraft:noise", + "noise": "minecraft:ore_gap", + "xz_scale": 1.0, + "y_scale": 1.0 + }, + "vein_ridged": { + "type": "minecraft:add", + "argument1": -0.07999999821186066, + "argument2": { + "type": "minecraft:max", + "argument1": { + "type": "minecraft:abs", + "argument": { + "type": "minecraft:interpolated", + "argument": { + "type": "minecraft:range_choice", + "input": "minecraft:y", + "max_exclusive": 51.0, + "min_inclusive": -60.0, + "when_in_range": { + "type": "minecraft:noise", + "noise": "minecraft:ore_vein_a", + "xz_scale": 4.0, + "y_scale": 4.0 + }, + "when_out_of_range": 0.0 + } + } + }, + "argument2": { + "type": "minecraft:abs", + "argument": { + "type": "minecraft:interpolated", + "argument": { + "type": "minecraft:range_choice", + "input": "minecraft:y", + "max_exclusive": 51.0, + "min_inclusive": -60.0, + "when_in_range": { + "type": "minecraft:noise", + "noise": "minecraft:ore_vein_b", + "xz_scale": 4.0, + "y_scale": 4.0 + }, + "when_out_of_range": 0.0 + } + } + } + } + }, + "vein_toggle": { + "type": "minecraft:interpolated", + "argument": { + "type": "minecraft:range_choice", + "input": "minecraft:y", + "max_exclusive": 51.0, + "min_inclusive": -60.0, + "when_in_range": { + "type": "minecraft:noise", + "noise": "minecraft:ore_veininess", + "xz_scale": 1.5, + "y_scale": 1.5 + }, + "when_out_of_range": 0.0 + } + } + }, + "ore_veins_enabled": true, + "sea_level": 63, + "spawn_target": [ + { + "continentalness": [ + -0.11, + 1.0 + ], + "depth": 0.0, + "erosion": [ + -1.0, + 1.0 + ], + "humidity": [ + -1.0, + 1.0 + ], + "offset": 0.0, + "temperature": [ + -1.0, + 1.0 + ], + "weirdness": [ + -1.0, + -0.16 + ] + }, + { + "continentalness": [ + -0.11, + 1.0 + ], + "depth": 0.0, + "erosion": [ + -1.0, + 1.0 + ], + "humidity": [ + -1.0, + 1.0 + ], + "offset": 0.0, + "temperature": [ + -1.0, + 1.0 + ], + "weirdness": [ + 0.16, + 1.0 + ] + } + ], + "surface_rule": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:vertical_gradient", + "false_at_and_above": { + "above_bottom": 5 + }, + "random_name": "minecraft:bedrock_floor", + "true_at_and_below": { + "above_bottom": 0 + } + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:bedrock" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:above_preliminary_surface" + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": false, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "floor" + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:wooded_badlands" + ] + }, + "then_run": { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:y_above", + "add_stone_depth": false, + "anchor": { + "absolute": 97 + }, + "surface_depth_multiplier": 2 + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": -0.5454, + "min_threshold": -0.909, + "noise": "minecraft:surface" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:coarse_dirt" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 0.1818, + "min_threshold": -0.1818, + "noise": "minecraft:surface" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:coarse_dirt" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 0.909, + "min_threshold": 0.5454, + "noise": "minecraft:surface" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:coarse_dirt" + } + } + }, + { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:water", + "add_stone_depth": false, + "offset": 0, + "surface_depth_multiplier": 0 + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:grass_block", + "Properties": { + "snowy": "false" + } + } + } + }, + { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:dirt" + } + } + ] + } + ] + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:swamp" + ] + }, + "then_run": { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:y_above", + "add_stone_depth": false, + "anchor": { + "absolute": 62 + }, + "surface_depth_multiplier": 0 + }, + "then_run": { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:not", + "invert": { + "type": "minecraft:y_above", + "add_stone_depth": false, + "anchor": { + "absolute": 63 + }, + "surface_depth_multiplier": 0 + } + }, + "then_run": { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 1.7976931348623157E308, + "min_threshold": 0.0, + "noise": "minecraft:surface_swamp" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:water", + "Properties": { + "level": "0" + } + } + } + } + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:mangrove_swamp" + ] + }, + "then_run": { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:y_above", + "add_stone_depth": false, + "anchor": { + "absolute": 60 + }, + "surface_depth_multiplier": 0 + }, + "then_run": { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:not", + "invert": { + "type": "minecraft:y_above", + "add_stone_depth": false, + "anchor": { + "absolute": 63 + }, + "surface_depth_multiplier": 0 + } + }, + "then_run": { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 1.7976931348623157E308, + "min_threshold": 0.0, + "noise": "minecraft:surface_swamp" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:water", + "Properties": { + "level": "0" + } + } + } + } + } + } + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:badlands", + "minecraft:eroded_badlands", + "minecraft:wooded_badlands" + ] + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": false, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "floor" + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:y_above", + "add_stone_depth": false, + "anchor": { + "absolute": 256 + }, + "surface_depth_multiplier": 0 + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:orange_terracotta" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:y_above", + "add_stone_depth": true, + "anchor": { + "absolute": 74 + }, + "surface_depth_multiplier": 1 + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": -0.5454, + "min_threshold": -0.909, + "noise": "minecraft:surface" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:terracotta" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 0.1818, + "min_threshold": -0.1818, + "noise": "minecraft:surface" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:terracotta" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 0.909, + "min_threshold": 0.5454, + "noise": "minecraft:surface" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:terracotta" + } + } + }, + { + "type": "minecraft:bandlands" + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:water", + "add_stone_depth": false, + "offset": -1, + "surface_depth_multiplier": 0 + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": false, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "ceiling" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:red_sandstone" + } + } + }, + { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:red_sand" + } + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:not", + "invert": { + "type": "minecraft:hole" + } + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:orange_terracotta" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:water", + "add_stone_depth": true, + "offset": -6, + "surface_depth_multiplier": -1 + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:white_terracotta" + } + } + }, + { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": false, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "ceiling" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:stone" + } + } + }, + { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:gravel" + } + } + ] + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:y_above", + "add_stone_depth": true, + "anchor": { + "absolute": 63 + }, + "surface_depth_multiplier": -1 + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:y_above", + "add_stone_depth": false, + "anchor": { + "absolute": 63 + }, + "surface_depth_multiplier": 0 + }, + "then_run": { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:not", + "invert": { + "type": "minecraft:y_above", + "add_stone_depth": true, + "anchor": { + "absolute": 74 + }, + "surface_depth_multiplier": 1 + } + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:orange_terracotta" + } + } + } + }, + { + "type": "minecraft:bandlands" + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": true, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "floor" + }, + "then_run": { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:water", + "add_stone_depth": true, + "offset": -6, + "surface_depth_multiplier": -1 + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:white_terracotta" + } + } + } + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": false, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "floor" + }, + "then_run": { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:water", + "add_stone_depth": false, + "offset": -1, + "surface_depth_multiplier": 0 + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:frozen_ocean", + "minecraft:deep_frozen_ocean" + ] + }, + "then_run": { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:hole" + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:water", + "add_stone_depth": false, + "offset": 0, + "surface_depth_multiplier": 0 + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:air" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:temperature" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:ice" + } + } + }, + { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:water", + "Properties": { + "level": "0" + } + } + } + ] + } + } + }, + { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:frozen_peaks" + ] + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:steep" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:packed_ice" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 0.2, + "min_threshold": 0.0, + "noise": "minecraft:packed_ice" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:packed_ice" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 0.025, + "min_threshold": 0.0, + "noise": "minecraft:ice" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:ice" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:water", + "add_stone_depth": false, + "offset": 0, + "surface_depth_multiplier": 0 + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:snow_block" + } + } + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:snowy_slopes" + ] + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:steep" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:stone" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 0.6, + "min_threshold": 0.35, + "noise": "minecraft:powder_snow" + }, + "then_run": { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:water", + "add_stone_depth": false, + "offset": 0, + "surface_depth_multiplier": 0 + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:powder_snow" + } + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:water", + "add_stone_depth": false, + "offset": 0, + "surface_depth_multiplier": 0 + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:snow_block" + } + } + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:jagged_peaks" + ] + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:steep" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:stone" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:water", + "add_stone_depth": false, + "offset": 0, + "surface_depth_multiplier": 0 + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:snow_block" + } + } + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:grove" + ] + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 0.6, + "min_threshold": 0.35, + "noise": "minecraft:powder_snow" + }, + "then_run": { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:water", + "add_stone_depth": false, + "offset": 0, + "surface_depth_multiplier": 0 + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:powder_snow" + } + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:water", + "add_stone_depth": false, + "offset": 0, + "surface_depth_multiplier": 0 + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:snow_block" + } + } + } + ] + } + }, + { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:stony_peaks" + ] + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 0.0125, + "min_threshold": -0.0125, + "noise": "minecraft:calcite" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:calcite" + } + } + }, + { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:stone" + } + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:stony_shore" + ] + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 0.05, + "min_threshold": -0.05, + "noise": "minecraft:gravel" + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": false, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "ceiling" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:stone" + } + } + }, + { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:gravel" + } + } + ] + } + }, + { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:stone" + } + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:windswept_hills" + ] + }, + "then_run": { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 1.7976931348623157E308, + "min_threshold": 0.12121212121212122, + "noise": "minecraft:surface" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:stone" + } + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:warm_ocean", + "minecraft:beach", + "minecraft:snowy_beach" + ] + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": false, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "ceiling" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:sandstone" + } + } + }, + { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:sand" + } + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:desert" + ] + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": false, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "ceiling" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:sandstone" + } + } + }, + { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:sand" + } + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:dripstone_caves" + ] + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:stone" + } + } + } + ] + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:windswept_savanna" + ] + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 1.7976931348623157E308, + "min_threshold": 0.21212121212121213, + "noise": "minecraft:surface" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:stone" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 1.7976931348623157E308, + "min_threshold": -0.06060606060606061, + "noise": "minecraft:surface" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:coarse_dirt" + } + } + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:windswept_gravelly_hills" + ] + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 1.7976931348623157E308, + "min_threshold": 0.24242424242424243, + "noise": "minecraft:surface" + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": false, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "ceiling" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:stone" + } + } + }, + { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:gravel" + } + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 1.7976931348623157E308, + "min_threshold": 0.12121212121212122, + "noise": "minecraft:surface" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:stone" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 1.7976931348623157E308, + "min_threshold": -0.12121212121212122, + "noise": "minecraft:surface" + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:water", + "add_stone_depth": false, + "offset": 0, + "surface_depth_multiplier": 0 + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:grass_block", + "Properties": { + "snowy": "false" + } + } + } + }, + { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:dirt" + } + } + ] + } + }, + { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": false, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "ceiling" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:stone" + } + } + }, + { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:gravel" + } + } + ] + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:old_growth_pine_taiga", + "minecraft:old_growth_spruce_taiga" + ] + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 1.7976931348623157E308, + "min_threshold": 0.21212121212121213, + "noise": "minecraft:surface" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:coarse_dirt" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 1.7976931348623157E308, + "min_threshold": -0.11515151515151514, + "noise": "minecraft:surface" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:podzol", + "Properties": { + "snowy": "false" + } + } + } + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:ice_spikes" + ] + }, + "then_run": { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:water", + "add_stone_depth": false, + "offset": 0, + "surface_depth_multiplier": 0 + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:snow_block" + } + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:mangrove_swamp" + ] + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:mud" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:mushroom_fields" + ] + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:mycelium", + "Properties": { + "snowy": "false" + } + } + } + }, + { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:water", + "add_stone_depth": false, + "offset": 0, + "surface_depth_multiplier": 0 + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:grass_block", + "Properties": { + "snowy": "false" + } + } + } + }, + { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:dirt" + } + } + ] + } + ] + } + ] + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:water", + "add_stone_depth": true, + "offset": -6, + "surface_depth_multiplier": -1 + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": false, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "floor" + }, + "then_run": { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:frozen_ocean", + "minecraft:deep_frozen_ocean" + ] + }, + "then_run": { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:hole" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:water", + "Properties": { + "level": "0" + } + } + } + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": true, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "floor" + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:frozen_peaks" + ] + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:steep" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:packed_ice" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 0.2, + "min_threshold": -0.5, + "noise": "minecraft:packed_ice" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:packed_ice" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 0.025, + "min_threshold": -0.0625, + "noise": "minecraft:ice" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:ice" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:water", + "add_stone_depth": false, + "offset": 0, + "surface_depth_multiplier": 0 + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:snow_block" + } + } + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:snowy_slopes" + ] + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:steep" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:stone" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 0.58, + "min_threshold": 0.45, + "noise": "minecraft:powder_snow" + }, + "then_run": { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:water", + "add_stone_depth": false, + "offset": 0, + "surface_depth_multiplier": 0 + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:powder_snow" + } + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:water", + "add_stone_depth": false, + "offset": 0, + "surface_depth_multiplier": 0 + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:snow_block" + } + } + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:jagged_peaks" + ] + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:stone" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:grove" + ] + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 0.58, + "min_threshold": 0.45, + "noise": "minecraft:powder_snow" + }, + "then_run": { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:water", + "add_stone_depth": false, + "offset": 0, + "surface_depth_multiplier": 0 + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:powder_snow" + } + } + } + }, + { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:dirt" + } + } + ] + } + }, + { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:stony_peaks" + ] + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 0.0125, + "min_threshold": -0.0125, + "noise": "minecraft:calcite" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:calcite" + } + } + }, + { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:stone" + } + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:stony_shore" + ] + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 0.05, + "min_threshold": -0.05, + "noise": "minecraft:gravel" + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": false, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "ceiling" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:stone" + } + } + }, + { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:gravel" + } + } + ] + } + }, + { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:stone" + } + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:windswept_hills" + ] + }, + "then_run": { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 1.7976931348623157E308, + "min_threshold": 0.12121212121212122, + "noise": "minecraft:surface" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:stone" + } + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:warm_ocean", + "minecraft:beach", + "minecraft:snowy_beach" + ] + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": false, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "ceiling" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:sandstone" + } + } + }, + { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:sand" + } + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:desert" + ] + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": false, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "ceiling" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:sandstone" + } + } + }, + { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:sand" + } + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:dripstone_caves" + ] + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:stone" + } + } + } + ] + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:windswept_savanna" + ] + }, + "then_run": { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 1.7976931348623157E308, + "min_threshold": 0.21212121212121213, + "noise": "minecraft:surface" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:stone" + } + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:windswept_gravelly_hills" + ] + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 1.7976931348623157E308, + "min_threshold": 0.24242424242424243, + "noise": "minecraft:surface" + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": false, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "ceiling" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:stone" + } + } + }, + { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:gravel" + } + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 1.7976931348623157E308, + "min_threshold": 0.12121212121212122, + "noise": "minecraft:surface" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:stone" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:noise_threshold", + "max_threshold": 1.7976931348623157E308, + "min_threshold": -0.12121212121212122, + "noise": "minecraft:surface" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:dirt" + } + } + }, + { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": false, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "ceiling" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:stone" + } + } + }, + { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:gravel" + } + } + ] + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:mangrove_swamp" + ] + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:mud" + } + } + }, + { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:dirt" + } + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:warm_ocean", + "minecraft:beach", + "minecraft:snowy_beach" + ] + }, + "then_run": { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": true, + "offset": 0, + "secondary_depth_range": 6, + "surface_type": "floor" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:sandstone" + } + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:desert" + ] + }, + "then_run": { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": true, + "offset": 0, + "secondary_depth_range": 30, + "surface_type": "floor" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:sandstone" + } + } + } + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": false, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "floor" + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:frozen_peaks", + "minecraft:jagged_peaks" + ] + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:stone" + } + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:biome", + "biome_is": [ + "minecraft:warm_ocean", + "minecraft:lukewarm_ocean", + "minecraft:deep_lukewarm_ocean" + ] + }, + "then_run": { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": false, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "ceiling" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:sandstone" + } + } + }, + { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:sand" + } + } + ] + } + }, + { + "type": "minecraft:sequence", + "sequence": [ + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:stone_depth", + "add_surface_depth": false, + "offset": 0, + "secondary_depth_range": 0, + "surface_type": "ceiling" + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:stone" + } + } + }, + { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:gravel" + } + } + ] + } + ] + } + } + ] + } + }, + { + "type": "minecraft:condition", + "if_true": { + "type": "minecraft:vertical_gradient", + "false_at_and_above": { + "absolute": 8 + }, + "random_name": "minecraft:deepslate", + "true_at_and_below": { + "absolute": 0 + } + }, + "then_run": { + "type": "minecraft:block", + "result_state": { + "Name": "minecraft:deepslate", + "Properties": { + "axis": "y" + } + } + } + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/data/custom_ore_gen/worldgen/world_preset/tectonic_ultra_wide_biome.json b/src/main/resources/data/custom_ore_gen/worldgen/world_preset/tectonic_ultra_wide_biome.json new file mode 100644 index 000000000..b66fecdd6 --- /dev/null +++ b/src/main/resources/data/custom_ore_gen/worldgen/world_preset/tectonic_ultra_wide_biome.json @@ -0,0 +1,36 @@ +{ + "dimensions": { + "minecraft:overworld": { + "type": "minecraft:overworld", + "generator": { + "type": "minecraft:noise", + "biome_source": { + "type": "custom_ore_gen:latitude", + "seed": 0 + }, + "settings": "minecraft:overworld" + } + }, + "minecraft:the_nether": { + "type": "minecraft:the_nether", + "generator": { + "type": "minecraft:noise", + "biome_source": { + "type": "minecraft:multi_noise", + "preset": "minecraft:nether" + }, + "settings": "minecraft:nether" + } + }, + "minecraft:the_end": { + "type": "minecraft:the_end", + "generator": { + "type": "minecraft:noise", + "biome_source": { + "type": "minecraft:the_end" + }, + "settings": "minecraft:end" + } + } + } +} diff --git a/src/main/resources/data/custom_ore_gen/worldgen/world_preset/ultra_wide_biome.json b/src/main/resources/data/custom_ore_gen/worldgen/world_preset/ultra_wide_biome.json new file mode 100644 index 000000000..e51a75069 --- /dev/null +++ b/src/main/resources/data/custom_ore_gen/worldgen/world_preset/ultra_wide_biome.json @@ -0,0 +1,36 @@ +{ + "dimensions": { + "minecraft:overworld": { + "type": "minecraft:overworld", + "generator": { + "type": "minecraft:noise", + "biome_source": { + "type": "custom_ore_gen:latitude", + "seed": 0 + }, + "settings": "custom_ore_gen:overworld" + } + }, + "minecraft:the_nether": { + "type": "minecraft:the_nether", + "generator": { + "type": "minecraft:noise", + "biome_source": { + "type": "minecraft:multi_noise", + "preset": "minecraft:nether" + }, + "settings": "minecraft:nether" + } + }, + "minecraft:the_end": { + "type": "minecraft:the_end", + "generator": { + "type": "minecraft:noise", + "biome_source": { + "type": "minecraft:the_end" + }, + "settings": "minecraft:end" + } + } + } +} diff --git a/src/main/resources/data/minecraft/tags/worldgen/world_preset/normal.json b/src/main/resources/data/minecraft/tags/worldgen/world_preset/normal.json new file mode 100644 index 000000000..dd31ed35f --- /dev/null +++ b/src/main/resources/data/minecraft/tags/worldgen/world_preset/normal.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "custom_ore_gen:ultra_wide_biome", + "custom_ore_gen:tectonic_ultra_wide_biome" + ] +}