/**
* Используется для однодневных квестов<br>
* Завершает квест и даляет все предметы и переменные, связанные с ним<br>
* Если необходимо оставить какую-то переменную в квесте, то необходимо выставить ее значение заново после вызова этого метода
*
* @param quest - завершаемый квест
*/
public void exitQuest(Quest quest)
{
exitQuest(quest, Quest.SOUND_FINISH, CommonSkill.QUEST_DONE.getSkill());
}
/**
* Используется для однодневных квестов<br>
* Завершает квест и даляет все предметы и переменные, связанные с ним<br>
* Если необходимо оставить какую-то переменную в квесте, то необходимо выставить ее значение заново после вызова этого метода
*
* @param quest - завершаемый квест
* @param sound - звук, который необходимо воспроизвести
* @param skill - скилл, анимацию каста которого необходимо показать
*/
public void exitQuest(Quest quest, String sound, Skill skill)
{
Player player = getPlayer();
exitQuest(true, sound, skill, false);
QuestState qs = quest.newQuestStateAndNotSave(player, QuestStateType.DELAYED);
qs.setResetTime();
QuestDAO.getInstance().updateQuest(qs);
}
/**
* Завершает квест и даляет все предметы и переменные, связанные с ним<br>
* Если необходимо оставить какую-то переменную в квесте, то необходимо выставить ее значение заново после вызова этого метода
*
* @param repeatable - повторяемый или нет квест
*/
public QuestState exitQuest(boolean repeatable)
{
return exitQuest(repeatable, Quest.SOUND_FINISH, CommonSkill.QUEST_DONE.getSkill(), false);
}
/**
* Завершает квест и даляет все предметы и переменные, связанные с ним<br>
* Если необходимо оставить какую-то переменную в квесте, то необходимо выставить ее значение заново после вызова этого метода
*
* @param repeatable - повторяемый или нет квест
* @param sound - звук, который необходимо воспроизвести
* @param skill - скилл, анимацию каста которого необходимо показать
*/
public QuestState exitQuest(boolean repeatable, String sound, Skill skill)
{
return exitQuest(repeatable, sound, skill, false);
}
/**
* Завершает квест и даляет все предметы и переменные, связанные с ним<br>
* Если необходимо оставить какую-то переменную в квесте, то необходимо выставить ее значение заново после вызова этого метода
*
* @param repeatable - повторяемый или нет квест
* @param sound - звук, который необходимо воспроизвести
* @param skill - скилл, анимацию каста которого необходимо показать
* @param aborted - если true, то квест был завершен через запрос его отмены
*/
public QuestState exitQuest(boolean repeatable, String sound, Skill skill, boolean aborted)
{
Player player = getPlayer();
if (player == null)
return this;
ItemInstance item = null;
for (int itemId : _quest.getQuestItems())
{
if (itemId == CommonItem.ADENA.getId())
continue;
item = player.getInventory().getItemById(itemId);
if (item == null)
continue;
player.getInventory().destroyItemById(itemId, item.getCount());
}
if (repeatable)
{
player.getQuests().removeState(_questId);
QuestDAO.getInstance().deleteQuest(this);
_vars.clear();
}
else
{
_vars.keySet().stream().filter(var -> var != null).forEach(var -> unset(var));
setState(QuestStateType.COMPLETED);
QuestDAO.getInstance().updateQuest(this); // FIXME: оно вроде не нужно?
}
player.getListeners().onEndQuest(_quest, repeatable, aborted);
player.sendPacket(new QuestList(player));
if (sound != null)
Quest.playSound(player, sound);
if (skill != null)
player.broadcastPacket(new MagicSkillUse(player, skill));
return this;
}
public void abortQuest(Player player)
{
_quest.onAbort(player, this);
exitQuest(true, null, null, true);
}