75 lines
4.3 KiB
Diff
75 lines
4.3 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: TwoLeggedCat <80929284+TwoLeggedCat@users.noreply.github.com>
|
|
Date: Sat, 29 May 2021 14:33:25 -0500
|
|
Subject: [PATCH] Add more line of sight methods
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
index 60a7f238c721551e00f2eb60990a5d9743a8a3a7..e946981ccb07c94072f9470d1b8a00d0f9b6778b 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
@@ -3423,6 +3423,7 @@ public abstract class LivingEntity extends Entity {
|
|
Vec3 vec3d = new Vec3(this.getX(), this.getEyeY(), this.getZ());
|
|
Vec3 vec3d1 = new Vec3(entity.getX(), entity.getEyeY(), entity.getZ());
|
|
|
|
+ // Paper - diff on change - used in CraftLivingEntity#hasLineOfSight(Location) and CraftWorld#lineOfSightExists
|
|
return vec3d1.distanceTo(vec3d) > 128.0D ? false : this.level.clip(new ClipContext(vec3d, vec3d1, ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, this)).getType() == HitResult.Type.MISS;
|
|
}
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
|
index fb90250f1b61c34a0a88bf50bc5b5bae09de9f0e..88635209d1c6598dc62804ad01e9ebbf039435f9 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
|
|
@@ -330,6 +330,18 @@ public class CraftWorld implements World {
|
|
public io.papermc.paper.world.MoonPhase getMoonPhase() {
|
|
return io.papermc.paper.world.MoonPhase.getPhase(getFullTime() / 24000L);
|
|
}
|
|
+
|
|
+ @Override
|
|
+ public boolean lineOfSightExists(Location from, Location to) {
|
|
+ Validate.notNull(from, "from parameter in lineOfSightExists cannot be null");
|
|
+ Validate.notNull(to, "to parameter in lineOfSightExists cannot be null");
|
|
+ if (from.getWorld() != to.getWorld()) return false;
|
|
+ Vec3 vec3d = new Vec3(from.getX(), from.getY(), from.getZ());
|
|
+ Vec3 vec3d1 = new Vec3(to.getX(), to.getY(), to.getZ());
|
|
+ if (vec3d1.distanceTo(vec3d) > 128.0D) return false;
|
|
+
|
|
+ return this.getHandle().clip(new ClipContext(vec3d, vec3d1, ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, null)).getType() == HitResult.Type.MISS;
|
|
+ }
|
|
// Paper end
|
|
|
|
private static final Random rand = new Random();
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
|
|
index 526beeac806d65c53c117be7702ce6cc3c6ec1c1..53b61b609361c305fb8d1f1a8700e81ce139fde4 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
|
|
@@ -29,6 +29,9 @@ import net.minecraft.world.entity.projectile.ThrownEgg;
|
|
import net.minecraft.world.entity.projectile.ThrownEnderpearl;
|
|
import net.minecraft.world.entity.projectile.ThrownExperienceBottle;
|
|
import net.minecraft.world.entity.projectile.ThrownTrident;
|
|
+import net.minecraft.world.level.ClipContext;
|
|
+import net.minecraft.world.phys.HitResult;
|
|
+import net.minecraft.world.phys.Vec3;
|
|
import org.apache.commons.lang.Validate;
|
|
import org.bukkit.FluidCollisionMode;
|
|
import org.bukkit.Location;
|
|
@@ -541,6 +544,18 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
|
|
return this.getHandle().hasLineOfSight(((CraftEntity) other).getHandle());
|
|
}
|
|
|
|
+ // Paper start
|
|
+ @Override
|
|
+ public boolean hasLineOfSight(Location loc) {
|
|
+ if (this.getHandle().level != ((CraftWorld) loc.getWorld()).getHandle()) return false;
|
|
+ Vec3 vec3d = new Vec3(this.getHandle().getX(), this.getHandle().getEyeY(), this.getHandle().getZ());
|
|
+ Vec3 vec3d1 = new Vec3(loc.getX(), loc.getY(), loc.getZ());
|
|
+ if (vec3d1.distanceTo(vec3d) > 128.0D) return false;
|
|
+
|
|
+ return this.getHandle().level.clip(new ClipContext(vec3d, vec3d1, ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, this.getHandle())).getType() == HitResult.Type.MISS;
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
@Override
|
|
public boolean getRemoveWhenFarAway() {
|
|
return this.getHandle() instanceof Mob && !((Mob) this.getHandle()).persistenceRequired;
|