From c3889a00393bcf75d2ba61fa1e6c20e7659e09f9 Mon Sep 17 00:00:00 2001 From: MobiusDevelopment <8391001+MobiusDevelopment@users.noreply.github.com> Date: Sun, 19 Sep 2021 11:59:17 +0000 Subject: [PATCH] Store auto use of shortcuts. --- .../l2jmobius/gameserver/model/ShortCuts.java | 4 +- .../l2jmobius/gameserver/model/Shortcut.java | 20 +++ .../model/actor/instance/PlayerInstance.java | 153 ++++++++++++++++-- .../model/variables/PlayerVariables.java | 1 + .../network/clientpackets/EnterWorld.java | 3 + .../clientpackets/RequestAcquireSkill.java | 2 +- .../clientpackets/RequestShortCutDel.java | 30 ++-- .../clientpackets/RequestShortCutReg.java | 71 +++++++- .../ExRequestActivateAutoShortcut.java | 33 ++-- .../autoplay/ExActivateAutoShortcut.java | 18 ++- .../l2jmobius/gameserver/model/ShortCuts.java | 4 +- .../l2jmobius/gameserver/model/Shortcut.java | 20 +++ .../model/actor/instance/PlayerInstance.java | 153 ++++++++++++++++-- .../model/variables/PlayerVariables.java | 1 + .../network/clientpackets/EnterWorld.java | 3 + .../clientpackets/RequestAcquireSkill.java | 2 +- .../clientpackets/RequestShortCutDel.java | 30 ++-- .../clientpackets/RequestShortCutReg.java | 71 +++++++- .../ExRequestActivateAutoShortcut.java | 33 ++-- .../autoplay/ExActivateAutoShortcut.java | 18 ++- .../l2jmobius/gameserver/model/ShortCuts.java | 4 +- .../l2jmobius/gameserver/model/Shortcut.java | 20 +++ .../model/actor/instance/PlayerInstance.java | 153 ++++++++++++++++-- .../model/variables/PlayerVariables.java | 1 + .../network/clientpackets/EnterWorld.java | 3 + .../clientpackets/RequestAcquireSkill.java | 2 +- .../clientpackets/RequestShortCutDel.java | 30 ++-- .../clientpackets/RequestShortCutReg.java | 71 +++++++- .../ExRequestActivateAutoShortcut.java | 33 ++-- .../autoplay/ExActivateAutoShortcut.java | 18 ++- .../l2jmobius/gameserver/model/ShortCuts.java | 4 +- .../l2jmobius/gameserver/model/Shortcut.java | 20 +++ .../model/actor/instance/PlayerInstance.java | 153 ++++++++++++++++-- .../model/variables/PlayerVariables.java | 1 + .../network/clientpackets/EnterWorld.java | 3 + .../clientpackets/RequestAcquireSkill.java | 2 +- .../clientpackets/RequestShortCutDel.java | 30 ++-- .../clientpackets/RequestShortCutReg.java | 71 +++++++- .../ExRequestActivateAutoShortcut.java | 33 ++-- .../autoplay/ExActivateAutoShortcut.java | 18 ++- .../l2jmobius/gameserver/model/ShortCuts.java | 4 +- .../l2jmobius/gameserver/model/Shortcut.java | 20 +++ .../model/actor/instance/PlayerInstance.java | 153 ++++++++++++++++-- .../model/variables/PlayerVariables.java | 1 + .../network/clientpackets/EnterWorld.java | 3 + .../clientpackets/RequestAcquireSkill.java | 2 +- .../clientpackets/RequestShortCutDel.java | 30 ++-- .../clientpackets/RequestShortCutReg.java | 71 +++++++- .../ExRequestActivateAutoShortcut.java | 33 ++-- .../autoplay/ExActivateAutoShortcut.java | 18 ++- .../l2jmobius/gameserver/model/ShortCuts.java | 4 +- .../l2jmobius/gameserver/model/Shortcut.java | 20 +++ .../model/actor/instance/PlayerInstance.java | 153 ++++++++++++++++-- .../model/variables/PlayerVariables.java | 1 + .../network/clientpackets/EnterWorld.java | 3 + .../clientpackets/RequestAcquireSkill.java | 2 +- .../clientpackets/RequestShortCutDel.java | 30 ++-- .../clientpackets/RequestShortCutReg.java | 71 +++++++- .../ExRequestActivateAutoShortcut.java | 33 ++-- .../autoplay/ExActivateAutoShortcut.java | 18 ++- 60 files changed, 1716 insertions(+), 294 deletions(-) diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/ShortCuts.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/ShortCuts.java index 9dd492dc16..792383a1cf 100644 --- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/ShortCuts.java +++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/ShortCuts.java @@ -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 _shortCuts = new ConcurrentHashMap<>(); diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/Shortcut.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/Shortcut.java index f29f45c185..af9c1bab7f 100644 --- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/Shortcut.java +++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/Shortcut.java @@ -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; + } } diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java index 8501bf96fa..59cb574b73 100644 --- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java +++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java @@ -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 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 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 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) diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/variables/PlayerVariables.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/variables/PlayerVariables.java index 21114b528e..7d4ccfba60 100644 --- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/variables/PlayerVariables.java +++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/variables/PlayerVariables.java @@ -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_"; diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java index 709fc4ff4e..6b4a7922a9 100644 --- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java +++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java @@ -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()) { diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java index e975bbcd7b..9f7aae3709 100644 --- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java +++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java @@ -666,7 +666,7 @@ public class RequestAcquireSkill implements IClientIncomingPacket { EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSkillLearn(trainer, player, skill, _skillType), player); } - player.restoreVisualAutoUse(); + player.restoreAutoShortcutVisual(); } /** diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutDel.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutDel.java index 5163ae6bc0..c38da908ee 100644 --- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutDel.java +++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutDel.java @@ -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(); } } diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutReg.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutReg.java index 8b3b44fce9..6587034cad 100644 --- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutReg.java +++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutReg.java @@ -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 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; + } + } } } diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/autoplay/ExRequestActivateAutoShortcut.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/autoplay/ExRequestActivateAutoShortcut.java index 14d2b52454..34133c211a 100644 --- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/autoplay/ExRequestActivateAutoShortcut.java +++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/clientpackets/autoplay/ExRequestActivateAutoShortcut.java @@ -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()) { diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/autoplay/ExActivateAutoShortcut.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/autoplay/ExActivateAutoShortcut.java index 9c8fd0bdf4..0282966053 100644 --- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/autoplay/ExActivateAutoShortcut.java +++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/network/serverpackets/autoplay/ExActivateAutoShortcut.java @@ -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; } } diff --git a/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/model/ShortCuts.java b/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/model/ShortCuts.java index 9dd492dc16..792383a1cf 100644 --- a/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/model/ShortCuts.java +++ b/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/model/ShortCuts.java @@ -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 _shortCuts = new ConcurrentHashMap<>(); diff --git a/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/model/Shortcut.java b/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/model/Shortcut.java index f29f45c185..af9c1bab7f 100644 --- a/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/model/Shortcut.java +++ b/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/model/Shortcut.java @@ -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; + } } diff --git a/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java b/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java index 82bcf9eedb..e2b5a676a1 100644 --- a/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java +++ b/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java @@ -14368,34 +14368,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 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 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 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) diff --git a/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/model/variables/PlayerVariables.java b/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/model/variables/PlayerVariables.java index 48918272ea..bcc96a6b73 100644 --- a/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/model/variables/PlayerVariables.java +++ b/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/model/variables/PlayerVariables.java @@ -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_"; public static final String FAVORITE_TELEPORTS = "FAVORITE_TELEPORTS"; diff --git a/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java b/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java index 3f96a79b9d..6b5433a1a2 100644 --- a/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java +++ b/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java @@ -654,6 +654,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()) { diff --git a/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java b/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java index e975bbcd7b..9f7aae3709 100644 --- a/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java +++ b/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java @@ -666,7 +666,7 @@ public class RequestAcquireSkill implements IClientIncomingPacket { EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSkillLearn(trainer, player, skill, _skillType), player); } - player.restoreVisualAutoUse(); + player.restoreAutoShortcutVisual(); } /** diff --git a/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutDel.java b/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutDel.java index 5163ae6bc0..c38da908ee 100644 --- a/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutDel.java +++ b/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutDel.java @@ -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(); } } diff --git a/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutReg.java b/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutReg.java index 8b3b44fce9..6587034cad 100644 --- a/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutReg.java +++ b/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutReg.java @@ -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 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; + } + } } } diff --git a/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/autoplay/ExRequestActivateAutoShortcut.java b/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/autoplay/ExRequestActivateAutoShortcut.java index 14d2b52454..34133c211a 100644 --- a/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/autoplay/ExRequestActivateAutoShortcut.java +++ b/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/autoplay/ExRequestActivateAutoShortcut.java @@ -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()) { diff --git a/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/autoplay/ExActivateAutoShortcut.java b/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/autoplay/ExActivateAutoShortcut.java index 9c8fd0bdf4..0282966053 100644 --- a/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/autoplay/ExActivateAutoShortcut.java +++ b/L2J_Mobius_8.2_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/autoplay/ExActivateAutoShortcut.java @@ -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; } } diff --git a/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/ShortCuts.java b/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/ShortCuts.java index 9dd492dc16..792383a1cf 100644 --- a/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/ShortCuts.java +++ b/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/ShortCuts.java @@ -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 _shortCuts = new ConcurrentHashMap<>(); diff --git a/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/Shortcut.java b/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/Shortcut.java index f29f45c185..af9c1bab7f 100644 --- a/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/Shortcut.java +++ b/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/Shortcut.java @@ -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; + } } diff --git a/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java b/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java index 877296f9a3..53ee570b11 100644 --- a/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java +++ b/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java @@ -14405,34 +14405,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 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 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 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) diff --git a/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/variables/PlayerVariables.java b/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/variables/PlayerVariables.java index 48918272ea..bcc96a6b73 100644 --- a/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/variables/PlayerVariables.java +++ b/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/variables/PlayerVariables.java @@ -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_"; public static final String FAVORITE_TELEPORTS = "FAVORITE_TELEPORTS"; diff --git a/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java b/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java index 1a10477c48..1315424e35 100644 --- a/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java +++ b/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java @@ -659,6 +659,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()) { diff --git a/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java b/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java index e975bbcd7b..9f7aae3709 100644 --- a/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java +++ b/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java @@ -666,7 +666,7 @@ public class RequestAcquireSkill implements IClientIncomingPacket { EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSkillLearn(trainer, player, skill, _skillType), player); } - player.restoreVisualAutoUse(); + player.restoreAutoShortcutVisual(); } /** diff --git a/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutDel.java b/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutDel.java index 5163ae6bc0..c38da908ee 100644 --- a/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutDel.java +++ b/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutDel.java @@ -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(); } } diff --git a/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutReg.java b/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutReg.java index 8b3b44fce9..6587034cad 100644 --- a/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutReg.java +++ b/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutReg.java @@ -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 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; + } + } } } diff --git a/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/autoplay/ExRequestActivateAutoShortcut.java b/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/autoplay/ExRequestActivateAutoShortcut.java index 14d2b52454..34133c211a 100644 --- a/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/autoplay/ExRequestActivateAutoShortcut.java +++ b/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/autoplay/ExRequestActivateAutoShortcut.java @@ -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()) { diff --git a/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/autoplay/ExActivateAutoShortcut.java b/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/autoplay/ExActivateAutoShortcut.java index 9c8fd0bdf4..0282966053 100644 --- a/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/autoplay/ExActivateAutoShortcut.java +++ b/L2J_Mobius_9.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/autoplay/ExActivateAutoShortcut.java @@ -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; } } diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/ShortCuts.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/ShortCuts.java index 9dd492dc16..792383a1cf 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/ShortCuts.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/ShortCuts.java @@ -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 _shortCuts = new ConcurrentHashMap<>(); diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/Shortcut.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/Shortcut.java index f29f45c185..af9c1bab7f 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/Shortcut.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/Shortcut.java @@ -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; + } } diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java index 463953242f..fe4e5e55eb 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java @@ -14278,34 +14278,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 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 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 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) diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/variables/PlayerVariables.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/variables/PlayerVariables.java index 06dba0a244..687ad69e9c 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/variables/PlayerVariables.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/variables/PlayerVariables.java @@ -63,6 +63,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_"; diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java index afe7b85e1c..6fcdbb44ac 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java @@ -633,6 +633,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()) { diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java index dfb46e5725..450b2a02ce 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java @@ -633,7 +633,7 @@ public class RequestAcquireSkill implements IClientIncomingPacket { EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSkillLearn(trainer, player, skill, _skillType), player); } - player.restoreVisualAutoUse(); + player.restoreAutoShortcutVisual(); } /** diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutDel.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutDel.java index 5163ae6bc0..c38da908ee 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutDel.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutDel.java @@ -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(); } } diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutReg.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutReg.java index 8b3b44fce9..6587034cad 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutReg.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutReg.java @@ -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 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; + } + } } } diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/autoplay/ExRequestActivateAutoShortcut.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/autoplay/ExRequestActivateAutoShortcut.java index 14d2b52454..34133c211a 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/autoplay/ExRequestActivateAutoShortcut.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/clientpackets/autoplay/ExRequestActivateAutoShortcut.java @@ -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()) { diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/autoplay/ExActivateAutoShortcut.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/autoplay/ExActivateAutoShortcut.java index 9c8fd0bdf4..0282966053 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/autoplay/ExActivateAutoShortcut.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/network/serverpackets/autoplay/ExActivateAutoShortcut.java @@ -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; } } diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/ShortCuts.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/ShortCuts.java index 9dd492dc16..792383a1cf 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/ShortCuts.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/ShortCuts.java @@ -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 _shortCuts = new ConcurrentHashMap<>(); diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/Shortcut.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/Shortcut.java index f29f45c185..af9c1bab7f 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/Shortcut.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/Shortcut.java @@ -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; + } } diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java index 319b9c379a..544af2d283 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java @@ -14538,34 +14538,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 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 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 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) diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/variables/PlayerVariables.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/variables/PlayerVariables.java index 814c3d5205..306af9b04c 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/variables/PlayerVariables.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/variables/PlayerVariables.java @@ -63,6 +63,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_"; public static final String SAYHA_GRACE_SUPPORT_ENDTIME = "SAYHA_GRACE_SUPPORT_ENDTIME"; diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java index 96f63646e3..b82a4328cc 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java @@ -636,6 +636,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()) { diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java index 71e1e553e2..e8d2b5d884 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java @@ -633,7 +633,7 @@ public class RequestAcquireSkill implements IClientIncomingPacket { EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSkillLearn(trainer, player, skill, _skillType), player); } - player.restoreVisualAutoUse(); + player.restoreAutoShortcutVisual(); } /** diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutDel.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutDel.java index 5163ae6bc0..c38da908ee 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutDel.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutDel.java @@ -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(); } } diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutReg.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutReg.java index 8b3b44fce9..6587034cad 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutReg.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutReg.java @@ -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 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; + } + } } } diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/autoplay/ExRequestActivateAutoShortcut.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/autoplay/ExRequestActivateAutoShortcut.java index 14d2b52454..34133c211a 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/autoplay/ExRequestActivateAutoShortcut.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/autoplay/ExRequestActivateAutoShortcut.java @@ -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()) { diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/autoplay/ExActivateAutoShortcut.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/autoplay/ExActivateAutoShortcut.java index 9c8fd0bdf4..0282966053 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/autoplay/ExActivateAutoShortcut.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/autoplay/ExActivateAutoShortcut.java @@ -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; } } diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/ShortCuts.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/ShortCuts.java index 9dd492dc16..792383a1cf 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/ShortCuts.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/ShortCuts.java @@ -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 _shortCuts = new ConcurrentHashMap<>(); diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/Shortcut.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/Shortcut.java index f29f45c185..af9c1bab7f 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/Shortcut.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/Shortcut.java @@ -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; + } } diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java index a27040f5eb..3304925299 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/actor/instance/PlayerInstance.java @@ -14615,34 +14615,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 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 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 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) diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/variables/PlayerVariables.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/variables/PlayerVariables.java index 11861d3328..7f963d81f4 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/variables/PlayerVariables.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/variables/PlayerVariables.java @@ -63,6 +63,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_"; public static final String SAYHA_GRACE_SUPPORT_ENDTIME = "SAYHA_GRACE_SUPPORT_ENDTIME"; diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java index 29c4d5189e..28fc79139f 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/EnterWorld.java @@ -643,6 +643,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()) { diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java index 71e1e553e2..e8d2b5d884 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java @@ -633,7 +633,7 @@ public class RequestAcquireSkill implements IClientIncomingPacket { EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSkillLearn(trainer, player, skill, _skillType), player); } - player.restoreVisualAutoUse(); + player.restoreAutoShortcutVisual(); } /** diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutDel.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutDel.java index 5163ae6bc0..c38da908ee 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutDel.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutDel.java @@ -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(); } } diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutReg.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutReg.java index 8b3b44fce9..6587034cad 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutReg.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/RequestShortCutReg.java @@ -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 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; + } + } } } diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/autoplay/ExRequestActivateAutoShortcut.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/autoplay/ExRequestActivateAutoShortcut.java index 14d2b52454..34133c211a 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/autoplay/ExRequestActivateAutoShortcut.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/autoplay/ExRequestActivateAutoShortcut.java @@ -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()) { diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/autoplay/ExActivateAutoShortcut.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/autoplay/ExActivateAutoShortcut.java index 9c8fd0bdf4..0282966053 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/autoplay/ExActivateAutoShortcut.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/autoplay/ExActivateAutoShortcut.java @@ -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; } }