blob: ec8f00da6c5561b6c4393577cfb473a524369d0a [file] [log] [blame] [raw]
package com.legacy.aether.entities.hostile;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLiving;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.SharedMonsterAttributes;
import net.minecraft.entity.monster.IMob;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.DamageSource;
import net.minecraft.world.World;
import com.legacy.aether.blocks.BlocksAether;
public class EntitySentry extends EntityLiving implements IMob {
private int jumpCount;
public int searchTicks;
public int lostTicks;
public EntitySentry(World world) {
super(world);
this.yOffset = 0.0F;
this.jumpCount = this.rand.nextInt(20) + 10;
}
public EntitySentry(World world, double x, double y, double z) {
this(world);
this.rotationYaw = (float) this.rand.nextInt(4) * 1.570796F;
this.setPosition(x, y, z);
this.setSize(0.85F, 0.85F);
}
@Override
public void entityInit() {
super.entityInit();
this.dataWatcher.addObject(20, new Byte((byte) 0));
}
@Override
protected void applyEntityAttributes() {
super.applyEntityAttributes();
this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(1.0D);
}
@Override
public void writeEntityToNBT(NBTTagCompound compound) {
super.writeEntityToNBT(compound);
compound.setBoolean("awake", this.isAwake());
}
@Override
public void readEntityFromNBT(NBTTagCompound compound) {
super.readEntityFromNBT(compound);
this.setAwake(compound.getBoolean("awake"));
}
@Override
public void onUpdate() {
boolean flag = this.onGround;
super.onUpdate();
if (this.onGround && !flag) {
this.worldObj.playSoundAtEntity(this, "mob.slime", getSoundVolume(), ((rand.nextFloat() - rand.nextFloat()) * 0.2F + 1.0F) / 0.8F);
} else if (!this.onGround && flag && this.getAttackTarget() != null) {
this.motionX *= 3D;
this.motionZ *= 3D;
}
if (this.getAttackTarget() != null && this.getAttackTarget().isDead) {
this.setAttackTarget(null);
}
}
@Override
public boolean attackEntityFrom(DamageSource source, float damage) {
boolean flag = super.attackEntityFrom(source, damage);
if (flag && (source.getEntity() instanceof EntityLiving)) {
this.lostTicks = 0;
this.setAwake(true);
this.setAttackTarget((EntityLivingBase) source.getEntity());
}
return flag;
}
@Override
public void applyEntityCollision(Entity entity) {
if (!this.isDead && this.getAttackTarget() != null && this.getAttackTarget() == entity) {
this.worldObj.createExplosion(entity, this.posX, this.posY, this.posZ, 0.1F, false);
entity.attackEntityFrom(DamageSource.causeMobDamage(this), 2.0F);
if (entity instanceof EntityLivingBase) {
EntityLivingBase entityliving = (EntityLivingBase) entity;
double d = entityliving.posX - this.posX;
double d2;
for (d2 = entityliving.posZ - this.posZ; d * d + d2 * d2 < 0.0001D; d2 = (Math.random() - Math.random()) * 0.01D) {
d = (Math.random() - Math.random()) * 0.01D;
}
entityliving.knockBack(this, 5, -d, -d2);
entityliving.motionX *= 4D;
entityliving.motionY *= 4D;
entityliving.motionZ *= 4D;
}
float f = 0.01745329F;
for (int i = 0; i < 40; i++) {
double d1 = (float) this.posX + this.rand.nextFloat() * 0.25F;
double d3 = (float) this.posY + 0.5F;
double d4 = (float) this.posZ + this.rand.nextFloat() * 0.25F;
float f1 = this.rand.nextFloat() * 360F;
this.worldObj.spawnParticle("explode", d1, d3, d4, -Math.sin(f * f1) * 0.75D, 0.125D, Math.cos(f * f1) * 0.75D);
}
this.setDead();
}
}
@Override
protected void updateEntityActionState() {
EntityPlayer player = this.worldObj.getClosestPlayerToEntity(this, 8.0D);
if (!this.isAwake() && this.searchTicks >= 8) {
if (player != null && this.canEntityBeSeen(player)) {
this.lostTicks = 0;
this.setAwake(true);
this.setAttackTarget(player);
this.faceEntity(player, 10.0F, 10.0F);
}
this.searchTicks = 0;
} else if (this.isAwake() && this.searchTicks >= 8) {
if (this.getAttackTarget() == null) {
if (player != null && this.canEntityBeSeen(player)) {
this.lostTicks = 0;
this.setAwake(true);
this.setAttackTarget(player);
} else {
++this.lostTicks;
if (this.lostTicks >= 4) {
this.setSentryLost();
}
}
} else if (this.getAttackTarget().isDead || !this.canEntityBeSeen(this.getAttackTarget()) || this.getDistanceToEntity(this.getAttackTarget()) >= 16.0F) {
++this.lostTicks;
if (this.lostTicks >= 4) {
this.setSentryLost();
}
} else {
this.lostTicks = 0;
}
this.searchTicks = 0;
} else {
++this.searchTicks;
}
if (!this.isAwake()) {
return;
}
if (this.getAttackTarget() != null) {
this.faceEntity(this.getAttackTarget(), 10.0F, 10.0F);
}
if (this.onGround && this.jumpCount-- <= 0) {
this.isJumping = true;
this.moveForward = 1.0F;
this.jumpCount = this.rand.nextInt(20) + 10;
this.moveStrafing = 0.5F - this.rand.nextFloat();
if (this.getAttackTarget() != null) {
this.jumpCount /= 2;
this.moveForward = 1.0F;
}
this.playSound("mob.slime", getSoundVolume(), ((this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F) * 0.8F);
} else {
this.isJumping = false;
if (this.onGround) {
this.moveStrafing = this.moveForward = 0.0F;
}
}
}
private void setSentryLost() {
this.lostTicks = 0;
this.searchTicks = -64;
this.setAttackTarget(null);
}
public void setAwake(boolean awake) {
this.dataWatcher.updateObject(20, (byte) (awake ? 1 : 0));
}
public boolean isAwake() {
return this.dataWatcher.getWatchableObjectByte(20) == (byte) 1;
}
@Override
protected String getHurtSound() {
return "mob.slime";
}
@Override
protected String getDeathSound() {
return "mob.slime";
}
@Override
protected float getSoundVolume() {
return 0.6F;
}
@Override
protected Item getDropItem() {
return this.rand.nextInt(5) == 0 ? Item.getItemFromBlock(BlocksAether.sentry_stone) : Item.getItemFromBlock(BlocksAether.carved_stone);
}
}