--- a/net/minecraft/world/entity/projectile/EvokerFangs.java
+++ b/net/minecraft/world/entity/projectile/EvokerFangs.java
@@ -1,5 +1,7 @@
 package net.minecraft.world.entity.projectile;
 
+import java.util.Iterator;
+import java.util.List;
 import java.util.UUID;
 import javax.annotation.Nullable;
 import net.minecraft.core.particles.ParticleTypes;
@@ -14,14 +16,18 @@
 import net.minecraft.world.entity.TraceableEntity;
 import net.minecraft.world.item.enchantment.EnchantmentHelper;
 import net.minecraft.world.level.Level;
+// CraftBukkit start
+import org.bukkit.event.entity.EntityRemoveEvent;
+// CraftBukkit end
 
 public class EvokerFangs extends Entity implements TraceableEntity {
+
     public static final int ATTACK_DURATION = 20;
     public static final int LIFE_OFFSET = 2;
     public static final int ATTACK_TRIGGER_TICKS = 14;
     public int warmupDelayTicks;
     private boolean sentSpikeEvent;
-    private int lifeTicks = 22;
+    private int lifeTicks;
     private boolean clientSideAttackStarted;
     @Nullable
     private LivingEntity owner;
@@ -30,19 +36,19 @@
 
     public EvokerFangs(EntityType<? extends EvokerFangs> type, Level world) {
         super(type, world);
+        this.lifeTicks = 22;
     }
 
     public EvokerFangs(Level world, double x, double y, double z, float yaw, int warmup, LivingEntity owner) {
         this(EntityType.EVOKER_FANGS, world);
         this.warmupDelayTicks = warmup;
         this.setOwner(owner);
-        this.setYRot(yaw * (180.0F / (float)Math.PI));
+        this.setYRot(yaw * 57.295776F);
         this.setPos(x, y, z);
     }
 
     @Override
-    protected void defineSynchedData(SynchedEntityData.Builder builder) {
-    }
+    protected void defineSynchedData(SynchedEntityData.Builder builder) {}
 
     public void setOwner(@Nullable LivingEntity owner) {
         this.owner = owner;
@@ -53,9 +59,10 @@
     @Override
     public LivingEntity getOwner() {
         if (this.owner == null && this.ownerUUID != null && this.level() instanceof ServerLevel) {
-            Entity entity = ((ServerLevel)this.level()).getEntity(this.ownerUUID);
+            Entity entity = ((ServerLevel) this.level()).getEntity(this.ownerUUID);
+
             if (entity instanceof LivingEntity) {
-                this.owner = (LivingEntity)entity;
+                this.owner = (LivingEntity) entity;
             }
         }
 
@@ -68,6 +75,7 @@
         if (nbt.hasUUID("Owner")) {
             this.ownerUUID = nbt.getUUID("Owner");
         }
+
     }
 
     @Override
@@ -76,6 +84,7 @@
         if (this.ownerUUID != null) {
             nbt.putUUID("Owner", this.ownerUUID);
         }
+
     }
 
     @Override
@@ -83,52 +92,68 @@
         super.tick();
         if (this.level().isClientSide) {
             if (this.clientSideAttackStarted) {
-                this.lifeTicks--;
+                --this.lifeTicks;
                 if (this.lifeTicks == 14) {
-                    for (int i = 0; i < 12; i++) {
-                        double d = this.getX() + (this.random.nextDouble() * 2.0 - 1.0) * (double)this.getBbWidth() * 0.5;
-                        double e = this.getY() + 0.05 + this.random.nextDouble();
-                        double f = this.getZ() + (this.random.nextDouble() * 2.0 - 1.0) * (double)this.getBbWidth() * 0.5;
-                        double g = (this.random.nextDouble() * 2.0 - 1.0) * 0.3;
-                        double h = 0.3 + this.random.nextDouble() * 0.3;
-                        double j = (this.random.nextDouble() * 2.0 - 1.0) * 0.3;
-                        this.level().addParticle(ParticleTypes.CRIT, d, e + 1.0, f, g, h, j);
+                    for (int i = 0; i < 12; ++i) {
+                        double d0 = this.getX() + (this.random.nextDouble() * 2.0D - 1.0D) * (double) this.getBbWidth() * 0.5D;
+                        double d1 = this.getY() + 0.05D + this.random.nextDouble();
+                        double d2 = this.getZ() + (this.random.nextDouble() * 2.0D - 1.0D) * (double) this.getBbWidth() * 0.5D;
+                        double d3 = (this.random.nextDouble() * 2.0D - 1.0D) * 0.3D;
+                        double d4 = 0.3D + this.random.nextDouble() * 0.3D;
+                        double d5 = (this.random.nextDouble() * 2.0D - 1.0D) * 0.3D;
+
+                        this.level().addParticle(ParticleTypes.CRIT, d0, d1 + 1.0D, d2, d3, d4, d5);
                     }
                 }
             }
         } else if (--this.warmupDelayTicks < 0) {
             if (this.warmupDelayTicks == -8) {
-                for (LivingEntity livingEntity : this.level().getEntitiesOfClass(LivingEntity.class, this.getBoundingBox().inflate(0.2, 0.0, 0.2))) {
-                    this.dealDamageTo(livingEntity);
+                List<LivingEntity> list = this.level().getEntitiesOfClass(LivingEntity.class, this.getBoundingBox().inflate(0.2D, 0.0D, 0.2D));
+                Iterator iterator = list.iterator();
+
+                while (iterator.hasNext()) {
+                    LivingEntity entityliving = (LivingEntity) iterator.next();
+
+                    this.dealDamageTo(entityliving);
                 }
             }
 
             if (!this.sentSpikeEvent) {
-                this.level().broadcastEntityEvent(this, (byte)4);
+                this.level().broadcastEntityEvent(this, (byte) 4);
                 this.sentSpikeEvent = true;
             }
 
             if (--this.lifeTicks < 0) {
-                this.discard();
+                this.discard(EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - add Bukkit remove cause
             }
         }
+
     }
 
     private void dealDamageTo(LivingEntity target) {
-        LivingEntity livingEntity = this.getOwner();
-        if (target.isAlive() && !target.isInvulnerable() && target != livingEntity) {
-            if (livingEntity == null) {
-                target.hurt(this.damageSources().magic(), 6.0F);
+        LivingEntity entityliving1 = this.getOwner();
+
+        if (target.isAlive() && !target.isInvulnerable() && target != entityliving1) {
+            if (entityliving1 == null) {
+                target.hurt(this.damageSources().magic().customEventDamager(this), 6.0F); // CraftBukkit // Paper - fix DamageSource API
             } else {
-                if (livingEntity.isAlliedTo(target)) {
+                if (entityliving1.isAlliedTo((Entity) target)) {
                     return;
                 }
 
-                DamageSource damageSource = this.damageSources().indirectMagic(this, livingEntity);
-                if (target.hurt(damageSource, 6.0F) && this.level() instanceof ServerLevel serverLevel) {
-                    EnchantmentHelper.doPostAttackEffects(serverLevel, target, damageSource);
+                DamageSource damagesource = this.damageSources().indirectMagic(this, entityliving1);
+
+                if (target.hurt(damagesource, 6.0F)) {
+                    Level world = this.level();
+
+                    if (world instanceof ServerLevel) {
+                        ServerLevel worldserver = (ServerLevel) world;
+
+                        EnchantmentHelper.doPostAttackEffects(worldserver, target, damagesource);
+                    }
                 }
             }
+
         }
     }
 
@@ -138,19 +163,10 @@
         if (status == 4) {
             this.clientSideAttackStarted = true;
             if (!this.isSilent()) {
-                this.level()
-                    .playLocalSound(
-                        this.getX(),
-                        this.getY(),
-                        this.getZ(),
-                        SoundEvents.EVOKER_FANGS_ATTACK,
-                        this.getSoundSource(),
-                        1.0F,
-                        this.random.nextFloat() * 0.2F + 0.85F,
-                        false
-                    );
+                this.level().playLocalSound(this.getX(), this.getY(), this.getZ(), SoundEvents.EVOKER_FANGS_ATTACK, this.getSoundSource(), 1.0F, this.random.nextFloat() * 0.2F + 0.85F, false);
             }
         }
+
     }
 
     public float getAnimationProgress(float tickDelta) {
@@ -158,7 +174,8 @@
             return 0.0F;
         } else {
             int i = this.lifeTicks - 2;
-            return i <= 0 ? 1.0F : 1.0F - ((float)i - tickDelta) / 20.0F;
+
+            return i <= 0 ? 1.0F : 1.0F - ((float) i - tickDelta) / 20.0F;
         }
     }
 }
