package com.gildedgames.the_aether.entities.hostile; import java.util.ArrayList; import java.util.List; import net.minecraft.block.BlockLeaves; import net.minecraft.entity.Entity; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.monster.EntityCreeper; import net.minecraft.entity.monster.EntityMob; import net.minecraft.entity.passive.EntitySheep; 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.ItemDye; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.DamageSource; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import com.gildedgames.the_aether.blocks.BlocksAether; import com.gildedgames.the_aether.entities.particles.AetherParticle; import com.gildedgames.the_aether.entities.particles.ParticleEvilWhirly; import com.gildedgames.the_aether.entities.particles.ParticlePassiveWhirly; import com.gildedgames.the_aether.player.perks.AetherRankings; import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; public class EntityWhirlwind extends EntityMob { public ArrayList particles = new ArrayList(); public int lifeLeft; public int actionTimer; public float movementAngle; public float movementCurve; public boolean isRainbow; public boolean canDropItems = true; public EntityWhirlwind(World world) { super(world); this.setSize(0.6F, 0.8F); this.movementAngle = this.rand.nextFloat() * 360F; this.movementCurve = (this.rand.nextFloat() - this.rand.nextFloat()) * 0.1F; this.lifeLeft = this.rand.nextInt(512) + 512; if (this.rand.nextInt(10) == 0) { this.lifeLeft /= 2; this.setEvil(true); } this.setColorData(15); } @Override public float getBlockPathWeight(int x, int y, int z) { return this.worldObj.getBlock(x, y - 1, z) == BlocksAether.aether_grass ? 10.0F : this.worldObj.getLightBrightness(x, y, z) - 0.5F; } @Override protected void applyEntityAttributes() { super.applyEntityAttributes(); this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(10.0D); this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue((this.rand.nextDouble() * 0.025D) + 0.025D); this.getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(35.0D); this.setHealth(10.0F); } @Override protected void entityInit() { super.entityInit(); this.dataWatcher.addObject(20, new Byte((byte) 0)); this.dataWatcher.addObject(21, new Byte((byte) 15)); } public void setColorData(int data) { this.dataWatcher.updateObject(21, (byte) data); } public int getColorData() { return (int) this.dataWatcher.getWatchableObjectByte(21); } public void setEvil(boolean isEvil) { this.dataWatcher.updateObject(20, (byte) (isEvil ? 1 : 0)); } public boolean isEvil() { return this.dataWatcher.getWatchableObjectByte(20) == (byte) 1; } public void onLivingUpdate() { EntityPlayer closestPlayer = this.findClosestPlayer(); if (this.isEvil()) { if (closestPlayer != null && closestPlayer.onGround) { this.setAttackTarget(closestPlayer); } } if (this.getAttackTarget() == null) { this.motionX = Math.cos(0.01745329F * this.movementAngle) * this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).getAttributeValue(); this.motionZ = -Math.sin(0.01745329F * this.movementAngle) * this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).getAttributeValue(); this.movementAngle += this.movementCurve; } else { super.onLivingUpdate(); } if (this.lifeLeft != -100) { --this.lifeLeft; } if ((this.lifeLeft <= 0 && this.lifeLeft != -100) || this.handleWaterMovement()) { this.setDead(); } if (!this.worldObj.isRemote) { if (closestPlayer != null) { this.actionTimer++; } if (this.actionTimer >= 128) { if (this.isEvil()) { EntityCreeper entitycreeper = new EntityCreeper(this.worldObj); entitycreeper.setLocationAndAngles(this.posX, this.posY + 0.5D, this.posZ, this.rand.nextFloat() * 360F, 0.0F); entitycreeper.motionX = (double) (this.rand.nextFloat() - this.rand.nextFloat()) * 0.125D; entitycreeper.motionZ = (double) (this.rand.nextFloat() - this.rand.nextFloat()) * 0.125D; this.worldObj.spawnEntityInWorld(entitycreeper); this.actionTimer = 0; this.worldObj.playSoundAtEntity(this, "random.pop", 0.5F, 1.0F); } else if (this.canDropItems && this.rand.nextInt(4) == 0) { this.dropItem(this.getRandomDrop(), 1); this.actionTimer = 0; this.worldObj.playSoundAtEntity(this, "random.pop", 0.5F, 1.0F); } } } else { this.updateParticles(); } List list = this.worldObj.getEntitiesWithinAABBExcludingEntity(this, this.boundingBox.expand(2.5D, 2.5D, 2.5D)); for (int l = 0; l < list.size(); l++) { Entity entity = (Entity) list.get(l); double d9 = (float) entity.posX; double d11 = (float) entity.posY - entity.getYOffset() * 0.6F; double d13 = (float) entity.posZ; double d15 = this.getDistanceToEntity(entity); double d17 = d11 - this.posY; if (d15 <= 1.5D + d17) { entity.motionY = 0.15000000596046448D; entity.fallDistance = 0.0F; if (d17 > 1.5D) { entity.motionY = -0.44999998807907104D + d17 * 0.34999999403953552D; d15 += d17 * 1.5D; } else { entity.motionY = 0.125D; } double d19 = Math.atan2(this.posX - d9, this.posZ - d13) / 0.01745329424738884D; d19 += 160D; entity.motionX = -Math.cos(0.01745329424738884D * d19) * (d15 + 0.25D) * 0.10000000149011612D; entity.motionZ = Math.sin(0.01745329424738884D * d19) * (d15 + 0.25D) * 0.10000000149011612D; if (entity instanceof EntityWhirlwind) { entity.setDead(); if (!this.isEvil()) { this.lifeLeft /= 2; this.setEvil(true); this.playSound("random.fizz", this.rand.nextFloat() - this.rand.nextFloat() * 0.2F + 1.2F, 1.0F); } } } else { double d20 = Math.atan2(this.posX - d9, this.posZ - d13) / 0.01745329424738884D; entity.motionX += Math.sin(0.01745329424738884D * d20) * 0.0099999997764825821D; entity.motionZ += Math.cos(0.01745329424738884D * d20) * 0.0099999997764825821D; } if (!this.worldObj.isAirBlock((int) this.posX, (int) this.posY, (int) this.posZ)) { this.lifeLeft -= 50; } if (this.worldObj.getGameRules().getGameRuleBooleanValue("mobGriefing")) { int i2 = (MathHelper.floor_double(this.posX) - 1) + this.rand.nextInt(3); int j2 = MathHelper.floor_double(this.posY) + this.rand.nextInt(5); int k2 = (MathHelper.floor_double(this.posZ) - 1) + this.rand.nextInt(3); if (this.worldObj.getBlock(i2, j2, k2) instanceof BlockLeaves) { this.worldObj.setBlock(i2, j2, k2, Blocks.air); } } } } @Override public boolean interact(EntityPlayer player) { ItemStack heldItem = player.getCurrentEquippedItem(); if (heldItem != null && heldItem.getItem() == Items.dye && AetherRankings.isRankedPlayer(player.getUniqueID())) { this.setColorData(heldItem.getItemDamage()); return true; } return super.interact(player); } @Override public boolean canTriggerWalking() { return false; } @SideOnly(Side.CLIENT) public void updateParticles() { if (!this.isEvil()) { Integer color = ItemDye.field_150922_c[this.getColorData()]; for (int k = 0; k < 2; k++) { double d1 = (float) this.posX + rand.nextFloat() * 0.25F; double d4 = (float) posY + height + 0.125F; double d7 = (float) this.posZ + rand.nextFloat() * 0.25F; float f = rand.nextFloat() * 360F; AetherParticle particle = new ParticlePassiveWhirly(this.worldObj, -Math.sin(0.01745329F * f) * 0.75D, d4 - 0.25D, Math.cos(0.01745329F * f) * 0.75D, d1, 0.125D, d7); FMLClientHandler.instance().getClient().effectRenderer.addEffect(particle); this.particles.add(particle); particle.setRBGColorF((((color >> 16) & 0xFF) / 255F), (((color >> 8) & 0xFF) / 255F), ((color & 0xFF) / 255F)); if (this.isRainbow) { int k1 = this.ticksExisted / 25 + this.getEntityId(); int l = k1 % EntitySheep.fleeceColorTable.length; int i1 = (k1 + 1) % EntitySheep.fleeceColorTable.length; float f1 = ((float) (this.ticksExisted % 25)) / 25.0F; particle.setRBGColorF(EntitySheep.fleeceColorTable[l][0] * (1.0F - f1) + EntitySheep.fleeceColorTable[i1][0] * f1, EntitySheep.fleeceColorTable[l][1] * (1.0F - f1) + EntitySheep.fleeceColorTable[i1][1] * f1, EntitySheep.fleeceColorTable[l][2] * (1.0F - f1) + EntitySheep.fleeceColorTable[i1][2] * f1); } particle.setPosition(this.posX, this.posY, this.posZ); } } else { for (int k = 0; k < 3; k++) { double d2 = (float) posX + rand.nextFloat() * 0.25F; double d5 = (float) posY + height + 0.125F; double d8 = (float) posZ + rand.nextFloat() * 0.25F; float f1 = rand.nextFloat() * 360F; AetherParticle particle = new ParticleEvilWhirly(this.worldObj, -Math.sin(0.01745329F * f1) * 0.75D, d5 - 0.25D, Math.cos(0.01745329F * f1) * 0.75D, d2, 0.125D, d8, 3.5F); FMLClientHandler.instance().getClient().effectRenderer.addEffect(particle); this.particles.add(particle); particle.setPosition(this.posX, this.posY, this.posZ); } } if (this.particles.size() > 0) { for (int i1 = 0; i1 < this.particles.size(); i1++) { AetherParticle particle = (AetherParticle) this.particles.get(i1); if (particle.isDead) { this.particles.remove(particle); } else { double d10 = particle.getX(); double d12 = particle.boundingBox.minY; double d14 = particle.getZ(); double d16 = this.getDistanceToEntity(particle); double d18 = d12 - this.posY; particle.setMotionY(0.11500000208616257D); double d21 = Math.atan2(this.posX - d10, this.posZ - d14) / 0.01745329424738884D; d21 += 160D; particle.setMotionX(-Math.cos(0.01745329424738884D * d21) * (d16 * 2.5D - d18) * 0.10000000149011612D); particle.setMotionZ(Math.sin(0.01745329424738884D * d21) * (d16 * 2.5D - d18) * 0.10000000149011612D); } } } } public Item getRandomDrop() { int i = this.rand.nextInt(100) + 1; if (i == 100) { return Items.diamond; } if (i >= 96) { return Items.iron_ingot; } if (i >= 91) { return Items.gold_ingot; } if (i >= 82) { return Items.coal; } if (i >= 80) { return Item.getItemFromBlock(Blocks.pumpkin); } if (i >= 75) { return Item.getItemFromBlock(Blocks.gravel); } if (i >= 64) { return Item.getItemFromBlock(Blocks.clay); } if (i >= 52) { return Items.stick; } if (i >= 38) { return Items.flint; } if (i > 20) { return Item.getItemFromBlock(Blocks.log); } else { return Item.getItemFromBlock(Blocks.sand); } } @Override public boolean getCanSpawnHere() { int i = MathHelper.floor_double(this.posX); int j = MathHelper.floor_double(this.boundingBox.minY); int k = MathHelper.floor_double(this.posZ); return this.rand.nextInt(15) == 0 && this.worldObj.getBlock(i, j - 1, k) == BlocksAether.aether_grass && this.worldObj.getBlockLightValue(i, j, k) > 8 && this.worldObj.checkNoEntityCollision(this.boundingBox) && this.worldObj.getCollidingBoundingBoxes(this, this.boundingBox).isEmpty() && !this.worldObj.isAnyLiquid(this.boundingBox); } public EntityPlayer findClosestPlayer() { return this.worldObj.getClosestPlayerToEntity(this, 16D); } @Override public void writeEntityToNBT(NBTTagCompound compound) { super.writeEntityToNBT(compound); compound.setFloat("movementAngle", this.movementAngle); compound.setFloat("movementCurve", this.movementCurve); compound.setBoolean("isRainbow", this.isRainbow); compound.setBoolean("canDropItems", this.canDropItems); } @Override public void readEntityFromNBT(NBTTagCompound compound) { super.readEntityFromNBT(compound); this.movementAngle = compound.getFloat("movementAngle"); this.movementCurve = compound.getFloat("movementCurve"); this.isRainbow = compound.getBoolean("isRainbow"); this.canDropItems = compound.getBoolean("canDropItems"); } @Override public boolean attackEntityFrom(DamageSource source, float damage) { return false; } @Override public void applyEntityCollision(Entity entity) { } @Override public int getMaxSpawnedInChunk() { return 3; } @Override public boolean isOnLadder() { return this.isCollidedHorizontally; } }