package net.minecraft.entity.passive; import com.google.common.base.Predicate; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityAgeable; import net.minecraft.entity.IEntityLivingData; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.EntityAIAvoidEntity; import net.minecraft.entity.ai.EntityAIFollowOwner; import net.minecraft.entity.ai.EntityAILeapAtTarget; import net.minecraft.entity.ai.EntityAIMate; import net.minecraft.entity.ai.EntityAIOcelotAttack; import net.minecraft.entity.ai.EntityAIOcelotSit; import net.minecraft.entity.ai.EntityAISwimming; import net.minecraft.entity.ai.EntityAITargetNonTamed; import net.minecraft.entity.ai.EntityAITempt; import net.minecraft.entity.ai.EntityAIWander; import net.minecraft.entity.ai.EntityAIWatchClosest; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.pathfinding.PathNavigateGround; import net.minecraft.util.BlockPos; import net.minecraft.util.DamageSource; import net.minecraft.util.StatCollector; import net.minecraft.world.DifficultyInstance; import net.minecraft.world.World; public class EntityOcelot extends EntityTameable { private EntityAIAvoidEntity field_175545_bm; /** * The tempt AI task for this mob, used to prevent taming while it is fleeing. */ private EntityAITempt aiTempt; private static final String __OBFID = "CL_00001646"; public EntityOcelot(World worldIn) { super(worldIn); this.setSize(0.6F, 0.7F); ((PathNavigateGround)this.getNavigator()).func_179690_a(true); this.tasks.addTask(1, new EntityAISwimming(this)); this.tasks.addTask(2, this.aiSit); this.tasks.addTask(3, this.aiTempt = new EntityAITempt(this, 0.6D, Items.fish, true)); this.tasks.addTask(5, new EntityAIFollowOwner(this, 1.0D, 10.0F, 5.0F)); this.tasks.addTask(6, new EntityAIOcelotSit(this, 0.8D)); this.tasks.addTask(7, new EntityAILeapAtTarget(this, 0.3F)); this.tasks.addTask(8, new EntityAIOcelotAttack(this)); this.tasks.addTask(9, new EntityAIMate(this, 0.8D)); this.tasks.addTask(10, new EntityAIWander(this, 0.8D)); this.tasks.addTask(11, new EntityAIWatchClosest(this, EntityPlayer.class, 10.0F)); this.targetTasks.addTask(1, new EntityAITargetNonTamed(this, EntityChicken.class, false, (Predicate)null)); } protected void entityInit() { super.entityInit(); this.dataWatcher.addObject(18, Byte.valueOf((byte)0)); } public void updateAITasks() { if (this.getMoveHelper().isUpdating()) { double var1 = this.getMoveHelper().getSpeed(); if (var1 == 0.6D) { this.setSneaking(true); this.setSprinting(false); } else if (var1 == 1.33D) { this.setSneaking(false); this.setSprinting(true); } else { this.setSneaking(false); this.setSprinting(false); } } else { this.setSneaking(false); this.setSprinting(false); } } /** * Determines if an entity can be despawned, used on idle far away entities */ protected boolean canDespawn() { return !this.isTamed() && this.ticksExisted > 2400; } protected void applyEntityAttributes() { super.applyEntityAttributes(); this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(10.0D); this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.30000001192092896D); } public void fall(float distance, float damageMultiplier) {} /** * (abstract) Protected helper method to write subclass entity data to NBT. */ public void writeEntityToNBT(NBTTagCompound tagCompound) { super.writeEntityToNBT(tagCompound); tagCompound.setInteger("CatType", this.getTameSkin()); } /** * (abstract) Protected helper method to read subclass entity data from NBT. */ public void readEntityFromNBT(NBTTagCompound tagCompund) { super.readEntityFromNBT(tagCompund); this.setTameSkin(tagCompund.getInteger("CatType")); } /** * Returns the sound this mob makes while it's alive. */ protected String getLivingSound() { return this.isTamed() ? (this.isInLove() ? "mob.cat.purr" : (this.rand.nextInt(4) == 0 ? "mob.cat.purreow" : "mob.cat.meow")) : ""; } /** * Returns the sound this mob makes when it is hurt. */ protected String getHurtSound() { return "mob.cat.hitt"; } /** * Returns the sound this mob makes on death. */ protected String getDeathSound() { return "mob.cat.hitt"; } /** * Returns the volume for the sounds this mob makes. */ protected float getSoundVolume() { return 0.4F; } protected Item getDropItem() { return Items.leather; } public boolean attackEntityAsMob(Entity p_70652_1_) { return p_70652_1_.attackEntityFrom(DamageSource.causeMobDamage(this), 3.0F); } /** * Called when the entity is attacked. */ public boolean attackEntityFrom(DamageSource source, float amount) { if (this.func_180431_b(source)) { return false; } else { this.aiSit.setSitting(false); return super.attackEntityFrom(source, amount); } } /** * Drop 0-2 items of this living's type */ protected void dropFewItems(boolean p_70628_1_, int p_70628_2_) {} /** * Called when a player interacts with a mob. e.g. gets milk from a cow, gets into the saddle on a pig. */ public boolean interact(EntityPlayer p_70085_1_) { ItemStack var2 = p_70085_1_.inventory.getCurrentItem(); if (this.isTamed()) { if (this.func_152114_e(p_70085_1_) && !this.worldObj.isRemote && !this.isBreedingItem(var2)) { this.aiSit.setSitting(!this.isSitting()); } } else if (this.aiTempt.isRunning() && var2 != null && var2.getItem() == Items.fish && p_70085_1_.getDistanceSqToEntity(this) < 9.0D) { if (!p_70085_1_.capabilities.isCreativeMode) { --var2.stackSize; } if (var2.stackSize <= 0) { p_70085_1_.inventory.setInventorySlotContents(p_70085_1_.inventory.currentItem, (ItemStack)null); } if (!this.worldObj.isRemote) { if (this.rand.nextInt(3) == 0) { this.setTamed(true); this.setTameSkin(1 + this.worldObj.rand.nextInt(3)); this.func_152115_b(p_70085_1_.getUniqueID().toString()); this.playTameEffect(true); this.aiSit.setSitting(true); this.worldObj.setEntityState(this, (byte)7); } else { this.playTameEffect(false); this.worldObj.setEntityState(this, (byte)6); } } return true; } return super.interact(p_70085_1_); } public EntityOcelot func_180493_b(EntityAgeable p_180493_1_) { EntityOcelot var2 = new EntityOcelot(this.worldObj); if (this.isTamed()) { var2.func_152115_b(this.func_152113_b()); var2.setTamed(true); var2.setTameSkin(this.getTameSkin()); } return var2; } /** * Checks if the parameter is an item which this animal can be fed to breed it (wheat, carrots or seeds depending on * the animal type) */ public boolean isBreedingItem(ItemStack p_70877_1_) { return p_70877_1_ != null && p_70877_1_.getItem() == Items.fish; } /** * Returns true if the mob is currently able to mate with the specified mob. */ public boolean canMateWith(EntityAnimal p_70878_1_) { if (p_70878_1_ == this) { return false; } else if (!this.isTamed()) { return false; } else if (!(p_70878_1_ instanceof EntityOcelot)) { return false; } else { EntityOcelot var2 = (EntityOcelot)p_70878_1_; return !var2.isTamed() ? false : this.isInLove() && var2.isInLove(); } } public int getTameSkin() { return this.dataWatcher.getWatchableObjectByte(18); } public void setTameSkin(int p_70912_1_) { this.dataWatcher.updateObject(18, Byte.valueOf((byte)p_70912_1_)); } /** * Checks if the entity's current position is a valid location to spawn this entity. */ public boolean getCanSpawnHere() { return this.worldObj.rand.nextInt(3) != 0; } /** * Whether or not the current entity is in lava */ public boolean handleLavaMovement() { if (this.worldObj.checkNoEntityCollision(this.getEntityBoundingBox(), this) && this.worldObj.getCollidingBoundingBoxes(this, this.getEntityBoundingBox()).isEmpty() && !this.worldObj.isAnyLiquid(this.getEntityBoundingBox())) { BlockPos var1 = new BlockPos(this.posX, this.getEntityBoundingBox().minY, this.posZ); if (var1.getY() < 63) { return false; } Block var2 = this.worldObj.getBlockState(var1.offsetDown()).getBlock(); if (var2 == Blocks.grass || var2.getMaterial() == Material.leaves) { return true; } } return false; } /** * Gets the name of this command sender (usually username, but possibly "Rcon") */ public String getName() { return this.hasCustomName() ? this.getCustomNameTag() : (this.isTamed() ? StatCollector.translateToLocal("entity.Cat.name") : super.getName()); } public void setTamed(boolean p_70903_1_) { super.setTamed(p_70903_1_); } protected void func_175544_ck() { if (this.field_175545_bm == null) { this.field_175545_bm = new EntityAIAvoidEntity(this, new Predicate() { private static final String __OBFID = "CL_00002243"; public boolean func_179874_a(Entity p_179874_1_) { return p_179874_1_ instanceof EntityPlayer; } public boolean apply(Object p_apply_1_) { return this.func_179874_a((Entity)p_apply_1_); } }, 16.0F, 0.8D, 1.33D); } this.tasks.removeTask(this.field_175545_bm); if (!this.isTamed()) { this.tasks.addTask(4, this.field_175545_bm); } } public IEntityLivingData func_180482_a(DifficultyInstance p_180482_1_, IEntityLivingData p_180482_2_) { p_180482_2_ = super.func_180482_a(p_180482_1_, p_180482_2_); if (this.worldObj.rand.nextInt(7) == 0) { for (int var3 = 0; var3 < 2; ++var3) { EntityOcelot var4 = new EntityOcelot(this.worldObj); var4.setLocationAndAngles(this.posX, this.posY, this.posZ, this.rotationYaw, 0.0F); var4.setGrowingAge(-24000); this.worldObj.spawnEntityInWorld(var4); } } return p_180482_2_; } public EntityAgeable createChild(EntityAgeable p_90011_1_) { return this.func_180493_b(p_90011_1_); } }