Показать: 23|Ответить: 1

Локация: Лагерь у Древа Шепотов

[Скопировать ссылку]
Опубликовано 2025-11-9 21:34:39 | Показать все этажи |Режим чтения
Локация: Лагерь у Древа Шепотов
Тип: сюжетная локация (не инстанс, а общая зона)
Используемые модели: ведьма / шаман, орки, костёр, котёл, палатки, телега, NPC-торговец
Основная роль: первая сюжетная “точка интереса” после Разрушенной Деревни

Лагерь у Древа Шепотов

Лагерь у Древа Шепотов

⚙️ Суть сюжета
Игрок случайно попадает в лагерь к небольшой группе отшельников-орков, которые называют себя Хранителями Кости.
Их ведьма-шаманка Морна варит в котле зелье, способное “разбудить духов прошлого”, чтобы получить знания о Сопряжении миров.
Но что-то идёт не так — в лагере начинают происходить аномалии: предметы двигаются, слышны голоса, и игроку придётся помочь ведьме стабилизировать ритуал, пока не прорвётся Разлом.

🪶 Структура квеста “Шёпот под корнями”1. Начало
NPC Морна (ID 30310)
"Не бойся, путник. Мы не враги. Духи прошлого хотят говорить... но язык костей труден. Принеси мне три символа памяти из старых руин, и я услышу их зов."
Игрок идёт по округе, убивает 3–4 простых моба (можно использовать существующих орков, падших магов и т.д.)
Получает предметы: BoneFragment, OldCharm, FadedRune.

2. Ритуал
Возвращается к Молне → она просит подойти к котлу.
При активации — триггер через onAdvEvent:
  • эффект пламени (SkillCast с визуалом),
  • игрок получает сообщение:
    “Ты слышишь шёпот… ‘Эльморион проснулся… ищи кристалл…’ ”

После этого даётся свиток:
📜 Scroll of Faint Whisper — предмет-ключ, открывающий телепорт в Разрушенную Деревню (новый этап сюжета).

3. Побочный элемент
Рядом можно добавить NPC-торговца Орк Харн, который “обменивает” найденные кости на зелья и бафы.
Это создаёт ощущение маленькой базы — игрок может сюда возвращаться.

💡 Геймдизайн польза
  • Вовлекает игрока в лор Эльмориона через слухи и тайны, а не через “спаси мир”.
  • Работает на любом клиенте Essence, без редактирования моделей.
  • Открывает следующий сюжет (разлом / Руины / испытания фракций).
  • Даёт первую “плюшку”: доступ к телепорту и уникальному зелью (например, “Эликсир памяти”, увеличивающему EXP на 10% на 30 минут).


🧩 Можно расширить:
Если игрок завершает квест, активируется счётчик в БД через AstraCrystalLogger
→ faction = CHAOS или LIGHT в зависимости от выбора в диалоге:
  • “Помочь ведьме” → Хаос
  • “Очистить котёл” → Свет


Хроники Элмориона пишутся каждым шагом путника.
 Автор темы| Опубликовано 2025-11-9 21:47:32 | Показать все этажи
Q70007_WhisperUnderRoots.java

