package openblocks.common.entity; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.entity.Entity; import net.minecraft.entity.item.EntityItem; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.ChunkPosition; import net.minecraft.world.World; import openmods.utils.ItemUtils; public class EntityGoldenEye extends EntitySmoothMove { private static final int TTL = 60; private int timeToLive; private ItemStack spawningStack; public EntityGoldenEye(World world, ItemStack spawningStack, Entity owner, ChunkPosition target) { super(world); timeToLive = TTL; this.spawningStack = spawningStack.copy(); targetStructure(owner, target); setSize(0.02f, 0.02f); } public EntityGoldenEye(World world) { super(world); setSize(0.02f, 0.02f); } @Override protected void entityInit() {} @Override protected void readEntityFromNBT(NBTTagCompound tag) { if (tag.hasKey("SpawningItem")) { NBTTagCompound item = tag.getCompoundTag("SpawningItem"); spawningStack = ItemUtils.readStack(item); } } @Override protected void writeEntityToNBT(NBTTagCompound tag) { if (spawningStack != null) { NBTTagCompound item = ItemUtils.writeStack(spawningStack); tag.setTag("SpawningItem", item); } } public void setTarget(double x, double y, double z) { smoother.setTarget(x, y, z); } @Override public void onUpdate() { if (!worldObj.isRemote && timeToLive-- < 0) { setDead(); if (spawningStack != null) { EntityItem dropped = new EntityItem(worldObj, posX, posY, posZ, spawningStack); worldObj.spawnEntityInWorld(dropped); } return; } updatePrevPosition(); smoother.update(); if (worldObj.isRemote) { worldObj.spawnParticle("portal", posX + rand.nextGaussian() * 0.3 - 0.15, posY - 0.5 + rand.nextGaussian() * 0.3 - 0.15, posZ - rand.nextGaussian() * 0.3 - 0.15, motionX, motionY, motionZ); } } private void targetStructure(Entity owner, ChunkPosition target) { double playerY = owner.posY + 1.62 - owner.yOffset; double dx = target.chunkPosX - owner.posX; double dz = target.chunkPosZ - owner.posZ; double dist = Math.sqrt(dx * dx + dz * dz); dx /= dist; dz /= dist; double yaw = Math.toRadians(owner.rotationYaw); double px = -Math.sin(yaw); double pz = Math.cos(yaw); setPosition(owner.posX + 0.75 * px, playerY, owner.posZ + 0.75 * pz); double targetX = owner.posX; double targetY = playerY; double targetZ = owner.posZ; if (dist < 16) { targetY -= 4; rotationPitch = 90; } else { targetX += 6 * dx; targetZ += 6 * dz; rotationYaw = (float)Math.toDegrees(Math.atan2(dx, dz)); } setTarget(targetX, targetY, targetZ); } @Override @SideOnly(Side.CLIENT) public boolean isInRangeToRender3d(double x, double y, double z) { return true; } }