--- a/net/minecraft/world/entity/projectile/windcharge/AbstractWindCharge.java
+++ b/net/minecraft/world/entity/projectile/windcharge/AbstractWindCharge.java
@@ -24,67 +24,78 @@
 import net.minecraft.world.phys.EntityHitResult;
 import net.minecraft.world.phys.HitResult;
 import net.minecraft.world.phys.Vec3;
+// CraftBukkit start
+import org.bukkit.event.entity.EntityRemoveEvent;
+// CraftBukkit end
 
 public abstract class AbstractWindCharge extends AbstractHurtingProjectile implements ItemSupplier {
-    public static final ExplosionDamageCalculator EXPLOSION_DAMAGE_CALCULATOR = new SimpleExplosionDamageCalculator(
-        true, false, Optional.empty(), BuiltInRegistries.BLOCK.getTag(BlockTags.BLOCKS_WIND_CHARGE_EXPLOSIONS).map(Function.identity())
-    );
-    public static final double JUMP_SCALE = 0.25;
+
+    public static final ExplosionDamageCalculator EXPLOSION_DAMAGE_CALCULATOR = new SimpleExplosionDamageCalculator(true, false, Optional.empty(), BuiltInRegistries.BLOCK.getTag(BlockTags.BLOCKS_WIND_CHARGE_EXPLOSIONS).map(Function.identity()));
+    public static final double JUMP_SCALE = 0.25D;
 
     public AbstractWindCharge(EntityType<? extends AbstractWindCharge> type, Level world) {
         super(type, world);
-        this.accelerationPower = 0.0;
+        this.accelerationPower = 0.0D;
     }
 
     public AbstractWindCharge(EntityType<? extends AbstractWindCharge> type, Level world, Entity owner, double x, double y, double z) {
         super(type, x, y, z, world);
         this.setOwner(owner);
-        this.accelerationPower = 0.0;
+        this.accelerationPower = 0.0D;
     }
 
     AbstractWindCharge(EntityType<? extends AbstractWindCharge> type, double x, double y, double z, Vec3 velocity, Level world) {
         super(type, x, y, z, velocity, world);
-        this.accelerationPower = 0.0;
+        this.accelerationPower = 0.0D;
     }
 
     @Override
     protected AABB makeBoundingBox() {
         float f = this.getType().getDimensions().width() / 2.0F;
-        float g = this.getType().getDimensions().height();
-        float h = 0.15F;
-        return new AABB(
-            this.position().x - (double)f,
-            this.position().y - 0.15F,
-            this.position().z - (double)f,
-            this.position().x + (double)f,
-            this.position().y - 0.15F + (double)g,
-            this.position().z + (double)f
-        );
+        float f1 = this.getType().getDimensions().height();
+        float f2 = 0.15F;
+
+        return new AABB(this.position().x - (double) f, this.position().y - 0.15000000596046448D, this.position().z - (double) f, this.position().x + (double) f, this.position().y - 0.15000000596046448D + (double) f1, this.position().z + (double) f);
     }
 
     @Override
     public boolean canCollideWith(Entity other) {
-        return !(other instanceof AbstractWindCharge) && super.canCollideWith(other);
+        return other instanceof AbstractWindCharge ? false : super.canCollideWith(other);
     }
 
     @Override
     public boolean canHitEntity(Entity entity) {
-        return !(entity instanceof AbstractWindCharge) && entity.getType() != EntityType.END_CRYSTAL && super.canHitEntity(entity);
+        return entity instanceof AbstractWindCharge ? false : (entity.getType() == EntityType.END_CRYSTAL ? false : super.canHitEntity(entity));
     }
 
     @Override
     protected void onHitEntity(EntityHitResult entityHitResult) {
         super.onHitEntity(entityHitResult);
         if (!this.level().isClientSide) {
-            LivingEntity livingEntity2 = this.getOwner() instanceof LivingEntity livingEntity ? livingEntity : null;
-            Entity entity = entityHitResult.getEntity();
-            if (livingEntity2 != null) {
-                livingEntity2.setLastHurtMob(entity);
+            Entity entity = this.getOwner();
+            LivingEntity entityliving;
+
+            if (entity instanceof LivingEntity) {
+                LivingEntity entityliving1 = (LivingEntity) entity;
+
+                entityliving = entityliving1;
+            } else {
+                entityliving = null;
             }
 
-            DamageSource damageSource = this.damageSources().windCharge(this, livingEntity2);
-            if (entity.hurt(damageSource, 1.0F) && entity instanceof LivingEntity livingEntity3) {
-                EnchantmentHelper.doPostAttackEffects((ServerLevel)this.level(), livingEntity3, damageSource);
+            LivingEntity entityliving2 = entityliving;
+            Entity entity1 = entityHitResult.getEntity();
+
+            if (entityliving2 != null) {
+                entityliving2.setLastHurtMob(entity1);
+            }
+
+            DamageSource damagesource = this.damageSources().windCharge(this, entityliving2);
+
+            if (entity1.hurt(damagesource, 1.0F) && entity1 instanceof LivingEntity) {
+                LivingEntity entityliving3 = (LivingEntity) entity1;
+
+                EnchantmentHelper.doPostAttackEffects((ServerLevel) this.level(), entityliving3, damagesource);
             }
 
             this.explode(this.position());
@@ -92,8 +103,7 @@
     }
 
     @Override
-    public void push(double deltaX, double deltaY, double deltaZ) {
-    }
+    public void push(double deltaX, double deltaY, double deltaZ, @org.jetbrains.annotations.Nullable Entity pushingEntity) {} // Paper - Add EntityKnockbackByEntityEvent and EntityPushedByEntityAttackEvent
 
     public abstract void explode(Vec3 pos);
 
@@ -101,20 +111,23 @@
     protected void onHitBlock(BlockHitResult blockHitResult) {
         super.onHitBlock(blockHitResult);
         if (!this.level().isClientSide) {
-            Vec3i vec3i = blockHitResult.getDirection().getNormal();
-            Vec3 vec3 = Vec3.atLowerCornerOf(vec3i).multiply(0.25, 0.25, 0.25);
-            Vec3 vec32 = blockHitResult.getLocation().add(vec3);
-            this.explode(vec32);
-            this.discard();
+            Vec3i baseblockposition = blockHitResult.getDirection().getNormal();
+            Vec3 vec3d = Vec3.atLowerCornerOf(baseblockposition).multiply(0.25D, 0.25D, 0.25D);
+            Vec3 vec3d1 = blockHitResult.getLocation().add(vec3d);
+
+            this.explode(vec3d1);
+            this.discard(EntityRemoveEvent.Cause.HIT); // CraftBukkit - add Bukkit remove cause
         }
+
     }
 
     @Override
     protected void onHit(HitResult hitResult) {
         super.onHit(hitResult);
         if (!this.level().isClientSide) {
-            this.discard();
+            this.discard(EntityRemoveEvent.Cause.HIT); // CraftBukkit - add Bukkit remove cause
         }
+
     }
 
     @Override
@@ -147,10 +160,11 @@
     public void tick() {
         if (!this.level().isClientSide && this.getBlockY() > this.level().getMaxBuildHeight() + 30) {
             this.explode(this.position());
-            this.discard();
+            this.discard(EntityRemoveEvent.Cause.OUT_OF_WORLD); // CraftBukkit - add Bukkit remove cause
         } else {
             super.tick();
         }
+
     }
 
     @Override