Квест — лёгкий, атмосферный, и закладывает первый сюжетный “крючок” для будущей цепочки о Разломах.
📜 Q70007_WhisperUnderRoots.java
  1. /*
  2. * Copyright (c) 2024 ASTRA Dynamics
  3. *
  4. * Licensed under the ASTRA License, Version 1.0 (the "License");
  5. * https://artace.ru/forum-78-1.html
  6. *
  7. * Author: SoulArchitect (ASTRA Dynamics)
  8. * Created Date: 2024-11-09
  9. *
  10. * Description:
  11. * Q70007_WhisperUnderRoots — сюжетный квест Эльмориона.
  12. * Игрок помогает ведьме Морне провести ритуал в лагере у Древа Шепотов.
  13. * Выбор игрока (помочь ведьме или очистить котёл) влияет на фракцию (CHAOS/LIGHT)
  14. * и логируется через AstraCrystalLogger.
  15. */

  16. package quests.Q70007_WhisperUnderRoots;

  17. import org.l2jmobius.gameserver.model.actor.Npc;
  18. import org.l2jmobius.gameserver.model.actor.Player;
  19. import org.l2jmobius.gameserver.model.quest.Quest;
  20. import org.l2jmobius.gameserver.model.quest.QuestState;
  21. import org.l2jmobius.gameserver.model.quest.State;

  22. import astra.AstraCrystalLogger;

  23. public class Q70007_WhisperUnderRoots extends Quest
  24. {
  25.         private static final int QUEST_ID = 70007;
  26.         private static final int NPC_MORNA = 30310; // Ведьма Морна
  27.         private static final int MOB_BONE_SPIRIT = 20517; // Скелет/призрак для фрагментов
  28.         private static final int ITEM_BONE_FRAGMENT = 97010;
  29.         private static final int ITEM_SCROLL_WHISPER = 97011;
  30.         private static final int MIN_LEVEL = 20;
  31.        
  32.         public Q70007_WhisperUnderRoots()
  33.         {
  34.                 super(QUEST_ID);
  35.                 addStartNpc(NPC_MORNA);
  36.                 addTalkId(NPC_MORNA);
  37.                 addKillId(MOB_BONE_SPIRIT);
  38.                 registerQuestItems(ITEM_BONE_FRAGMENT, ITEM_SCROLL_WHISPER);
  39.                 addCondMinLevel(MIN_LEVEL, "30310-00.htm");
  40.         }
  41.        
  42.         @Override
  43.         public String onAdvEvent(String event, Npc npc, Player player)
  44.         {
  45.                 final QuestState qs = getQuestState(player, true);
  46.                
  47.                 if (qs == null)
  48.                 {
  49.                         return null;
  50.                 }
  51.                
  52.                 switch (event)
  53.                 {
  54.                         case "30310-02.htm":
  55.                         {
  56.                                 qs.startQuest();
  57.                                 return event;
  58.                         }
  59.                         case "30310-03.htm": // Проверка фрагментов
  60.                         {
  61.                                 if (getQuestItemsCount(player, ITEM_BONE_FRAGMENT) >= 3)
  62.                                 {
  63.                                         takeItems(player, ITEM_BONE_FRAGMENT, 3);
  64.                                         giveItems(player, ITEM_SCROLL_WHISPER, 1);
  65.                                         qs.setCond(2);
  66.                                         return "30310-04.htm";
  67.                                 }
  68.                                 return "30310-03a.htm";
  69.                         }
  70.                         case "30310-CHAOS.htm": // Помочь ведьме — путь Хаоса
  71.                         {
  72.                                 AstraCrystalLogger.log(player, "Ritual of Morna", ITEM_SCROLL_WHISPER, "CHAOS");
  73.                                 addExpAndSp(player, 50000, 200);
  74.                                 giveAdena(player, 10000, true);
  75.                                 qs.exitQuest(false, true);
  76.                                 return "30310-CHAOS.htm";
  77.                         }
  78.                         case "30310-LIGHT.htm": // Очистить котёл — путь Света
  79.                         {
  80.                                 AstraCrystalLogger.log(player, "Purification Ritual", ITEM_SCROLL_WHISPER, "LIGHT");
  81.                                 addExpAndSp(player, 50000, 200);
  82.                                 giveAdena(player, 10000, true);
  83.                                 qs.exitQuest(false, true);
  84.                                 return "30310-LIGHT.htm";
  85.                         }
  86.                 }
  87.                 return event;
  88.         }
  89.        
  90.         @Override
  91.         public String onTalk(Npc npc, Player player)
  92.         {
  93.                 final QuestState qs = getQuestState(player, true);
  94.                 final int cond = qs.getCond();
  95.                
  96.                 switch (qs.getState())
  97.                 {
  98.                         case State.CREATED:
  99.                         {
  100.                                 return player.getLevel() >= MIN_LEVEL ? "30310-01.htm" : "30310-00.htm";
  101.                         }
  102.                         case State.STARTED:
  103.                         {
  104.                                 if (cond == 1)
  105.                                 {
  106.                                         return "30310-03.htm";
  107.                                 }
  108.                                 else if (cond == 2)
  109.                                 {
  110.                                         return "30310-05.htm";
  111.                                 }
  112.                                 break;
  113.                         }
  114.                         case State.COMPLETED:
  115.                         {
  116.                                 return getNoQuestMsg(player);
  117.                         }
  118.                 }
  119.                 return getNoQuestMsg(player);
  120.         }
  121.        
  122.         @Override
  123.         public String onKill(Npc npc, Player killer, boolean isSummon)
  124.         {
  125.                 final QuestState qs = getQuestState(killer, false);
  126.                 if ((qs != null) && qs.isStarted() && qs.isCond(1))
  127.                 {
  128.                         giveItemRandomly(killer, npc, ITEM_BONE_FRAGMENT, 1, 3, 0.5, true);
  129.                 }
  130.                 return super.onKill(npc, killer, isSummon);
  131.         }
  132. }
