summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/bukkit/block/Structure.java232
-rw-r--r--src/main/java/org/bukkit/block/structure/Mirror.java27
-rw-r--r--src/main/java/org/bukkit/block/structure/StructureRotation.java26
-rw-r--r--src/main/java/org/bukkit/block/structure/UsageMode.java29
4 files changed, 312 insertions, 2 deletions
diff --git a/src/main/java/org/bukkit/block/Structure.java b/src/main/java/org/bukkit/block/Structure.java
index 4cbfc7bb..eb7a5363 100644
--- a/src/main/java/org/bukkit/block/Structure.java
+++ b/src/main/java/org/bukkit/block/Structure.java
@@ -1,6 +1,234 @@
package org.bukkit.block;
+import org.bukkit.block.structure.Mirror;
+import org.bukkit.block.structure.StructureRotation;
+import org.bukkit.block.structure.UsageMode;
+import org.bukkit.entity.LivingEntity;
+import org.bukkit.util.BlockVector;
+
/**
- * Represents a captured state of structure block.
+ * Represents a structure block that can save and load blocks from a file. They
+ * can only be used by OPs, and are not obtainable in survival.
*/
-public interface Structure extends BlockState {}
+public interface Structure extends BlockState {
+
+ /**
+ * The name of this structure.
+ *
+ * @return structure name
+ */
+ String getStructureName();
+
+ /**
+ * Set the name of this structure. This is case-sensitive. The name of the
+ * structure in the {@link UsageMode#SAVE} structure block MUST match the
+ * name within the {@link UsageMode#CORNER} block or the size calculation
+ * will fail.
+ *
+ * @param name the case-sensitive name of this structure
+ */
+ void setStructureName(String name);
+
+ /**
+ * Get the name of who created this structure.
+ *
+ * @return the name of whoever created this structure.
+ */
+ String getAuthor();
+
+ /**
+ * Set the name of whoever created this structure.
+ *
+ * @param author whoever created this structure
+ */
+ void setAuthor(String author);
+
+ /**
+ * Set the name of whoever created this structure using a
+ * {@link LivingEntity}.
+ *
+ * @param livingEntity the entity who created this structure
+ */
+ void setAuthor(LivingEntity livingEntity);
+
+ /**
+ * The relative position of the structure outline based on the position of
+ * the structure block. Maximum allowed distance is 32 blocks in any
+ * direction.
+ *
+ * @return a Location which contains the relative distance this structure is
+ * from the structure block.
+ */
+ BlockVector getRelativePosition();
+
+ /**
+ * Set the relative position from the structure block. Maximum allowed
+ * distance is 32 blocks in any direction.
+ *
+ * @param vector the {@link BlockVector} containing the relative origin
+ * coordinates of this structure.
+ */
+ void setRelativePosition(BlockVector vector);
+
+ /**
+ * The distance to the opposite corner of this structure. The maximum
+ * structure size is 32x32x32. When a structure has successfully been
+ * calculated (i.e. it is within the maximum allowed distance) a white
+ * border surrounds the structure.
+ *
+ * @return a {@link BlockVector} which contains the total size of the
+ * structure.
+ */
+ BlockVector getStructureSize();
+
+ /**
+ * Set the maximum size of this structure from the origin point. Maximum
+ * allowed size is 32x32x32.
+ *
+ * @param vector the {@link BlockVector} containing the size of this
+ * structure, based off of the origin coordinates.
+ */
+ void setStructureSize(BlockVector vector);
+
+ /**
+ * Sets the mirroring of the structure.
+ *
+ * @param mirror the new mirroring method
+ */
+ void setMirror(Mirror mirror);
+
+ /**
+ * How this structure is mirrored.
+ *
+ * @return the current mirroring method
+ */
+ Mirror getMirror();
+
+ /**
+ * Set how this structure is rotated.
+ *
+ * @param rotation the new rotation
+ */
+ void setRotation(StructureRotation rotation);
+
+ /**
+ * Get how this structure is rotated.
+ *
+ * @return the new rotation
+ */
+ StructureRotation getRotation();
+
+ /**
+ * Set the {@link UsageMode} of this structure block.
+ *
+ * @param mode the new mode to set.
+ */
+ void setUsageMode(UsageMode mode);
+
+ /**
+ * Get the {@link UsageMode} of this structure block.
+ *
+ * @return the mode this block is currently in.
+ */
+ UsageMode getUsageMode();
+
+ /**
+ * While in {@link UsageMode#SAVE} mode, this will ignore any entities when
+ * saving the structure.
+ * <br>
+ * While in {@link UsageMode#LOAD} mode this will ignore any entities that
+ * were saved to file.
+ *
+ * @param ignoreEntities the flag to set
+ */
+ void setIgnoreEntities(boolean ignoreEntities);
+
+ /**
+ * Get if this structure block should ignore entities.
+ *
+ * @return true if the appropriate {@link UsageMode} should ignore entities.
+ */
+ boolean isIgnoreEntities();
+
+ /**
+ * Set if the structure outline should show air blocks.
+ *
+ * @param showAir if the structure block should show air blocks
+ */
+ void setShowAir(boolean showAir);
+
+ /**
+ * Check if this structure block is currently showing all air blocks
+ *
+ * @return true if the structure block is showing all air blocks
+ */
+ boolean isShowAir();
+
+ /**
+ * Set if this structure box should show the bounding box.
+ *
+ * @param showBoundingBox if the structure box should be shown
+ */
+ void setBoundingBoxVisible(boolean showBoundingBox);
+
+ /**
+ * Get if this structure block is currently showing the bounding box.
+ *
+ * @return true if the bounding box is shown
+ */
+ boolean isBoundingBoxVisible();
+
+ /**
+ * Set the integrity of the structure. Integrity must be between 0.0 and 1.0
+ * Lower integrity values will result in more blocks being removed when
+ * loading a structure. Integrity and {@link #getSeed()} are used together
+ * to determine which blocks are randomly removed to mimic "decay."
+ *
+ * @param integrity the integrity of this structure
+ */
+ void setIntegrity(float integrity);
+
+ /**
+ * Get the integrity of this structure.
+ *
+ * @return the integrity of this structure
+ */
+ float getIntegrity();
+
+ /**
+ * The seed used to determine which blocks will be removed upon loading.
+ * {@link #getIntegrity()} and seed are used together to determine which
+ * blocks are randomly removed to mimic "decay."
+ *
+ * @param seed the seed used to determine how many blocks will be removed
+ */
+ void setSeed(long seed);
+
+ /**
+ * The seed used to determine how many blocks are removed upon loading of
+ * this structure.
+ *
+ * @return the seed used
+ */
+ long getSeed();
+
+ /**
+ * Only applicable while in {@link UsageMode#DATA}. Metadata are specific
+ * functions that can be applied to the structure location. Consult the
+ * <a href="https://minecraft.gamepedia.com/Structure_Block#Data">Minecraft
+ * wiki</a> for more information.
+ *
+ * @param metadata the function to perform on the selected location
+ */
+ void setMetadata(String metadata);
+
+ /**
+ * Get the metadata function this structure block will perform when
+ * activated. Consult the
+ * <a href="https://minecraft.gamepedia.com/Structure_Block#Data">Minecraft
+ * Wiki</a> for more information.
+ *
+ * @return the function that will be performed when this block is activated
+ */
+ String getMetadata();
+}
diff --git a/src/main/java/org/bukkit/block/structure/Mirror.java b/src/main/java/org/bukkit/block/structure/Mirror.java
new file mode 100644
index 00000000..86e812a1
--- /dev/null
+++ b/src/main/java/org/bukkit/block/structure/Mirror.java
@@ -0,0 +1,27 @@
+package org.bukkit.block.structure;
+
+/**
+ * Represents how a {@link org.bukkit.block.Structure} can be mirrored upon
+ * being loaded.
+ */
+public enum Mirror {
+
+ /**
+ * No mirroring.
+ * <br>
+ * Positive X to Positive Z
+ */
+ NONE,
+ /**
+ * Structure is mirrored left to right.
+ * <br>
+ * Similar to looking in a mirror. Positive X to Negative Z
+ */
+ LEFT_RIGHT,
+ /**
+ * Structure is mirrored front to back.
+ * <br>
+ * Positive Z to Negative X
+ */
+ FRONT_BACK;
+}
diff --git a/src/main/java/org/bukkit/block/structure/StructureRotation.java b/src/main/java/org/bukkit/block/structure/StructureRotation.java
new file mode 100644
index 00000000..0d0bfca4
--- /dev/null
+++ b/src/main/java/org/bukkit/block/structure/StructureRotation.java
@@ -0,0 +1,26 @@
+package org.bukkit.block.structure;
+
+/**
+ * Represents how a {@link org.bukkit.block.Structure} can be rotated.
+ */
+public enum StructureRotation {
+
+ /**
+ * No rotation.
+ */
+ NONE,
+ /**
+ * Rotated clockwise 90 degrees.
+ */
+ CLOCKWISE_90,
+ /**
+ * Rotated clockwise 180 degrees.
+ */
+ CLOCKWISE_180,
+ /**
+ * Rotated counter clockwise 90 degrees.
+ * <br>
+ * Equivalent to rotating clockwise 270 degrees.
+ */
+ COUNTERCLOCKWISE_90;
+}
diff --git a/src/main/java/org/bukkit/block/structure/UsageMode.java b/src/main/java/org/bukkit/block/structure/UsageMode.java
new file mode 100644
index 00000000..cbea3f38
--- /dev/null
+++ b/src/main/java/org/bukkit/block/structure/UsageMode.java
@@ -0,0 +1,29 @@
+package org.bukkit.block.structure;
+
+/**
+ * Represents how a {@link org.bukkit.block.Structure} can be used.
+ */
+public enum UsageMode {
+
+ /**
+ * The mode used when saving a structure.
+ */
+ SAVE,
+ /**
+ * The mode used when loading a structure.
+ */
+ LOAD,
+ /**
+ * Used when saving a structure for easy size calculation. When using this
+ * mode, the Structure name MUST match the name in the second Structure
+ * block that is in {@link UsageMode#SAVE}.
+ */
+ CORNER,
+ /**
+ * Used to run specific custom functions, which can only be used for certain
+ * Structures. The structure block is removed after this function completes.
+ * The data tags (functions) can be found on the
+ * <a href="http://minecraft.gamepedia.com/Structure_Block#Data">wiki</a>.
+ */
+ DATA;
+}