From c107f98550fc1d6eec44aaf6f63b75cd7c96e4f7 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 6 Oct 2020 19:21:57 -0700 Subject: [PATCH] Begin work on languages, general cleanup, fix minor local sea level issues. --- .../dfsek/terra/async/AsyncBiomeFinder.java | 3 ++ .../dfsek/terra/biome/CoordinatePerturb.java | 22 +++++++++++-- .../com/dfsek/terra/biome/TerraBiomeGrid.java | 11 +++---- .../dfsek/terra/biome/UserDefinedBiome.java | 3 ++ .../terra/command/type/WorldCommand.java | 2 +- .../dfsek/terra/config/base/ConfigPack.java | 2 -- .../com/dfsek/terra/config/base/LangUtil.java | 4 --- .../com/dfsek/terra/config/lang/LangUtil.java | 24 ++++++++++++++ .../com/dfsek/terra/config/lang/Language.java | 29 +++++++++++++++++ .../com/dfsek/terra/config/lang/Message.java | 12 +++++++ .../terra/config/lang/MultiLineMessage.java | 32 +++++++++++++++++++ .../terra/config/lang/SingleLineMessage.java | 27 ++++++++++++++++ .../terra/generation/TerraChunkGenerator.java | 4 ++- .../generation/UserDefinedGenerator.java | 1 + .../dfsek/terra/population/SnowPopulator.java | 7 ++-- .../terra/{generation => util}/DataUtil.java | 2 +- src/main/resources/lang/en_us.yml | 9 ++++++ 17 files changed, 173 insertions(+), 21 deletions(-) delete mode 100644 src/main/java/com/dfsek/terra/config/base/LangUtil.java create mode 100644 src/main/java/com/dfsek/terra/config/lang/LangUtil.java create mode 100644 src/main/java/com/dfsek/terra/config/lang/Language.java create mode 100644 src/main/java/com/dfsek/terra/config/lang/Message.java create mode 100644 src/main/java/com/dfsek/terra/config/lang/MultiLineMessage.java create mode 100644 src/main/java/com/dfsek/terra/config/lang/SingleLineMessage.java rename src/main/java/com/dfsek/terra/{generation => util}/DataUtil.java (94%) create mode 100644 src/main/resources/lang/en_us.yml diff --git a/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java b/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java index c2918201f..b1a30e975 100644 --- a/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java +++ b/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java @@ -8,6 +8,9 @@ import org.bukkit.entity.Player; import org.polydev.gaea.biome.Biome; import org.polydev.gaea.generation.GenerationPhase; +/** + * Runnable that locates a biome + */ public class AsyncBiomeFinder implements Runnable { private final TerraBiomeGrid grid; private final int centerX; diff --git a/src/main/java/com/dfsek/terra/biome/CoordinatePerturb.java b/src/main/java/com/dfsek/terra/biome/CoordinatePerturb.java index f28ef145c..e76be8abd 100644 --- a/src/main/java/com/dfsek/terra/biome/CoordinatePerturb.java +++ b/src/main/java/com/dfsek/terra/biome/CoordinatePerturb.java @@ -1,11 +1,22 @@ package com.dfsek.terra.biome; +import com.dfsek.terra.procgen.math.Vector2; import org.polydev.gaea.math.FastNoise; +/** + * Offset a coordinate pair by an amount. + */ public class CoordinatePerturb { private final FastNoise perturbX; private final FastNoise perturbZ; private final int amplitude; + + /** + * Create a CoordinatePerturb object with a given frequency, amplitude, and seed. + * @param frequency Noise frequency + * @param amplitude Offset amplitude + * @param seed Noise seed + */ public CoordinatePerturb(float frequency, int amplitude, long seed) { perturbX = new FastNoise((int) seed); perturbX.setNoiseType(FastNoise.NoiseType.Simplex); @@ -15,7 +26,14 @@ public class CoordinatePerturb { perturbZ.setFrequency(frequency); this.amplitude = amplitude; } - public int[] getShiftedCoords(int x, int z) { - return new int[] {(int) (perturbX.getNoise(x, z)*amplitude+x), (int) (perturbZ.getNoise(x, z)*amplitude+z)}; + + /** + * Offset a coordinate pair + * @param x X coordinate + * @param z Z coordinate + * @return Vector2 containing offset coordinates + */ + public Vector2 getShiftedCoords(int x, int z) { + return new Vector2(perturbX.getNoise(x, z)*amplitude+x, perturbZ.getNoise(x, z)*amplitude+z); } } diff --git a/src/main/java/com/dfsek/terra/biome/TerraBiomeGrid.java b/src/main/java/com/dfsek/terra/biome/TerraBiomeGrid.java index b77ac0c34..9b2b801de 100644 --- a/src/main/java/com/dfsek/terra/biome/TerraBiomeGrid.java +++ b/src/main/java/com/dfsek/terra/biome/TerraBiomeGrid.java @@ -2,6 +2,7 @@ package com.dfsek.terra.biome; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.base.ConfigUtil; +import com.dfsek.terra.procgen.math.Vector2; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; @@ -19,14 +20,12 @@ public class TerraBiomeGrid extends BiomeGrid { private UserDefinedGrid erosionGrid; private final BiomeZone zone; - private final boolean perturbPaletteOnly; public TerraBiomeGrid(World w, float freq1, float freq2, BiomeZone zone, ConfigPack c, UserDefinedGrid erosion) { super(w, freq1, freq2); if(c.biomeBlend) { perturb = new CoordinatePerturb(c.blendFreq, c.blendAmp, w.getSeed()); } - perturbPaletteOnly = c.perturbPaletteOnly; this.zone = zone; if(c.erosionEnable) { erode = new ErosionNoise(c.erosionFreq, c.erosionThresh, w.getSeed()); @@ -38,10 +37,10 @@ public class TerraBiomeGrid extends BiomeGrid { public Biome getBiome(int x, int z, GenerationPhase phase) { int xp = x; int zp = z; - if(perturb != null && (!perturbPaletteOnly || phase.equals(GenerationPhase.PALETTE_APPLY))) { - int[] perturbCoords = perturb.getShiftedCoords(x, z); - xp = perturbCoords[0]; - zp = perturbCoords[1]; + if(perturb != null && phase.equals(GenerationPhase.PALETTE_APPLY)) { + Vector2 perturbCoords = perturb.getShiftedCoords(x, z); + xp = (int) perturbCoords.getX(); + zp = (int) perturbCoords.getZ(); } UserDefinedBiome b; diff --git a/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java b/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java index a71208366..7ee56b924 100644 --- a/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java +++ b/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java @@ -9,6 +9,9 @@ import org.polydev.gaea.structures.features.Feature; import java.util.List; +/** + * Class representing a config-defined biome + */ public class UserDefinedBiome implements Biome { private final UserDefinedGenerator gen; private final UserDefinedDecorator decorator; diff --git a/src/main/java/com/dfsek/terra/command/type/WorldCommand.java b/src/main/java/com/dfsek/terra/command/type/WorldCommand.java index 816c42d24..b491e5670 100644 --- a/src/main/java/com/dfsek/terra/command/type/WorldCommand.java +++ b/src/main/java/com/dfsek/terra/command/type/WorldCommand.java @@ -27,7 +27,7 @@ public abstract class WorldCommand extends PlayerCommand { if(sender.getWorld().getGenerator() instanceof TerraChunkGenerator) { return execute(sender, command, label, args, sender.getWorld()); } else { - sender.sendMessage("World is not a Terra world!"); + sender.sendMessage("This world is not a Terra world!"); } return true; } diff --git a/src/main/java/com/dfsek/terra/config/base/ConfigPack.java b/src/main/java/com/dfsek/terra/config/base/ConfigPack.java index 7c7daf84a..74afd6c0e 100644 --- a/src/main/java/com/dfsek/terra/config/base/ConfigPack.java +++ b/src/main/java/com/dfsek/terra/config/base/ConfigPack.java @@ -60,7 +60,6 @@ public class ConfigPack extends YamlConfiguration { public int blendAmp; public boolean biomeBlend; public float blendFreq; - public boolean perturbPaletteOnly; public ConfigPack(JavaPlugin main, File file) throws IOException, InvalidConfigurationException { long l = System.nanoTime(); @@ -94,7 +93,6 @@ public class ConfigPack extends YamlConfiguration { biomeBlend = getBoolean("blend.enable", false); blendAmp = getInt("blend.amplitude", 8); blendFreq = (float) getDouble("blend.frequency", 0.01); - perturbPaletteOnly = getBoolean("blend.ignore-terrain", true); erosionEnable = getBoolean("erode.enable", false); erosionFreq = (float) getDouble("erode.frequency", 0.01); diff --git a/src/main/java/com/dfsek/terra/config/base/LangUtil.java b/src/main/java/com/dfsek/terra/config/base/LangUtil.java deleted file mode 100644 index 4915f6bac..000000000 --- a/src/main/java/com/dfsek/terra/config/base/LangUtil.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.dfsek.terra.config.base; - -public final class LangUtil { -} diff --git a/src/main/java/com/dfsek/terra/config/lang/LangUtil.java b/src/main/java/com/dfsek/terra/config/lang/LangUtil.java new file mode 100644 index 000000000..d93d5bece --- /dev/null +++ b/src/main/java/com/dfsek/terra/config/lang/LangUtil.java @@ -0,0 +1,24 @@ +package com.dfsek.terra.config.lang; + +import com.dfsek.terra.Terra; +import org.bukkit.configuration.InvalidConfigurationException; +import org.bukkit.plugin.java.JavaPlugin; + +import java.io.File; +import java.io.IOException; +import java.util.logging.Logger; + +public final class LangUtil { + private static Language language; + private static Logger logger; + public static void load(String langID, JavaPlugin main) { + logger = main.getLogger(); + try { + language = new Language(new File(Terra.getInstance().getDataFolder(), "lang" + File.separator + langID + ".yml")); + } catch(InvalidConfigurationException | IOException e) { + logger.severe("Unable to load language: " + langID); + e.printStackTrace(); + logger.severe("Double-check your configuration before reporting this to Terra!"); + } + } +} diff --git a/src/main/java/com/dfsek/terra/config/lang/Language.java b/src/main/java/com/dfsek/terra/config/lang/Language.java new file mode 100644 index 000000000..7678b0f6a --- /dev/null +++ b/src/main/java/com/dfsek/terra/config/lang/Language.java @@ -0,0 +1,29 @@ +package com.dfsek.terra.config.lang; + +import org.bukkit.configuration.InvalidConfigurationException; +import org.bukkit.configuration.file.YamlConfiguration; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +public class Language extends YamlConfiguration { + private final Map messages; + public Language(File file) throws IOException, InvalidConfigurationException { + load(file); + messages = new HashMap<>(); + messages.put("enable", new MultiLineMessage(getStringList("enable"))); + messages.put("disable", new MultiLineMessage(getStringList("disable"))); + } + @Override + public void load(@NotNull File file) throws IOException, InvalidConfigurationException { + super.load(file); + } + public Message getMessage(String id) { + Message temp = messages.get(id); + if(temp == null || temp.isEmpty()) return new SingleLineMessage(id + ":translation_undefined"); + return temp; + } +} diff --git a/src/main/java/com/dfsek/terra/config/lang/Message.java b/src/main/java/com/dfsek/terra/config/lang/Message.java new file mode 100644 index 000000000..b33b51407 --- /dev/null +++ b/src/main/java/com/dfsek/terra/config/lang/Message.java @@ -0,0 +1,12 @@ +package com.dfsek.terra.config.lang; + +import org.bukkit.command.CommandSender; + +import java.util.logging.Level; +import java.util.logging.Logger; + +public interface Message { + void log(Logger logger, Level level); + void send(CommandSender sender); + boolean isEmpty(); +} diff --git a/src/main/java/com/dfsek/terra/config/lang/MultiLineMessage.java b/src/main/java/com/dfsek/terra/config/lang/MultiLineMessage.java new file mode 100644 index 000000000..fa8a068e7 --- /dev/null +++ b/src/main/java/com/dfsek/terra/config/lang/MultiLineMessage.java @@ -0,0 +1,32 @@ +package com.dfsek.terra.config.lang; + +import org.bukkit.command.CommandSender; + +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class MultiLineMessage implements Message { + private final List message; + public MultiLineMessage(List message) { + this.message = message; + } + @Override + public void log(Logger logger, Level level) { + for(String line: message) { + logger.log(level, line); + } + } + + @Override + public void send(CommandSender sender) { + for(String line: message) { + sender.sendMessage(line); + } + } + + @Override + public boolean isEmpty() { + return message == null || message.isEmpty(); + } +} diff --git a/src/main/java/com/dfsek/terra/config/lang/SingleLineMessage.java b/src/main/java/com/dfsek/terra/config/lang/SingleLineMessage.java new file mode 100644 index 000000000..096c4c07c --- /dev/null +++ b/src/main/java/com/dfsek/terra/config/lang/SingleLineMessage.java @@ -0,0 +1,27 @@ +package com.dfsek.terra.config.lang; + +import org.bukkit.command.CommandSender; + +import java.util.logging.Level; +import java.util.logging.Logger; + +public class SingleLineMessage implements Message { + private final String message; + public SingleLineMessage(String message) { + this.message = message; + } + @Override + public void log(Logger logger, Level level) { + logger.log(level, message); + } + + @Override + public void send(CommandSender sender) { + sender.sendMessage(message); + } + + @Override + public boolean isEmpty() { + return message == null || message.equals(""); + } +} diff --git a/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java b/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java index be3cbf386..0e2dd82a1 100644 --- a/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java +++ b/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java @@ -14,6 +14,7 @@ import com.dfsek.terra.population.SnowPopulator; import com.dfsek.terra.population.StructurePopulator; import com.dfsek.terra.population.TreePopulator; import com.dfsek.terra.structure.StructureSpawnRequirement; +import com.dfsek.terra.util.DataUtil; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.World; @@ -70,10 +71,11 @@ public class TerraChunkGenerator extends GaeaChunkGenerator { int paletteLevel = 0; int cx = xOrig + x; int cz = zOrig + z; + Biome orig = getBiomeGrid(world).getBiome(xOrig+x, zOrig+z, GenerationPhase.BASE); Biome b = getBiomeGrid(world).getBiome(xOrig+x, zOrig+z, GenerationPhase.PALETTE_APPLY); BiomeConfig c = config.getBiome((UserDefinedBiome) b); BiomeSlabConfig slab = c.getSlabs(); - int sea = c.getOcean().getSeaLevel(); + int sea = config.getBiome((UserDefinedBiome) orig).getOcean().getSeaLevel(); Palette seaPalette = c.getOcean().getOcean(); for(int y = world.getMaxHeight()-1; y >= 0; y--) { if(super.getInterpolatedNoise(x, y, z) > 0) { diff --git a/src/main/java/com/dfsek/terra/generation/UserDefinedGenerator.java b/src/main/java/com/dfsek/terra/generation/UserDefinedGenerator.java index 9ff6770db..d152fd19c 100644 --- a/src/main/java/com/dfsek/terra/generation/UserDefinedGenerator.java +++ b/src/main/java/com/dfsek/terra/generation/UserDefinedGenerator.java @@ -2,6 +2,7 @@ package com.dfsek.terra.generation; import com.dfsek.terra.math.NoiseFunction2; import com.dfsek.terra.math.NoiseFunction3; +import com.dfsek.terra.util.DataUtil; import org.bukkit.World; import org.bukkit.block.data.BlockData; import org.polydev.gaea.biome.Generator; diff --git a/src/main/java/com/dfsek/terra/population/SnowPopulator.java b/src/main/java/com/dfsek/terra/population/SnowPopulator.java index 257304dec..793041af1 100644 --- a/src/main/java/com/dfsek/terra/population/SnowPopulator.java +++ b/src/main/java/com/dfsek/terra/population/SnowPopulator.java @@ -4,7 +4,7 @@ import com.dfsek.terra.TerraWorld; import com.dfsek.terra.biome.TerraBiomeGrid; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.base.ConfigUtil; -import com.dfsek.terra.generation.DataUtil; +import com.dfsek.terra.util.DataUtil; import org.bukkit.Bukkit; import org.bukkit.Chunk; import org.bukkit.Material; @@ -15,14 +15,12 @@ import org.jetbrains.annotations.NotNull; import org.polydev.gaea.generation.GenerationPhase; import org.polydev.gaea.population.GaeaBlockPopulator; -import java.util.ArrayList; import java.util.HashSet; import java.util.Random; import java.util.Set; public class SnowPopulator extends GaeaBlockPopulator { private static final Set blacklistSpawn = new HashSet<>(); - private static final BlockData snow = Material.SNOW.createBlockData(); static { for(Material m : Material.values()) { String name = m.toString().toLowerCase(); @@ -35,7 +33,8 @@ public class SnowPopulator extends GaeaBlockPopulator { || name.contains("door") || name.contains("repeater") || name.equals("lily_pad") - || name.equals("snow")) blacklistSpawn.add(m); + || name.equals("snow") + || name.equals("pane")) blacklistSpawn.add(m); } blacklistSpawn.add(Material.END_STONE); if(ConfigUtil.debug) diff --git a/src/main/java/com/dfsek/terra/generation/DataUtil.java b/src/main/java/com/dfsek/terra/util/DataUtil.java similarity index 94% rename from src/main/java/com/dfsek/terra/generation/DataUtil.java rename to src/main/java/com/dfsek/terra/util/DataUtil.java index bbe2103e6..05c617379 100644 --- a/src/main/java/com/dfsek/terra/generation/DataUtil.java +++ b/src/main/java/com/dfsek/terra/util/DataUtil.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.generation; +package com.dfsek.terra.util; import org.bukkit.Material; import org.bukkit.block.data.BlockData; diff --git a/src/main/resources/lang/en_us.yml b/src/main/resources/lang/en_us.yml new file mode 100644 index 000000000..ef8d3d57a --- /dev/null +++ b/src/main/resources/lang/en_us.yml @@ -0,0 +1,9 @@ +enable: + - "If you like Terra, please consider supporting the project on Patreon!" + - "You'll gain access to experimental features before they are released!" + - "Support the project here: https://www.patreon.com/dfsek" +disable: + - "Thank you for using Terra!" +command: + player-only: "This command is for players only!" + terra-world: "This command must be executed in a Terra world!" \ No newline at end of file