diff --git a/src/main/generated/data/modern_beta/worldgen/biome/beta_oak_forest.json b/src/main/generated/data/modern_beta/worldgen/biome/beta_oak_forest.json new file mode 100644 index 00000000..82938b47 --- /dev/null +++ b/src/main/generated/data/modern_beta/worldgen/biome/beta_oak_forest.json @@ -0,0 +1,199 @@ +{ + "carvers": { + "air": [ + "modern_beta:beta_cave", + "modern_beta:beta_cave_deep", + "minecraft:canyon" + ] + }, + "downfall": 0.8, + "effects": { + "fog_color": 12638463, + "sky_color": 7777023, + "water_color": 4159204, + "water_fog_color": 329011 + }, + "features": [ + [], + [ + "minecraft:lake_lava_underground", + "minecraft:lake_lava_surface" + ], + [ + "minecraft:amethyst_geode" + ], + [ + "minecraft:monster_room", + "minecraft:monster_room_deep" + ], + [], + [], + [ + "minecraft:ore_dirt", + "minecraft:ore_gravel", + "modern_beta:ore_clay", + "minecraft:ore_granite_lower", + "minecraft:ore_diorite_lower", + "minecraft:ore_andesite_lower", + "minecraft:ore_tuff", + "minecraft:ore_coal_upper", + "minecraft:ore_coal_lower", + "minecraft:ore_iron_upper", + "minecraft:ore_iron_middle", + "minecraft:ore_iron_small", + "minecraft:ore_gold", + "minecraft:ore_gold_lower", + "minecraft:ore_redstone", + "minecraft:ore_redstone_lower", + "minecraft:ore_diamond", + "minecraft:ore_diamond_medium", + "minecraft:ore_diamond_large", + "minecraft:ore_diamond_buried", + "minecraft:ore_lapis", + "minecraft:ore_lapis_buried", + "minecraft:ore_copper", + "minecraft:underwater_magma", + "modern_beta:ore_emerald_y95" + ], + [], + [ + "minecraft:spring_water", + "minecraft:spring_lava" + ], + [ + "minecraft:glow_lichen", + "modern_beta:patch_dandelion_2", + "modern_beta:patch_poppy", + "modern_beta:trees_beta_oak_forest_bees", + "minecraft:forest_flowers", + "minecraft:patch_grass_forest", + "minecraft:brown_mushroom_normal", + "minecraft:red_mushroom_normal", + "minecraft:patch_sugar_cane", + "minecraft:patch_pumpkin" + ], + [ + "modern_beta:freeze_top_layer" + ] + ], + "has_precipitation": true, + "spawn_costs": {}, + "spawners": { + "ambient": [ + { + "type": "minecraft:bat", + "maxCount": 8, + "minCount": 8, + "weight": 10 + } + ], + "axolotls": [], + "creature": [ + { + "type": "minecraft:sheep", + "maxCount": 4, + "minCount": 4, + "weight": 12 + }, + { + "type": "minecraft:pig", + "maxCount": 4, + "minCount": 4, + "weight": 10 + }, + { + "type": "minecraft:chicken", + "maxCount": 4, + "minCount": 4, + "weight": 10 + }, + { + "type": "minecraft:cow", + "maxCount": 4, + "minCount": 4, + "weight": 8 + }, + { + "type": "minecraft:wolf", + "maxCount": 4, + "minCount": 4, + "weight": 5 + }, + { + "type": "minecraft:turtle", + "maxCount": 5, + "minCount": 2, + "weight": 5 + } + ], + "misc": [], + "monster": [ + { + "type": "minecraft:spider", + "maxCount": 4, + "minCount": 4, + "weight": 100 + }, + { + "type": "minecraft:zombie", + "maxCount": 4, + "minCount": 4, + "weight": 95 + }, + { + "type": "minecraft:zombie_villager", + "maxCount": 1, + "minCount": 1, + "weight": 5 + }, + { + "type": "minecraft:skeleton", + "maxCount": 4, + "minCount": 4, + "weight": 100 + }, + { + "type": "minecraft:creeper", + "maxCount": 4, + "minCount": 4, + "weight": 100 + }, + { + "type": "minecraft:slime", + "maxCount": 4, + "minCount": 4, + "weight": 100 + }, + { + "type": "minecraft:enderman", + "maxCount": 4, + "minCount": 1, + "weight": 10 + }, + { + "type": "minecraft:witch", + "maxCount": 1, + "minCount": 1, + "weight": 5 + } + ], + "underground_water_creature": [ + { + "type": "minecraft:glow_squid", + "maxCount": 6, + "minCount": 4, + "weight": 10 + } + ], + "water_ambient": [], + "water_creature": [ + { + "type": "minecraft:squid", + "maxCount": 4, + "minCount": 1, + "weight": 10 + } + ] + }, + "temperature": 0.7 +} \ No newline at end of file diff --git a/src/main/generated/data/modern_beta/worldgen/biome/beta_oak_taiga.json b/src/main/generated/data/modern_beta/worldgen/biome/beta_oak_taiga.json new file mode 100644 index 00000000..61aedc17 --- /dev/null +++ b/src/main/generated/data/modern_beta/worldgen/biome/beta_oak_taiga.json @@ -0,0 +1,211 @@ +{ + "carvers": { + "air": [ + "modern_beta:beta_cave", + "modern_beta:beta_cave_deep", + "minecraft:canyon" + ] + }, + "downfall": 0.5, + "effects": { + "fog_color": 12638463, + "sky_color": 8430079, + "water_color": 4159204, + "water_fog_color": 329011 + }, + "features": [ + [], + [ + "minecraft:lake_lava_underground", + "minecraft:lake_lava_surface" + ], + [ + "minecraft:amethyst_geode" + ], + [ + "minecraft:monster_room", + "minecraft:monster_room_deep" + ], + [], + [], + [ + "minecraft:ore_dirt", + "minecraft:ore_gravel", + "modern_beta:ore_clay", + "minecraft:ore_granite_lower", + "minecraft:ore_diorite_lower", + "minecraft:ore_andesite_lower", + "minecraft:ore_tuff", + "minecraft:ore_coal_upper", + "minecraft:ore_coal_lower", + "minecraft:ore_iron_upper", + "minecraft:ore_iron_middle", + "minecraft:ore_iron_small", + "minecraft:ore_gold", + "minecraft:ore_gold_lower", + "minecraft:ore_redstone", + "minecraft:ore_redstone_lower", + "minecraft:ore_diamond", + "minecraft:ore_diamond_medium", + "minecraft:ore_diamond_large", + "minecraft:ore_diamond_buried", + "minecraft:ore_lapis", + "minecraft:ore_lapis_buried", + "minecraft:ore_copper", + "minecraft:underwater_magma", + "modern_beta:ore_emerald_y95" + ], + [], + [ + "minecraft:spring_water", + "minecraft:spring_lava" + ], + [ + "minecraft:glow_lichen", + "modern_beta:patch_dandelion_2", + "modern_beta:patch_poppy", + "modern_beta:trees_beta_oak_forest", + "modern_beta:patch_grass_taiga_1", + "minecraft:brown_mushroom_normal", + "minecraft:red_mushroom_normal", + "minecraft:patch_sugar_cane", + "minecraft:patch_pumpkin", + "minecraft:patch_berry_common" + ], + [ + "modern_beta:freeze_top_layer" + ] + ], + "has_precipitation": true, + "spawn_costs": {}, + "spawners": { + "ambient": [ + { + "type": "minecraft:bat", + "maxCount": 8, + "minCount": 8, + "weight": 10 + } + ], + "axolotls": [], + "creature": [ + { + "type": "minecraft:sheep", + "maxCount": 4, + "minCount": 4, + "weight": 12 + }, + { + "type": "minecraft:pig", + "maxCount": 4, + "minCount": 4, + "weight": 10 + }, + { + "type": "minecraft:chicken", + "maxCount": 4, + "minCount": 4, + "weight": 10 + }, + { + "type": "minecraft:cow", + "maxCount": 4, + "minCount": 4, + "weight": 8 + }, + { + "type": "minecraft:wolf", + "maxCount": 4, + "minCount": 4, + "weight": 5 + }, + { + "type": "minecraft:rabbit", + "maxCount": 3, + "minCount": 2, + "weight": 4 + }, + { + "type": "minecraft:llama", + "maxCount": 6, + "minCount": 4, + "weight": 4 + }, + { + "type": "minecraft:fox", + "maxCount": 4, + "minCount": 2, + "weight": 8 + } + ], + "misc": [], + "monster": [ + { + "type": "minecraft:spider", + "maxCount": 4, + "minCount": 4, + "weight": 100 + }, + { + "type": "minecraft:zombie", + "maxCount": 4, + "minCount": 4, + "weight": 95 + }, + { + "type": "minecraft:zombie_villager", + "maxCount": 1, + "minCount": 1, + "weight": 5 + }, + { + "type": "minecraft:skeleton", + "maxCount": 4, + "minCount": 4, + "weight": 100 + }, + { + "type": "minecraft:creeper", + "maxCount": 4, + "minCount": 4, + "weight": 100 + }, + { + "type": "minecraft:slime", + "maxCount": 4, + "minCount": 4, + "weight": 100 + }, + { + "type": "minecraft:enderman", + "maxCount": 4, + "minCount": 1, + "weight": 10 + }, + { + "type": "minecraft:witch", + "maxCount": 1, + "minCount": 1, + "weight": 5 + } + ], + "underground_water_creature": [ + { + "type": "minecraft:glow_squid", + "maxCount": 6, + "minCount": 4, + "weight": 10 + } + ], + "water_ambient": [], + "water_creature": [ + { + "type": "minecraft:squid", + "maxCount": 4, + "minCount": 1, + "weight": 10 + } + ] + }, + "temperature": 0.0 +} \ No newline at end of file diff --git a/src/main/generated/data/modern_beta/worldgen/biome/late_beta_ice_plains.json b/src/main/generated/data/modern_beta/worldgen/biome/late_beta_ice_plains.json new file mode 100644 index 00000000..f222858c --- /dev/null +++ b/src/main/generated/data/modern_beta/worldgen/biome/late_beta_ice_plains.json @@ -0,0 +1,179 @@ +{ + "carvers": { + "air": [ + "minecraft:cave", + "minecraft:cave_extra_underground", + "minecraft:canyon" + ] + }, + "downfall": 0.5, + "effects": { + "fog_color": 12638463, + "sky_color": 8364543, + "water_color": 4159204, + "water_fog_color": 329011 + }, + "features": [ + [], + [ + "minecraft:lake_lava_underground", + "minecraft:lake_lava_surface" + ], + [ + "minecraft:amethyst_geode" + ], + [ + "minecraft:monster_room", + "minecraft:monster_room_deep" + ], + [], + [], + [ + "minecraft:ore_dirt", + "minecraft:ore_gravel", + "minecraft:ore_granite_lower", + "minecraft:ore_diorite_lower", + "minecraft:ore_andesite_lower", + "minecraft:ore_tuff", + "minecraft:ore_coal_upper", + "minecraft:ore_coal_lower", + "minecraft:ore_iron_upper", + "minecraft:ore_iron_middle", + "minecraft:ore_iron_small", + "minecraft:ore_gold", + "minecraft:ore_gold_lower", + "minecraft:ore_redstone", + "minecraft:ore_redstone_lower", + "minecraft:ore_diamond", + "minecraft:ore_diamond_medium", + "minecraft:ore_diamond_large", + "minecraft:ore_diamond_buried", + "minecraft:ore_lapis", + "minecraft:ore_lapis_buried", + "minecraft:ore_copper", + "minecraft:underwater_magma", + "modern_beta:ore_emerald_y95", + "minecraft:disk_sand", + "minecraft:disk_clay", + "minecraft:disk_gravel" + ], + [], + [ + "minecraft:spring_water", + "minecraft:spring_lava" + ], + [ + "minecraft:glow_lichen", + "modern_beta:trees_beta_sparse", + "minecraft:brown_mushroom_normal", + "minecraft:red_mushroom_normal", + "minecraft:patch_sugar_cane", + "minecraft:patch_pumpkin" + ], + [ + "modern_beta:freeze_top_layer" + ] + ], + "has_precipitation": true, + "spawn_costs": {}, + "spawners": { + "ambient": [ + { + "type": "minecraft:bat", + "maxCount": 8, + "minCount": 8, + "weight": 10 + } + ], + "axolotls": [], + "creature": [ + { + "type": "minecraft:rabbit", + "maxCount": 3, + "minCount": 2, + "weight": 10 + }, + { + "type": "minecraft:polar_bear", + "maxCount": 2, + "minCount": 1, + "weight": 1 + } + ], + "misc": [], + "monster": [ + { + "type": "minecraft:spider", + "maxCount": 4, + "minCount": 4, + "weight": 100 + }, + { + "type": "minecraft:zombie", + "maxCount": 4, + "minCount": 4, + "weight": 95 + }, + { + "type": "minecraft:zombie_villager", + "maxCount": 1, + "minCount": 1, + "weight": 5 + }, + { + "type": "minecraft:skeleton", + "maxCount": 4, + "minCount": 4, + "weight": 20 + }, + { + "type": "minecraft:creeper", + "maxCount": 4, + "minCount": 4, + "weight": 100 + }, + { + "type": "minecraft:slime", + "maxCount": 4, + "minCount": 4, + "weight": 100 + }, + { + "type": "minecraft:enderman", + "maxCount": 4, + "minCount": 1, + "weight": 10 + }, + { + "type": "minecraft:witch", + "maxCount": 1, + "minCount": 1, + "weight": 5 + }, + { + "type": "minecraft:stray", + "maxCount": 4, + "minCount": 4, + "weight": 80 + } + ], + "underground_water_creature": [ + { + "type": "minecraft:glow_squid", + "maxCount": 6, + "minCount": 4, + "weight": 10 + } + ], + "water_ambient": [], + "water_creature": [ + { + "type": "minecraft:squid", + "maxCount": 4, + "minCount": 1, + "weight": 10 + } + ] + }, + "temperature": 0.0 +} \ No newline at end of file diff --git a/src/main/generated/data/modern_beta/worldgen/configured_feature/trees_beta_oak_forest.json b/src/main/generated/data/modern_beta/worldgen/configured_feature/trees_beta_oak_forest.json new file mode 100644 index 00000000..dad10818 --- /dev/null +++ b/src/main/generated/data/modern_beta/worldgen/configured_feature/trees_beta_oak_forest.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:random_selector", + "config": { + "default": "minecraft:oak_checked", + "features": [ + { + "chance": 0.33333334, + "feature": "modern_beta:fancy_oak" + } + ] + } +} \ No newline at end of file diff --git a/src/main/generated/data/modern_beta/worldgen/configured_feature/trees_beta_oak_forest_bees.json b/src/main/generated/data/modern_beta/worldgen/configured_feature/trees_beta_oak_forest_bees.json new file mode 100644 index 00000000..97187521 --- /dev/null +++ b/src/main/generated/data/modern_beta/worldgen/configured_feature/trees_beta_oak_forest_bees.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:random_selector", + "config": { + "default": "minecraft:oak_bees_0002", + "features": [ + { + "chance": 0.33333334, + "feature": "modern_beta:fancy_oak" + } + ] + } +} \ No newline at end of file diff --git a/src/main/generated/data/modern_beta/worldgen/placed_feature/trees_beta_oak_forest.json b/src/main/generated/data/modern_beta/worldgen/placed_feature/trees_beta_oak_forest.json new file mode 100644 index 00000000..49474043 --- /dev/null +++ b/src/main/generated/data/modern_beta/worldgen/placed_feature/trees_beta_oak_forest.json @@ -0,0 +1,25 @@ +{ + "feature": "modern_beta:trees_beta_oak_forest", + "placement": [ + { + "type": "modern_beta:beta_noise_based_count", + "count": 5, + "extra_chance": 0.10000000149011612, + "extra_count": 1 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:surface_water_depth_filter", + "max_water_depth": 0 + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/main/generated/data/modern_beta/worldgen/placed_feature/trees_beta_oak_forest_bees.json b/src/main/generated/data/modern_beta/worldgen/placed_feature/trees_beta_oak_forest_bees.json new file mode 100644 index 00000000..9a1191c5 --- /dev/null +++ b/src/main/generated/data/modern_beta/worldgen/placed_feature/trees_beta_oak_forest_bees.json @@ -0,0 +1,25 @@ +{ + "feature": "modern_beta:trees_beta_oak_forest_bees", + "placement": [ + { + "type": "modern_beta:beta_noise_based_count", + "count": 5, + "extra_chance": 0.10000000149011612, + "extra_count": 1 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:surface_water_depth_filter", + "max_water_depth": 0 + }, + { + "type": "minecraft:heightmap", + "heightmap": "OCEAN_FLOOR" + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/main/generated/data/modern_beta/worldgen/world_preset/modern_beta.json b/src/main/generated/data/modern_beta/worldgen/world_preset/modern_beta.json index 2a455533..37cf6508 100644 --- a/src/main/generated/data/modern_beta/worldgen/world_preset/modern_beta.json +++ b/src/main/generated/data/modern_beta/worldgen/world_preset/modern_beta.json @@ -247,6 +247,7 @@ "minecraft:snowy_taiga": "*minecraft:snowy_taiga", "minecraft:sparse_jungle": "*minecraft:sparse_jungle", "minecraft:taiga": "*minecraft:taiga", + "minecraft:windswept_hills": "minecraft:windswept_forest", "modern_beta:beta_desert": "*modern_beta:beta_desert", "modern_beta:beta_forest": "*modern_beta:beta_forest", "modern_beta:beta_plains": "modern_beta:beta_forest", @@ -271,7 +272,7 @@ "fractalOceanShrink": 0, "fractalOceans": 1, "fractalPlains": "modern_beta:late_beta_plains", - "fractalSubVariantScale": 2, + "fractalSubVariantScale": 0, "fractalSubVariants": {}, "fractalTerrainType": "beta", "fractalUseClimaticBiomes": 0, diff --git a/src/main/java/mod/bespectacled/modernbeta/ModernBetaBuiltInProviders.java b/src/main/java/mod/bespectacled/modernbeta/ModernBetaBuiltInProviders.java index c9722d73..15be2424 100644 --- a/src/main/java/mod/bespectacled/modernbeta/ModernBetaBuiltInProviders.java +++ b/src/main/java/mod/bespectacled/modernbeta/ModernBetaBuiltInProviders.java @@ -110,10 +110,11 @@ public class ModernBetaBuiltInProviders { } public static void registerSettingsPresets() { - ModernBetaRegistries.SETTINGS_PRESET.register(ModernBetaBuiltInTypes.DEFAULT_ID, ModernBetaSettingsPresets.PRESET_BETA); - ModernBetaRegistries.SETTINGS_PRESET.register(ModernBetaBuiltInTypes.Preset.BETA.id, ModernBetaSettingsPresets.PRESET_BETA); + ModernBetaRegistries.SETTINGS_PRESET.register(ModernBetaBuiltInTypes.DEFAULT_ID, ModernBetaSettingsPresets.PRESET_BETA_1_7_3); + ModernBetaRegistries.SETTINGS_PRESET.register(ModernBetaBuiltInTypes.Preset.BETA_1_7_3.id, ModernBetaSettingsPresets.PRESET_BETA_1_7_3); + ModernBetaRegistries.SETTINGS_PRESET.register(ModernBetaBuiltInTypes.Preset.BETA_1_1_02.id, ModernBetaSettingsPresets.PRESET_BETA_1_1_02); ModernBetaRegistries.SETTINGS_PRESET.register(ModernBetaBuiltInTypes.Preset.SKYLANDS.id, ModernBetaSettingsPresets.PRESET_SKYLANDS); - ModernBetaRegistries.SETTINGS_PRESET.register(ModernBetaBuiltInTypes.Preset.ALPHA.id, ModernBetaSettingsPresets.PRESET_ALPHA); + ModernBetaRegistries.SETTINGS_PRESET.register(ModernBetaBuiltInTypes.Preset.ALPHA_1_1_2_01.id, ModernBetaSettingsPresets.PRESET_ALPHA); ModernBetaRegistries.SETTINGS_PRESET.register(ModernBetaBuiltInTypes.Preset.INFDEV_611.id, ModernBetaSettingsPresets.PRESET_INFDEV_611); ModernBetaRegistries.SETTINGS_PRESET.register(ModernBetaBuiltInTypes.Preset.INFDEV_420.id, ModernBetaSettingsPresets.PRESET_INFDEV_420); ModernBetaRegistries.SETTINGS_PRESET.register(ModernBetaBuiltInTypes.Preset.INFDEV_415.id, ModernBetaSettingsPresets.PRESET_INFDEV_415); @@ -123,6 +124,7 @@ public class ModernBetaBuiltInProviders { ModernBetaRegistries.SETTINGS_PRESET.register(ModernBetaBuiltInTypes.Preset.CLASSIC_0_30.id, ModernBetaSettingsPresets.PRESET_CLASSIC); ModernBetaRegistries.SETTINGS_PRESET.register(ModernBetaBuiltInTypes.Preset.PE.id, ModernBetaSettingsPresets.PRESET_PE); ModernBetaRegistries.SETTINGS_PRESET.register(ModernBetaBuiltInTypes.Preset.BETA_1_8_1.id, ModernBetaSettingsPresets.PRESET_BETA_1_8_1); + ModernBetaRegistries.SETTINGS_PRESET.register(ModernBetaBuiltInTypes.Preset.BETA_1_9_PRE_3.id, ModernBetaSettingsPresets.PRESET_BETA_1_9_PRE_3); ModernBetaRegistries.SETTINGS_PRESET.register(ModernBetaBuiltInTypes.Preset.RELEASE_1_0_0.id, ModernBetaSettingsPresets.PRESET_RELEASE_1_0_0); ModernBetaRegistries.SETTINGS_PRESET.register(ModernBetaBuiltInTypes.Preset.RELEASE_1_1.id, ModernBetaSettingsPresets.PRESET_RELEASE_1_1); ModernBetaRegistries.SETTINGS_PRESET.register(ModernBetaBuiltInTypes.Preset.RELEASE_1_2_5.id, ModernBetaSettingsPresets.PRESET_RELEASE_1_2_5); diff --git a/src/main/java/mod/bespectacled/modernbeta/ModernBetaBuiltInTypes.java b/src/main/java/mod/bespectacled/modernbeta/ModernBetaBuiltInTypes.java index 3e9a98ab..b28e3f8b 100644 --- a/src/main/java/mod/bespectacled/modernbeta/ModernBetaBuiltInTypes.java +++ b/src/main/java/mod/bespectacled/modernbeta/ModernBetaBuiltInTypes.java @@ -135,9 +135,10 @@ public final class ModernBetaBuiltInTypes { } public enum Preset { - BETA("beta"), + BETA_1_7_3("beta"), + BETA_1_1_02("beta_1_1_02"), SKYLANDS("skylands"), - ALPHA("alpha"), + ALPHA_1_1_2_01("alpha"), INFDEV_611("infdev_611"), INFDEV_420("infdev_420"), INFDEV_415("infdev_415"), @@ -147,6 +148,7 @@ public final class ModernBetaBuiltInTypes { CLASSIC_0_30("classic_0_30"), PE("pe"), BETA_1_8_1("beta_1_8_1"), + BETA_1_9_PRE_3("beta_1_9_pre_3"), RELEASE_1_0_0("release_1_0_0"), RELEASE_1_1("release_1_1"), RELEASE_1_2_5("release_1_2_5"), diff --git a/src/main/java/mod/bespectacled/modernbeta/api/world/chunk/ChunkProviderForcedHeight.java b/src/main/java/mod/bespectacled/modernbeta/api/world/chunk/ChunkProviderForcedHeight.java new file mode 100644 index 00000000..531dac33 --- /dev/null +++ b/src/main/java/mod/bespectacled/modernbeta/api/world/chunk/ChunkProviderForcedHeight.java @@ -0,0 +1,97 @@ +package mod.bespectacled.modernbeta.api.world.chunk; + +import mod.bespectacled.modernbeta.ModernBeta; +import mod.bespectacled.modernbeta.world.biome.HeightConfig; +import mod.bespectacled.modernbeta.world.biome.ModernBetaBiomeSource; +import mod.bespectacled.modernbeta.world.biome.provider.fractal.BiomeInfo; +import mod.bespectacled.modernbeta.world.chunk.ModernBetaChunkGenerator; +import net.minecraft.util.math.MathHelper; +import org.slf4j.event.Level; + +import java.util.HashMap; +import java.util.Map; + +public abstract class ChunkProviderForcedHeight extends ChunkProviderNoise { + private static final float[] BIOME_HEIGHT_WEIGHTS = new float[25]; + + private final Map heightOverrideCache = new HashMap<>(); + + static { + for (int x = -2; x <= 2; x++) { + for (int z = -2; z <= 2; z++) { + float value = 10.0F / MathHelper.sqrt((float)(x * x + z * z) + 0.2F); + BIOME_HEIGHT_WEIGHTS[x + 2 + (z + 2) * 5] = value; + } + } + } + + public ChunkProviderForcedHeight(ModernBetaChunkGenerator chunkGenerator, long seed) { + super(chunkGenerator, seed); + } + + public BiomeInfo getBiomeInfo(int biomeX, int biomeZ) { + if (chunkGenerator.getBiomeSource() instanceof ModernBetaBiomeSource modernBetaBiomeSource) { + return modernBetaBiomeSource.getBiomeForHeightGen(biomeX, 16, biomeZ); + } else { + return BiomeInfo.of(this.getBiome(biomeX, 16, biomeZ, null)); + } + } + + public HeightConfig getHeightConfig(BiomeInfo biomeInfo) { + HeightConfig config = HeightConfig.getHeightConfig(biomeInfo); + String id = biomeInfo.getId(); + if (this.chunkSettings.releaseHeightOverrides.containsKey(id)) { + HeightConfig fallbackConfig = config; + config = this.heightOverrideCache.computeIfAbsent(biomeInfo, k -> { + String heightConfigString = this.chunkSettings.releaseHeightOverrides.get(id); + String[] heightConfigPair = heightConfigString.split(";"); + try { + float scale = Float.parseFloat(heightConfigPair[0]); + float depth = Float.parseFloat(heightConfigPair[1]); + return new HeightConfig(scale, depth); + } catch (NumberFormatException | ArrayIndexOutOfBoundsException ignored) { + ModernBeta.log(Level.WARN, String.format("Invalid height config \"%s\"", heightConfigString)); + return fallbackConfig; + } + }); + } + + return config; + } + + public HeightConfig getRawHeightConfigAt(int x, int z) { + return this.getHeightConfig(this.getBiomeInfo(x, z)); + } + + public HeightConfig getHeightConfigAt(int noiseX, int noiseZ) { + float depth = 0.0F; + float scale = 0.0F; + float totalWeight = 0.0F; + + BiomeInfo biome = this.getBiomeInfo(noiseX, noiseZ); + double minSurfaceHeight = this.getHeightConfig(biome).depth(); + + for (int biomeX = -2; biomeX <= 2; biomeX++) { + for (int biomeZ = -2; biomeZ <= 2; biomeZ++) { + biome = this.getBiomeInfo(noiseX + biomeX, noiseZ + biomeZ); + HeightConfig heightConfig = this.getHeightConfig(biome); + + float weight = BIOME_HEIGHT_WEIGHTS[biomeX + 2 + (biomeZ + 2) * 5] / (heightConfig.depth() + 2.0F); + if (heightConfig.depth() > minSurfaceHeight) { + weight /= 2.0F; + } + + depth += heightConfig.scale() * weight; + scale += heightConfig.depth() * weight; + totalWeight += weight; + } + } + + depth /= totalWeight; + scale /= totalWeight; + depth = depth * 0.9F + 0.1F; + scale = (scale * 4.0F - 1.0F) / 8.0F; + + return new HeightConfig(scale, depth); + } +} diff --git a/src/main/java/mod/bespectacled/modernbeta/client/gui/screen/ModernBetaWorldScreen.java b/src/main/java/mod/bespectacled/modernbeta/client/gui/screen/ModernBetaWorldScreen.java index f1b754b2..cb743115 100644 --- a/src/main/java/mod/bespectacled/modernbeta/client/gui/screen/ModernBetaWorldScreen.java +++ b/src/main/java/mod/bespectacled/modernbeta/client/gui/screen/ModernBetaWorldScreen.java @@ -205,7 +205,7 @@ public class ModernBetaWorldScreen extends ModernBetaScreen { } private void resetPreset() { - this.preset = ModernBetaRegistries.SETTINGS_PRESET.get(ModernBetaBuiltInTypes.Preset.BETA.id); + this.preset = ModernBetaRegistries.SETTINGS_PRESET.get(ModernBetaBuiltInTypes.Preset.BETA_1_7_3.id); this.onPresetChange(); } diff --git a/src/main/java/mod/bespectacled/modernbeta/mixin/client/MixinDebugHud.java b/src/main/java/mod/bespectacled/modernbeta/mixin/client/MixinDebugHud.java index 1f1e4e1e..5af8ede4 100644 --- a/src/main/java/mod/bespectacled/modernbeta/mixin/client/MixinDebugHud.java +++ b/src/main/java/mod/bespectacled/modernbeta/mixin/client/MixinDebugHud.java @@ -2,6 +2,8 @@ package mod.bespectacled.modernbeta.mixin.client; import java.util.List; +import mod.bespectacled.modernbeta.api.world.chunk.ChunkProviderForcedHeight; +import mod.bespectacled.modernbeta.world.biome.HeightConfig; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -107,6 +109,16 @@ public abstract class MixinDebugHud { ); } + if (chunkProvider instanceof ChunkProviderForcedHeight forcedHeightChunkProvider) { + HeightConfig heightConfig = forcedHeightChunkProvider.getRawHeightConfigAt(x >> 2, z >> 2); + info.getReturnValue().add( + String.format( + "[Modern Beta] Forced Height Chunk Provider height: %s", + heightConfig.toString() + ) + ); + } + /* int worldMinY = modernBetaChunkGenerator.getMinimumY(); int surfaceHeight = modernBetaChunkGenerator.getBiomeInjector().sampleMinHeightAround(biomeX, biomeZ); diff --git a/src/main/java/mod/bespectacled/modernbeta/settings/ModernBetaSettingsBiome.java b/src/main/java/mod/bespectacled/modernbeta/settings/ModernBetaSettingsBiome.java index 23a814b1..8ad4a0e0 100644 --- a/src/main/java/mod/bespectacled/modernbeta/settings/ModernBetaSettingsBiome.java +++ b/src/main/java/mod/bespectacled/modernbeta/settings/ModernBetaSettingsBiome.java @@ -308,8 +308,6 @@ public class ModernBetaSettingsBiome implements ModernBetaSettings { List.of() ) ); - // Bunch of stuff commented out down here because feature generation breaks - // when hill variants have differing biomes for some random reason that idk this.fractalHillVariants = Map.ofEntries( Map.entry("minecraft:desert", "*minecraft:desert"), Map.entry("modern_beta:beta_desert", "*modern_beta:beta_desert"), @@ -341,7 +339,7 @@ public class ModernBetaSettingsBiome implements ModernBetaSettings { Map.entry("minecraft:bamboo_jungle", "*minecraft:bamboo_jungle"), Map.entry("minecraft:sparse_jungle", "*minecraft:sparse_jungle"), Map.entry("minecraft:ocean", "*minecraft:ocean"), -// Map.entry("minecraft:windswept_hills", "minecraft:windswept_forest"), + Map.entry("minecraft:windswept_hills", "minecraft:windswept_forest"), Map.entry("minecraft:dark_forest", "minecraft:plains"), Map.entry("minecraft:old_growth_pine_taiga", "*minecraft:old_growth_pine_taiga"), Map.entry("minecraft:old_growth_spruce_taiga", "*minecraft:old_growth_spruce_taiga"), @@ -361,19 +359,19 @@ public class ModernBetaSettingsBiome implements ModernBetaSettings { this.fractalMutatedVariants = Map.ofEntries( Map.entry("minecraft:plains", "minecraft:sunflower_plains"), Map.entry("minecraft:desert", "2*minecraft:desert"), -// Map.entry("minecraft:forest", "minecraft:flower_forest"), + Map.entry("minecraft:forest", "minecraft:flower_forest"), Map.entry("minecraft:taiga", "2*minecraft:taiga"), Map.entry("minecraft:swamp", "*minecraft:swamp"), Map.entry("minecraft:jungle", "2*minecraft:jungle"), Map.entry("minecraft:sparse_jungle", "2*minecraft:sparse_jungle"), Map.entry("minecraft:snowy_taiga", "2*minecraft:snowy_taiga"), -// Map.entry("minecraft:savanna", "minecraft:windswept_savanna"), -// Map.entry("*minecraft:savanna", "*minecraft:windswept_savanna"), + Map.entry("minecraft:savanna", "minecraft:windswept_savanna"), + Map.entry("*minecraft:savanna", "*minecraft:windswept_savanna"), Map.entry("minecraft:badlands", "*minecraft:eroded_badlands"), Map.entry("*minecraft:wooded_badlands", "2*minecraft:wooded_badlands"), Map.entry("*minecraft:badlands", "2*minecraft:badlands"), -// Map.entry("minecraft:birch_forest", "minecraft:old_growth_birch_forest"), -// Map.entry("*minecraft:birch_forest", "*minecraft:old_growth_birch_forest"), + Map.entry("minecraft:birch_forest", "minecraft:old_growth_birch_forest"), + Map.entry("*minecraft:birch_forest", "*minecraft:old_growth_birch_forest"), Map.entry("minecraft:dark_forest", "*minecraft:dark_forest"), Map.entry("minecraft:old_growth_pine_taiga", "minecraft:old_growth_spruce_taiga"), Map.entry("minecraft:windswept_hills", "minecraft:windswept_gravelly_hills"), @@ -386,7 +384,7 @@ public class ModernBetaSettingsBiome implements ModernBetaSettings { this.fractalBiomeScale = 4; this.fractalHillScale = 2; - this.fractalSubVariantScale = 2; + this.fractalSubVariantScale = 0; this.fractalBeachShrink = 1; this.fractalOceanShrink = 0; this.fractalTerrainType = FractalSettings.TerrainType.BETA.id; diff --git a/src/main/java/mod/bespectacled/modernbeta/settings/ModernBetaSettingsPresets.java b/src/main/java/mod/bespectacled/modernbeta/settings/ModernBetaSettingsPresets.java index ec13d776..4088a471 100644 --- a/src/main/java/mod/bespectacled/modernbeta/settings/ModernBetaSettingsPresets.java +++ b/src/main/java/mod/bespectacled/modernbeta/settings/ModernBetaSettingsPresets.java @@ -16,7 +16,8 @@ import net.minecraft.nbt.NbtCompound; import net.minecraft.world.biome.BiomeKeys; public class ModernBetaSettingsPresets { - public static final ModernBetaSettingsPreset PRESET_BETA = presetBeta(); + public static final ModernBetaSettingsPreset PRESET_BETA_1_7_3 = presetBeta(false); + public static final ModernBetaSettingsPreset PRESET_BETA_1_1_02 = presetBeta(true); public static final ModernBetaSettingsPreset PRESET_ALPHA = presetAlpha(); public static final ModernBetaSettingsPreset PRESET_SKYLANDS = presetSkylands(); public static final ModernBetaSettingsPreset PRESET_INFDEV_415 = presetInfdev415(); @@ -28,6 +29,7 @@ public class ModernBetaSettingsPresets { public static final ModernBetaSettingsPreset PRESET_CLASSIC = presetClassic(); public static final ModernBetaSettingsPreset PRESET_PE = presetPE(); public static final ModernBetaSettingsPreset PRESET_BETA_1_8_1 = presetBeta181(); + public static final ModernBetaSettingsPreset PRESET_BETA_1_9_PRE_3 = presetBeta19Pre3(); public static final ModernBetaSettingsPreset PRESET_RELEASE_1_0_0 = preset100(); public static final ModernBetaSettingsPreset PRESET_RELEASE_1_1 = preset11(); public static final ModernBetaSettingsPreset PRESET_RELEASE_1_2_5 = preset125(); @@ -51,6 +53,10 @@ public class ModernBetaSettingsPresets { public static final ModernBetaSettingsPreset PRESET_INDEV_HELL = presetIndevHell(); private static ModernBetaSettingsPreset presetBeta() { + return presetBeta(false); + } + + private static ModernBetaSettingsPreset presetBeta(boolean oakBiomes) { ModernBetaSettingsChunk.Builder settingsChunk = new ModernBetaSettingsChunk.Builder(); ModernBetaSettingsBiome.Builder settingsBiome = new ModernBetaSettingsBiome.Builder(); ModernBetaSettingsCaveBiome.Builder settingsCaveBiome = new ModernBetaSettingsCaveBiome.Builder(); @@ -88,7 +94,7 @@ public class ModernBetaSettingsPresets { ModernBetaBiomes.BETA_OCEAN.getValue().toString() ), new ClimateMapping( - ModernBetaBiomes.BETA_FOREST.getValue().toString(), + (oakBiomes ? ModernBetaBiomes.BETA_OAK_FOREST : ModernBetaBiomes.BETA_FOREST).getValue().toString(), ModernBetaBiomes.BETA_OCEAN.getValue().toString() ), new ClimateMapping( @@ -120,7 +126,7 @@ public class ModernBetaSettingsPresets { ModernBetaBiomes.BETA_COLD_OCEAN.getValue().toString() ), new ClimateMapping( - ModernBetaBiomes.BETA_TAIGA.getValue().toString(), + (oakBiomes ? ModernBetaBiomes.BETA_OAK_TAIGA : ModernBetaBiomes.BETA_TAIGA).getValue().toString(), ModernBetaBiomes.BETA_FROZEN_OCEAN.getValue().toString() ), new ClimateMapping( @@ -156,7 +162,7 @@ public class ModernBetaSettingsPresets { settingsCaveBiome.build() ); } - + private static ModernBetaSettingsPreset presetAlpha() { ModernBetaSettingsChunk.Builder settingsChunk = new ModernBetaSettingsChunk.Builder(); ModernBetaSettingsBiome.Builder settingsBiome = new ModernBetaSettingsBiome.Builder(); @@ -1312,6 +1318,36 @@ public class ModernBetaSettingsPresets { "modern_beta:late_beta_plains", "modern_beta:late_beta_taiga" ); + settingsBiome.fractalIcePlains = "modern_beta:late_beta_ice_plains"; + + return new ModernBetaSettingsPreset( + settingsChunk.build(), + settingsBiome.build(), + settingsCaveBiome.build() + ); + } + + private static ModernBetaSettingsPreset presetBeta19Pre3() { + ModernBetaSettingsChunk.Builder settingsChunk = new ModernBetaSettingsChunk.Builder(); + ModernBetaSettingsBiome.Builder settingsBiome = new ModernBetaSettingsBiome.Builder(); + ModernBetaSettingsCaveBiome.Builder settingsCaveBiome = new ModernBetaSettingsCaveBiome.Builder(); + + settingsChunk.chunkProvider = ModernBetaBuiltInTypes.Chunk.EARLY_RELEASE.id; + settingsChunk.useFixedCaves = true; + + settingsBiome.biomeProvider = ModernBetaBuiltInTypes.Biome.FRACTAL.id; + settingsBiome.fractalBiomes = List.of( + "minecraft:desert", + "minecraft:forest", + "modern_beta:late_beta_extreme_hills", + "modern_beta:early_release_swampland", + "modern_beta:late_beta_plains", + "modern_beta:late_beta_taiga" + ); + settingsBiome.fractalIcePlains = "modern_beta:late_beta_ice_plains"; + settingsBiome.fractalTerrainType = FractalSettings.TerrainType.EARLY_RELEASE.id; + settingsBiome.fractalAddSnow = true; + settingsBiome.fractalAddMushroomIslands = true; return new ModernBetaSettingsPreset( settingsChunk.build(), @@ -1435,6 +1471,18 @@ public class ModernBetaSettingsPresets { "minecraft:jungle" ); settingsBiome.fractalTerrainType = FractalSettings.TerrainType.EARLY_RELEASE.id; + settingsBiome.fractalSubVariants = Map.ofEntries( + Map.entry("modern_beta:early_release_ice_plains", List.of( + "modern_beta:early_release_ice_plains", + "modern_beta:early_release_ice_plains", + "modern_beta:early_release_ice_plains", + "modern_beta:early_release_ice_plains", + "modern_beta:early_release_ice_plains", + "modern_beta:early_release_taiga", + "modern_beta:early_release_ice_plains" + )) + ); + settingsBiome.fractalSubVariantScale = 0; settingsBiome.fractalAddSnow = true; settingsBiome.fractalAddMushroomIslands = true; settingsBiome.fractalAddBeaches = true; diff --git a/src/main/java/mod/bespectacled/modernbeta/world/biome/HeightConfig.java b/src/main/java/mod/bespectacled/modernbeta/world/biome/HeightConfig.java index 30af7d34..1ee28d5a 100644 --- a/src/main/java/mod/bespectacled/modernbeta/world/biome/HeightConfig.java +++ b/src/main/java/mod/bespectacled/modernbeta/world/biome/HeightConfig.java @@ -3,14 +3,13 @@ package mod.bespectacled.modernbeta.world.biome; import mod.bespectacled.modernbeta.api.registry.ModernBetaRegistries; import mod.bespectacled.modernbeta.world.biome.provider.fractal.BiomeInfo; import net.minecraft.registry.RegistryKeys; -import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.registry.tag.TagKey; import net.minecraft.util.Identifier; import net.minecraft.world.biome.Biome; import java.util.List; -public record HeightConfig(float scale, float depth, byte type) { +public record HeightConfig(float depth, float scale, byte type) { public static final HeightConfig DEFAULT = new HeightConfig(0.1F, 0.3F); public static final HeightConfig OCEAN = new HeightConfig(-1.0F, 0.4F); public static final HeightConfig DESERT = new HeightConfig(0.1F, 0.2F); @@ -33,12 +32,12 @@ public record HeightConfig(float scale, float depth, byte type) { public static final HeightConfig PLATEAU_HILL = new HeightConfig(1.8F, 0.2F, 1); public static final HeightConfig DEEP_OCEAN = new HeightConfig(-1.8F, 0.2F); - public HeightConfig(float scale, float depth) { - this(scale, depth, 0); + public HeightConfig(float depth, float scale) { + this(depth, scale, 0); } - public HeightConfig(float scale, float depth, int type) { - this(scale, depth, (byte) type); + public HeightConfig(float depth, float scale, int type) { + this(depth, scale, (byte) type); } public static HeightConfig getHeightConfig(BiomeInfo biomeInfo) { @@ -55,4 +54,13 @@ public record HeightConfig(float scale, float depth, byte type) { private static TagKey keyOf(String id) { return TagKey.of(RegistryKeys.BIOME, new Identifier(id)); } + + @Override + public String toString() { + return String.format( + "[depth=%.3f, scale=%.3f]", + this.depth, + this.scale + ); + } } diff --git a/src/main/java/mod/bespectacled/modernbeta/world/biome/ModernBetaBiomeFeatures.java b/src/main/java/mod/bespectacled/modernbeta/world/biome/ModernBetaBiomeFeatures.java index 708c9c8e..90b1fdb6 100644 --- a/src/main/java/mod/bespectacled/modernbeta/world/biome/ModernBetaBiomeFeatures.java +++ b/src/main/java/mod/bespectacled/modernbeta/world/biome/ModernBetaBiomeFeatures.java @@ -71,7 +71,7 @@ public class ModernBetaBiomeFeatures { } } - public static void addForestFeatures(GenerationSettings.LookupBackedBuilder builder, boolean pe) { + public static void addForestFeatures(GenerationSettings.LookupBackedBuilder builder, boolean pe, boolean hasBirch) { addDefaultFeatures(builder, pe ? ModernBetaFeatureSettings.PE : ModernBetaFeatureSettings.BETA); if (pe) { @@ -80,7 +80,9 @@ public class ModernBetaBiomeFeatures { } else { builder.feature(Feature.VEGETAL_DECORATION, ModernBetaVegetationPlacedFeatures.PATCH_DANDELION_2); builder.feature(Feature.VEGETAL_DECORATION, ModernBetaVegetationPlacedFeatures.PATCH_POPPY); - builder.feature(Feature.VEGETAL_DECORATION, ModernBetaVegetationPlacedFeatures.TREES_BETA_FOREST_BEES); + builder.feature(Feature.VEGETAL_DECORATION, + hasBirch ? ModernBetaVegetationPlacedFeatures.TREES_BETA_FOREST_BEES + : ModernBetaVegetationPlacedFeatures.TREES_BETA_OAK_FOREST_BEES); builder.feature(Feature.VEGETAL_DECORATION, VegetationPlacedFeatures.FOREST_FLOWERS); builder.feature(Feature.VEGETAL_DECORATION, VegetationPlacedFeatures.PATCH_GRASS_FOREST); @@ -217,7 +219,7 @@ public class ModernBetaBiomeFeatures { DefaultBiomeFeatures.addDefaultVegetation(builder); } - public static void addTaigaFeatures(GenerationSettings.LookupBackedBuilder builder, boolean pe) { + public static void addTaigaFeatures(GenerationSettings.LookupBackedBuilder builder, boolean pe, boolean spruce) { addDefaultFeatures(builder, pe ? ModernBetaFeatureSettings.PE : ModernBetaFeatureSettings.BETA); if (pe) { @@ -226,7 +228,9 @@ public class ModernBetaBiomeFeatures { } else { builder.feature(Feature.VEGETAL_DECORATION, ModernBetaVegetationPlacedFeatures.PATCH_DANDELION_2); builder.feature(Feature.VEGETAL_DECORATION, ModernBetaVegetationPlacedFeatures.PATCH_POPPY); - builder.feature(Feature.VEGETAL_DECORATION, ModernBetaVegetationPlacedFeatures.TREES_BETA_TAIGA); + builder.feature(Feature.VEGETAL_DECORATION, + spruce ? ModernBetaVegetationPlacedFeatures.TREES_BETA_TAIGA + : ModernBetaVegetationPlacedFeatures.TREES_BETA_OAK_FOREST); builder.feature(Feature.VEGETAL_DECORATION, ModernBetaVegetationPlacedFeatures.PATCH_GRASS_TAIGA_1); } @@ -277,12 +281,12 @@ public class ModernBetaBiomeFeatures { DefaultBiomeFeatures.addDefaultVegetation(builder); } - public static void addIcePlainsFeatures(GenerationSettings.LookupBackedBuilder builder) { + public static void addIcePlainsFeatures(GenerationSettings.LookupBackedBuilder builder, boolean grass) { addDefaultFeatures(builder, ModernBetaFeatureSettings.EARLY_RELEASE); - builder.feature(Feature.VEGETAL_DECORATION, ModernBetaVegetationPlacedFeatures.PATCH_POPPY); + if (grass) builder.feature(Feature.VEGETAL_DECORATION, ModernBetaVegetationPlacedFeatures.PATCH_POPPY); builder.feature(Feature.VEGETAL_DECORATION, ModernBetaVegetationPlacedFeatures.TREES_BETA_SPARSE); - builder.feature(Feature.VEGETAL_DECORATION, ModernBetaVegetationPlacedFeatures.PATCH_GRASS_TAIGA_1); + if (grass) builder.feature(Feature.VEGETAL_DECORATION, ModernBetaVegetationPlacedFeatures.PATCH_GRASS_TAIGA_1); DefaultBiomeFeatures.addDefaultDisks(builder); DefaultBiomeFeatures.addDefaultMushrooms(builder); diff --git a/src/main/java/mod/bespectacled/modernbeta/world/biome/ModernBetaBiomeTags.java b/src/main/java/mod/bespectacled/modernbeta/world/biome/ModernBetaBiomeTags.java index 2d30aa58..cb33ce74 100644 --- a/src/main/java/mod/bespectacled/modernbeta/world/biome/ModernBetaBiomeTags.java +++ b/src/main/java/mod/bespectacled/modernbeta/world/biome/ModernBetaBiomeTags.java @@ -2,6 +2,7 @@ package mod.bespectacled.modernbeta.world.biome; public class ModernBetaBiomeTags { public static final String BETA_FOREST = "beta_forest"; + public static final String BETA_OAK_FOREST = "beta_oak_forest"; public static final String BETA_SHRUBLAND = "beta_shrubland"; public static final String BETA_DESERT = "beta_desert"; public static final String BETA_SAVANNA = "beta_savanna"; @@ -10,6 +11,7 @@ public class ModernBetaBiomeTags { public static final String BETA_RAINFOREST = "beta_rainforest"; public static final String BETA_SWAMPLAND = "beta_swampland"; public static final String BETA_TAIGA = "beta_taiga"; + public static final String BETA_OAK_TAIGA = "beta_oak_taiga"; public static final String BETA_TUNDRA = "beta_tundra"; public static final String BETA_ICE_DESERT = "beta_ice_desert"; @@ -54,6 +56,7 @@ public class ModernBetaBiomeTags { public static final String INDEV_WOODS = "indev_woods"; public static final String LATE_BETA_EXTREME_HILLS = "late_beta_extreme_hills"; + public static final String LATE_BETA_ICE_PLAINS = "late_beta_ice_plains"; public static final String LATE_BETA_SWAMPLAND = "late_beta_swampland"; public static final String LATE_BETA_PLAINS = "late_beta_plains"; public static final String LATE_BETA_TAIGA = "late_beta_taiga"; diff --git a/src/main/java/mod/bespectacled/modernbeta/world/biome/ModernBetaBiomes.java b/src/main/java/mod/bespectacled/modernbeta/world/biome/ModernBetaBiomes.java index 2ab1f255..ac304c50 100644 --- a/src/main/java/mod/bespectacled/modernbeta/world/biome/ModernBetaBiomes.java +++ b/src/main/java/mod/bespectacled/modernbeta/world/biome/ModernBetaBiomes.java @@ -3,33 +3,14 @@ package mod.bespectacled.modernbeta.world.biome; import java.util.function.BiFunction; import mod.bespectacled.modernbeta.ModernBeta; +import mod.bespectacled.modernbeta.world.biome.biomes.beta.*; import mod.bespectacled.modernbeta.world.biome.biomes.earlyrelease.BiomeEarlyReleaseIcePlains; import mod.bespectacled.modernbeta.world.biome.biomes.earlyrelease.BiomeEarlyReleaseSwampland; import mod.bespectacled.modernbeta.world.biome.biomes.earlyrelease.BiomeEarlyReleaseTaiga; import mod.bespectacled.modernbeta.world.biome.biomes.infdev.*; -import mod.bespectacled.modernbeta.world.biome.biomes.latebeta.BiomeLateBetaExtremeHills; -import mod.bespectacled.modernbeta.world.biome.biomes.latebeta.BiomeLateBetaPlains; -import mod.bespectacled.modernbeta.world.biome.biomes.latebeta.BiomeLateBetaSwampland; -import mod.bespectacled.modernbeta.world.biome.biomes.latebeta.BiomeLateBetaTaiga; +import mod.bespectacled.modernbeta.world.biome.biomes.latebeta.*; import mod.bespectacled.modernbeta.world.biome.biomes.alpha.BiomeAlpha; import mod.bespectacled.modernbeta.world.biome.biomes.alpha.BiomeAlphaWinter; -import mod.bespectacled.modernbeta.world.biome.biomes.beta.BiomeBetaColdOcean; -import mod.bespectacled.modernbeta.world.biome.biomes.beta.BiomeBetaDesert; -import mod.bespectacled.modernbeta.world.biome.biomes.beta.BiomeBetaForest; -import mod.bespectacled.modernbeta.world.biome.biomes.beta.BiomeBetaFrozenOcean; -import mod.bespectacled.modernbeta.world.biome.biomes.beta.BiomeBetaIceDesert; -import mod.bespectacled.modernbeta.world.biome.biomes.beta.BiomeBetaLukewarmOcean; -import mod.bespectacled.modernbeta.world.biome.biomes.beta.BiomeBetaOcean; -import mod.bespectacled.modernbeta.world.biome.biomes.beta.BiomeBetaPlains; -import mod.bespectacled.modernbeta.world.biome.biomes.beta.BiomeBetaRainforest; -import mod.bespectacled.modernbeta.world.biome.biomes.beta.BiomeBetaSavanna; -import mod.bespectacled.modernbeta.world.biome.biomes.beta.BiomeBetaSeasonalForest; -import mod.bespectacled.modernbeta.world.biome.biomes.beta.BiomeBetaShrubland; -import mod.bespectacled.modernbeta.world.biome.biomes.beta.BiomeBetaSky; -import mod.bespectacled.modernbeta.world.biome.biomes.beta.BiomeBetaSwampland; -import mod.bespectacled.modernbeta.world.biome.biomes.beta.BiomeBetaTaiga; -import mod.bespectacled.modernbeta.world.biome.biomes.beta.BiomeBetaTundra; -import mod.bespectacled.modernbeta.world.biome.biomes.beta.BiomeBetaWarmOcean; import mod.bespectacled.modernbeta.world.biome.biomes.indev.BiomeIndevHell; import mod.bespectacled.modernbeta.world.biome.biomes.indev.BiomeIndevNormal; import mod.bespectacled.modernbeta.world.biome.biomes.indev.BiomeIndevParadise; @@ -61,6 +42,7 @@ import net.minecraft.world.gen.feature.PlacedFeature; public class ModernBetaBiomes { public static final RegistryKey BETA_FOREST = keyOf(ModernBeta.createId(ModernBetaBiomeTags.BETA_FOREST)); + public static final RegistryKey BETA_OAK_FOREST = keyOf(ModernBeta.createId(ModernBetaBiomeTags.BETA_OAK_FOREST)); public static final RegistryKey BETA_SHRUBLAND = keyOf(ModernBeta.createId(ModernBetaBiomeTags.BETA_SHRUBLAND)); public static final RegistryKey BETA_DESERT = keyOf(ModernBeta.createId(ModernBetaBiomeTags.BETA_DESERT)); public static final RegistryKey BETA_SAVANNA = keyOf(ModernBeta.createId(ModernBetaBiomeTags.BETA_SAVANNA)); @@ -69,6 +51,7 @@ public class ModernBetaBiomes { public static final RegistryKey BETA_RAINFOREST = keyOf(ModernBeta.createId(ModernBetaBiomeTags.BETA_RAINFOREST)); public static final RegistryKey BETA_SWAMPLAND = keyOf(ModernBeta.createId(ModernBetaBiomeTags.BETA_SWAMPLAND)); public static final RegistryKey BETA_TAIGA = keyOf(ModernBeta.createId(ModernBetaBiomeTags.BETA_TAIGA)); + public static final RegistryKey BETA_OAK_TAIGA = keyOf(ModernBeta.createId(ModernBetaBiomeTags.BETA_OAK_TAIGA)); public static final RegistryKey BETA_TUNDRA = keyOf(ModernBeta.createId(ModernBetaBiomeTags.BETA_TUNDRA)); public static final RegistryKey BETA_ICE_DESERT = keyOf(ModernBeta.createId(ModernBetaBiomeTags.BETA_ICE_DESERT)); @@ -113,6 +96,7 @@ public class ModernBetaBiomes { public static final RegistryKey INDEV_WOODS = keyOf(ModernBeta.createId(ModernBetaBiomeTags.INDEV_WOODS)); public static final RegistryKey LATE_BETA_EXTREME_HILLS = keyOf(ModernBeta.createId(ModernBetaBiomeTags.LATE_BETA_EXTREME_HILLS)); + public static final RegistryKey LATE_BETA_ICE_PLAINS = keyOf(ModernBeta.createId(ModernBetaBiomeTags.LATE_BETA_ICE_PLAINS)); public static final RegistryKey LATE_BETA_SWAMPLAND = keyOf(ModernBeta.createId(ModernBetaBiomeTags.LATE_BETA_SWAMPLAND)); public static final RegistryKey LATE_BETA_PLAINS = keyOf(ModernBeta.createId(ModernBetaBiomeTags.LATE_BETA_PLAINS)); public static final RegistryKey LATE_BETA_TAIGA = keyOf(ModernBeta.createId(ModernBetaBiomeTags.LATE_BETA_TAIGA)); @@ -124,6 +108,7 @@ public class ModernBetaBiomes { public static void bootstrap(Registerable biomeRegisterable) { register(biomeRegisterable, BETA_FOREST, BiomeBetaForest::create); + register(biomeRegisterable, BETA_OAK_FOREST, BiomeBetaOakForest::create); register(biomeRegisterable, BETA_SHRUBLAND, BiomeBetaShrubland::create); register(biomeRegisterable, BETA_DESERT, BiomeBetaDesert::create); register(biomeRegisterable, BETA_SAVANNA, BiomeBetaSavanna::create); @@ -132,6 +117,7 @@ public class ModernBetaBiomes { register(biomeRegisterable, BETA_RAINFOREST, BiomeBetaRainforest::create); register(biomeRegisterable, BETA_SWAMPLAND, BiomeBetaSwampland::create); register(biomeRegisterable, BETA_TAIGA, BiomeBetaTaiga::create); + register(biomeRegisterable, BETA_OAK_TAIGA, BiomeBetaOakTaiga::create); register(biomeRegisterable, BETA_TUNDRA, BiomeBetaTundra::create); register(biomeRegisterable, BETA_ICE_DESERT, BiomeBetaIceDesert::create); @@ -176,6 +162,7 @@ public class ModernBetaBiomes { register(biomeRegisterable, INDEV_WOODS, BiomeIndevWoods::create); register(biomeRegisterable, LATE_BETA_EXTREME_HILLS, BiomeLateBetaExtremeHills::create); + register(biomeRegisterable, LATE_BETA_ICE_PLAINS, BiomeLateBetaIcePlains::create); register(biomeRegisterable, LATE_BETA_SWAMPLAND, BiomeLateBetaSwampland::create); register(biomeRegisterable, LATE_BETA_PLAINS, BiomeLateBetaPlains::create); register(biomeRegisterable, LATE_BETA_TAIGA, BiomeLateBetaTaiga::create); diff --git a/src/main/java/mod/bespectacled/modernbeta/world/biome/biomes/beta/BiomeBetaForest.java b/src/main/java/mod/bespectacled/modernbeta/world/biome/biomes/beta/BiomeBetaForest.java index 2921256c..51cc4767 100644 --- a/src/main/java/mod/bespectacled/modernbeta/world/biome/biomes/beta/BiomeBetaForest.java +++ b/src/main/java/mod/bespectacled/modernbeta/world/biome/biomes/beta/BiomeBetaForest.java @@ -20,7 +20,7 @@ public class BiomeBetaForest { ModernBetaBiomeMobs.addTurtles(spawnSettings); GenerationSettings.LookupBackedBuilder genSettings = new GenerationSettings.LookupBackedBuilder(featureLookup, carverLookup); - ModernBetaBiomeFeatures.addForestFeatures(genSettings, false); + ModernBetaBiomeFeatures.addForestFeatures(genSettings, false, true); return (new Biome.Builder()) .precipitation(true) diff --git a/src/main/java/mod/bespectacled/modernbeta/world/biome/biomes/beta/BiomeBetaOakForest.java b/src/main/java/mod/bespectacled/modernbeta/world/biome/biomes/beta/BiomeBetaOakForest.java new file mode 100644 index 00000000..272fdd2f --- /dev/null +++ b/src/main/java/mod/bespectacled/modernbeta/world/biome/biomes/beta/BiomeBetaOakForest.java @@ -0,0 +1,39 @@ +package mod.bespectacled.modernbeta.world.biome.biomes.beta; + +import mod.bespectacled.modernbeta.world.biome.ModernBetaBiomeColors; +import mod.bespectacled.modernbeta.world.biome.ModernBetaBiomeFeatures; +import mod.bespectacled.modernbeta.world.biome.ModernBetaBiomeMobs; +import net.minecraft.registry.RegistryEntryLookup; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.BiomeEffects; +import net.minecraft.world.biome.GenerationSettings; +import net.minecraft.world.biome.SpawnSettings; +import net.minecraft.world.gen.carver.ConfiguredCarver; +import net.minecraft.world.gen.feature.PlacedFeature; + +public class BiomeBetaOakForest { + public static Biome create(RegistryEntryLookup featureLookup, RegistryEntryLookup> carverLookup) { + SpawnSettings.Builder spawnSettings = new SpawnSettings.Builder(); + ModernBetaBiomeMobs.addCommonMobs(spawnSettings); + ModernBetaBiomeMobs.addSquid(spawnSettings); + ModernBetaBiomeMobs.addWolves(spawnSettings); + ModernBetaBiomeMobs.addTurtles(spawnSettings); + + GenerationSettings.LookupBackedBuilder genSettings = new GenerationSettings.LookupBackedBuilder(featureLookup, carverLookup); + ModernBetaBiomeFeatures.addForestFeatures(genSettings, false, false); + + return (new Biome.Builder()) + .precipitation(true) + .temperature(0.7F) + .downfall(0.8F) + .effects((new BiomeEffects.Builder()) + .skyColor(ModernBetaBiomeColors.BETA_TEMP_SKY_COLOR) + .fogColor(ModernBetaBiomeColors.BETA_FOG_COLOR) + .waterColor(ModernBetaBiomeColors.VANILLA_WATER_COLOR) + .waterFogColor(ModernBetaBiomeColors.VANILLA_WATER_FOG_COLOR) + .build()) + .spawnSettings(spawnSettings.build()) + .generationSettings(genSettings.build()) + .build(); + } +} diff --git a/src/main/java/mod/bespectacled/modernbeta/world/biome/biomes/beta/BiomeBetaOakTaiga.java b/src/main/java/mod/bespectacled/modernbeta/world/biome/biomes/beta/BiomeBetaOakTaiga.java new file mode 100644 index 00000000..bb3b1188 --- /dev/null +++ b/src/main/java/mod/bespectacled/modernbeta/world/biome/biomes/beta/BiomeBetaOakTaiga.java @@ -0,0 +1,41 @@ +package mod.bespectacled.modernbeta.world.biome.biomes.beta; + +import mod.bespectacled.modernbeta.world.biome.ModernBetaBiomeColors; +import mod.bespectacled.modernbeta.world.biome.ModernBetaBiomeFeatures; +import mod.bespectacled.modernbeta.world.biome.ModernBetaBiomeMobs; +import net.minecraft.registry.RegistryEntryLookup; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.BiomeEffects; +import net.minecraft.world.biome.GenerationSettings; +import net.minecraft.world.biome.SpawnSettings; +import net.minecraft.world.gen.carver.ConfiguredCarver; +import net.minecraft.world.gen.feature.PlacedFeature; + +public class BiomeBetaOakTaiga { + public static Biome create(RegistryEntryLookup featureLookup, RegistryEntryLookup> carverLookup) { + SpawnSettings.Builder spawnSettings = new SpawnSettings.Builder(); + ModernBetaBiomeMobs.addCommonMobs(spawnSettings); + ModernBetaBiomeMobs.addSquid(spawnSettings); + ModernBetaBiomeMobs.addTaigaMobs(spawnSettings); + + GenerationSettings.LookupBackedBuilder genSettings = new GenerationSettings.LookupBackedBuilder(featureLookup, carverLookup); + ModernBetaBiomeFeatures.addTaigaFeatures(genSettings, false, false); + + return (new Biome.Builder()) + .precipitation(true) + //.temperature(0.4F) TODO: Re-add this later as it looks more accurate; for some reason precipitation currently does not work properly. + //.downfall(0.8F) + .temperature(0.0F) + .downfall(0.5F) + .effects((new BiomeEffects.Builder()) + //.skyColor(8756991) TODO: Re-add when above fixed + .skyColor(ModernBetaBiomeColors.BETA_COOL_SKY_COLOR) + .fogColor(ModernBetaBiomeColors.BETA_FOG_COLOR) + .waterColor(ModernBetaBiomeColors.VANILLA_FROZEN_WATER_COLOR) + .waterFogColor(ModernBetaBiomeColors.VANILLA_FROZEN_WATER_FOG_COLOR) + .build()) + .spawnSettings(spawnSettings.build()) + .generationSettings(genSettings.build()) + .build(); + } +} diff --git a/src/main/java/mod/bespectacled/modernbeta/world/biome/biomes/beta/BiomeBetaTaiga.java b/src/main/java/mod/bespectacled/modernbeta/world/biome/biomes/beta/BiomeBetaTaiga.java index 1292d2df..a9ec1404 100644 --- a/src/main/java/mod/bespectacled/modernbeta/world/biome/biomes/beta/BiomeBetaTaiga.java +++ b/src/main/java/mod/bespectacled/modernbeta/world/biome/biomes/beta/BiomeBetaTaiga.java @@ -19,7 +19,7 @@ public class BiomeBetaTaiga { ModernBetaBiomeMobs.addTaigaMobs(spawnSettings); GenerationSettings.LookupBackedBuilder genSettings = new GenerationSettings.LookupBackedBuilder(featureLookup, carverLookup); - ModernBetaBiomeFeatures.addTaigaFeatures(genSettings, false); + ModernBetaBiomeFeatures.addTaigaFeatures(genSettings, false, true); return (new Biome.Builder()) .precipitation(true) diff --git a/src/main/java/mod/bespectacled/modernbeta/world/biome/biomes/earlyrelease/BiomeEarlyReleaseIcePlains.java b/src/main/java/mod/bespectacled/modernbeta/world/biome/biomes/earlyrelease/BiomeEarlyReleaseIcePlains.java index 1dca70ea..70694aa5 100644 --- a/src/main/java/mod/bespectacled/modernbeta/world/biome/biomes/earlyrelease/BiomeEarlyReleaseIcePlains.java +++ b/src/main/java/mod/bespectacled/modernbeta/world/biome/biomes/earlyrelease/BiomeEarlyReleaseIcePlains.java @@ -16,7 +16,7 @@ public class BiomeEarlyReleaseIcePlains { ModernBetaBiomeMobs.addSquid(spawnSettings); GenerationSettings.LookupBackedBuilder genSettings = new GenerationSettings.LookupBackedBuilder(featureLookup, carverLookup); - ModernBetaBiomeFeatures.addIcePlainsFeatures(genSettings); + ModernBetaBiomeFeatures.addIcePlainsFeatures(genSettings, true); return (new Biome.Builder()) .precipitation(true) diff --git a/src/main/java/mod/bespectacled/modernbeta/world/biome/biomes/latebeta/BiomeLateBetaIcePlains.java b/src/main/java/mod/bespectacled/modernbeta/world/biome/biomes/latebeta/BiomeLateBetaIcePlains.java new file mode 100644 index 00000000..6f9b2a9e --- /dev/null +++ b/src/main/java/mod/bespectacled/modernbeta/world/biome/biomes/latebeta/BiomeLateBetaIcePlains.java @@ -0,0 +1,35 @@ +package mod.bespectacled.modernbeta.world.biome.biomes.latebeta; + +import mod.bespectacled.modernbeta.world.biome.ModernBetaBiomeColors; +import mod.bespectacled.modernbeta.world.biome.ModernBetaBiomeFeatures; +import mod.bespectacled.modernbeta.world.biome.ModernBetaBiomeMobs; +import net.minecraft.registry.RegistryEntryLookup; +import net.minecraft.world.biome.*; +import net.minecraft.world.gen.carver.ConfiguredCarver; +import net.minecraft.world.gen.feature.DefaultBiomeFeatures; +import net.minecraft.world.gen.feature.PlacedFeature; + +public class BiomeLateBetaIcePlains { + public static Biome create(RegistryEntryLookup featureLookup, RegistryEntryLookup> carverLookup) { + SpawnSettings.Builder spawnSettings = new SpawnSettings.Builder(); + DefaultBiomeFeatures.addSnowyMobs(spawnSettings); + ModernBetaBiomeMobs.addSquid(spawnSettings); + + GenerationSettings.LookupBackedBuilder genSettings = new GenerationSettings.LookupBackedBuilder(featureLookup, carverLookup); + ModernBetaBiomeFeatures.addIcePlainsFeatures(genSettings, false); + + return (new Biome.Builder()) + .precipitation(true) + .temperature(0.0F) + .downfall(0.5F) + .effects((new BiomeEffects.Builder()) + .skyColor(OverworldBiomeCreator.getSkyColor(0.0F)) + .fogColor(ModernBetaBiomeColors.BETA_FOG_COLOR) + .waterColor(ModernBetaBiomeColors.VANILLA_FROZEN_WATER_COLOR) + .waterFogColor(ModernBetaBiomeColors.VANILLA_FROZEN_WATER_FOG_COLOR) + .build()) + .spawnSettings(spawnSettings.build()) + .generationSettings(genSettings.build()) + .build(); + } +} diff --git a/src/main/java/mod/bespectacled/modernbeta/world/biome/biomes/pe/BiomePEForest.java b/src/main/java/mod/bespectacled/modernbeta/world/biome/biomes/pe/BiomePEForest.java index a652a99e..ee7d3c8b 100644 --- a/src/main/java/mod/bespectacled/modernbeta/world/biome/biomes/pe/BiomePEForest.java +++ b/src/main/java/mod/bespectacled/modernbeta/world/biome/biomes/pe/BiomePEForest.java @@ -20,7 +20,7 @@ public class BiomePEForest { ModernBetaBiomeMobs.addTurtles(spawnSettings); GenerationSettings.LookupBackedBuilder genSettings = new GenerationSettings.LookupBackedBuilder(featureLookup, carverLookup); - ModernBetaBiomeFeatures.addForestFeatures(genSettings, true); + ModernBetaBiomeFeatures.addForestFeatures(genSettings, true, true); return (new Biome.Builder()) .precipitation(true) diff --git a/src/main/java/mod/bespectacled/modernbeta/world/biome/biomes/pe/BiomePETaiga.java b/src/main/java/mod/bespectacled/modernbeta/world/biome/biomes/pe/BiomePETaiga.java index afb9a0be..afc35ac0 100644 --- a/src/main/java/mod/bespectacled/modernbeta/world/biome/biomes/pe/BiomePETaiga.java +++ b/src/main/java/mod/bespectacled/modernbeta/world/biome/biomes/pe/BiomePETaiga.java @@ -19,7 +19,7 @@ public class BiomePETaiga { ModernBetaBiomeMobs.addTaigaMobs(spawnSettings); GenerationSettings.LookupBackedBuilder genSettings = new GenerationSettings.LookupBackedBuilder(featureLookup, carverLookup); - ModernBetaBiomeFeatures.addTaigaFeatures(genSettings, true); + ModernBetaBiomeFeatures.addTaigaFeatures(genSettings, true, true); return (new Biome.Builder()) .precipitation(true) diff --git a/src/main/java/mod/bespectacled/modernbeta/world/biome/provider/BiomeProviderFractal.java b/src/main/java/mod/bespectacled/modernbeta/world/biome/provider/BiomeProviderFractal.java index 3a7f65a2..1d519fef 100644 --- a/src/main/java/mod/bespectacled/modernbeta/world/biome/provider/BiomeProviderFractal.java +++ b/src/main/java/mod/bespectacled/modernbeta/world/biome/provider/BiomeProviderFractal.java @@ -49,6 +49,7 @@ public class BiomeProviderFractal extends BiomeProvider implements BiomeResolver if (this.settings.fractalAddSnow) allBiomes.add(getBiomeEntry("minecraft:ocean")); if (this.settings.fractalAddMushroomIslands) allBiomes.add(getBiomeEntry("minecraft:mushroom_fields")); if (this.settings.fractalAddBeaches) allBiomes.add(getBiomeEntry("minecraft:beach")); + if (this.settings.fractalAddDeepOceans) allBiomes.add(getBiomeEntry("minecraft:deep_ocean")); if (this.settings.fractalUseClimaticBiomes) { for (ClimaticBiomeList climate : climaticBiomes) { climate.normalBiomes().forEach(b -> allBiomes.add(b.biome())); @@ -58,6 +59,10 @@ public class BiomeProviderFractal extends BiomeProvider implements BiomeResolver selectedBiomes.stream().map(BiomeInfo::biome).forEach(allBiomes::add); } subVariants.values().forEach(v -> v.forEach(b -> allBiomes.add(b.biome()))); + addBiomeMap(allBiomes, edgeVariants); + addBiomeMap(allBiomes, hillVariants); + addBiomeMap(allBiomes, mutatedVariants); + addBiomeMap(allBiomes, veryRareVariants); this.allBiomes = allBiomes.stream().toList(); var fractalSettings = new FractalSettings.Builder(); @@ -109,6 +114,14 @@ public class BiomeProviderFractal extends BiomeProvider implements BiomeResolver .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); } + private static void addBiomeMap(Set> allBiomes, Map biomes) { + biomes.entrySet().stream() + .filter(kv -> allBiomes.contains(kv.getKey().biome())) + .map(Map.Entry::getValue) + .map(BiomeInfo::biome) + .forEach(allBiomes::add); + } + private RegistryEntry getBiomeEntry(String id) { RegistryKey key = RegistryKey.of(RegistryKeys.BIOME, new Identifier(id)); return biomeRegistry.getOrThrow(key); @@ -173,22 +186,7 @@ public class BiomeProviderFractal extends BiomeProvider implements BiomeResolver private void cleanCache(Long2ObjectMap cache, int x, int z, int dist) { if (cache.size() < 256) { return; - } else { - cache.clear(); - if (true) return; - } - - long[] drops = cache.keySet().longStream() - .limit(16) -// .filter(key -> { -// int keyX = ChunkPos.getPackedX(key); -// int keyZ = ChunkPos.getPackedZ(key); -// return keyX < x - dist || keyX > x + dist || keyZ < z - dist || keyZ > z + dist; -// }) - .toArray(); - - for (int i = 0; i < 16; i++) { - cache.remove(drops[i]); } + cache.clear(); } } diff --git a/src/main/java/mod/bespectacled/modernbeta/world/biome/provider/fractal/Layer.java b/src/main/java/mod/bespectacled/modernbeta/world/biome/provider/fractal/Layer.java index 6389bec7..7283d1f2 100644 --- a/src/main/java/mod/bespectacled/modernbeta/world/biome/provider/fractal/Layer.java +++ b/src/main/java/mod/bespectacled/modernbeta/world/biome/provider/fractal/Layer.java @@ -33,7 +33,7 @@ public abstract class Layer { Map replacementBiomes = Map.ofEntries( Map.entry(DummyBiome.OCEAN.biomeInfo, BiomeInfo.of(ocean)), - Map.entry(DummyBiome.FROZEN_OCEAN.biomeInfo, BiomeInfo.of(frozenOcean)), + Map.entry(DummyBiome.FROZEN_OCEAN.biomeInfo, BiomeInfo.of(icePlains)), Map.entry(DummyBiome.ICE_PLAINS.biomeInfo, BiomeInfo.of(icePlains)), Map.entry(DummyBiome.MUSHROOM_ISLAND.biomeInfo, BiomeInfo.of(mushroomIsland)), Map.entry(DummyBiome.DEEP_OCEAN.biomeInfo, BiomeInfo.of(deepOcean)) @@ -46,59 +46,18 @@ public abstract class Layer { land = new LayerInitLand(1); switch (settings.terrainType) { case BETA: - land = addSnow(land, settings, 3); - if (settings.oceanShrink <= 4) { - land = new LayerFuzzyZoom(2000, land); - land = new LayerAddLandB18(1, land); - } - land = addSnow(land, settings, 2); - if (settings.oceanShrink <= 3) { - land = new LayerZoom(2001, land); - land = new LayerAddLandB18(2, land); - } - land = addSnow(land, settings, 1); - if (settings.oceanShrink <= 2) { - land = new LayerZoom(2002, land); - land = new LayerAddLandB18(3, land); - } - land = addSnow(land, settings, 0); - if (settings.oceanShrink <= 1) { - land = new LayerZoom(2003, land); - land = new LayerAddLandB18(3, land); - } - if (settings.oceanShrink <= 0) { - land = new LayerZoom(2004, land); - land = new LayerAddLandB18(3, land); - } - for (int i = 0; i < -settings.oceanShrink; i++) { - land = new LayerZoom(2005 + i, land); - land = new LayerAddLandB18(3, land); + for (int i = 0; i < 5 - settings.oceanShrink; i++) { + land = addSnow(land, settings, 3 - i); + land = i == 0 ? new LayerFuzzyZoom(2000, land) : new LayerZoom(2000 + i, land); + land = new LayerAddLandB18(Math.min(i + 1, 3), land); } break; case EARLY_RELEASE: - land = addSnow(land, settings, 2); - if (settings.oceanShrink <= 3) { - land = new LayerFuzzyZoom(2000, land); - land = new LayerAddLand(1, land); - } - land = addSnow(land, settings, 1); - if (settings.oceanShrink <= 2) { - land = new LayerZoom(2001, land); - land = new LayerAddLand(2, land); - } - land = addSnow(land, settings, 0); - if (settings.oceanShrink <= 1) { - land = new LayerZoom(2002, land); - land = new LayerAddLand(3, land); - } - if (settings.oceanShrink <= 0) { - land = new LayerZoom(2003, land); - land = new LayerAddLand(4, land); - } - for (int i = 0; i < -settings.oceanShrink; i++) { - land = new LayerZoom(2004 + i, land); - land = new LayerAddLand(5 + i, land); + for (int i = 0; i < 4 - settings.oceanShrink; i++) { + land = addSnow(land, settings, 2 - i); + land = i == 0 ? new LayerFuzzyZoom(2000, land) : new LayerZoom(2000 + i, land); + land = new LayerAddLand(i + 1, land); } break; @@ -106,27 +65,29 @@ public abstract class Layer { land = addSnow(land, settings, 2); if (settings.oceanShrink <= 3) { land = new LayerFuzzyZoom(2000, land); - land = LayerAddLand.r17(1, land); + land = new LayerAddLand(1, land); } land = addSnow(land, settings, 1); if (settings.oceanShrink <= 2) { land = new LayerZoom(2001, land); - land = LayerAddLand.r17(2, land); - land = LayerAddLand.r17(50, land); - land = LayerAddLand.r17(70, land); + land = new LayerAddLand(2, land); + land = new LayerAddLand(50, land); + land = new LayerAddLand(70, land); land = new LayerReduceOcean(2, land); land = maybeAddSnow(land, settings, 0); - land = LayerAddLand.r17(3, land); + land = new LayerAddLand(3, land); land = maybeAddClimateEdge(land, settings, 0); } if (settings.oceanShrink <= 1) { land = new LayerZoom(2002, land); } + land = addSnow(land, settings, -1); if (settings.oceanShrink <= 0) { land = new LayerZoom(2003, land); - land = LayerAddLand.r17(4, land); + land = new LayerAddLand(4, land); } for (int i = 0; i < -settings.oceanShrink; i++) { + land = addSnow(land, settings, -2 - i); land = new LayerZoom(2004 + i, land); land = new LayerAddLand(5 + i, land); } @@ -148,7 +109,7 @@ public abstract class Layer { Layer biomes = new LayerAddBiomes(200, land, settings.biomes, replacementBiomes, settings.climaticBiomes); for (int i = 0; i < settings.hillScale; i++) { - if (settings.subVariantScale == i && !settings.subVariants.isEmpty()) biomes = new LayerSubVariants(100, biomes, settings.subVariants); + if (settings.subVariantScale == i && !settings.subVariants.isEmpty()) biomes = new LayerSubVariants(200 + i, biomes, settings.subVariants); if (settings.beachShrink == i - 2 - settings.hillScale && settings.addBeaches) { biomes = new LayerAddEdge(1000, biomes, beach, ocean, mushroomIsland, @@ -157,7 +118,7 @@ public abstract class Layer { biomes = new LayerZoom(1000 + i, biomes); } - if (settings.subVariantScale == settings.hillScale && !settings.subVariants.isEmpty()) biomes = new LayerSubVariants(100, biomes, settings.subVariants); + if (settings.subVariantScale == settings.hillScale && !settings.subVariants.isEmpty()) biomes = new LayerSubVariants(200 + settings.hillScale, biomes, settings.subVariants); if (settings.useClimaticBiomes) biomes = new LayerAddEdge(1000, biomes, settings.edgeVariants, biomeLookup); if (settings.addHills) { int neighborRequirement = settings.terrainType == FractalSettings.TerrainType.MAJOR_RELEASE ? 3 : 4; @@ -177,8 +138,6 @@ public abstract class Layer { if (i == 0) { if (settings.oceans) biomes = settings.terrainType == FractalSettings.TerrainType.BETA ? new LayerAddLandB18(3, biomes, ocean, plains, frozenOcean, icePlains) - : settings.terrainType == FractalSettings.TerrainType.MAJOR_RELEASE - ? LayerAddLand.r17(3, biomes, ocean, plains, frozenOcean, icePlains) : new LayerAddLand(3, biomes, ocean, plains, frozenOcean, icePlains); if (!settings.addBeaches && settings.addMushroomIslands) biomes = new LayerMushroomIslandShore(biomes, mushroomIsland, ocean); } diff --git a/src/main/java/mod/bespectacled/modernbeta/world/biome/provider/fractal/LayerAddLand.java b/src/main/java/mod/bespectacled/modernbeta/world/biome/provider/fractal/LayerAddLand.java index 6b45c3b0..9c2b76f5 100644 --- a/src/main/java/mod/bespectacled/modernbeta/world/biome/provider/fractal/LayerAddLand.java +++ b/src/main/java/mod/bespectacled/modernbeta/world/biome/provider/fractal/LayerAddLand.java @@ -5,7 +5,6 @@ import net.minecraft.world.biome.Biome; public class LayerAddLand extends Layer { private final BiomeInfo ocean, land, frozenOcean, snowyLand; - private boolean r17; public LayerAddLand(long seed, Layer parent) { this(seed, parent, DummyBiome.OCEAN, DummyBiome.PLAINS, DummyBiome.FROZEN_OCEAN, DummyBiome.ICE_PLAINS); @@ -21,60 +20,11 @@ public class LayerAddLand extends Layer { this.snowyLand = BiomeInfo.of(snowyLand); } - public static LayerAddLand r17(long seed, Layer parent) { - LayerAddLand layer = new LayerAddLand(seed, parent); - layer.r17 = true; - return layer; - } - - public static LayerAddLand r17(long seed, Layer parent, RegistryEntry ocean, RegistryEntry land, - RegistryEntry frozenOcean, RegistryEntry snowyLand) { - LayerAddLand layer = new LayerAddLand(seed, parent, ocean, land, frozenOcean, snowyLand); - layer.r17 = true; - return layer; - } - @Override protected BiomeInfo[] getNewBiomes(int x, int z, int width, int length) { BiomeInfo climate4 = BiomeInfo.of(DummyBiome.CLIMATE, 4); return this.forEachWithNeighbors(x, z, width, length, (input, ix, iz, neighbors) -> { - if (this.r17) { - if (input.equals(ocean) && !allNeighborsEqual(neighbors, ocean)) { - int landSampleChance = 1; - BiomeInfo sampledLand = land; - - for (BiomeInfo neighbor : neighbors) { - if (!neighbor.equals(ocean) && nextInt(landSampleChance++) == 0) { - sampledLand = neighbor; - } - } - - if (nextInt(3) == 0 || sampledLand.equals(climate4)) { - return sampledLand; - } else if (sampledLand.equals(snowyLand)) { - return frozenOcean; - } else { - return ocean; - } - } else if (!input.equals(ocean) && neighborsContain(neighbors, ocean)) { - if (input.equals(climate4)) { - return input; - } else if (nextInt(5) == 0) { - return input.equals(snowyLand) ? frozenOcean : ocean; - } - } - return input; - } - - if (!input.equals(ocean) || allNeighborsEqual(neighbors, ocean)) { - if (input.equals(climate4)) { - return input; - } else if (!input.equals(ocean) && neighborsContain(neighbors, ocean) && nextInt(5) == 0) { - return input.equals(snowyLand) ? frozenOcean : ocean; - } else { - return input; - } - } else { + if (input.equals(ocean) && !allNeighborsEqual(neighbors, ocean)) { int landSampleChance = 1; BiomeInfo sampledLand = land; @@ -91,7 +41,14 @@ public class LayerAddLand extends Layer { } else { return ocean; } + } else if (!input.equals(ocean) && neighborsContain(neighbors, ocean)) { + if (input.equals(climate4)) { + return input; + } else if (nextInt(5) == 0) { + return input.equals(snowyLand) ? frozenOcean : ocean; + } } + return input; }, true); } } diff --git a/src/main/java/mod/bespectacled/modernbeta/world/biome/provider/fractal/LayerAddSnow.java b/src/main/java/mod/bespectacled/modernbeta/world/biome/provider/fractal/LayerAddSnow.java index 811e4e08..4a5bf9e0 100644 --- a/src/main/java/mod/bespectacled/modernbeta/world/biome/provider/fractal/LayerAddSnow.java +++ b/src/main/java/mod/bespectacled/modernbeta/world/biome/provider/fractal/LayerAddSnow.java @@ -8,6 +8,6 @@ public class LayerAddSnow extends Layer { @Override protected BiomeInfo[] getNewBiomes(int x, int z, int width, int length) { return forEach(x, z, width, length, b -> - !b.equals(DummyBiome.OCEAN.biomeInfo) && nextInt(5) == 0 ? DummyBiome.ICE_PLAINS.biomeInfo : b); + !b.biome().equals(DummyBiome.OCEAN) && nextInt(5) == 0 ? DummyBiome.ICE_PLAINS.biomeInfo : b); } } diff --git a/src/main/java/mod/bespectacled/modernbeta/world/chunk/provider/ChunkProviderEarlyRelease.java b/src/main/java/mod/bespectacled/modernbeta/world/chunk/provider/ChunkProviderEarlyRelease.java index a05fe5b3..9d868fe5 100644 --- a/src/main/java/mod/bespectacled/modernbeta/world/chunk/provider/ChunkProviderEarlyRelease.java +++ b/src/main/java/mod/bespectacled/modernbeta/world/chunk/provider/ChunkProviderEarlyRelease.java @@ -1,7 +1,6 @@ package mod.bespectacled.modernbeta.world.chunk.provider; -import mod.bespectacled.modernbeta.ModernBeta; -import mod.bespectacled.modernbeta.api.world.chunk.ChunkProviderNoise; +import mod.bespectacled.modernbeta.api.world.chunk.ChunkProviderForcedHeight; import mod.bespectacled.modernbeta.api.world.chunk.surface.SurfaceConfig; import mod.bespectacled.modernbeta.api.world.spawn.SpawnLocator; import mod.bespectacled.modernbeta.util.BlockStates; @@ -10,7 +9,6 @@ import mod.bespectacled.modernbeta.util.noise.PerlinOctaveNoise; import mod.bespectacled.modernbeta.util.noise.SimpleNoisePos; import mod.bespectacled.modernbeta.world.biome.HeightConfig; import mod.bespectacled.modernbeta.world.biome.ModernBetaBiomeSource; -import mod.bespectacled.modernbeta.world.biome.provider.fractal.BiomeInfo; import mod.bespectacled.modernbeta.world.chunk.ModernBetaChunkGenerator; import mod.bespectacled.modernbeta.world.spawn.SpawnLocatorRelease; import net.minecraft.block.BlockState; @@ -18,7 +16,6 @@ import net.minecraft.block.Blocks; import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.ChunkPos; -import net.minecraft.util.math.MathHelper; import net.minecraft.world.ChunkRegion; import net.minecraft.world.Heightmap; import net.minecraft.world.biome.Biome; @@ -26,31 +23,16 @@ import net.minecraft.world.chunk.Chunk; import net.minecraft.world.gen.StructureAccessor; import net.minecraft.world.gen.chunk.AquiferSampler; import net.minecraft.world.gen.noise.NoiseConfig; -import org.slf4j.event.Level; -import java.util.HashMap; -import java.util.Map; import java.util.Random; -public class ChunkProviderEarlyRelease extends ChunkProviderNoise { - private static final float[] BIOME_HEIGHT_WEIGHTS = new float[25]; - +public class ChunkProviderEarlyRelease extends ChunkProviderForcedHeight { private final PerlinOctaveNoise minLimitOctaveNoise; private final PerlinOctaveNoise maxLimitOctaveNoise; private final PerlinOctaveNoise mainOctaveNoise; private final PerlinOctaveNoise surfaceOctaveNoise; private final PerlinOctaveNoise depthOctaveNoise; private final PerlinOctaveNoise forestOctaveNoise; - private final Map heightOverrideCache; - - static { - for (int x = -2; x <= 2; x++) { - for (int z = -2; z <= 2; z++) { - float value = 10.0F / MathHelper.sqrt((float)(x * x + z * z) + 0.2F); - BIOME_HEIGHT_WEIGHTS[x + 2 + (z + 2) * 5] = value; - } - } - } public ChunkProviderEarlyRelease(ModernBetaChunkGenerator chunkGenerator, long seed) { super(chunkGenerator, seed); @@ -62,8 +44,6 @@ public class ChunkProviderEarlyRelease extends ChunkProviderNoise { new PerlinOctaveNoise(this.random, 10, true); this.depthOctaveNoise = new PerlinOctaveNoise(this.random, 16, true); this.forestOctaveNoise = new PerlinOctaveNoise(this.random, 8, true); - - this.heightOverrideCache = new HashMap<>(); } @Override @@ -257,33 +237,7 @@ public class ChunkProviderEarlyRelease extends ChunkProviderNoise { double depth = this.depthOctaveNoise.sampleXZWrapped(noiseX, noiseZ, depthNoiseScaleX, depthNoiseScaleZ); - float biomeHeightStretch = 0.0F; - float biomeSurfaceHeight = 0.0F; - float totalBiomeHeightWeight = 0.0F; - - BiomeInfo biome = this.getBiomeInfo(noiseX, noiseZ); - double minSurfaceHeight = this.getHeightConfig(biome).scale(); - - for (int biomeX = -2; biomeX <= 2; biomeX++) { - for (int biomeZ = -2; biomeZ <= 2; biomeZ++) { - biome = this.getBiomeInfo(noiseX + biomeX, noiseZ + biomeZ); - HeightConfig heightConfig = this.getHeightConfig(biome); - - float weight = BIOME_HEIGHT_WEIGHTS[biomeX + 2 + (biomeZ + 2) * 5] / (heightConfig.scale() + 2.0F); - if (heightConfig.scale() > minSurfaceHeight) { - weight /= 2.0F; - } - - biomeHeightStretch += heightConfig.depth() * weight; - biomeSurfaceHeight += heightConfig.scale() * weight; - totalBiomeHeightWeight += weight; - } - } - - biomeHeightStretch /= totalBiomeHeightWeight; - biomeSurfaceHeight /= totalBiomeHeightWeight; - biomeHeightStretch = biomeHeightStretch * 0.9F + 0.1F; - biomeSurfaceHeight = (biomeSurfaceHeight * 4.0F - 1.0F) / 8.0F; + HeightConfig heightConfig = this.getHeightConfigAt(noiseX, noiseZ); depth /= 8000D; @@ -309,7 +263,7 @@ public class ChunkProviderEarlyRelease extends ChunkProviderNoise { depth /= 8D; } - depth = biomeSurfaceHeight + depth * 0.2D; + depth = heightConfig.depth() + depth * 0.2D; depth *= baseSize / 8.0D; depth = baseSize + depth * 4.0D; @@ -319,7 +273,7 @@ public class ChunkProviderEarlyRelease extends ChunkProviderNoise { double density; double heightmapDensity; - double densityOffset = this.getOffset(noiseY, heightStretch, depth, biomeHeightStretch); + double densityOffset = this.getOffset(noiseY, heightStretch, depth, heightConfig.scale()); double mainNoise = (this.mainOctaveNoise.sampleWrapped( noiseX, noiseY, noiseZ, @@ -393,34 +347,4 @@ public class ChunkProviderEarlyRelease extends ChunkProviderNoise { return offset; } - - private BiomeInfo getBiomeInfo(int biomeX, int biomeZ) { - if (chunkGenerator.getBiomeSource() instanceof ModernBetaBiomeSource modernBetaBiomeSource) { - return modernBetaBiomeSource.getBiomeForHeightGen(biomeX, 16, biomeZ); - } else { - return BiomeInfo.of(this.getBiome(biomeX, 16, biomeZ, null)); - } - } - - private HeightConfig getHeightConfig(BiomeInfo biomeInfo) { - HeightConfig config = HeightConfig.getHeightConfig(biomeInfo); - String id = biomeInfo.getId(); - if (this.chunkSettings.releaseHeightOverrides.containsKey(id)) { - HeightConfig fallbackConfig = config; - config = this.heightOverrideCache.computeIfAbsent(biomeInfo, k -> { - String heightConfigString = this.chunkSettings.releaseHeightOverrides.get(id); - String[] heightConfigPair = heightConfigString.split(";"); - try { - float scale = Float.parseFloat(heightConfigPair[0]); - float depth = Float.parseFloat(heightConfigPair[1]); - return new HeightConfig(scale, depth); - } catch (NumberFormatException | ArrayIndexOutOfBoundsException ignored) { - ModernBeta.log(Level.WARN, String.format("Invalid height config \"%s\"", heightConfigString)); - return fallbackConfig; - } - }); - } - - return config; - } } diff --git a/src/main/java/mod/bespectacled/modernbeta/world/chunk/provider/ChunkProviderMajorRelease.java b/src/main/java/mod/bespectacled/modernbeta/world/chunk/provider/ChunkProviderMajorRelease.java index 4096c3ea..125369a8 100644 --- a/src/main/java/mod/bespectacled/modernbeta/world/chunk/provider/ChunkProviderMajorRelease.java +++ b/src/main/java/mod/bespectacled/modernbeta/world/chunk/provider/ChunkProviderMajorRelease.java @@ -1,43 +1,25 @@ package mod.bespectacled.modernbeta.world.chunk.provider; -import mod.bespectacled.modernbeta.ModernBeta; -import mod.bespectacled.modernbeta.api.world.chunk.ChunkProviderNoise; +import mod.bespectacled.modernbeta.api.world.chunk.ChunkProviderForcedHeight; import mod.bespectacled.modernbeta.api.world.spawn.SpawnLocator; import mod.bespectacled.modernbeta.util.noise.PerlinOctaveNoise; import mod.bespectacled.modernbeta.world.biome.HeightConfig; import mod.bespectacled.modernbeta.world.biome.ModernBetaBiomeSource; -import mod.bespectacled.modernbeta.world.biome.provider.fractal.BiomeInfo; import mod.bespectacled.modernbeta.world.chunk.ModernBetaChunkGenerator; import mod.bespectacled.modernbeta.world.spawn.SpawnLocatorRelease; -import net.minecraft.util.math.MathHelper; import net.minecraft.world.ChunkRegion; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.gen.StructureAccessor; import net.minecraft.world.gen.noise.NoiseConfig; -import org.slf4j.event.Level; -import java.util.HashMap; -import java.util.Map; import java.util.Random; -public class ChunkProviderMajorRelease extends ChunkProviderNoise { - private static final float[] BIOME_HEIGHT_WEIGHTS = new float[25]; - +public class ChunkProviderMajorRelease extends ChunkProviderForcedHeight { private final PerlinOctaveNoise minLimitOctaveNoise; private final PerlinOctaveNoise maxLimitOctaveNoise; private final PerlinOctaveNoise mainOctaveNoise; private final PerlinOctaveNoise depthOctaveNoise; private final PerlinOctaveNoise forestOctaveNoise; - private final Map heightOverrideCache; - - static { - for (int x = -2; x <= 2; x++) { - for (int z = -2; z <= 2; z++) { - float value = 10.0F / MathHelper.sqrt((float)(x * x + z * z) + 0.2F); - BIOME_HEIGHT_WEIGHTS[x + 2 + (z + 2) * 5] = value; - } - } - } public ChunkProviderMajorRelease(ModernBetaChunkGenerator chunkGenerator, long seed) { super(chunkGenerator, seed); @@ -49,8 +31,6 @@ public class ChunkProviderMajorRelease extends ChunkProviderNoise { new PerlinOctaveNoise(this.random, 10, true); this.depthOctaveNoise = new PerlinOctaveNoise(this.random, 16, true); this.forestOctaveNoise = new PerlinOctaveNoise(this.random, 8, true); - - this.heightOverrideCache = new HashMap<>(); } @Override @@ -88,33 +68,7 @@ public class ChunkProviderMajorRelease extends ChunkProviderNoise { double depth = this.depthOctaveNoise.sampleXZWrapped(noiseX, noiseZ, depthNoiseScaleX, depthNoiseScaleZ); - float biomeHeightStretch = 0.0F; - float biomeSurfaceHeight = 0.0F; - float totalBiomeHeightWeight = 0.0F; - - BiomeInfo biome = this.getBiomeInfo(noiseX, noiseZ); - double minSurfaceHeight = this.getHeightConfig(biome).scale(); - - for (int biomeX = -2; biomeX <= 2; biomeX++) { - for (int biomeZ = -2; biomeZ <= 2; biomeZ++) { - biome = this.getBiomeInfo(noiseX + biomeX, noiseZ + biomeZ); - HeightConfig heightConfig = this.getHeightConfig(biome); - - float weight = BIOME_HEIGHT_WEIGHTS[biomeX + 2 + (biomeZ + 2) * 5] / (heightConfig.scale() + 2.0F); - if (heightConfig.scale() > minSurfaceHeight) { - weight /= 2.0F; - } - - biomeHeightStretch += heightConfig.depth() * weight; - biomeSurfaceHeight += heightConfig.scale() * weight; - totalBiomeHeightWeight += weight; - } - } - - biomeHeightStretch /= totalBiomeHeightWeight; - biomeSurfaceHeight /= totalBiomeHeightWeight; - biomeHeightStretch = biomeHeightStretch * 0.9F + 0.1F; - biomeSurfaceHeight = (biomeSurfaceHeight * 4.0F - 1.0F) / 8.0F; + HeightConfig heightConfig = this.getHeightConfigAt(noiseX, noiseZ); depth /= 8000D; @@ -140,7 +94,7 @@ public class ChunkProviderMajorRelease extends ChunkProviderNoise { depth /= 8D; } - depth = biomeSurfaceHeight + depth * 0.2D; + depth = heightConfig.depth() + depth * 0.2D; depth *= baseSize / 8.0D; depth = baseSize + depth * 4.0D; @@ -150,7 +104,7 @@ public class ChunkProviderMajorRelease extends ChunkProviderNoise { double density; double heightmapDensity; - double densityOffset = this.getOffset(noiseY, heightStretch, depth, biomeHeightStretch); + double densityOffset = this.getOffset(noiseY, heightStretch, depth, heightConfig.scale()); double mainNoise = (this.mainOctaveNoise.sampleWrapped( noiseX, noiseY, noiseZ, @@ -224,34 +178,4 @@ public class ChunkProviderMajorRelease extends ChunkProviderNoise { return offset; } - - private BiomeInfo getBiomeInfo(int biomeX, int biomeZ) { - if (chunkGenerator.getBiomeSource() instanceof ModernBetaBiomeSource modernBetaBiomeSource) { - return modernBetaBiomeSource.getBiomeForHeightGen(biomeX, 16, biomeZ); - } else { - return BiomeInfo.of(this.getBiome(biomeX, 16, biomeZ, null)); - } - } - - private HeightConfig getHeightConfig(BiomeInfo biomeInfo) { - HeightConfig config = HeightConfig.getHeightConfig(biomeInfo); - String id = biomeInfo.getId(); - if (this.chunkSettings.releaseHeightOverrides.containsKey(id)) { - HeightConfig fallbackConfig = config; - config = this.heightOverrideCache.computeIfAbsent(biomeInfo, k -> { - String heightConfigString = this.chunkSettings.releaseHeightOverrides.get(id); - String[] heightConfigPair = heightConfigString.split(";"); - try { - float scale = Float.parseFloat(heightConfigPair[0]); - float depth = Float.parseFloat(heightConfigPair[1]); - return new HeightConfig(scale, depth); - } catch (NumberFormatException | ArrayIndexOutOfBoundsException ignored) { - ModernBeta.log(Level.WARN, String.format("Invalid height config \"%s\"", heightConfigString)); - return fallbackConfig; - } - }); - } - - return config; - } } diff --git a/src/main/java/mod/bespectacled/modernbeta/world/feature/ModernBetaFeatureTags.java b/src/main/java/mod/bespectacled/modernbeta/world/feature/ModernBetaFeatureTags.java index c762ba57..b6dcabdf 100644 --- a/src/main/java/mod/bespectacled/modernbeta/world/feature/ModernBetaFeatureTags.java +++ b/src/main/java/mod/bespectacled/modernbeta/world/feature/ModernBetaFeatureTags.java @@ -44,12 +44,14 @@ public class ModernBetaFeatureTags { public static final String TREES_BETA_SEASONAL_FOREST = "trees_beta_seasonal_forest"; public static final String TREES_BETA_SPARSE = "trees_beta_sparse"; public static final String TREES_BETA_TAIGA = "trees_beta_taiga"; + public static final String TREES_BETA_OAK_FOREST = "trees_beta_oak_forest"; public static final String TREES_BETA_FOREST_BEES = "trees_beta_forest_bees"; public static final String TREES_BETA_RAINFOREST_BEES = "trees_beta_rainforest_bees"; public static final String TREES_BETA_SEASONAL_FOREST_BEES = "trees_beta_seasonal_forest_bees"; public static final String TREES_BETA_SPARSE_BEES = "trees_beta_sparse_bees"; - + public static final String TREES_BETA_OAK_FOREST_BEES = "trees_beta_oak_forest_bees"; + public static final String TREES_PE_FOREST = "trees_pe_forest"; public static final String TREES_PE_RAINFOREST = "trees_pe_rainforest"; public static final String TREES_PE_SEASONAL_FOREST = "trees_pe_seasonal_forest"; diff --git a/src/main/java/mod/bespectacled/modernbeta/world/feature/configured/ModernBetaVegetationConfiguredFeatures.java b/src/main/java/mod/bespectacled/modernbeta/world/feature/configured/ModernBetaVegetationConfiguredFeatures.java index 5ff8c905..2ebea874 100644 --- a/src/main/java/mod/bespectacled/modernbeta/world/feature/configured/ModernBetaVegetationConfiguredFeatures.java +++ b/src/main/java/mod/bespectacled/modernbeta/world/feature/configured/ModernBetaVegetationConfiguredFeatures.java @@ -53,12 +53,14 @@ public class ModernBetaVegetationConfiguredFeatures { public static final RegistryKey> TREES_BETA_SEASONAL_FOREST = ModernBetaConfiguredFeatures.of(ModernBetaFeatureTags.TREES_BETA_SEASONAL_FOREST); public static final RegistryKey> TREES_BETA_SPARSE = ModernBetaConfiguredFeatures.of(ModernBetaFeatureTags.TREES_BETA_SPARSE); public static final RegistryKey> TREES_BETA_TAIGA = ModernBetaConfiguredFeatures.of(ModernBetaFeatureTags.TREES_BETA_TAIGA); + public static final RegistryKey> TREES_BETA_OAK_FOREST = ModernBetaConfiguredFeatures.of(ModernBetaFeatureTags.TREES_BETA_OAK_FOREST); public static final RegistryKey> TREES_BETA_FOREST_BEES = ModernBetaConfiguredFeatures.of(ModernBetaFeatureTags.TREES_BETA_FOREST_BEES); public static final RegistryKey> TREES_BETA_RAINFOREST_BEES = ModernBetaConfiguredFeatures.of(ModernBetaFeatureTags.TREES_BETA_RAINFOREST_BEES); public static final RegistryKey> TREES_BETA_SEASONAL_FOREST_BEES = ModernBetaConfiguredFeatures.of(ModernBetaFeatureTags.TREES_BETA_SEASONAL_FOREST_BEES); public static final RegistryKey> TREES_BETA_SPARSE_BEES = ModernBetaConfiguredFeatures.of(ModernBetaFeatureTags.TREES_BETA_SPARSE_BEES); - + public static final RegistryKey> TREES_BETA_OAK_FOREST_BEES = ModernBetaConfiguredFeatures.of(ModernBetaFeatureTags.TREES_BETA_OAK_FOREST_BEES); + public static final RegistryKey> TREES_PE_FOREST = ModernBetaConfiguredFeatures.of(ModernBetaFeatureTags.TREES_PE_FOREST); public static final RegistryKey> TREES_PE_RAINFOREST = ModernBetaConfiguredFeatures.of(ModernBetaFeatureTags.TREES_PE_RAINFOREST); public static final RegistryKey> TREES_PE_SEASONAL_FOREST = ModernBetaConfiguredFeatures.of(ModernBetaFeatureTags.TREES_PE_SEASONAL_FOREST); @@ -107,12 +109,14 @@ public class ModernBetaVegetationConfiguredFeatures { ConfiguredFeatures.register(featureRegisterable, TREES_BETA_SEASONAL_FOREST, Feature.RANDOM_SELECTOR, createSeasonalForestRandomTreeConfig(registryPlaced, false)); ConfiguredFeatures.register(featureRegisterable, TREES_BETA_SPARSE, Feature.RANDOM_SELECTOR, createDefaultRandomTreeConfig(registryPlaced, false)); ConfiguredFeatures.register(featureRegisterable, TREES_BETA_TAIGA, Feature.RANDOM_SELECTOR, createTaigaRandomTreeConfig(registryPlaced)); + ConfiguredFeatures.register(featureRegisterable, TREES_BETA_OAK_FOREST, Feature.RANDOM_SELECTOR, createOakForestRandomTreeConfig(registryPlaced, false)); ConfiguredFeatures.register(featureRegisterable, TREES_BETA_FOREST_BEES, Feature.RANDOM_SELECTOR, createForestRandomTreeConfig(registryPlaced, true)); ConfiguredFeatures.register(featureRegisterable, TREES_BETA_RAINFOREST_BEES, Feature.RANDOM_SELECTOR, createRainforestRandomTreeConfig(registryPlaced, true)); ConfiguredFeatures.register(featureRegisterable, TREES_BETA_SEASONAL_FOREST_BEES, Feature.RANDOM_SELECTOR, createSeasonalForestRandomTreeConfig(registryPlaced, true)); ConfiguredFeatures.register(featureRegisterable, TREES_BETA_SPARSE_BEES, Feature.RANDOM_SELECTOR, createDefaultRandomTreeConfig(registryPlaced, true)); - + ConfiguredFeatures.register(featureRegisterable, TREES_BETA_OAK_FOREST_BEES, Feature.RANDOM_SELECTOR, createOakForestRandomTreeConfig(registryPlaced, true)); + ConfiguredFeatures.register(featureRegisterable, TREES_PE_FOREST, Feature.RANDOM_SELECTOR, createPEForestRandomTreeConfig(registryPlaced, false)); ConfiguredFeatures.register(featureRegisterable, TREES_PE_RAINFOREST, Feature.RANDOM_SELECTOR, createOakTreeConfig(registryPlaced, false)); ConfiguredFeatures.register(featureRegisterable, TREES_PE_SEASONAL_FOREST, Feature.RANDOM_SELECTOR, createOakTreeConfig(registryPlaced, false)); @@ -153,6 +157,14 @@ public class ModernBetaVegetationConfiguredFeatures { return new RandomFeatureConfig(List.of(withChance(bees ? oakBees : oak, 0.1f)), fancyOak); } + + private static RandomFeatureConfig createOakForestRandomTreeConfig(RegistryEntryLookup registryPlaced, boolean bees) { + RegistryEntry.Reference fancyOak = registryPlaced.getOrThrow(ModernBetaTreePlacedFeatures.FANCY_OAK); + RegistryEntry.Reference oak = registryPlaced.getOrThrow(TreePlacedFeatures.OAK_CHECKED); + RegistryEntry.Reference oakBees = registryPlaced.getOrThrow(TreePlacedFeatures.OAK_BEES_0002); + + return new RandomFeatureConfig(List.of(withChance(fancyOak, 1.0f / 3.0f)), bees ? oakBees : oak); + } private static RandomFeatureConfig createForestRandomTreeConfig(RegistryEntryLookup registryPlaced, boolean bees) { RegistryEntry.Reference fancyOak = registryPlaced.getOrThrow(ModernBetaTreePlacedFeatures.FANCY_OAK); @@ -162,7 +174,7 @@ public class ModernBetaVegetationConfiguredFeatures { RegistryEntry.Reference birch = registryPlaced.getOrThrow(TreePlacedFeatures.BIRCH_CHECKED); RegistryEntry.Reference birchBees = registryPlaced.getOrThrow(TreePlacedFeatures.BIRCH_BEES_0002); - return new RandomFeatureConfig(List.of(withChance(bees ? birchBees : birch, 0.2f), withChance(fancyOak, 0.33333334f)), bees ? oakBees : oak); + return new RandomFeatureConfig(List.of(withChance(bees ? birchBees : birch, 0.2f), withChance(fancyOak, 1.0f / 3.0f)), bees ? oakBees : oak); } private static RandomFeatureConfig createRainforestRandomTreeConfig(RegistryEntryLookup registryPlaced, boolean bees) { @@ -170,7 +182,7 @@ public class ModernBetaVegetationConfiguredFeatures { RegistryEntry.Reference oak = registryPlaced.getOrThrow(TreePlacedFeatures.OAK_CHECKED); RegistryEntry.Reference oakBees = registryPlaced.getOrThrow(TreePlacedFeatures.OAK_BEES_0002); - return new RandomFeatureConfig(List.of(withChance(fancyOak, 0.33333334f)), bees ? oakBees : oak); + return new RandomFeatureConfig(List.of(withChance(fancyOak, 1.0f / 3.0f)), bees ? oakBees : oak); } private static RandomFeatureConfig createSeasonalForestRandomTreeConfig(RegistryEntryLookup registryPlaced, boolean bees) { @@ -185,7 +197,7 @@ public class ModernBetaVegetationConfiguredFeatures { RegistryEntry.Reference pine = registryPlaced.getOrThrow(TreePlacedFeatures.PINE_CHECKED); RegistryEntry.Reference spruce = registryPlaced.getOrThrow(TreePlacedFeatures.SPRUCE_CHECKED); - return new RandomFeatureConfig(List.of(withChance(pine, 0.33333334f)), spruce); + return new RandomFeatureConfig(List.of(withChance(pine, 1.0f / 3.0f)), spruce); } private static RandomFeatureConfig createPEForestRandomTreeConfig(RegistryEntryLookup registryPlaced, boolean bees) { diff --git a/src/main/java/mod/bespectacled/modernbeta/world/feature/placed/ModernBetaVegetationPlacedFeatures.java b/src/main/java/mod/bespectacled/modernbeta/world/feature/placed/ModernBetaVegetationPlacedFeatures.java index bacce12f..551618bc 100644 --- a/src/main/java/mod/bespectacled/modernbeta/world/feature/placed/ModernBetaVegetationPlacedFeatures.java +++ b/src/main/java/mod/bespectacled/modernbeta/world/feature/placed/ModernBetaVegetationPlacedFeatures.java @@ -106,12 +106,14 @@ public class ModernBetaVegetationPlacedFeatures { public static final RegistryKey TREES_BETA_SEASONAL_FOREST = ModernBetaPlacedFeatures.of(ModernBetaFeatureTags.TREES_BETA_SEASONAL_FOREST); public static final RegistryKey TREES_BETA_SPARSE = ModernBetaPlacedFeatures.of(ModernBetaFeatureTags.TREES_BETA_SPARSE); public static final RegistryKey TREES_BETA_TAIGA = ModernBetaPlacedFeatures.of(ModernBetaFeatureTags.TREES_BETA_TAIGA); + public static final RegistryKey TREES_BETA_OAK_FOREST = ModernBetaPlacedFeatures.of(ModernBetaFeatureTags.TREES_BETA_OAK_FOREST); public static final RegistryKey TREES_BETA_FOREST_BEES = ModernBetaPlacedFeatures.of(ModernBetaFeatureTags.TREES_BETA_FOREST_BEES); public static final RegistryKey TREES_BETA_RAINFOREST_BEES = ModernBetaPlacedFeatures.of(ModernBetaFeatureTags.TREES_BETA_RAINFOREST_BEES); public static final RegistryKey TREES_BETA_SEASONAL_FOREST_BEES = ModernBetaPlacedFeatures.of(ModernBetaFeatureTags.TREES_BETA_SEASONAL_FOREST_BEES); public static final RegistryKey TREES_BETA_SPARSE_BEES = ModernBetaPlacedFeatures.of(ModernBetaFeatureTags.TREES_BETA_SPARSE_BEES); - + public static final RegistryKey TREES_BETA_OAK_FOREST_BEES = ModernBetaPlacedFeatures.of(ModernBetaFeatureTags.TREES_BETA_OAK_FOREST_BEES); + public static final RegistryKey TREES_PE_FOREST = ModernBetaPlacedFeatures.of(ModernBetaFeatureTags.TREES_PE_FOREST); public static final RegistryKey TREES_PE_RAINFOREST = ModernBetaPlacedFeatures.of(ModernBetaFeatureTags.TREES_PE_RAINFOREST); public static final RegistryKey TREES_PE_SEASONAL_FOREST = ModernBetaPlacedFeatures.of(ModernBetaFeatureTags.TREES_PE_SEASONAL_FOREST); @@ -162,12 +164,14 @@ public class ModernBetaVegetationPlacedFeatures { RegistryEntry.Reference> treesBetaSeasonalForest = registryConfigured.getOrThrow(ModernBetaVegetationConfiguredFeatures.TREES_BETA_SEASONAL_FOREST); RegistryEntry.Reference> treesBetaSparse = registryConfigured.getOrThrow(ModernBetaVegetationConfiguredFeatures.TREES_BETA_SPARSE); RegistryEntry.Reference> treesBetaTaiga = registryConfigured.getOrThrow(ModernBetaVegetationConfiguredFeatures.TREES_BETA_TAIGA); + RegistryEntry.Reference> treesBetaOakForest = registryConfigured.getOrThrow(ModernBetaVegetationConfiguredFeatures.TREES_BETA_OAK_FOREST); RegistryEntry.Reference> treesBetaForestBees = registryConfigured.getOrThrow(ModernBetaVegetationConfiguredFeatures.TREES_BETA_FOREST_BEES); RegistryEntry.Reference> treesBetaRainforestBees = registryConfigured.getOrThrow(ModernBetaVegetationConfiguredFeatures.TREES_BETA_RAINFOREST_BEES); RegistryEntry.Reference> treesBetaSeasonalForestBees = registryConfigured.getOrThrow(ModernBetaVegetationConfiguredFeatures.TREES_BETA_SEASONAL_FOREST_BEES); RegistryEntry.Reference> treesBetaSparseBees = registryConfigured.getOrThrow(ModernBetaVegetationConfiguredFeatures.TREES_BETA_SPARSE_BEES); - + RegistryEntry.Reference> treesBetaOakForestBees = registryConfigured.getOrThrow(ModernBetaVegetationConfiguredFeatures.TREES_BETA_OAK_FOREST_BEES); + RegistryEntry.Reference> treesPEForest = registryConfigured.getOrThrow(ModernBetaVegetationConfiguredFeatures.TREES_PE_FOREST); RegistryEntry.Reference> treesPERainforest = registryConfigured.getOrThrow(ModernBetaVegetationConfiguredFeatures.TREES_PE_RAINFOREST); RegistryEntry.Reference> treesPESeasonalForest = registryConfigured.getOrThrow(ModernBetaVegetationConfiguredFeatures.TREES_PE_SEASONAL_FOREST); @@ -221,12 +225,14 @@ public class ModernBetaVegetationPlacedFeatures { PlacedFeatures.register(featureRegisterable, TREES_BETA_SEASONAL_FOREST, treesBetaSeasonalForest, withNoiseBasedCountModifier(ModernBetaFeatureTags.TREES_BETA_SEASONAL_FOREST, NoiseBasedCountPlacementModifierBeta.of(2, 0.1f, 1))); PlacedFeatures.register(featureRegisterable, TREES_BETA_SPARSE, treesBetaSparse, withCountExtraAndTreeModifier(0, 0.1f, 1)); PlacedFeatures.register(featureRegisterable, TREES_BETA_TAIGA, treesBetaTaiga, withNoiseBasedCountModifier(ModernBetaFeatureTags.TREES_BETA_TAIGA, NoiseBasedCountPlacementModifierBeta.of(5, 0.1f, 1))); - + PlacedFeatures.register(featureRegisterable, TREES_BETA_OAK_FOREST, treesBetaOakForest, withNoiseBasedCountModifier(ModernBetaFeatureTags.TREES_BETA_OAK_FOREST, NoiseBasedCountPlacementModifierBeta.of(5, 0.1f, 1))); + PlacedFeatures.register(featureRegisterable, TREES_BETA_FOREST_BEES, treesBetaForestBees, withNoiseBasedCountModifier(ModernBetaFeatureTags.TREES_BETA_FOREST_BEES, NoiseBasedCountPlacementModifierBeta.of(5, 0.1f, 1))); PlacedFeatures.register(featureRegisterable, TREES_BETA_RAINFOREST_BEES, treesBetaRainforestBees, withNoiseBasedCountModifier(ModernBetaFeatureTags.TREES_BETA_RAINFOREST_BEES, NoiseBasedCountPlacementModifierBeta.of(5, 0.1f, 1))); PlacedFeatures.register(featureRegisterable, TREES_BETA_SEASONAL_FOREST_BEES, treesBetaSeasonalForestBees, withNoiseBasedCountModifier(ModernBetaFeatureTags.TREES_BETA_SEASONAL_FOREST_BEES, NoiseBasedCountPlacementModifierBeta.of(2, 0.1f, 1))); PlacedFeatures.register(featureRegisterable, TREES_BETA_SPARSE_BEES, treesBetaSparseBees, withCountExtraAndTreeModifier(0, 0.1f, 1)); - + PlacedFeatures.register(featureRegisterable, TREES_BETA_OAK_FOREST_BEES, treesBetaOakForestBees, withNoiseBasedCountModifier(ModernBetaFeatureTags.TREES_BETA_OAK_FOREST_BEES, NoiseBasedCountPlacementModifierBeta.of(5, 0.1f, 1))); + PlacedFeatures.register(featureRegisterable, TREES_PE_FOREST, treesPEForest, withNoiseBasedCountModifier(ModernBetaFeatureTags.TREES_PE_FOREST_BEES, NoiseBasedCountPlacementModifierBeta.of(2, 0.1f, 1))); PlacedFeatures.register(featureRegisterable, TREES_PE_RAINFOREST, treesPERainforest, withNoiseBasedCountModifier(ModernBetaFeatureTags.TREES_PE_RAINFOREST_BEES, NoiseBasedCountPlacementModifierBeta.of(2, 0.1f, 1))); PlacedFeatures.register(featureRegisterable, TREES_PE_SEASONAL_FOREST, treesPESeasonalForest, withNoiseBasedCountModifier(ModernBetaFeatureTags.TREES_PE_SEASONAL_FOREST_BEES, NoiseBasedCountPlacementModifierBeta.of(1, 0.1f, 1))); diff --git a/src/main/resources/assets/modern_beta/lang/en_us.json b/src/main/resources/assets/modern_beta/lang/en_us.json index d62fb16d..87d3133e 100644 --- a/src/main/resources/assets/modern_beta/lang/en_us.json +++ b/src/main/resources/assets/modern_beta/lang/en_us.json @@ -27,8 +27,9 @@ "createWorld.customize.modern_beta.preset.type.default": "Default", "createWorld.customize.modern_beta.preset.type.custom": "Custom", - "createWorld.customize.modern_beta.preset.name.beta": "Beta", - "createWorld.customize.modern_beta.preset.name.alpha": "Alpha", + "createWorld.customize.modern_beta.preset.name.beta": "Beta 1.7.3", + "createWorld.customize.modern_beta.preset.name.beta_1_1_02": "Beta 1.1_02", + "createWorld.customize.modern_beta.preset.name.alpha": "Alpha v1.1.2_01", "createWorld.customize.modern_beta.preset.name.skylands": "Skylands", "createWorld.customize.modern_beta.preset.name.infdev_611": "Infdev 611", "createWorld.customize.modern_beta.preset.name.infdev_420": "Infdev 420", @@ -39,6 +40,7 @@ "createWorld.customize.modern_beta.preset.name.classic_0_30": "Classic 0.30", "createWorld.customize.modern_beta.preset.name.pe": "Pocket Edition", "createWorld.customize.modern_beta.preset.name.beta_1_8_1": "Beta 1.8.1", + "createWorld.customize.modern_beta.preset.name.beta_1_9_pre_3": "Beta 1.9 Prerelease 3", "createWorld.customize.modern_beta.preset.name.release_1_0_0": "1.0.0", "createWorld.customize.modern_beta.preset.name.release_1_1": "1.1", "createWorld.customize.modern_beta.preset.name.release_1_2_5": "1.2.5", @@ -63,7 +65,8 @@ "createWorld.customize.modern_beta.preset.desc.custom": "Explore a world with custom terrain generation settings.", "createWorld.customize.modern_beta.preset.desc.beta": "Explore a world with the terrain generation of Minecraft Beta 1.7.3.", - "createWorld.customize.modern_beta.preset.desc.alpha": "Explore a world with the terrain generation of Minecraft Alpha 1.1.2_01.", + "createWorld.customize.modern_beta.preset.desc.beta_1_1_02": "Explore a world with the terrain generation of Minecraft Beta 1.1_02.", + "createWorld.customize.modern_beta.preset.desc.alpha": "Explore a world with the terrain generation of Minecraft Alpha v1.1.2_01.", "createWorld.customize.modern_beta.preset.desc.skylands": "Explore a world with the terrain generation of the removed Sky Dimension.", "createWorld.customize.modern_beta.preset.desc.infdev_611": "Explore a world with the terrain generation of Minecraft Infdev 20100611.", "createWorld.customize.modern_beta.preset.desc.infdev_420": "Explore a world with the terrain generation of Minecraft Infdev 20100420.", @@ -74,11 +77,12 @@ "createWorld.customize.modern_beta.preset.desc.classic_0_30": "Explore a world with the terrain generation of Minecraft Classic 0.30.", "createWorld.customize.modern_beta.preset.desc.pe": "Explore a world with the terrain generation of Minecraft Pocket Edition v0.6.0 Alpha.", "createWorld.customize.modern_beta.preset.desc.beta_1_8_1": "Explore a world with the terrain generation of Minecraft Beta 1.8.1.", + "createWorld.customize.modern_beta.preset.desc.beta_1_9_pre_3": "Explore a world with the terrain generation of Minecraft Beta 1.9 Prerelease 3.", "createWorld.customize.modern_beta.preset.desc.release_1_0_0": "Explore a world with the terrain generation of Minecraft 1.0.0.", "createWorld.customize.modern_beta.preset.desc.release_1_1": "Explore a world with the terrain generation of Minecraft 1.1.", "createWorld.customize.modern_beta.preset.desc.release_1_2_5": "Explore a world with the terrain generation of Minecraft 1.2.5.", "createWorld.customize.modern_beta.preset.desc.release_1_6_4": "Explore a world with the terrain generation of Minecraft 1.6.4.", - "createWorld.customize.modern_beta.preset.desc.release_1_12_2": "Explore a world with the terrain generation of Minecraft 1.12.2. (Note: slightly inaccurate)", + "createWorld.customize.modern_beta.preset.desc.release_1_12_2": "Explore a world with the terrain generation of Minecraft 1.12.2.", "createWorld.customize.modern_beta.preset.desc.beta_skylands": "Explore a world with the terrain generation of the removed Sky Dimension and Beta biomes.", "createWorld.customize.modern_beta.preset.desc.beta_isles": "Explore a world where you start on an archipelago surrounded by a large ocean and outer islands.", diff --git a/src/main/resources/assets/modern_beta/textures/gui/preset_beta_1_1_02.png b/src/main/resources/assets/modern_beta/textures/gui/preset_beta_1_1_02.png new file mode 100644 index 0000000000000000000000000000000000000000..2d24d7a862c8afe47dbb0522c15277f55133c3d2 GIT binary patch literal 11391 zcme7R@N?(olHy`uVBq!ia0y~yU}ykg4rT@hhA$5${$yZaI8+r9Q4*9`u24{vpO%@E zs!&o{kgAYck(tK8P;o0az)|S10>_@;U3QL)yf(*8Ui#EucwQblsnhp*p`%&k#0~ZL z)_=%YpyK#x(NV9?h8Yr}DpKrO&qbCNA6I;6bM>&MfLG6nf6gD@_g7i*x~(|z>FSG@ zhpf2O-mSNHGhy1^7qxHa#GQhd1tv*f`M4&+XZma5YqsYuY;;z>xbyAp%7b6F^;FNu zNKa-~zjl#fyKbYl(951>3gS;BR~r=<8S^~3KZmbH|HIx$ZNblcAq)(REt$^F0iMpz zFyAmRRLrTJXzOv9d-FQJbxjIC7$3cPu;hi3>OXzWEgc^p?2v!|&i36sMyJ)sLW~92L(Uo* zootz*zozT&dX5AA0!cHb&RDs8Q@3SB-}>qwKdQu^M&5h=PsZ8nVoHO*N}uuF4ISnk z$+M@OtDJ9fMr)E&jh{{C1=ddaoqD_f9NYP3!vW*NZhFT4GHPO{ZFRmItd`LF$W!PN zXnIQglb-gR?G~%Ivc0}DdA~u#m9R}Q%PrefrcH2?Qc5uiaOD+Sv?XiFj1w2?4js0C z_2crBNhd>Dm5(#M3Q)AH`(Xd$?%K#%^NJ=naV~g&besLL#(%L3?rwSeKKXXue1?DN z54>LgdaaxAZt|D3@NOB#g}DzN?OJ`Z`oL2@gHKDm+n#vT&2n1FvS%);>0WrfRwK%ybv!En1KTiQ< zW@1u)X^E|p5|@I40@Uz|+yY-;xbb<#&`?Ou&(*I;EYLU9Gtke?)koG*T;f_*f?r2* zNM%8)eo$(0erZv1s%u$lUWqcY5h=-V{RO2(IbiRkBKUR~>F((p z0M`Kug7nPX09DSpPZRu1z{Q{8WU^Bqt~8T9_Ie>6#cA8Jni1rW%}V}PfvlCd7dRY5D`P`#14AoBh*|mOr(~v85>jmk${9A0`1Z&wF3B&d z1Pej3Q*de_ga_f~WP(&HC@6q)gjHfP#P!9AWvMA(cfzHTGZORCQ&Vh}plKDRB@;_J zNHaGvuuM+2)J;iCPS!OsOiI-mD+?w|7WcGzk1`zMce+bIq>&)Ti_%H1_sUokH}&M25w;xW@MN(M}mQY zfxX1j*OmPR3p2mDM!iHSNS$PfYeb22elDo3&j4oIKl-um?V zM{m9pm;6(n@8;W6U-{=bkNw*N{s$k=&#f=5u{m7-^1yQb%zuqf*XRBhW4EhiIA*T9 zzy9;@|67^m`{Os=-S=U(?2j+S+y4K$onQXoGJj6}!#iIS>Q=ve{qXtb&(g9#3itj0 zZ}H*b%lE6Be${JdN7!|HRh&NKeh)%+nIZ!*8GpFRHB_vx}fzQkL9(7yBi za>yU;<-hC;9<-}}ej3j4;lA~UweOFndOnp8{GqJA&+4`R)I`7f=>4&$+}ZzWX8hmL zRR8#Z`fIy=diPE={GrB_^8aKz{}prX(|9$V zdH$Op8~NA_X6(uT_IXke-$Un_A42C}`n}%r!@r$w`#xpt-yls&yC zkIP$L=&NUY`}*Y{i8ecT`#O){`?X5kNrzRhN=@2${d4NaP9@KYPMV5W^Ka)(i|4C3 z%q?44b0@#zg5~$?Qq7->-|zL_=z2g+>ypU1i3@rnWcV)V9Ozj8t^d8;v;6me&NfQ2 z=Q-c!FRs38CvsWd`Tucw=jwe+5^B#hP7(JxCSurYpSdx_{ckAyzE6v8{p@4je*28! zUKx$g7y2t_v|Io9(VR0|QLJaW&?5g&2PV`CPmfC8^mI4hpPxT}OcVcnx-s# zcOb**hZp&`zfhL%oOjjgUuF2Bg*Ltl+Q%xL9(Z4x`R~uQ#D9P8HO>{-P-9u}TK@Cn zZ_np{f7nv+Q(4u|Di@+>%#{BjyL}96?ky% z&a0#u*;A&&MybsRhmJW4E7ay;;{IEm#_3;Zb63;4YcJpp8 zd=z`{g$|WApcgpYDo>}zwK~kLN%*r3d3VhdRI+@6MgrxZVU}b07zx{ZP zWrN^ak?g9+eU%G0%$M?eR{2!oSK=AV6w89w>H7-irZ>*aX`JaDD>kpL;KAxu|93NQ z-_CYuyZO!eqCeRMcWi#Nb9UIH4;3+XHYfNsgNx)=-E?2?zx9{$~+qt(!_A<)p zie4}I^Kb9tO@F?XRbPGh;hWnA`DPi3cdzf1Pf?!7p*3TP{Li$nhTr)O#or(M5chf? z*RqIsFH_H$m;a6D)!%OnXWeHrWBvW_VvLaoZaMpvh-AnY_1t7DQk~Cs*x7#lvQ24C zVv+m%)t>b6Jv!mCx8j?-;Ew<5LTkC+DY;mF__m7kVZyOpm8TQVToP-F?U)tR-p&(4GH#yC;P5LN;ymi_-+WSLzw=^Fb^ZQYwdQi8y8QF+mpm)3{bb^3A6nyM{^jY} z8QW(+y3||w=CX6;?8Zf>7}Nzy)I{AwD=Zf*s6EYU-1_lpBcJ#?e#OsGk3`ukC#~Ub z+$Pi8`JwP|Z&1tIcCE;7=~ET2@$T=r;`E67Wl_S9Y0QtG97}k+yV~+Xf+GJr{nxrC z`JA4Ie)T@@;qLl->{oArW8bgip_ayHO^#({249m7F`K8e%(9^U$;Q;?HMQGhnpilb z8kYK2?^|?^^Syq;zL(3dvKu(S$(8@`}Xq>8d`$4#J=C1aaWpg z0`sww>$f)Q`_&w)?TYfzH^VX|bW{0z3Yupw7&eE#nym*TP{c{+&zvyq8m=u4%-9@m0$+F?^+hbP8 z8RD(w+6vF~y*t%>^NoPa$JbFTHA+ks@eejVy5G|BjNyf|s8ao}b+Wamw!QaB59#dP zQmwR5y|{euo9ZjVXScW}$epl1{$vk-#fAQ~Eom(#fA$GZE1a=6{K5M(%@Z>hbXfJXoxM+fSrPy3o*hC_DidspJS=sYY9=q2$e^;5s)A@By zi;R=UiNYRS&hHBFDq{^xt1 z%eH*_R3`t9PqUz($Ht(q(4s;9vqA65&t-2;#6>d2^e@+yo zB~)tnG$ky^y~ESF7qnhIPc`+Z!hxqT@2uw`}(4&1%oGF zto+&&wmr$}sjCcG_nlv&$u>iO(ytxsUoRFt=$krWeU^aHi(8J`Z3UeFEgl}Uu{rLY zQSj#2Bjyv^YX06cXBT)FyM9vb<2`ehrEk5UW-G~2+4l93z{|D&FR8@LYTtTpdfuK@ z0k%ywCzjv5vEZxqWy>~unHS4_FP-bXZT3*B*bK4mClQZ^%Z*LwE93JD>i zC+xF#zw6_x*~;X3CGpg1u_ea$G+t!#>`4mX=ur(Q;$S)=a^ipGM#U4=dpcftwOh3q zhU{b9v1~Cf!3h#V&$WBrsMz!|G4Iu`{ZUt@sC&trZDic;{9CG0ujEYg+;s0nqKuy&6f`Vs zIF!Sf@Ha3$;`(kSD~0ld^X)zIU(9%-c%Uw15vz*PdOyZ$1IPF&e|Ef{euMLn;*a2V zo6XS`Uru!|iLq}#?)>9}WZ)y+B_59%TfRDQSKa?Q`Hc32IfhGAZzl!u-1V?eauYna zOk?exD;^KeKjN#u_^{&1p7Z9qS9(?}`EVR7Cy%(!+G17Gemv}M5+5M6sS2> zciz%SuBDIvhf3~&D<e3F^6G4de&5|;(_4@??X*jRV&Fkt zOZkA{OP6Z(E(`FVJt8u3|0uzH=V^aWt?7Lmy;n~SFURyA z=gqykWv#T-w6b#xyl<6OeVmxV$euITcKO#iTs?(cJ9f;@sFH{z*{a^wn+UL0=WOM=f`H#&h}GZ$FNv zO%B{mf=QP}>{{Noy*&B3w?s?uNdK{(kgRikQ|ydXvXfP^^_Q*Un`m*+XpyCg5v{CnmmRwdyEF<2MoF1y2~Cwdfs>uE;p`;;__mtu5;iex7VZ>U6VXsupOybS<&#+H2va41BU(bPzRzNvE2yPlA!)9Kv^~%Eiy+H4_ zYaRKiiGMjcQ+4?lZmCR-_}Dbb;P#WfR()y{m^l*W{i|u5^y-kGO!(3BGrHnV1Xf+; zoM+ivGB-kTCPzsmqxLdsW!~734NI?9zHC1;|3tu2>u4s&j2{H~~D zCZ)`pE0(U$&Dp;#RK-K($l;|&CG;2X%AD+eM2V}oL$&9cAcMi>u%)watO)rrxjRDX z)Xt`Pb66a5FDNZ+u)b)<(N)@&xI@i&N`OLr@#U7aT#7MmvWuTgF6%OPc0Qy0IO4BU z&FVN#Udz=yn_4q9MC=kAc7-x8d>%N>V$IX6C)e04r^aXbJ-u^%&-~vz*VW$MCbVB5 zTxo&t`r~`vYp10DVfoTw{fMQ+`uhIFXvS$`PsQ_spXbZ6$cr$u~wB=9oCpteIn_sH4Ie6g+rW-P_)J{K&y^+IV;J;#Hm&T*>S ze=X|}IIO&bOGqw~#Y6f2#HK0o^&5`J?dFpz2=ratrP8D!*|oSXll#_G1~&FwhG`!X z@A8TLukh(QxbI!A@ao*kbp@wPwkU=&?o^rSeoP_VG3kT!qAl(POokHmJl(19ICl#1 zb$Iqn-YBWC-td~?ri>y#kz0JWYaF&_Er>C+Hr;CW{Y2uKqDwosI@Cm#b3SPonRUzX zWO|s$B5NszU*#!juRi-EGhw-R8XovbZs4Lvv!_U1!oPBC+drPtG*7_@tS3LCi#dAmccw<0^Pup|5H@82# zR0O2`HsQ)!Q#(EHc>nQiwVmJmdam+3*&6jr&PJj2$Sm>YzKb|L8~?B-K5o_D7$y)a zQ9JLucC7kp)?Xdj4yi8d7EZoiJA3`yyDvjT{eEv|41B@N#!{I#T~^~TFKg$88<}60 zop+e~^$>5_nu5!B7@15M1uuwlY<(LidSTm6rO)a&Kl0eOyG~GxO^!Qs;*O>N?`>-z zK9YMge?hgp{@MFqJT9|z^;Y^tU(Y@Ft!Gk;b84keXyJwP7Z$e82vzIiiTm!j=;Fl` z>DvaK?J)@tye_?RQeKm=Ign?u(A0*rVc$2MUj227hkX0C%|2>JM2^jSe8E?W`(ah$ zJUyPRA@?sZ%-fz@?N?&A1fpj`Rpm*zUR%_9{aGJ?OO5C z_Rl$=O81p*E%Zsf5n{R5!8o^FF5rInZEo(^*a3ln00kl7YmnZmR#O7SJ?Tu;G+I$JC_~pX3Ral zv9s^y__jY|c+jEsn)L_or^sljZ`a$de3(!hw$FU}mZx1U9>$Ln)qgRcyg#ovPquYk zKhrrLy~&sMFXmRTWPXw1(7-IdrLaxL>(z;cDL))S6iif}y?(weZbvZJvDc^kwD;dO zJ>ep@rd`d`qo{q zc4hM)&&;2Ab*@i(Wc1Mu(*HAxXR}w`Sbx5krP_4YlGoh3w2p9u2qm+vI&N{-O5kC_ z5gtAVyIB?o>n=N9?q-Uc9<^SpL9KM|`-RVVTY8@H9I@AMkMq5}Im}J56`&NDkgFyOGH5<;B_@y3;cis>;cR8z11E1}P?@GQ&h<2>*~uA|xN&HLY<-x&P6^F@Ag+qtuk z{xUJ^YR+&~eeba0>XNG_5~&lJmzi1Fs~voB<%PsIRlX;WCg?(mnZF}##83%oSFXVCF zV#0ka_if0h@Ml8icH#SO^o(jZ zhjyNKr&v~6Oo$3tv+i(zyKuG^+gm->t1Pc_*R4#R(7bFL+n=!iv!56|x4Fu<+>CiT z;|-bBY(Mw96=@z(R^y$hz;s@{##o^Fr{3;0aekgDO+qG`m$ga_CZw+p+|0Jo{_JhP zq^+6KSM?&c)v3j96cf1~Jkz2)z+ln!mdRC9zD6W-wd>tqHsOlfWX8AW|2oaTb1zEl zTl%`5FN=>Q&XC|cbGh#W>#8YpE;IaJ65AF2bRAD#M6&AZ8{h1n{k}3q;MX1>_irtN zDx7OizCS9y!lioG7k%Z`5h@(K-{!C|-MGG7DQ@$#Ene+kGp&th+*tE%g43P7SzMWy zFII2+`ZMKd&E)qhU&ii@U(6Y|P*(knP}`wJ?EBw`2pFx3a9g!UVy*aXgZ^pjCg=Do zu6QLUa<})Yo1g}h;@-C2tj7LLmogfwJN-tEF*T=V^k zh|2%YmS>Yb&icRg<3j7xUGMayBhEAadA7nkcEV20DGxX6?wz`CQzaLRRjSC(c|GZA z0sbxG7k(IhwfWAyJXpV0Z99vl?tFH~z}JCl@BS7CyjUEj|1s+AlI(3R=B-yRp3hcZ zR2K8q-$+{QiL=#frstOC`MH06q<^pW;$)kz&N-QB!`6t$*Ms+I)+;@bwXvITQqX4F zR(khfT3Qb*3e?TN1T6x{9Tm*3GMXvUe$73+KtZU3M@p z_oBslvD(zYNYx1ee7BxD`0MS8Jy1S#qSx*ff`84uFFm+bm~&~-&JWqeZ&}`&=*Wu) znD(#Sd+gVp_tV*f9SSvMbl4|1xe_nB&-<7H9OC{FjDQ}Qp`$=DD*Ma|8$Cu}oyP9AAQ*czW?Zsmc_ki&1 zshi50F9w8q7w{Z8dc4rFy8BDR|2xx^Un&1;o_05=K+!3xdVj_HL)D*q-YvhOt(w5< zDz?>k?b*vIlB&Hg%-yV(I#o5!#`tU)sb*qY4=5b|-G4f`GOP{21CJhmkVpRebMc2k+(WAL1X^0##1-uhfdGBP_RC) z_e1Z?_SMGU&#&dpJaz1G2+OtX^T|@T@7$jBkL%#SPcNM`qSpBR^9*jTSY0Lm`U)?9 ziA!(w?q53%OYSP={MaC(8T0J@g$lo1&!)f$O;uS!UmnZ~E6AiPajqdNIP3OLT zVyJXG(fBt?-TnX3?nP(sJh=7DtSL?Y*FBH&mHwYjN^HHnr(yQ0jR8yfF7z`kN!u5* zEF@0XKgGa=gNwl>>+cyk-oEu=4Q7o$)z9)VCGMDTPNP*Rs)|iX$v`5uRmi*QuGp%B z*@?IGWte3*P=B4L;1HGa&6Odjkc`)t0`Hm_;HUy!M6C@5$$7 zTCZ0zZ~o$mE1UPlK8^L3OtfqJow>f!OPIN_Ox-&7qQN4iDIuCY@l{#VnRR(MmjBQ> zzHxfjvM!FSmzIiqmR8+uzy5;t-gfSv;sVmrGS>x6YVR$NT&>s8TOxh;nAy>d@9*Eb zrfI{#P`r?>CvV?|p13;u+K<2Y*fze|b}=ZIw`Jinz`7H@XTNwKZ4jlt&*ebs_n;TO zJbu21YWwANK>XZjfG+w=Bir%O5dplp9_6%26W__io zc9$o1Qu?ggywhv$&d(Cu?iVf}oXMDxEyB^}ws+QcJM+fgTe~DWM4f(}b?? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/modern_beta/textures/gui/preset_beta_1_9_pre_3.png b/src/main/resources/assets/modern_beta/textures/gui/preset_beta_1_9_pre_3.png new file mode 100644 index 0000000000000000000000000000000000000000..e968e580e275334093f22a586a26926f20e66099 GIT binary patch literal 8346 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