From b5efa7cd79c7cd94af2909506cdf4224b103ce4d Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 23 Sep 2020 02:47:43 -0700 Subject: [PATCH] Fix various biome abstraction issues --- .../java/com/dfsek/terra/biome/BiomeZone.java | 6 ++++-- .../com/dfsek/terra/biome/TerraBiomeGrid.java | 6 +++++- .../dfsek/terra/biome/UserDefinedBiome.java | 9 +++++++-- .../dfsek/terra/biome/UserDefinedGrid.java | 10 ---------- .../terra/carving/UserDefinedCarver.java | 3 +-- .../com/dfsek/terra/config/ConfigLoader.java | 6 ++++++ .../com/dfsek/terra/config/ConfigUtil.java | 4 ++++ .../com/dfsek/terra/config/WorldConfig.java | 3 ++- .../terra/config/genconfig/BiomeConfig.java | 20 +++++++++---------- .../config/genconfig/BiomeGridConfig.java | 2 +- 10 files changed, 40 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/dfsek/terra/biome/BiomeZone.java b/src/main/java/com/dfsek/terra/biome/BiomeZone.java index 84ec57aab..559aac3e2 100644 --- a/src/main/java/com/dfsek/terra/biome/BiomeZone.java +++ b/src/main/java/com/dfsek/terra/biome/BiomeZone.java @@ -15,7 +15,6 @@ import java.util.Objects; public class BiomeZone { private BiomeGrid[] grids; - private final World w; private final FastNoise noise; private static final Map zones = new HashMap<>(); @Nullable @@ -24,7 +23,6 @@ public class BiomeZone { private final ImageLoader.Channel channel; private BiomeZone(World w) { - this.w = w; this.noise = new FastNoise((int) w.getSeed()+2); this.noise.setNoiseType(FastNoise.NoiseType.SimplexFractal); this.noise.setFractalOctaves(4); @@ -57,4 +55,8 @@ public class BiomeZone { if(zones.containsKey(w)) return zones.get(w); else return new BiomeZone(w); } + + public static void invalidate() { + zones.clear(); + } } diff --git a/src/main/java/com/dfsek/terra/biome/TerraBiomeGrid.java b/src/main/java/com/dfsek/terra/biome/TerraBiomeGrid.java index 8beb7e936..706aaeb94 100644 --- a/src/main/java/com/dfsek/terra/biome/TerraBiomeGrid.java +++ b/src/main/java/com/dfsek/terra/biome/TerraBiomeGrid.java @@ -16,7 +16,7 @@ public class TerraBiomeGrid extends BiomeGrid { private final World w; public TerraBiomeGrid(World w) { - super(w, 1f/256, 1f/512); + super(w, WorldConfig.fromWorld(w).freq1, WorldConfig.fromWorld(w).freq2); this.w = w; grids.put(w, this); } @@ -37,6 +37,10 @@ public class TerraBiomeGrid extends BiomeGrid { return getBiome(l.getBlockX(), l.getBlockZ()); } + public static void invalidate() { + grids.clear(); + } + public UserDefinedGrid getGrid(int x, int z) { return (UserDefinedGrid) BiomeZone.fromWorld(w).getGrid(x, z); } diff --git a/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java b/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java index 178778d75..d4cd4f32f 100644 --- a/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java +++ b/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java @@ -11,13 +11,14 @@ public class UserDefinedBiome implements Biome { private final UserDefinedGenerator gen; private final UserDefinedDecorator decorator; private final org.bukkit.block.Biome vanilla; + private final String id; - public UserDefinedBiome(org.bukkit.block.Biome vanilla, UserDefinedDecorator dec, UserDefinedGenerator gen) { - + public UserDefinedBiome(org.bukkit.block.Biome vanilla, UserDefinedDecorator dec, UserDefinedGenerator gen, String id) { this.vanilla = vanilla; this.decorator = dec; this.gen = gen; + this.id = id; } /** @@ -59,4 +60,8 @@ public class UserDefinedBiome implements Biome { public Decorator getDecorator() { return decorator; } + + public String getID() { + return id; + } } diff --git a/src/main/java/com/dfsek/terra/biome/UserDefinedGrid.java b/src/main/java/com/dfsek/terra/biome/UserDefinedGrid.java index 4bd4f5ed0..3c69dc26f 100644 --- a/src/main/java/com/dfsek/terra/biome/UserDefinedGrid.java +++ b/src/main/java/com/dfsek/terra/biome/UserDefinedGrid.java @@ -14,16 +14,6 @@ public class UserDefinedGrid extends BiomeGrid { private final boolean fromImage; private final ImageLoader.Channel channelX; private final ImageLoader.Channel channelZ; - public UserDefinedGrid(World w, float freq1, float freq2, BiomeGridConfig config) { - super(w, freq1, freq2, config.getBiomeGrid().length, config.getBiomeGrid()[0].length); - super.setNormalType(NormalType.LOOKUP4096); - super.setGrid(config.getBiomeGrid()); - WorldConfig c = WorldConfig.fromWorld(w); - imageLoader = c.imageLoader; - fromImage = c.fromImage; - channelX = c.biomeXChannel; - channelZ = c.biomeZChannel; - } public UserDefinedGrid(World w, float freq1, float freq2, UserDefinedBiome[][] b) { super(w, freq1, freq2, b.length, b[0].length); super.setNormalType(NormalType.LOOKUP4096); diff --git a/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java b/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java index 5bb64df50..d3e19f4b8 100644 --- a/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java +++ b/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java @@ -36,8 +36,7 @@ public class UserDefinedCarver extends Carver { @Override public boolean isChunkCarved(World w, int chunkX, int chunkZ, Random random) { - UserDefinedBiome b = (UserDefinedBiome) TerraBiomeGrid.fromWorld(w).getBiome(chunkX << 4, chunkZ << 4); - return random.nextInt(100) < BiomeConfig.fromBiome(b).getCarverChance(this); + return random.nextInt(100) < BiomeConfig.fromBiome((UserDefinedBiome) TerraBiomeGrid.fromWorld(w).getBiome(chunkX << 4, chunkZ << 4)).getCarverChance(this); } private class UserDefinedWorm extends Worm { diff --git a/src/main/java/com/dfsek/terra/config/ConfigLoader.java b/src/main/java/com/dfsek/terra/config/ConfigLoader.java index da8528cbe..2b9b7700a 100644 --- a/src/main/java/com/dfsek/terra/config/ConfigLoader.java +++ b/src/main/java/com/dfsek/terra/config/ConfigLoader.java @@ -1,5 +1,6 @@ package com.dfsek.terra.config; +import org.bukkit.Bukkit; import org.bukkit.plugin.java.JavaPlugin; import org.polydev.gaea.commons.io.FilenameUtils; @@ -9,7 +10,9 @@ import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.nio.file.Files; import java.nio.file.Path; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.stream.Stream; @@ -22,6 +25,7 @@ public class ConfigLoader { public void load(JavaPlugin main, Class clazz) { File folder = new File(main.getDataFolder() + File.separator + "config" + File.separator + path); folder.mkdirs(); + List ids = new ArrayList<>(); try (Stream paths = Files.walk(folder.toPath())) { paths .filter(path -> FilenameUtils.wildcardMatch(path.toFile().getName(), "*.yml")) @@ -29,6 +33,8 @@ public class ConfigLoader { try { Constructor c = clazz.getConstructor(File.class); T o = c.newInstance(path.toFile()); + if(ids.contains(o.getID())) Bukkit.getLogger().severe("Duplicate ID found in file: " + path.toString()); + ids.add(o.getID()); main.getLogger().info("Loaded " + o.toString() + " from file " + path.toString()); } catch(IllegalAccessException | InstantiationException | NoSuchMethodException e) { e.printStackTrace(); diff --git a/src/main/java/com/dfsek/terra/config/ConfigUtil.java b/src/main/java/com/dfsek/terra/config/ConfigUtil.java index e8ee87653..b4fd4953e 100644 --- a/src/main/java/com/dfsek/terra/config/ConfigUtil.java +++ b/src/main/java/com/dfsek/terra/config/ConfigUtil.java @@ -1,5 +1,7 @@ package com.dfsek.terra.config; +import com.dfsek.terra.biome.BiomeZone; +import com.dfsek.terra.biome.TerraBiomeGrid; import com.dfsek.terra.config.genconfig.AbstractBiomeConfig; import com.dfsek.terra.config.genconfig.BiomeConfig; import com.dfsek.terra.config.genconfig.BiomeGridConfig; @@ -29,6 +31,8 @@ public class ConfigUtil { new ConfigLoader("abstract" + File.separator + "biomes").load(main, AbstractBiomeConfig.class); + TerraBiomeGrid.invalidate(); + BiomeZone.invalidate(); // Invalidate BiomeZone and BiomeGrid caches to prevent old instances from being accessed. new ConfigLoader("biomes").load(main, BiomeConfig.class); new ConfigLoader("grids").load(main, BiomeGridConfig.class); diff --git a/src/main/java/com/dfsek/terra/config/WorldConfig.java b/src/main/java/com/dfsek/terra/config/WorldConfig.java index 57ea899be..cd12d35c2 100644 --- a/src/main/java/com/dfsek/terra/config/WorldConfig.java +++ b/src/main/java/com/dfsek/terra/config/WorldConfig.java @@ -30,7 +30,7 @@ public class WorldConfig { public float freq2; public int seaLevel; public boolean fromImage; - public UserDefinedGrid[] definedGrids = new UserDefinedGrid[32]; + public UserDefinedGrid[] definedGrids; public ImageLoader.Channel biomeXChannel; public ImageLoader.Channel biomeZChannel; public ImageLoader.Channel zoneChannel; @@ -102,6 +102,7 @@ public class WorldConfig { // Load BiomeGrids from BiomeZone List biomeList = config.getStringList("grids"); + definedGrids = new UserDefinedGrid[biomeList.size()]; for(int i = 0; i < biomeList.size(); i++) { String partName = biomeList.get(i); if(partName.startsWith("BIOME:")) { diff --git a/src/main/java/com/dfsek/terra/config/genconfig/BiomeConfig.java b/src/main/java/com/dfsek/terra/config/genconfig/BiomeConfig.java index 822b6ea2e..1f881a312 100644 --- a/src/main/java/com/dfsek/terra/config/genconfig/BiomeConfig.java +++ b/src/main/java/com/dfsek/terra/config/genconfig/BiomeConfig.java @@ -188,14 +188,6 @@ public class BiomeConfig extends TerraConfigObject { throw new InvalidConfigurationException("Invalid Vanilla biome: " + getString("vanilla")); } - try { - // Get UserDefinedBiome instance representing this config. - this.biome = new UserDefinedBiome(vanillaBiome, dec, new UserDefinedGenerator(eq, Collections.emptyList(), paletteMap)); - } catch(ParseException e) { - e.printStackTrace(); - throw new IllegalArgumentException("Unable to parse noise equation!"); - } - // Check if ores should be handled by super biome. if(extending && abstractBiome.getOres() != null && !contains("ores")) { ores = abstractBiome.getOres(); @@ -212,8 +204,13 @@ public class BiomeConfig extends TerraConfigObject { oreHeights = new HashMap<>(); } - - + try { + // Get UserDefinedBiome instance representing this config. + this.biome = new UserDefinedBiome(vanillaBiome, dec, new UserDefinedGenerator(eq, Collections.emptyList(), paletteMap), biomeID); + } catch(ParseException e) { + e.printStackTrace(); + throw new IllegalArgumentException("Unable to parse noise equation!"); + } biomes.put(biomeID, this); } @@ -245,6 +242,9 @@ public class BiomeConfig extends TerraConfigObject { for(BiomeConfig biome : biomes.values()) { if(biome.getBiome().equals(b)) return biome; } + for(BiomeConfig biome : biomes.values()) { + Bukkit.getLogger().info(biome.getID() + ":" + biome.hashCode() + " : " + b.getID() + ":" + b.hashCode()); + } throw new IllegalArgumentException("No BiomeConfig for provided biome."); } diff --git a/src/main/java/com/dfsek/terra/config/genconfig/BiomeGridConfig.java b/src/main/java/com/dfsek/terra/config/genconfig/BiomeGridConfig.java index 04f19dde9..33badafdd 100644 --- a/src/main/java/com/dfsek/terra/config/genconfig/BiomeGridConfig.java +++ b/src/main/java/com/dfsek/terra/config/genconfig/BiomeGridConfig.java @@ -83,7 +83,7 @@ public class BiomeGridConfig extends TerraConfigObject { public UserDefinedGrid getGrid(World w) { WorldConfig c = WorldConfig.fromWorld(w); - return new UserDefinedGrid(w, c.freq1, c.freq2, this); + return new UserDefinedGrid(w, c.freq1, c.freq2, gridRaw); } @Override