/* * Copyright (C) 2004-2014 L2J Server * * This file is part of L2J Server. * * L2J Server 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 Server 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 com.l2jserver.gameserver.datatables; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import com.l2jserver.gameserver.engines.DocumentParser; import com.l2jserver.gameserver.enums.MacroType; import com.l2jserver.gameserver.enums.ShortcutType; import com.l2jserver.gameserver.model.Macro; import com.l2jserver.gameserver.model.MacroCmd; import com.l2jserver.gameserver.model.Shortcut; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.base.ClassId; import com.l2jserver.gameserver.model.items.instance.L2ItemInstance; import com.l2jserver.gameserver.network.serverpackets.ShortCutRegister; /** * This class holds the Initial Shortcuts information.
* What shortcuts get each newly created character. * @author Zoey76 */ public final class InitialShortcutData extends DocumentParser { private final Map> _initialShortcutData = new HashMap<>(); private final List _initialGlobalShortcutList = new ArrayList<>(); private final Map _macroPresets = new HashMap<>(); /** * Instantiates a new initial shortcuts data. */ protected InitialShortcutData() { load(); } @Override public void load() { _initialShortcutData.clear(); _initialGlobalShortcutList.clear(); parseDatapackFile("data/stats/initialShortcuts.xml"); _log.info(getClass().getSimpleName() + ": Loaded " + _initialGlobalShortcutList.size() + " Initial Global Shortcuts data."); _log.info(getClass().getSimpleName() + ": Loaded " + _initialShortcutData.size() + " Initial Shortcuts data."); _log.info(getClass().getSimpleName() + ": Loaded " + _macroPresets.size() + " Macros presets."); } @Override protected void parseDocument() { for (Node n = getCurrentDocument().getFirstChild(); n != null; n = n.getNextSibling()) { if ("list".equals(n.getNodeName())) { for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling()) { switch (d.getNodeName()) { case "shortcuts": { parseShortcuts(d); break; } case "macros": { parseMacros(d); break; } } } } } } /** * Parses a shortcut. * @param d the node */ private void parseShortcuts(Node d) { NamedNodeMap attrs = d.getAttributes(); final Node classIdNode = attrs.getNamedItem("classId"); final List list = new ArrayList<>(); for (Node c = d.getFirstChild(); c != null; c = c.getNextSibling()) { if ("page".equals(c.getNodeName())) { attrs = c.getAttributes(); final int pageId = parseInteger(attrs, "pageId"); for (Node b = c.getFirstChild(); b != null; b = b.getNextSibling()) { if ("slot".equals(b.getNodeName())) { list.add(createShortcut(pageId, b)); } } } } if (classIdNode != null) { _initialShortcutData.put(ClassId.getClassId(Integer.parseInt(classIdNode.getNodeValue())), list); } else { _initialGlobalShortcutList.addAll(list); } } /** * Parses a macro. * @param d the node */ private void parseMacros(Node d) { for (Node c = d.getFirstChild(); c != null; c = c.getNextSibling()) { if ("macro".equals(c.getNodeName())) { NamedNodeMap attrs = c.getAttributes(); final int macroId = parseInteger(attrs, "macroId"); final int icon = parseInteger(attrs, "icon"); final String name = parseString(attrs, "name"); final String description = parseString(attrs, "description"); final String acronym = parseString(attrs, "acronym"); final List commands = new ArrayList<>(1); int entry = 0; for (Node b = c.getFirstChild(); b != null; b = b.getNextSibling()) { if ("command".equals(b.getNodeName())) { attrs = b.getAttributes(); final MacroType type = parseEnum(attrs, MacroType.class, "type"); int d1 = 0; int d2 = 0; final String cmd = b.getTextContent(); switch (type) { case SKILL: { d1 = parseInteger(attrs, "skillId"); // Skill ID d2 = parseInteger(attrs, "skillLvl", 0); // Skill level break; } case ACTION: { // Not handled by client. d1 = parseInteger(attrs, "actionId"); break; } case TEXT: { // Doesn't have numeric parameters. break; } case SHORTCUT: { d1 = parseInteger(attrs, "page"); // Page d2 = parseInteger(attrs, "slot", 0); // Slot break; } case ITEM: { // Not handled by client. d1 = parseInteger(attrs, "itemId"); break; } case DELAY: { d1 = parseInteger(attrs, "delay"); // Delay in seconds break; } } commands.add(new MacroCmd(entry++, type, d1, d2, cmd)); } } _macroPresets.put(macroId, new Macro(macroId, icon, name, description, acronym, commands)); } } } /** * Parses a node an create a shortcut from it. * @param pageId the page ID * @param b the node to parse * @return the new shortcut */ private Shortcut createShortcut(int pageId, Node b) { final NamedNodeMap attrs = b.getAttributes(); final int slotId = parseInteger(attrs, "slotId"); final ShortcutType shortcutType = parseEnum(attrs, ShortcutType.class, "shortcutType"); final int shortcutId = parseInteger(attrs, "shortcutId"); final int shortcutLevel = parseInteger(attrs, "shortcutLevel", 0); final int characterType = parseInteger(attrs, "characterType", 0); return new Shortcut(slotId, pageId, shortcutType, shortcutId, shortcutLevel, characterType); } /** * Gets the shortcut list. * @param cId the class ID for the shortcut list * @return the shortcut list for the give class ID */ public List getShortcutList(ClassId cId) { return _initialShortcutData.get(cId); } /** * Gets the shortcut list. * @param cId the class ID for the shortcut list * @return the shortcut list for the give class ID */ public List getShortcutList(int cId) { return _initialShortcutData.get(ClassId.getClassId(cId)); } /** * Gets the global shortcut list. * @return the global shortcut list */ public List getGlobalMacroList() { return _initialGlobalShortcutList; } /** * Register all the available shortcuts for the given player. * @param player the player */ public void registerAllShortcuts(L2PcInstance player) { if (player == null) { return; } // Register global shortcuts. for (Shortcut shortcut : _initialGlobalShortcutList) { int shortcutId = shortcut.getId(); switch (shortcut.getType()) { case ITEM: { final L2ItemInstance item = player.getInventory().getItemByItemId(shortcutId); if (item == null) { continue; } shortcutId = item.getObjectId(); break; } case SKILL: { if (!player.getSkills().containsKey(shortcutId)) { continue; } break; } case MACRO: { final Macro macro = _macroPresets.get(shortcutId); if (macro == null) { continue; } player.registerMacro(macro); break; } } // Register shortcut final Shortcut newShortcut = new Shortcut(shortcut.getSlot(), shortcut.getPage(), shortcut.getType(), shortcutId, shortcut.getLevel(), shortcut.getCharacterType()); player.sendPacket(new ShortCutRegister(newShortcut)); player.registerShortCut(newShortcut); } // Register class specific shortcuts. if (_initialShortcutData.containsKey(player.getClassId())) { for (Shortcut shortcut : _initialShortcutData.get(player.getClassId())) { int shortcutId = shortcut.getId(); switch (shortcut.getType()) { case ITEM: { final L2ItemInstance item = player.getInventory().getItemByItemId(shortcutId); if (item == null) { continue; } shortcutId = item.getObjectId(); break; } case SKILL: { if (!player.getSkills().containsKey(shortcut.getId())) { continue; } break; } case MACRO: { final Macro macro = _macroPresets.get(shortcutId); if (macro == null) { continue; } player.registerMacro(macro); break; } } // Register shortcut final Shortcut newShortcut = new Shortcut(shortcut.getSlot(), shortcut.getPage(), shortcut.getType(), shortcutId, shortcut.getLevel(), shortcut.getCharacterType()); player.sendPacket(new ShortCutRegister(newShortcut)); player.registerShortCut(newShortcut); } } } /** * Gets the single instance of InitialEquipmentData. * @return single instance of InitialEquipmentData */ public static InitialShortcutData getInstance() { return SingletonHolder._instance; } private static class SingletonHolder { protected static final InitialShortcutData _instance = new InitialShortcutData(); } }