diff --git a/TerraForgedCore/src/main/java/com/terraforged/core/settings/RiverSettings.java b/TerraForgedCore/src/main/java/com/terraforged/core/settings/RiverSettings.java index 4723f47..04d8d77 100644 --- a/TerraForgedCore/src/main/java/com/terraforged/core/settings/RiverSettings.java +++ b/TerraForgedCore/src/main/java/com/terraforged/core/settings/RiverSettings.java @@ -54,7 +54,7 @@ public class RiverSettings { @Comment("Controls the depth of the river") public int bedDepth; - @Range(min = 1, max = 10) + @Range(min = 0, max = 10) @Comment("Controls the height of river banks") public int minBankHeight; diff --git a/TerraForgedCore/src/main/java/com/terraforged/core/settings/TerrainSettings.java b/TerraForgedCore/src/main/java/com/terraforged/core/settings/TerrainSettings.java index c478957..91cc0ae 100644 --- a/TerraForgedCore/src/main/java/com/terraforged/core/settings/TerrainSettings.java +++ b/TerraForgedCore/src/main/java/com/terraforged/core/settings/TerrainSettings.java @@ -28,6 +28,7 @@ package com.terraforged.core.settings; import com.terraforged.core.util.serialization.annotation.Comment; import com.terraforged.core.util.serialization.annotation.Range; import com.terraforged.core.util.serialization.annotation.Serializable; +import com.terraforged.core.world.terrain.TerrainPopulator; import me.dags.noise.Module; @Serializable @@ -83,10 +84,8 @@ public class TerrainSettings { public Module apply(double bias, double scale, Module module) { double moduleBias = bias * baseScale; double moduleScale = scale * verticalScale; - if (moduleBias + moduleScale > 1) { - return module.scale(moduleScale).bias(moduleBias).clamp(0, 1); - } - return module.scale(moduleScale).bias(moduleBias); + Module outputModule = module.scale(moduleScale).bias(moduleBias); + return TerrainPopulator.clamp(outputModule); } } } diff --git a/TerraForgedCore/src/main/java/com/terraforged/core/world/rivermap/river/River.java b/TerraForgedCore/src/main/java/com/terraforged/core/world/rivermap/river/River.java index f3d4262..094a893 100644 --- a/TerraForgedCore/src/main/java/com/terraforged/core/world/rivermap/river/River.java +++ b/TerraForgedCore/src/main/java/com/terraforged/core/world/rivermap/river/River.java @@ -177,8 +177,9 @@ public class River extends TerrainPopulator { } private void carveBed(Cell cell, float bedAlpha, float bedHeight) { - // lerp the height down to the riverbed height - cell.value = NoiseUtil.lerp(cell.value, bedHeight, bedAlpha); + if (cell.value > bedHeight) { + cell.value = NoiseUtil.lerp(cell.value, bedHeight, bedAlpha); + } tag(cell, terrains.river); } diff --git a/TerraForgedCore/src/main/java/com/terraforged/core/world/terrain/TerrainPopulator.java b/TerraForgedCore/src/main/java/com/terraforged/core/world/terrain/TerrainPopulator.java index 6622f02..3d7db53 100644 --- a/TerraForgedCore/src/main/java/com/terraforged/core/world/terrain/TerrainPopulator.java +++ b/TerraForgedCore/src/main/java/com/terraforged/core/world/terrain/TerrainPopulator.java @@ -36,7 +36,7 @@ public class TerrainPopulator implements Populator { public TerrainPopulator(Module source, Terrain type) { this.type = type; - this.source = source; + this.source = clamp(source); } public Module getSource() { @@ -57,4 +57,11 @@ public class TerrainPopulator implements Populator { public void tag(Cell cell, float x, float y) { cell.tag = type; } + + public static Module clamp(Module module) { + if (module.minValue() < 0 || module.maxValue() > 1) { + return module.clamp(0, 1); + } + return module; + } } diff --git a/TerraForgedCore/src/main/java/com/terraforged/core/world/terrain/provider/StandardTerrainProvider.java b/TerraForgedCore/src/main/java/com/terraforged/core/world/terrain/provider/StandardTerrainProvider.java index 089fa03..64419c1 100644 --- a/TerraForgedCore/src/main/java/com/terraforged/core/world/terrain/provider/StandardTerrainProvider.java +++ b/TerraForgedCore/src/main/java/com/terraforged/core/world/terrain/provider/StandardTerrainProvider.java @@ -125,7 +125,8 @@ public class StandardTerrainProvider implements TerrainProvider { Terrain type = new Terrain(name, id, weight); Module combined = Source.perlin(seed.next(), scale, 1) .warp(seed.next(), scale / 2, 2, scale / 2D) - .blend(tp1.getSource(), tp2.getSource(), 0.5, 0.25); + .blend(tp1.getSource(), tp2.getSource(), 0.5, 0.25) + .clamp(0, 1); return new TerrainPopulator(combined, type); } diff --git a/TerraForgedMod/src/main/java/com/terraforged/mod/command/TerraCommand.java b/TerraForgedMod/src/main/java/com/terraforged/mod/command/TerraCommand.java index babf273..5cc5d7c 100644 --- a/TerraForgedMod/src/main/java/com/terraforged/mod/command/TerraCommand.java +++ b/TerraForgedMod/src/main/java/com/terraforged/mod/command/TerraCommand.java @@ -46,6 +46,7 @@ import com.terraforged.mod.command.search.BothSearchTask; import com.terraforged.mod.command.search.Search; import com.terraforged.mod.command.search.TerrainSearchTask; import com.terraforged.mod.data.DataGen; +import com.terraforged.mod.settings.SettingsHelper; import net.minecraft.command.CommandSource; import net.minecraft.command.Commands; import net.minecraft.entity.player.PlayerEntity; @@ -94,6 +95,9 @@ public class TerraCommand { .then(Commands.literal("data") .then(Commands.literal("dump") .executes(TerraCommand::dump))) + .then(Commands.literal("defaults") + .then(Commands.literal("set") + .executes(TerraCommand::setDefaults))) .then(Commands.literal("debug") .executes(TerraCommand::debugBiome)) .then(Commands.literal("locate") @@ -134,6 +138,20 @@ public class TerraCommand { return Command.SINGLE_SUCCESS; } + private static int setDefaults(CommandContext context) throws CommandSyntaxException { + TerraContext terraContext = getContext(context).orElseThrow(() -> createException( + "Invalid world type", + "This command can only be run in a TerraForged world!" + )); + + context.getSource().sendFeedback( + new StringTextComponent("Setting generator defaults"), + true + ); + SettingsHelper.exportDefaults(terraContext.terraSettings); + return Command.SINGLE_SUCCESS; + } + private static int debugBiome(CommandContext context) throws CommandSyntaxException { ServerPlayerEntity player = context.getSource().asPlayer(); BlockPos position = player.getPosition();