From 7ee1d2c391ffefde7d9fe8614f2c2f7b4edf0757 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 11 Dec 2020 00:11:37 -0700 Subject: [PATCH] Predefined Flora --- .../dfsek/terra/api/gaea/world/FloraType.java | 88 ------------------- .../dfsek/terra/config/base/ConfigPack.java | 32 ++++--- .../generation/items/flora/ConstantFlora.java | 52 +++++++++++ .../dfsek/terra/registry/FloraRegistry.java | 65 +++++++++++++- 4 files changed, 134 insertions(+), 103 deletions(-) delete mode 100644 src/main/java/com/dfsek/terra/api/gaea/world/FloraType.java create mode 100644 src/main/java/com/dfsek/terra/generation/items/flora/ConstantFlora.java diff --git a/src/main/java/com/dfsek/terra/api/gaea/world/FloraType.java b/src/main/java/com/dfsek/terra/api/gaea/world/FloraType.java deleted file mode 100644 index f13ed9f02..000000000 --- a/src/main/java/com/dfsek/terra/api/gaea/world/FloraType.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.dfsek.terra.api.gaea.world; - -import com.dfsek.terra.api.gaea.math.Range; -import com.dfsek.terra.api.gaea.util.GlueList; -import com.dfsek.terra.api.generic.world.Chunk; -import com.dfsek.terra.api.generic.world.block.Block; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.block.BlockFace; -import com.dfsek.terra.api.generic.world.vector.Location; -import com.dfsek.terra.api.implementations.bukkit.world.block.BukkitBlockData; -import com.google.common.collect.Sets; -import org.bukkit.Bukkit; -import org.bukkit.Material; - -import java.util.Arrays; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - -public enum FloraType implements Flora { - TALL_GRASS(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:tall_grass[half=lower]"), Bukkit.createBlockData("minecraft:tall_grass[half=upper]")), - TALL_FERN(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:large_fern[half=lower]"), Bukkit.createBlockData("minecraft:large_fern[half=upper]")), - SUNFLOWER(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:sunflower[half=lower]"), Bukkit.createBlockData("minecraft:sunflower[half=upper]")), - ROSE_BUSH(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:rose_bush[half=lower]"), Bukkit.createBlockData("minecraft:rose_bush[half=upper]")), - LILAC(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:lilac[half=lower]"), Bukkit.createBlockData("minecraft:lilac[half=upper]")), - PEONY(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:peony[half=lower]"), Bukkit.createBlockData("minecraft:peony[half=upper]")), - GRASS(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:grass")), - FERN(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:fern")), - AZURE_BLUET(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:azure_bluet")), - LILY_OF_THE_VALLEY(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:lily_of_the_valley")), - BLUE_ORCHID(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:blue_orchid")), - POPPY(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:poppy")), - DANDELION(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:dandelion")), - WITHER_ROSE(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:wither_rose")), - DEAD_BUSH(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL, Material.SAND, Material.RED_SAND, - Material.TERRACOTTA, Material.BLACK_TERRACOTTA, Material.BLUE_TERRACOTTA, Material.BROWN_TERRACOTTA, Material.CYAN_TERRACOTTA, Material.GRAY_TERRACOTTA, - Material.GREEN_TERRACOTTA, Material.LIGHT_BLUE_TERRACOTTA, Material.LIGHT_GRAY_TERRACOTTA, Material.LIME_TERRACOTTA, Material.MAGENTA_TERRACOTTA, - Material.ORANGE_TERRACOTTA, Material.PINK_TERRACOTTA, Material.PURPLE_TERRACOTTA, Material.RED_TERRACOTTA, Material.RED_TERRACOTTA, Material.WHITE_TERRACOTTA, - Material.YELLOW_TERRACOTTA), Bukkit.createBlockData("minecraft:dead_bush")), - RED_TULIP(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:red_tulip")), - ORANGE_TULIP(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:orange_tulip")), - WHITE_TULIP(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:white_tulip")), - PINK_TULIP(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:pink_tulip")), - OXEYE_DAISY(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:oxeye_daisy")), - ALLIUM(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:allium")), - CORNFLOWER(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:cornflower")), - LILY_PAD(Sets.newHashSet(Material.WATER), Bukkit.createBlockData("minecraft:lily_pad")), - RED_MUSHROOM(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL, Material.DIRT, Material.STONE, Material.NETHERRACK, Material.MYCELIUM), Bukkit.createBlockData("minecraft:red_mushroom")), - BROWN_MUSHROOM(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL, Material.DIRT, Material.STONE, Material.NETHERRACK, Material.MYCELIUM), Bukkit.createBlockData("minecraft:brown_mushroom")), - ; - - private final List data = new GlueList<>(); - - private final Set spawns; - - FloraType(Set validSpawns, org.bukkit.block.data.BlockData... type) { - data.addAll(Arrays.stream(type).map(BukkitBlockData::new).collect(Collectors.toList())); - this.spawns = validSpawns; - } - - @Override - public List getValidSpawnsAt(Chunk chunk, int x, int z, Range check) { - List blocks = new GlueList<>(); - for(int y : check) { - Block block = chunk.getBlock(x, y, z); - if(spawns.contains(block.getType()) && valid(block)) { - blocks.add(chunk.getBlock(x, y, z)); - } - } - return blocks; - } - - private boolean valid(Block block) { - for(int i = 1; i < data.size() + 1; i++) { - block = block.getRelative(BlockFace.UP); - if(!block.isEmpty()) return false; - } - return true; - } - - @Override - public boolean plant(Location l) { - for(int i = 1; i < data.size() + 1; i++) { - l.clone().add(0, i, 0).getBlock().setBlockData(data.get(i - 1), false); - } - 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 a26bfdd03..83637f11d 100644 --- a/src/main/java/com/dfsek/terra/config/base/ConfigPack.java +++ b/src/main/java/com/dfsek/terra/config/base/ConfigPack.java @@ -4,6 +4,8 @@ import com.dfsek.tectonic.abstraction.AbstractConfigLoader; import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; +import com.dfsek.tectonic.loading.TypeRegistry; +import com.dfsek.terra.api.LoaderRegistrar; import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.api.gaea.structures.loot.LootTable; import com.dfsek.terra.api.gaea.tree.Tree; @@ -74,14 +76,14 @@ import java.util.zip.ZipFile; /** * Represents a Terra configuration pack. */ -public class ConfigPack { +public class ConfigPack implements LoaderRegistrar { private final ConfigPackTemplate template = new ConfigPackTemplate(); private final BiomeRegistry biomeRegistry = new BiomeRegistry(); private final BiomeGridRegistry biomeGridRegistry = new BiomeGridRegistry(biomeRegistry); private final StructureRegistry structureRegistry = new StructureRegistry(); private final CarverRegistry carverRegistry = new CarverRegistry(); private final PaletteRegistry paletteRegistry = new PaletteRegistry(); - private final FloraRegistry floraRegistry = new FloraRegistry(); + private final FloraRegistry floraRegistry; private final OreRegistry oreRegistry = new OreRegistry(); private final TreeRegistry treeRegistry = new TreeRegistry(); @@ -91,19 +93,11 @@ public class ConfigPack { private final Map structureMap = new HashMap<>(); - { - abstractConfigLoader - .registerLoader(Palette.class, paletteRegistry) - .registerLoader(Biome.class, biomeRegistry) - .registerLoader(UserDefinedCarver.class, carverRegistry) - .registerLoader(Flora.class, floraRegistry) - .registerLoader(Ore.class, oreRegistry) - .registerLoader(Tree.class, treeRegistry) - .registerLoader(TerraStructure.class, structureRegistry); - } public ConfigPack(File folder, TerraPlugin main) throws ConfigException { long l = System.nanoTime(); + floraRegistry = new FloraRegistry(main); + register(abstractConfigLoader); main.register(selfLoader); main.register(abstractConfigLoader); @@ -121,6 +115,8 @@ public class ConfigPack { public ConfigPack(ZipFile file, TerraPlugin main) throws ConfigException { long l = System.nanoTime(); + floraRegistry = new FloraRegistry(main); + register(abstractConfigLoader); main.register(selfLoader); main.register(abstractConfigLoader); @@ -234,4 +230,16 @@ public class ConfigPack { public TerraStructure getStructureLocatable(StructureTypeEnum type) { return structureMap.get(type); } + + @Override + public void register(TypeRegistry registry) { + registry + .registerLoader(Palette.class, paletteRegistry) + .registerLoader(Biome.class, biomeRegistry) + .registerLoader(UserDefinedCarver.class, carverRegistry) + .registerLoader(Flora.class, floraRegistry) + .registerLoader(Ore.class, oreRegistry) + .registerLoader(Tree.class, treeRegistry) + .registerLoader(TerraStructure.class, structureRegistry); + } } diff --git a/src/main/java/com/dfsek/terra/generation/items/flora/ConstantFlora.java b/src/main/java/com/dfsek/terra/generation/items/flora/ConstantFlora.java new file mode 100644 index 000000000..a8c5d89e9 --- /dev/null +++ b/src/main/java/com/dfsek/terra/generation/items/flora/ConstantFlora.java @@ -0,0 +1,52 @@ +package com.dfsek.terra.generation.items.flora; + +import com.dfsek.terra.api.gaea.math.Range; +import com.dfsek.terra.api.gaea.util.GlueList; +import com.dfsek.terra.api.gaea.world.Flora; +import com.dfsek.terra.api.generic.world.Chunk; +import com.dfsek.terra.api.generic.world.block.Block; +import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.block.BlockFace; +import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.util.MaterialSet; + +import java.util.List; + +public class ConstantFlora implements Flora { + private final List data; + + private final MaterialSet spawns; + + public ConstantFlora(MaterialSet spawns, List data) { + this.data = data; + this.spawns = spawns; + } + + @Override + public List getValidSpawnsAt(Chunk chunk, int x, int z, Range check) { + List blocks = new GlueList<>(); + for(int y : check) { + Block block = chunk.getBlock(x, y, z); + if(spawns.contains(block.getType()) && valid(block)) { + blocks.add(chunk.getBlock(x, y, z)); + } + } + return blocks; + } + + private boolean valid(Block block) { + for(int i = 1; i < data.size() + 1; i++) { + block = block.getRelative(BlockFace.UP); + if(!block.isEmpty()) return false; + } + return true; + } + + @Override + public boolean plant(Location l) { + for(int i = 1; i < data.size() + 1; i++) { + l.clone().add(0, i, 0).getBlock().setBlockData(data.get(i - 1), false); + } + return true; + } +} diff --git a/src/main/java/com/dfsek/terra/registry/FloraRegistry.java b/src/main/java/com/dfsek/terra/registry/FloraRegistry.java index 4bd5fbbbd..64c09a11d 100644 --- a/src/main/java/com/dfsek/terra/registry/FloraRegistry.java +++ b/src/main/java/com/dfsek/terra/registry/FloraRegistry.java @@ -1,13 +1,72 @@ package com.dfsek.terra.registry; import com.dfsek.terra.api.gaea.world.Flora; -import com.dfsek.terra.api.gaea.world.FloraType; +import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.generation.items.flora.ConstantFlora; +import com.dfsek.terra.util.MaterialSet; + +import java.util.Arrays; +import java.util.Collections; public class FloraRegistry extends TerraRegistry { - public FloraRegistry() { - for(FloraType f : FloraType.values()) add(f.toString(), f); + private final TerraPlugin main; + + public FloraRegistry(TerraPlugin main) { + this.main = main; + MaterialSet grassy = MaterialSet.get(create("minecraft:grass_block"), create("minecraft:podzol")); + addItem("TALL_GRASS", new ConstantFlora(grassy, Arrays.asList(data("minecraft:tall_grass[half=lower]"), data("minecraft:tall_grass[half=upper]")))); + addItem("TALL_FERN", new ConstantFlora(grassy, Arrays.asList(data("minecraft:large_fern[half=lower]"), data("minecraft:large_fern[half=upper]")))); + addItem("SUNFLOWER", new ConstantFlora(grassy, Arrays.asList(data("minecraft:sunflower[half=lower]"), data("minecraft:sunflower[half=upper]")))); + addItem("ROSE_BUSH", new ConstantFlora(grassy, Arrays.asList(data("minecraft:rose_bush[half=lower]"), data("minecraft:rose_bush[half=upper]")))); + addItem("LILAC", new ConstantFlora(grassy, Arrays.asList(data("minecraft:lilac[half=lower]"), data("minecraft:lilac[half=upper]")))); + addItem("PEONY", new ConstantFlora(grassy, Arrays.asList(data("minecraft:peony[half=lower]"), data("minecraft:peony[half=upper]")))); + addItem("GRASS", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:grass")))); + addItem("FERN", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:fern")))); + addItem("AZURE_BLUET", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:azure_bluet")))); + addItem("LILY_OF_THE_VALLEY", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:lily_of_the_valley")))); + addItem("BLUE_ORCHID", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:blue_orchid")))); + addItem("POPPY", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:poppy")))); + addItem("DANDELION", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:dandelion")))); + addItem("WITHER_ROSE", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:wither_rose")))); + addItem("DEAD_BUSH", new ConstantFlora(MaterialSet.get(create("minecraft:terracotta"), create("minecraft:black_terracotta"), + create("minecraft:blue_terracotta"), create("minecraft:brown_terracotta"), create("minecraft:cyan_terracotta"), + create("minecraft:gray_terracotta"), create("minecraft:green_terracotta"), create("minecraft:light_blue_terracotta"), + create("minecraft:light_gray_terracotta"), create("minecraft:lime_terracotta"), create("minecraft:magenta_terracotta"), + create("minecraft:orange_terracotta"), create("minecraft:pink_terracotta"), create("minecraft:purple_terracotta"), + create("minecraft:red_terracotta"), create("minecraft:white_terracotta"), create("minecraft:yellow_terracotta"), + create("minecraft:red_sand"), create("minecraft:sand")), Collections.singletonList(data("minecraft:dead_bush")))); + addItem("RED_TULIP", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:red_tulip")))); + addItem("ORANGE_TULIP", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:orange_tulip")))); + addItem("WHITE_TULIP", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:white_tulip")))); + addItem("PINK_TULIP", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:pink_tulip")))); + addItem("OXEYE_DAISY", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:oxeye_daisy")))); + addItem("ALLIUM", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:allium")))); + addItem("CORNFLOWER", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:cornflower")))); + addItem("LILY_PAD", new ConstantFlora(MaterialSet.get(create("minecraft:water")), Collections.singletonList(data("minecraft:lily_pad")))); + MaterialSet mushroom = MaterialSet.get(create("minecraft:grass_block"), create("minecraft:stone"), create("minecraft:podzol"), create("minecraft:netherrack"), create("minecraft:mycelium")); + addItem("RED_MUSHROOM", new ConstantFlora(mushroom, Collections.singletonList(data("minecraft:red_mushroom")))); + addItem("BROWN_MUSHROOM", new ConstantFlora(mushroom, Collections.singletonList(data("minecraft:brown_mushroom")))); } + private MaterialData create(String s) { + return main.getHandle().createMaterialData(s); + } + + private void addItem(String id, ConstantFlora flora) { + try { + add(id, flora); + } catch(IllegalArgumentException e) { + main.getLogger().warning("Failed to load Flora item: " + id + ": " + e.getMessage()); + } + } + + private BlockData data(String s) { + return main.getHandle().createBlockData(s); + } + + @Override public Flora get(String id) { return super.get(id);