From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: BillyGalbreath <Blake.Galbreath@GMail.com>
Date: Mon, 3 Sep 2018 18:13:53 -0500
Subject: [PATCH] Add ray tracing methods to LivingEntity


diff --git a/src/main/java/com/destroystokyo/paper/block/TargetBlockInfo.java b/src/main/java/com/destroystokyo/paper/block/TargetBlockInfo.java
new file mode 100644
index 0000000000000000000000000000000000000000..bb12061985cdffbacfa2d113beaa35b2c92df567
--- /dev/null
+++ b/src/main/java/com/destroystokyo/paper/block/TargetBlockInfo.java
@@ -0,0 +1,67 @@
+package com.destroystokyo.paper.block;
+
+import org.bukkit.FluidCollisionMode;
+import org.bukkit.block.Block;
+import org.bukkit.block.BlockFace;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Represents information about a targeted block
+ * @deprecated use {@link org.bukkit.util.RayTraceResult}
+ */
+@Deprecated(forRemoval = true, since = "1.19.3")
+public class TargetBlockInfo {
+    private final Block block;
+    private final BlockFace blockFace;
+
+    public TargetBlockInfo(@NotNull Block block, @NotNull BlockFace blockFace) {
+        this.block = block;
+        this.blockFace = blockFace;
+    }
+
+    /**
+     * Get the block that is targeted
+     *
+     * @return Targeted block
+     */
+    @NotNull
+    public Block getBlock() {
+        return block;
+    }
+
+    /**
+     * Get the targeted BlockFace
+     *
+     * @return Targeted blockface
+     */
+    @NotNull
+    public BlockFace getBlockFace() {
+        return blockFace;
+    }
+
+    /**
+     * Get the relative Block to the targeted block on the side it is targeted at
+     *
+     * @return Block relative to targeted block
+     */
+    @NotNull
+    public Block getRelativeBlock() {
+        return block.getRelative(blockFace);
+    }
+
+    /**
+     * @deprecated use {@link org.bukkit.FluidCollisionMode}
+     */
+    @Deprecated(forRemoval = true, since = "1.19.3")
+    public enum FluidMode {
+        NEVER(FluidCollisionMode.NEVER),
+        SOURCE_ONLY(FluidCollisionMode.SOURCE_ONLY),
+        ALWAYS(FluidCollisionMode.ALWAYS);
+
+        public final FluidCollisionMode bukkit;
+
+        FluidMode(FluidCollisionMode bukkit) {
+            this.bukkit = bukkit;
+        }
+    }
+}
diff --git a/src/main/java/org/bukkit/entity/LivingEntity.java b/src/main/java/org/bukkit/entity/LivingEntity.java
index f8eb5527b4e0520712f4d8c329ba9d5dc4a4d206..9ffa42e3d241dd209813cea993c8fcda72f1a935 100644
--- a/src/main/java/org/bukkit/entity/LivingEntity.java
+++ b/src/main/java/org/bukkit/entity/LivingEntity.java
@@ -85,6 +85,98 @@ public interface LivingEntity extends Attributable, Damageable, ProjectileSource
     @NotNull
     public Block getTargetBlock(@Nullable Set<Material> transparent, int maxDistance);
 
+    // Paper start
+    /**
+     * Gets the block that the living entity has targeted, ignoring fluids
+     *
+     * @param maxDistance this is the maximum distance to scan
+     * @return block that the living entity has targeted,
+     *     or null if no block is within maxDistance
+     * @deprecated use {@link #getTargetBlockExact(int)}
+     */
+    @Deprecated(forRemoval = true, since = "1.19.3")
+    @Nullable
+    public default Block getTargetBlock(int maxDistance) {
+        return getTargetBlock(maxDistance, com.destroystokyo.paper.block.TargetBlockInfo.FluidMode.NEVER);
+    }
+
+    /**
+     * Gets the block that the living entity has targeted
+     *
+     * @param maxDistance this is the maximum distance to scan
+     * @param fluidMode whether to check fluids or not
+     * @return block that the living entity has targeted,
+     *     or null if no block is within maxDistance
+     * @deprecated use {@link #getTargetBlockExact(int, FluidCollisionMode)}
+     */
+    @Deprecated(forRemoval = true, since = "1.19.3")
+    @Nullable
+    public Block getTargetBlock(int maxDistance, @NotNull com.destroystokyo.paper.block.TargetBlockInfo.FluidMode fluidMode);
+
+    /**
+     * Gets the blockface of that block that the living entity has targeted, ignoring fluids
+     *
+     * @param maxDistance this is the maximum distance to scan
+     * @return blockface of the block that the living entity has targeted,
+     *     or null if no block is targeted
+     */
+    @Nullable
+    public default org.bukkit.block.BlockFace getTargetBlockFace(int maxDistance) {
+        return getTargetBlockFace(maxDistance, org.bukkit.FluidCollisionMode.NEVER);
+    }
+
+    /**
+     * Gets the blockface of that block that the living entity has targeted
+     *
+     * @param maxDistance this is the maximum distance to scan
+     * @param fluidMode whether to check fluids or not
+     * @return blockface of the block that the living entity has targeted,
+     *     or null if no block is targeted
+     * @deprecated use {@link #getTargetBlockFace(int, FluidCollisionMode)}
+     */
+    @Deprecated(forRemoval = true, since = "1.19.3")
+    @Nullable
+    public org.bukkit.block.BlockFace getTargetBlockFace(int maxDistance, @NotNull com.destroystokyo.paper.block.TargetBlockInfo.FluidMode fluidMode);
+
+    /**
+     * Gets the blockface of that block that the living entity has targeted
+     *
+     * @param maxDistance this is the maximum distance to scan
+     * @param fluidMode whether to check fluids or not
+     * @return blockface of the block that the living entity has targeted,
+     *     or null if no block is targeted
+     */
+    @Nullable
+    public org.bukkit.block.BlockFace getTargetBlockFace(int maxDistance, @NotNull FluidCollisionMode fluidMode);
+
+    /**
+     * Gets information about the block the living entity has targeted, ignoring fluids
+     *
+     * @param maxDistance this is the maximum distance to scan
+     * @return TargetBlockInfo about the block the living entity has targeted,
+     *     or null if no block is targeted
+     * @deprecated use {@link #rayTraceBlocks(double)}
+     */
+    @Deprecated(forRemoval = true, since = "1.19.3")
+    @Nullable
+    public default com.destroystokyo.paper.block.TargetBlockInfo getTargetBlockInfo(int maxDistance) {
+        return getTargetBlockInfo(maxDistance, com.destroystokyo.paper.block.TargetBlockInfo.FluidMode.NEVER);
+    }
+
+    /**
+     * Gets information about the block the living entity has targeted
+     *
+     * @param maxDistance this is the maximum distance to scan
+     * @param fluidMode whether to check fluids or not
+     * @return TargetBlockInfo about the block the living entity has targeted,
+     *     or null if no block is targeted
+     * @deprecated use {@link #rayTraceBlocks(double, FluidCollisionMode)}
+     */
+    @Deprecated(forRemoval = true, since = "1.19.3")
+    @Nullable
+    public com.destroystokyo.paper.block.TargetBlockInfo getTargetBlockInfo(int maxDistance, @NotNull com.destroystokyo.paper.block.TargetBlockInfo.FluidMode fluidMode);
+    // Paper end
+
     /**
      * Gets the last two blocks along the living entity's line of sight.
      * <p>