PaperMC/paper-server/nms-patches/net/minecraft/world/entity/projectile/IProjectile.patch
CraftBukkit/Spigot 65bc2541a3 Update to Minecraft 1.20.5
By: md_5 <git@md-5.net>
2024-04-24 01:15:00 +10:00

62 lines
2.7 KiB
Diff

--- a/net/minecraft/world/entity/projectile/IProjectile.java
+++ b/net/minecraft/world/entity/projectile/IProjectile.java
@@ -26,6 +26,10 @@
import net.minecraft.world.phys.MovingObjectPositionEntity;
import net.minecraft.world.phys.Vec3D;
+// CraftBukkit start
+import org.bukkit.projectiles.ProjectileSource;
+// CraftBukkit end
+
public abstract class IProjectile extends Entity implements TraceableEntity {
@Nullable
@@ -35,6 +39,10 @@
private boolean leftOwner;
private boolean hasBeenShot;
+ // CraftBukkit start
+ private boolean hitCancelled = false;
+ // CraftBukkit end
+
IProjectile(EntityTypes<? extends IProjectile> entitytypes, World world) {
super(entitytypes, world);
}
@@ -44,6 +52,7 @@
this.ownerUUID = entity.getUUID();
this.cachedOwner = entity;
}
+ this.projectileSource = (entity != null && entity.getBukkitEntity() instanceof ProjectileSource) ? (ProjectileSource) entity.getBukkitEntity() : null; // CraftBukkit
}
@@ -170,6 +179,17 @@
this.setDeltaMovement(this.getDeltaMovement().add(vec3d.x, entity.onGround() ? 0.0D : vec3d.y, vec3d.z));
}
+ // CraftBukkit start - call projectile hit event
+ protected ProjectileDeflection preHitTargetOrDeflectSelf(MovingObjectPosition movingobjectposition) {
+ org.bukkit.event.entity.ProjectileHitEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callProjectileHitEvent(this, movingobjectposition);
+ this.hitCancelled = event != null && event.isCancelled();
+ if (movingobjectposition.getType() == MovingObjectPosition.EnumMovingObjectType.BLOCK || !this.hitCancelled) {
+ return this.hitTargetOrDeflectSelf(movingobjectposition);
+ }
+ return ProjectileDeflection.NONE;
+ }
+ // CraftBukkit end
+
protected ProjectileDeflection hitTargetOrDeflectSelf(MovingObjectPosition movingobjectposition) {
if (movingobjectposition.getType() == MovingObjectPosition.EnumMovingObjectType.ENTITY) {
MovingObjectPositionEntity movingobjectpositionentity = (MovingObjectPositionEntity) movingobjectposition;
@@ -225,6 +245,11 @@
protected void onHitEntity(MovingObjectPositionEntity movingobjectpositionentity) {}
protected void onHitBlock(MovingObjectPositionBlock movingobjectpositionblock) {
+ // CraftBukkit start - cancellable hit event
+ if (hitCancelled) {
+ return;
+ }
+ // CraftBukkit end
IBlockData iblockdata = this.level().getBlockState(movingobjectpositionblock.getBlockPos());
iblockdata.onProjectileHit(this.level(), iblockdata, movingobjectpositionblock, this);