|
🩸 1. Линия фракции Тьмы — «Эхо Утраты» Роль: хранитель древнего проклятия, связанного с Осколками Тьмы.
Описание:
Когда-то Карул Оруто был вождём гордых горных орков, охранявших врата мира стихий. После «Разлома Первого Света» он пал под воздействием Тьмы и стал бессмертным стражем древнего кристалла. Его тело изъедено временем, но сила не угасла. Квест:
Игроку предстоит сразиться с ним, чтобы добыть Осколок Тлена — один из ключевых фрагментов для формирования Кристалла Тьмы.
В бою он произносит реплики, напоминающие о былой гордости орков и их предательстве богами. ⚔️ 2. История Эпохи Разломов — «Падшие Вожди»Роль: один из «Семи павших», вождей, что пытались закрыть разлом, но были превращены в чудовищ.
Описание:
Карул Оруто был братом Вождя Тарука, но предал клан, заключив договор с сущностями Астрала. Он стал первым, кто получил «Печать Осквернённого Тела» — магическую метку, превращающую его плоть в орудие разрушения. Использование:
Можно внедрить его как рейдового босса уровня 55–65 с уникальной механикой —
он периодически вызывает эхо своих павших воинов (призраки, усиливающие его атаку). 🔥 3. Ветка Света — «Очищение Разлома»Роль: страж древней кузницы, осквернённый Тьмой.
Описание:
Светлые силы видят в Каруле не просто врага, а потерянную душу. Герой может выбрать — убить его или очистить, пожертвовав своей частью Света.
В зависимости от выбора изменяется баланс мира в счётчике Астры (BB). 🧩 4. Клановая миссия — «Трофеи Вождя»Роль: объект охоты для группового ивента.
Описание:
Карул может быть добавлен как еженедельный босс, дающий клановые ресурсы (например, «Кровавый Тотем Оруто» и «Клык Вождя»).
Эти предметы можно использовать для улучшения клановых умений или для обмена у шаманов в Эльморе. 💀 Возможное расположение:
🩸 КВЕСТ: Наследие Оруто(Q10031_OrutoLegacy.java) Тип: Сюжетный / Фракционный (Тьма)
Уровень: 55+
Начало: Город Гиран — NPC «Шаман Друккар»
Финал: Битва с Вождём Карулом Оруто (ID: 27164) 📜 I. Пролог — «Шёпот из Разлома»NPC: Шаман Друккар (ID: 30977)
HTML: 30977-1.htm <html><body>Шаман Друккар:<br>Ты слышишь это? Земля стонет. В глубинах Разлома просыпается древний дух — <font color="LEVEL">Карул Оруто</font>.<br>Когда-то он был вождём орков, но принял силу Тьмы, чтобы спасти свой клан… и обрёк его.<br><br>Если хочешь понять, что ждёт Эльморион, иди туда, где камни плачут кровью.<br><Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10031_OrutoLegacy acceptQuest">Отправиться к Разлому</Button></body></html> Цель: Принять задание и отправиться к «Разлому Оруто» (локация — северная часть Долины Орков). ⚔️ II. Этап — «Падший Вождь»Описание:
Игрок находит лагерь павших орков. В центре стоит идол с выбитым именем Оруто. При взаимодействии запускается сцена появления вождя. NPC: Вождь Карул Оруто (ID: 27164)
HTML: 27164-1.htm <html><body>Вождь Карул Оруто:<br><font color="LEVEL">Ты… живой?</font> Я помню свет… и боль. Моё тело — это тюрьма, созданная богами. Ты пришёл забрать моё наследие? Или освободить?<br><br><Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10031_OrutoLegacy killBoss">Сразиться с ним</Button><br><Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10031_OrutoLegacy purifySoul">Очищение души</Button></body></html> ☯️ III. Развилка:🩸 Вариант 1 — «Путь Тьмы»Игрок выбирает битву. После победы он получает предмет:
[Осколок Тлена] (ID: 200014)
и увеличивает счётчик фракции Тьмы в системе АСТРЫ. 🌅 Вариант 2 — «Путь Света»Игрок очищает дух Оруто, теряя 1 очко Света, но получая предмет:
[Память Оруто] (ID: 200040) — используется позже для создания Скрижали. 🏆 IV. Завершение — «Наследие Принято»Возврат к: Шаман Друккар
HTML: 30977-2.htm <html><body>Шаман Друккар:<br>Судьба Оруто решена...<br>Я чувствую, как Астра записала это в летопись мира.<br>Каждый выбор изменяет равновесие, путник. Даже твой.<br><br><font color="LEVEL">Ты завершил квест "Наследие Оруто".</font></body></html> 💰 Награды: ⚙️ Техническая интеграцияФайл: Q10031_OrutoLegacy.java
Путь: \data\scripts\quests\Q10031_OrutoLegacy
Связанные HTML: 30977-1.htm 27164-1.htm 30977-2.htm
Q10031_OrutoLegacy.java
- /*
- * Copyright (c) 2024 ASTRA Dynamics
- *
- * Licensed under the ASTRA License, Version 1.0 (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://artace.ru/forum-78-1.html
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * Author: SoulArchitect (ASTRA Dynamics)
- * Created Date: 2025-10-24
- *
- * Description (RU):
- * Квестовая линия «Наследие Оруто».
- * Игрок по выбору либо сражается с Вождём Карулом Оруто (ID 27164) и получает «Осколок Тлена»,
- * усиливая фракцию Тьмы; либо очищает его дух и получает «Память Оруто», двигая счётчик Света.
- *
- * Встроены безопасные вызовы в подсистему АСТРЫ (Balance Brain / Counters).
- * Если классов АСТРЫ пока нет — блок try/catch заглушает вызов.
- */
- package quests.Q10031_OrutoLegacy;
- import org.l2jmobius.gameserver.enums.QuestSound;
- import org.l2jmobius.gameserver.enums.Race;
- import org.l2jmobius.gameserver.model.actor.Npc;
- import org.l2jmobius.gameserver.model.actor.Player;
- import org.l2jmobius.gameserver.model.quest.Quest;
- import org.l2jmobius.gameserver.model.quest.QuestState;
- import org.l2jmobius.gameserver.model.quest.State;
- import org.l2jmobius.gameserver.network.NpcStringId;
- import org.l2jmobius.gameserver.util.Util;
- public class Q10031_OrutoLegacy extends Quest
- {
- // ====== Константы объекта мира / NPC / предметов ======
- private static final int SHAMAN_DRUKKAR = 30977; // Стартовый NPC (шаман в Гиране/Адене — можно поменять)
- private static final int ORUTO_BOSS = 27164; // Вождь Карул Оруто (квестовый монстр/рейд)
-
- // Предметы по лору (создай при необходимости в базе/дат-файлах своими ID)
- private static final int SHARD_DECAY = 200014; // Осколок Тлена (Тьма)
- private static final int MEMORY_ORUTO = 200040; // Память Оруто (Свет)
-
- // Прочие настройки
- private static final int MIN_LEVEL = 55;
-
- // Состояния (cond) для наглядности
- // 0 — ещё не брали; 1 — принято; 2 — выбрали бой; 3 — убит босс; 4 — выбрали очищение; 5 — очищено; 6 — завершение
- private static final String VAR_PATH = "path"; // "DARK" (бой) или "LIGHT" (очищение)
-
- public Q10031_OrutoLegacy()
- {
- super(10031); // ID квеста
-
- // Регистрация стартового NPC и обработчиков
- addStartNpc(SHAMAN_DRUKKAR);
- addTalkId(SHAMAN_DRUKKAR, ORUTO_BOSS);
-
- // Если босс убивается — слушаем событие убийства
- addKillId(ORUTO_BOSS);
-
- // Ограничения по уровню
- addCondMinLevel(MIN_LEVEL, "30977-minlevel.htm");
- }
-
- @Override
- public String onAdvEvent(String event, Npc npc, Player player)
- {
- final QuestState qs = getQuestState(player, true);
- if (qs == null)
- {
- return null;
- }
-
- String html = null;
-
- switch (event)
- {
- // ===== Шаг 1: Принять задание у Друккара =====
- case "acceptQuest":
- {
- if (qs.isCreated())
- {
- qs.startQuest(); // state: STARTED, cond=1
- playSound(player, QuestSound.ITEMSOUND_QUEST_ACCEPT);
- html = "30977-accepted.htm";
- }
- break;
- }
-
- // ===== Выбор: Бой с Оруто (Тьма) =====
- case "killBoss":
- {
- if (qs.isStarted() && qs.getCond() == 1)
- {
- qs.setCond(2, true); // Пошли в ветку боя
- qs.set(VAR_PATH, "DARK");
- html = "27164-fight.htm";
- }
- break;
- }
-
- // ===== Выбор: Очищение души (Свет) =====
- case "purifySoul":
- {
- if (qs.isStarted() && qs.getCond() == 1)
- {
- qs.setCond(4, true);
- qs.set(VAR_PATH, "LIGHT");
-
- // Здесь включаем «очищение»: даём предмет и фиксируем выбор
- if (!hasQuestItems(player, MEMORY_ORUTO))
- {
- giveItems(player, MEMORY_ORUTO, 1);
- }
-
- // Сигналим в АСТРУ: -1 очко Света с игрока, +1 в глобальный «Очищение» (пример)
- callAstraBalance(player, "LIGHT", +1, "OrutoPurified");
-
- html = "27164-purified.htm";
- }
- break;
- }
-
- // ===== Завершить квест у Друккара =====
- case "finishQuest":
- {
- if (qs.isStarted())
- {
- // Путь Тьмы: предмет выдадим после убийства; Путь Света: предмет уже выдан
- if (qs.getCond() >= 3 || qs.getCond() == 4 || qs.getCond() == 5)
- {
- // Общая награда
- addExpAndSp(player, 2_500_000, 0);
- giveAdena(player, 500_000, true);
-
- qs.exitQuest(false, true);
- html = "30977-finish.htm";
- }
- }
- break;
- }
- }
- return html;
- }
-
- @Override
- public String onTalk(Npc npc, Player player)
- {
- final QuestState qs = getQuestState(player, true);
- if (qs == null)
- {
- return getNoQuestMsg(player);
- }
-
- String html = null;
-
- switch (npc.getId())
- {
- case SHAMAN_DRUKKAR:
- {
- if (qs.isCreated())
- {
- html = "30977-1.htm"; // Пролог и кнопка «acceptQuest»
- }
- else if (qs.isStarted())
- {
- if (qs.getCond() == 1)
- {
- html = "30977-progress.htm"; // Подсказка: иди к Разлому/к Оруто
- }
- else if (qs.getCond() == 2)
- {
- html = "30977-dark-wait.htm"; // Напоминание: победить Оруто
- }
- else if (qs.getCond() == 3 || qs.getCond() == 4 || qs.getCond() == 5)
- {
- html = "30977-2.htm"; // Кнопка «finishQuest»
- }
- }
- else
- {
- html = "30977-complete.htm"; // Уже завершали
- }
- break;
- }
-
- case ORUTO_BOSS:
- {
- // Взаимодействуем с самим Вождём (диалог-развилка)
- if (qs.isStarted() && qs.getCond() == 1)
- {
- html = "27164-1.htm"; // Кнопки: killBoss / purifySoul
- }
- else if (qs.isStarted() && qs.getCond() == 2)
- {
- html = "27164-fight.htm"; // Уже выбрали бой
- }
- else if (qs.isStarted() && (qs.getCond() == 4 || qs.getCond() == 5))
- {
- html = "27164-purified.htm"; // Уже выбрали очищение
- }
- break;
- }
- }
- return html;
- }
-
- @Override
- public String onKill(Npc npc, Player killer, boolean isSummon)
- {
- final Player player = getRandomPartyMember(killer, 2); // cond=2 — выбрали бой
- if (player == null)
- {
- return super.onKill(npc, killer, isSummon);
- }
-
- final QuestState qs = getQuestState(player, false);
- if ((qs != null) && qs.isStarted() && (qs.getCond() == 2))
- {
- // Выдаём «Осколок Тлена» за убийство и двигаем ветку
- if (!hasQuestItems(player, SHARD_DECAY))
- {
- giveItems(player, SHARD_DECAY, 1);
- }
- qs.setCond(3, true); // Босс повержен
-
- // Сигналим в АСТРУ: рост Тьмы
- callAstraBalance(player, "DARK", +1, "OrutoSlain");
- }
- return super.onKill(npc, killer, isSummon);
- }
-
- // ===== Безопасный вызов подсистемы АСТРЫ (если есть в твоём билде) =====
- private void callAstraBalance(Player player, String faction, int delta, String reason)
- {
- try
- {
- // Пример интеграции (адаптируй под свои классы):
- // org.elmorion.astra.AstraBalanceManager.updateFaction(faction, delta);
- // org.elmorion.astra.AstraMemory.log(player, "Q10031", reason, faction, delta);
-
- // Для Essence без АСТРЫ это просто заглушка:
- if (player != null && faction != null && reason != null)
- {
- // no-op
- }
- }
- catch (Exception ignored)
- {
- // Никаких падений сервера из-за отсутствующей АСТРЫ.
- }
- }
- }
Скопировать код HTML-файлы (в папку data/scripts/quests/Q10031_OrutoLegacy/)1) 30977-1.htm (пролог у шамана)
<html><body>Шаман Друккар:<br>Ты чувствуешь, как земля дрожит? Древний дух <font color="LEVEL">Карул Оруто</font> шевельнулся в Разломе.<br>Когда-то он был вождём орков, но принял силу Тьмы, пытаясь спасти свой клан — и пал.<br><br>Если хочешь понять, куда качнётся мир Эльмориона — иди. Астра запомнит твой выбор.<br><br><Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10031_OrutoLegacy acceptQuest">Отправиться к Разлому</Button></body></html>
2) 30977-progress.htm (напоминание)
<html><body>Шаман Друккар:<br>Разлом шепчет имя Оруто. Иди туда, где камни пропитаны кровью. Выбор ждёт тебя.<br></body></html>
3) 30977-dark-wait.htm (выбрали бой, ещё не убили)
<html><body>Шаман Друккар:<br>Раз уж выбрал путь стали — доведи дело до конца. Победи <font color="LEVEL">Карула Оруто</font>!<br></body></html>
4) 30977-2.htm (финал — кнопка завершить)
<html><body>Шаман Друккар:<br>Судьба Оруто решена. Я слышу, как Астра заносит это в летопись мира...<br><br><Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10031_OrutoLegacy finishQuest">Завершить «Наследие Оруто»</Button></body></html>
5) 30977-finish.htm (успешное завершение)
<html><body>Шаман Друккар:<br>Хорошая работа. Помни: каждый выбор изменяет равновесие.<br>Пусть Астра будет благосклонна к твоей дороге.<br></body></html>
6) 30977-minlevel.htm (если ниже уровня)
<html><body>Шаман Друккар:<br>Твоя сила ещё не готова к шёпоту Разлома. Возвращайся после <font color="LEVEL">55-го уровня</font>.<br></body></html>
7) 30977-complete.htm (уже проходили)
<html><body>Шаман Друккар:<br>Мы уже помним твой выбор. Иди своей дорогой, путник.<br></body></html>
8) 27164-1.htm (диалог-развилка с Оруто)
<html><body>Вождь Карул Оруто:<br>Ты… живой. А я — память, скованная плотью. Богам нужен был страж, и они сделали его из меня.<br><br>Чего ты ищешь — моего падения или моего освобождения?<br><br><Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10031_OrutoLegacy killBoss">Сразиться с Вождём</Button><br><Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q10031_OrutoLegacy purifySoul">Очищение души</Button></body></html>
9) 27164-fight.htm (ветка боя)
<html><body>Вождь Карул Оруто:<br>Пусть сталь говорит за нас. Покажи, чего стоит твой выбор!<br></body></html>
10) 27164-purified.htm (ветка очищения)
<html><body>Вождь Карул Оруто:<br>Твоё пламя… жжёт Тьму. Я помню свет — и благодарен. Возьми эту <font color="LEVEL">Память Оруто</font>...<br>И дай знать шаману: моя песня завершилась.<br></body></html>
Где положить файлыРегистрация (если требуется в твоём билде): добавь Q10031_OrutoLegacy в scripts.cfg или убедись, что автозагрузка скриптов включена. Быстрые примечания по интеграцииСпавн/локация Оруто: можешь оставить как «квестовый монстр» в существующей локации Долины Орков / Руинах Кузни. Если он уже есть в мире — всё ок. Предметы 200014/200040: если их ещё нет в твоих itemname-ru.dat/itemdesc-ru.txt/EtcItemgrp*, просто добавь записи (у тебя уже есть шаблоны для осколков/памяти). АСТРА (BB): замени внутри callAstraBalance(...) на свои реальные классы/методы. Сейчас это безопасная заглушка. Баланс/награды: EXP/Adena подгони под экономику сборки. Фракционные счётчики: если используешь глобальные переменные (SQL/Holder), добавь там обработку событий OrutoSlain и OrutoPurified.
|