aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorsowgro <tpoke.ferrari@gmail.com>2024-08-02 17:51:28 -0400
committersowgro <tpoke.ferrari@gmail.com>2024-08-02 17:51:28 -0400
commitec6245a466e285ac479bb1c5f32ec9d9aeaf65ec (patch)
treedb9624658014916b991b83a152ff2d72c999f835 /src/main/java
parentd3c2467476f92ad3c5bcbe8fb5aa8b568c971518 (diff)
downloadTumble-ec6245a466e285ac479bb1c5f32ec9d9aeaf65ec.tar.gz
Tumble-ec6245a466e285ac479bb1c5f32ec9d9aeaf65ec.tar.bz2
Tumble-ec6245a466e285ac479bb1c5f32ec9d9aeaf65ec.zip
Add compact material weight notation for layers.yml
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/com/MylesAndMore/Tumble/Main.java10
-rw-r--r--src/main/java/com/MylesAndMore/Tumble/config/LayerManager.java114
2 files changed, 64 insertions, 60 deletions
diff --git a/src/main/java/com/MylesAndMore/Tumble/Main.java b/src/main/java/com/MylesAndMore/Tumble/Main.java
index b6fdb1f..7cf3628 100644
--- a/src/main/java/com/MylesAndMore/Tumble/Main.java
+++ b/src/main/java/com/MylesAndMore/Tumble/Main.java
@@ -9,8 +9,6 @@ import com.MylesAndMore.Tumble.config.LayerManager;
import com.MylesAndMore.Tumble.game.Arena;
import org.bstats.bukkit.Metrics;
-import org.bukkit.Bukkit;
-import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.plugin.java.JavaPlugin;
import java.util.Objects;
@@ -25,13 +23,7 @@ public class Main extends JavaPlugin {
LanguageManager.readConfig();
ConfigManager.readConfig();
ArenaManager.readConfig();
- try {
- LayerManager.readConfig();
- } catch (InvalidConfigurationException e) {
- this.getLogger().severe(e.getMessage());
- Bukkit.getServer().getPluginManager().disablePlugin(this);
- return;
- }
+ LayerManager.readConfig();
Objects.requireNonNull(this.getCommand("tumble")).setExecutor(new Tumble());
new Metrics(this, 16940);
diff --git a/src/main/java/com/MylesAndMore/Tumble/config/LayerManager.java b/src/main/java/com/MylesAndMore/Tumble/config/LayerManager.java
index 73b301f..f20df6e 100644
--- a/src/main/java/com/MylesAndMore/Tumble/config/LayerManager.java
+++ b/src/main/java/com/MylesAndMore/Tumble/config/LayerManager.java
@@ -2,14 +2,10 @@ package com.MylesAndMore.Tumble.config;
import com.MylesAndMore.Tumble.plugin.CustomConfig;
import org.bukkit.Material;
+import org.bukkit.configuration.Configuration;
import org.bukkit.configuration.ConfigurationSection;
-import org.bukkit.configuration.InvalidConfigurationException;
-import org.bukkit.configuration.file.FileConfiguration;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Random;
+import java.util.*;
import static com.MylesAndMore.Tumble.Main.plugin;
@@ -17,84 +13,100 @@ public class LayerManager {
public static List<List<Material>> layers = new ArrayList<>();
private static final CustomConfig layersYml = new CustomConfig("layers.yml");
- private static final FileConfiguration config = layersYml.getConfig();
+ private static final Configuration config = layersYml.getConfig();
+ private static final Configuration defaultConfig = Objects.requireNonNull(config.getDefaults());
+ private static int layerCount = 0;
/**
* Read layers from layers.yml and populate this.layers
*/
- public static void readConfig() throws InvalidConfigurationException {
+ public static void readConfig() {
layersYml.saveDefaultConfig();
- ConfigurationSection layersSection = config.getConfigurationSection("layers");
- if (layersSection == null) {
- throw new InvalidConfigurationException("layers.yml is missing section 'layers'");
+ readLayers(config.getConfigurationSection("layers"));
+ if (layers.isEmpty()) {
+ plugin.getLogger().warning("layers.yml: No layers were found, using defaults");
+ readLayers(defaultConfig.getConfigurationSection("layers"));
}
- for (String layerPath : layersSection.getKeys(false)) {
- List<Material> layer = readLayer(layerPath);
+
+ // Don't use layers.size() because it includes duplicates for weighted layers
+ plugin.getLogger().info("layers.yml: Loaded " + layerCount + (layerCount == 1 ? " layer" : " layers"));
+ }
+
+ public static void readLayers(ConfigurationSection section) {
+
+ if (section == null) {
+ plugin.getLogger().warning("layers.yml is missing section 'layers', using defaults");
+ return;
+ }
+
+ for (String layerPath : section.getKeys(false)) {
+ ConfigurationSection layerSection = section.getConfigurationSection(layerPath);
+ if (layerSection == null) {
+ plugin.getLogger().warning("layers.yml: Layer '" + layerPath + "' is null");
+ continue;
+ }
+ List<Material> layer = readLayer(layerSection);
if (layer == null) {
plugin.getLogger().warning("layers.yml: Failed to load layer '" + layerPath + "'");
- } else {
- int weight = getLayerWeight(layerPath);
- for (int i = 0; i < weight; i++) {
- layers.add(layer);
- }
+ continue;
}
- }
- if (layers.isEmpty()) {
- throw new InvalidConfigurationException("No layers were found in layers.yml");
+ int weight = layerSection.getInt("layers." + layerPath + ".weight", 1);
+ layerCount++;
+ for (int i = 0; i < weight; i++) {
+ layers.add(layer);
+ }
}
- int numLayers = layersSection.getKeys(false).size(); // Don't use layers.size() because it includes duplicates for weighted layers
- plugin.getLogger().info("layers.yml: Loaded " + numLayers + (numLayers > 1 ? " layers" : " layer"));
}
/**
* Read the list of materials for a layer.
- * @param path The path of the layer in the config
+ * @param section The path of the layer in the config
* @return The list of materials for the layer to be composed of
*/
- public static List<Material> readLayer(String path) {
- List<Map<?, ?>> materialsSection = config.getMapList("layers." + path + ".materials");
- if (materialsSection.isEmpty()) {
- plugin.getLogger().warning("layers.yml: Layer '" + path + "' is missing section 'materials'");
+ public static List<Material> readLayer(ConfigurationSection section) {
+
+ List<String> materialsList = section.getStringList("materials");
+ if (materialsList.isEmpty()) {
+ plugin.getLogger().warning("layers.yml: Layer '" + section.getCurrentPath() + "' is missing section 'materials'");
return null;
}
+
List<Material> materials = new ArrayList<>();
+ for (String s : materialsList) {
+ String[] sp = s.split(" ");
- for (Map<?, ?> materialMap : materialsSection) {
- String matName = (String)materialMap.get("material");
+ if (sp.length < 1) {
+ plugin.getLogger().warning("layers.yml: Invalid format in layer '" + section.getCurrentPath() + "'");
+ continue;
+ }
+ String matName = sp[0];
Material mat = Material.getMaterial(matName);
+ if (mat == null) {
+ plugin.getLogger().warning("layers.yml: Invalid material '" + matName + "' in layer '" + section.getCurrentPath() + "'");
+ continue;
+ }
- Object weightObj = materialMap.get("weight");
- int weight = 1;
- if (weightObj != null) {
- if (weightObj instanceof Integer) {
- weight = (Integer)weightObj;
- } else {
- plugin.getLogger().warning("layers.yml: Invalid weight in layer '" + path + "'");
- return null;
+ int matWeight;
+ if (sp.length < 2) {
+ matWeight = 1;
+ } else {
+ try {
+ matWeight = Integer.parseInt(sp[1]);
+ } catch (NumberFormatException e) {
+ plugin.getLogger().warning("layers.yml: Invalid weight '" + sp[1] + "' in layer '" + section.getCurrentPath() + "'");
+ matWeight = 1;
}
}
- if (mat == null) {
- plugin.getLogger().warning("layers.yml: Invalid material '" + matName + "' in layer '" + path + "'");
- return null;
- }
- if (weight < 1) {
- plugin.getLogger().warning("layers.yml: Invalid weight '" + weight + "' in layer '" + path + "'");
- return null;
- }
- for (int i = 0; i < weight; i++) {
+ for (int i = 0; i < matWeight; i++) {
materials.add(mat);
}
}
return materials;
}
- public static int getLayerWeight(String path) {
- return config.getInt("layers." + path + ".weight", 1);
- }
-
public static List<Material> getRandom() {
return layers.get(new Random().nextInt(layers.size()));
}