--- a/net/minecraft/world/entity/projectile/EntityShulkerBullet.java
+++ b/net/minecraft/world/entity/projectile/EntityShulkerBullet.java
@@ -60,8 +60,21 @@
         this.finalTarget = entity;
         this.currentMoveDirection = EnumDirection.UP;
         this.a(enumdirection_enumaxis);
+        projectileSource = (org.bukkit.entity.LivingEntity) entityliving.getBukkitEntity(); // CraftBukkit
     }
 
+    // CraftBukkit start
+    public Entity getTarget() {
+        return this.finalTarget;
+    }
+
+    public void setTarget(Entity e) {
+        this.finalTarget = e;
+        this.currentMoveDirection = EnumDirection.UP;
+        this.a(EnumDirection.EnumAxis.X);
+    }
+    // CraftBukkit end
+
     @Override
     public SoundCategory getSoundCategory() {
         return SoundCategory.HOSTILE;
@@ -225,7 +238,7 @@
             MovingObjectPosition movingobjectposition = ProjectileHelper.a((Entity) this, this::a);
 
             if (movingobjectposition.getType() != MovingObjectPosition.EnumMovingObjectType.MISS) {
-                this.a(movingobjectposition);
+                this.preOnHit(movingobjectposition); // CraftBukkit - projectile hit event
             }
         }
 
@@ -292,7 +305,7 @@
         if (flag) {
             this.a(entityliving, entity);
             if (entity instanceof EntityLiving) {
-                ((EntityLiving) entity).addEffect(new MobEffect(MobEffects.LEVITATION, 200), (Entity) MoreObjects.firstNonNull(entity1, this));
+                ((EntityLiving) entity).addEffect(new MobEffect(MobEffects.LEVITATION, 200), (Entity) MoreObjects.firstNonNull(entity1, this), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.ATTACK); // CraftBukkit
             }
         }
 
@@ -318,6 +331,11 @@
 
     @Override
     public boolean damageEntity(DamageSource damagesource, float f) {
+        // CraftBukkit start
+        if (org.bukkit.craftbukkit.event.CraftEventFactory.handleNonLivingEntityDamageEvent(this, damagesource, f, false)) {
+            return false;
+        }
+        // CraftBukkit end
         if (!this.level.isClientSide) {
             this.playSound(SoundEffects.SHULKER_BULLET_HURT, 1.0F, 1.0F);
             ((WorldServer) this.level).a(Particles.CRIT, this.locX(), this.locY(), this.locZ(), 15, 0.2D, 0.2D, 0.2D, 0.0D);
