--- a/net/minecraft/world/entity/animal/Dolphin.java
+++ b/net/minecraft/world/entity/animal/Dolphin.java
@@ -58,15 +58,29 @@
 import net.minecraft.world.level.ServerLevelAccessor;
 import net.minecraft.world.level.pathfinder.PathComputationType;
 import net.minecraft.world.phys.Vec3;
+// CraftBukkit start
+import org.bukkit.craftbukkit.event.CraftEventFactory;
+import org.bukkit.event.entity.EntityPotionEffectEvent;
+import org.bukkit.event.entity.EntityRemoveEvent;
+// CraftBukkit end
 
 public class Dolphin extends WaterAnimal {
+
+    // CraftBukkit start - SPIGOT-6907: re-implement LivingEntity#setMaximumAir()
+    @Override
+    public int getDefaultMaxAirSupply() {
+        return Dolphin.TOTAL_AIR_SUPPLY;
+    }
+    // CraftBukkit end
     private static final EntityDataAccessor<BlockPos> TREASURE_POS = SynchedEntityData.defineId(Dolphin.class, EntityDataSerializers.BLOCK_POS);
     private static final EntityDataAccessor<Boolean> GOT_FISH = SynchedEntityData.defineId(Dolphin.class, EntityDataSerializers.BOOLEAN);
     private static final EntityDataAccessor<Integer> MOISTNESS_LEVEL = SynchedEntityData.defineId(Dolphin.class, EntityDataSerializers.INT);
-    static final TargetingConditions SWIM_WITH_PLAYER_TARGETING = TargetingConditions.forNonCombat().range(10.0).ignoreLineOfSight();
+    static final TargetingConditions SWIM_WITH_PLAYER_TARGETING = TargetingConditions.forNonCombat().range(10.0D).ignoreLineOfSight();
     public static final int TOTAL_AIR_SUPPLY = 4800;
     private static final int TOTAL_MOISTNESS_LEVEL = 2400;
-    public static final Predicate<ItemEntity> ALLOWED_ITEMS = item -> !item.hasPickUpDelay() && item.isAlive() && item.isInWater();
+    public static final Predicate<ItemEntity> ALLOWED_ITEMS = (entityitem) -> {
+        return !entityitem.hasPickUpDelay() && entityitem.isAlive() && entityitem.isInWater();
+    };
 
     public Dolphin(EntityType<? extends Dolphin> type, Level world) {
         super(type, world);
@@ -84,39 +98,38 @@
     }
 
     @Override
-    protected void handleAirSupply(int air) {
-    }
+    protected void handleAirSupply(int air) {}
 
     public void setTreasurePos(BlockPos treasurePos) {
-        this.entityData.set(TREASURE_POS, treasurePos);
+        this.entityData.set(Dolphin.TREASURE_POS, treasurePos);
     }
 
     public BlockPos getTreasurePos() {
-        return this.entityData.get(TREASURE_POS);
+        return (BlockPos) this.entityData.get(Dolphin.TREASURE_POS);
     }
 
     public boolean gotFish() {
-        return this.entityData.get(GOT_FISH);
+        return (Boolean) this.entityData.get(Dolphin.GOT_FISH);
     }
 
     public void setGotFish(boolean hasFish) {
-        this.entityData.set(GOT_FISH, hasFish);
+        this.entityData.set(Dolphin.GOT_FISH, hasFish);
     }
 
     public int getMoistnessLevel() {
-        return this.entityData.get(MOISTNESS_LEVEL);
+        return (Integer) this.entityData.get(Dolphin.MOISTNESS_LEVEL);
     }
 
     public void setMoisntessLevel(int moistness) {
-        this.entityData.set(MOISTNESS_LEVEL, moistness);
+        this.entityData.set(Dolphin.MOISTNESS_LEVEL, moistness);
     }
 
     @Override
     protected void defineSynchedData(SynchedEntityData.Builder builder) {
         super.defineSynchedData(builder);
-        builder.define(TREASURE_POS, BlockPos.ZERO);
-        builder.define(GOT_FISH, false);
-        builder.define(MOISTNESS_LEVEL, 2400);
+        builder.define(Dolphin.TREASURE_POS, BlockPos.ZERO);
+        builder.define(Dolphin.GOT_FISH, false);
+        builder.define(Dolphin.MOISTNESS_LEVEL, 2400);
     }
 
     @Override
@@ -134,6 +147,7 @@
         int i = nbt.getInt("TreasurePosX");
         int j = nbt.getInt("TreasurePosY");
         int k = nbt.getInt("TreasurePosZ");
+
         this.setTreasurePos(new BlockPos(i, j, k));
         super.readAdditionalSaveData(nbt);
         this.setGotFish(nbt.getBoolean("GotFish"));
@@ -145,20 +159,20 @@
         this.goalSelector.addGoal(0, new BreathAirGoal(this));
         this.goalSelector.addGoal(0, new TryFindWaterGoal(this));
         this.goalSelector.addGoal(1, new Dolphin.DolphinSwimToTreasureGoal(this));
-        this.goalSelector.addGoal(2, new Dolphin.DolphinSwimWithPlayerGoal(this, 4.0));
-        this.goalSelector.addGoal(4, new RandomSwimmingGoal(this, 1.0, 10));
+        this.goalSelector.addGoal(2, new Dolphin.DolphinSwimWithPlayerGoal(this, 4.0D));
+        this.goalSelector.addGoal(4, new RandomSwimmingGoal(this, 1.0D, 10));
         this.goalSelector.addGoal(4, new RandomLookAroundGoal(this));
         this.goalSelector.addGoal(5, new LookAtPlayerGoal(this, Player.class, 6.0F));
         this.goalSelector.addGoal(5, new DolphinJumpGoal(this, 10));
-        this.goalSelector.addGoal(6, new MeleeAttackGoal(this, 1.2F, true));
+        this.goalSelector.addGoal(6, new MeleeAttackGoal(this, 1.2000000476837158D, true));
         this.goalSelector.addGoal(8, new Dolphin.PlayWithItemsGoal());
         this.goalSelector.addGoal(8, new FollowBoatGoal(this));
-        this.goalSelector.addGoal(9, new AvoidEntityGoal<>(this, Guardian.class, 8.0F, 1.0, 1.0));
-        this.targetSelector.addGoal(1, new HurtByTargetGoal(this, Guardian.class).setAlertOthers());
+        this.goalSelector.addGoal(9, new AvoidEntityGoal<>(this, Guardian.class, 8.0F, 1.0D, 1.0D));
+        this.targetSelector.addGoal(1, (new HurtByTargetGoal(this, new Class[]{Guardian.class})).setAlertOthers());
     }
 
     public static AttributeSupplier.Builder createAttributes() {
-        return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 10.0).add(Attributes.MOVEMENT_SPEED, 1.2F).add(Attributes.ATTACK_DAMAGE, 3.0);
+        return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 10.0D).add(Attributes.MOVEMENT_SPEED, 1.2000000476837158D).add(Attributes.ATTACK_DAMAGE, 3.0D);
     }
 
     @Override
