Trees on Bukkit

This commit is contained in:
dfsek
2020-12-14 23:53:01 -07:00
parent 4d59c27a13
commit ee35c371ec
6 changed files with 45 additions and 6 deletions
@@ -15,6 +15,7 @@ public class Cactus extends FractalTree {
main.getWorldHandle().createMaterialData("minecraft:red_sand")); main.getWorldHandle().createMaterialData("minecraft:red_sand"));
} }
/** /**
* Instantiates a TreeGrower at an origin location. * Instantiates a TreeGrower at an origin location.
* *
@@ -23,16 +23,16 @@ public class Transformer<F, T> {
* @return Result * @return Result
*/ */
public T translate(F from) { public T translate(F from) {
List<TransformException> exceptions = new ArrayList<>(); List<Exception> exceptions = new ArrayList<>();
for(Transform<F, T> transform : transformer) { for(Transform<F, T> transform : transformer) {
try { try {
return transform.transform(from); return transform.transform(from);
} catch(TransformException exception) { } catch(Exception exception) {
exceptions.add(exception); exceptions.add(exception);
} }
} }
StringBuilder exBuilder = new StringBuilder("Could not transform input; all attempts failed: ").append(from.toString()).append("\n"); 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()); throw new AttemptsFailedException(exBuilder.toString());
} }
@@ -3,6 +3,7 @@ package com.dfsek.terra.registry;
import com.dfsek.terra.api.gaea.tree.Tree; 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.FractalTree;
import com.dfsek.terra.api.gaea.tree.fractal.trees.Cactus; 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.OakTree;
import com.dfsek.terra.api.gaea.tree.fractal.trees.ShatteredPillar; import com.dfsek.terra.api.gaea.tree.fractal.trees.ShatteredPillar;
import com.dfsek.terra.api.gaea.tree.fractal.trees.ShatteredTree; import com.dfsek.terra.api.gaea.tree.fractal.trees.ShatteredTree;
@@ -48,6 +49,7 @@ public class TreeRegistry extends TerraRegistry<Tree> {
addTree("SPRUCE"); addTree("SPRUCE");
addTree("SWAMP_OAK"); addTree("SWAMP_OAK");
tryAdd("SMALL_SHATTERED_PILLAR", SmallShatteredPillar.class); tryAdd("SMALL_SHATTERED_PILLAR", SmallShatteredPillar.class);
tryAdd("ICE_SPIKE", IceSpike.class);
addTree("TALL_BIRCH"); addTree("TALL_BIRCH");
} }
@@ -81,7 +83,6 @@ public class TreeRegistry extends TerraRegistry<Tree> {
public boolean plant(Location l, Random r) { public boolean plant(Location l, Random r) {
try { try {
FractalTree tree = constructor.newInstance(l, r, main); FractalTree tree = constructor.newInstance(l, r, main);
if(!getSpawnable().contains(l.subtract(0, 1, 0).getBlock().getType())) return false;
tree.grow(); tree.grow();
tree.plant(); tree.plant();
return true; return true;
@@ -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);
}
}
@@ -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.Block;
import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.BlockData;
import com.dfsek.terra.api.generic.world.block.MaterialData; 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.BukkitBlockData;
import com.dfsek.terra.bukkit.world.block.BukkitMaterialData; import com.dfsek.terra.bukkit.world.block.BukkitMaterialData;
import com.dfsek.terra.bukkit.world.block.data.BukkitMultipleFacing; 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 com.dfsek.terra.bukkit.world.block.data.BukkitWaterlogged;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.TreeType;
import org.bukkit.block.data.MultipleFacing; import org.bukkit.block.data.MultipleFacing;
import org.bukkit.block.data.Waterlogged; import org.bukkit.block.data.Waterlogged;
import org.bukkit.block.data.type.Stairs; import org.bukkit.block.data.type.Stairs;
public class BukkitWorldHandle implements WorldHandle { public class BukkitWorldHandle implements WorldHandle {
private final TerraPlugin main; private final TerraPlugin main;
private Transformer<String, Tree> treeTransformer;
public BukkitWorldHandle(TerraPlugin main) { public BukkitWorldHandle(TerraPlugin main) {
this.main = main; this.main = main;
} }
public void setTreeTransformer(Transformer<String, Tree> treeTransformer) {
this.treeTransformer = treeTransformer;
}
@Override @Override
public void setBlockData(Block block, BlockData data, boolean physics) { public void setBlockData(Block block, BlockData data, boolean physics) {
block.setBlockData(data, physics); block.setBlockData(data, physics);
@@ -56,6 +61,6 @@ public class BukkitWorldHandle implements WorldHandle {
@Override @Override
public Tree getTree(String id) { public Tree getTree(String id) {
return new BukkitTree(TreeType.valueOf(id), main); return treeTransformer.translate(id);
} }
} }
@@ -5,12 +5,15 @@ import com.dfsek.terra.TerraWorld;
import com.dfsek.terra.api.GenericLoaders; import com.dfsek.terra.api.GenericLoaders;
import com.dfsek.terra.api.gaea.lang.Language; import com.dfsek.terra.api.gaea.lang.Language;
import com.dfsek.terra.api.generic.TerraPlugin; 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.inventory.ItemHandle;
import com.dfsek.terra.api.generic.world.Biome; import com.dfsek.terra.api.generic.world.Biome;
import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.World;
import com.dfsek.terra.api.generic.world.WorldHandle; 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.BlockData;
import com.dfsek.terra.api.generic.world.block.MaterialData; 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.TerraCommand;
import com.dfsek.terra.bukkit.command.command.structure.LocateCommand; import com.dfsek.terra.bukkit.command.command.structure.LocateCommand;
import com.dfsek.terra.bukkit.generator.BukkitChunkGenerator; 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.debug.Debug;
import com.dfsek.terra.generation.TerraChunkGenerator; import com.dfsek.terra.generation.TerraChunkGenerator;
import com.dfsek.terra.registry.ConfigRegistry; import com.dfsek.terra.registry.ConfigRegistry;
import com.dfsek.terra.util.StringUtils;
import org.bstats.bukkit.Metrics; import org.bstats.bukkit.Metrics;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.TreeType;
import org.bukkit.command.PluginCommand; import org.bukkit.command.PluginCommand;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
import org.bukkit.generator.ChunkGenerator; import org.bukkit.generator.ChunkGenerator;
@@ -84,6 +89,19 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin {
public void onEnable() { public void onEnable() {
Debug.setLogger(getLogger()); // Set debug logger. Debug.setLogger(getLogger()); // Set debug logger.
((BukkitWorldHandle) handle).setTreeTransformer(new Transformer.Builder<String, Tree>()
.addTransform(id -> new BukkitTree(TreeType.valueOf(id), this)) // First try getting directly from enum
.addTransform(new MapTransform<String, Tree>() // 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(); saveDefaultConfig();
Metrics metrics = new Metrics(this, 9017); // Set up bStats. Metrics metrics = new Metrics(this, 9017); // Set up bStats.