This commit is contained in:
245
trunk/java/com/l2jserver/gameserver/model/ShortCuts.java
Normal file
245
trunk/java/com/l2jserver/gameserver/model/ShortCuts.java
Normal file
@@ -0,0 +1,245 @@
|
||||
/*
|
||||
* 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.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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user