package buildcraftAdditions.items.Tools;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.EnumAction;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.world.World;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import buildcraftAdditions.BuildcraftAdditions;
import buildcraftAdditions.config.ConfigurationHandler;
import buildcraftAdditions.entities.EntityLaserShot;
import buildcraftAdditions.inventories.InventoryItem;
import buildcraftAdditions.inventories.InventoryPortableLaser;
import buildcraftAdditions.items.ItemInventoryPoweredBase;
import buildcraftAdditions.reference.Variables;
import buildcraftAdditions.utils.PlayerUtils;
import buildcraftAdditions.utils.RenderUtils;
/**
* Copyright (c) 2014-2015, AEnterprise
* http://buildcraftadditions.wordpress.com/
* Buildcraft Additions is distributed under the terms of GNU GPL v3.0
* Please check the contents of the license located in
* http://buildcraftadditions.wordpress.com/wiki/licensing-stuff/
*/
public class ItemPortableLaser extends ItemInventoryPoweredBase {
@SideOnly(Side.CLIENT)
private IIcon[] icons;
public ItemPortableLaser() {
super("portableLaser");
setNoRepair();
setFull3D();
}
@Override
public EnumAction getItemUseAction(ItemStack stack) {
return EnumAction.bow;
}
@Override
public int getMaxItemUseDuration(ItemStack stack) {
return Integer.MAX_VALUE;
}
@Override
public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) {
if (!world.isRemote && player.isSneaking()) {
MovingObjectPosition mop = getMovingObjectPositionFromPlayer(world, player, true);
if (mop == null || mop.typeOfHit == MovingObjectPosition.MovingObjectType.MISS || mop.typeOfHit == MovingObjectPosition.MovingObjectType.ENTITY) {
player.openGui(BuildcraftAdditions.instance, Variables.Gui.PORTABLE_LASER.ordinal(), world, (int) player.posX, (int) player.posY, (int) player.posZ);
return stack;
}
}
if (getEnergyStored(stack) > 0)
player.setItemInUse(stack, getMaxItemUseDuration(stack));
return stack;
}
@Override
public void onPlayerStoppedUsing(ItemStack stack, World world, EntityPlayer player, int count) {
float j = getMaxItemUseDuration(stack) - count;
float f = j / 20;
f = (f * f + f * 2) / 3;
if (f < 0.1)
return;
if (f > 1)
f = 1;
int energyUse = (int) (f * ConfigurationHandler.portableLaserPowerUse);
if (getEnergyStored(stack) < energyUse)
return;
extractEnergy(stack, energyUse, false);
if (PlayerUtils.playerMatches(Variables.UUIDs.FORECASTER, BuildcraftAdditions.proxy.getClientPlayer()))
world.playSoundAtEntity(player, "bcadditions:laser_pew", 1, 1 / (itemRand.nextFloat() * 0.4F + 1.2F) + f * 0.5F);
else
world.playSoundAtEntity(player, "bcadditions:laser", 1, 1 / (itemRand.nextFloat() * 0.4F + 1.2F) + f * 0.5F);
if (!world.isRemote)
world.spawnEntityInWorld(new EntityLaserShot(world, player, f));
}
@Override
public void onUsingTick(ItemStack stack, EntityPlayer player, int count) {
float j = getMaxItemUseDuration(stack) - (count + 1);
float f = j / 20;
f = (f * f + f * 2) / 3;
if (f < 0.1)
return;
if (f > 1)
f = 1;
if (getEnergyStored(stack) < (int) (f * ConfigurationHandler.portableLaserPowerUse))
player.stopUsingItem();
}
@Override
public InventoryItem getInventory(ItemStack stack) {
return new InventoryPortableLaser(stack);
}
@Override
@SideOnly(Side.CLIENT)
public void registerIcons(IIconRegister register) {
this.itemIcon = RenderUtils.registerIcon(register, "portableLaser/base");
icons = new IIcon[5];
for (int i = 0; i < icons.length; i++)
icons[i] = RenderUtils.registerIcon(register, "portableLaser/" + i);
}
@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) {
if (usingItem == null || useRemaining <= 0 || useRemaining >= getMaxItemUseDuration(stack))
return super.getIcon(stack, renderPass, player, usingItem, useRemaining);
float j = getMaxItemUseDuration(stack) - useRemaining;
float f = j / 20;
f = (f * f + f * 2) / 3;
if (f < 0.1)
return super.getIcon(stack, renderPass, player, usingItem, useRemaining);
if (f >= 1)
return icons[4];
else if (f > 0.75)
return icons[3];
else if (f > 0.6)
return icons[2];
else if (f > 0.35)
return icons[1];
//else if (f >= 0.1)
return icons[0];
}
}