Store auto use of shortcuts.

This commit is contained in:
MobiusDevelopment
2021-09-19 11:59:17 +00:00
parent 3fcdf690a9
commit c3889a0039
60 changed files with 1716 additions and 294 deletions

View File

@ -38,7 +38,9 @@ import org.l2jmobius.gameserver.network.serverpackets.ShortCutRegister;
public class ShortCuts implements IRestorable
{
private static final Logger LOGGER = Logger.getLogger(ShortCuts.class.getName());
private static final int MAX_SHORTCUTS_PER_BAR = 12;
public static final int MAX_SHORTCUTS_PER_BAR = 12;
private final PlayerInstance _owner;
private final Map<Integer, Shortcut> _shortCuts = new ConcurrentHashMap<>();

View File

@ -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;
}
}

View File

@ -14298,34 +14298,165 @@ public class PlayerInstance extends Playable
return _autoUseSettings;
}
public void restoreVisualAutoUse()
public void restoreAutoShortcutVisual()
{
if (_autoUseSettings.isEmpty())
{
return;
}
Shortcut shortcut;
for (int i = 0; i < 12; i++)
for (Shortcut shortcut : getAllShortCuts())
{
shortcut = getShortCut(i, 22);
if ((shortcut != null) && _autoUseSettings.getAutoSupplyItems().contains(shortcut.getId()) && (getInventory().getItemByObjectId(shortcut.getId()) != null))
if (!shortcut.isAutoUse())
{
sendPacket(new ExActivateAutoShortcut((22 * 12) + i, true));
continue;
}
if (_autoUseSettings.getAutoSkills().contains(shortcut.getId()))
{
if (getKnownSkill(shortcut.getId()) != null)
{
sendPacket(new ExActivateAutoShortcut(shortcut, true));
}
}
else if (_autoUseSettings.getAutoSupplyItems().contains(shortcut.getId()))
{
if (getInventory().getItemByObjectId(shortcut.getId()) != null)
{
sendPacket(new ExActivateAutoShortcut(shortcut, true));
}
}
}
}
public void restoreAutoShortcuts()
{
if (!getVariables().contains(PlayerVariables.AUTO_USE_SHORTCUTS))
{
return;
}
final List<Integer> positions = getVariables().getIntegerList(PlayerVariables.AUTO_USE_SHORTCUTS, ",");
for (Shortcut shortcut : getAllShortCuts())
{
final Integer position = shortcut.getSlot() + (shortcut.getPage() * ShortCuts.MAX_SHORTCUTS_PER_BAR);
if (!positions.contains(position))
{
continue;
}
if (getKnownSkill(shortcut.getId()) != null)
{
shortcut.setAutoUse(true);
sendPacket(new ExActivateAutoShortcut(shortcut, true));
AutoUseTaskManager.getInstance().addAutoSkill(this, shortcut.getId());
}
else
{
final ItemInstance item = getInventory().getItemByObjectId(shortcut.getId());
if (item != null)
{
shortcut.setAutoUse(true);
sendPacket(new ExActivateAutoShortcut(shortcut, true));
AutoUseTaskManager.getInstance().addAutoSupplyItem(this, item.getId());
}
}
}
}
public synchronized void addAutoShortcut(int slot, int page)
{
final List<Integer> positions;
if (getVariables().contains(PlayerVariables.AUTO_USE_SHORTCUTS))
{
positions = getVariables().getIntegerList(PlayerVariables.AUTO_USE_SHORTCUTS, ",");
}
else
{
positions = new ArrayList<>();
}
final Shortcut usedShortcut = getShortCut(slot, page);
if (usedShortcut == null)
{
final Integer position = slot + (page * ShortCuts.MAX_SHORTCUTS_PER_BAR);
positions.remove(position);
}
else
{
for (Shortcut shortcut : getAllShortCuts())
{
if (usedShortcut.getId() == shortcut.getId())
{
shortcut.setAutoUse(true);
sendPacket(new ExActivateAutoShortcut(shortcut, true));
final Integer position = shortcut.getSlot() + (shortcut.getPage() * ShortCuts.MAX_SHORTCUTS_PER_BAR);
if (!positions.contains(position))
{
positions.add(position);
}
}
}
}
for (int i = 0; i < 21; i++)
final StringBuilder variable = new StringBuilder();
for (int id : positions)
{
for (int j = 0; j < 12; j++)
variable.append(id);
variable.append(",");
}
if (variable.isEmpty())
{
getVariables().remove(PlayerVariables.AUTO_USE_SHORTCUTS);
}
else
{
getVariables().set(PlayerVariables.AUTO_USE_SHORTCUTS, variable.toString());
}
}
public synchronized void removeAutoShortcut(int slot, int page)
{
if (!getVariables().contains(PlayerVariables.AUTO_USE_SHORTCUTS))
{
return;
}
final List<Integer> positions = getVariables().getIntegerList(PlayerVariables.AUTO_USE_SHORTCUTS, ",");
final Shortcut usedShortcut = getShortCut(slot, page);
if (usedShortcut == null)
{
final Integer position = slot + (page * ShortCuts.MAX_SHORTCUTS_PER_BAR);
positions.remove(position);
}
else
{
for (Shortcut shortcut : getAllShortCuts())
{
shortcut = getShortCut(j, i);
if ((shortcut != null) && _autoUseSettings.getAutoSkills().contains(shortcut.getId()) && (getKnownSkill(shortcut.getId()) != null))
if (usedShortcut.getId() == shortcut.getId())
{
sendPacket(new ExActivateAutoShortcut(j + (i * 12), true));
shortcut.setAutoUse(false);
sendPacket(new ExActivateAutoShortcut(shortcut, false));
final Integer position = shortcut.getSlot() + (shortcut.getPage() * ShortCuts.MAX_SHORTCUTS_PER_BAR);
positions.remove(position);
}
}
}
final StringBuilder variable = new StringBuilder();
for (int id : positions)
{
variable.append(id);
variable.append(",");
}
if (variable.isEmpty())
{
getVariables().remove(PlayerVariables.AUTO_USE_SHORTCUTS);
}
else
{
getVariables().set(PlayerVariables.AUTO_USE_SHORTCUTS, variable.toString());
}
}
public boolean isInTimedHuntingZone(int zoneId)

