package net.CyanWool.entity;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import net.CyanWool.api.SoundInfo;
import net.CyanWool.api.entity.Entity;
import net.CyanWool.api.entity.EntityLivingBase;
import net.CyanWool.api.entity.component.AIComponent;
import net.CyanWool.api.entity.component.AgeComponent;
import net.CyanWool.api.entity.component.DisplayNameComponent;
import net.CyanWool.api.entity.component.HealthComponent;
import net.CyanWool.api.entity.component.MovementComponent;
import net.CyanWool.api.potions.PotionEffect;
import net.CyanWool.api.world.Location;
import org.spacehq.mc.protocol.data.game.values.entity.Effect;
public abstract class CyanEntityLivingBase extends CyanEntity implements EntityLivingBase {
private SoundInfo damageSound;
private SoundInfo deathSound;
private SoundInfo talkSound;
private List<PotionEffect> potions;
public CyanEntityLivingBase(Location location) {
super(location);
this.potions = new CopyOnWriteArrayList<PotionEffect>();
getComponentManager().addComponent(new AgeComponent(this));
getComponentManager().addComponent(new DisplayNameComponent(this));
getComponentManager().addComponent(new AIComponent(this));
getComponentManager().addComponent(new HealthComponent(this, 20));// for
// others
// mobs
// -
// change
// health
// getComponentManager().addComponent(new InventoryComponent(this,
// inv));
// this.inventory =
initMetadata();
}
@Override
protected void initMetadata() {
// super.initMetadata();
getMetadata().setMetadata(2, "");// Display name
getMetadata().setMetadata(3, (byte) 0);// Render name tag
getMetadata().setMetadata(6, (float) 20);// health
getMetadata().setMetadata(7, 0);// potion color
getMetadata().setMetadata(8, (byte) 0);// Is Potion Effect Ambient
getMetadata().setMetadata(9, 0);// Number of Arrows in Entity
getMetadata().setMetadata(15, (byte) 0);// No ai
}
@Override
public boolean isEntityUndead() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean canAttackWithItem() {
// TODO Auto-generated method stub
return false;
}
@Override
public void damage(float amount) {
this.damage(amount, null);
}
@Override
public void damage(float amount, Entity damaged) {
setHealth(getHealth() - amount);
playDamageSound();
}
@Override
public void onTick() {
super.onTick();
// age++;
// if(isAIEnabled()){
// getTargetAITasks().onUpdateAI();
// getAITasks().onUpdateAI();
// }
// To components
// TODO
}
@Override
public void addHealth(int i) {
setHealth(getHealth() + i);
}
@Override
public void onDeath() {
}
@Override
public void onWalking() {
}
@Override
public void onDamageEntity(Entity damager, float damage) {
damage(damage);
}
@Override
public void onAttackEntity(Entity target, float damage) {
}
@Override
public SoundInfo getDamageSound() {
return damageSound;
}
@Override
public SoundInfo getTalkSound() {
return talkSound;
}
@Override
public SoundInfo getDeathSound() {
return deathSound;
}
@Override
public void setDeathSound(SoundInfo sound) {
this.deathSound = sound;
}
@Override
public void setDamageSound(SoundInfo sound) {
this.damageSound = sound;
}
@Override
public void setTalkSound(SoundInfo sound) {
this.talkSound = sound;
}
@Override
public boolean playDamageSound() {
if (getDamageSound() != null) {
getWorld().playSound(getLocation(), getDamageSound().getSound(), getDamageSound().getVolume(), getDamageSound().getPitch());
return true;
}
return false;
}
@Override
public boolean playTalkSound() {
if (getTalkSound() != null) {
getWorld().playSound(getLocation(), getTalkSound().getSound(), getTalkSound().getVolume(), getTalkSound().getPitch());
return true;
}
return false;
}
@Override
public boolean playDeathSound() {
if (getDeathSound() != null) {
getWorld().playSound(getLocation(), getDeathSound().getSound(), getDeathSound().getVolume(), getDeathSound().getPitch());
return true;
}
return false;
}
@Override
public boolean interact(EntityLivingBase interacter) {
return false;
}
@Override
public float getEyeHeight() {
return 0;
}
@Override
public float getMaxHealth() {
HealthComponent component = (HealthComponent) getComponentManager().getComponent("health");
return component.getMaxHealth();
}
@Override
public boolean isJumping() {
return false;
}
@Override
public void setHealth(float health) {
HealthComponent component = (HealthComponent) getComponentManager().getComponent("health");
component.setHealth(health);
}
@Override
public float getHealth() {
HealthComponent component = (HealthComponent) getComponentManager().getComponent("health");
return component.getHealth();
}
@Override
public void setJumping(boolean flag) {
MovementComponent component = (MovementComponent) getComponentManager().getComponent("movement");
component.setJumping(flag);
}
@Override
public void setTarget(EntityLivingBase entity) {
if (getComponentManager().hasComponent("ai")) {
AIComponent component = (AIComponent) getComponentManager().getComponent("ai");
component.setTarget(entity);
}
}
@Override
public void setMaxHealth(float health) {
HealthComponent component = (HealthComponent) getComponentManager().getComponent("health");
component.setMaxHealth(health);
}
@Override
public EntityLivingBase getTarget() {
if (getComponentManager().hasComponent("ai")) {
AIComponent component = (AIComponent) getComponentManager().getComponent("ai");
return component.getTarget();
}
return null;
}
@Override
public String getDisplayName() {
DisplayNameComponent component = (DisplayNameComponent) getComponentManager().getComponent("displayName");
return component.getDisplayName();
}
@Override
public void setDisplayName(String name) {
DisplayNameComponent component = (DisplayNameComponent) getComponentManager().getComponent("displayName");
component.setDisplayName(name);
}
@Override
public boolean hasDisplayName() {
DisplayNameComponent component = (DisplayNameComponent) getComponentManager().getComponent("displayName");
return component.hasDisplayName();
}
@Override
public boolean isRenderDisplayName() {
DisplayNameComponent component = (DisplayNameComponent) getComponentManager().getComponent("displayName");
return component.isRenderDisplayName();
}
@Override
public void setRenderDisplayName(boolean flag) {
DisplayNameComponent component = (DisplayNameComponent) getComponentManager().getComponent("displayName");
component.setRenderDisplayName(flag);
}
@Override
public List<PotionEffect> getPotionEffects() {
return potions;
}
@Override
public void addPotionEffect(PotionEffect potion) {
potions.add(potion);
}
@Override
public void removePotionEffect(Effect effect) {
Iterator<PotionEffect> i = getPotionEffects().iterator();
while (i.hasNext()) {
PotionEffect pe = i.next();
if (pe.getPotionType().getEffect() == effect) {
i.remove();
break;
}
}
}
}