- Fix a bug with the River carver

- Add '/terra defaults set' command
- Add extra checks to make sure terrain modules are clamped between 0.0-1.0
This commit is contained in:
dags- 2020-03-31 13:50:17 +01:00
parent 4d936f9f5d
commit 8269adddbb
6 changed files with 35 additions and 9 deletions

View File

@ -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;

View File

@ -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);
}
}
}

View File

@ -177,8 +177,9 @@ public class River extends TerrainPopulator {
}
private void carveBed(Cell<Terrain> cell, float bedAlpha, float bedHeight) {
// lerp the height down to the riverbed height
if (cell.value > bedHeight) {
cell.value = NoiseUtil.lerp(cell.value, bedHeight, bedAlpha);
}
tag(cell, terrains.river);
}

View File

@ -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<Terrain> 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;
}
}

View File

@ -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);
}

View File

@ -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<CommandSource> 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<CommandSource> context) throws CommandSyntaxException {
ServerPlayerEntity player = context.getSource().asPlayer();
BlockPos position = player.getPosition();