BloodMagic/src/main/java/WayofTime/bloodmagic/item/ItemBoundTool.java
Arcaratus 3e50dd4117 Improved the API and internal workings
Update things

Fix some more things

Update once more

Refactoring and removing unnecessary null checks

Woops

Fix

Nother fix

Moar fix

Fix imports

Update ItemBindable.java
2016-04-12 20:34:08 -04:00

276 lines
8.6 KiB
Java

package WayofTime.bloodmagic.item;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import WayofTime.bloodmagic.BloodMagic;
import WayofTime.bloodmagic.api.util.helper.PlayerHelper;
import com.google.common.base.Strings;
import lombok.Getter;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.EnumAction;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemTool;
import net.minecraft.util.ActionResult;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumHand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import WayofTime.bloodmagic.api.Constants;
import WayofTime.bloodmagic.api.ItemStackWrapper;
import WayofTime.bloodmagic.api.event.BoundToolEvent;
import WayofTime.bloodmagic.api.iface.IActivatable;
import WayofTime.bloodmagic.api.iface.IBindable;
import WayofTime.bloodmagic.api.util.helper.NBTHelper;
import WayofTime.bloodmagic.registry.ModItems;
import WayofTime.bloodmagic.util.helper.TextHelper;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Multiset;
@Getter
public class ItemBoundTool extends ItemTool implements IBindable, IActivatable
{
protected final String tooltipBase;
private final String name;
public Map<ItemStack, Boolean> heldDownMap = new HashMap<ItemStack, Boolean>();
public Map<ItemStack, Integer> heldDownCountMap = new HashMap<ItemStack, Integer>();
public final int chargeTime = 30;
public ItemBoundTool(String name, float damage, Set<Block> effectiveBlocks)
{
super(damage, 1, ModItems.boundToolMaterial, effectiveBlocks);
setUnlocalizedName(Constants.Mod.MODID + ".bound." + name);
setCreativeTab(BloodMagic.tabBloodMagic);
this.name = name;
this.tooltipBase = "tooltip.BloodMagic.bound." + name + ".";
}
@Override
public float getStrVsBlock(ItemStack stack, IBlockState state)
{
return getActivated(stack) ? getToolMaterial().getEfficiencyOnProperMaterial() : 1.0F;
}
@Override
public boolean shouldCauseReequipAnimation(ItemStack oldStack, ItemStack newStack, boolean slotChanged)
{
return oldStack.getItem() != newStack.getItem();
}
@Override
public void onUpdate(ItemStack stack, World worldIn, Entity entityIn, int itemSlot, boolean isSelected)
{
if (entityIn instanceof EntityPlayer && getActivated(stack) && isSelected && getBeingHeldDown(stack) && stack == ((EntityPlayer) entityIn).getActiveItemStack())
{
EntityPlayer player = (EntityPlayer) entityIn;
setHeldDownCount(stack, Math.min(player.getItemInUseCount(), chargeTime));
} else if (!isSelected)
{
setBeingHeldDown(stack, false);
}
}
protected int getHeldDownCount(ItemStack stack)
{
if (!heldDownCountMap.containsKey(stack))
return 0;
return heldDownCountMap.get(stack);
}
protected void setHeldDownCount(ItemStack stack, int count)
{
heldDownCountMap.put(stack, count);
}
protected boolean getBeingHeldDown(ItemStack stack)
{
if (!heldDownMap.containsKey(stack))
return false;
return heldDownMap.get(stack);
}
protected void setBeingHeldDown(ItemStack stack, boolean heldDown)
{
heldDownMap.put(stack, heldDown);
}
@Override
public ActionResult<ItemStack> onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand)
{
if (player.isSneaking())
setActivatedState(stack, !getActivated(stack));
if (!player.isSneaking() && getActivated(stack))
{
BoundToolEvent.Charge event = new BoundToolEvent.Charge(player, stack);
if (MinecraftForge.EVENT_BUS.post(event))
return new ActionResult<ItemStack>(EnumActionResult.FAIL, event.result);
player.setActiveHand(hand);
return new ActionResult<ItemStack>(EnumActionResult.SUCCESS, stack);
}
return super.onItemRightClick(stack, world, player, hand);
}
@Override
public void onPlayerStoppedUsing(ItemStack stack, World worldIn, EntityLivingBase entityLiving, int timeLeft)
{
if (entityLiving instanceof EntityPlayer)
{
EntityPlayer player = (EntityPlayer) entityLiving;
if (!player.isSneaking() && getActivated(stack))
{
int i = this.getMaxItemUseDuration(stack) - timeLeft;
BoundToolEvent.Release event = new BoundToolEvent.Release(player, stack, i);
if (MinecraftForge.EVENT_BUS.post(event))
return;
i = event.charge;
onBoundRelease(stack, worldIn, player, Math.min(i, chargeTime));
setBeingHeldDown(stack, false);
}
}
}
protected void onBoundRelease(ItemStack stack, World world, EntityPlayer player, int charge)
{
}
@Override
public ItemStack onItemUseFinish(ItemStack stack, World world, EntityLivingBase entityLiving)
{
return stack;
}
@Override
public int getMaxItemUseDuration(ItemStack stack)
{
return 72000;
}
@Override
public EnumAction getItemUseAction(ItemStack stack)
{
return EnumAction.BOW;
}
@Override
public int getItemEnchantability()
{
return 50;
}
@Override
@SideOnly(Side.CLIENT)
public void addInformation(ItemStack stack, EntityPlayer player, List<String> tooltip, boolean advanced)
{
if (TextHelper.canTranslate(tooltipBase + "desc"))
tooltip.add(TextHelper.localizeEffect(tooltipBase + "desc"));
tooltip.add(TextHelper.localize("tooltip.BloodMagic." + (getActivated(stack) ? "activated" : "deactivated")));
NBTHelper.checkNBT(stack);
if (!Strings.isNullOrEmpty(getOwnerUUID(stack)))
tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.currentOwner", PlayerHelper.getUsernameFromStack(stack)));
super.addInformation(stack, player, tooltip, advanced);
}
@Override
public Set<String> getToolClasses(ItemStack stack)
{
return ImmutableSet.of(name);
}
@Override
public boolean showDurabilityBar(ItemStack stack)
{
return getActivated(stack) && getBeingHeldDown(stack);
}
@Override
public double getDurabilityForDisplay(ItemStack stack)
{
return ((double) -Math.min(getHeldDownCount(stack), chargeTime) / chargeTime) + 1;
}
protected static void dropStacks(Multiset<ItemStackWrapper> drops, World world, BlockPos posToDrop)
{
for (Multiset.Entry<ItemStackWrapper> entry : drops.entrySet())
{
int count = entry.getCount();
ItemStackWrapper stack = entry.getElement();
int maxStackSize = stack.item.getItemStackLimit(stack.toStack(1));
while (count >= maxStackSize)
{
world.spawnEntityInWorld(new EntityItem(world, posToDrop.getX(), posToDrop.getY(), posToDrop.getZ(), stack.toStack(maxStackSize)));
count -= maxStackSize;
}
if (count > 0)
world.spawnEntityInWorld(new EntityItem(world, posToDrop.getX(), posToDrop.getY(), posToDrop.getZ(), stack.toStack(count)));
}
}
// IBindable
@Override
public String getOwnerName(ItemStack stack)
{
return stack != null ? NBTHelper.checkNBT(stack).getTagCompound().getString(Constants.NBT.OWNER_NAME) : null;
}
@Override
public String getOwnerUUID(ItemStack stack)
{
return stack != null ? NBTHelper.checkNBT(stack).getTagCompound().getString(Constants.NBT.OWNER_UUID) : null;
}
@Override
public boolean onBind(EntityPlayer player, ItemStack stack)
{
return true;
}
// IActivatable
@Override
public boolean getActivated(ItemStack stack)
{
return stack != null && NBTHelper.checkNBT(stack).getTagCompound().getBoolean(Constants.NBT.ACTIVATED);
}
@Override
public ItemStack setActivatedState(ItemStack stack, boolean activated)
{
if (stack != null)
{
NBTHelper.checkNBT(stack).getTagCompound().setBoolean(Constants.NBT.ACTIVATED, activated);
return stack;
}
return null;
}
}