From 8045c7755886ff925773c97bb9534b770b6a9253 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 23 Sep 2020 14:26:01 -0700 Subject: [PATCH] Fix more biome abstraction issues, add more informative crash messages. --- .../com/dfsek/terra/biome/TerraBiomeGrid.java | 30 +++++++++++++---- .../com/dfsek/terra/config/ConfigLoader.java | 2 +- .../com/dfsek/terra/config/ConfigUtil.java | 7 ++++ .../com/dfsek/terra/config/WorldConfig.java | 22 ++++++------- .../config/genconfig/AbstractBiomeConfig.java | 8 ++--- .../terra/config/genconfig/BiomeConfig.java | 32 +++++++++---------- src/main/resources/config.yml | 1 + 7 files changed, 64 insertions(+), 38 deletions(-) diff --git a/src/main/java/com/dfsek/terra/biome/TerraBiomeGrid.java b/src/main/java/com/dfsek/terra/biome/TerraBiomeGrid.java index 706aaeb94..3894dddee 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.ConfigUtil; import com.dfsek.terra.config.WorldConfig; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; import org.polydev.gaea.biome.Biome; @@ -11,25 +12,42 @@ import java.util.HashMap; import java.util.Map; public class TerraBiomeGrid extends BiomeGrid { + private static int failNum = 0; private static final Map grids = new HashMap<>(); private final World w; - public TerraBiomeGrid(World w) { - super(w, WorldConfig.fromWorld(w).freq1, WorldConfig.fromWorld(w).freq2); + + + private TerraBiomeGrid(World w, float freq1, float freq2, boolean blank) { + super(w, freq1, freq2); this.w = w; - grids.put(w, this); + if(!blank) grids.put(w, this); } public static TerraBiomeGrid fromWorld(World w) { - if(grids.containsKey(w)) return grids.get(w); - else return new TerraBiomeGrid(w); + try { + if(grids.containsKey(w)) return grids.get(w); + else return new TerraBiomeGrid(w, WorldConfig.fromWorld(w).freq1, WorldConfig.fromWorld(w).freq2, false); + } catch(NullPointerException e) { + if(ConfigUtil.debug) e.printStackTrace(); + if(failNum % 256 == 0) Bukkit.getLogger().severe("[Terra] A severe configuration error has prevented Terra from properly generating terrain. Please check your configuration for errors. Any config errors will have been reported above."); + failNum++; + return new TerraBiomeGrid(w, 0.001f, 0.002f, true); + } } @Override public Biome getBiome(int x, int z) { - return BiomeZone.fromWorld(w).getGrid(x, z).getBiome(x, z); + try { + return BiomeZone.fromWorld(w).getGrid(x, z).getBiome(x, z); + } catch(NullPointerException e) { + if(ConfigUtil.debug) e.printStackTrace(); + if(failNum % 256 == 0) Bukkit.getLogger().severe("[Terra] A severe configuration error has prevented Terra from properly generating terrain at coordinates: " + x + ", " + z + ". Please check your configuration for errors. Any config errors will have been reported above."); + failNum++; + return null; + } } @Override diff --git a/src/main/java/com/dfsek/terra/config/ConfigLoader.java b/src/main/java/com/dfsek/terra/config/ConfigLoader.java index 2b9b7700a..db641b9f6 100644 --- a/src/main/java/com/dfsek/terra/config/ConfigLoader.java +++ b/src/main/java/com/dfsek/terra/config/ConfigLoader.java @@ -39,7 +39,7 @@ public class ConfigLoader { } catch(IllegalAccessException | InstantiationException | NoSuchMethodException e) { e.printStackTrace(); } catch(IllegalArgumentException | InvocationTargetException e) { - e.printStackTrace(); + if(ConfigUtil.debug) e.printStackTrace(); main.getLogger().severe("Configuration error for Terra object. File: " + path.toString()); main.getLogger().severe(((e instanceof InvocationTargetException) ? "INVOCATION: " + e.getCause().getMessage() : e.getMessage())); main.getLogger().severe("Correct this before proceeding!"); diff --git a/src/main/java/com/dfsek/terra/config/ConfigUtil.java b/src/main/java/com/dfsek/terra/config/ConfigUtil.java index b4fd4953e..924e4898a 100644 --- a/src/main/java/com/dfsek/terra/config/ConfigUtil.java +++ b/src/main/java/com/dfsek/terra/config/ConfigUtil.java @@ -9,6 +9,7 @@ import com.dfsek.terra.config.genconfig.CarverConfig; import com.dfsek.terra.config.genconfig.FaunaConfig; import com.dfsek.terra.config.genconfig.OreConfig; import com.dfsek.terra.config.genconfig.PaletteConfig; +import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.plugin.java.JavaPlugin; import java.io.File; @@ -17,7 +18,13 @@ import java.util.logging.Logger; import java.util.stream.Collectors; public class ConfigUtil { + public static boolean debug; public static void loadConfig(JavaPlugin main) { + main.saveDefaultConfig(); + FileConfiguration config = main.getConfig(); + + debug = config.getBoolean("debug", false); + Logger logger = main.getLogger(); logger.info("Loading config values"); diff --git a/src/main/java/com/dfsek/terra/config/WorldConfig.java b/src/main/java/com/dfsek/terra/config/WorldConfig.java index cd12d35c2..16fb0ff26 100644 --- a/src/main/java/com/dfsek/terra/config/WorldConfig.java +++ b/src/main/java/com/dfsek/terra/config/WorldConfig.java @@ -105,13 +105,17 @@ public class WorldConfig { definedGrids = new UserDefinedGrid[biomeList.size()]; for(int i = 0; i < biomeList.size(); i++) { String partName = biomeList.get(i); - if(partName.startsWith("BIOME:")) { - UserDefinedBiome[][] temp = new UserDefinedBiome[1][1]; - UserDefinedBiome b = BiomeConfig.fromID(partName.substring(6)).getBiome(); - temp[0][0] = b; - definedGrids[i] = new UserDefinedGrid(w, freq1, freq2, temp); - main.getLogger().info("Loaded single-biome grid " + partName); - } else definedGrids[i] = BiomeGridConfig.getBiomeGrids().get(partName).getGrid(w); + try { + if(partName.startsWith("BIOME:")) { + UserDefinedBiome[][] temp = new UserDefinedBiome[1][1]; + UserDefinedBiome b = BiomeConfig.fromID(partName.substring(6)).getBiome(); + temp[0][0] = b; + definedGrids[i] = new UserDefinedGrid(w, freq1, freq2, temp); + main.getLogger().info("Loaded single-biome grid " + partName); + } else definedGrids[i] = BiomeGridConfig.getBiomeGrids().get(partName).getGrid(w); + } catch(NullPointerException e) { + Bukkit.getLogger().severe("No such BiomeGrid " + partName); + } } Bukkit.getLogger().info("Loaded " + biomeList.size() + " BiomeGrids from list."); @@ -121,10 +125,6 @@ public class WorldConfig { main.getLogger().severe("Unable to load configuration for world " + w + "."); } - - - - main.getLogger().info("World load complete. Time elapsed: " + ((double) (System.nanoTime() - start)) / 1000000 + "ms"); } } diff --git a/src/main/java/com/dfsek/terra/config/genconfig/AbstractBiomeConfig.java b/src/main/java/com/dfsek/terra/config/genconfig/AbstractBiomeConfig.java index ca43cb774..6231a702c 100644 --- a/src/main/java/com/dfsek/terra/config/genconfig/AbstractBiomeConfig.java +++ b/src/main/java/com/dfsek/terra/config/genconfig/AbstractBiomeConfig.java @@ -31,9 +31,9 @@ public class AbstractBiomeConfig extends TerraConfigObject { private Map carvers; private ProbabilityCollection fauna; private ProbabilityCollection trees; - private int faunaChance = 0; - private int treeChance = 0; - private int treeDensity = 0; + private int faunaChance; + private int treeChance; + private int treeDensity; private String equation; private TreeMap paletteMap; @@ -93,7 +93,7 @@ public class AbstractBiomeConfig extends TerraConfigObject { fauna = new ProbabilityCollection<>(); for(Map.Entry e : Objects.requireNonNull(getConfigurationSection("fauna")).getValues(false).entrySet()) { try { - Bukkit.getLogger().info("[Terra] Adding " + e.getKey() + " to astract biome's fauna list with weight " + e.getValue()); + Bukkit.getLogger().info("[Terra] Adding " + e.getKey() + " to abstract biome's fauna list with weight " + e.getValue()); fauna.add(FaunaType.valueOf(e.getKey()), (Integer) e.getValue()); } catch(IllegalArgumentException ex) { try { 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 1f881a312..3489ba401 100644 --- a/src/main/java/com/dfsek/terra/config/genconfig/BiomeConfig.java +++ b/src/main/java/com/dfsek/terra/config/genconfig/BiomeConfig.java @@ -125,10 +125,25 @@ public class BiomeConfig extends TerraConfigObject { } } else carvers = new HashMap<>(); + int faunaChance, treeChance, treeDensity; + + // Get various simple values using getOrDefault config methods. + try { + faunaChance = getInt("fauna-chance", Objects.requireNonNull(abstractBiome).getFaunaChance()); + treeChance = getInt("tree-chance", Objects.requireNonNull(abstractBiome).getTreeChance()); + treeDensity = getInt("tree-density", Objects.requireNonNull(abstractBiome).getTreeDensity()); + eq = getString("noise-equation", Objects.requireNonNull(abstractBiome).getEquation()); + } catch(NullPointerException e) { + faunaChance = getInt("fauna-chance", 0); + treeChance = getInt("tree-chance", 0); + treeDensity = getInt("tree-density", 0); + eq = getString("noise-equation", null); + } + // Check if fauna should be handled by super biome. if(extending && abstractBiome.getFauna() != null && !contains("fauna")) { fauna = abstractBiome.getFauna(); - Bukkit.getLogger().info("Using super fauna"); + Bukkit.getLogger().info("Using super fauna (" + fauna.size() + " entries, " + faunaChance + " % chance)"); } else if(contains("fauna")) { for(Map.Entry e : Objects.requireNonNull(getConfigurationSection("fauna")).getValues(false).entrySet()) { try { @@ -159,21 +174,6 @@ public class BiomeConfig extends TerraConfigObject { } } else trees = new ProbabilityCollection<>(); - int faunaChance, treeChance, treeDensity; - - // Get various simple values using getOrDefault config methods. - try { - faunaChance = getInt("fauna-chance", Objects.requireNonNull(abstractBiome).getFaunaChance()); - treeChance = getInt("tree-chance", Objects.requireNonNull(abstractBiome).getTreeChance()); - treeDensity = getInt("tree-density", Objects.requireNonNull(abstractBiome).getTreeDensity()); - eq = getString("noise-equation", Objects.requireNonNull(abstractBiome).getEquation()); - } catch(NullPointerException e) { - faunaChance = getInt("fauna-chance", 0); - treeChance = getInt("tree-chance", 0); - treeDensity = getInt("tree-density", 0); - eq = getString("noise-equation", null); - } - //Make sure equation is non-null if(eq == null) throw new InvalidConfigurationException("Noise equation must be specified in biome or super biome."); diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index e69de29bb..a7dc7b9af 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -0,0 +1 @@ +debug: false \ No newline at end of file