diff --git a/paper-api/src/main/java/org/bukkit/entity/LivingEntity.java b/paper-api/src/main/java/org/bukkit/entity/LivingEntity.java
index 2bc90bef02..e9661e1916 100644
--- a/paper-api/src/main/java/org/bukkit/entity/LivingEntity.java
+++ b/paper-api/src/main/java/org/bukkit/entity/LivingEntity.java
@@ -5,6 +5,7 @@ import java.util.List;
import org.bukkit.Location;
import org.bukkit.block.Block;
+import org.bukkit.util.Callback;
/**
* Represents a living entity, such as a monster or player
@@ -47,6 +48,34 @@ public interface LivingEntity extends Entity {
*/
public Location getEyeLocation();
+ /**
+ * Gets all blocks along the player's line of sight
+ * List iterates from player's position to target inclusive
+ *
+ * @param callback Through every iteration it will call {@link Callback#call(Object)}. If set to/returns null
only air is considered transparent.
+ * @param maxDistance This is the maximum distance to scan. This may be further limited by the server, but never to less than 100 blocks.
+ * @return List containing all blocks along the player's line of sight
+ */
+ public List getLineOfSight(Callback callback, int maxDistance);
+
+ /**
+ * Gets the block that the player has targeted
+ *
+ * @param callback Through every iteration it will call {@link Callback#call(Object)}. If set to/returns null
only air is considered transparent.
+ * @param maxDistance This is the maximum distance to scan. This may be further limited by the server, but never to less than 100 blocks.
+ * @return Block that the player has targeted
+ */
+ public Block getTargetBlock(Callback callback, int maxDistance);
+
+ /**
+ * Gets the block that the player has targeted
+ *
+ * @param callback Through every iteration it will call {@link Callback#call(Object)}. If set to/returns null
only air is considered transparent.
+ * @param maxDistance This is the maximum distance to scan. This may be further limited by the server, but never to less than 100 blocks.
+ * @return Block that the player has targeted
+ */
+ public List getLastTwoTargetBlocks(Callback callback, int maxDistance);
+
/**
* Gets all blocks along the player's line of sight
* List iterates from player's position to target inclusive
diff --git a/paper-api/src/main/java/org/bukkit/util/Callback.java b/paper-api/src/main/java/org/bukkit/util/Callback.java
new file mode 100644
index 0000000000..8920532962
--- /dev/null
+++ b/paper-api/src/main/java/org/bukkit/util/Callback.java
@@ -0,0 +1,19 @@
+package org.bukkit.util;
+
+/**
+ * Primitive callback class, to allow specific callback handling. For example to determine if a block in sight is invisible.
+ *
+ * @param This is the type it will return.
+ * @param This is the type it has as parameter.
+ */
+public interface Callback {
+
+ /**
+ * This method will be called on each step.
+ *
+ * @param parameter The parameter of this step.
+ * @return The result of the step.
+ */
+ public Result call(Parameter parameter);
+
+}
diff --git a/paper-api/src/main/java/org/bukkit/util/TransparentCallback.java b/paper-api/src/main/java/org/bukkit/util/TransparentCallback.java
new file mode 100644
index 0000000000..28a8f0c477
--- /dev/null
+++ b/paper-api/src/main/java/org/bukkit/util/TransparentCallback.java
@@ -0,0 +1,34 @@
+package org.bukkit.util;
+
+import java.util.Set;
+
+import org.bukkit.block.Block;
+
+/**
+ * Default transparent call back. This class as callback acts like the normal
+ * line of sight methods.
+ *
+ * To implement own handler override {@link TransparentCallback#call(Block)} and
+ * call it via super.
+ */
+public class TransparentCallback implements Callback {
+
+ private final Set transparent;
+
+ /**
+ * Creates a new callback class which returns by default for every block in
+ * the transparent list true. Otherwise false. Could be expanded by override
+ * the {@link Callback#call(Block)} method.
+ *
+ * @param transparent
+ * The list of transparent blocks.
+ */
+ public TransparentCallback(Set transparent) {
+ this.transparent = transparent;
+ }
+
+ public Boolean call(Block parameter) {
+ return this.transparent.contains((byte) parameter.getTypeId());
+ }
+
+}