From 548cd8a30a6287cb7f15c86d30e61290561bba78 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 10 Nov 2020 00:33:54 -0700 Subject: [PATCH] Allow use of Tags in block ID lists --- .../dfsek/terra/config/base/ConfigUtil.java | 18 +++++- .../java/com/dfsek/terra/util/TagUtil.java | 55 +++++++++++++++++++ .../default-config/biomes/desert.yml | 3 +- .../resources/default-config/biomes/mesa.yml | 3 +- .../ores/deposits/andesite_pocket.yml | 2 +- .../ores/deposits/diorite_pocket.yml | 2 +- .../ores/deposits/dirt_pocket.yml | 2 +- .../ores/deposits/granite_pocket.yml | 2 +- .../ores/deposits/gravel_pocket.yml | 2 +- .../default-config/ores/minerals/coal.yml | 2 +- .../default-config/ores/minerals/diamond.yml | 2 +- .../default-config/ores/minerals/gold.yml | 2 +- .../default-config/ores/minerals/iron.yml | 2 +- .../default-config/ores/minerals/lapis.yml | 2 +- .../default-config/ores/minerals/redstone.yml | 2 +- src/main/resources/plugin.yml | 2 +- 16 files changed, 84 insertions(+), 19 deletions(-) create mode 100644 src/main/java/com/dfsek/terra/util/TagUtil.java diff --git a/src/main/java/com/dfsek/terra/config/base/ConfigUtil.java b/src/main/java/com/dfsek/terra/config/base/ConfigUtil.java index 04f0687fc..2d95f4be9 100644 --- a/src/main/java/com/dfsek/terra/config/base/ConfigUtil.java +++ b/src/main/java/com/dfsek/terra/config/base/ConfigUtil.java @@ -6,6 +6,7 @@ import com.dfsek.terra.TerraWorld; import com.dfsek.terra.biome.failsafe.FailType; import com.dfsek.terra.config.exception.ConfigException; import com.dfsek.terra.config.lang.LangUtil; +import com.dfsek.terra.util.TagUtil; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.configuration.InvalidConfigurationException; @@ -73,9 +74,20 @@ public final class ConfigUtil { Set bl = new HashSet<>(); for(String s : list) { try { - if(bl.contains(Bukkit.createBlockData(s).getMaterial())) - Bukkit.getLogger().warning("Duplicate material in " + phase + " list: " + s); - bl.add(Bukkit.createBlockData(s).getMaterial()); + if(s.startsWith("#")) { + Debug.info("Loading Tag " + s); + Set tag = TagUtil.getTag(s.substring(1)); + for(Material m : tag) { + if(bl.contains(m)) { + Bukkit.getLogger().warning("Duplicate material in " + phase + " list: " + m); // Check for duplicates in this tag + } + } + bl.addAll(tag); + } else { + if(bl.contains(Bukkit.createBlockData(s).getMaterial())) + Bukkit.getLogger().warning("Duplicate material in " + phase + " list: " + s); + bl.add(Bukkit.createBlockData(s).getMaterial()); + } } catch(NullPointerException | IllegalArgumentException e) { throw new ConfigException("Could not load BlockData data for \"" + s + "\"", id); } diff --git a/src/main/java/com/dfsek/terra/util/TagUtil.java b/src/main/java/com/dfsek/terra/util/TagUtil.java new file mode 100644 index 000000000..41298ec88 --- /dev/null +++ b/src/main/java/com/dfsek/terra/util/TagUtil.java @@ -0,0 +1,55 @@ +package com.dfsek.terra.util; + +import com.dfsek.terra.Debug; +import org.bukkit.Material; +import org.bukkit.Tag; +import org.jetbrains.annotations.NotNull; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +@SuppressWarnings("unchecked") +public class TagUtil { + private static final Map> tagMap; + + static { + Debug.info("Loading tags..."); + tagMap = new HashMap<>(); + + Field[] tags = Tag.class.getFields(); // Add Bukkit tags + for(Field field : tags) { + if(Modifier.isStatic(field.getModifiers())) { + try { + Tag tag = (Tag) field.get(new Object()); + tagMap.put(tag.getKey().toString(), tag.getValues()); + Debug.info("Loaded tag: #" + tag.getKey().toString()); + } catch(IllegalAccessException e) { + e.printStackTrace(); + } catch(ClassCastException ignore) { + } + } + } + putCustomSet("minecraft:base_stone_nether", Material.NETHERRACK, Material.BASALT, Material.BLACKSTONE); + putCustomSet("minecraft:base_stone_overworld", Material.STONE, Material.GRANITE, Material.DIORITE, Material.ANDESITE); + } + + private static Set getSet(Material... materials) { + return Stream.of(materials).collect(Collectors.toSet()); + } + + private static void putCustomSet(String key, Material... materials) { + tagMap.put(key, getSet(materials)); + Debug.info("Loaded tag: #" + key); + } + + @NotNull + public static Set getTag(String tag) { + return Objects.requireNonNull(tagMap.get(tag)); + } +} diff --git a/src/main/resources/default-config/biomes/desert.yml b/src/main/resources/default-config/biomes/desert.yml index 8418c9d21..7b66c880a 100644 --- a/src/main/resources/default-config/biomes/desert.yml +++ b/src/main/resources/default-config/biomes/desert.yml @@ -26,8 +26,7 @@ flora: erodible: true trees: - chance: 100 - density: 1 + density: 7 items: CACTUS: weight: 1 diff --git a/src/main/resources/default-config/biomes/mesa.yml b/src/main/resources/default-config/biomes/mesa.yml index 1832099f1..7d0b15126 100644 --- a/src/main/resources/default-config/biomes/mesa.yml +++ b/src/main/resources/default-config/biomes/mesa.yml @@ -49,8 +49,7 @@ slabs: - "minecraft:red_sand": "BLOCK:minecraft:red_sandstone_stairs" trees: - chance: 100 - density: 1 + density: 7 items: CACTUS: weight: 1 diff --git a/src/main/resources/default-config/ores/deposits/andesite_pocket.yml b/src/main/resources/default-config/ores/deposits/andesite_pocket.yml index 612b7b2fe..2883cf899 100644 --- a/src/main/resources/default-config/ores/deposits/andesite_pocket.yml +++ b/src/main/resources/default-config/ores/deposits/andesite_pocket.yml @@ -6,4 +6,4 @@ deform: 0.75 deform-frequency: 0.1 id: "ANDESITE" replace: - - "minecraft:stone" \ No newline at end of file + - "#minecraft:base_stone_overworld" \ No newline at end of file diff --git a/src/main/resources/default-config/ores/deposits/diorite_pocket.yml b/src/main/resources/default-config/ores/deposits/diorite_pocket.yml index 65e15d323..f7c8ed7f5 100644 --- a/src/main/resources/default-config/ores/deposits/diorite_pocket.yml +++ b/src/main/resources/default-config/ores/deposits/diorite_pocket.yml @@ -6,4 +6,4 @@ deform: 0.75 deform-frequency: 0.1 id: "DIORITE" replace: - - "minecraft:stone" \ No newline at end of file + - "#minecraft:base_stone_overworld" \ No newline at end of file diff --git a/src/main/resources/default-config/ores/deposits/dirt_pocket.yml b/src/main/resources/default-config/ores/deposits/dirt_pocket.yml index 76312b589..d16b87088 100644 --- a/src/main/resources/default-config/ores/deposits/dirt_pocket.yml +++ b/src/main/resources/default-config/ores/deposits/dirt_pocket.yml @@ -6,4 +6,4 @@ deform: 0.75 deform-frequency: 0.1 id: "DIRT" replace: - - "minecraft:stone" \ No newline at end of file + - "#minecraft:base_stone_overworld" \ No newline at end of file diff --git a/src/main/resources/default-config/ores/deposits/granite_pocket.yml b/src/main/resources/default-config/ores/deposits/granite_pocket.yml index d50fe47af..e03e635d4 100644 --- a/src/main/resources/default-config/ores/deposits/granite_pocket.yml +++ b/src/main/resources/default-config/ores/deposits/granite_pocket.yml @@ -6,4 +6,4 @@ deform: 0.75 deform-frequency: 0.1 id: "GRANITE" replace: - - "minecraft:stone" \ No newline at end of file + - "#minecraft:base_stone_overworld" \ No newline at end of file diff --git a/src/main/resources/default-config/ores/deposits/gravel_pocket.yml b/src/main/resources/default-config/ores/deposits/gravel_pocket.yml index dd74170bd..05f1cd595 100644 --- a/src/main/resources/default-config/ores/deposits/gravel_pocket.yml +++ b/src/main/resources/default-config/ores/deposits/gravel_pocket.yml @@ -6,4 +6,4 @@ deform: 0.75 deform-frequency: 0.1 id: "GRAVEL" replace: - - "minecraft:stone" \ No newline at end of file + - "#minecraft:base_stone_overworld" \ No newline at end of file diff --git a/src/main/resources/default-config/ores/minerals/coal.yml b/src/main/resources/default-config/ores/minerals/coal.yml index 8a3e7a63c..0254a37a4 100644 --- a/src/main/resources/default-config/ores/minerals/coal.yml +++ b/src/main/resources/default-config/ores/minerals/coal.yml @@ -6,4 +6,4 @@ deform: 0.75 deform-frequency: 0.2 id: "COAL_ORE" replace: - - "minecraft:stone" \ No newline at end of file + - "#minecraft:base_stone_overworld" \ No newline at end of file diff --git a/src/main/resources/default-config/ores/minerals/diamond.yml b/src/main/resources/default-config/ores/minerals/diamond.yml index 2b1f32a56..ed7b3a78c 100644 --- a/src/main/resources/default-config/ores/minerals/diamond.yml +++ b/src/main/resources/default-config/ores/minerals/diamond.yml @@ -6,4 +6,4 @@ deform: 0.75 deform-frequency: 0.2 id: "DIAMOND_ORE" replace: - - "minecraft:stone" \ No newline at end of file + - "#minecraft:base_stone_overworld" \ No newline at end of file diff --git a/src/main/resources/default-config/ores/minerals/gold.yml b/src/main/resources/default-config/ores/minerals/gold.yml index fc5954eb7..ade0f682a 100644 --- a/src/main/resources/default-config/ores/minerals/gold.yml +++ b/src/main/resources/default-config/ores/minerals/gold.yml @@ -6,4 +6,4 @@ deform: 0.75 deform-frequency: 0.2 id: "GOLD_ORE" replace: - - "minecraft:stone" \ No newline at end of file + - "#minecraft:base_stone_overworld" \ No newline at end of file diff --git a/src/main/resources/default-config/ores/minerals/iron.yml b/src/main/resources/default-config/ores/minerals/iron.yml index 0b2cf36a3..78ed86db9 100644 --- a/src/main/resources/default-config/ores/minerals/iron.yml +++ b/src/main/resources/default-config/ores/minerals/iron.yml @@ -6,4 +6,4 @@ deform: 0.75 deform-frequency: 0.2 id: "IRON_ORE" replace: - - "minecraft:stone" \ No newline at end of file + - "#minecraft:base_stone_overworld" \ No newline at end of file diff --git a/src/main/resources/default-config/ores/minerals/lapis.yml b/src/main/resources/default-config/ores/minerals/lapis.yml index 4c626b72a..ba36d2d0a 100644 --- a/src/main/resources/default-config/ores/minerals/lapis.yml +++ b/src/main/resources/default-config/ores/minerals/lapis.yml @@ -6,4 +6,4 @@ deform: 0.75 deform-frequency: 0.2 id: "LAPIS_ORE" replace: - - "minecraft:stone" \ No newline at end of file + - "#minecraft:base_stone_overworld" \ No newline at end of file diff --git a/src/main/resources/default-config/ores/minerals/redstone.yml b/src/main/resources/default-config/ores/minerals/redstone.yml index dcf76b6a6..2f23e595f 100644 --- a/src/main/resources/default-config/ores/minerals/redstone.yml +++ b/src/main/resources/default-config/ores/minerals/redstone.yml @@ -6,4 +6,4 @@ deform: 0.75 deform-frequency: 0.2 id: "REDSTONE_ORE" replace: - - "minecraft:stone" \ No newline at end of file + - "#minecraft:base_stone_overworld" \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index bd6168ce1..5653440be 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,7 +1,7 @@ name: "Terra" depend: [ "Gaea" ] main: "com.dfsek.terra.Terra" -version: "1.2.0-BETA" +version: "1.2.1-BETA" load: "STARTUP" api-version: "1.16" softdepend: [ "WorldEdit" ]