View File

@ -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_";

View File

@ -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())
{

View File

@ -666,7 +666,7 @@ public class RequestAcquireSkill implements IClientIncomingPacket
{
EventDispatcher.getInstance().notifyEventAsync(new OnPlayerSkillLearn(trainer, player, skill, _skillType), player);
}
player.restoreVisualAutoUse();
player.restoreAutoShortcutVisual();
}
/**

View File

@ -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();
}
}

View File

@ -16,11 +16,17 @@
*/
package org.l2jmobius.gameserver.network.clientpackets;
import java.util.List;
import org.l2jmobius.commons.network.PacketReader;
import org.l2jmobius.gameserver.enums.ShortcutType;
import org.l2jmobius.gameserver.model.ShortCuts;
import org.l2jmobius.gameserver.model.Shortcut;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.variables.PlayerVariables;
import org.l2jmobius.gameserver.network.GameClient;
import org.l2jmobius.gameserver.network.serverpackets.ShortCutRegister;
import org.l2jmobius.gameserver.network.serverpackets.autoplay.ExActivateAutoShortcut;
public class RequestShortCutReg implements IClientIncomingPacket
{
@ -31,16 +37,17 @@ public class RequestShortCutReg implements IClientIncomingPacket
private int _level;
private int _subLevel;
private int _characterType; // 1 - player, 2 - pet
private boolean _active;
@Override
public boolean read(GameClient client, PacketReader packet)
{
final int typeId = packet.readD();
_type = ShortcutType.values()[(typeId < 1) || (typeId > 6) ? 0 : typeId];
final int slot = packet.readD();
_slot = slot % 12;
_page = slot / 12;
packet.readC(); // 228
final int position = packet.readD();
_slot = position % ShortCuts.MAX_SHORTCUTS_PER_BAR;
_page = position / ShortCuts.MAX_SHORTCUTS_PER_BAR;
_active = packet.readC() == 1; // 228
_id = packet.readD();
_level = packet.readH();
_subLevel = packet.readH(); // Sublevel
@ -51,13 +58,65 @@ public class RequestShortCutReg implements IClientIncomingPacket
@Override
public void run(GameClient client)
{
if ((client.getPlayer() == null) || (_page > 23) || (_page < 0))
final PlayerInstance player = client.getPlayer();
if (player == null)
{
return;
}
if ((_page > 23) || (_page < 0))
{
return;
}
final Shortcut sc = new Shortcut(_slot, _page, _type, _id, _level, _subLevel, _characterType);
client.getPlayer().registerShortCut(sc);
sc.setAutoUse(_active);
player.registerShortCut(sc);
client.sendPacket(new ShortCutRegister(sc));
player.sendPacket(new ExActivateAutoShortcut(sc, _active));
// When id is not auto used, deactivate auto shortcuts.
if (player.getVariables().contains(PlayerVariables.AUTO_USE_SHORTCUTS) && !player.getAutoUseSettings().getAutoSkills().contains(_id) && !player.getAutoUseSettings().getAutoSupplyItems().contains(_id))
{
final List<Integer> positions = player.getVariables().getIntegerList(PlayerVariables.AUTO_USE_SHORTCUTS, ",");
final Integer position = _slot + (_page * ShortCuts.MAX_SHORTCUTS_PER_BAR);
if (!positions.contains(position))
{
return;
}
positions.remove(position);
final StringBuilder variable = new StringBuilder();
for (int id : positions)
{
variable.append(id);
variable.append(",");
}
if (variable.isEmpty())
{
player.getVariables().remove(PlayerVariables.AUTO_USE_SHORTCUTS);
}
else
{
player.getVariables().set(PlayerVariables.AUTO_USE_SHORTCUTS, variable.toString());
}
return;
}
// Activate if any other similar shortcut is activated.
for (Shortcut shortcut : player.getAllShortCuts())
{
if (!shortcut.isAutoUse())
{
continue;
}
if (_id == shortcut.getId())
{
player.addAutoShortcut(_slot, _page);
break;
}
}
}
}

View File

@ -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())
{

View File

@ -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;
}
}