aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0253-Add-LivingEntity-getTargetEntity.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0253-Add-LivingEntity-getTargetEntity.patch')
-rw-r--r--patches/server/0253-Add-LivingEntity-getTargetEntity.patch108
1 files changed, 108 insertions, 0 deletions
diff --git a/patches/server/0253-Add-LivingEntity-getTargetEntity.patch b/patches/server/0253-Add-LivingEntity-getTargetEntity.patch
new file mode 100644
index 0000000000..f75a1b66aa
--- /dev/null
+++ b/patches/server/0253-Add-LivingEntity-getTargetEntity.patch
@@ -0,0 +1,108 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: BillyGalbreath <[email protected]>
+Date: Sat, 22 Sep 2018 00:33:08 -0500
+Subject: [PATCH] Add LivingEntity#getTargetEntity
+
+
+diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
+index 279fa00fd9043e1995f22c79f47d0b41c27bd933..43eddcd8496ff2f089119f6632acfe1b56466c3d 100644
+--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
++++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
+@@ -127,6 +127,7 @@ import net.minecraft.world.level.storage.loot.LootTable;
+ import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets;
+ import net.minecraft.world.level.storage.loot.parameters.LootContextParams;
+ import net.minecraft.world.phys.AABB;
++import net.minecraft.world.phys.EntityHitResult;
+ import net.minecraft.world.phys.HitResult;
+ import net.minecraft.world.phys.Vec3;
+ import net.minecraft.world.scores.PlayerTeam;
+@@ -4041,6 +4042,38 @@ public abstract class LivingEntity extends Entity implements Attackable {
+ return this.level().clip(raytrace);
+ }
+
++ public @Nullable EntityHitResult getTargetEntity(int maxDistance) {
++ if (maxDistance < 1 || maxDistance > 120) {
++ throw new IllegalArgumentException("maxDistance must be between 1-120");
++ }
++
++ Vec3 start = this.getEyePosition(1.0F);
++ Vec3 direction = this.getLookAngle();
++ Vec3 end = start.add(direction.x * maxDistance, direction.y * maxDistance, direction.z * maxDistance);
++
++ List<Entity> entityList = this.level().getEntities(this, getBoundingBox().expandTowards(direction.x * maxDistance, direction.y * maxDistance, direction.z * maxDistance).inflate(1.0D, 1.0D, 1.0D), EntitySelector.NO_SPECTATORS.and(Entity::isPickable));
++
++ double distance = 0.0D;
++ EntityHitResult result = null;
++
++ for (Entity entity : entityList) {
++ final double inflationAmount = (double) entity.getPickRadius();
++ AABB aabb = entity.getBoundingBox().inflate(inflationAmount, inflationAmount, inflationAmount);
++ Optional<Vec3> rayTraceResult = aabb.clip(start, end);
++
++ if (rayTraceResult.isPresent()) {
++ Vec3 rayTrace = rayTraceResult.get();
++ double distanceTo = start.distanceToSqr(rayTrace);
++ if (distanceTo < distance || distance == 0.0D) {
++ result = new EntityHitResult(entity, rayTrace);
++ distance = distanceTo;
++ }
++ }
++ }
++
++ return result;
++ }
++
+ public int shieldBlockingDelay = this.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 f58c9edd68b02bbca10897320fae63cee1562fe3..9a159f0c7489d2924dabe3fd250d844899ae5761 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
+@@ -1,5 +1,6 @@
+ package org.bukkit.craftbukkit.entity;
+
++import com.destroystokyo.paper.entity.TargetEntityInfo;
+ import com.google.common.base.Preconditions;
+ import com.google.common.collect.Sets;
+ import java.util.ArrayList;
+@@ -226,6 +227,39 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
+ }
+ return null;
+ }
++
++ public Entity getTargetEntity(int maxDistance, boolean ignoreBlocks) {
++ net.minecraft.world.phys.EntityHitResult rayTrace = rayTraceEntity(maxDistance, ignoreBlocks);
++ return rayTrace == null ? null : rayTrace.getEntity().getBukkitEntity();
++ }
++
++ public TargetEntityInfo getTargetEntityInfo(int maxDistance, boolean ignoreBlocks) {
++ net.minecraft.world.phys.EntityHitResult rayTrace = rayTraceEntity(maxDistance, ignoreBlocks);
++ return rayTrace == null ? null : new TargetEntityInfo(rayTrace.getEntity().getBukkitEntity(), new org.bukkit.util.Vector(rayTrace.getLocation().x, rayTrace.getLocation().y, rayTrace.getLocation().z));
++ }
++
++ @Override
++ public RayTraceResult rayTraceEntities(int maxDistance, boolean ignoreBlocks) {
++ net.minecraft.world.phys.EntityHitResult rayTrace = this.rayTraceEntity(maxDistance, ignoreBlocks);
++ return rayTrace == null ? null : new org.bukkit.util.RayTraceResult(org.bukkit.craftbukkit.util.CraftVector.toBukkit(rayTrace.getLocation()), rayTrace.getEntity().getBukkitEntity());
++ }
++
++ public net.minecraft.world.phys.EntityHitResult rayTraceEntity(int maxDistance, boolean ignoreBlocks) {
++ net.minecraft.world.phys.EntityHitResult rayTrace = getHandle().getTargetEntity(maxDistance);
++ if (rayTrace == null) {
++ return null;
++ }
++ if (!ignoreBlocks) {
++ net.minecraft.world.phys.HitResult rayTraceBlocks = getHandle().getRayTrace(maxDistance, net.minecraft.world.level.ClipContext.Fluid.NONE);
++ if (rayTraceBlocks != null) {
++ net.minecraft.world.phys.Vec3 eye = getHandle().getEyePosition(1.0F);
++ if (eye.distanceToSqr(rayTraceBlocks.getLocation()) <= eye.distanceToSqr(rayTrace.getLocation())) {
++ return null;
++ }
++ }
++ }
++ return rayTrace;
++ }
+ // Paper end
+
+ @Override