private void doFinalAction(L1PcInstance pc, String action) {
    int objid = getId();

    int npcid = getNpcTemplate().getNpcId();
    String htmlid = null;
    boolean isTeleport = true;

    if (npcid == 50014) { // ディロン
      if (!pc.getInventory().checkItem(40581)) { // アンデッドのキー
        isTeleport = false;
        htmlid = "dilongn";
      }
    } else if (npcid == 50043) { // ラムダ
      if (_isNowDely) { // テレポートディレイ中
        isTeleport = false;
      }
    } else if (npcid == 50625) { // 古代人(Lv50クエスト古代の空間2F)
      if (_isNowDely) { // テレポートディレイ中
        isTeleport = false;
      }
    }

    if (isTeleport) { // テレポート実行
      try {
        // ミュータントアントダンジョン(君主Lv30クエスト)
        if (action.equalsIgnoreCase("teleport mutant-dungen")) {
          // 3マス以内のPc
          for (L1PcInstance otherPc : L1World.getInstance().getVisiblePlayer(pc, 3)) {
            if (otherPc.getClanId() == pc.getClanId() && otherPc.getId() != pc.getId()) {
              L1Teleport.teleport(otherPc, 32740, 32800, (short) 217, 5, true);
            }
          }
          L1Teleport.teleport(pc, 32740, 32800, (short) 217, 5, true);
        }
        // 試練のダンジョン(ウィザードLv30クエスト)
        else if (action.equalsIgnoreCase("teleport mage-quest-dungen")) {
          L1Teleport.teleport(pc, 32791, 32788, (short) 201, 5, true);
        } else if (action.equalsIgnoreCase("teleport 29")) { // ラムダ
          L1PcInstance kni = null;
          L1PcInstance elf = null;
          L1PcInstance wiz = null;
          // 3マス以内のPc
          for (L1PcInstance otherPc : L1World.getInstance().getVisiblePlayer(pc, 3)) {
            L1Quest quest = otherPc.getQuest();
            if (otherPc.isKnight() // ナイト
                && quest.getStep(L1Quest.QUEST_LEVEL50) == 1) { // ディガルディン同意済み
              if (kni == null) {
                kni = otherPc;
              }
            } else if (otherPc.isElf() // エルフ
                && quest.getStep(L1Quest.QUEST_LEVEL50) == 1) { // ディガルディン同意済み
              if (elf == null) {
                elf = otherPc;
              }
            } else if (otherPc.isWizard() // ウィザード
                && quest.getStep(L1Quest.QUEST_LEVEL50) == 1) { // ディガルディン同意済み
              if (wiz == null) {
                wiz = otherPc;
              }
            }
          }
          if (kni != null && elf != null && wiz != null) { // 全クラス揃っている
            L1Teleport.teleport(pc, 32723, 32850, (short) 2000, 2, true);
            L1Teleport.teleport(kni, 32750, 32851, (short) 2000, 6, true);
            L1Teleport.teleport(elf, 32878, 32980, (short) 2000, 6, true);
            L1Teleport.teleport(wiz, 32876, 33003, (short) 2000, 0, true);
            TeleportDelyTimer timer = new TeleportDelyTimer();
            GeneralThreadPool.getInstance().execute(timer);
          }
        } else if (action.equalsIgnoreCase("teleport barlog")) {
          // 古代人(Lv50クエスト古代の空間2F)
          L1Teleport.teleport(pc, 32755, 32844, (short) 2002, 5, true);
          TeleportDelyTimer timer = new TeleportDelyTimer();
          GeneralThreadPool.getInstance().execute(timer);
        }
      } catch (Exception e) {
      }
    }
    if (htmlid != null) { // 表示するhtmlがある場合
      pc.sendPackets(new S_NpcTalkReturn(objid, htmlid));
    }
  }
  @Override
  public void onTalkAction(L1PcInstance pc) {
    int objid = getId();
    L1NpcTalkData talking = NpcTalkDataTable.getInstance().getTemplate(getNpcTemplate().getNpcId());
    int npcid = getNpcTemplate().getNpcId();
    L1Quest quest = pc.getQuest();
    String htmlid = null;

    if (talking != null) {
      if (npcid == 50014) { // ディロン
        if (pc.isWizard()) { // ウィザード
          if (quest.getStep(L1Quest.QUEST_LEVEL30) == 1
              && !pc.getInventory().checkItem(40579)) { // アンデッドの骨
            htmlid = "dilong1";
          } else {
            htmlid = "dilong3";
          }
        }
      } else if (npcid == 70779) { // ゲートアント
        if (pc.getTempCharGfx() == 1037 || pc.getTempCharGfx() == 2437) { // ジャイアントアント変身
          htmlid = "ants3";
        } else if (pc.getTempCharGfx() == 1039 || pc.getTempCharGfx() == 2438) { // ジャイアントアントソルジャー変身
          if (pc.isCrown()) { // 君主
            if (quest.getStep(L1Quest.QUEST_LEVEL30) == 1) {
              if (pc.getInventory().checkItem(40547)) { // 住民たちの遺品
                htmlid = "antsn";
              } else {
                htmlid = "ants1";
              }
            } else { // Step1以外
              htmlid = "antsn";
            }
          } else { // 君主以外
            htmlid = "antsn";
          }
        }
      } else if (npcid == 70853) { // フェアリープリンセス
        if (pc.isElf()) { // エルフ
          if (quest.getStep(L1Quest.QUEST_LEVEL30) == 1) {
            if (!pc.getInventory().checkItem(40592)) { // 呪われた精霊書
              RandomGenerator random = RandomGeneratorFactory.getSharedRandom();
              if (random.nextInt(100) < 50) { // 50%でダークマールダンジョン
                htmlid = "fairyp2";
              } else { // ダークエルフダンジョン
                htmlid = "fairyp1";
              }
            }
          }
        }
      } else if (npcid == 50031) { // セピア
        if (pc.isElf()) { // エルフ
          if (quest.getStep(L1Quest.QUEST_LEVEL45) == 2) {
            if (!pc.getInventory().checkItem(40602)) { // ブルーフルート
              htmlid = "sepia1";
            }
          }
        }
      } else if (npcid == 50043) { // ラムダ
        if (quest.getStep(L1Quest.QUEST_LEVEL50) == L1Quest.QUEST_END) {
          htmlid = "ramuda2";
        } else if (quest.getStep(L1Quest.QUEST_LEVEL50) == 1) { // ディガルディン同意済み
          if (pc.isCrown()) { // 君主
            if (_isNowDely) { // テレポートディレイ中
              htmlid = "ramuda4";
            } else {
              htmlid = "ramudap1";
            }
          } else { // 君主以外
            htmlid = "ramuda1";
          }
        } else {
          htmlid = "ramuda3";
        }
      }
      // 歌う島のテレポーター
      else if (npcid == 50082) {
        if (pc.getLevel() < 13) {
          htmlid = "en0221";
        } else {
          if (pc.isElf()) {
            htmlid = "en0222e";
          } else if (pc.isDarkelf()) {
            htmlid = "en0222d";
          } else {
            htmlid = "en0222";
          }
        }
      }
      // バルニア
      else if (npcid == 50001) {
        if (pc.isElf()) {
          htmlid = "barnia3";
        } else if (pc.isKnight() || pc.isCrown()) {
          htmlid = "barnia2";
        } else if (pc.isWizard() || pc.isDarkelf()) {
          htmlid = "barnia1";
        }
      }
      // デジェネレイト ソウル
      else if (npcid == 71095) {
        if (pc.isDarkelf()) {
          if (pc.getLevel() >= 50) {
            int lv50_step = quest.getStep(L1Quest.QUEST_LEVEL50);
            if (lv50_step == L1Quest.QUEST_END) {
              htmlid = "csoulq3";
            } else if (lv50_step >= 3) {
              boolean find = false;
              for (Object objs : L1World.getInstance().getVisibleObjects(306).values()) {
                if (objs instanceof L1PcInstance) {
                  L1PcInstance _pc = (L1PcInstance) objs;
                  if (_pc != null) { // 思念のダンジョン内に他PCがいる場合
                    find = true;
                    htmlid = "csoulqn"; // おまえの邪念はまだ満たされてない。
                    break;
                  }
                }
              }
              if (!find) {
                htmlid = "csoulq1";
              } else {
                htmlid = "csoulqn";
              }
            }
          }
        }
      }
      // カレン
      else if (npcid == 71013) {
        if (pc.isDarkelf()) {
          if (pc.getLevel() < 13) {
            htmlid = "karen1";
          } else {
            htmlid = "karen4";
          }
        } else {
          htmlid = "karen2";
        }
      }
      // シルベリアテレポーター イリュージョニストアシャ
      else if (npcid == 80173) {
        if (pc.isIllusionist()) {
          htmlid = "asha1";
        } else {
          htmlid = "asha2";
        }
      }
      // ベヒモステレポーター ドラゴンナイトピエナ
      else if (npcid == 80174) {
        if (pc.isDragonKnight()) {
          htmlid = "feaena1";
        } else {
          htmlid = "feaena2";
        }
      }

      // html表示
      if (htmlid != null) { // htmlidが指定されている場合
        pc.sendPackets(new S_NpcTalkReturn(objid, htmlid));
      } else {
        if (pc.getLawful() < -1000) { // プレイヤーがカオティック
          pc.sendPackets(new S_NpcTalkReturn(talking, objid, 2));
        } else {
          pc.sendPackets(new S_NpcTalkReturn(talking, objid, 1));
        }
      }
    } else {
      _log.finest(
          (new StringBuilder()).append("No actions for npc id : ").append(objid).toString());
    }
  }