Дано: Cборка - AionGer rev.353 Квест - 18737 Клиент - 4.9 с торрентов Проблема в выдаче ошибки "Load fail!" при попытке взять квест. Не первый раз встречаю подобные ошибки, в скриптованых квестах решаются просто. Но как решать такую проблему в квесте типа "Сходить поболтать" ?
есть определенная структура HTML кусков в "QUEST_Qxxxxxx.html", где xxxxxx - номер квеста. Например первый html должен иметь Код: <HtmlPage name="select1"> (id 1011) - эту страницу AION и не находит и выдает ошибку, т.к. в QUEST_Q18737.html первая страница имеет Код: <HtmlPage name="select_none" accept="true"> (id 4762) Я поборолся с этим написав java файл ... \AL-Game\data\scripts\system\handlers\quest\raksang_ruins\_18737RumoursAboutTheBeritraArmy.java Код: /** * This file is part of Aion-Lightning <aion-lightning.org>. * * Aion-Lightning is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Aion-Lightning is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Aion-Lightning. * If not, see <http://www.gnu.org/licenses/>. */ package quest.raksang_ruins; import com.aionemu.gameserver.model.gameobjects.player.Player; import com.aionemu.gameserver.questEngine.handlers.QuestHandler; import com.aionemu.gameserver.model.DialogAction; import com.aionemu.gameserver.questEngine.model.QuestEnv; import com.aionemu.gameserver.questEngine.model.QuestState; import com.aionemu.gameserver.questEngine.model.QuestStatus; import com.aionemu.gameserver.utils.PacketSendUtility; /** * @author pandim */ public class _18737RumoursAboutTheBeritraArmy extends QuestHandler { public static final int questId = 18737; public _18737RumoursAboutTheBeritraArmy() { super(questId); } @Override public void register() { qe.registerQuestNpc(804707).addOnQuestStart(questId); qe.registerQuestNpc(804707).addOnTalkEvent(questId); qe.registerQuestNpc(206378).addOnTalkEvent(questId); qe.registerQuestNpc(206379).addOnTalkEvent(questId); qe.registerQuestNpc(206380).addOnTalkEvent(questId); } @Override public boolean onDialogEvent(QuestEnv env) { Player player = env.getPlayer(); QuestState qs = player.getQuestStateList().getQuestState(questId); DialogAction dialog = env.getDialog(); int targetId = env.getTargetId(); if (qs == null || qs.getStatus() == QuestStatus.NONE) { if (targetId == 804707) { if (dialog == DialogAction.QUEST_SELECT) { return sendQuestDialog(env, 4762); } else { return sendQuestStartDialog(env); } } } else if (qs.getStatus() == QuestStatus.START) { if (targetId == 206378 || targetId == 206379 || targetId == 206380) { if (dialog == DialogAction.QUEST_SELECT) { return sendQuestDialog(env, 10002); } else if (dialog == DialogAction.SELECT_QUEST_REWARD) { qs.setStatus(QuestStatus.REWARD); return sendQuestDialog(env, 5); } return false; } } else if (qs.getStatus() == QuestStatus.REWARD) { if (targetId == 206378 || targetId == 206379 || targetId == 206380) { return sendQuestEndDialog(env); } } return false; } } и закомментировал в ... \AL-Game\data\static_data\quest_script_data\raksang_ruins.xml Код: <!-- REPORTING QUESTS --> <!--<report_to id="18737" start_npc_ids="804707" end_npc_ids="804716"/>--> Всё работает - принимаю критику!
Дмитрий , а что критиковать ?) . Единственное , java скрипт квеста это конечно хорошо и почти всегда это правильный подход , но иногда достаточно просто поправить в quest_script_data и quest_data . questEngine AL (QuestEnv) очень удобен , вам бы поработать с движком на QuestCookie пример Please login or register to view links заодно можешь и геодвиг посмотреть в этой сборке .Просто у многих разработчики не видели ничего кроме движка AL , и по этому говорят что всё легко ...
вот я и жду, чтоб кто-нибудь ткнул носом, сам не смог хоть и написал и работает, но есть ощущение, что коряво написал (особенно с sendQuestEndDialog())! Первый мой написанный квест для AION!
Подкорректированный вариант: Код: <report_to_many id="18737" start_npc_ids="804707" start_dialog_id="4762" end_npc_ids="206378 206379 206380" end_dialog_id="5"> <npc_infos npc_id="206378" var="0" quest_dialog="10002" close_dialog="1009"/> <npc_infos npc_id="206379" var="0" quest_dialog="10002" close_dialog="1009"/> <npc_infos npc_id="206380" var="0" quest_dialog="10002" close_dialog="1009"/> </report_to_many> Вставил "end_dialog_id" и трёх NPC, завершающих квест. (Там 3 ветки прохождения инста, выбираемых случайно и в каждой версии свой NPC-телепорт со своим id.)
И для тёмных: Код: <report_to_many id="28737" start_npc_ids="804732" start_dialog_id="4762" end_npc_ids="206395 206396 206397" end_dialog_id="5"> <npc_infos npc_id="206395" var="0" quest_dialog="10002" close_dialog="1009"/> <npc_infos npc_id="206396" var="0" quest_dialog="10002" close_dialog="1009"/> <npc_infos npc_id="206397" var="0" quest_dialog="10002" close_dialog="1009"/> </report_to_many>
При генерации квеста есть случайно выбираемые три фазы: Код: @Override public void onInstanceCreate(WorldMapInstance instance) { doors = instance.getDoors(); stageNum = Rnd.get(1, 3); super.onInstanceCreate(instance); spawnRings(); } а потом ставится ОДИН ИЗ ТРЁХ NPC Код: @Override public void onEnterInstance(Player player) { // Elyos Npc's // 206378 lvl1 // 206379 lvl2 // 206380 lvl3 // Asmo Npc's // 206395 lvl1 // 206396 lvl2 // 206397 lvl3 switch (player.getRace()){ case ASMODIANS: switch (stageNum){ case 1: spawn(206395, 818.103f, 931.0215f, 1207.4312f, (byte) 13); break; case 2: spawn(206396, 818.103f, 931.0215f, 1207.4312f, (byte) 13); break; case 3: spawn(206397, 818.103f, 931.0215f, 1207.4312f, (byte) 13); break; } break; case ELYOS: switch (stageNum){ case 1: spawn(206378, 818.103f, 931.0215f, 1207.4312f, (byte) 13); break; case 2: spawn(206379, 818.103f, 931.0215f, 1207.4312f, (byte) 13); break; case 3: spawn(206380, 818.103f, 931.0215f, 1207.4312f, (byte) 13); break; } break; default: break; } } Которые портируют в 3 разных части инста! А теперь, вопрос! Кто копался: инст для одного перса, похоже, создаётся при первом входе, а вот когда он удаляется? При выходе или по времени?
Ну вот смотришь разные сборки и хренеешь: вроде база одна, а потом каждый по своему, а потом своровали и опять каждый по своему, своровали и опять каждый о своем! И в каждой сборке куча мелких ошибок (или фич? ) и попробуй разобраться. Я вот не понимаю: геры и коры делают одно и то-же на одной базе и стремятся к идеалу (OFF) и подворовывают друг у друга(хотя-бы идеи). Ну вот объединились-бы и работа пошла в двое быстрее! Но нет! Кстати, ни те, ни другие не пользуются в 4.9 обфускатором! И за это спасибо! А конкретно по этому подземелью: если судить по базам данных, то так и задумывалось: три пути - три нпс, плюс есть ещё один с такимже именем и местоположением и вот он зачем вообще неясно!
А как сделано? Вроде телепорт делается на конкретное место? Как я понимаю, два варианта: или делать AI этого НПС или заплатку на телепорты для данного НПС. Romanz: подскажешь?