@@ -173,7 +187,7 @@
 
     @Override
     public int getMaxAirSupply() {
-        return 4800;
+        return this.maxAirTicks; // CraftBukkit - SPIGOT-6907: re-implement LivingEntity#setMaximumAir()
     }
 
     @Override
@@ -198,22 +212,31 @@
 
     @Override
     public boolean canTakeItem(ItemStack stack) {
-        EquipmentSlot equipmentSlot = this.getEquipmentSlotForItem(stack);
-        return this.getItemBySlot(equipmentSlot).isEmpty() && equipmentSlot == EquipmentSlot.MAINHAND && super.canTakeItem(stack);
+        EquipmentSlot enumitemslot = this.getEquipmentSlotForItem(stack);
+
+        return !this.getItemBySlot(enumitemslot).isEmpty() ? false : enumitemslot == EquipmentSlot.MAINHAND && super.canTakeItem(stack);
     }
 
     @Override
     protected void pickUpItem(ItemEntity item) {
         if (this.getItemBySlot(EquipmentSlot.MAINHAND).isEmpty()) {
-            ItemStack itemStack = item.getItem();
-            if (this.canHoldItem(itemStack)) {
+            ItemStack itemstack = item.getItem();
+
+            if (this.canHoldItem(itemstack)) {
+                // CraftBukkit start - call EntityPickupItemEvent
+                if (CraftEventFactory.callEntityPickupItemEvent(this, item, 0, false).isCancelled()) {
+                    return;
+                }
+                itemstack = item.getItem(); // CraftBukkit- update ItemStack from event
+                // CraftBukkit start
                 this.onItemPickup(item);
-                this.setItemSlot(EquipmentSlot.MAINHAND, itemStack);
+                this.setItemSlot(EquipmentSlot.MAINHAND, itemstack);
                 this.setGuaranteedDrop(EquipmentSlot.MAINHAND);
-                this.take(item, itemStack.getCount());
-                item.discard();
+                this.take(item, itemstack.getCount());
+                item.discard(EntityRemoveEvent.Cause.PICKUP); // CraftBukkit - add Bukkit remove cause
             }
         }
+
     }
 
     @Override
@@ -231,45 +254,25 @@
                 }
 
                 if (this.onGround()) {
-                    this.setDeltaMovement(
-                        this.getDeltaMovement()
-                            .add((double)((this.random.nextFloat() * 2.0F - 1.0F) * 0.2F), 0.5, (double)((this.random.nextFloat() * 2.0F - 1.0F) * 0.2F))
-                    );
+                    this.setDeltaMovement(this.getDeltaMovement().add((double) ((this.random.nextFloat() * 2.0F - 1.0F) * 0.2F), 0.5D, (double) ((this.random.nextFloat() * 2.0F - 1.0F) * 0.2F)));
                     this.setYRot(this.random.nextFloat() * 360.0F);
                     this.setOnGround(false);
                     this.hasImpulse = true;
                 }
             }
 
