package lumaceon.mods.clockworkphase2.item.temporal;
import lumaceon.mods.clockworkphase2.api.capabilities.ITimeStorage;
import lumaceon.mods.clockworkphase2.api.item.IHourglass;
import lumaceon.mods.clockworkphase2.api.util.TimeConverter;
import lumaceon.mods.clockworkphase2.capabilities.ActivatableHandler;
import lumaceon.mods.clockworkphase2.capabilities.IActivatableHandler;
import lumaceon.mods.clockworkphase2.capabilities.TimeStorage;
import lumaceon.mods.clockworkphase2.item.ItemClockworkPhase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ActionResult;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.CapabilityInject;
import net.minecraftforge.common.capabilities.ICapabilitySerializable;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import javax.annotation.Nullable;
import java.util.List;
public class ItemHourglass extends ItemClockworkPhase implements IHourglass
{
@CapabilityInject(IActivatableHandler.class)
public static final Capability<IActivatableHandler> ACTIVATABLE = null;
@CapabilityInject(ITimeStorage.class)
public static final Capability<ITimeStorage> TIME = null;
protected long capacity;
public ItemHourglass(int maxStack, int maxDamage, String unlocalizedName, long capacity) {
super(maxStack, maxDamage, unlocalizedName);
this.capacity = capacity;
}
@Override
@SideOnly(Side.CLIENT)
public void addInformation(ItemStack is, EntityPlayer player, List list, boolean flag)
{
ITimeStorage timeStorage = is.getCapability(TIME, EnumFacing.DOWN);
if(timeStorage != null)
{
list.add("Time: " + TimeConverter.parseNumber(timeStorage.getTimeInTicks(), 2));
}
}
@Override
public EnumActionResult onItemUse(ItemStack stack, EntityPlayer playerIn, World worldIn, BlockPos pos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ)
{
if(playerIn.isSneaking())
return EnumActionResult.FAIL;
IActivatableHandler cap = stack.getCapability(ACTIVATABLE, EnumFacing.DOWN);
if(cap != null)
cap.setActive();
return EnumActionResult.SUCCESS;
}
@Override
public ActionResult<ItemStack> onItemRightClick(ItemStack is, World world, EntityPlayer player, EnumHand hand)
{
if(!player.isSneaking())
{
IActivatableHandler cap = is.getCapability(ACTIVATABLE, EnumFacing.DOWN);
if(cap != null)
cap.setActive();
}
return ActionResult.newResult(EnumActionResult.SUCCESS, is);
}
@Override
@SideOnly(Side.CLIENT)
public boolean hasEffect(ItemStack stack) {
return this.isActive(stack);
}
@Override
public boolean isActive(ItemStack stack) {
IActivatableHandler cap = stack.getCapability(ACTIVATABLE, EnumFacing.DOWN);
return cap == null || cap.getActive();
}
@Override
public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged) {
return !oldStack.getItem().equals(newStack.getItem());
}
@Override
public net.minecraftforge.common.capabilities.ICapabilityProvider initCapabilities(ItemStack stack, NBTTagCompound nbt) {
return new HourglassCapabilityProvider(capacity);
}
public static class HourglassCapabilityProvider implements ICapabilitySerializable<NBTTagCompound>
{
@CapabilityInject(IActivatableHandler.class)
public static final Capability<IActivatableHandler> ACTIVATABLE = null;
@CapabilityInject(ITimeStorage.class)
public static final Capability<ITimeStorage> TIME = null;
ActivatableHandler activatableHandler = new ActivatableHandler();
TimeStorage timeStorage;
public HourglassCapabilityProvider(long capacity) {
timeStorage = new TimeStorage(capacity);
}
@Override
public boolean hasCapability(Capability<?> capability, @Nullable EnumFacing facing) {
return capability != null && capability == ACTIVATABLE || capability == TIME;
}
@Override
public <T> T getCapability(Capability<T> capability, @Nullable EnumFacing facing)
{
if(capability != null)
{
if(capability == ACTIVATABLE)
return ACTIVATABLE.cast(activatableHandler);
else if(capability == TIME)
return TIME.cast(timeStorage);
}
return null;
}
@Override
public NBTTagCompound serializeNBT()
{
NBTTagCompound nbt = new NBTTagCompound();
nbt.setBoolean("is_active", activatableHandler.getActive());
nbt.setLong("ticks_stored", timeStorage.getTimeInTicks());
nbt.setLong("max_capacity", timeStorage.getMaxCapacity());
return nbt;
}
@Override
public void deserializeNBT(NBTTagCompound nbt) {
activatableHandler.setActive(nbt.getBoolean("is_active"));
timeStorage.setMaxCapacity(nbt.getLong("max_capacity"));
timeStorage.insertTime(nbt.getLong("ticks_stored"));
}
}
}