diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/Axis.java b/common/api/src/main/java/com/dfsek/terra/api/block/Axis.java deleted file mode 100644 index 01b5085bf..000000000 --- a/common/api/src/main/java/com/dfsek/terra/api/block/Axis.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.dfsek.terra.api.block; - -public enum Axis { - X, Y, Z -} diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/BlockState.java b/common/api/src/main/java/com/dfsek/terra/api/block/BlockState.java index 43f841a7e..dcd78342e 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/BlockState.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/BlockState.java @@ -1,6 +1,7 @@ package com.dfsek.terra.api.block; import com.dfsek.terra.api.Handle; +import com.dfsek.terra.api.block.data.properties.Property; public interface BlockState extends Cloneable, Handle { @@ -15,4 +16,10 @@ public interface BlockState extends Cloneable, Handle { boolean isAir(); boolean isStructureVoid(); + + boolean has(Property property); + + T get(Property property); + + BlockState set(Property property); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/data/Orientable.java b/common/api/src/main/java/com/dfsek/terra/api/block/data/Orientable.java index c0f9dab8e..0c0de4c91 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/data/Orientable.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/data/Orientable.java @@ -1,6 +1,6 @@ package com.dfsek.terra.api.block.data; -import com.dfsek.terra.api.block.Axis; +import com.dfsek.terra.api.block.data.properties.enums.Axis; import com.dfsek.terra.api.block.BlockState; import java.util.Set; diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/data/Rail.java b/common/api/src/main/java/com/dfsek/terra/api/block/data/Rail.java index 9edb2db52..716bd4f9e 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/data/Rail.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/data/Rail.java @@ -1,22 +1,11 @@ package com.dfsek.terra.api.block.data; import com.dfsek.terra.api.block.BlockState; +import com.dfsek.terra.api.block.data.properties.enums.RailShape; public interface Rail extends BlockState { - Shape getShape(); + RailShape getShape(); - void setShape(Shape newShape); + void setShape(RailShape newShape); - enum Shape { - ASCENDING_EAST, - ASCENDING_NORTH, - ASCENDING_SOUTH, - ASCENDING_WEST, - EAST_WEST, - NORTH_EAST, - NORTH_SOUTH, - NORTH_WEST, - SOUTH_EAST, - SOUTH_WEST - } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/data/properties/base/BooleanProperty.java b/common/api/src/main/java/com/dfsek/terra/api/block/data/properties/base/BooleanProperty.java index 6461cbd74..81c729d99 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/data/properties/base/BooleanProperty.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/data/properties/base/BooleanProperty.java @@ -2,9 +2,28 @@ package com.dfsek.terra.api.block.data.properties.base; import com.dfsek.terra.api.block.data.properties.Property; +import java.util.Arrays; +import java.util.Collection; + public interface BooleanProperty extends Property { @Override default Class getType() { return Boolean.class; } + + static BooleanProperty of(String name) { + return new BooleanProperty() { + private static final Collection BOOLEANS = Arrays.asList(true, false); + + @Override + public String getName() { + return name; + } + + @Override + public Collection values() { + return BOOLEANS; + } + }; + } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/data/properties/base/EnumProperty.java b/common/api/src/main/java/com/dfsek/terra/api/block/data/properties/base/EnumProperty.java index c38c23f5f..6ede374bb 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/data/properties/base/EnumProperty.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/data/properties/base/EnumProperty.java @@ -1,6 +1,29 @@ package com.dfsek.terra.api.block.data.properties.base; import com.dfsek.terra.api.block.data.properties.Property; +import com.dfsek.terra.api.util.generic.Lazy; + +import java.util.Arrays; +import java.util.Collection; public interface EnumProperty> extends Property { + static > EnumProperty of(String name, Class clazz) { + return new EnumProperty() { + private final Lazy> constants = Lazy.of(() -> Arrays.asList(clazz.getEnumConstants())); + @Override + public Class getType() { + return clazz; + } + + @Override + public String getName() { + return name; + } + + @Override + public Collection values() { + return constants.value(); + } + }; + } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/data/properties/base/IntProperty.java b/common/api/src/main/java/com/dfsek/terra/api/block/data/properties/base/IntProperty.java index 0c94d4d0a..490c4694c 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/block/data/properties/base/IntProperty.java +++ b/common/api/src/main/java/com/dfsek/terra/api/block/data/properties/base/IntProperty.java @@ -1,10 +1,37 @@ package com.dfsek.terra.api.block.data.properties.base; import com.dfsek.terra.api.block.data.properties.Property; +import com.dfsek.terra.api.util.generic.Construct; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; public interface IntProperty extends Property { @Override default Class getType() { return Integer.class; } + + static IntProperty of(String name, int min, int max) { + return new IntProperty() { + private final Collection collection = Construct.construct(() -> { + List ints = new ArrayList<>(); + for(int i = min; i <= max; i++) { + ints.add(i); + } + return ints; + }); + + @Override + public String getName() { + return name; + } + + @Override + public Collection values() { + return collection; + } + }; + } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/data/properties/base/Properties.java b/common/api/src/main/java/com/dfsek/terra/api/block/data/properties/base/Properties.java new file mode 100644 index 000000000..f757a9999 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/block/data/properties/base/Properties.java @@ -0,0 +1,17 @@ +package com.dfsek.terra.api.block.data.properties.base; + +import com.dfsek.terra.api.block.data.properties.enums.Direction; +import com.dfsek.terra.api.block.data.properties.enums.RailShape; + +public final class Properties { + public static final EnumProperty DIRECTION = EnumProperty.of("facing", Direction.class); + + public static final BooleanProperty NORTH = BooleanProperty.of("north"); + public static final BooleanProperty SOUTH = BooleanProperty.of("south"); + public static final BooleanProperty EAST = BooleanProperty.of("east"); + public static final BooleanProperty WEST = BooleanProperty.of("west"); + + public static final EnumProperty RAIL_SHAPE = EnumProperty.of("shape", RailShape.class); + + public static final IntProperty ROTATION = IntProperty.of("rotation", 0, 15); +} diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/data/properties/enums/Axis.java b/common/api/src/main/java/com/dfsek/terra/api/block/data/properties/enums/Axis.java new file mode 100644 index 000000000..e9338cbce --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/block/data/properties/enums/Axis.java @@ -0,0 +1,5 @@ +package com.dfsek.terra.api.block.data.properties.enums; + +public enum Axis { + X, Y, Z +} diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/data/properties/enums/Direction.java b/common/api/src/main/java/com/dfsek/terra/api/block/data/properties/enums/Direction.java new file mode 100644 index 000000000..ff06427f6 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/block/data/properties/enums/Direction.java @@ -0,0 +1,5 @@ +package com.dfsek.terra.api.block.data.properties.enums; + +public enum Direction { + NORTH,SOUTH,EAST,WEST,UP,DOWN +} diff --git a/common/api/src/main/java/com/dfsek/terra/api/block/data/properties/enums/RailShape.java b/common/api/src/main/java/com/dfsek/terra/api/block/data/properties/enums/RailShape.java new file mode 100644 index 000000000..54c6c5b1d --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/block/data/properties/enums/RailShape.java @@ -0,0 +1,14 @@ +package com.dfsek.terra.api.block.data.properties.enums; + +public enum RailShape { + ASCENDING_EAST, + ASCENDING_NORTH, + ASCENDING_SOUTH, + ASCENDING_WEST, + EAST_WEST, + NORTH_EAST, + NORTH_SOUTH, + NORTH_WEST, + SOUTH_EAST, + SOUTH_WEST +} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Construct.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Construct.java new file mode 100644 index 000000000..2fb63fe8d --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Construct.java @@ -0,0 +1,9 @@ +package com.dfsek.terra.api.util.generic; + +import java.util.function.Supplier; + +public final class Construct { + public static T construct(Supplier in) { + return in.get(); + } +} diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/generic/Lazy.java b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Lazy.java new file mode 100644 index 000000000..b48129685 --- /dev/null +++ b/common/api/src/main/java/com/dfsek/terra/api/util/generic/Lazy.java @@ -0,0 +1,25 @@ +package com.dfsek.terra.api.util.generic; + +import java.util.function.Supplier; + +public final class Lazy { + private final Supplier valueSupplier; + private T value = null; + private boolean got = false; + + private Lazy(Supplier valueSupplier) { + this.valueSupplier = valueSupplier; + } + + public T value() { + if(!got && value == null) { + got = true; + value = valueSupplier.get(); + } + return value; + } + + public static Lazy of(Supplier valueSupplier) { + return new Lazy<>(valueSupplier); + } +} diff --git a/common/implementation/src/main/java/com/dfsek/terra/api/util/RotationUtil.java b/common/implementation/src/main/java/com/dfsek/terra/api/util/RotationUtil.java index ecda78388..34a0d4121 100644 --- a/common/implementation/src/main/java/com/dfsek/terra/api/util/RotationUtil.java +++ b/common/implementation/src/main/java/com/dfsek/terra/api/util/RotationUtil.java @@ -1,6 +1,7 @@ package com.dfsek.terra.api.util; -import com.dfsek.terra.api.block.Axis; +import com.dfsek.terra.api.block.data.properties.enums.RailShape; +import com.dfsek.terra.api.block.data.properties.enums.Axis; import com.dfsek.terra.api.block.BlockState; import com.dfsek.terra.api.block.BlockFace; import com.dfsek.terra.api.block.data.Directional; @@ -174,76 +175,76 @@ public class RotationUtil { * @return Rotated/mirrored shape */ @SuppressWarnings("fallthrough") - public static Rail.Shape getRotatedRail(Rail.Shape orig, Rotation r) { + public static RailShape getRotatedRail(RailShape orig, Rotation r) { switch(r) { case CCW_90: switch(orig) { case NORTH_WEST: - return Rail.Shape.SOUTH_WEST; + return RailShape.SOUTH_WEST; case NORTH_SOUTH: - return Rail.Shape.EAST_WEST; + return RailShape.EAST_WEST; case SOUTH_WEST: - return Rail.Shape.SOUTH_EAST; + return RailShape.SOUTH_EAST; case SOUTH_EAST: - return Rail.Shape.NORTH_EAST; + return RailShape.NORTH_EAST; case EAST_WEST: - return Rail.Shape.NORTH_SOUTH; + return RailShape.NORTH_SOUTH; case NORTH_EAST: - return Rail.Shape.NORTH_WEST; + return RailShape.NORTH_WEST; case ASCENDING_EAST: - return Rail.Shape.ASCENDING_NORTH; + return RailShape.ASCENDING_NORTH; case ASCENDING_WEST: - return Rail.Shape.ASCENDING_SOUTH; + return RailShape.ASCENDING_SOUTH; case ASCENDING_NORTH: - return Rail.Shape.ASCENDING_WEST; + return RailShape.ASCENDING_WEST; case ASCENDING_SOUTH: - return Rail.Shape.ASCENDING_EAST; + return RailShape.ASCENDING_EAST; } case CW_90: switch(orig) { case NORTH_WEST: - return Rail.Shape.NORTH_EAST; + return RailShape.NORTH_EAST; case NORTH_SOUTH: - return Rail.Shape.EAST_WEST; + return RailShape.EAST_WEST; case SOUTH_WEST: - return Rail.Shape.NORTH_WEST; + return RailShape.NORTH_WEST; case SOUTH_EAST: - return Rail.Shape.SOUTH_WEST; + return RailShape.SOUTH_WEST; case EAST_WEST: - return Rail.Shape.NORTH_SOUTH; + return RailShape.NORTH_SOUTH; case NORTH_EAST: - return Rail.Shape.SOUTH_EAST; + return RailShape.SOUTH_EAST; case ASCENDING_EAST: - return Rail.Shape.ASCENDING_SOUTH; + return RailShape.ASCENDING_SOUTH; case ASCENDING_WEST: - return Rail.Shape.ASCENDING_NORTH; + return RailShape.ASCENDING_NORTH; case ASCENDING_NORTH: - return Rail.Shape.ASCENDING_EAST; + return RailShape.ASCENDING_EAST; case ASCENDING_SOUTH: - return Rail.Shape.ASCENDING_WEST; + return RailShape.ASCENDING_WEST; } case CW_180: switch(orig) { case NORTH_WEST: - return Rail.Shape.SOUTH_EAST; + return RailShape.SOUTH_EAST; case NORTH_SOUTH: - return Rail.Shape.NORTH_SOUTH; + return RailShape.NORTH_SOUTH; case SOUTH_WEST: - return Rail.Shape.NORTH_EAST; + return RailShape.NORTH_EAST; case SOUTH_EAST: - return Rail.Shape.NORTH_WEST; + return RailShape.NORTH_WEST; case EAST_WEST: - return Rail.Shape.EAST_WEST; + return RailShape.EAST_WEST; case NORTH_EAST: - return Rail.Shape.SOUTH_WEST; + return RailShape.SOUTH_WEST; case ASCENDING_EAST: - return Rail.Shape.ASCENDING_WEST; + return RailShape.ASCENDING_WEST; case ASCENDING_WEST: - return Rail.Shape.ASCENDING_EAST; + return RailShape.ASCENDING_EAST; case ASCENDING_NORTH: - return Rail.Shape.ASCENDING_SOUTH; + return RailShape.ASCENDING_SOUTH; case ASCENDING_SOUTH: - return Rail.Shape.ASCENDING_NORTH; + return RailShape.ASCENDING_NORTH; } } return orig; @@ -266,7 +267,7 @@ public class RotationUtil { mfData.setFace(getRotatedFace(face.getKey(), r), face.getValue()); } } else if(data instanceof Rail) { - Rail.Shape newShape = getRotatedRail(((Rail) data).getShape(), r); + RailShape newShape = getRotatedRail(((Rail) data).getShape(), r); ((Rail) data).setShape(newShape); } else if(data instanceof Orientable) { Axis newAxis = getRotatedAxis(((Orientable) data).getAxis(), r); diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java index 72d418d12..775640022 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java @@ -1,12 +1,12 @@ package com.dfsek.terra.bukkit.world; -import com.dfsek.terra.api.block.Axis; +import com.dfsek.terra.api.block.data.properties.enums.RailShape; +import com.dfsek.terra.api.block.data.properties.enums.Axis; import com.dfsek.terra.api.block.BlockState; import com.dfsek.terra.api.block.BlockFace; import com.dfsek.terra.api.block.BlockType; import com.dfsek.terra.api.block.data.Bisected; -import com.dfsek.terra.api.block.data.Rail; import com.dfsek.terra.api.block.data.RedstoneWire; import com.dfsek.terra.api.block.data.Slab; import com.dfsek.terra.api.block.data.Stairs; @@ -200,34 +200,34 @@ public final class BukkitAdapter { } } - public static Rail.Shape adapt(org.bukkit.block.data.Rail.Shape shape) { + public static RailShape adapt(org.bukkit.block.data.Rail.Shape shape) { switch(shape) { case SOUTH_WEST: - return Rail.Shape.SOUTH_WEST; + return RailShape.SOUTH_WEST; case SOUTH_EAST: - return Rail.Shape.SOUTH_EAST; + return RailShape.SOUTH_EAST; case NORTH_EAST: - return Rail.Shape.NORTH_EAST; + return RailShape.NORTH_EAST; case NORTH_WEST: - return Rail.Shape.NORTH_WEST; + return RailShape.NORTH_WEST; case ASCENDING_EAST: - return Rail.Shape.ASCENDING_EAST; + return RailShape.ASCENDING_EAST; case ASCENDING_WEST: - return Rail.Shape.ASCENDING_WEST; + return RailShape.ASCENDING_WEST; case ASCENDING_SOUTH: - return Rail.Shape.ASCENDING_SOUTH; + return RailShape.ASCENDING_SOUTH; case ASCENDING_NORTH: - return Rail.Shape.ASCENDING_NORTH; + return RailShape.ASCENDING_NORTH; case NORTH_SOUTH: - return Rail.Shape.NORTH_SOUTH; + return RailShape.NORTH_SOUTH; case EAST_WEST: - return Rail.Shape.EAST_WEST; + return RailShape.EAST_WEST; default: throw new IllegalStateException(); } } - public static org.bukkit.block.data.Rail.Shape adapt(Rail.Shape shape) { + public static org.bukkit.block.data.Rail.Shape adapt(RailShape shape) { switch(shape) { case EAST_WEST: return org.bukkit.block.data.Rail.Shape.EAST_WEST; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitOrientable.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitOrientable.java index 786b706ae..a6b8930e3 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitOrientable.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitOrientable.java @@ -1,6 +1,6 @@ package com.dfsek.terra.bukkit.world.block.data; -import com.dfsek.terra.api.block.Axis; +import com.dfsek.terra.api.block.data.properties.enums.Axis; import com.dfsek.terra.api.block.data.Orientable; import com.dfsek.terra.bukkit.world.BukkitAdapter; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRail.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRail.java index 2f863da3b..5a7439e6c 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRail.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRail.java @@ -1,6 +1,7 @@ package com.dfsek.terra.bukkit.world.block.data; import com.dfsek.terra.api.block.data.Rail; +import com.dfsek.terra.api.block.data.properties.enums.RailShape; import com.dfsek.terra.bukkit.world.BukkitAdapter; public class BukkitRail extends BukkitBlockState implements Rail { @@ -9,12 +10,12 @@ public class BukkitRail extends BukkitBlockState implements Rail { } @Override - public Shape getShape() { + public RailShape getShape() { return BukkitAdapter.adapt(((org.bukkit.block.data.Rail) getHandle()).getShape()); } @Override - public void setShape(Shape newShape) { + public void setShape(RailShape newShape) { ((org.bukkit.block.data.Rail) getHandle()).setShape(BukkitAdapter.adapt(newShape)); } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricOrientable.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricOrientable.java index 566daa696..03766974a 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricOrientable.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricOrientable.java @@ -1,6 +1,6 @@ package com.dfsek.terra.fabric.block.data; -import com.dfsek.terra.api.block.Axis; +import com.dfsek.terra.api.block.data.properties.enums.Axis; import com.dfsek.terra.api.block.data.Orientable; import com.dfsek.terra.fabric.block.FabricBlockState; import com.dfsek.terra.fabric.util.FabricAdapter; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricAdapter.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricAdapter.java index eb47630c2..abcb75e79 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricAdapter.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricAdapter.java @@ -1,6 +1,6 @@ package com.dfsek.terra.fabric.util; -import com.dfsek.terra.api.block.Axis; +import com.dfsek.terra.api.block.data.properties.enums.Axis; import com.dfsek.terra.api.block.BlockFace; import com.dfsek.terra.api.block.data.Bisected; import com.dfsek.terra.api.block.data.Slab;