Mirror von
https://github.com/PaperMC/Paper.git
synchronisiert 2024-12-16 19:40:07 +01:00
243d2313b9
Upstream has released updates that appears to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: 323d6ca3 #535: Add EntityCategory API to LivingEntity 7d3323d8 #526: Add Block#applyBoneMeal() CraftBukkit Changes:bf451617
SPIGOT-6109: Improve loot handlingbfea4559
SPIGOT-6111: NPE in CraftHumanEntity#openWorkbench & CraftHumanEntity#openEnchantingee7116b4
Add note to CONTRIBUTING.md to suggest keeping commit messages / titles the sameeae15943
#721: Add EntityCategory API to LivingEntity8c611560
#702: Add Block#applyBoneMeal()8408de02
#716: Fix barrel open API playing sound twice74b6982b
#711: Add Full RGB support to the console
160 Zeilen
8.2 KiB
Diff
160 Zeilen
8.2 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: BillyGalbreath <Blake.Galbreath@GMail.com>
|
|
Date: Sat, 22 Sep 2018 00:33:08 -0500
|
|
Subject: [PATCH] Add LivingEntity#getTargetEntity
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/AxisAlignedBB.java b/src/main/java/net/minecraft/server/AxisAlignedBB.java
|
|
index 02c09f39848399a86d46bd17569b4f01a7b5ab1f..ed9b2f9adfecdc6d1b9925579ec510657adde11f 100644
|
|
--- a/src/main/java/net/minecraft/server/AxisAlignedBB.java
|
|
+++ b/src/main/java/net/minecraft/server/AxisAlignedBB.java
|
|
@@ -112,6 +112,7 @@ public class AxisAlignedBB {
|
|
return this.b(vec3d.x, vec3d.y, vec3d.z);
|
|
}
|
|
|
|
+ public final AxisAlignedBB expand(double x, double y, double z) { return b(x, y, z); } // Paper - OBFHELPER
|
|
public AxisAlignedBB b(double d0, double d1, double d2) {
|
|
double d3 = this.minX;
|
|
double d4 = this.minY;
|
|
@@ -141,6 +142,12 @@ public class AxisAlignedBB {
|
|
return new AxisAlignedBB(d3, d4, d5, d6, d7, d8);
|
|
}
|
|
|
|
+ // Paper start
|
|
+ public AxisAlignedBB grow(double d0) {
|
|
+ return grow(d0, d0, d0);
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
public AxisAlignedBB grow(double d0, double d1, double d2) {
|
|
double d3 = this.minX - d0;
|
|
double d4 = this.minY - d1;
|
|
@@ -200,6 +207,7 @@ public class AxisAlignedBB {
|
|
return this.minX < d3 && this.maxX > d0 && this.minY < d4 && this.maxY > d1 && this.minZ < d5 && this.maxZ > d2;
|
|
}
|
|
|
|
+ public final boolean contains(Vec3D vec3d) { return d(vec3d); } // Paper - OBFHELPER
|
|
public boolean d(Vec3D vec3d) {
|
|
return this.e(vec3d.x, vec3d.y, vec3d.z);
|
|
}
|
|
@@ -233,6 +241,7 @@ public class AxisAlignedBB {
|
|
return this.g(-d0);
|
|
}
|
|
|
|
+ public final Optional<Vec3D> calculateIntercept(Vec3D vec3d, Vec3D vec3d1) { return b(vec3d, vec3d1); } // Paper - OBFHELPER
|
|
public Optional<Vec3D> b(Vec3D vec3d, Vec3D vec3d1) {
|
|
double[] adouble = new double[]{1.0D};
|
|
double d0 = vec3d1.x - vec3d.x;
|
|
diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
|
|
index 915378493d9c5bb501b21eb7aca380580716f4c3..8832ffc0fcf9410ecc07ac100c2c8e3cd4dbddff 100644
|
|
--- a/src/main/java/net/minecraft/server/Entity.java
|
|
+++ b/src/main/java/net/minecraft/server/Entity.java
|
|
@@ -1419,6 +1419,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
|
|
return this.c(f - 90.0F, f1);
|
|
}
|
|
|
|
+ public final Vec3D getEyePosition(float partialTicks) { return j(partialTicks); } // Paper - OBFHELPER
|
|
public final Vec3D j(float f) {
|
|
if (f == 1.0F) {
|
|
return new Vec3D(this.locX(), this.getHeadY(), this.locZ());
|
|
@@ -2056,6 +2057,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
|
|
return this.getPassengers().size() < 1;
|
|
}
|
|
|
|
+ public final float getCollisionBorderSize() { return bf(); } // Paper - OBFHELPER
|
|
public float bf() {
|
|
return 0.0F;
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java
|
|
index 7c239b95c9f8dfa76d397979e6b3fdcc9ff55022..aecb5ca746be20e31f047a68f729d5c5a3699140 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityLiving.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityLiving.java
|
|
@@ -3514,6 +3514,37 @@ public abstract class EntityLiving extends Entity {
|
|
return world.rayTrace(raytrace);
|
|
}
|
|
|
|
+ public MovingObjectPositionEntity getTargetEntity(int maxDistance) {
|
|
+ if (maxDistance < 1 || maxDistance > 120) {
|
|
+ throw new IllegalArgumentException("maxDistance must be between 1-120");
|
|
+ }
|
|
+
|
|
+ Vec3D start = this.getEyePosition(1.0F);
|
|
+ Vec3D direction = this.getLookDirection();
|
|
+ Vec3D end = start.add(direction.x * maxDistance, direction.y * maxDistance, direction.z * maxDistance);
|
|
+
|
|
+ List<Entity> entityList = world.getEntities(this, getBoundingBox().expand(direction.x * maxDistance, direction.y * maxDistance, direction.z * maxDistance).grow(1.0D, 1.0D, 1.0D), IEntitySelector.notSpectator().and(Entity::isInteractable));
|
|
+
|
|
+ double distance = 0.0D;
|
|
+ MovingObjectPositionEntity result = null;
|
|
+
|
|
+ for (Entity entity : entityList) {
|
|
+ AxisAlignedBB aabb = entity.getBoundingBox().grow((double) entity.getCollisionBorderSize());
|
|
+ Optional<Vec3D> rayTraceResult = aabb.calculateIntercept(start, end);
|
|
+
|
|
+ if (rayTraceResult.isPresent()) {
|
|
+ Vec3D rayTrace = rayTraceResult.get();
|
|
+ double distanceTo = start.distanceSquared(rayTrace);
|
|
+ if (distanceTo < distance || distance == 0.0D) {
|
|
+ result = new MovingObjectPositionEntity(entity, rayTrace);
|
|
+ distance = distanceTo;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ return result;
|
|
+ }
|
|
+
|
|
public int shieldBlockingDelay = world.paperConfig.shieldBlockingDelay;
|
|
|
|
public int getShieldBlockingDelay() {
|
|
diff --git a/src/main/java/net/minecraft/server/IEntitySelector.java b/src/main/java/net/minecraft/server/IEntitySelector.java
|
|
index b88a99221933108141b558adef6aa91f0cedc136..c13bb708ccd14c3848afbc9afaf6439c1a574f22 100644
|
|
--- a/src/main/java/net/minecraft/server/IEntitySelector.java
|
|
+++ b/src/main/java/net/minecraft/server/IEntitySelector.java
|
|
@@ -18,6 +18,7 @@ public final class IEntitySelector {
|
|
public static final Predicate<Entity> e = (entity) -> {
|
|
return !(entity instanceof EntityHuman) || !entity.isSpectator() && !((EntityHuman) entity).isCreative();
|
|
};
|
|
+ public static Predicate<Entity> notSpectator() { return f; } // Paper - OBFHELPER
|
|
public static final Predicate<Entity> f = (entity) -> {
|
|
return !(entity instanceof EntityHuman) || !entity.isSpectator() && !((EntityHuman) entity).isCreative() && entity.world.getDifficulty() != EnumDifficulty.PEACEFUL;
|
|
};
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
|
|
index 63f46a4c6fda5a08f89d68da879ce4ad83056cf5..607f0bca1ca454bd60aad82df81702bf15e0ff4a 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
|
|
@@ -221,6 +221,33 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
|
|
new com.destroystokyo.paper.block.TargetBlockInfo(org.bukkit.craftbukkit.block.CraftBlock.at(getHandle().world, ((net.minecraft.server.MovingObjectPositionBlock)rayTrace).getBlockPosition()),
|
|
net.minecraft.server.MCUtil.toBukkitBlockFace(((net.minecraft.server.MovingObjectPositionBlock)rayTrace).getDirection()));
|
|
}
|
|
+
|
|
+ public Entity getTargetEntity(int maxDistance, boolean ignoreBlocks) {
|
|
+ net.minecraft.server.MovingObjectPositionEntity rayTrace = rayTraceEntity(maxDistance, ignoreBlocks);
|
|
+ return rayTrace == null ? null : rayTrace.getEntity().getBukkitEntity();
|
|
+ }
|
|
+
|
|
+ public com.destroystokyo.paper.entity.TargetEntityInfo getTargetEntityInfo(int maxDistance, boolean ignoreBlocks) {
|
|
+ net.minecraft.server.MovingObjectPositionEntity rayTrace = rayTraceEntity(maxDistance, ignoreBlocks);
|
|
+ return rayTrace == null ? null : new com.destroystokyo.paper.entity.TargetEntityInfo(rayTrace.getEntity().getBukkitEntity(), new org.bukkit.util.Vector(rayTrace.getPos().x, rayTrace.getPos().y, rayTrace.getPos().z));
|
|
+ }
|
|
+
|
|
+ public net.minecraft.server.MovingObjectPositionEntity rayTraceEntity(int maxDistance, boolean ignoreBlocks) {
|
|
+ net.minecraft.server.MovingObjectPositionEntity rayTrace = getHandle().getTargetEntity(maxDistance);
|
|
+ if (rayTrace == null) {
|
|
+ return null;
|
|
+ }
|
|
+ if (!ignoreBlocks) {
|
|
+ net.minecraft.server.MovingObjectPosition rayTraceBlocks = getHandle().getRayTrace(maxDistance, net.minecraft.server.RayTrace.FluidCollisionOption.NONE);
|
|
+ if (rayTraceBlocks != null) {
|
|
+ net.minecraft.server.Vec3D eye = getHandle().getEyePosition(1.0F);
|
|
+ if (eye.distanceSquared(rayTraceBlocks.getPos()) <= eye.distanceSquared(rayTrace.getPos())) {
|
|
+ return null;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ return rayTrace;
|
|
+ }
|
|
// Paper end
|
|
|
|
@Override
|