package com.xcompwiz.lookingglass.entity;
import net.minecraft.block.material.Material;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.EntityClientPlayerMP;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.SharedMonsterAttributes;
import net.minecraft.entity.effect.EntityLightningBolt;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.potion.Potion;
import net.minecraft.potion.PotionEffect;
import net.minecraft.util.ChunkCoordinates;
import net.minecraft.util.DamageSource;
import net.minecraft.world.World;
import com.xcompwiz.lookingglass.api.animator.ICameraAnimator;
/**
* Our camera entity. This is made a player so that we can replace the player client-side when doing rendering.
* At the bottom of the class we create a bunch of method stubs to override higher level logic, so that our "player" doesn't act like one.
*/
public class EntityCamera extends EntityClientPlayerMP {
private ICameraAnimator animator;
private ChunkCoordinates target;
private boolean defaultSpawn = false;
private float fovmultiplier = 1;
public EntityCamera(World worldObj, ChunkCoordinates spawn) {
super(Minecraft.getMinecraft(), worldObj, Minecraft.getMinecraft().getSession(), null, null);
this.target = spawn;
if (target == null) {
defaultSpawn = true;
ChunkCoordinates cc = worldObj.provider.getSpawnPoint();
int y = updateTargetPosition(cc);
target = new ChunkCoordinates(cc.posX, y, cc.posZ);
}
this.setPositionAndUpdate(target.posX, target.posY, target.posZ);
}
public void setAnimator(ICameraAnimator animator) {
this.animator = animator;
if (this.animator != null) this.animator.setTarget(target);
}
@Override
protected void applyEntityAttributes() {
super.applyEntityAttributes();
getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(1);
getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.0D);
}
public void updateWorldSpawn(ChunkCoordinates cc) {
if (defaultSpawn) {
int y = updateTargetPosition(cc);
target = new ChunkCoordinates(cc.posX, y, cc.posZ);
this.setPositionAndUpdate(target.posX, target.posY, target.posZ);
if (animator != null) animator.setTarget(cc);
this.refreshAnimator();
}
}
private int updateTargetPosition(ChunkCoordinates target) {
int x = target.posX;
int y = target.posY;
int z = target.posZ;
if (!this.worldObj.getChunkFromBlockCoords(x, z).isEmpty()) {
if (this.worldObj.getBlock(x, y, z).getBlocksMovement(this.worldObj, x, y, z)) {
while (y > 0 && this.worldObj.getBlock(x, --y, z).getBlocksMovement(this.worldObj, x, y, z))
;
if (y == 0) y = target.posY;
else ++y;
} else {
while (y < 256 && !this.worldObj.getBlock(x, ++y, z).getBlocksMovement(this.worldObj, x, y, z))
;
if (y == 256) y = target.posY;
}
return y;
}
return target.posY;
}
public void refreshAnimator() {
if (this.animator != null) animator.refresh();
}
public void tick(long dt) {
if (this.animator != null) animator.update(dt);
}
@Override
public float getFOVMultiplier() {
return fovmultiplier;
}
public void setFOVMult(float fovmult) {
fovmultiplier = fovmult;
}
/*
* POSSIBLY UNNECESSARY CODE TO PREVENT OTHER CODE FROM RUNNING
*/
@Override
public void onEntityUpdate() {}
@Override
public void onLivingUpdate() {}
@Override
public void onUpdate() {}
@Override
protected int getExperiencePoints(EntityPlayer par1EntityPlayer) {
return 0;
}
@Override
protected boolean isAIEnabled() {
return false;
}
@Override
public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound) {}
@Override
public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound) {}
@Override
public void setAIMoveSpeed(float par1) {}
@Override
protected void updateAITasks() {}
@Override
public ItemStack getHeldItem() {
return null;
}
@Override
public ItemStack getEquipmentInSlot(int par1) {
return null;
}
@Override
public void setCurrentItemOrArmor(int par1, ItemStack par2ItemStack) {}
@Override
public ItemStack[] getLastActiveItems() {
return null;
}
@Override
protected void dropEquipment(boolean par1, int par2) {}
@Override
protected void fall(float par1) {}
@Override
protected void updateFallState(double par1, boolean par3) {}
@Override
protected void onDeathUpdate() {
this.setDead();
}
@Override
public EntityLivingBase getAITarget() {
return null;
}
@Override
public void setRevengeTarget(EntityLivingBase par1) {}
@Override
public EntityLivingBase getLastAttacker() {
return null;
}
@Override
public void setLastAttacker(Entity par1) {}
@Override
protected void updatePotionEffects() {}
@Override
public void clearActivePotions() {}
@Override
public boolean isPotionActive(int par1) {
return false;
}
@Override
public boolean isPotionActive(Potion par1) {
return false;
}
@Override
public PotionEffect getActivePotionEffect(Potion par1) {
return null;
}
@Override
public void addPotionEffect(PotionEffect par1) {}
@Override
public boolean isPotionApplicable(PotionEffect par1) {
return false;
}
@Override
public boolean isEntityUndead() {
return false;
}
@Override
public void removePotionEffectClient(int par1) {}
@Override
public void removePotionEffect(int par1) {}
@Override
protected void onNewPotionEffect(PotionEffect par1) {}
@Override
protected void onChangedPotionEffect(PotionEffect par1, boolean par2) {}
@Override
protected void onFinishedPotionEffect(PotionEffect par1) {}
@Override
public void heal(float par1) {}
@Override
public boolean attackEntityFrom(DamageSource par1, float par2) {
return false;
}
@Override
public void renderBrokenItemStack(ItemStack par1) {}
@Override
public void onDeath(DamageSource par1) {
this.worldObj.setEntityState(this, (byte) 3);
}
@Override
public void knockBack(Entity par1Entity, float par2, double par3, double par5) {}
@Override
public boolean isOnLadder() {
return false;
}
@Override
public int getTotalArmorValue() {
return 0;
}
@Override
protected float applyArmorCalculations(DamageSource par1DamageSource, float par2) {
return par2;
}
@Override
protected float applyPotionDamageCalculations(DamageSource par1DamageSource, float par2) {
return par2;
}
@Override
protected void damageEntity(DamageSource par1, float par2) {}
@Override
public void swingItem() {}
@Override
protected void updateArmSwingProgress() {}
@Override
public void setSprinting(boolean par1) {}
@Override
protected float getSoundVolume() {
return 0F;
}
@Override
public void dismountEntity(Entity par1Entity) {}
@Override
public void moveEntityWithHeading(float par1, float par2) {}
@Override
public void updateRidden() {}
@Override
public void setJumping(boolean par1) {}
@Override
public void onItemPickup(Entity par1Entity, int par2) {}
@Override
public boolean canEntityBeSeen(Entity par1Entity) {
return false;
}
@Override
public boolean canBeCollidedWith() {
return false;
}
@Override
public boolean canBePushed() {
return false;
}
@Override
protected boolean canTriggerWalking() {
return false;
}
@Override
public boolean handleWaterMovement() {
return false;
}
@Override
public boolean isInsideOfMaterial(Material par1Material) {
return false;
}
@Override
public boolean handleLavaMovement() {
return false;
}
@Override
public void moveFlying(float par1, float par2, float par3) {}
@Override
public float getBrightness(float par1) {
return 0;
}
@Override
public void applyEntityCollision(Entity par1Entity) {}
@Override
public boolean isBurning() {
return false;
}
@Override
public boolean isRiding() {
return false;
}
@Override
public boolean isSneaking() {
return false;
}
@Override
public boolean isInvisible() {
return true;
}
@Override
public void onStruckByLightning(EntityLightningBolt par1) {}
@Override
public boolean isEntityInvulnerable() {
return true;
}
@Override
public void travelToDimension(int par1) {}
@Override
public boolean shouldRenderInPass(int pass) {
return false;
}
@Override
protected void collideWithEntity(Entity par1Entity) {}
@Override
protected void collideWithNearbyEntities() {}
@Override
public boolean doesEntityNotTriggerPressurePlate() {
return true;
}
}