/*
* This file is part of aion-unique <aion-unique.org>.
*
* aion-unique 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-unique 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-unique. If not, see <http://www.gnu.org/licenses/>.
*/
package com.aionemu.gameserver.questEngine;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javolution.util.FastMap;
import org.apache.log4j.Logger;
import com.aionemu.commons.scripting.scriptmanager.ScriptManager;
import com.aionemu.gameserver.GameServerError;
import com.aionemu.gameserver.dataholders.QuestScriptsData;
import com.aionemu.gameserver.dataholders.QuestsData;
import com.aionemu.gameserver.model.gameobjects.Item;
import com.aionemu.gameserver.model.gameobjects.Npc;
import com.aionemu.gameserver.model.gameobjects.player.Player;
import com.aionemu.gameserver.model.templates.QuestTemplate;
import com.aionemu.gameserver.model.templates.quest.NpcQuestData;
import com.aionemu.gameserver.model.templates.quest.QuestDrop;
import com.aionemu.gameserver.model.templates.quest.QuestItems;
import com.aionemu.gameserver.model.templates.quest.QuestWorkItems;
import com.aionemu.gameserver.questEngine.handlers.QuestHandler;
import com.aionemu.gameserver.questEngine.handlers.QuestHandlerLoader;
import com.aionemu.gameserver.questEngine.handlers.models.QuestScriptData;
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.world.zone.ZoneName;
import com.google.inject.Inject;
import com.google.inject.Injector;
/**
* @author MrPoke
*
*/
public class QuestEngine
{
private Injector injector;
private static final Logger log = Logger.getLogger(QuestEngine.class);
private static final FastMap<Integer, QuestHandler> questHandlers = new FastMap<Integer, QuestHandler>();
private static ScriptManager scriptManager = new ScriptManager();
public static final File QUEST_DESCRIPTOR_FILE = new File(
"./data/scripts/system/quest_handlers.xml");
@Inject
private QuestsData questData;
@Inject
private QuestScriptsData questScriptsData;
private FastMap<Integer, NpcQuestData> _npcQuestData = new FastMap<Integer, NpcQuestData>();
private FastMap<Integer, List<Integer>> _questItemIds= new FastMap<Integer, List<Integer>>();
private List<Integer> _questLvlUp = new ArrayList<Integer>();
private FastMap<ZoneName, List<Integer>> _questEnterZone= new FastMap<ZoneName, List<Integer>>();
private FastMap<Integer, List<Integer>> _questMovieEndIds= new FastMap<Integer, List<Integer>>();
private List<Integer> _questOnDie= new ArrayList<Integer>();
private List<Integer> _questOnEnterWorld= new ArrayList<Integer>();
private FastMap<Integer, List<QuestDrop>> _questDrop= new FastMap<Integer, List<QuestDrop>>();
public void load()
{
for (QuestTemplate data : questData.getQuestsData())
{
for (QuestDrop drop : data.getQuestDrop())
{
drop.setQuestId(data.getId());
setQuestDrop(drop.getNpcId()).add(drop);
}
}
scriptManager = new ScriptManager();
scriptManager.setGlobalClassListener(new QuestHandlerLoader(injector));
try
{
scriptManager.load(QUEST_DESCRIPTOR_FILE);
}
catch (Exception e)
{
throw new GameServerError("Can't initialize quest handlers.", e);
}
for (QuestScriptData data : questScriptsData.getData())
{
data.register(this);
}
log.info("Loaded " + questHandlers.size() + " quest handler.");
}
public void shutdown()
{
scriptManager.shutdown();
clear();
scriptManager = null;
log.info("Quests are shutdown...");
}
public boolean onDialog(QuestEnv env)
{
QuestHandler questHandler = null;
if(env.getQuestId() != 0)
{
questHandler = getQuestHandlerByQuestId(env.getQuestId());
if(questHandler != null)
if(questHandler.onDialogEvent(env))
return true;
}
else
{
Npc npc = (Npc) env.getVisibleObject();
for(int questId : getNpcQuestData(npc == null ? 0 : npc.getNpcId()).getOnTalkEvent())
{
questHandler = getQuestHandlerByQuestId(questId);
if(questHandler != null)
if(questHandler.onDialogEvent(env))
return true;
}
}
return false;
}
public boolean onKill(QuestEnv env)
{
Npc npc = (Npc) env.getVisibleObject();
for(int questId : getNpcQuestData(npc.getNpcId()).getOnKillEvent())
{
QuestHandler questHandler = getQuestHandlerByQuestId(questId);
if(questHandler != null)
if(questHandler.onKillEvent(env))
return true;
}
return false;
}
public boolean onAttack(QuestEnv env)
{
Npc npc = (Npc) env.getVisibleObject();
for(int questId : getNpcQuestData(npc.getNpcId()).getOnAttackEvent())
{
QuestHandler questHandler = getQuestHandlerByQuestId(questId);
if(questHandler != null)
if(questHandler.onAttackEvent(env))
return true;
}
return false;
}
public void onLvlUp(QuestEnv env)
{
for(int questId : _questLvlUp)
{
QuestHandler questHandler = getQuestHandlerByQuestId(questId);
if(questHandler != null)
questHandler.onLvlUpEvent(env);
}
}
public void onDie(QuestEnv env)
{
for(int questId : _questOnDie)
{
QuestHandler questHandler = getQuestHandlerByQuestId(questId);
if(questHandler != null)
questHandler.onDieEvent(env);
}
}
public void onEnterWorld(QuestEnv env)
{
for(int questId : _questOnEnterWorld)
{
QuestHandler questHandler = getQuestHandlerByQuestId(questId);
if(questHandler != null)
questHandler.onEnterWorldEvent(env);
}
}
public boolean onItemUseEvent(QuestEnv env, Item item)
{
for(int questId : getQuestItemIds(item.getItemTemplate().getTemplateId()))
{
QuestHandler questHandler = getQuestHandlerByQuestId(questId);
if(questHandler != null)
if(questHandler.onItemUseEvent(env, item))
return true;
}
return false;
}
public boolean onEnterZone(QuestEnv env, ZoneName zoneName)
{
for(int questId : getQuestEnterZone(zoneName))
{
QuestHandler questHandler = getQuestHandlerByQuestId(questId);
if(questHandler != null)
if(questHandler.onEnterZoneEvent(env, zoneName))
return true;
}
return false;
}
public boolean onMovieEnd(QuestEnv env, int movieId)
{
for(int questId : getQuestMovieEndIds(movieId))
{
env.setQuestId(questId);
QuestHandler questHandler = getQuestHandlerByQuestId(env.getQuestId());
if(questHandler != null)
if(questHandler.onMovieEndEvent(env, movieId))
return true;
}
return false;
}
public boolean deleteQuest(Player player, int questId)
{
if(questData.getQuestById(questId).isCannotGiveup())
return false;
QuestState qs = player.getQuestStateList().getQuestState(questId);
if(qs == null)
return false;
qs.setStatus(QuestStatus.NONE);
//remove all worker list item if abandoned
QuestWorkItems qwi = questData.getQuestById(questId).getQuestWorkItems();
if(qwi != null)
{
int count = 0;
for(QuestItems qi : qwi.getQuestWorkItem())
{
if(qi != null)
{
count = player.getInventory().getItemCountByItemId(qi.getItemId());
if(count > 0)
player.getInventory().removeFromBagByItemId(qi.getItemId(), count);
}
}
}
return true;
}
public NpcQuestData getNpcQuestData(int npcTemplateId)
{
if(_npcQuestData.containsKey(npcTemplateId))
{
return _npcQuestData.get(npcTemplateId);
}
return new NpcQuestData();
}
public NpcQuestData setNpcQuestData(int npcTemplateId)
{
if(!_npcQuestData.containsKey(npcTemplateId))
{
_npcQuestData.put(npcTemplateId, new NpcQuestData());
}
return _npcQuestData.get(npcTemplateId);
}
public List<Integer> getQuestItemIds(int itemId)
{
if(_questItemIds.containsKey(itemId))
{
return _questItemIds.get(itemId);
}
return new ArrayList<Integer>();
}
public List<Integer> setQuestItemIds(int itemId)
{
if(!_questItemIds.containsKey(itemId))
{
_questItemIds.put(itemId, new ArrayList<Integer>());
}
return _questItemIds.get(itemId);
}
public List<QuestDrop> setQuestDrop(int npcId)
{
if(!_questDrop.containsKey(npcId))
{
_questDrop.put(npcId, new ArrayList<QuestDrop>());
}
return _questDrop.get(npcId);
}
public List<QuestDrop> getQuestDrop(int npcId)
{
if(_questDrop.containsKey(npcId))
{
return _questDrop.get(npcId);
}
return new ArrayList<QuestDrop>();
}
public void addQuestLvlUp(int questId)
{
if(!_questLvlUp.contains(questId))
_questLvlUp.add(questId);
}
public void addOnEnterWorld(int questId)
{
if(!_questOnEnterWorld.contains(questId))
_questOnEnterWorld.add(questId);
}
public void addOnDie(int questId)
{
if(!_questOnDie.contains(questId))
_questOnDie.add(questId);
}
public List<Integer> getQuestEnterZone(ZoneName zoneName)
{
if(_questEnterZone.containsKey(zoneName))
{
return _questEnterZone.get(zoneName);
}
return new ArrayList<Integer>();
}
public List<Integer> setQuestEnterZone(ZoneName zoneName)
{
if(!_questEnterZone.containsKey(zoneName))
{
_questEnterZone.put(zoneName, new ArrayList<Integer>());
}
return _questEnterZone.get(zoneName);
}
public List<Integer> getQuestMovieEndIds(int moveId)
{
if(_questMovieEndIds.containsKey(moveId))
{
return _questMovieEndIds.get(moveId);
}
return new ArrayList<Integer>();
}
public List<Integer> setQuestMovieEndIds(int moveId)
{
if(!_questMovieEndIds.containsKey(moveId))
{
_questMovieEndIds.put(moveId, new ArrayList<Integer>());
}
return _questMovieEndIds.get(moveId);
}
public void clear()
{
_npcQuestData.clear();
_questItemIds.clear();
_questLvlUp.clear();
_questOnEnterWorld.clear();
_questOnDie.clear();
_questEnterZone.clear();
_questMovieEndIds.clear();
_questDrop.clear();
questHandlers.clear();
}
public void addQuestHandler (QuestHandler questHandler)
{
injector.injectMembers(questHandler);
questHandler.register();
questHandlers.put(questHandler.getQuestId(), questHandler);
}
public QuestHandler getQuestHandlerByQuestId(int questId)
{
return questHandlers.get(questId);
}
public int getSize()
{
return questHandlers.size();
}
/**
* @param injector the injector to set
*/
public void setInjector(Injector injector)
{
this.injector = injector;
}
}