diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java index f8fed6916..f2e58762d 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java @@ -1,5 +1,6 @@ package com.dfsek.terra.api.gaea.tree.fractal; +import com.dfsek.terra.api.gaea.tree.Tree; import com.dfsek.terra.api.gaea.util.GlueList; import com.dfsek.terra.api.generic.Entity; import com.dfsek.terra.api.generic.TerraPlugin; @@ -12,10 +13,11 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Random; +import java.util.Set; import java.util.function.Consumer; -public abstract class FractalTree { +public abstract class FractalTree implements Tree { private final Map treeAssembler = new HashMap<>(); private final List entities = new GlueList<>(); private final Location origin; @@ -110,5 +112,13 @@ public abstract class FractalTree { return treeAssembler.getOrDefault(l, main.getWorldHandle().createBlockData("minecraft:air")).getMaterial(); } + @Override + public boolean plant(Location l, Random r) { + return false; + } + @Override + public Set getSpawnable() { + return null; + } } diff --git a/common/src/main/java/com/dfsek/terra/api/generic/Tree.java b/common/src/main/java/com/dfsek/terra/api/generic/Tree.java index d3f584d9f..5dadfb11d 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/Tree.java +++ b/common/src/main/java/com/dfsek/terra/api/generic/Tree.java @@ -1,4 +1,4 @@ package com.dfsek.terra.api.generic; -public interface Tree extends Handle { +public interface Tree extends Handle, com.dfsek.terra.api.gaea.tree.Tree { } diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/WorldHandle.java b/common/src/main/java/com/dfsek/terra/api/generic/world/WorldHandle.java index 1e33c4f50..d438c5df3 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/world/WorldHandle.java +++ b/common/src/main/java/com/dfsek/terra/api/generic/world/WorldHandle.java @@ -1,5 +1,6 @@ package com.dfsek.terra.api.generic.world; +import com.dfsek.terra.api.generic.Tree; 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; @@ -17,4 +18,6 @@ public interface WorldHandle { BlockData createBlockData(String data); MaterialData createMaterialData(String data); + + Tree getTree(String id); } diff --git a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java index 664a2f3c7..f0bc3d7db 100644 --- a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java +++ b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java @@ -77,7 +77,7 @@ public class ConfigPack implements LoaderRegistrar { private final PaletteRegistry paletteRegistry; private final FloraRegistry floraRegistry; private final OreRegistry oreRegistry = new OreRegistry(); - private final TreeRegistry treeRegistry = new TreeRegistry(); + private final TreeRegistry treeRegistry; private final AbstractConfigLoader abstractConfigLoader = new AbstractConfigLoader(); private final ConfigLoader selfLoader = new ConfigLoader(); @@ -88,7 +88,8 @@ public class ConfigPack implements LoaderRegistrar { public ConfigPack(File folder, TerraPlugin main) throws ConfigException { long l = System.nanoTime(); floraRegistry = new FloraRegistry(main); - paletteRegistry = new PaletteRegistry(main); + paletteRegistry = new PaletteRegistry(main); + treeRegistry = new TreeRegistry(main); register(abstractConfigLoader); main.register(selfLoader); @@ -108,7 +109,8 @@ public class ConfigPack implements LoaderRegistrar { public ConfigPack(ZipFile file, TerraPlugin main) throws ConfigException { long l = System.nanoTime(); floraRegistry = new FloraRegistry(main); - paletteRegistry = new PaletteRegistry(main); + paletteRegistry = new PaletteRegistry(main); + treeRegistry = new TreeRegistry(main); register(abstractConfigLoader); main.register(selfLoader); 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 93e7c4dbd..8f4a6340b 100644 --- a/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java @@ -1,9 +1,20 @@ package com.dfsek.terra.registry; import com.dfsek.terra.api.gaea.tree.Tree; +import com.dfsek.terra.api.generic.TerraPlugin; public class TreeRegistry extends TerraRegistry { - public TreeRegistry() { + private final TerraPlugin main; + public TreeRegistry(TerraPlugin main) { + this.main = main; + } + + private void addTree(String id) { + try { + add(id, main.getWorldHandle().getTree(id)); + } catch(IllegalArgumentException e) { + main.getLogger().warning("Unable to load tree " + id + ": " + e.getMessage()); + } } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitTree.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitTree.java index b931c904f..fe35f0f7c 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitTree.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitTree.java @@ -1,17 +1,59 @@ package com.dfsek.terra.bukkit; +import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.api.generic.Tree; +import com.dfsek.terra.api.generic.world.WorldHandle; +import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.bukkit.util.BukkitConversions; +import com.dfsek.terra.util.MaterialSet; import org.bukkit.TreeType; +import java.util.Random; +import java.util.Set; + public class BukkitTree implements Tree { private final TreeType delegate; + private final MaterialSet spawnable; + private final TerraPlugin main; - public BukkitTree(TreeType delegate) { + public BukkitTree(TreeType delegate, TerraPlugin main) { this.delegate = delegate; + this.main = main; + this.spawnable = getSpawnable(delegate); + } + + private MaterialSet getSpawnable(TreeType type) { + WorldHandle handle = main.getWorldHandle(); + switch(type) { + case CRIMSON_FUNGUS: + return MaterialSet.get(handle.createMaterialData("minecraft:crimson_nylium")); + case WARPED_FUNGUS: + return MaterialSet.get(handle.createMaterialData("minecraft:warped_nylium")); + case BROWN_MUSHROOM: + case RED_MUSHROOM: + return MaterialSet.get(handle.createMaterialData("minecraft:mycelium"), handle.createMaterialData("minecraft:grass_block"), + handle.createMaterialData("minecraft:podzol")); + case CHORUS_PLANT: + return MaterialSet.get(handle.createMaterialData("minecraft:end_stone")); + default: + return MaterialSet.get(handle.createMaterialData("minecraft:grass_block"), handle.createMaterialData("minecraft:dirt"), + handle.createMaterialData("minecraft:podzol")); + } } @Override public TreeType getHandle() { return delegate; } + + @Override + public boolean plant(Location l, Random r) { + return ((BukkitWorld) l.getWorld()).getHandle().generateTree(BukkitConversions.toBukkitLocation(l), delegate); + } + + @Override + public Set getSpawnable() { + return spawnable; + } } 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 67f155368..2566a891d 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 @@ -1,19 +1,29 @@ package com.dfsek.terra.bukkit; +import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.generic.Tree; 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.generic.world.block.data.Waterlogged; 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; 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; + + public BukkitWorldHandle(TerraPlugin main) { + this.main = main; + } @Override public void setBlockData(Block block, BlockData data, boolean physics) { @@ -33,8 +43,9 @@ public class BukkitWorldHandle implements WorldHandle { @Override public BlockData createBlockData(String data) { org.bukkit.block.data.BlockData bukkitData = Bukkit.createBlockData(data); - if(bukkitData instanceof Stairs) return new BukkitStairs(bukkitData); - if(bukkitData instanceof Waterlogged) return new BukkitWaterlogged(bukkitData); + if(bukkitData instanceof MultipleFacing) return new BukkitMultipleFacing((MultipleFacing) bukkitData); + if(bukkitData instanceof Stairs) return new BukkitStairs((Stairs) bukkitData); + if(bukkitData instanceof Waterlogged) return new BukkitWaterlogged((Waterlogged) bukkitData); return new BukkitBlockData(Bukkit.createBlockData(data)); } @@ -42,4 +53,9 @@ public class BukkitWorldHandle implements WorldHandle { public MaterialData createMaterialData(String data) { return new BukkitMaterialData(Material.matchMaterial(data)); } + + @Override + public Tree getTree(String id) { + return new BukkitTree(TreeType.valueOf(id), main); + } } 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 53d4aed51..cc6127304 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 @@ -45,7 +45,8 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { private final Map worlds = new HashMap<>(); private final ConfigRegistry registry = new ConfigRegistry(); private final PluginConfig config = new PluginConfig(); - private WorldHandle handle = new BukkitWorldHandle(); + private final ItemHandle itemHandle = new BukkitItemHandle(); + private WorldHandle handle = new BukkitWorldHandle(this); private final GenericLoaders genericLoaders = new GenericLoaders(this); @@ -61,7 +62,7 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { @Override public ItemHandle getItemHandle() { - return null; + return itemHandle; } public void setHandle(WorldHandle handle) { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/BukkitConversions.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/BukkitConversions.java index 31aea01c9..674a22010 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/BukkitConversions.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/BukkitConversions.java @@ -1,10 +1,16 @@ package com.dfsek.terra.bukkit.util; import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.bukkit.BukkitWorld; +import org.bukkit.Location; import org.bukkit.util.Vector; public final class BukkitConversions { public static Vector3 toTerraVector(Vector bukkit) { return new Vector3(bukkit.getX(), bukkit.getY(), bukkit.getZ()); } + + public static Location toBukkitLocation(com.dfsek.terra.api.generic.world.vector.Location terra) { + return new Location(((BukkitWorld) terra.getWorld()).getHandle(), terra.getX(), terra.getY(), terra.getZ()); + } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitEnumAdapter.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitEnumAdapter.java index da2a6a54c..7e4d70508 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitEnumAdapter.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitEnumAdapter.java @@ -5,6 +5,9 @@ import com.dfsek.terra.api.generic.world.block.BlockFace; import com.dfsek.terra.api.generic.world.block.data.Bisected; import com.dfsek.terra.api.generic.world.block.data.Stairs; +/** + * Utility class to adapt Bukkit enums to Terra enums. + */ public final class BukkitEnumAdapter { public static Stairs.Shape fromBukkitStair(org.bukkit.block.data.type.Stairs.Shape shape) { switch(shape) { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitMultipleFacing.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitMultipleFacing.java new file mode 100644 index 000000000..265599cba --- /dev/null +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitMultipleFacing.java @@ -0,0 +1,37 @@ +package com.dfsek.terra.bukkit.world.block.data; + +import com.dfsek.terra.api.generic.world.block.BlockFace; +import com.dfsek.terra.api.generic.world.block.data.MultipleFacing; +import com.dfsek.terra.bukkit.world.block.BukkitBlockData; + +import java.util.Set; +import java.util.stream.Collectors; + +public class BukkitMultipleFacing extends BukkitBlockData implements MultipleFacing { + private final org.bukkit.block.data.MultipleFacing delegate; + + public BukkitMultipleFacing(org.bukkit.block.data.MultipleFacing delegate) { + super(delegate); + this.delegate = delegate; + } + + @Override + public Set getFaces() { + return delegate.getFaces().stream().map(BukkitEnumAdapter::fromBukkitBlockFace).collect(Collectors.toSet()); + } + + @Override + public void setFace(BlockFace face, boolean facing) { + delegate.setFace(TerraEnumAdapter.fromTerraBlockFace(face), facing); + } + + @Override + public Set getAllowedFaces() { + return delegate.getAllowedFaces().stream().map(BukkitEnumAdapter::fromBukkitBlockFace).collect(Collectors.toSet()); + } + + @Override + public boolean hasFace(BlockFace f) { + return delegate.hasFace(TerraEnumAdapter.fromTerraBlockFace(f)); + } +} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitStairs.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitStairs.java index 8b0f86879..3d6cb4fac 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitStairs.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitStairs.java @@ -3,14 +3,13 @@ package com.dfsek.terra.bukkit.world.block.data; import com.dfsek.terra.api.generic.world.block.BlockFace; import com.dfsek.terra.api.generic.world.block.data.Stairs; import com.dfsek.terra.bukkit.world.block.BukkitBlockData; -import org.bukkit.block.data.BlockData; public class BukkitStairs extends BukkitBlockData implements Stairs { private final org.bukkit.block.data.type.Stairs stairs; - public BukkitStairs(BlockData delegate) { + public BukkitStairs(org.bukkit.block.data.type.Stairs delegate) { super(delegate); - this.stairs = (org.bukkit.block.data.type.Stairs) delegate; + this.stairs = delegate; } @Override diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWaterlogged.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWaterlogged.java index 3f0f8e1d9..905497237 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWaterlogged.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWaterlogged.java @@ -2,12 +2,11 @@ package com.dfsek.terra.bukkit.world.block.data; import com.dfsek.terra.api.generic.world.block.data.Waterlogged; import com.dfsek.terra.bukkit.world.block.BukkitBlockData; -import org.bukkit.block.data.BlockData; public class BukkitWaterlogged extends BukkitBlockData implements Waterlogged { private boolean waterlogged; - public BukkitWaterlogged(BlockData delegate) { + public BukkitWaterlogged(org.bukkit.block.data.Waterlogged delegate) { super(delegate); } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/TerraEnumAdapter.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/TerraEnumAdapter.java index 317284259..5a7bc923c 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/TerraEnumAdapter.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/TerraEnumAdapter.java @@ -5,6 +5,9 @@ import com.dfsek.terra.api.generic.world.block.BlockFace; import org.bukkit.block.data.Bisected; import org.bukkit.block.data.type.Stairs; +/** + * Utility class to adapt Terra enums to Bukkit enums + */ public final class TerraEnumAdapter { public static Stairs.Shape fromTerraStair(com.dfsek.terra.api.generic.world.block.data.Stairs.Shape shape) { switch(shape) {