13
0
geforkt von Mirrors/Paper

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.
Dieser Commit ist enthalten in:
SamB440 2023-02-11 15:41:06 +00:00
Ursprung f40928931b
Commit e343c4eb44
3 geänderte Dateien mit 53 neuen und 1 gelöschten Zeilen

Datei anzeigen

@ -225,6 +225,41 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ * @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

Datei anzeigen

@ -24,7 +24,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ // 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) {

Datei anzeigen

@ -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 <nassim@njahnke.dev>
@ -72,6 +74,21 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ }
+
+ @Override
+ public boolean canHitEntity(org.bukkit.entity.Entity entity) {
+ return this.getHandle().canHitEntity(((CraftEntity) entity).getHandle());
+ }
+
+ @Override
+ public void hitEntity(org.bukkit.entity.Entity entity) {
+ this.getHandle().preOnHit(new net.minecraft.world.phys.EntityHitResult(((CraftEntity) entity).getHandle()));
+ }
+
+ @Override
+ public void hitEntity(org.bukkit.entity.Entity entity, org.bukkit.util.Vector vector) {
+ this.getHandle().preOnHit(new net.minecraft.world.phys.EntityHitResult(((CraftEntity) entity).getHandle(), new net.minecraft.world.phys.Vec3(vector.getX(), vector.getY(), vector.getZ())));
+ }
+
+ @Override
+ public net.minecraft.world.entity.projectile.Projectile getHandle() {
+ return (net.minecraft.world.entity.projectile.Projectile) entity;
+ }