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    }