package openblocks.common.entity;
import com.google.common.base.Strings;
import cpw.mods.fml.common.network.ByteBufUtils;
import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import io.netty.buffer.ByteBuf;
import java.lang.ref.WeakReference;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.DamageSource;
import net.minecraft.world.World;
public abstract class EntityAssistant extends EntitySmoothMove implements IEntityAdditionalSpawnData {
private String owner;
private WeakReference<EntityPlayer> cachedOwner;
protected double ownerOffsetX;
protected double ownerOffsetY;
protected double ownerOffsetZ;
public EntityAssistant(World world, EntityPlayer owner) {
super(world);
this.cachedOwner = new WeakReference<EntityPlayer>(owner);
if (owner != null) this.owner = owner.getCommandSenderName();
}
public EntityPlayer findOwner() {
if (owner == null || owner.isEmpty()) return null;
EntityPlayer result = worldObj.getPlayerEntityByName(owner);
if (result != null) cachedOwner = new WeakReference<EntityPlayer>(result);
return result;
}
@Override
protected void readEntityFromNBT(NBTTagCompound tag) {
owner = tag.getString("Owner");
}
@Override
protected void writeEntityToNBT(NBTTagCompound tag) {
if (owner != null) tag.setString("Owner", owner);
}
@Override
public void onUpdate() {
if (!worldObj.isRemote) {
EntityPlayer owner = cachedOwner.get();
if (owner == null) owner = findOwner();
if (owner != null) smoother.setTarget(
owner.posX + ownerOffsetX,
owner.posY + owner.getEyeHeight() + ownerOffsetY,
owner.posZ + ownerOffsetZ);
}
updatePrevPosition();
smoother.update();
}
@Override
protected void dealFireDamage(int par1) {}
@Override
public boolean attackEntityFrom(DamageSource par1DamageSource, float par2) {
if (!isDead && !worldObj.isRemote) entityDropItem(toItemStack(), 0.5f);
setDead();
return true;
}
public abstract ItemStack toItemStack();
@Override
public boolean interactFirst(EntityPlayer player) {
if (player instanceof EntityPlayerMP && player.isSneaking() && getDistanceToEntity(player) < 3) {
System.out.println("Interact: " + player);
return true;
}
return false;
}
@Override
@SideOnly(Side.CLIENT)
public boolean canRenderOnFire() {
return false;
}
@Override
public boolean canBeCollidedWith() {
return true;
}
@Override
public void writeSpawnData(ByteBuf data) {
ByteBufUtils.writeUTF8String(data, Strings.nullToEmpty(owner));
}
@Override
public void readSpawnData(ByteBuf data) {
owner = ByteBufUtils.readUTF8String(data);
}
public void setSpawnPosition(Entity owner) {
setPosition(owner.posX + 1, owner.posY + owner.getEyeHeight(), owner.posZ);
}
}