L2JMobius

Helios BUG Q10385 RedThreadOfFate (01.04.2026)

RootShell · 3 · 166

Offline RootShell

  • Heir
  • **
    • Posts: 12
Subject:
[Helios] Quest Q10385_RedThreadOfFate — NPCs in "Talking Island Past" instance ignore interaction

Bug Description:
During the quest "Red Thread of Fate" (Q10385), NPCs inside the "Talking Island Past" instance zone (Darin, Roxxy, and Mysterious Dark Knight) do not open any dialogue windows when clicked, even if the quest condition (cond) is correct (e.g., cond 19 for Darin/Roxxy and cond 21 for the Dark Knight).

The root cause:
These NPCs are located within an instance zone. In L2J Mobius, interaction with instance-based NPCs often fails with standard onTalk registration. They must be registered via addFirstTalkId, and their dialogue logic must be explicitly handled in the onFirstTalk method. Currently, the script only includes them in addTalkId, which is insufficient for this specific zone.

Affected NPCs:
Darin (ID: 33748)
Roxxy (ID: 33749)
Mysterious Dark Knight (ID: 33751)

Steps to Reproduce:
Enter the "Talking Island Past" instance at cond 19.
Click on Darin or Roxxy.
Observe that no HTML dialogue window is displayed (the server remains silent).

Suggested Fix:
Add DARIN, ROXXY, and MYSTERIOUS_DARK_KNIGHT to the addFirstTalkId list in the quest constructor.
Update the onFirstTalk method to include logic for these NPCs, returning the appropriate HTML files (e.g., 33748-01.html, 33749-01.html, and 33751-01.html) when the quest condition is met.

Code: [Select]
--- ../Q10385_RedThreadOfFate.java      2026-04-07 21:43:52.000000000 +0300
+++ Q10385_RedThreadOfFate.java 2026-05-08 04:32:31.336184693 +0300
@@ -114,7 +114,7 @@
        {
                super(10385);
                addStartNpc(RAINA);
-               addFirstTalkId(ALTAR_OF_SHILEN, MOTHER_TREE, PAAGRIO_TEMPLE, DESERTED_DWARVEN_HOUSE, CAVE_OF_SOULS);
+               addFirstTalkId(ALTAR_OF_SHILEN, MOTHER_TREE, PAAGRIO_TEMPLE, DESERTED_DWARVEN_HOUSE, CAVE_OF_SOULS, DARIN, ROXXY, MYSTERIOUS_DARK_KNIGHT);
                addTalkId(RAINA, MORELYN, LANYA, LADY_OF_THE_LAKE, NERUPA, ENFEUX, INNOCENTIN, VULCAN, MIXING_URN, WESLEY, HEINE_WATER_SOURCE, MYSTERIOUS_DARK_KNIGHT, DARIN, ROXXY, BIOTIN);
                addSkillSeeId(ALTAR_OF_SHILEN, MOTHER_TREE, PAAGRIO_TEMPLE, DESERTED_DWARVEN_HOUSE, CAVE_OF_SOULS);
                addKillId(SHILEN_MESSENGER);
@@ -770,103 +770,131 @@
                        }
                }
        }
