diff --git a/runelite-api/src/main/java/net/runelite/api/Varbits.java b/runelite-api/src/main/java/net/runelite/api/Varbits.java index b9b8a7a4ed..9caeeb0840 100644 --- a/runelite-api/src/main/java/net/runelite/api/Varbits.java +++ b/runelite-api/src/main/java/net/runelite/api/Varbits.java @@ -563,7 +563,17 @@ public enum Varbits TWISTED_LEAGUE_RELIC_2(10050), TWISTED_LEAGUE_RELIC_3(10051), TWISTED_LEAGUE_RELIC_4(10052), - TWISTED_LEAGUE_RELIC_5(10053); + TWISTED_LEAGUE_RELIC_5(10053), + + /** + * Whether the Special Attack orb is disabled due to being in a PvP area + * + * 0 = Enabled (player is not in PvP) + * 1 = Disabled (player in in PvP) + * + * @see The OSRS Wiki's Minimap page + */ + PVP_SPEC_ORB(8121); /** * The raw varbit ID. diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/antidrag/AntiDragConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/antidrag/AntiDragConfig.java index 01767c5b4e..3e645547f1 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/antidrag/AntiDragConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/antidrag/AntiDragConfig.java @@ -29,7 +29,7 @@ import net.runelite.client.config.Config; import net.runelite.client.config.ConfigGroup; import net.runelite.client.config.ConfigItem; -@ConfigGroup("antiDrag") +@ConfigGroup(AntiDragPlugin.CONFIG_GROUP) public interface AntiDragConfig extends Config { @ConfigItem( @@ -42,4 +42,15 @@ public interface AntiDragConfig extends Config { return Constants.GAME_TICK_LENGTH / Constants.CLIENT_TICK_LENGTH; // one game tick } + + @ConfigItem( + keyName = "onShiftOnly", + name = "On Shift Only", + description = "Configures whether to only adjust the delay while holding shift. Required for anti drag in PvP scenarios.", + position = 2 + ) + default boolean onShiftOnly() + { + return true; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/antidrag/AntiDragPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/antidrag/AntiDragPlugin.java index 41b025e2aa..e6c7c7f0b0 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/antidrag/AntiDragPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/antidrag/AntiDragPlugin.java @@ -28,34 +28,49 @@ import com.google.inject.Provides; import java.awt.event.KeyEvent; import javax.inject.Inject; import net.runelite.api.Client; +import net.runelite.api.GameState; +import net.runelite.api.Varbits; import net.runelite.api.events.FocusChanged; +import net.runelite.api.events.VarbitChanged; +import net.runelite.api.events.WidgetLoaded; import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetID; import net.runelite.api.widgets.WidgetInfo; +import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.events.ConfigChanged; import net.runelite.client.input.KeyListener; import net.runelite.client.input.KeyManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; @PluginDescriptor( - name = "Shift Anti Drag", + name = "Anti Drag", description = "Prevent dragging an item for a specified delay", - tags = {"antidrag", "delay", "inventory", "items"} + tags = {"antidrag", "delay", "inventory", "items"}, + enabledByDefault = false ) public class AntiDragPlugin extends Plugin implements KeyListener { + static final String CONFIG_GROUP = "antiDrag"; + private static final int DEFAULT_DELAY = 5; @Inject private Client client; + @Inject + private ClientThread clientThread; + @Inject private AntiDragConfig config; @Inject private KeyManager keyManager; + private boolean inPvp; + @Provides AntiDragConfig getConfig(ConfigManager configManager) { @@ -65,13 +80,25 @@ public class AntiDragPlugin extends Plugin implements KeyListener @Override protected void startUp() throws Exception { + if (client.getGameState() == GameState.LOGGED_IN) + { + clientThread.invokeLater(() -> + { + inPvp = client.getVar(Varbits.PVP_SPEC_ORB) == 1; + if (!config.onShiftOnly() && !inPvp) + { + setDragDelay(); + } + }); + } + keyManager.registerKeyListener(this); } @Override protected void shutDown() throws Exception { - client.setInventoryDragDelay(DEFAULT_DELAY); + clientThread.invoke(this::resetDragDelay); keyManager.unregisterKeyListener(this); } @@ -84,31 +111,77 @@ public class AntiDragPlugin extends Plugin implements KeyListener @Override public void keyPressed(KeyEvent e) { - if (e.getKeyCode() == KeyEvent.VK_SHIFT) + if (e.getKeyCode() == KeyEvent.VK_SHIFT && config.onShiftOnly()) { - final int delay = config.dragDelay(); - client.setInventoryDragDelay(delay); - setBankDragDelay(delay); + setDragDelay(); } } @Override public void keyReleased(KeyEvent e) { - if (e.getKeyCode() == KeyEvent.VK_SHIFT) + if (e.getKeyCode() == KeyEvent.VK_SHIFT && config.onShiftOnly()) { - client.setInventoryDragDelay(DEFAULT_DELAY); - setBankDragDelay(DEFAULT_DELAY); + resetDragDelay(); } } + @Subscribe + public void onConfigChanged(ConfigChanged event) + { + if (event.getGroup().equals(CONFIG_GROUP)) + { + if (config.onShiftOnly() || inPvp) + { + clientThread.invoke(this::resetDragDelay); + } + else + { + clientThread.invoke(this::setDragDelay); + } + } + } + + @Subscribe + public void onVarbitChanged(VarbitChanged varbitChanged) + { + boolean currentStatus = client.getVar(Varbits.PVP_SPEC_ORB) == 1; + + if (currentStatus != inPvp) + { + inPvp = currentStatus; + + if (!inPvp && !config.onShiftOnly()) + { + setDragDelay(); + } + else + { + resetDragDelay(); + } + } + + } + @Subscribe public void onFocusChanged(FocusChanged focusChanged) { if (!focusChanged.isFocused()) { - client.setInventoryDragDelay(DEFAULT_DELAY); - setBankDragDelay(DEFAULT_DELAY); + clientThread.invoke(this::resetDragDelay); + } + else if (!inPvp && !config.onShiftOnly()) + { + clientThread.invoke(this::setDragDelay); + } + } + + @Subscribe + public void onWidgetLoaded(WidgetLoaded widgetLoaded) + { + if (widgetLoaded.getGroupId() == WidgetID.BANK_GROUP_ID) + { + setBankDragDelay(config.dragDelay()); } } @@ -125,4 +198,16 @@ public class AntiDragPlugin extends Plugin implements KeyListener } } + private void setDragDelay() + { + client.setInventoryDragDelay(config.dragDelay()); + setBankDragDelay(config.dragDelay()); + } + + private void resetDragDelay() + { + client.setInventoryDragDelay(DEFAULT_DELAY); + setBankDragDelay(DEFAULT_DELAY); + } + }