package openblocks.common.item; import com.google.common.collect.MapMaker; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import java.util.Map; import net.minecraft.block.Block; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraft.world.World; import openblocks.Config; import openblocks.OpenBlocks; import openblocks.common.CraneRegistry; import openblocks.common.entity.EntityMagnet; import openmods.OpenMods; import openmods.infobook.BookDocumentation; @BookDocumentation(customName = "crane_control", hasVideo = true) public class ItemCraneControl extends Item { private IIcon iconDown; private IIcon iconUp; private IIcon iconLocked; private IIcon iconDetected; public ItemCraneControl() { setCreativeTab(OpenBlocks.tabOpenBlocks); setMaxStackSize(1); } private static final Map<EntityLivingBase, Long> debouncerTime = new MapMaker().weakKeys().makeMap(); private static boolean hasClicked(EntityLivingBase entity) { long currentTime = OpenMods.proxy.getTicks(entity.worldObj); Long lastClick = debouncerTime.get(entity); if (lastClick == null || currentTime - lastClick > 5) { debouncerTime.put(entity, currentTime); return true; } return false; } @Override public boolean onEntitySwing(EntityLivingBase entityLiving, ItemStack stack) { if (entityLiving instanceof EntityPlayer && hasClicked(entityLiving)) { final EntityPlayer player = (EntityPlayer)entityLiving; final EntityMagnet magnet = CraneRegistry.instance.getMagnetForPlayer(player); if (magnet != null) magnet.toggleMagnet(); } return true; } @Override public boolean onLeftClickEntity(ItemStack stack, EntityPlayer player, Entity entity) { return true; } @Override public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { CraneRegistry.Data data = CraneRegistry.instance.getData(player, false); if (data != null) { data.isExtending = Config.craneShiftControl? player.isSneaking() : !data.isExtending; } player.setItemInUse(stack, getMaxItemUseDuration(stack)); return stack; } @Override public void onUsingTick(ItemStack stack, EntityPlayer player, int count) { if (player instanceof EntityPlayerMP && ItemCraneBackpack.isWearingCrane(player)) { CraneRegistry.Data data = CraneRegistry.instance.getData(player, true); data.updateLength(); } } @Override public int getMaxItemUseDuration(ItemStack stack) { return 72000; // quite long time! } @Override @SideOnly(Side.CLIENT) public void registerIcons(IIconRegister registry) { super.registerIcons(registry); iconLocked = registry.registerIcon("openblocks:manipulator_locked"); iconDetected = registry.registerIcon("openblocks:manipulator_detected"); iconDown = registry.registerIcon("openblocks:manipulator_down"); iconUp = registry.registerIcon("openblocks:manipulator_up"); } @Override public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) { if (player != null && ItemCraneBackpack.isWearingCrane(player)) { CraneRegistry.Data data = CraneRegistry.instance.getData(player, false); if (data != null) { if (usingItem == stack) { return data.isExtending? iconDown : iconUp; } EntityMagnet magnet = CraneRegistry.instance.getMagnetForPlayer(player); if (magnet != null) { if (magnet.isLocked()) return iconLocked; else if (magnet.isAboveTarget()) return iconDetected; } } } return itemIcon; } @Override public boolean func_150897_b(Block block) { return false; } }