369 lines
10 KiB
Java
369 lines
10 KiB
Java
/*
|
|
* 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 <http://www.gnu.org/licenses/>.
|
|
*/
|
|
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.Document;
|
|
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.<br>
|
|
* What shortcuts get each newly created character.
|
|
* @author Zoey76
|
|
*/
|
|
public final class InitialShortcutData implements DocumentParser
|
|
{
|
|
private final Map<ClassId, List<Shortcut>> _initialShortcutData = new HashMap<>();
|
|
private final List<Shortcut> _initialGlobalShortcutList = new ArrayList<>();
|
|
private final Map<Integer, Macro> _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");
|
|
|
|
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _initialGlobalShortcutList.size() + " Initial Global Shortcuts data.");
|
|
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _initialShortcutData.size() + " Initial Shortcuts data.");
|
|
LOGGER.info(getClass().getSimpleName() + ": Loaded " + _macroPresets.size() + " Macros presets.");
|
|
}
|
|
|
|
@Override
|
|
public void parseDocument(Document doc)
|
|
{
|
|
for (Node n = doc.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<Shortcut> 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();
|
|
if (!parseBoolean(attrs, "enabled", true))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
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<MacroCmd> 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<Shortcut> 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<Shortcut> getShortcutList(int cId)
|
|
{
|
|
return _initialShortcutData.get(ClassId.getClassId(cId));
|
|
}
|
|
|
|
/**
|
|
* Gets the global shortcut list.
|
|
* @return the global shortcut list
|
|
*/
|
|
public List<Shortcut> 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();
|
|
}
|
|
} |