Add projectile hit simulation API (#8816)

This adds API to force a projectile to hit a provided entity. Example usage could be if you have a player disguised as another entity, you could simulate an arrow colliding with the (fake) entity hitbox.
This commit is contained in:
SamB440 2023-02-11 15:41:06 +00:00 committed by GitHub
parent afa16e6b64
commit de38a45c34
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 58 additions and 6 deletions

View file

@ -178,10 +178,10 @@ index d1b37530319f6d37ee37f62080289c1e45848bc8..e94c7e279356c510f60508b26277d489
+ // Paper end
}
diff --git a/src/main/java/org/bukkit/entity/Projectile.java b/src/main/java/org/bukkit/entity/Projectile.java
index a523fca4baab447181ef91df67fa69b24e010149..6935f8806ca1ed87fa761e73bc0f6c41ab60453e 100644
index a523fca4baab447181ef91df67fa69b24e010149..d97904540ff5cf103604862a5a1a3a41f56dfe33 100644
--- a/src/main/java/org/bukkit/entity/Projectile.java
+++ b/src/main/java/org/bukkit/entity/Projectile.java
@@ -43,4 +43,45 @@ public interface Projectile extends Entity {
@@ -43,4 +43,80 @@ public interface Projectile extends Entity {
*/
@Deprecated(forRemoval = true) // Paper
public void setBounce(boolean doesBounce);
@ -225,6 +225,41 @@ index a523fca4baab447181ef91df67fa69b24e010149..6935f8806ca1ed87fa761e73bc0f6c41
+ * @param beenShot has been in shot into the world
+ */
+ void setHasBeenShot(boolean beenShot);
+
+ /**
+ * Gets whether this projectile can hit an entity.
+ * <p>
+ * This method returns true under the following conditions:
+ * <p>
+ * - The shooter can see the entity ({@link Player#canSee(Entity)}) <p>
+ * - The entity is alive and not a spectator <p>
+ * - The projectile has left the hitbox of the shooter ({@link #hasLeftShooter()})<p>
+ * - If this is an arrow with piercing, it has not pierced the entity already
+ *
+ * @param entity the entity to check if this projectile can hit
+ * @return true if this projectile can damage the entity, false otherwise
+ */
+ boolean canHitEntity(@org.jetbrains.annotations.NotNull Entity entity);
+
+ /**
+ * Makes this projectile hit a specific entity.
+ * This uses the current position of the projectile for the hit point.
+ * Using this method will result in {@link org.bukkit.event.entity.ProjectileHitEvent} being called.
+ * @param entity the entity to hit
+ * @see #hitEntity(Entity, org.bukkit.util.Vector)
+ * @see #canHitEntity(Entity)
+ */
+ void hitEntity(@org.jetbrains.annotations.NotNull Entity entity);
+
+ /**
+ * Makes this projectile hit a specific entity from a specific point.
+ * Using this method will result in {@link org.bukkit.event.entity.ProjectileHitEvent} being called.
+ * @param entity the entity to hit
+ * @param vector the direction to hit from
+ * @see #hitEntity(Entity)
+ * @see #canHitEntity(Entity)
+ */
+ void hitEntity(@org.jetbrains.annotations.NotNull Entity entity, @org.jetbrains.annotations.NotNull org.bukkit.util.Vector vector);
+ // Paper end
}
diff --git a/src/main/java/org/bukkit/entity/ShulkerBullet.java b/src/main/java/org/bukkit/entity/ShulkerBullet.java