• SiteAnalyzer, технический и SEO-анализ сайтов

Как решать ошибки "load fail" в квестах

Дано:
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 .

 
поправить в quest_script_data и quest_data
вот я и жду, чтоб кто-нибудь ткнул носом, сам не смог

принимаю критику! ;)
хоть и написал и работает, но есть ощущение, что коряво написал (особенно с 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>
 
Дим а зачем ты добавляешь 3 нпс , если в данже только 1 стоит) , вроде ))
 
При генерации квеста есть случайно выбираемые три фазы:
Код:
	@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 разных части инста! :)

А теперь, вопрос! Кто копался: инст для одного перса, похоже, создаётся при первом входе, а вот когда он удаляется? При выходе или по времени?
 
плюшник какой то делал инстант ) у меня 1 стоит и рандомно портует в 3 разных места)
 
Ну вот смотришь разные сборки и хренеешь: вроде база одна, а потом каждый по своему, а потом своровали и опять каждый по своему, своровали и опять каждый о своем! И в каждой сборке куча мелких ошибок (или фич? ) и попробуй разобраться.
Я вот не понимаю: геры и коры делают одно и то-же на одной базе и стремятся к идеалу (OFF) и подворовывают друг у друга(хотя-бы идеи). Ну вот объединились-бы и работа пошла в двое быстрее!
Но нет!
Кстати, ни те, ни другие не пользуются в 4.9 обфускатором! И за это спасибо!

А конкретно по этому подземелью: если судить по базам данных, то так и задумывалось:
три пути - три нпс, плюс есть ещё один с такимже именем и местоположением и вот он зачем
вообще неясно!
 
1 стоит и рандомно портует в 3 разных места)
А как сделано? Вроде телепорт делается на конкретное место?
Как я понимаю, два варианта: или делать AI этого НПС или заплатку на телепорты для данного НПС.
Romanz: подскажешь?
 
аи делаешь для непися , с рандомными точками телепорта
 
Назад
Сверху