-            if (this.level().isClientSide && this.isInWater() && this.getDeltaMovement().lengthSqr() > 0.03) {
-                Vec3 vec3 = this.getViewVector(0.0F);
-                float f = Mth.cos(this.getYRot() * (float) (Math.PI / 180.0)) * 0.3F;
-                float g = Mth.sin(this.getYRot() * (float) (Math.PI / 180.0)) * 0.3F;
-                float h = 1.2F - this.random.nextFloat() * 0.7F;
+            if (this.level().isClientSide && this.isInWater() && this.getDeltaMovement().lengthSqr() > 0.03D) {
+                Vec3 vec3d = this.getViewVector(0.0F);
+                float f = Mth.cos(this.getYRot() * 0.017453292F) * 0.3F;
+                float f1 = Mth.sin(this.getYRot() * 0.017453292F) * 0.3F;
+                float f2 = 1.2F - this.random.nextFloat() * 0.7F;
 
-                for (int i = 0; i < 2; i++) {
-                    this.level()
-                        .addParticle(
-                            ParticleTypes.DOLPHIN,
-                            this.getX() - vec3.x * (double)h + (double)f,
-                            this.getY() - vec3.y,
-                            this.getZ() - vec3.z * (double)h + (double)g,
-                            0.0,
-                            0.0,
-                            0.0
-                        );
-                    this.level()
-                        .addParticle(
-                            ParticleTypes.DOLPHIN,
-                            this.getX() - vec3.x * (double)h - (double)f,
-                            this.getY() - vec3.y,
-                            this.getZ() - vec3.z * (double)h - (double)g,
-                            0.0,
-                            0.0,
-                            0.0
-                        );
+                for (int i = 0; i < 2; ++i) {
+                    this.level().addParticle(ParticleTypes.DOLPHIN, this.getX() - vec3d.x * (double) f2 + (double) f, this.getY() - vec3d.y, this.getZ() - vec3d.z * (double) f2 + (double) f1, 0.0D, 0.0D, 0.0D);
+                    this.level().addParticle(ParticleTypes.DOLPHIN, this.getX() - vec3d.x * (double) f2 - (double) f, this.getY() - vec3d.y, this.getZ() - vec3d.z * (double) f2 - (double) f1, 0.0D, 0.0D, 0.0D);
                 }
             }
+
         }
     }
 
@@ -280,27 +283,31 @@
         } else {
             super.handleEntityEvent(status);
         }
