package net.tropicraft.entity.passive; import java.util.List; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityAgeable; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.monster.IMob; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.DamageSource; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.tropicraft.entity.EntityTropicraftAnimal; import net.tropicraft.registry.TCItemRegistry; public class EntityIguana extends EntityTropicraftAnimal implements IMob { /** Timer for how much longer the iggy will be enraged */ private int angerLevel; public EntityIguana(World world) { super(world); this.isImmuneToFire = true; setSize(1.0F, 0.4F); } /** * Get all iggys in range to fire at will */ @Override public boolean attackEntityFrom(DamageSource damagesource, float range) { if (this.isEntityInvulnerable()) { return false; } else { Entity entity = damagesource.getEntity(); if (entity instanceof EntityPlayer) { List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.expand(32.0D, 32.0D, 32.0D)); for (int i = 0; i < list.size(); ++i) { Entity entity1 = (Entity)list.get(i); if (entity1 instanceof EntityIguana) { EntityIguana iggy = (EntityIguana)entity1; iggy.becomeAngryAt(entity); } } this.becomeAngryAt(entity); } return super.attackEntityFrom(damagesource, range); } } /** * Taken from EntityPigZombie * @param entity Entity to become angry at */ private void becomeAngryAt(Entity entity) { this.entityToAttack = entity; this.angerLevel = 400 + this.rand.nextInt(400); } @Override public void attackEntity(Entity entity, float range) { if(range > 2.0F && range < 6F && rand.nextInt(10) == 0) { if(onGround) { double d = entity.posX - posX; double d1 = entity.posZ - posZ; float f1 = MathHelper.sqrt_double(d * d + d1 * d1); motionX = (d / (double)f1) * 0.5D * 0.80000001192092896D + motionX * 0.20000000298023224D; motionZ = (d1 / (double)f1) * 0.5D * 0.80000001192092896D + motionZ * 0.20000000298023224D; motionY = 0.40000000596046448D; } } else if(range < 1.5F && entity.boundingBox.maxY > boundingBox.minY && entity.boundingBox.minY < boundingBox.maxY) { attackTime = 20; byte byte0 = 2; entity.attackEntityFrom(DamageSource.causeMobDamage(this), byte0); } } @Override public boolean isAIEnabled() { return false; } @Override protected void fall(float f) { // No falling damage, mwahahaha } @Override protected void dropFewItems(boolean recentlyHit, int looting) { int numDrops = 3 + this.rand.nextInt(1 + looting); for (int i = 0; i < numDrops; i++) this.dropItem(TCItemRegistry.scale, 1); } @Override public void applyEntityAttributes() { super.applyEntityAttributes(); this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(10.0D); this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(1.0D); } @Override public Entity findPlayerToAttack() { if (angerLevel == 0) return null; EntityPlayer entityplayer = this.worldObj.getClosestVulnerablePlayerToEntity(this, 16.0D); return entityplayer != null && this.canEntityBeSeen(entityplayer) ? entityplayer : null; } @Override public float getSoundVolume() { return 0.4F; } @Override protected String getLivingSound() { return tcSound("iggyliving"); } @Override protected String getHurtSound() { return tcSound("iggyattack"); } @Override protected String getDeathSound() { return tcSound("iggydeath"); } @Override public void writeEntityToNBT(NBTTagCompound nbt) { super.writeEntityToNBT(nbt); nbt.setShort("Anger", (short)this.angerLevel); } @Override public void readEntityFromNBT(NBTTagCompound nbt) { super.readEntityFromNBT(nbt); this.angerLevel = nbt.getShort("Anger"); } @Override public EntityAgeable createChild(EntityAgeable var1) { return new EntityIguana(worldObj); } @Override public int getMaxSpawnedInChunk() { return 6; } }