From ee35c371ec292998b7717193eb88e18e78a51678 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 14 Dec 2020 23:53:01 -0700 Subject: [PATCH] Trees on Bukkit --- .../api/gaea/tree/fractal/trees/Cactus.java | 1 + .../terra/api/translator/Transformer.java | 6 +++--- .../com/dfsek/terra/registry/TreeRegistry.java | 3 ++- .../java/com/dfsek/terra/util/StringUtils.java | 14 ++++++++++++++ .../dfsek/terra/bukkit/BukkitWorldHandle.java | 9 +++++++-- .../dfsek/terra/bukkit/TerraBukkitPlugin.java | 18 ++++++++++++++++++ 6 files changed, 45 insertions(+), 6 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/util/StringUtils.java diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Cactus.java b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Cactus.java index f9208b712..a8cc064d7 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Cactus.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Cactus.java @@ -15,6 +15,7 @@ public class Cactus extends FractalTree { main.getWorldHandle().createMaterialData("minecraft:red_sand")); } + /** * Instantiates a TreeGrower at an origin location. * diff --git a/common/src/main/java/com/dfsek/terra/api/translator/Transformer.java b/common/src/main/java/com/dfsek/terra/api/translator/Transformer.java index 6d7252c2a..b87d873df 100644 --- a/common/src/main/java/com/dfsek/terra/api/translator/Transformer.java +++ b/common/src/main/java/com/dfsek/terra/api/translator/Transformer.java @@ -23,16 +23,16 @@ public class Transformer { * @return Result */ public T translate(F from) { - List exceptions = new ArrayList<>(); + List exceptions = new ArrayList<>(); for(Transform transform : transformer) { try { return transform.transform(from); - } catch(TransformException exception) { + } catch(Exception exception) { exceptions.add(exception); } } StringBuilder exBuilder = new StringBuilder("Could not transform input; all attempts failed: ").append(from.toString()).append("\n"); - for(TransformException exception : exceptions) exBuilder.append(exception.getMessage()).append("\n"); + for(Exception exception : exceptions) exBuilder.append(exception.getMessage()).append("\n"); throw new AttemptsFailedException(exBuilder.toString()); } diff --git a/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java b/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java index d36b66a4b..0aa82898e 100644 --- a/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java @@ -3,6 +3,7 @@ package com.dfsek.terra.registry; import com.dfsek.terra.api.gaea.tree.Tree; import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; import com.dfsek.terra.api.gaea.tree.fractal.trees.Cactus; +import com.dfsek.terra.api.gaea.tree.fractal.trees.IceSpike; import com.dfsek.terra.api.gaea.tree.fractal.trees.OakTree; import com.dfsek.terra.api.gaea.tree.fractal.trees.ShatteredPillar; import com.dfsek.terra.api.gaea.tree.fractal.trees.ShatteredTree; @@ -48,6 +49,7 @@ public class TreeRegistry extends TerraRegistry { addTree("SPRUCE"); addTree("SWAMP_OAK"); tryAdd("SMALL_SHATTERED_PILLAR", SmallShatteredPillar.class); + tryAdd("ICE_SPIKE", IceSpike.class); addTree("TALL_BIRCH"); } @@ -81,7 +83,6 @@ public class TreeRegistry extends TerraRegistry { public boolean plant(Location l, Random r) { try { FractalTree tree = constructor.newInstance(l, r, main); - if(!getSpawnable().contains(l.subtract(0, 1, 0).getBlock().getType())) return false; tree.grow(); tree.plant(); return true; diff --git a/common/src/main/java/com/dfsek/terra/util/StringUtils.java b/common/src/main/java/com/dfsek/terra/util/StringUtils.java new file mode 100644 index 000000000..5c579e3f9 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/util/StringUtils.java @@ -0,0 +1,14 @@ +package com.dfsek.terra.util; + +public final class StringUtils { + /** + * Strip Minecraft namespace from string + * + * @param in String to strip namespace of + * @return Stripped string/ + */ + public static String stripMinecraftNamespace(String in) { + if(!in.startsWith("minecraft:")) return in; + return in.substring(10); + } +} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java index 2566a891d..02f4fe45f 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java @@ -6,6 +6,7 @@ import com.dfsek.terra.api.generic.world.WorldHandle; 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.MaterialData; +import com.dfsek.terra.api.translator.Transformer; import com.dfsek.terra.bukkit.world.block.BukkitBlockData; import com.dfsek.terra.bukkit.world.block.BukkitMaterialData; import com.dfsek.terra.bukkit.world.block.data.BukkitMultipleFacing; @@ -13,18 +14,22 @@ import com.dfsek.terra.bukkit.world.block.data.BukkitStairs; import com.dfsek.terra.bukkit.world.block.data.BukkitWaterlogged; import org.bukkit.Bukkit; import org.bukkit.Material; -import org.bukkit.TreeType; import org.bukkit.block.data.MultipleFacing; import org.bukkit.block.data.Waterlogged; import org.bukkit.block.data.type.Stairs; public class BukkitWorldHandle implements WorldHandle { private final TerraPlugin main; + private Transformer treeTransformer; public BukkitWorldHandle(TerraPlugin main) { this.main = main; } + public void setTreeTransformer(Transformer treeTransformer) { + this.treeTransformer = treeTransformer; + } + @Override public void setBlockData(Block block, BlockData data, boolean physics) { block.setBlockData(data, physics); @@ -56,6 +61,6 @@ public class BukkitWorldHandle implements WorldHandle { @Override public Tree getTree(String id) { - return new BukkitTree(TreeType.valueOf(id), main); + return treeTransformer.translate(id); } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index 22b9d1dfb..09105d372 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -5,12 +5,15 @@ import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.GenericLoaders; import com.dfsek.terra.api.gaea.lang.Language; import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.generic.Tree; import com.dfsek.terra.api.generic.inventory.ItemHandle; import com.dfsek.terra.api.generic.world.Biome; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.translator.MapTransform; +import com.dfsek.terra.api.translator.Transformer; import com.dfsek.terra.bukkit.command.command.TerraCommand; import com.dfsek.terra.bukkit.command.command.structure.LocateCommand; import com.dfsek.terra.bukkit.generator.BukkitChunkGenerator; @@ -25,8 +28,10 @@ import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.debug.Debug; import com.dfsek.terra.generation.TerraChunkGenerator; import com.dfsek.terra.registry.ConfigRegistry; +import com.dfsek.terra.util.StringUtils; import org.bstats.bukkit.Metrics; import org.bukkit.Bukkit; +import org.bukkit.TreeType; import org.bukkit.command.PluginCommand; import org.bukkit.entity.EntityType; import org.bukkit.generator.ChunkGenerator; @@ -84,6 +89,19 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { public void onEnable() { Debug.setLogger(getLogger()); // Set debug logger. + ((BukkitWorldHandle) handle).setTreeTransformer(new Transformer.Builder() + .addTransform(id -> new BukkitTree(TreeType.valueOf(id), this)) // First try getting directly from enum + .addTransform(new MapTransform() // Then try map of less stupid names + .add("JUNGLE_COCOA", new BukkitTree(TreeType.COCOA_TREE, this)) + .add("LARGE_OAK", new BukkitTree(TreeType.BIG_TREE, this)) + .add("LARGE_SPRUCE", new BukkitTree(TreeType.TALL_REDWOOD, this)) + .add("SPRUCE", new BukkitTree(TreeType.REDWOOD, this)) + .add("OAK", new BukkitTree(TreeType.TREE, this)) + .add("MEGA_SPRUCE", new BukkitTree(TreeType.MEGA_REDWOOD, this)) + .add("SWAMP_OAK", new BukkitTree(TreeType.SWAMP, this))) + .addTransform(id -> new BukkitTree(TreeType.valueOf(StringUtils.stripMinecraftNamespace(id)), this)) // Finally, try stripping minecraft namespace. + .build()); + saveDefaultConfig(); Metrics metrics = new Metrics(this, 9017); // Set up bStats.