package crazypants.enderio.machine.obelisk.aversion;
import net.minecraft.entity.EntityList;
import net.minecraft.entity.EntityLiving;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.item.ItemStack;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.Vec3;
import net.minecraft.world.World;
import com.enderio.core.client.render.BoundingBox;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import crazypants.enderio.EnderIO;
import crazypants.enderio.ModObject;
import crazypants.enderio.config.Config;
import crazypants.enderio.machine.AbstractPowerConsumerEntity;
import crazypants.enderio.machine.SlotDefinition;
import crazypants.enderio.machine.ranged.IRanged;
import crazypants.enderio.machine.ranged.RangeEntity;
import crazypants.enderio.power.BasicCapacitor;
public class TileAversionObelisk extends AbstractPowerConsumerEntity implements IRanged {
private int powerPerTick;
private int range;
private boolean registered = false;
private AxisAlignedBB bounds;
private boolean showingRange;
public TileAversionObelisk() {
super(new SlotDefinition(12, 0));
}
@Override
@SideOnly(Side.CLIENT)
public boolean isShowingRange() {
return showingRange;
}
@SideOnly(Side.CLIENT)
public void setShowRange(boolean showRange) {
if(showingRange == showRange) {
return;
}
showingRange = showRange;
if(showingRange) {
worldObj.spawnEntityInWorld(new RangeEntity(this));
}
}
@Override
public World getWorld() {
return getWorldObj();
}
@Override
public void invalidate() {
super.invalidate();
AversionObeliskController.instance.deregisterGuard(this);
registered = false;
}
@Override
public float getRange() {
return range;
}
@Override
public void onCapacitorTypeChange() {
switch (getCapacitorType()) {
case BASIC_CAPACITOR:
range = Config.spawnGuardRangeLevelOne;
powerPerTick = Config.spawnGuardPowerPerTickLevelOne;
break;
case ACTIVATED_CAPACITOR:
range = Config.spawnGuardRangeLevelTwo;
powerPerTick = Config.spawnGuardPowerPerTickLevelTwo;
break;
case ENDER_CAPACITOR:
range = Config.spawnGuardRangeLevelThree;
powerPerTick = Config.spawnGuardPowerPerTickLevelThree;
break;
}
setCapacitor(new BasicCapacitor(powerPerTick * 8, getCapacitor().getMaxEnergyStored(), powerPerTick));
BoundingBox bb = new BoundingBox(getLocation());
bb = bb.scale(range + 0.5f, range + 0.5f, range + 0.5f).translate(0.5f, 0.5f, 0.5f);
bounds = AxisAlignedBB.getBoundingBox(bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ);
}
@Override
public String getMachineName() {
return ModObject.blockSpawnGuard.unlocalisedName;
}
@Override
protected boolean isMachineItemValidForSlot(int i, ItemStack itemstack) {
if(!slotDefinition.isInputSlot(i)) {
return false;
}
String mob = EnderIO.itemSoulVessel.getMobTypeFromStack(itemstack);
if(mob == null) {
return false;
}
Class<?> cl = (Class<?>) EntityList.stringToClassMapping.get(mob);
if(cl == null) {
return false;
}
return EntityLiving.class.isAssignableFrom(cl);
}
@Override
public boolean isActive() {
return hasPower();
}
@Override
protected boolean processTasks(boolean redstoneCheckPassed) {
if(redstoneCheckPassed && hasPower()) {
if(!registered) {
AversionObeliskController.instance.registerGuard(this);
registered = true;
}
usePower();
}
return false;
}
protected double usePower() {
return usePower(getPowerUsePerTick());
}
protected int usePower(int wantToUse) {
int used = Math.min(getEnergyStored(), wantToUse);
setEnergyStored(Math.max(0, getEnergyStored() - used));
return used;
}
@Override
public int getPowerUsePerTick() {
return powerPerTick;
}
public boolean isSpawnPrevented(EntityLivingBase mob) {
return redstoneCheckPassed && hasPower() && isMobInRange(mob) && isMobInFilter(mob);
}
private boolean isMobInRange(EntityLivingBase mob) {
if(mob == null) {
return false;
}
//return new Vector3d(mob.posX, mob.posY, mob.posZ).distanceSquared(new Vector3d(xCoord, yCoord, zCoord)) <= rangeSqu;
return bounds.isVecInside(Vec3.createVectorHelper(mob.posX, mob.posY, mob.posZ));
}
private boolean isMobInFilter(EntityLivingBase ent) {
return isMobInFilter(EntityList.getEntityString(ent));
}
private boolean isMobInFilter(String entityId) {
for (int i = slotDefinition.minInputSlot; i <= slotDefinition.maxInputSlot; i++) {
if(inventory[i] != null) {
String mob = EnderIO.itemSoulVessel.getMobTypeFromStack(inventory[i]);
if(mob != null && mob.equals(entityId)) {
return true;
}
}
}
return false;
}
}