Скопировать код
🧩 Дополнения и связь с Astra🔸 Логика расширения:
  • После завершения квеста, AstraCrystalLogger.log() создаёт запись:
    • faction = "CHAOS" или "LIGHT"
    • crystalName = "Ritual of Morna" / "Purification Ritual"
    • crystalId = ITEM_SCROLL_WHISPER


В таблице elmo_crystals эта запись автоматически обновит счётчик фракции через триггеры (как мы реализовали ранее).

🗂️ HTML файлы (папка data/html/quests/Q70007_WhisperUnderRoots/)
30310-01.htm
  1. <html><body>Ведьма Морна:<br>
  2. Ты чувствуешь этот запах? Это не дым... это память. Древо шепчет имена павших.<br>
  3. Хочешь услышать, что оно говорит?<br>
  4. <a action="bypass -h Quest Q70007_WhisperUnderRoots 30310-02.htm">"Я готов."</a>
  5. </body></html>
Скопировать код
30310-03.htm
  1. <html><body>Ведьма Морна:<br>
  2. Кости хранят воспоминания. Принеси мне три фрагмента костей из руин.<br>
  3. Может быть, духи заговорят снова...
  4. </body></html>
Скопировать код
30310-04.htm
  1. <html><body>Ведьма Морна:<br>
  2. Они заговорили... слышишь?<br>
  3. Эти голоса... они зовут из Разлома. Выбор за тобой, путник:<br>
  4. <a action="bypass -h Quest Q70007_WhisperUnderRoots 30310-CHAOS.htm">Помочь ведьме — отдать голоса Хаосу</a><br>
  5. <a action="bypass -h Quest Q70007_WhisperUnderRoots 30310-LIGHT.htm">Очистить котёл — даровать покой Свету</a>
  6. </body></html>
Скопировать код
30310-CHAOS.htm
  1. <html><body>Ведьма Морна:<br>
  2. Хаос примет тебя... и откроет врата к Разлому. Запомни этот шёпот.<br>
  3. <font color="LEVEL">[Вы выбрали путь Хаоса]</font>
  4. </body></html>
Скопировать код
30310-LIGHT.htm
  1. <html><body>Ведьма Морна:<br>
  2. Свет очистил голоса. Но помни — даже пепел помнит.<br>
  3. <font color="LEVEL">[Вы выбрали путь Света]</font>
  4. </body></html>
Скопировать код


Хроники Элмориона пишутся каждым шагом путника.
Расширенный режим
B Color Image Link Quote Code Smilies |Загрузить

Правила начисления баллов

Быстрый ответ Наверх Вернуться к списку