/**
   * Custom onAction behaviour. Note that super() is not called because guards need extra check to
   * see if a player should interact or ATTACK them when clicked.
   */
  @Override
  public void onAction(L2PcInstance player, boolean interact) {
    if (!canTarget(player)) {
      player.sendPacket(ActionFailed.STATIC_PACKET);
      return;
    }

    // Check if the L2PcInstance already target the L2NpcInstance
    if (this != player.getTarget()) {
      if (Config.DEBUG) {
        _log.info("new target selected:" + getObjectId());
      }

      // Set the target of the L2PcInstance player
      player.setTarget(this);
    } else if (interact) {
      if (isAutoAttackable(player) && !isAlikeDead()) {
        if (Math.abs(player.getZ() - getZ())
            < 600) // this max heigth difference might need some tweaking
        {
          player.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, this);
        }
      }
      if (!isAutoAttackable(player)) {
        if (!canInteract(player)) {
          // Notify the L2PcInstance AI with AI_INTENTION_INTERACT
          player.getAI().setIntention(CtrlIntention.AI_INTENTION_INTERACT, this);
        }
      }
    }
    // Send a Server->Client ActionFailed to the L2PcInstance in order to avoid that the client wait
    // another packet
    player.sendPacket(ActionFailed.STATIC_PACKET);
  }
  @Override
  public void onAction(L2PcInstance player, boolean interact) {
    if (player == null || !canTarget(player)) return;

    // Check if the L2PcInstance already target the L2NpcInstance
    if (this != player.getTarget()) {
      // Set the target of the L2PcInstance player
      player.setTarget(this);

      // Send a Server->Client packet MyTargetSelected to the L2PcInstance player
      MyTargetSelected my = new MyTargetSelected(getObjectId(), player.getLevel() - getLevel());
      player.sendPacket(my);

      // Send a Server->Client packet StatusUpdate of the L2NpcInstance to the L2PcInstance to
      // update its HP bar
      StatusUpdate su = new StatusUpdate(this);
      su.addAttribute(StatusUpdate.CUR_HP, (int) getStatus().getCurrentHp());
      su.addAttribute(StatusUpdate.MAX_HP, getMaxHp());
      player.sendPacket(su);

      // Send a Server->Client packet ValidateLocation to correct the L2NpcInstance position and
      // heading on the client
      player.sendPacket(new ValidateLocation(this));
    } else if (interact) {
      if (isAutoAttackable(player) && Math.abs(player.getZ() - getZ()) < 100)
        player.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, this);
      else {
        // Send a Server->Client ActionFailed to the L2PcInstance in order to avoid that the client
        // wait another packet
        player.sendPacket(ActionFailed.STATIC_PACKET);
      }
    }
  }
  public L2SiegeFlagInstance(
      L2PcInstance player,
      int objectId,
      L2NpcTemplate template,
      boolean advanced,
      boolean outPost) {
    super(objectId, template);
    setInstanceType(InstanceType.L2SiegeFlagInstance);

    if (TerritoryWarManager.getInstance().isTWInProgress()) {
      _clan = player.getClan();
      _player = player;
      _canTalk = false;
      if (_clan == null) deleteMe();
      if (outPost) {
        _isAdvanced = false;
        setIsInvul(true);
      } else {
        _isAdvanced = advanced;
        setIsInvul(false);
      }
      getStatus();
      return;
    }
    _clan = player.getClan();
    _player = player;
    _canTalk = true;
    _siege = SiegeManager.getInstance().getSiege(_player.getX(), _player.getY(), _player.getZ());
    if (_siege == null)
      _siege =
          FortSiegeManager.getInstance().getSiege(_player.getX(), _player.getY(), _player.getZ());
    if (_siege == null) _siege = CHSiegeManager.getInstance().getSiege(player);
    if (_clan == null || _siege == null) {
      throw new NullPointerException(getClass().getSimpleName() + ": Initialization failed.");
    }

    L2SiegeClan sc = _siege.getAttackerClan(_clan);
    if (sc == null)
      throw new NullPointerException(getClass().getSimpleName() + ": Cannot find siege clan.");

    sc.addFlag(this);
    _isAdvanced = advanced;
    getStatus();
    setIsInvul(false);
  }
  @Override
  public void onBypassFeedback(L2PcInstance player, String command) {
    if (command.equalsIgnoreCase("start_mission") && Config.ALLOW_JAILMANAGER) {
      NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
      html.setFile("data/html/mods/jail/mission.htm");
      html.replace("%objectId%", String.valueOf(getObjectId()));
      html.replace("%playername%", player.getName());
      html.replace("%amount%", String.valueOf(Config.REQUIRED_JAIL_POINTS));
      html.replace("%npcname%", String.valueOf(getName()));
      player.sendPacket(html);

      if (player.isDead() || player.isFakeDeath()) {
        player.sendMessage(
            Message.getMessage(player, Message.MessageId.MSG_NOT_ALLOWED_AT_THE_MOMENT));
        return;
      }
    } else if (command.equalsIgnoreCase("check_points") && player.isInJailMission()) {
      NpcHtmlMessage html2 = new NpcHtmlMessage(getObjectId());
      html2.setFile("data/html/mods/jail/points.htm");
      html2.replace("%objectId%", String.valueOf(getObjectId()));
      html2.replace("%points%", String.valueOf(player.getJailPoints()));
      html2.replace("%rest%", String.valueOf(Config.REQUIRED_JAIL_POINTS - player.getJailPoints()));
      html2.replace("%npcname%", String.valueOf(getName()));
      player.sendPacket(html2);

      if (player.isDead() || player.isFakeDeath()) {
        player.sendMessage(
            Message.getMessage(player, Message.MessageId.MSG_NOT_ALLOWED_AT_THE_MOMENT));
        return;
      }
    } else if (command.equalsIgnoreCase("get_mission")) {
      if (player.isInJailMission()) {
        WindowService.sendWindow(player, "data/html/mods/jail/", "mission_already.htm");
        return;
      }
      player.setIsInJailMission(true);
      PlaySound ps =
          new PlaySound(
              0,
              "ItemSound2.race_start",
              0,
              player.getObjectId(),
              player.getX(),
              player.getY(),
              player.getZ());
      player.sendPacket(ps);
      WindowService.sendWindow(player, "data/html/mods/jail/", "started.htm");

      if (player.isDead() || player.isFakeDeath()) {
        player.sendMessage(
            Message.getMessage(player, Message.MessageId.MSG_NOT_ALLOWED_AT_THE_MOMENT));
        return;
      }
    } else if (command.equalsIgnoreCase("finish_mission")) {
      if (!player.isInJailMission()) {
        WindowService.sendWindow(player, "data/html/mods/jail/", "notstarted.htm");
        return;
      }
      if (player.getJailPoints() < Config.REQUIRED_JAIL_POINTS) {
        WindowService.sendWindow(player, "data/html/mods/jail/", "notcompleted.htm");
        return;
      }
      if (player.isDead() || player.isFakeDeath()) {
        player.sendMessage(
            Message.getMessage(player, Message.MessageId.MSG_NOT_ALLOWED_AT_THE_MOMENT));
        return;
      }
      PlaySound ps =
          new PlaySound(
              0,
              "ItemSound.quest_finish",
              0,
              player.getObjectId(),
              player.getX(),
              player.getY(),
              player.getZ());
      player.sendPacket(ps);
      WindowService.sendWindow(player, "data/html/mods/jail/", "completed.htm");

      try {
        Thread.sleep(Util.convertSecondsToMiliseconds(5));
      } catch (Throwable t) {
        _log.error("Error, L2JailManagerInstance, reason: " + t.getMessage());
      }
      player.setInJail(false, 0);
      player.resetJailPoints();
      player.sendMessage(Message.getMessage(player, Message.MessageId.MSG_JAIL_POINTS_RESET));
      player.setIsInJailMission(false);
    }
    super.onBypassFeedback(player, command);
  }
  @Override
  public void onBypassFeedback(L2PcInstance player, String command) {
    if (command.startsWith("Chat")) {
      int val = 0;
      try {
        val = Integer.parseInt(command.substring(5));
      } catch (IndexOutOfBoundsException ioobe) {
      } catch (NumberFormatException nfe) {
      }
      showChatWindow(player, val);
      return;
    } else if (command.startsWith("ExchangeKE")) {
      String filename = null;
      int item;
      int i0 = Rnd.get(100);
      if (i0 < 5) {
        int i1 = Rnd.get(100);
        if (i1 < 5) item = 9931; // Red Talisman of Meditation
        else if (i1 <= 50) item = 9932; // Blue Talisman - Divine Protection
        else if (i1 <= 75) item = 10416; // Blue Talisman - Explosion
        else item = 10417; // Blue Talisman - Magic Explosion
      } else if (i0 <= 15) {
        switch (Rnd.get(5)) {
          case 1: // Red Talisman of Minimum Clarity
            item = 9917;
            break;
          case 2: // Red Talisman of Maximum Clarity
            item = 9918;
            break;
          case 3: // Red Talisman of Mental Regeneration
            item = 9928;
            break;
          case 4: // Blue Talisman of Protection
            item = 9929;
            break;
          default: // Blue Talisman of Invisibility
            item = 9920;
        }
      } else if (i0 <= 30) {
        switch (Rnd.get(8)) {
          case 1: // Blue Talisman of Defense
            item = 9916;
            break;
          case 2: // Blue Talisman of Defense
            item = 9916;
            break;
          case 3: // Blue Talisman of Healing
            item = 9924;
            break;
          case 4: // Red Talisman of Recovery
            item = 9925;
            break;
          case 5: // Blue Talisman of Defense
            item = 9926;
            break;
          case 6: // Blue Talisman of Magic Defense
            item = 9927;
            break;
          case 7: // Red Talisman - Life Force
            item = 10518;
            break;
          default: // Blue Talisman - Greater Healing
            item = 10424;
        }
      } else {
        switch (Rnd.get(46)) {
          case 0: // Blue Talisman of Power
            item = 9914;
            break;
          case 1: // Blue Talisman of Wild Magic
            item = 9915;
            break;
          case 2: // Blue Talisman of Invisibility
            item = 9920;
            break;
          case 3: // Blue Talisman of Invisibility
            item = 9920;
            break;
          case 4: // Blue Talisman - Shield Protection
            item = 9921;
            break;
          case 5: // Black Talisman - Mending
            item = 9922;
            break;
          case 6: // Yellow Talisman of Power
            item = 9933;
            break;
          case 7: // Yellow Talisman of Violent Haste
            item = 9934;
            break;
          case 8: // Yellow Talisman of Arcane Defense
            item = 9935;
            break;
          case 9: // Yellow Talisman of Arcane Power
            item = 9936;
            break;
          case 10: // Yellow Talisman of Arcane Haste
            item = 9937;
            break;
          case 11: // Yellow Talisman of Accuracy
            item = 9938;
            break;
          case 12: // Yellow Talisman of Defense
            item = 9939;
            break;
          case 13: // Yellow Talisman of Alacrity
            item = 9940;
            break;
          case 14: // Yellow Talisman of Speed
            item = 9941;
            break;
          case 15: // Yellow Talisman of Critical Reduction
            item = 9942;
            break;
          case 16: // Yellow Talisman of Critical Damage
            item = 9943;
            break;
          case 17: // Yellow Talisman of Critical Dodging
            item = 9944;
            break;
          case 18: // Yellow Talisman of Evasion
            item = 9945;
            break;
          case 19: // Yellow Talisman of Healing
            item = 9946;
            break;
          case 20: // Yellow Talisman of CP Regeneration
            item = 9947;
            break;
          case 21: // Yellow Talisman of Physical Regeneration
            item = 9948;
            break;
          case 22: // Yellow Talisman of Mental Regeneration
            item = 9949;
            break;
          case 23: // Grey Talisman of Weight Training
            item = 9950;
            break;
          case 24: // White Talisman of Protection
            item = 9965;
            break;
          case 25: // Orange Talisman - Hot Springs CP Potion
            item = 9952;
            break;
          case 26: // Orange Talisman - Elixir of Life
            item = 9953;
            break;
          case 27: // Orange Talisman - Elixir of Mental Strength
            item = 9954;
            break;
          case 28: // Black Talisman - Vocalization
            item = 9955;
            break;
          case 29: // Black Talisman - Arcane Freedom
            item = 9956;
            break;
          case 30: // Black Talisman - Physical Freedom
            item = 9957;
            break;
          case 31: // Black Talisman - Rescue
            item = 9958;
            break;
          case 32: // Black Talisman - Free Speech
            item = 9959;
            break;
          case 33: // White Talisman of Bravery
            item = 9960;
            break;
          case 34: // White Talisman of Motion
            item = 9961;
            break;
          case 35: // White Talisman of Grounding
            item = 9962;
            break;
          case 36: // White Talisman of Attention
            item = 9963;
            break;
          case 37: // White Talisman of Bandages
            item = 9964;
            break;
          case 38: // White Talisman - Storm
            item = 10418;
            break;
          case 39: // White Talisman - Water
            item = 10420;
            break;
          case 40: // White Talisman -  Earth
            item = 10519;
            break;
          case 41: // White Talisman - Light
            item = 10422;
            break;
          case 42: // Blue Talisman - Self-Destruction
            item = 10423;
            break;
          case 43: // White Talisman - Darkness
            item = 10419;
            break;
          default: // White Talisman - Fire
            item = 10421;
        }
      }

      if (player.destroyItemByItemId("ExchangeKE", 9912, 10, this, false)) {
        SystemMessage msg = SystemMessage.getSystemMessage(SystemMessageId.S2_S1_DISAPPEARED);
        msg.addItemName(9912);
        msg.addNumber(10);
        player.sendPacket(msg);

        player.addItem("ExchangeKE", item, 1, player, true);

        filename = "data/html/castlemagician/magician-KE-Exchange.htm";
      } else filename = "data/html/castlemagician/magician-no-KE.htm";

      showChatWindow(player, filename);
      return;
    } else if (command.equals("gotoleader")) {
      if (player.getClan() != null) {
        L2PcInstance clanLeader = player.getClan().getLeader().getPlayerInstance();
        if (clanLeader == null) return;

        if (clanLeader.getFirstEffect(L2EffectType.CLAN_GATE) != null) {
          if (!validateGateCondition(clanLeader, player)) return;

          player.teleToLocation(clanLeader.getX(), clanLeader.getY(), clanLeader.getZ(), false);
          return;
        }
        String filename = "data/html/castlemagician/magician-nogate.htm";
        showChatWindow(player, filename);
      }
      return;
    } else if (command.equals("subskills")) {
      if (player.getClan() != null) {
        if (player.isClanLeader()) {
          AcquireSkillList skilllist = new AcquireSkillList(SkillType.SubClass);
          FastList<L2SkillLearn> list =
              SkillTreesData.getInstance().getAvailableSubPledgeSkills(player.getClan());
          if (list.isEmpty()) {
            player.sendPacket(SystemMessageId.NO_MORE_SKILLS_TO_LEARN);
            return;
          }
          for (L2SkillLearn skillLearn : list) {
            skilllist.addSkill(
                skillLearn.getSkillId(),
                skillLearn.getSkillLevel(),
                skillLearn.getSkillLevel(),
                skillLearn.getLevelUpSp(),
                0);
          }
          player.sendPacket(skilllist);
        } else {
          String filename = "data/html/castlemagician/magician-nosquad.htm";
          showChatWindow(player, filename);
        }
      }
    } else super.onBypassFeedback(player, command);
  }