aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0583-Line-Of-Sight-Changes.patch
blob: b8bd894c7466c2fb16587bff89179ef7a7116a6a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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] Line Of Sight Changes


diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
index 297fb36316df04903bd083af523c6b35c284ac7b..cedd1f8063504cc58b2735a8d53a3c39a605bf5f 100644
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
@@ -3606,7 +3606,8 @@ public abstract class LivingEntity extends Entity implements Attackable {
             Vec3 vec3d = new Vec3(this.getX(), this.getEyeY(), this.getZ());
             Vec3 vec3d1 = new Vec3(entity.getX(), entity.getEyeY(), entity.getZ());
 
-            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;
+            // Paper - diff on change - used in CraftLivingEntity#hasLineOfSight(Location) and CraftWorld#lineOfSightExists
+            return vec3d1.distanceToSqr(vec3d) > 128.0D * 128.0D ? false : this.level().clip(new ClipContext(vec3d, vec3d1, ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, this)).getType() == HitResult.Type.MISS; // Paper - Perf: Use distance squared
         }
     }
 
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java b/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java
index 9cd267f53505658d1c75187b662c4d9f68cd6bae..5f4958d28b6d79fe9e589e4794d9a7e8ab67c8b3 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java
@@ -510,5 +510,21 @@ public abstract class CraftRegionAccessor implements RegionAccessor {
     public org.bukkit.NamespacedKey getKey() {
         return org.bukkit.craftbukkit.util.CraftNamespacedKey.fromMinecraft(this.getHandle().getLevel().dimension().location());
     }
+
+    public boolean lineOfSightExists(Location from, Location to) {
+        Preconditions.checkArgument(from != null, "from parameter in lineOfSightExists cannot be null");
+        Preconditions.checkArgument(to != null, "to parameter in lineOfSightExists cannot be null");
+        if (from.getWorld() != to.getWorld()) {
+            return false;
+        }
+
+        net.minecraft.world.phys.Vec3 start = new net.minecraft.world.phys.Vec3(from.getX(), from.getY(), from.getZ());
+        net.minecraft.world.phys.Vec3 end = new net.minecraft.world.phys.Vec3(to.getX(), to.getY(), to.getZ());
+        if (end.distanceToSqr(start) > 128D * 128D) {
+            return false; // Return early if the distance is greater than 128 blocks
+        }
+
+        return this.getHandle().clip(new net.minecraft.world.level.ClipContext(start, end, net.minecraft.world.level.ClipContext.Block.COLLIDER, net.minecraft.world.level.ClipContext.Fluid.NONE, net.minecraft.world.phys.shapes.CollisionContext.empty())).getType() == net.minecraft.world.phys.HitResult.Type.MISS;
+    }
     // Paper end
 }
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
index 706c4b962837f0b881e7603ea736d364370ff36a..7ff701f2421ca766cc35580f1c93b24f8c843f10 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
@@ -586,6 +586,23 @@ 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;
+        }
+
+        net.minecraft.world.phys.Vec3 start = new net.minecraft.world.phys.Vec3(this.getHandle().getX(), this.getHandle().getEyeY(), this.getHandle().getZ());
+        net.minecraft.world.phys.Vec3 end = new net.minecraft.world.phys.Vec3(loc.getX(), loc.getY(), loc.getZ());
+        if (end.distanceToSqr(start) > 128D * 128D) {
+            return false; // Return early if the distance is greater than 128 blocks
+        }
+
+        return this.getHandle().level().clipDirect(start, end, net.minecraft.world.phys.shapes.CollisionContext.of(this.getHandle())) == net.minecraft.world.phys.HitResult.Type.MISS;
+    }
+    // Paper end
+
     @Override
     public boolean getRemoveWhenFarAway() {
         return this.getHandle() instanceof Mob && !((Mob) this.getHandle()).isPersistenceRequired();