aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0254-Add-ray-tracing-methods-to-LivingEntity.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0254-Add-ray-tracing-methods-to-LivingEntity.patch')
-rw-r--r--patches/server/0254-Add-ray-tracing-methods-to-LivingEntity.patch90
1 files changed, 90 insertions, 0 deletions
diff --git a/patches/server/0254-Add-ray-tracing-methods-to-LivingEntity.patch b/patches/server/0254-Add-ray-tracing-methods-to-LivingEntity.patch
new file mode 100644
index 0000000000..08c18ed736
--- /dev/null
+++ b/patches/server/0254-Add-ray-tracing-methods-to-LivingEntity.patch
@@ -0,0 +1,90 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: BillyGalbreath <[email protected]>
+Date: Mon, 3 Sep 2018 18:20:03 -0500
+Subject: [PATCH] Add ray tracing methods to LivingEntity
+
+
+diff --git a/src/main/java/net/minecraft/server/MCUtil.java b/src/main/java/net/minecraft/server/MCUtil.java
+index e98276943e1690572b8f7bc54a259aa8340bae41..c9b43d077727c22a9eca738e9a75e7f1a6a5a9ee 100644
+--- a/src/main/java/net/minecraft/server/MCUtil.java
++++ b/src/main/java/net/minecraft/server/MCUtil.java
+@@ -509,6 +509,18 @@ public final class MCUtil {
+ return getNMSWorld(entity.getWorld());
+ }
+
++ public static ClipContext.Fluid getNMSFluidCollisionOption(com.destroystokyo.paper.block.TargetBlockInfo.FluidMode fluidMode) {
++ switch (fluidMode) {
++ case NEVER:
++ return ClipContext.Fluid.NONE;
++ case SOURCE_ONLY:
++ return ClipContext.Fluid.SOURCE_ONLY;
++ case ALWAYS:
++ return ClipContext.Fluid.ANY;
++ }
++ return null;
++ }
++
+ public static BlockFace toBukkitBlockFace(Direction enumDirection) {
+ switch (enumDirection) {
+ case DOWN:
+diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
+index 84b6c2f73e0f6f3ad3969e7d51f6617e172764ec..a6010e8ddf640a7045f95be04dfce26918d9cd3e 100644
+--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
++++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
+@@ -3743,6 +3743,23 @@ public abstract class LivingEntity extends Entity {
+ }
+
+ // Paper start
++ public HitResult getRayTrace(int maxDistance) {
++ return getRayTrace(maxDistance, ClipContext.Fluid.NONE);
++ }
++
++ public HitResult getRayTrace(int maxDistance, ClipContext.Fluid fluidCollisionOption) {
++ if (maxDistance < 1 || maxDistance > 120) {
++ throw new IllegalArgumentException("maxDistance must be between 1-120");
++ }
++
++ Vec3 start = new Vec3(getX(), getY() + getEyeHeight(), getZ());
++ org.bukkit.util.Vector dir = getBukkitEntity().getLocation().getDirection().multiply(maxDistance);
++ Vec3 end = new Vec3(start.x + dir.getX(), start.y + dir.getY(), start.z + dir.getZ());
++ ClipContext raytrace = new ClipContext(start, end, ClipContext.Block.OUTLINE, fluidCollisionOption, this);
++
++ return level.clip(raytrace);
++ }
++
+ public int shieldBlockingDelay = level.paperConfig().misc.shieldBlockingDelay;
+
+ public int getShieldBlockingDelay() {
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
+index 04829ced2048b07aa4b2dcf98a601d1fdd9431fb..40e777b859151d036ac7ec4e71ed896df4cd689b 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
+@@ -200,6 +200,28 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
+ return blocks.get(0);
+ }
+
++ // Paper start
++ @Override
++ public Block getTargetBlock(int maxDistance, com.destroystokyo.paper.block.TargetBlockInfo.FluidMode fluidMode) {
++ net.minecraft.world.phys.HitResult rayTrace = getHandle().getRayTrace(maxDistance, net.minecraft.server.MCUtil.getNMSFluidCollisionOption(fluidMode));
++ return !(rayTrace instanceof net.minecraft.world.phys.BlockHitResult) ? null : org.bukkit.craftbukkit.block.CraftBlock.at(getHandle().level, ((net.minecraft.world.phys.BlockHitResult)rayTrace).getBlockPos());
++ }
++
++ @Override
++ public org.bukkit.block.BlockFace getTargetBlockFace(int maxDistance, com.destroystokyo.paper.block.TargetBlockInfo.FluidMode fluidMode) {
++ net.minecraft.world.phys.HitResult rayTrace = getHandle().getRayTrace(maxDistance, net.minecraft.server.MCUtil.getNMSFluidCollisionOption(fluidMode));
++ return !(rayTrace instanceof net.minecraft.world.phys.BlockHitResult) ? null : net.minecraft.server.MCUtil.toBukkitBlockFace(((net.minecraft.world.phys.BlockHitResult)rayTrace).getDirection());
++ }
++
++ @Override
++ public com.destroystokyo.paper.block.TargetBlockInfo getTargetBlockInfo(int maxDistance, com.destroystokyo.paper.block.TargetBlockInfo.FluidMode fluidMode) {
++ net.minecraft.world.phys.HitResult rayTrace = getHandle().getRayTrace(maxDistance, net.minecraft.server.MCUtil.getNMSFluidCollisionOption(fluidMode));
++ return !(rayTrace instanceof net.minecraft.world.phys.BlockHitResult) ? null :
++ new com.destroystokyo.paper.block.TargetBlockInfo(org.bukkit.craftbukkit.block.CraftBlock.at(getHandle().level, ((net.minecraft.world.phys.BlockHitResult)rayTrace).getBlockPos()),
++ net.minecraft.server.MCUtil.toBukkitBlockFace(((net.minecraft.world.phys.BlockHitResult)rayTrace).getDirection()));
++ }
++ // Paper end
++
+ @Override
+ public List<Block> getLastTwoTargetBlocks(Set<Material> transparent, int maxDistance) {
+ return this.getLineOfSight(transparent, maxDistance, 2);