@Override
  public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) {
    DrugProperties drugProperties = DrugProperties.getDrugProperties(player);

    if (drugProperties != null && drugProperties.timeBreathingSmoke <= 0) {
      if (getUsedConsumable(player) != null) {
        player.setItemInUse(stack, getMaxItemUseDuration(stack));
      }
    }

    return stack;
  }
  @Override
  public ItemStack onEaten(ItemStack stack, World world, EntityPlayer player) {
    ItemBongConsumable usedConsumable = getUsedConsumable(player);

    if (usedConsumable != null) {
      if (IvInventoryHelper.consumeInventoryItem(player.inventory, usedConsumable.consumedItem)) {
        DrugProperties drugProperties = DrugProperties.getDrugProperties(player);

        if (drugProperties != null) {
          for (DrugInfluence influence : usedConsumable.drugInfluences) {
            drugProperties.addToDrug(influence.clone());
          }

          stack.damageItem(1, player);

          drugProperties.startBreathingSmoke(
              10 + world.rand.nextInt(10), usedConsumable.smokeColor);
        }
      }
    }

    return super.onEaten(stack, world, player);
  }
  @Override
  public List addTabCompletionOptions(ICommandSender par1ICommandSender, String[] arguments) {
    if (arguments.length == 1) return getListOfStringsMatchingLastWord(arguments, getPlayers());
    else if (arguments.length == 2) {
      try {
        DrugProperties drugProperties =
            DrugProperties.getDrugProperties(getPlayer(par1ICommandSender, arguments[0]));
        if (drugProperties != null) {
          String[] drugNames = drugProperties.getAllVisibleDrugNames();
          String[] drugNamesPlusAll = new String[drugNames.length + 1];
          drugNamesPlusAll[0] = "All";
          System.arraycopy(drugNames, 0, drugNamesPlusAll, 1, drugNames.length);
          return getListOfStringsMatchingLastWord(arguments, drugNamesPlusAll);
        } else return null;
      } catch (CommandException ex) {
        return null;
      }
    } else if (arguments.length == 3)
      return getListOfStringsMatchingLastWord(arguments, "set", "lock", "unlock");
    else if (arguments.length == 4)
      return getListOfStringsMatchingLastWord(arguments, "0.0", "0.5", "1.0");

    return null;
  }
  @Override
  public void processCommand(ICommandSender commandSender, String[] arguments) {
    if (arguments.length < 3) throw new WrongUsageException(getCommandUsage(commandSender));

    EntityPlayer player = getPlayer(commandSender, arguments[0]);

    String drugName = arguments[1];

    DrugProperties drugProperties = DrugProperties.getDrugProperties(player);
    if (drugProperties == null) return;

    Drug singleDrug = drugProperties.getDrug(drugName);
    boolean modifyAllDrugs = drugName.equalsIgnoreCase("all");
    Collection<Drug> drugs =
        singleDrug != null
            ? Arrays.asList(singleDrug)
            : modifyAllDrugs ? drugProperties.getAllDrugs() : null;
    if (drugs != null) {
      int lock = getLockMode(arguments[2], commandSender);
      if (modifyAllDrugs) drugName = "Drugs";

      drugProperties.hasChanges = true;

      if (lock != 0) {
        for (Drug drug : drugs) drug.setLocked(lock == 1);
      }

      if (arguments.length >= 4) {
        double amount = parseDouble(commandSender, arguments[3]);
        for (Drug drug : drugs) drug.setDesiredValue(amount);

        if (lock == 0)
          commandSender.addChatMessage(
              new ChatComponentTranslation(
                  "commands.drug.success",
                  player.getCommandSenderName(),
                  drugName,
                  String.valueOf(amount)));
        else if (lock == 1)
          commandSender.addChatMessage(
              new ChatComponentTranslation(
                  "commands.drug.success.lock",
                  player.getCommandSenderName(),
                  drugName,
                  String.valueOf(amount)));
        else if (lock == 2)
          commandSender.addChatMessage(
              new ChatComponentTranslation(
                  "commands.drug.success.unlock",
                  player.getCommandSenderName(),
                  drugName,
                  String.valueOf(amount)));
      } else if (lock == 0)
        throw new CommandException(
            getCommandUsage(commandSender), drugName); // Didn't actually do anything
      else if (lock == 1)
        commandSender.addChatMessage(
            new ChatComponentTranslation(
                "commands.drug.success.lock",
                player.getCommandSenderName(),
                drugName,
                drugProperties.getDrugValue(drugName)));
      else if (lock == 2)
        commandSender.addChatMessage(
            new ChatComponentTranslation(
                "commands.drug.success.unlock",
                player.getCommandSenderName(),
                drugName,
                drugProperties.getDrugValue(drugName)));
    } else {
      throw new CommandException("commands.drug.nodrug", drugName);
    }
  }