Store auto use of shortcuts.
This commit is contained in:
@ -38,7 +38,9 @@ import org.l2jmobius.gameserver.network.serverpackets.ShortCutRegister;
|
||||
public class ShortCuts implements IRestorable
|
||||
{
|
||||
private static final Logger LOGGER = Logger.getLogger(ShortCuts.class.getName());
|
||||
private static final int MAX_SHORTCUTS_PER_BAR = 12;
|
||||
|
||||
public static final int MAX_SHORTCUTS_PER_BAR = 12;
|
||||
|
||||
private final PlayerInstance _owner;
|
||||
private final Map<Integer, Shortcut> _shortCuts = new ConcurrentHashMap<>();
|
||||
|
||||
|
@ -40,6 +40,8 @@ public class Shortcut
|
||||
private final int _characterType;
|
||||
/** Shared reuse group. */
|
||||
private int _sharedReuseGroup = -1;
|
||||
/** Auto use enabled. */
|
||||
private boolean _autoUse = false;
|
||||
|
||||
public Shortcut(int slot, int page, ShortcutType type, int id, int level, int subLevel, int characterType)
|
||||
{
|
||||
@ -132,4 +134,22 @@ public class Shortcut
|
||||
{
|
||||
_sharedReuseGroup = sharedReuseGroup;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets is shortcut is auto use enabled.
|
||||
* @return if shortcut is auto use enabled.
|
||||
*/
|
||||
public boolean isAutoUse()
|
||||
{
|
||||
return _autoUse;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the auto use status.
|
||||
* @param value of shortcut auto use status.
|
||||
*/
|
||||
public void setAutoUse(boolean value)
|
||||
{
|
||||
_autoUse = value;
|
||||
}
|
||||
}
|
||||
|
@ -14298,34 +14298,165 @@ public class PlayerInstance extends Playable
|
||||
return _autoUseSettings;
|
||||
}
|
||||
|
||||
public void restoreVisualAutoUse()
|
||||
public void restoreAutoShortcutVisual()
|
||||
{
|
||||
if (_autoUseSettings.isEmpty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Shortcut shortcut;
|
||||
for (int i = 0; i < 12; i++)
|
||||
for (Shortcut shortcut : getAllShortCuts())
|
||||
{
|
||||
shortcut = getShortCut(i, 22);
|
||||
if ((shortcut != null) && _autoUseSettings.getAutoSupplyItems().contains(shortcut.getId()) && (getInventory().getItemByObjectId(shortcut.getId()) != null))
|
||||
if (!shortcut.isAutoUse())
|
||||
{
|
||||
sendPacket(new ExActivateAutoShortcut((22 * 12) + i, true));
|
||||
continue;
|
||||
}
|
||||
|
||||
if (_autoUseSettings.getAutoSkills().contains(shortcut.getId()))
|
||||
{
|
||||
if (getKnownSkill(shortcut.getId()) != null)
|
||||
{
|
||||
sendPacket(new ExActivateAutoShortcut(shortcut, true));
|
||||
}
|
||||
}
|
||||
else if (_autoUseSettings.getAutoSupplyItems().contains(shortcut.getId()))
|
||||
{
|
||||
if (getInventory().getItemByObjectId(shortcut.getId()) != null)
|
||||
{
|
||||
sendPacket(new ExActivateAutoShortcut(shortcut, true));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void restoreAutoShortcuts()
|
||||
{
|
||||
if (!getVariables().contains(PlayerVariables.AUTO_USE_SHORTCUTS))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final List<Integer> positions = getVariables().getIntegerList(PlayerVariables.AUTO_USE_SHORTCUTS, ",");
|
||||
for (Shortcut shortcut : getAllShortCuts())
|
||||
{
|
||||
final Integer position = shortcut.getSlot() + (shortcut.getPage() * ShortCuts.MAX_SHORTCUTS_PER_BAR);
|
||||
if (!positions.contains(position))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (getKnownSkill(shortcut.getId()) != null)
|
||||
{
|
||||
shortcut.setAutoUse(true);
|
||||
sendPacket(new ExActivateAutoShortcut(shortcut, true));
|
||||
AutoUseTaskManager.getInstance().addAutoSkill(this, shortcut.getId());
|
||||
}
|
||||
else
|
||||
{
|
||||
final ItemInstance item = getInventory().getItemByObjectId(shortcut.getId());
|
||||
if (item != null)
|
||||
{
|
||||
shortcut.setAutoUse(true);
|
||||
sendPacket(new ExActivateAutoShortcut(shortcut, true));
|
||||
AutoUseTaskManager.getInstance().addAutoSupplyItem(this, item.getId());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized void addAutoShortcut(int slot, int page)
|
||||
{
|
||||
final List<Integer> positions;
|
||||
if (getVariables().contains(PlayerVariables.AUTO_USE_SHORTCUTS))
|
||||
{
|
||||
positions = getVariables().getIntegerList(PlayerVariables.AUTO_USE_SHORTCUTS, ",");
|
||||
}
|
||||
else
|
||||
{
|
||||
positions = new ArrayList<>();
|
||||
}
|
||||
|
||||
final Shortcut usedShortcut = getShortCut(slot, page);
|
||||
if (usedShortcut == null)
|
||||
{
|
||||
final Integer position = slot + (page * ShortCuts.MAX_SHORTCUTS_PER_BAR);
|
||||
positions.remove(position);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (Shortcut shortcut : getAllShortCuts())
|
||||
{
|
||||
if (usedShortcut.getId() == shortcut.getId())
|
||||
{
|
||||
shortcut.setAutoUse(true);
|
||||
sendPacket(new ExActivateAutoShortcut(shortcut, true));
|
||||
final Integer position = shortcut.getSlot() + (shortcut.getPage() * ShortCuts.MAX_SHORTCUTS_PER_BAR);
|
||||
if (!positions.contains(position))
|
||||
{
|
||||
positions.add(position);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < 21; i++)
|
||||
final StringBuilder variable = new StringBuilder();
|
||||
for (int id : positions)
|
||||
{
|
||||
for (int j = 0; j < 12; j++)
|
||||
variable.append(id);
|
||||
variable.append(",");
|
||||
}
|
||||
if (variable.isEmpty())
|
||||
{
|
||||
getVariables().remove(PlayerVariables.AUTO_USE_SHORTCUTS);
|
||||
}
|
||||
else
|
||||
{
|
||||
getVariables().set(PlayerVariables.AUTO_USE_SHORTCUTS, variable.toString());
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized void removeAutoShortcut(int slot, int page)
|
||||
{
|
||||
if (!getVariables().contains(PlayerVariables.AUTO_USE_SHORTCUTS))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final List<Integer> positions = getVariables().getIntegerList(PlayerVariables.AUTO_USE_SHORTCUTS, ",");
|
||||
final Shortcut usedShortcut = getShortCut(slot, page);
|
||||
if (usedShortcut == null)
|
||||
{
|
||||
final Integer position = slot + (page * ShortCuts.MAX_SHORTCUTS_PER_BAR);
|
||||
positions.remove(position);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (Shortcut shortcut : getAllShortCuts())
|
||||
{
|
||||
shortcut = getShortCut(j, i);
|
||||
if ((shortcut != null) && _autoUseSettings.getAutoSkills().contains(shortcut.getId()) && (getKnownSkill(shortcut.getId()) != null))
|
||||
if (usedShortcut.getId() == shortcut.getId())
|
||||
{
|
||||
sendPacket(new ExActivateAutoShortcut(j + (i * 12), true));
|
||||
shortcut.setAutoUse(false);
|
||||
sendPacket(new ExActivateAutoShortcut(shortcut, false));
|
||||
final Integer position = shortcut.getSlot() + (shortcut.getPage() * ShortCuts.MAX_SHORTCUTS_PER_BAR);
|
||||
positions.remove(position);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
final StringBuilder variable = new StringBuilder();
|
||||
for (int id : positions)
|
||||
{
|
||||
variable.append(id);
|
||||
variable.append(",");
|
||||
}
|
||||
if (variable.isEmpty())
|
||||
{
|
||||
getVariables().remove(PlayerVariables.AUTO_USE_SHORTCUTS);
|
||||
}
|
||||
else
|
||||
{
|
||||
getVariables().set(PlayerVariables.AUTO_USE_SHORTCUTS, variable.toString());
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isInTimedHuntingZone(int zoneId)
|
||||
|
@ -62,6 +62,7 @@ public class PlayerVariables extends AbstractVariables
|
||||
public static final String FORTUNE_TELLING_VARIABLE = "FortuneTelling";
|
||||
public static final String FORTUNE_TELLING_BLACK_CAT_VARIABLE = "FortuneTellingBlackCat";
|
||||
public static final String DELUSION_RETURN = "DELUSION_RETURN";
|
||||
public static final String AUTO_USE_SHORTCUTS = "AUTO_USE_SHORTCUTS";
|
||||
public static final String HUNTING_ZONE_ENTRY = "HUNTING_ZONE_ENTRY_";
|
||||
public static final String HUNTING_ZONE_TIME = "HUNTING_ZONE_TIME_";
|
||||
|
||||
|
@ -644,6 +644,9 @@ public class EnterWorld implements IClientIncomingPacket
|
||||
player.sendPacket(new ExAutoSoulShot(0, true, 2));
|
||||
player.sendPacket(new ExAutoSoulShot(0, true, 3));
|
||||
|
||||
// Auto use restore.
|
||||
player.restoreAutoShortcuts();
|
||||
|
||||
// Fix for equipped item skills
|
||||
if (!player.getEffectList().getCurrentAbnormalVisualEffects().isEmpty())
|
||||
{
|
||||
|
@ -666,7 +666,7 @@ public class RequestAcquireSkill implements IClientIncomingPacket
|
||||
{
|
||||
EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSkillLearn(trainer, player, skill, _skillType), player);
|
||||
}
|
||||
player.restoreVisualAutoUse();
|
||||
player.restoreAutoShortcutVisual();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -17,6 +17,7 @@
|
||||
package org.l2jmobius.gameserver.network.clientpackets;
|
||||
|
||||
import org.l2jmobius.commons.network.PacketReader;
|
||||
import org.l2jmobius.gameserver.model.ShortCuts;
|
||||
import org.l2jmobius.gameserver.model.Shortcut;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.network.GameClient;
|
||||
@ -27,16 +28,15 @@ import org.l2jmobius.gameserver.taskmanager.AutoUseTaskManager;
|
||||
*/
|
||||
public class RequestShortCutDel implements IClientIncomingPacket
|
||||
{
|
||||
private int _id;
|
||||
private int _slot;
|
||||
private int _page;
|
||||
|
||||
@Override
|
||||
public boolean read(GameClient client, PacketReader packet)
|
||||
{
|
||||
_id = packet.readD();
|
||||
_slot = _id % 12;
|
||||
_page = _id / 12;
|
||||
final int position = packet.readD();
|
||||
_slot = position % ShortCuts.MAX_SHORTCUTS_PER_BAR;
|
||||
_page = position / ShortCuts.MAX_SHORTCUTS_PER_BAR;
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -54,23 +54,33 @@ public class RequestShortCutDel implements IClientIncomingPacket
|
||||
return;
|
||||
}
|
||||
|
||||
// Store shortcut reference id.
|
||||
final Shortcut shortcut = player.getShortCut(_slot, _page);
|
||||
final int id = shortcut == null ? -1 : shortcut.getId();
|
||||
|
||||
// Delete the shortcut.
|
||||
player.deleteShortCut(_slot, _page);
|
||||
|
||||
// Keep other similar shortcuts activated.
|
||||
final Shortcut oldShortcut = player.getShortCut(_slot, _page);
|
||||
if ((oldShortcut != null) && oldShortcut.isAutoUse())
|
||||
{
|
||||
player.removeAutoShortcut(_slot, _page);
|
||||
for (Shortcut shortcut : player.getAllShortCuts())
|
||||
{
|
||||
if (oldShortcut.getId() == shortcut.getId())
|
||||
{
|
||||
player.addAutoShortcut(shortcut.getSlot(), shortcut.getPage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Remove auto used ids.
|
||||
final int id = oldShortcut == null ? -1 : oldShortcut.getId();
|
||||
if (_slot > 263)
|
||||
{
|
||||
AutoUseTaskManager.getInstance().removeAutoSupplyItem(player, id);
|
||||
player.restoreVisualAutoUse();
|
||||
}
|
||||
else
|
||||
{
|
||||
AutoUseTaskManager.getInstance().removeAutoSkill(player, id);
|
||||
player.restoreVisualAutoUse();
|
||||
}
|
||||
player.restoreAutoShortcutVisual();
|
||||
}
|
||||
}
|
||||
|
@ -16,11 +16,17 @@
|
||||
*/
|
||||
package org.l2jmobius.gameserver.network.clientpackets;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.l2jmobius.commons.network.PacketReader;
|
||||
import org.l2jmobius.gameserver.enums.ShortcutType;
|
||||
import org.l2jmobius.gameserver.model.ShortCuts;
|
||||
import org.l2jmobius.gameserver.model.Shortcut;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
|
||||
import org.l2jmobius.gameserver.network.GameClient;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.ShortCutRegister;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.autoplay.ExActivateAutoShortcut;
|
||||
|
||||
public class RequestShortCutReg implements IClientIncomingPacket
|
||||
{
|
||||
@ -31,16 +37,17 @@ public class RequestShortCutReg implements IClientIncomingPacket
|
||||
private int _level;
|
||||
private int _subLevel;
|
||||
private int _characterType; // 1 - player, 2 - pet
|
||||
private boolean _active;
|
||||
|
||||
@Override
|
||||
public boolean read(GameClient client, PacketReader packet)
|
||||
{
|
||||
final int typeId = packet.readD();
|
||||
_type = ShortcutType.values()[(typeId < 1) || (typeId > 6) ? 0 : typeId];
|
||||
final int slot = packet.readD();
|
||||
_slot = slot % 12;
|
||||
_page = slot / 12;
|
||||
packet.readC(); // 228
|
||||
final int position = packet.readD();
|
||||
_slot = position % ShortCuts.MAX_SHORTCUTS_PER_BAR;
|
||||
_page = position / ShortCuts.MAX_SHORTCUTS_PER_BAR;
|
||||
_active = packet.readC() == 1; // 228
|
||||
_id = packet.readD();
|
||||
_level = packet.readH();
|
||||
_subLevel = packet.readH(); // Sublevel
|
||||
@ -51,13 +58,65 @@ public class RequestShortCutReg implements IClientIncomingPacket
|
||||
@Override
|
||||
public void run(GameClient client)
|
||||
{
|
||||
if ((client.getPlayer() == null) || (_page > 23) || (_page < 0))
|
||||
final PlayerInstance player = client.getPlayer();
|
||||
if (player == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if ((_page > 23) || (_page < 0))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final Shortcut sc = new Shortcut(_slot, _page, _type, _id, _level, _subLevel, _characterType);
|
||||
client.getPlayer().registerShortCut(sc);
|
||||
sc.setAutoUse(_active);
|
||||
player.registerShortCut(sc);
|
||||
client.sendPacket(new ShortCutRegister(sc));
|
||||
player.sendPacket(new ExActivateAutoShortcut(sc, _active));
|
||||
|
||||
// When id is not auto used, deactivate auto shortcuts.
|
||||
if (player.getVariables().contains(PlayerVariables.AUTO_USE_SHORTCUTS) && !player.getAutoUseSettings().getAutoSkills().contains(_id) && !player.getAutoUseSettings().getAutoSupplyItems().contains(_id))
|
||||
{
|
||||
final List<Integer> positions = player.getVariables().getIntegerList(PlayerVariables.AUTO_USE_SHORTCUTS, ",");
|
||||
final Integer position = _slot + (_page * ShortCuts.MAX_SHORTCUTS_PER_BAR);
|
||||
if (!positions.contains(position))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
positions.remove(position);
|
||||
|
||||
final StringBuilder variable = new StringBuilder();
|
||||
for (int id : positions)
|
||||
{
|
||||
variable.append(id);
|
||||
variable.append(",");
|
||||
}
|
||||
if (variable.isEmpty())
|
||||
{
|
||||
player.getVariables().remove(PlayerVariables.AUTO_USE_SHORTCUTS);
|
||||
}
|
||||
else
|
||||
{
|
||||
player.getVariables().set(PlayerVariables.AUTO_USE_SHORTCUTS, variable.toString());
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Activate if any other similar shortcut is activated.
|
||||
for (Shortcut shortcut : player.getAllShortCuts())
|
||||
{
|
||||
if (!shortcut.isAutoUse())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (_id == shortcut.getId())
|
||||
{
|
||||
player.addAutoShortcut(_slot, _page);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -22,28 +22,31 @@ import org.l2jmobius.gameserver.data.xml.ActionData;
|
||||
import org.l2jmobius.gameserver.handler.IPlayerActionHandler;
|
||||
import org.l2jmobius.gameserver.handler.PlayerActionHandler;
|
||||
import org.l2jmobius.gameserver.model.ActionDataHolder;
|
||||
import org.l2jmobius.gameserver.model.ShortCuts;
|
||||
import org.l2jmobius.gameserver.model.Shortcut;
|
||||
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
|
||||
import org.l2jmobius.gameserver.model.items.instance.ItemInstance;
|
||||
import org.l2jmobius.gameserver.model.skills.Skill;
|
||||
import org.l2jmobius.gameserver.network.GameClient;
|
||||
import org.l2jmobius.gameserver.network.clientpackets.IClientIncomingPacket;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.autoplay.ExActivateAutoShortcut;
|
||||
import org.l2jmobius.gameserver.taskmanager.AutoUseTaskManager;
|
||||
|
||||
/**
|
||||
* @author JoeAlisson, Mobius
|
||||
* @author Mobius
|
||||
*/
|
||||
public class ExRequestActivateAutoShortcut implements IClientIncomingPacket
|
||||
{
|
||||
private boolean _activate;
|
||||
private int _room;
|
||||
private int _slot;
|
||||
private int _page;
|
||||
private boolean _active;
|
||||
|
||||
@Override
|
||||
public boolean read(GameClient client, PacketReader packet)
|
||||
{
|
||||
_room = packet.readH();
|
||||
_activate = packet.readC() == 1;
|
||||
final int position = packet.readH();
|
||||
_slot = position % ShortCuts.MAX_SHORTCUTS_PER_BAR;
|
||||
_page = position / ShortCuts.MAX_SHORTCUTS_PER_BAR;
|
||||
_active = packet.readC() == 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -56,14 +59,20 @@ public class ExRequestActivateAutoShortcut implements IClientIncomingPacket
|
||||
return;
|
||||
}
|
||||
|
||||
final int slot = _room % 12;
|
||||
final int page = _room / 12;
|
||||
final Shortcut shortcut = player.getShortCut(slot, page);
|
||||
final Shortcut shortcut = player.getShortCut(_slot, _page);
|
||||
if (shortcut == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
client.sendPacket(new ExActivateAutoShortcut(_room, _activate));
|
||||
|
||||
if (_active)
|
||||
{
|
||||
player.addAutoShortcut(_slot, _page);
|
||||
}
|
||||
else
|
||||
{
|
||||
player.removeAutoShortcut(_slot, _page);
|
||||
}
|
||||
|
||||
final ItemInstance item = player.getInventory().getItemByObjectId(shortcut.getId());
|
||||
Skill skill = null;
|
||||
@ -73,7 +82,7 @@ public class ExRequestActivateAutoShortcut implements IClientIncomingPacket
|
||||
}
|
||||
|
||||
// stop
|
||||
if (!_activate)
|
||||
if (!_active)
|
||||
{
|
||||
if (item != null)
|
||||
{
|
||||
@ -111,7 +120,7 @@ public class ExRequestActivateAutoShortcut implements IClientIncomingPacket
|
||||
else
|
||||
{
|
||||
// auto potion
|
||||
if ((page == 23) && (slot == 1))
|
||||
if ((_page == 23) && (_slot == 1))
|
||||
{
|
||||
if (Config.ENABLE_AUTO_POTION && (item != null) && item.isPotion())
|
||||
{
|
||||
|
@ -17,29 +17,31 @@
|
||||
package org.l2jmobius.gameserver.network.serverpackets.autoplay;
|
||||
|
||||
import org.l2jmobius.commons.network.PacketWriter;
|
||||
import org.l2jmobius.gameserver.model.ShortCuts;
|
||||
import org.l2jmobius.gameserver.model.Shortcut;
|
||||
import org.l2jmobius.gameserver.network.OutgoingPackets;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
|
||||
|
||||
/**
|
||||
* @author JoeAlisson
|
||||
* @author Mobius
|
||||
*/
|
||||
public class ExActivateAutoShortcut implements IClientOutgoingPacket
|
||||
{
|
||||
private final int _room;
|
||||
private final boolean _activate;
|
||||
private final int _position;
|
||||
private final boolean _active;
|
||||
|
||||
public ExActivateAutoShortcut(int room, boolean activate)
|
||||
public ExActivateAutoShortcut(Shortcut shortcut, boolean active)
|
||||
{
|
||||
_room = room;
|
||||
_activate = activate;
|
||||
_position = shortcut.getSlot() + (shortcut.getPage() * ShortCuts.MAX_SHORTCUTS_PER_BAR);
|
||||
_active = active;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean write(PacketWriter packet)
|
||||
{
|
||||
OutgoingPackets.EX_ACTIVATE_AUTO_SHORTCUT.writeId(packet);
|
||||
packet.writeH(_room);
|
||||
packet.writeC(_activate ? 0x01 : 0x00);
|
||||
packet.writeH(_position);
|
||||
packet.writeC(_active ? 0x01 : 0x00);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user