@Override
 public void addInformation(
     ItemStack itemStack, EntityPlayer player, List list, boolean p_77624_4_) {
   super.addInformation(itemStack, player, list, p_77624_4_);
   if (!NBTHelper.hasTag(itemStack, "owner")) {
     list.add("Right Click to bind deck.");
   } else {
     list.remove("Right Click to bind deck.");
     list.add(1, "Owner: " + NBTHelper.getString(itemStack, "owner"));
     list.add(
         2,
         "Cards: "
             + (itemStack.getMaxDamage() - itemStack.getItemDamage() + 1)
             + "/"
             + (itemStack.getMaxDamage() + 1));
     list.add(
         3,
         "Current Timeout: "
             + (NBTHelper.getLong(itemStack, "timeout") == 0
                 ? TIMEOUT
                 : player.worldObj.getTotalWorldTime() - NBTHelper.getLong(itemStack, "timeout"))
             + "/"
             + TIMEOUT);
   }
 }
  /** allows items to add custom lines of information to the mouseover description */
  @Override
  public void addInformation(ItemStack itemStack, EntityPlayer player, List list, boolean par4) {

    if (NBTHelper.getBoolean(itemStack, "isSet")) {
      list.remove("Right Click to examine text");
      // String owner = NBTHelper.getString(itemStack, "owner");
      // String command = NBTHelper.getString(itemStack, "command");

      list.add("Owner: " + NBTHelper.getString(itemStack, "owner"));
      if (NBTHelper.getString(itemStack, "owner").equals(player.getDisplayName())) {
        list.add(EnumChatFormatting.GREEN + "Command:" + NBTHelper.getString(itemStack, "command"));
      } else {
        list.add(
            EnumChatFormatting.RED
                + "Command: "
                + EnumChatFormatting.OBFUSCATED
                + NBTHelper.getString(itemStack, "command"));
      }
    } else {
      list.add("Right Click to examine text");
    }
    /*
    String owner = itemStack.stackTagCompound.getString("owner");
    int code = itemStack.stackTagCompound.getInteger("code");
    list.add("owner: " + owner);
    if (owner.equals(player.username)) {
        list.add(EnumChatFormatting.GREEN + "code: " + code);
    } else {
        list.add(EnumChatFormatting.RED + "code: "
                + EnumChatFormatting.OBFUSCATED + code);
    }
    */

  }
  public void runCommand(ItemStack itemStack, World world, EntityPlayer entityPlayer) {
    if (itemStack != null || NBTHelper.getBoolean(itemStack, "isSet")) {
      switch (NBTHelper.getInt(itemStack, "commandID")) {
        case 0: // toggleDownFall
          toggleDownfall();
          break;
        case 1: // give Random
          giveItem(entityPlayer);
          break;
        case 2: // kill Entity
          // EntityLivingBase entity = (EntityLivingBase) getEntityLookingAt(world, entityPlayer);

          break;
        case 3: // time set day
          setTime(world, entityPlayer, "day");
          break;
        case 4: // time set night
          setTime(world, entityPlayer, "night");
          break;
        default:
          LogHelper.error("Error running command in ItemCommandScroll");
          LogHelper.error("Case index out of bounds:" + NBTHelper.getInt(itemStack, "commandID"));
          break;
      }
    }
  }
  @Override
  public void onUpdate(
      ItemStack itemStack, World world, Entity entity, int p_77663_4_, boolean p_77663_5_) {
    super.onUpdate(itemStack, world, entity, p_77663_4_, p_77663_5_);

    /* If the deck is on timeout */
    if (NBTHelper.getLong(itemStack, "timeout") != 0) {
      /* Using world time to count time when player is offline. */
      long timeoutDifference = world.getTotalWorldTime() - NBTHelper.getLong(itemStack, "timeout");

      /* Handle the way Minecraft handles it's time value reaching the long limit */
      if (timeoutDifference > TIMEOUT || timeoutDifference < -(TIMEOUT)) {
        NBTHelper.setLong(itemStack, "timeout", 0);
      }
    }
  }
  /** Returns true if the item can be used on the given entity, e.g. shears on sheep. */
  @Override
  public boolean itemInteractionForEntity(
      ItemStack itemStack, EntityPlayer entityPlayer, EntityLivingBase entity) {
    if (itemStack != null) {
      onItemRightClick(itemStack, entity.worldObj, entityPlayer);
      if (NBTHelper.getString(itemStack, "command") != null
          && NBTHelper.getString(itemStack, "command") == "/kill Entity") {
        if (entity != null && !entity.worldObj.isRemote) {
          ChatHelper.send(entityPlayer, "Attempting to damage entity: " + entity.toString());
          entity.attackEntityFrom(
              DamageSource.outOfWorld, Float.MAX_VALUE); // MAKE A NEW DAMAGE SOURCE
          // entity.setHealth(0.0F);
          // entity.setDead();
        }
      }
    }

    return true;
  }
  private void drawCard(ItemStack itemStack, World world, EntityPlayer player) {
    ChatHelper.send(player, NBTHelper.getString(itemStack, "cards"));
    Random rand = new Random();
    int[] cards = ArrayHelper.stringToIntArray(NBTHelper.getString(itemStack, "cards"));
    int skip = rand.nextInt(cards.length);
    String card = cards[skip] + "";

    int[] newCards = new int[cards.length - 1];
    int index = 0;
    for (int i = 0; i < cards.length; i++) {
      if (i == skip) {
        continue;
      } else {
        newCards[index] = cards[i];
        index++;
      }
    }
    NBTHelper.setString(itemStack, "cards", ArrayHelper.arrayToString(newCards));
    ChatHelper.send(player, card + "; " + NBTHelper.getString(itemStack, "cards"));
  }
  public String getCommand(ItemStack itemStack) {
    Random random = new Random();

    NBTHelper.setInteger(itemStack, "commandID", random.nextInt(5));

    switch (NBTHelper.getInt(itemStack, "commandID")) {
      case 0:
        return "/toggleDownFall";
      case 1:
        return "/give Random";
      case 2:
        return "/kill Entity";
      case 3:
        return "/time set day";
      case 4:
        return "/time set night";
      default:
        return "ERROR";
    }
  }
  @Override
  public ItemStack onItemRightClick(ItemStack itemStack, World world, EntityPlayer player) {
    if (!world.isRemote) {

      if (NBTHelper.hasTag(itemStack, "owner") && NBTHelper.hasTag(itemStack, "timeout")) {
        /* If the timeout is 0, draw a new card. */
        if (NBTHelper.getLong(itemStack, "timeout") == 0) {
          drawCard(itemStack, world, player);
          itemStack.damageItem(1, player);
          NBTHelper.setLong(itemStack, "timeout", world.getTotalWorldTime());
        } else {
          ChatHelper.send(player, "Timeout time: " + NBTHelper.getLong(itemStack, "timeout"));
          ChatHelper.send(player, "World time: " + world.getTotalWorldTime());
        }
      } else {
        /* Initialize NBT values */
        NBTHelper.setLong(itemStack, "timeout", 0);
        NBTHelper.setString(itemStack, "owner", player.getDisplayName());
        makeDeck(itemStack);
      }
    }
    return super.onItemRightClick(itemStack, world, player);
  }
 private void makeDeck(ItemStack itemStack) {
   String cards = "[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]";
   NBTHelper.setString(itemStack, "cards", cards);
 }
  @Override
  public ItemStack onItemRightClick(ItemStack itemStack, World world, EntityPlayer entityPlayer) {
    LogHelper.info("CoolDown: " + coolDown);
    LogHelper.info("World.isRemote: " + world.isRemote);
    LogHelper.info("entityPlayer.worldObj.isRemote: " + entityPlayer.worldObj.isRemote);

    coolDown();

    if (entityPlayer.isSneaking()
        && entityPlayer.capabilities.isCreativeMode) // Change command in creative (MOVE THIS!)
    {
      NBTHelper.setInteger(itemStack, "commandID", NBTHelper.getInt(itemStack, "commandID") + 1);
      if (NBTHelper.getInt(itemStack, "commandID") > 4)
        NBTHelper.setInteger(itemStack, "commandID", 0);
    } else {
      if (!world.isRemote) {

        if (NBTHelper.getBoolean(itemStack, "isSet")) {
          LogHelper.info("Entered Function"); // DEBUG

          if (NBTHelper.getString(itemStack, "owner") == entityPlayer.getDisplayName()) {
            runCommand(itemStack, world, entityPlayer);
            ChatHelper.send(entityPlayer, "Command: " + NBTHelper.getString(itemStack, "command"));
            --itemStack.stackSize;
          } else {
            ChatHelper.send(entityPlayer, "You do not understand the symbols on the page.");
          }

        } else {
          NBTHelper.setBoolean(itemStack, "isSet", true);
          LogHelper.info("Entered Else"); // DEBUG
          ChatHelper.send(
              entityPlayer, EnumChatFormatting.BLUE + "The scroll reveals its true power!");
          NBTHelper.setBoolean(itemStack, "isSet", true);
          NBTHelper.setString(itemStack, "owner", entityPlayer.getDisplayName());
          NBTHelper.setString(itemStack, "command", getCommand(itemStack));
        }
      }
    }
    return itemStack;
  }