package crazypants.enderio.item;
import java.util.List;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
import baubles.api.BaubleType;
import baubles.api.IBauble;
import cofh.api.energy.ItemEnergyContainer;
import com.enderio.core.api.client.gui.IResourceTooltipProvider;
import com.enderio.core.common.util.ItemUtil;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.Optional;
import cpw.mods.fml.common.Optional.Method;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import crazypants.enderio.EnderIOTab;
import crazypants.enderio.ModObject;
import crazypants.enderio.config.Config;
import crazypants.enderio.item.darksteel.DarkSteelItems;
import crazypants.enderio.machine.power.PowerDisplayUtil;
import crazypants.util.BaublesUtil;
@Optional.Interface(iface = "baubles.api.IBauble", modid = "Baubles|API")
public class ItemMagnet extends ItemEnergyContainer implements IResourceTooltipProvider, IBauble {
private static final String ACTIVE_KEY = "magnetActive";
public static void setActive(ItemStack item, boolean active) {
if(item == null) {
return;
}
NBTTagCompound nbt = ItemUtil.getOrCreateNBT(item);
nbt.setBoolean(ACTIVE_KEY, active);
}
public static boolean isActive(ItemStack item) {
if(item == null) {
return false;
}
if(item.stackTagCompound == null) {
return false;
}
if(!item.stackTagCompound.hasKey(ACTIVE_KEY)) {
return false;
}
return item.stackTagCompound.getBoolean(ACTIVE_KEY);
}
public static boolean hasPower(ItemStack itemStack) {
int energyStored = DarkSteelItems.itemMagnet.getEnergyStored(itemStack);
return energyStored > 0 && energyStored >= Config.magnetPowerUsePerSecondRF;
}
public static void drainPerSecondPower(ItemStack itemStack) {
DarkSteelItems.itemMagnet.extractEnergyInternal(itemStack, Config.magnetPowerUsePerSecondRF, false);
}
static MagnetController controller = new MagnetController();
public static ItemMagnet create() {
ItemMagnet result = new ItemMagnet();
result.init();
FMLCommonHandler.instance().bus().register(controller);
return result;
}
protected ItemMagnet() {
super(Config.magnetPowerCapacityRF, Config.magnetPowerCapacityRF / 100);
setCreativeTab(EnderIOTab.tabEnderIO);
setUnlocalizedName(ModObject.itemMagnet.unlocalisedName);
setMaxDamage(16);
setMaxStackSize(1);
setHasSubtypes(true);
}
protected void init() {
GameRegistry.registerItem(this, ModObject.itemMagnet.unlocalisedName);
}
@Override
@SideOnly(Side.CLIENT)
public void registerIcons(IIconRegister IIconRegister) {
itemIcon = IIconRegister.registerIcon("enderio:magnet");
}
@Override
@SideOnly(Side.CLIENT)
public void getSubItems(Item item, CreativeTabs par2CreativeTabs, List par3List) {
ItemStack is = new ItemStack(this);
setFull(is);
par3List.add(is);
is = new ItemStack(this);
setEnergy(is, 0);
par3List.add(is);
}
@Override
@SideOnly(Side.CLIENT)
public void addInformation(ItemStack itemStack, EntityPlayer par2EntityPlayer, List list, boolean par4) {
super.addInformation(itemStack, par2EntityPlayer, list, par4);
String str = PowerDisplayUtil.formatPower(getEnergyStored(itemStack)) + "/" + PowerDisplayUtil.formatPower(getMaxEnergyStored(itemStack)) + " "
+ PowerDisplayUtil.abrevation();
list.add(str);
}
@Override
@SideOnly(Side.CLIENT)
public boolean hasEffect(ItemStack item, int pass) {
return isActive(item);
}
@Override
public void onCreated(ItemStack itemStack, World world, EntityPlayer entityPlayer) {
setEnergy(itemStack, 0);
}
@Override
public int receiveEnergy(ItemStack container, int maxReceive, boolean simulate) {
int res = super.receiveEnergy(container, maxReceive, simulate);
if(res != 0 && !simulate) {
updateDamage(container);
}
return res;
}
@Override
public int extractEnergy(ItemStack container, int maxExtract, boolean simulate) {
if (Config.magnetAllowPowerExtraction) {
return extractEnergyInternal(container, maxExtract, simulate);
} else {
return 0;
}
}
public int extractEnergyInternal(ItemStack container, int maxExtract, boolean simulate) {
int res = super.extractEnergy(container, maxExtract, simulate);
if (res != 0 && !simulate) {
updateDamage(container);
}
return res;
}
void setEnergy(ItemStack container, int energy) {
if(container.stackTagCompound == null) {
container.stackTagCompound = new NBTTagCompound();
}
container.stackTagCompound.setInteger("Energy", energy);
updateDamage(container);
}
void setFull(ItemStack container) {
setEnergy(container, Config.magnetPowerCapacityRF);
}
private void updateDamage(ItemStack stack) {
float r = (float) getEnergyStored(stack) / getMaxEnergyStored(stack);
int res = 16 - (int) (r * 16);
stack.setItemDamage(res);
}
@Override
public ItemStack onItemRightClick(ItemStack equipped, World world, EntityPlayer player) {
if(player.isSneaking()) {
setActive(equipped, !isActive(equipped));
}
return equipped;
}
@Override
public String getUnlocalizedNameForTooltip(ItemStack stack) {
return getUnlocalizedName();
}
@Override
@Method(modid = "Baubles|API")
public BaubleType getBaubleType(ItemStack itemstack) {
BaubleType t = null;
try {
t = BaubleType.valueOf(Config.magnetBaublesType);
} catch (Exception e) {
//NOP
}
return t != null ? t : BaubleType.AMULET;
}
@Override
public void onWornTick(ItemStack itemstack, EntityLivingBase player) {
if (player instanceof EntityPlayer && isActive(itemstack) && hasPower(itemstack) && ((EntityPlayer) player).getHealth() > 0f) {
controller.doHoover((EntityPlayer) player);
if(!player.worldObj.isRemote && player.worldObj.getTotalWorldTime() % 20 == 0) {
ItemMagnet.drainPerSecondPower(itemstack);
IInventory baubles = BaublesUtil.instance().getBaubles((EntityPlayer) player);
if(baubles != null) {
baubles.markDirty();
}
}
}
}
@Override
public void onEquipped(ItemStack itemstack, EntityLivingBase player) {
}
@Override
public void onUnequipped(ItemStack itemstack, EntityLivingBase player) {
}
@Override
public boolean canEquip(ItemStack itemstack, EntityLivingBase player) {
return Config.magnetAllowInBaublesSlot && (Config.magnetAllowDeactivatedInBaublesSlot || isActive(itemstack));
}
@Override
public boolean canUnequip(ItemStack itemstack, EntityLivingBase player) {
return true;
}
}