--- a/net/minecraft/world/entity/animal/Pufferfish.java
+++ b/net/minecraft/world/entity/animal/Pufferfish.java
@@ -96,24 +_,36 @@
     public void tick() {
         if (!this.level().isClientSide && this.isAlive() && this.isEffectiveAi()) {
             if (this.inflateCounter > 0) {
+                boolean increase = true; // Paper - Add PufferFishStateChangeEvent
                 if (this.getPuffState() == 0) {
+                    if (new io.papermc.paper.event.entity.PufferFishStateChangeEvent((org.bukkit.entity.PufferFish) getBukkitEntity(), 1).callEvent()) { // Paper - Add PufferFishStateChangeEvent
                     this.makeSound(SoundEvents.PUFFER_FISH_BLOW_UP);
                     this.setPuffState(1);
+                    } else { increase = false; } // Paper - Add PufferFishStateChangeEvent
                 } else if (this.inflateCounter > 40 && this.getPuffState() == 1) {
+                    if (new io.papermc.paper.event.entity.PufferFishStateChangeEvent((org.bukkit.entity.PufferFish) getBukkitEntity(), 2).callEvent()) { // Paper - Add PufferFishStateChangeEvent
                     this.makeSound(SoundEvents.PUFFER_FISH_BLOW_UP);
                     this.setPuffState(2);
+                    } else { increase = false; } // Paper - Add PufferFishStateChangeEvent
                 }
 
+                if (increase) // Paper - Add PufferFishStateChangeEvent
                 this.inflateCounter++;
             } else if (this.getPuffState() != 0) {
+                boolean increase = true; // Paper - Add PufferFishStateChangeEvent
                 if (this.deflateTimer > 60 && this.getPuffState() == 2) {
+                    if (new io.papermc.paper.event.entity.PufferFishStateChangeEvent((org.bukkit.entity.PufferFish) getBukkitEntity(), 1).callEvent()) { // Paper - Add PufferFishStateChangeEvent
                     this.makeSound(SoundEvents.PUFFER_FISH_BLOW_OUT);
                     this.setPuffState(1);
+                    } else { increase = false; } // Paper - Add PufferFishStateChangeEvent
                 } else if (this.deflateTimer > 100 && this.getPuffState() == 1) {
+                    if (new io.papermc.paper.event.entity.PufferFishStateChangeEvent((org.bukkit.entity.PufferFish) getBukkitEntity(), 0).callEvent()) { // Paper - Add PufferFishStateChangeEvent
                     this.makeSound(SoundEvents.PUFFER_FISH_BLOW_OUT);
                     this.setPuffState(0);
+                    } else { increase = false; } // Paper - Add PufferFishStateChangeEvent
                 }
 
+                if (increase) // Paper - Add PufferFishStateChangeEvent
                 this.deflateTimer++;
             }
         }
@@ -137,7 +_,7 @@
     private void touch(ServerLevel level, Mob mob) {
         int puffState = this.getPuffState();
         if (mob.hurtServer(level, this.damageSources().mobAttack(this), 1 + puffState)) {
-            mob.addEffect(new MobEffectInstance(MobEffects.POISON, 60 * puffState, 0), this);
+            mob.addEffect(new MobEffectInstance(MobEffects.POISON, 60 * puffState, 0), this, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.ATTACK); // CraftBukkit
             this.playSound(SoundEvents.PUFFER_FISH_STING, 1.0F, 1.0F);
         }
     }
@@ -152,22 +_,22 @@
                 serverPlayer.connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.PUFFER_FISH_STING, 0.0F));
             }
 
-            entity.addEffect(new MobEffectInstance(MobEffects.POISON, 60 * puffState, 0), this);
+            entity.addEffect(new MobEffectInstance(MobEffects.POISON, 60 * puffState, 0), this, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.ATTACK); // CraftBukkit
         }
     }
 
     @Override
-    protected SoundEvent getAmbientSound() {
+    public SoundEvent getAmbientSound() {
         return SoundEvents.PUFFER_FISH_AMBIENT;
     }
 
     @Override
-    protected SoundEvent getDeathSound() {
+    public SoundEvent getDeathSound() {
         return SoundEvents.PUFFER_FISH_DEATH;
     }
 
     @Override
-    protected SoundEvent getHurtSound(DamageSource damageSource) {
+    public SoundEvent getHurtSound(DamageSource damageSource) {
         return SoundEvents.PUFFER_FISH_HURT;
     }
 
