246 lines
7.5 KiB
Java
246 lines
7.5 KiB
Java
/*
|
|
* Copyright (C) 2004-2015 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.model;
|
|
|
|
import java.sql.Connection;
|
|
import java.sql.PreparedStatement;
|
|
import java.sql.ResultSet;
|
|
import java.util.Map;
|
|
import java.util.TreeMap;
|
|
import java.util.logging.Level;
|
|
import java.util.logging.Logger;
|
|
|
|
import com.l2jserver.L2DatabaseFactory;
|
|
import com.l2jserver.gameserver.enums.ShortcutType;
|
|
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
|
|
import com.l2jserver.gameserver.model.interfaces.IRestorable;
|
|
import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
|
|
import com.l2jserver.gameserver.model.items.type.EtcItemType;
|
|
import com.l2jserver.gameserver.network.serverpackets.ExAutoSoulShot;
|
|
import com.l2jserver.gameserver.network.serverpackets.ShortCutInit;
|
|
import com.l2jserver.gameserver.network.serverpackets.ShortCutRegister;
|
|
|
|
public class ShortCuts implements IRestorable
|
|
{
|
|
private static Logger _log = Logger.getLogger(ShortCuts.class.getName());
|
|
private static final int MAX_SHORTCUTS_PER_BAR = 12;
|
|
private final L2PcInstance _owner;
|
|
private final Map<Integer, Shortcut> _shortCuts = new TreeMap<>();
|
|
|
|
public ShortCuts(L2PcInstance owner)
|
|
{
|
|
_owner = owner;
|
|
}
|
|
|
|
public Shortcut[] getAllShortCuts()
|
|
{
|
|
return _shortCuts.values().toArray(new Shortcut[_shortCuts.values().size()]);
|
|
}
|
|
|
|
public Shortcut getShortCut(int slot, int page)
|
|
{
|
|
Shortcut sc = _shortCuts.get(slot + (page * MAX_SHORTCUTS_PER_BAR));
|
|
// Verify shortcut
|
|
if ((sc != null) && (sc.getType() == ShortcutType.ITEM))
|
|
{
|
|
if (_owner.getInventory().getItemByObjectId(sc.getId()) == null)
|
|
{
|
|
deleteShortCut(sc.getSlot(), sc.getPage());
|
|
sc = null;
|
|
}
|
|
}
|
|
return sc;
|
|
}
|
|
|
|
public synchronized void registerShortCut(Shortcut shortcut)
|
|
{
|
|
// Verify shortcut
|
|
if (shortcut.getType() == ShortcutType.ITEM)
|
|
{
|
|
final L2ItemInstance item = _owner.getInventory().getItemByObjectId(shortcut.getId());
|
|
if (item == null)
|
|
{
|
|
return;
|
|
}
|
|
shortcut.setSharedReuseGroup(item.getSharedReuseGroup());
|
|
}
|
|
final Shortcut oldShortCut = _shortCuts.put(shortcut.getSlot() + (shortcut.getPage() * MAX_SHORTCUTS_PER_BAR), shortcut);
|
|
registerShortCutInDb(shortcut, oldShortCut);
|
|
}
|
|
|
|
private void registerShortCutInDb(Shortcut shortcut, Shortcut oldShortCut)
|
|
{
|
|
if (oldShortCut != null)
|
|
{
|
|
deleteShortCutFromDb(oldShortCut);
|
|
}
|
|
|
|
try (Connection con = L2DatabaseFactory.getInstance().getConnection();
|
|
PreparedStatement statement = con.prepareStatement("REPLACE INTO character_shortcuts (charId,slot,page,type,shortcut_id,level,class_index) values(?,?,?,?,?,?,?)"))
|
|
{
|
|
statement.setInt(1, _owner.getObjectId());
|
|
statement.setInt(2, shortcut.getSlot());
|
|
statement.setInt(3, shortcut.getPage());
|
|
statement.setInt(4, shortcut.getType().ordinal());
|
|
statement.setInt(5, shortcut.getId());
|
|
statement.setInt(6, shortcut.getLevel());
|
|
statement.setInt(7, _owner.getClassIndex());
|
|
statement.execute();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
_log.log(Level.WARNING, "Could not store character shortcut: " + e.getMessage(), e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param slot
|
|
* @param page
|
|
*/
|
|
public synchronized void deleteShortCut(int slot, int page)
|
|
{
|
|
final Shortcut old = _shortCuts.remove(slot + (page * MAX_SHORTCUTS_PER_BAR));
|
|
if ((old == null) || (_owner == null))
|
|
{
|
|
return;
|
|
}
|
|
deleteShortCutFromDb(old);
|
|
if (old.getType() == ShortcutType.ITEM)
|
|
{
|
|
L2ItemInstance item = _owner.getInventory().getItemByObjectId(old.getId());
|
|
|
|
if ((item != null) && (item.getItemType() == EtcItemType.SHOT))
|
|
{
|
|
if (_owner.removeAutoSoulShot(item.getId()))
|
|
{
|
|
_owner.sendPacket(new ExAutoSoulShot(item.getId(), 0));
|
|
}
|
|
}
|
|
}
|
|
|
|
_owner.sendPacket(new ShortCutInit(_owner));
|
|
|
|
for (int shotId : _owner.getAutoSoulShot())
|
|
{
|
|
_owner.sendPacket(new ExAutoSoulShot(shotId, 1));
|
|
}
|
|
}
|
|
|
|
public synchronized void deleteShortCutByObjectId(int objectId)
|
|
{
|
|
for (Shortcut shortcut : _shortCuts.values())
|
|
{
|
|
if ((shortcut.getType() == ShortcutType.ITEM) && (shortcut.getId() == objectId))
|
|
{
|
|
deleteShortCut(shortcut.getSlot(), shortcut.getPage());
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param shortcut
|
|
*/
|
|
private void deleteShortCutFromDb(Shortcut shortcut)
|
|
{
|
|
try (Connection con = L2DatabaseFactory.getInstance().getConnection();
|
|
PreparedStatement statement = con.prepareStatement("DELETE FROM character_shortcuts WHERE charId=? AND slot=? AND page=? AND class_index=?"))
|
|
{
|
|
statement.setInt(1, _owner.getObjectId());
|
|
statement.setInt(2, shortcut.getSlot());
|
|
statement.setInt(3, shortcut.getPage());
|
|
statement.setInt(4, _owner.getClassIndex());
|
|
statement.execute();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
_log.log(Level.WARNING, "Could not delete character shortcut: " + e.getMessage(), e);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public boolean restoreMe()
|
|
{
|
|
_shortCuts.clear();
|
|
try (Connection con = L2DatabaseFactory.getInstance().getConnection();
|
|
PreparedStatement statement = con.prepareStatement("SELECT charId, slot, page, type, shortcut_id, level FROM character_shortcuts WHERE charId=? AND class_index=?"))
|
|
{
|
|
statement.setInt(1, _owner.getObjectId());
|
|
statement.setInt(2, _owner.getClassIndex());
|
|
|
|
try (ResultSet rset = statement.executeQuery())
|
|
{
|
|
while (rset.next())
|
|
{
|
|
int slot = rset.getInt("slot");
|
|
int page = rset.getInt("page");
|
|
int type = rset.getInt("type");
|
|
int id = rset.getInt("shortcut_id");
|
|
int level = rset.getInt("level");
|
|
|
|
_shortCuts.put(slot + (page * MAX_SHORTCUTS_PER_BAR), new Shortcut(slot, page, ShortcutType.values()[type], id, level, 1));
|
|
}
|
|
}
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
_log.log(Level.WARNING, "Could not restore character shortcuts: " + e.getMessage(), e);
|
|
return false;
|
|
}
|
|
|
|
// Verify shortcuts
|
|
for (Shortcut sc : getAllShortCuts())
|
|
{
|
|
if (sc.getType() == ShortcutType.ITEM)
|
|
{
|
|
L2ItemInstance item = _owner.getInventory().getItemByObjectId(sc.getId());
|
|
if (item == null)
|
|
{
|
|
deleteShortCut(sc.getSlot(), sc.getPage());
|
|
}
|
|
else if (item.isEtcItem())
|
|
{
|
|
sc.setSharedReuseGroup(item.getEtcItem().getSharedReuseGroup());
|
|
}
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Updates the shortcut bars with the new skill.
|
|
* @param skillId the skill Id to search and update.
|
|
* @param skillLevel the skill level to update.
|
|
*/
|
|
public synchronized void updateShortCuts(int skillId, int skillLevel)
|
|
{
|
|
// Update all the shortcuts for this skill
|
|
for (Shortcut sc : _shortCuts.values())
|
|
{
|
|
if ((sc.getId() == skillId) && (sc.getType() == ShortcutType.SKILL))
|
|
{
|
|
Shortcut newsc = new Shortcut(sc.getSlot(), sc.getPage(), sc.getType(), sc.getId(), skillLevel, 1);
|
|
_owner.sendPacket(new ShortCutRegister(newsc));
|
|
_owner.registerShortCut(newsc);
|
|
}
|
|
}
|
|
}
|
|
}
|