    001    package net.minecraft.entity.passive;
    002
    003    import net.minecraft.block.material.Material;
    004    import net.minecraft.entity.EntityCreature;
    005    import net.minecraft.entity.player.EntityPlayer;
    006    import net.minecraft.util.DamageSource;
    007    import net.minecraft.world.World;
    008
    009    public abstract class EntityWaterMob extends EntityCreature implements IAnimals
    010    {
    011        public EntityWaterMob(World par1World)
    012        {
    013            super(par1World);
    014        }
    015
    016        public boolean canBreatheUnderwater()
    017        {
    018            return true;
    019        }
    020
    021        /**
    022         * Checks if the entity's current position is a valid location to spawn this entity.
    023         */
    024        public boolean getCanSpawnHere()
    025        {
    026            return this.worldObj.checkIfAABBIsClear(this.boundingBox);
    027        }
    028
    029        /**
    030         * Get number of ticks, at least during which the living entity will be silent.
    031         */
    032        public int getTalkInterval()
    033        {
    034            return 120;
    035        }
    036
    037        /**
    038         * Determines if an entity can be despawned, used on idle far away entities
    039         */
    040        protected boolean canDespawn()
    041        {
    042            return true;
    043        }
    044
    045        /**
    046         * Get the experience points the entity currently has.
    047         */
    048        protected int getExperiencePoints(EntityPlayer par1EntityPlayer)
    049        {
    050            return 1 + this.worldObj.rand.nextInt(3);
    051        }
    052
    053        /**
    054         * Gets called every tick from main Entity class
    055         */
    056        public void onEntityUpdate()
    057        {
    058            int var1 = this.getAir();
    059            super.onEntityUpdate();
    060
    061            if (this.isEntityAlive() && !this.isInsideOfMaterial(Material.water))
    062            {
    063                --var1;
    064                this.setAir(var1);
    065
    066                if (this.getAir() == -20)
    067                {
    068                    this.setAir(0);
    069                    this.attackEntityFrom(DamageSource.drown, 2);
    070                }
    071            }
    072            else
    073            {
    074                this.setAir(300);
    075            }
    076        }
    077    }