package mods.eln.entity;
import mods.eln.misc.Utils;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityList;
import net.minecraft.entity.EnumCreatureAttribute;
import net.minecraft.entity.SharedMonsterAttributes;
import net.minecraft.entity.ai.*;
import net.minecraft.entity.monster.EntityMob;
import net.minecraft.entity.passive.EntityVillager;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.DamageSource;
import net.minecraft.world.World;
import java.util.ArrayList;
import java.util.Map.Entry;
import java.util.Random;
public class ReplicatorEntity extends EntityMob {
boolean isSpawnedFromWeather = false;
double hungerTime = 10 * 60;
double hungerToEnergy = 10.0 * hungerTime;
double energyToDuplicate = 10000;
double hungerToDuplicate = -energyToDuplicate / hungerToEnergy;
double hungerToCanibal = 0.6;
public static final ArrayList<ItemStack> dropList = new ArrayList<ItemStack>();
public ReplicatorEntity(World par1World) {
super(par1World);
func_110163_bv(); //persistenceRequired
this.setSize(0.3F, 0.7F);
ReplicatoCableAI replicatorIa = new ReplicatoCableAI(this);
int p = 0;
this.tasks.addTask(p++, new EntityAISwimming(this));
// this.tasks.addTask(p++, new EntityAIBreakDoor(this));
this.tasks.addTask(p++, new EntityAIAttackOnCollide(this, EntityPlayer.class, 1.0D, false));
this.tasks.addTask(p++, new EntityAIAttackOnCollide(this, EntityVillager.class, 1.0D, true));
this.tasks.addTask(p++, new EntityAIAttackOnCollide(this, ReplicatorEntity.class, 1.0D, true));
this.tasks.addTask(p++, replicatorIa);
this.tasks.addTask(p++, new EntityAIMoveTowardsRestriction(this, 1.0D));
this.tasks.addTask(p++, new EntityAIMoveThroughVillage(this, 1.0D, false));
this.tasks.addTask(p++, new ConfigurableAiWander(this, 1.0D, 20));
this.tasks.addTask(p, new EntityAIWatchClosest(this, EntityPlayer.class, 8.0F));
this.tasks.addTask(p++, new EntityAILookIdle(this));
p = 1;
this.targetTasks.addTask(p++, new EntityAIHurtByTarget(this, true));
this.targetTasks.addTask(p, new EntityAINearestAttackableTarget(this, EntityPlayer.class, 0, true));
this.targetTasks.addTask(p, new EntityAINearestAttackableTarget(this, EntityVillager.class, 0, false));
this.targetTasks.addTask(p++, new ReplicatorHungryAttack(this, ReplicatorEntity.class, 0, false));
// this.targetTasks.addTask(p++, new EntityAINearestAttackableTarget(this, ReplicatorEntity.class, 0, false));
// this.targetTasks.addTask(p++, replicatorIa);
}
@Override
public boolean attackEntityAsMob(Entity e) {
if (e instanceof ReplicatorEntity) {
this.hunger -= 0.4;
((ReplicatorEntity) e).hunger += 0.4;
}
return super.attackEntityAsMob(e);
}
@Override
protected void updateAITick() {
super.updateAITick();
//setDead();
hunger += 0.05 / hungerTime;
if (hunger > 1 && Math.random() < 0.05 / 5) {
attackEntityFrom(DamageSource.starve, 1);
}
if (hunger < 0.5 && Math.random() * 10 < 0.05) {
heal(1f);
}
if (hunger < hungerToDuplicate) {
ReplicatorEntity entityliving = new ReplicatorEntity(this.worldObj);
entityliving.setLocationAndAngles(this.posX, this.posY, this.posZ, 0f, 0f);
entityliving.rotationYawHead = entityliving.rotationYaw;
entityliving.renderYawOffset = entityliving.rotationYaw;
worldObj.spawnEntityInWorld(entityliving);
entityliving.playLivingSound();
hunger = 0;
}
}
void eatElectricity(double e) {
hunger = hunger - Math.min(0.001, e / hungerToEnergy);
}
protected void applyEntityAttributes() {
super.applyEntityAttributes();
this.getEntityAttribute(SharedMonsterAttributes.followRange).setBaseValue(8.0D);
this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(8.0D);
this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.23000000417232513D);
this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(3.0D);
// this.getAttributeMap().func_111150_b(field_110186_bp).setAttribute(this.rand.nextDouble() * ForgeDummyContainer.zombieSummonBaseChance);
}
protected boolean isAIEnabled() {
return true;
}
protected String getLivingSound() {
return "mob.silverfish.say";
}
protected String getHurtSound() {
return "mob.silverfish.hit";
}
protected String getDeathSound() {
return "mob.silverfish.kill";
}
/*protected void playStepSound(int par1, int par2, int par3, int par4) {
this.playSound("mob.silverfish.step", 0.15F, 1.0F);
}
protected int getDropItemId() {
return Item.getIdFromItem(Items.rotten_flesh);
}*/
@Override
protected void dropFewItems(boolean par1, int par2) {
this.entityDropItem(dropList.get(new Random().nextInt(dropList.size())).copy(), 0.5f);
if (isSpawnedFromWeather) {
if (Math.random() < 0.33) {
for (Object s : EntityList.IDtoClassMapping.entrySet()) {
Entry e = (Entry) s;
if (e.getValue() == ReplicatorEntity.class) {
this.entityDropItem(new ItemStack((Item) Item.itemRegistry.getObject("spawn_egg"), 1, (Integer) e.getKey()), 0.5f);
break;
}
}
}
}
}
public EnumCreatureAttribute getCreatureAttribute() {
return EnumCreatureAttribute.UNDEFINED;
}
double hunger = (Math.random() - 0.5) * 0.3;
@Override
public void writeEntityToNBT(NBTTagCompound nbt) {
super.writeEntityToNBT(nbt);
nbt.setDouble("ElnHunger", hunger);
nbt.setBoolean("isSpawnedFromWeather", isSpawnedFromWeather);
}
@Override
public void readEntityFromNBT(NBTTagCompound nbt) {
super.readEntityFromNBT(nbt);
hunger = nbt.getDouble("ElnHunger");
isSpawnedFromWeather = nbt.getBoolean("isSpawnedFromWeather");
Utils.println("[Replicator] " + posX + " " + posY + " " + posZ + " ");
}
}