+
     }
 
     private void addParticlesAroundSelf(ParticleOptions parameters) {
-        for (int i = 0; i < 7; i++) {
-            double d = this.random.nextGaussian() * 0.01;
-            double e = this.random.nextGaussian() * 0.01;
-            double f = this.random.nextGaussian() * 0.01;
-            this.level().addParticle(parameters, this.getRandomX(1.0), this.getRandomY() + 0.2, this.getRandomZ(1.0), d, e, f);
+        for (int i = 0; i < 7; ++i) {
+            double d0 = this.random.nextGaussian() * 0.01D;
+            double d1 = this.random.nextGaussian() * 0.01D;
+            double d2 = this.random.nextGaussian() * 0.01D;
+
+            this.level().addParticle(parameters, this.getRandomX(1.0D), this.getRandomY() + 0.2D, this.getRandomZ(1.0D), d0, d1, d2);
         }
+
     }
 
     @Override
     protected InteractionResult mobInteract(Player player, InteractionHand hand) {
-        ItemStack itemStack = player.getItemInHand(hand);
-        if (!itemStack.isEmpty() && itemStack.is(ItemTags.FISHES)) {
+        ItemStack itemstack = player.getItemInHand(hand);
+
+        if (!itemstack.isEmpty() && itemstack.is(ItemTags.FISHES)) {
             if (!this.level().isClientSide) {
                 this.playSound(SoundEvents.DOLPHIN_EAT, 1.0F, 1.0F);
             }
 
             this.setGotFish(true);
-            itemStack.consume(1, player);
+            itemstack.consume(1, player);
             return InteractionResult.sidedSuccess(this.level().isClientSide);
         } else {
             return super.mobInteract(player, hand);
@@ -335,8 +342,9 @@
     }
 
     protected boolean closeToNextPos() {
-        BlockPos blockPos = this.getNavigation().getTargetPos();
-        return blockPos != null && blockPos.closerToCenterThan(this.position(), 12.0);
+        BlockPos blockposition = this.getNavigation().getTargetPos();
+
+        return blockposition != null ? blockposition.closerToCenterThan(this.position(), 12.0D) : false;
     }
 
     @Override
@@ -344,13 +352,14 @@
         if (this.isEffectiveAi() && this.isInWater()) {
             this.moveRelative(this.getSpeed(), movementInput);
             this.move(MoverType.SELF, this.getDeltaMovement());
-            this.setDeltaMovement(this.getDeltaMovement().scale(0.9));
+            this.setDeltaMovement(this.getDeltaMovement().scale(0.9D));
             if (this.getTarget() == null) {
-                this.setDeltaMovement(this.getDeltaMovement().add(0.0, -0.005, 0.0));
+                this.setDeltaMovement(this.getDeltaMovement().add(0.0D, -0.005D, 0.0D));
             }
         } else {
             super.travel(movementInput);
         }
+
     }
 
     @Override
@@ -358,7 +367,8 @@
         return true;
     }
 
-    static class DolphinSwimToTreasureGoal extends Goal {
+    private static class DolphinSwimToTreasureGoal extends Goal {
+
         private final Dolphin dolphin;
         private boolean stuck;
 
@@ -379,23 +389,24 @@
 
         @Override
         public boolean canContinueToUse() {
-            BlockPos blockPos = this.dolphin.getTreasurePos();
-            return !BlockPos.containing((double)blockPos.getX(), this.dolphin.getY(), (double)blockPos.getZ()).closerToCenterThan(this.dolphin.position(), 4.0)
-                && !this.stuck
-                && this.dolphin.getAirSupply() >= 100;
+            BlockPos blockposition = this.dolphin.getTreasurePos();
+
+            return !BlockPos.containing((double) blockposition.getX(), this.dolphin.getY(), (double) blockposition.getZ()).closerToCenterThan(this.dolphin.position(), 4.0D) && !this.stuck && this.dolphin.getAirSupply() >= 100;
         }
 
         @Override
         public void start() {
             if (this.dolphin.level() instanceof ServerLevel) {
-                ServerLevel serverLevel = (ServerLevel)this.dolphin.level();
+                ServerLevel worldserver = (ServerLevel) this.dolphin.level();
+
                 this.stuck = false;
                 this.dolphin.getNavigation().stop();
-                BlockPos blockPos = this.dolphin.blockPosition();
-                BlockPos blockPos2 = serverLevel.findNearestMapStructure(StructureTags.DOLPHIN_LOCATED, blockPos, 50, false);
-                if (blockPos2 != null) {
-                    this.dolphin.setTreasurePos(blockPos2);
-                    serverLevel.broadcastEntityEvent(this.dolphin, (byte)38);
+                BlockPos blockposition = this.dolphin.blockPosition();
+                BlockPos blockposition1 = worldserver.findNearestMapStructure(StructureTags.DOLPHIN_LOCATED, blockposition, 50, false);
+
+                if (blockposition1 != null) {
+                    this.dolphin.setTreasurePos(blockposition1);
+                    worldserver.broadcastEntityEvent(this.dolphin, (byte) 38);
                 } else {
                     this.stuck = true;
                 }
@@ -404,47 +415,51 @@
 
         @Override
         public void stop() {
-            BlockPos blockPos = this.dolphin.getTreasurePos();
-            if (BlockPos.containing((double)blockPos.getX(), this.dolphin.getY(), (double)blockPos.getZ()).closerToCenterThan(this.dolphin.position(), 4.0)
-                || this.stuck) {
+            BlockPos blockposition = this.dolphin.getTreasurePos();
+
+            if (BlockPos.containing((double) blockposition.getX(), this.dolphin.getY(), (double) blockposition.getZ()).closerToCenterThan(this.dolphin.position(), 4.0D) || this.stuck) {
                 this.dolphin.setGotFish(false);
             }
+
         }
 
         @Override
         public void tick() {
-            Level level = this.dolphin.level();
+            Level world = this.dolphin.level();
+
             if (this.dolphin.closeToNextPos() || this.dolphin.getNavigation().isDone()) {
-                Vec3 vec3 = Vec3.atCenterOf(this.dolphin.getTreasurePos());
-                Vec3 vec32 = DefaultRandomPos.getPosTowards(this.dolphin, 16, 1, vec3, (float) (Math.PI / 8));
-                if (vec32 == null) {
-                    vec32 = DefaultRandomPos.getPosTowards(this.dolphin, 8, 4, vec3, (float) (Math.PI / 2));
+                Vec3 vec3d = Vec3.atCenterOf(this.dolphin.getTreasurePos());
+                Vec3 vec3d1 = DefaultRandomPos.getPosTowards(this.dolphin, 16, 1, vec3d, 0.39269909262657166D);
+
+                if (vec3d1 == null) {
+                    vec3d1 = DefaultRandomPos.getPosTowards(this.dolphin, 8, 4, vec3d, 1.5707963705062866D);
                 }
 
-                if (vec32 != null) {
-                    BlockPos blockPos = BlockPos.containing(vec32);
-                    if (!level.getFluidState(blockPos).is(FluidTags.WATER) || !level.getBlockState(blockPos).isPathfindable(PathComputationType.WATER)) {
-                        vec32 = DefaultRandomPos.getPosTowards(this.dolphin, 8, 5, vec3, (float) (Math.PI / 2));
+                if (vec3d1 != null) {
+                    BlockPos blockposition = BlockPos.containing(vec3d1);
+
+                    if (!world.getFluidState(blockposition).is(FluidTags.WATER) || !world.getBlockState(blockposition).isPathfindable(PathComputationType.WATER)) {
+                        vec3d1 = DefaultRandomPos.getPosTowards(this.dolphin, 8, 5, vec3d, 1.5707963705062866D);
                     }
                 }
 
-                if (vec32 == null) {
+                if (vec3d1 == null) {
                     this.stuck = true;
                     return;
                 }
 
-                this.dolphin
-                    .getLookControl()
-                    .setLookAt(vec32.x, vec32.y, vec32.z, (float)(this.dolphin.getMaxHeadYRot() + 20), (float)this.dolphin.getMaxHeadXRot());
-                this.dolphin.getNavigation().moveTo(vec32.x, vec32.y, vec32.z, 1.3);
-                if (level.random.nextInt(this.adjustedTickDelay(80)) == 0) {
-                    level.broadcastEntityEvent(this.dolphin, (byte)38);
+                this.dolphin.getLookControl().setLookAt(vec3d1.x, vec3d1.y, vec3d1.z, (float) (this.dolphin.getMaxHeadYRot() + 20), (float) this.dolphin.getMaxHeadXRot());
+                this.dolphin.getNavigation().moveTo(vec3d1.x, vec3d1.y, vec3d1.z, 1.3D);
+                if (world.random.nextInt(this.adjustedTickDelay(80)) == 0) {
+                    world.broadcastEntityEvent(this.dolphin, (byte) 38);
                 }
             }
+
         }
     }
 
-    static class DolphinSwimWithPlayerGoal extends Goal {
+    private static class DolphinSwimWithPlayerGoal extends Goal {
+
         private final Dolphin dolphin;
         private final double speedModifier;
         @Nullable
@@ -459,17 +474,17 @@
         @Override
         public boolean canUse() {
             this.player = this.dolphin.level().getNearestPlayer(Dolphin.SWIM_WITH_PLAYER_TARGETING, this.dolphin);
-            return this.player != null && this.player.isSwimming() && this.dolphin.getTarget() != this.player;
+            return this.player == null ? false : this.player.isSwimming() && this.dolphin.getTarget() != this.player;
         }
 
         @Override
         public boolean canContinueToUse() {
-            return this.player != null && this.player.isSwimming() && this.dolphin.distanceToSqr(this.player) < 256.0;
+            return this.player != null && this.player.isSwimming() && this.dolphin.distanceToSqr((Entity) this.player) < 256.0D;
         }
 
         @Override
         public void start() {
-            this.player.addEffect(new MobEffectInstance(MobEffects.DOLPHINS_GRACE, 100), this.dolphin);
+            this.player.addEffect(new MobEffectInstance(MobEffects.DOLPHINS_GRACE, 100), this.dolphin, EntityPotionEffectEvent.Cause.DOLPHIN); // CraftBukkit
         }
 
         @Override
@@ -480,39 +495,43 @@
 
         @Override
         public void tick() {
-            this.dolphin.getLookControl().setLookAt(this.player, (float)(this.dolphin.getMaxHeadYRot() + 20), (float)this.dolphin.getMaxHeadXRot());
-            if (this.dolphin.distanceToSqr(this.player) < 6.25) {
+            this.dolphin.getLookControl().setLookAt(this.player, (float) (this.dolphin.getMaxHeadYRot() + 20), (float) this.dolphin.getMaxHeadXRot());
+            if (this.dolphin.distanceToSqr((Entity) this.player) < 6.25D) {
                 this.dolphin.getNavigation().stop();
             } else {
-                this.dolphin.getNavigation().moveTo(this.player, this.speedModifier);
+                this.dolphin.getNavigation().moveTo((Entity) this.player, this.speedModifier);
             }
 
             if (this.player.isSwimming() && this.player.level().random.nextInt(6) == 0) {
-                this.player.addEffect(new MobEffectInstance(MobEffects.DOLPHINS_GRACE, 100), this.dolphin);
+                this.player.addEffect(new MobEffectInstance(MobEffects.DOLPHINS_GRACE, 100), this.dolphin, EntityPotionEffectEvent.Cause.DOLPHIN); // CraftBukkit
             }
+
         }
     }
 
-    class PlayWithItemsGoal extends Goal {
+    private class PlayWithItemsGoal extends Goal {
+
         private int cooldown;
 
+        PlayWithItemsGoal() {}
+
         @Override
         public boolean canUse() {
             if (this.cooldown > Dolphin.this.tickCount) {
                 return false;
             } else {
-                List<ItemEntity> list = Dolphin.this.level()
-                    .getEntitiesOfClass(ItemEntity.class, Dolphin.this.getBoundingBox().inflate(8.0, 8.0, 8.0), Dolphin.ALLOWED_ITEMS);
+                List<ItemEntity> list = Dolphin.this.level().getEntitiesOfClass(ItemEntity.class, Dolphin.this.getBoundingBox().inflate(8.0D, 8.0D, 8.0D), Dolphin.ALLOWED_ITEMS);
+
                 return !list.isEmpty() || !Dolphin.this.getItemBySlot(EquipmentSlot.MAINHAND).isEmpty();
             }
         }
 
         @Override
         public void start() {
-            List<ItemEntity> list = Dolphin.this.level()
-                .getEntitiesOfClass(ItemEntity.class, Dolphin.this.getBoundingBox().inflate(8.0, 8.0, 8.0), Dolphin.ALLOWED_ITEMS);
+            List<ItemEntity> list = Dolphin.this.level().getEntitiesOfClass(ItemEntity.class, Dolphin.this.getBoundingBox().inflate(8.0D, 8.0D, 8.0D), Dolphin.ALLOWED_ITEMS);
+
             if (!list.isEmpty()) {
-                Dolphin.this.getNavigation().moveTo(list.get(0), 1.2F);
+                Dolphin.this.getNavigation().moveTo((Entity) list.get(0), 1.2000000476837158D);
                 Dolphin.this.playSound(SoundEvents.DOLPHIN_PLAY, 1.0F, 1.0F);
             }
 
@@ -521,48 +540,43 @@
 
         @Override
         public void stop() {
-            ItemStack itemStack = Dolphin.this.getItemBySlot(EquipmentSlot.MAINHAND);
-            if (!itemStack.isEmpty()) {
-                this.drop(itemStack);
+            ItemStack itemstack = Dolphin.this.getItemBySlot(EquipmentSlot.MAINHAND);
+
+            if (!itemstack.isEmpty()) {
+                this.drop(itemstack);
                 Dolphin.this.setItemSlot(EquipmentSlot.MAINHAND, ItemStack.EMPTY);
                 this.cooldown = Dolphin.this.tickCount + Dolphin.this.random.nextInt(100);
             }
+
         }
 
         @Override
         public void tick() {
-            List<ItemEntity> list = Dolphin.this.level()
-                .getEntitiesOfClass(ItemEntity.class, Dolphin.this.getBoundingBox().inflate(8.0, 8.0, 8.0), Dolphin.ALLOWED_ITEMS);
-            ItemStack itemStack = Dolphin.this.getItemBySlot(EquipmentSlot.MAINHAND);
-            if (!itemStack.isEmpty()) {
-                this.drop(itemStack);
+            List<ItemEntity> list = Dolphin.this.level().getEntitiesOfClass(ItemEntity.class, Dolphin.this.getBoundingBox().inflate(8.0D, 8.0D, 8.0D), Dolphin.ALLOWED_ITEMS);
+            ItemStack itemstack = Dolphin.this.getItemBySlot(EquipmentSlot.MAINHAND);
+
+            if (!itemstack.isEmpty()) {
+                this.drop(itemstack);
                 Dolphin.this.setItemSlot(EquipmentSlot.MAINHAND, ItemStack.EMPTY);
             } else if (!list.isEmpty()) {
-                Dolphin.this.getNavigation().moveTo(list.get(0), 1.2F);
+                Dolphin.this.getNavigation().moveTo((Entity) list.get(0), 1.2000000476837158D);
             }
+
         }
 
         private void drop(ItemStack stack) {
             if (!stack.isEmpty()) {
-                double d = Dolphin.this.getEyeY() - 0.3F;
-                ItemEntity itemEntity = new ItemEntity(Dolphin.this.level(), Dolphin.this.getX(), d, Dolphin.this.getZ(), stack);
-                itemEntity.setPickUpDelay(40);
-                itemEntity.setThrower(Dolphin.this);
+                double d0 = Dolphin.this.getEyeY() - 0.30000001192092896D;
+                ItemEntity entityitem = new ItemEntity(Dolphin.this.level(), Dolphin.this.getX(), d0, Dolphin.this.getZ(), stack);
+
+                entityitem.setPickUpDelay(40);
+                entityitem.setThrower(Dolphin.this);
                 float f = 0.3F;
-                float g = Dolphin.this.random.nextFloat() * (float) (Math.PI * 2);
-                float h = 0.02F * Dolphin.this.random.nextFloat();
-                itemEntity.setDeltaMovement(
-                    (double)(
-                        0.3F * -Mth.sin(Dolphin.this.getYRot() * (float) (Math.PI / 180.0)) * Mth.cos(Dolphin.this.getXRot() * (float) (Math.PI / 180.0))
-                            + Mth.cos(g) * h
-                    ),
-                    (double)(0.3F * Mth.sin(Dolphin.this.getXRot() * (float) (Math.PI / 180.0)) * 1.5F),
-                    (double)(
-                        0.3F * Mth.cos(Dolphin.this.getYRot() * (float) (Math.PI / 180.0)) * Mth.cos(Dolphin.this.getXRot() * (float) (Math.PI / 180.0))
-                            + Mth.sin(g) * h
-                    )
-                );
-                Dolphin.this.level().addFreshEntity(itemEntity);
+                float f1 = Dolphin.this.random.nextFloat() * 6.2831855F;
+                float f2 = 0.02F * Dolphin.this.random.nextFloat();
+
+                entityitem.setDeltaMovement((double) (0.3F * -Mth.sin(Dolphin.this.getYRot() * 0.017453292F) * Mth.cos(Dolphin.this.getXRot() * 0.017453292F) + Mth.cos(f1) * f2), (double) (0.3F * Mth.sin(Dolphin.this.getXRot() * 0.017453292F) * 1.5F), (double) (0.3F * Mth.cos(Dolphin.this.getYRot() * 0.017453292F) * Mth.cos(Dolphin.this.getXRot() * 0.017453292F) + Mth.sin(f1) * f2));
+                Dolphin.this.spawnAtLocation(entityitem); // Paper - Call EntityDropItemEvent
             }
         }
     }
