/* * Copyright (C) 2004-2014 L2J DataPack * * This file is part of L2J DataPack. * * L2J DataPack 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. * * L2J DataPack 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 this program. If not, see . */ package handlers.admincommandhandlers; import java.io.File; import java.util.List; import java.util.Set; import java.util.TreeSet; import javax.script.ScriptException; import com.l2jserver.gameserver.handler.IAdminCommandHandler; import com.l2jserver.gameserver.instancemanager.QuestManager; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.events.EventType; import com.l2jserver.gameserver.model.events.ListenerRegisterType; import com.l2jserver.gameserver.model.events.listeners.AbstractEventListener; import com.l2jserver.gameserver.model.quest.Quest; import com.l2jserver.gameserver.model.quest.QuestTimer; import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage; import com.l2jserver.gameserver.scripting.L2ScriptEngineManager; import com.l2jserver.gameserver.util.Util; public class AdminQuest implements IAdminCommandHandler { private static final String[] ADMIN_COMMANDS = { "admin_quest_reload", "admin_script_load", "admin_script_unload", "admin_show_quests", "admin_quest_info" }; @Override public boolean useAdminCommand(String command, L2PcInstance activeChar) { if (activeChar == null) { return false; } // syntax will either be: // //quest_reload // //quest_reload // The questName MUST start with a non-numeric character for this to work, // regardless which of the two formats is used. // Example: //quest_reload orc_occupation_change_1 // Example: //quest_reload chests // Example: //quest_reload SagasSuperclass // Example: //quest_reload 12 if (command.startsWith("admin_quest_reload")) { String[] parts = command.split(" "); if (parts.length < 2) { activeChar.sendMessage("Usage: //quest_reload ..questName> or //quest_reload "); } else { // try the first param as id try { int questId = Integer.parseInt(parts[1]); if (QuestManager.getInstance().reload(questId)) { activeChar.sendMessage("Quest Reloaded Successfully."); } else { activeChar.sendMessage("Quest Reloaded Failed"); } } catch (NumberFormatException e) { if (QuestManager.getInstance().reload(parts[1])) { activeChar.sendMessage("Quest Reloaded Successfully."); } else { activeChar.sendMessage("Quest Reloaded Failed"); } } } } // script load should NOT be used in place of reload. If a script is already loaded // successfully, quest_reload ought to be used. The script_load command should only // be used for scripts that failed to load altogether (eg. due to errors) or that // did not at all exist during server boot. Using script_load to re-load a previously // loaded script may cause unpredictable script flow, minor loss of data, and more. // This provides a way to load new scripts without having to reboot the server. else if (command.startsWith("admin_script_load")) { String[] parts = command.split(" "); if (parts.length < 2) { // activeChar.sendMessage("Example: //script_load //. "); activeChar.sendMessage("Example: //script_load quests/SagasSuperclass/__init__.py"); } else { File file = new File(L2ScriptEngineManager.SCRIPT_FOLDER, parts[1]); // Trying to reload by script name. if (!file.exists()) { Quest quest = QuestManager.getInstance().getQuest(parts[1]); if (quest != null) { file = new File(L2ScriptEngineManager.SCRIPT_FOLDER, quest.getClass().getName().replaceAll("\\.", "/") + ".java"); } } // Reloading by full path if (file.isFile()) { try { L2ScriptEngineManager.getInstance().executeScript(file); // This part should be called only when the script is successfully loaded. activeChar.sendMessage("Script Successfully Loaded."); } catch (ScriptException e) { activeChar.sendMessage("Failed loading: " + parts[1]); L2ScriptEngineManager.getInstance().reportScriptFileError(file, e); } catch (Exception e) { activeChar.sendMessage("Failed loading: " + parts[1]); } } else { activeChar.sendMessage("File Not Found: " + parts[1]); } } } else if (command.startsWith("admin_script_unload")) { String[] parts = command.split(" "); if (parts.length < 2) { activeChar.sendMessage("Example: //script_unload questName/questId"); } else { Quest q = Util.isDigit(parts[1]) ? QuestManager.getInstance().getQuest(Integer.parseInt(parts[1])) : QuestManager.getInstance().getQuest(parts[1]); if (q != null) { if (q.unload()) { activeChar.sendMessage("Script Successfully Unloaded [" + q.getName() + "/" + q.getId() + "]"); } else { activeChar.sendMessage("Failed unloading [" + q.getName() + "/" + q.getId() + "]."); } } else { activeChar.sendMessage("The quest [" + parts[1] + "] was not found!."); } } } else if (command.startsWith("admin_show_quests")) { if (activeChar.getTarget() == null) { activeChar.sendMessage("Get a target first."); } else if (!activeChar.getTarget().isCharacter()) { activeChar.sendMessage("Invalid Target."); } else { final L2Character character = (L2Character) activeChar.getTarget(); final StringBuilder sb = new StringBuilder(); final Set questNames = new TreeSet<>(); for (EventType type : EventType.values()) { for (AbstractEventListener listener : character.getListeners(type)) { if (listener.getOwner() instanceof Quest) { final Quest quest = (Quest) listener.getOwner(); if (questNames.contains(quest.getName())) { continue; } sb.append("" + quest.getName() + ""); questNames.add(quest.getName()); } } } final NpcHtmlMessage msg = new NpcHtmlMessage(0, 1); msg.setFile(activeChar.getHtmlPrefix(), "data/html/admin/npc-quests.htm"); msg.replace("%quests%", sb.toString()); msg.replace("%objid%", character.getObjectId()); msg.replace("%questName%", ""); activeChar.sendPacket(msg); } } else if (command.startsWith("admin_quest_info ")) { final String questName = command.substring("admin_quest_info ".length()); final Quest quest = QuestManager.getInstance().getQuest(questName); String events = "", npcs = "", items = "", timers = ""; int counter = 0; if (quest == null) { activeChar.sendMessage("Couldn't find quest or script with name " + questName + " !"); return false; } final Set listenerTypes = new TreeSet<>(); for (AbstractEventListener listener : quest.getListeners()) { if (!listenerTypes.contains(listener.getType())) { events += ", " + listener.getType().name(); listenerTypes.add(listener.getType()); counter++; } if (counter > 10) { counter = 0; break; } } final Set npcIds = new TreeSet<>(quest.getRegisteredIds(ListenerRegisterType.NPC)); for (int npcId : npcIds) { npcs += ", " + npcId; counter++; if (counter > 50) { counter = 0; break; } } if (!events.isEmpty()) { events = listenerTypes.size() + ": " + events.substring(2); } if (!npcs.isEmpty()) { npcs = npcIds.size() + ": " + npcs.substring(2); } if (quest.getRegisteredItemIds() != null) { for (int itemId : quest.getRegisteredItemIds()) { items += ", " + itemId; counter++; if (counter > 20) { counter = 0; break; } } items = quest.getRegisteredItemIds().length + ":" + items.substring(2); } for (List list : quest.getQuestTimers().values()) { for (QuestTimer timer : list) { timers += "
" + timer.getName() + ": Active: " + timer.getIsActive() + " Repeatable: " + timer.getIsRepeating() + " Player: " + timer.getPlayer() + " Npc: " + timer.getNpc() + "
"; counter++; if (counter > 10) { break; } } } final StringBuilder sb = new StringBuilder(); sb.append("
ID: " + quest.getId() + "
"); sb.append("
Name: " + quest.getName() + "
"); sb.append("
Descr: " + quest.getDescr() + "
"); sb.append("
Path: " + quest.getClass().getName().substring(0, quest.getClass().getName().lastIndexOf('.')).replaceAll("\\.", "/") + "
"); sb.append("
Events: " + events + "
"); if (!npcs.isEmpty()) { sb.append("
NPCs: " + npcs + "
"); } if (!items.isEmpty()) { sb.append("
Items: " + items + "
"); } if (!timers.isEmpty()) { sb.append("
Timers:
"); sb.append(timers); } final NpcHtmlMessage msg = new NpcHtmlMessage(0, 1); msg.setFile(activeChar.getHtmlPrefix(), "data/html/admin/npc-quests.htm"); msg.replace("%quests%", sb.toString()); msg.replace("%questName%", "
Reload " + quest.getName() + " Unload
"); activeChar.sendPacket(msg); } return true; } @Override public String[] getAdminCommandList() { return ADMIN_COMMANDS; } }