-
-       @Override
-       public String onFirstTalk(Npc npc, Player player)
-       {
-               String htmltext = null;
-               final QuestState qs = getQuestState(player, false);
-               if (qs != null)
-               {
-                       switch (npc.getId())
-                       {
-                               case DESERTED_DWARVEN_HOUSE:
-                               {
-                                       if (qs.isCond(14))
-                                       {
-                                               showOnScreenMsg(player, NpcStringId.USE_THE_FONDEST_HEART_IN_YOUR_INVENTORY, ExShowScreenMessage.TOP_CENTER, 5000);
-                                               htmltext = "33788-01.html";
-                                       }
-                                       else
-                                       {
-                                               npc.showChatWindow(player);
-                                       }
-                                       break;
-                               }
-                               case PAAGRIO_TEMPLE:
-                               {
-                                       if (qs.isCond(15))
-                                       {
-                                               showOnScreenMsg(player, NpcStringId.USE_THE_FIERCEST_FLAME_IN_YOUR_INVENTORY, ExShowScreenMessage.TOP_CENTER, 5000);
-                                               htmltext = "33787-01.html";
-                                       }
-                                       else
-                                       {
-                                               npc.showChatWindow(player);
-                                       }
-                                       break;
-                               }
-                               case ALTAR_OF_SHILEN:
-                               {
-                                       if (qs.isCond(16))
-                                       {
-                                               showOnScreenMsg(player, NpcStringId.USE_THE_BRIGHTEST_LIGHT_IN_YOUR_INVENTORY, ExShowScreenMessage.TOP_CENTER, 5000);
-                                               htmltext = "33785-01.html";
-                                       }
-                                       else
-                                       {
-                                               npc.showChatWindow(player);
-                                       }
-                                       break;
-                               }
-                               case CAVE_OF_SOULS:
-                               {
-                                       if (qs.isCond(17))
-                                       {
-                                               showOnScreenMsg(player, NpcStringId.USE_THE_PUREST_SOUL_IN_YOUR_INVENTORY, ExShowScreenMessage.TOP_CENTER, 5000);
-                                               htmltext = "33789-01.html";
-                                       }
-                                       else
-                                       {
-                                               npc.showChatWindow(player);
-                                       }
-                                       break;
-                               }
-                               case MOTHER_TREE:
-                               {
-                                       switch (qs.getCond())
-                                       {
-                                               case 18:
-                                               {
-                                                       showOnScreenMsg(player, NpcStringId.USE_THE_CLEAREST_WATER_IN_YOUR_INVENTORY, ExShowScreenMessage.TOP_CENTER, 5000);
-                                                       htmltext = "33786-01.html";
-                                                       break;
-                                               }
-                                               case 19:
-                                               case 20:
-                                               case 21:
-                                               {
-                                                       final Quest instance = ScriptManager.getInstance().getScript(TalkingIslandPast.class.getSimpleName());
-                                                       if (instance != null)
-                                                       {
-                                                               instance.onEvent("enterInstance", npc, player);
-                                                       }
-                                                       break;
-                                               }
-                                               default:
-                                               {
-                                                       npc.showChatWindow(player);
-                                               }
-                                       }
-                                       break;
-                               }
-                       }
-               }
-               else
-               {
-                       npc.showChatWindow(player);
-               }
-
-               return htmltext;
-       }
+               @Override
+        public String onFirstTalk(Npc npc, Player player)
+        {
+                String htmltext = null;
+                final QuestState qs = getQuestState(player, false);
+                if (qs != null)
+                {
+                        switch (npc.getId())
+                        {
+                                case DARIN:
+                                {
+                                        if (qs.isCond(19))
+                                        {
+                                                htmltext = (qs.get(DARIN_VAR) == null) ? "33748-01.html" : "33748-03.html";
+                                        }
+                                        break;
+                                }
+                                case ROXXY:
+                                {
+                                        if (qs.isCond(19))
+                                        {
+                                                htmltext = (qs.get(ROXXY_VAR) == null) ? "33749-01.html" : "33749-03.html";
+                                        }
+                                        break;
+                                }
+                                case MYSTERIOUS_DARK_KNIGHT:
+                                {
+                                        if (qs.isCond(21))
+                                        {
+                                                htmltext = "33751-01.html";
+                                        }
+                                        break;
+                                }
+                                case DESERTED_DWARVEN_HOUSE:
+                                {
+                                        if (qs.isCond(14))
+                                        {
+                                                showOnScreenMsg(player, NpcStringId.USE_THE_FONDEST_HEART_IN_YOUR_INVENTORY, ExShowScreenMessage.TOP_CENTER, 5000);
+                                                htmltext = "33788-01.html";
+                                        }
+                                        else
+                                        {
+                                                npc.showChatWindow(player);
+                                        }
+                                        break;
+                                }
+                                case PAAGRIO_TEMPLE:
+                                {
+                                        if (qs.isCond(15))
+                                        {
+                                                showOnScreenMsg(player, NpcStringId.USE_THE_FIERCEST_FLAME_IN_YOUR_INVENTORY, ExShowScreenMessage.TOP_CENTER, 5000);
+                                                htmltext = "33787-01.html";
+                                        }
+                                        else
+                                        {
+                                                npc.showChatWindow(player);
+                                        }
+                                        break;
+                                }
+                                case ALTAR_OF_SHILEN:
+                                {
+                                        if (qs.isCond(16))
+                                        {
+                                                showOnScreenMsg(player, NpcStringId.USE_THE_BRIGHTEST_LIGHT_IN_YOUR_INVENTORY, ExShowScreenMessage.TOP_CENTER, 5000);
+                                                htmltext = "33785-01.html";
+                                        }
+                                        else
+                                        {
+                                                npc.showChatWindow(player);
+                                        }
+                                        break;
+                                }
+                                case CAVE_OF_SOULS:
+                                {
+                                        if (qs.isCond(17))
+                                        {
+                                                showOnScreenMsg(player, NpcStringId.USE_THE_PUREST_SOUL_IN_YOUR_INVENTORY, ExShowScreenMessage.TOP_CENTER, 5000);
+                                                htmltext = "33789-01.html";
+                                        }
+                                        else
+                                        {
+                                                npc.showChatWindow(player);
+                                        }
+                                        break;
+                                }
+                                case MOTHER_TREE:
+                                {
+                                        switch (qs.getCond())
+                                        {
+                                                case 18:
+                                                {
+                                                        showOnScreenMsg(player, NpcStringId.USE_THE_CLEAREST_WATER_IN_YOUR_INVENTORY, ExShowScreenMessage.TOP_CENTER, 5000);
+                                                        htmltext = "33786-01.html";
+                                                        break;
+                                                }
+                                                case 19:
+                                                case 20:
+                                                case 21:
+                                                {
+                                                        final Quest instance = ScriptManager.getInstance().getScript(TalkingIslandPast.class.getSimpleName());
+                                                        if (instance != null)
+                                                        {
+                                                                instance.onEvent("enterInstance", npc, player);
+                                                        }
+                                                        break;
+                                                }
+                                                default:
+                                                {
+                                                        npc.showChatWindow(player);
+                                                }
+                                        }
+                                        break;
+                                }
+                                default:
+                                {
+                                        npc.showChatWindow(player);
+                                }
+                        }
+                }
+                else
+                {
+                        npc.showChatWindow(player);
+                }
+
+                return htmltext;
+        }
+
 }


Offline Trevor The Third

  • Elder
  • ****
    • Posts: 139
There is really no need for addFirstTalkId inside quest script. It's needed in instanced script.
Moved all talking, so all npc's (including Dwarven House :P) are responsive.
That quest was also missing Awakened class condition.
[PATCH]