diff --git a/patches/api/0371-More-Projectile-API.patch b/patches/api/0371-More-Projectile-API.patch index f3b615b3c2..74619e0a48 100644 --- a/patches/api/0371-More-Projectile-API.patch +++ b/patches/api/0371-More-Projectile-API.patch @@ -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. ++ *
++ * This method returns true under the following conditions: ++ *
++ * - The shooter can see the entity ({@link Player#canSee(Entity)})
++ * - The entity is alive and not a spectator
++ * - The projectile has left the hitbox of the shooter ({@link #hasLeftShooter()})
++ * - 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
diff --git a/patches/server/0812-Fix-cancelling-ProjectileHitEvent-for-piercing-arrow.patch b/patches/server/0812-Fix-cancelling-ProjectileHitEvent-for-piercing-arrow.patch
index ef0ba395b1..947885a73c 100644
--- a/patches/server/0812-Fix-cancelling-ProjectileHitEvent-for-piercing-arrow.patch
+++ b/patches/server/0812-Fix-cancelling-ProjectileHitEvent-for-piercing-arrow.patch
@@ -15,7 +15,7 @@ piercing arrows to avoid duplicate damage being applied.
protected net.minecraft.world.entity.projectile.Projectile hitCancelled
diff --git a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java
-index 8c08e07ba78e2ed042d79b692221008f59e92593..9788e477ff1446ad2ea3669922cc7dfc09900ce8 100644
+index 740f08e5fadf9b8d277af05cc9734ceb54f54abb..09a4c0d30898bbdc05e32b6f1d4b0436a5e4af53 100644
--- a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java
+++ b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java
@@ -290,6 +290,19 @@ public abstract class AbstractArrow extends Projectile {
@@ -24,7 +24,7 @@ index 8c08e07ba78e2ed042d79b692221008f59e92593..9788e477ff1446ad2ea3669922cc7dfc
+ // Paper start
+ @Override
-+ protected void preOnHit(HitResult hitResult) {
++ public void preOnHit(HitResult hitResult) {
+ super.preOnHit(hitResult);
+ if (hitResult instanceof EntityHitResult entityHitResult && this.hitCancelled && this.getPierceLevel() > 0) {
+ if (this.piercingIgnoreEntityIds == null) {
diff --git a/patches/server/0813-More-Projectile-API.patch b/patches/server/0813-More-Projectile-API.patch
index 0d4b17fc77..34b0f3c7cb 100644
--- a/patches/server/0813-More-Projectile-API.patch
+++ b/patches/server/0813-More-Projectile-API.patch
@@ -14,6 +14,8 @@ public net.minecraft.world.entity.projectile.AbstractArrow soundEvent
public net.minecraft.world.entity.projectile.ThrownTrident dealtDamage
public net.minecraft.world.entity.projectile.Projectile hasBeenShot
public net.minecraft.world.entity.projectile.Projectile leftOwner
+public net.minecraft.world.entity.projectile.Projectile preOnHit(Lnet/minecraft/world/phys/HitResult;)V
+public net.minecraft.world.entity.projectile.Projectile canHitEntity(Lnet/minecraft/world/entity/Entity;)Z
Co-authored-by: Nassim Jahnke