Rotation & tree stuff

This commit is contained in:
dfsek
2020-12-11 19:31:25 -07:00
parent 15100caf32
commit 27dbd494bd
14 changed files with 149 additions and 17 deletions

View File

@@ -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<Location, BlockData> treeAssembler = new HashMap<>();
private final List<EntitySpawnHolder> 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<MaterialData> getSpawnable() {
return null;
}
}

View File

@@ -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 {
}

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -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<Tree> {
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());
}
}
}

View File

@@ -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<MaterialData> getSpawnable() {
return spawnable;
}
}

View File

@@ -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);
}
}

View File

@@ -45,7 +45,8 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin {
private final Map<String, ConfigPack> 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) {

View File

@@ -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());
}
}

View File

@@ -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) {

View File

@@ -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<BlockFace> 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<BlockFace> getAllowedFaces() {
return delegate.getAllowedFaces().stream().map(BukkitEnumAdapter::fromBukkitBlockFace).collect(Collectors.toSet());
}
@Override
public boolean hasFace(BlockFace f) {
return delegate.hasFace(TerraEnumAdapter.fromTerraBlockFace(f));
}
}

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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) {