diff --git a/runelite-client/src/main/java/net/runelite/client/menus/AbstractMenuEntry.java b/runelite-client/src/main/java/net/runelite/client/menus/AbstractMenuEntry.java index 14577265d4..a51b211542 100644 --- a/runelite-client/src/main/java/net/runelite/client/menus/AbstractMenuEntry.java +++ b/runelite-client/src/main/java/net/runelite/client/menus/AbstractMenuEntry.java @@ -1,12 +1,14 @@ package net.runelite.client.menus; import joptsimple.internal.Strings; +import lombok.EqualsAndHashCode; import lombok.Getter; import net.runelite.api.MenuEntry; import static net.runelite.client.menus.MenuManager.LEVEL_PATTERN; import net.runelite.client.util.Text; -class AbstractMenuEntry +@EqualsAndHashCode +public class AbstractMenuEntry { @Getter private String option; @@ -26,17 +28,17 @@ class AbstractMenuEntry @Getter private boolean strictTarget; - AbstractMenuEntry(String option, String target) + public AbstractMenuEntry(String option, String target) { this(option, target, -1, -1, true, true); } - AbstractMenuEntry(String option, String target, boolean strictTarget) + public AbstractMenuEntry(String option, String target, boolean strictTarget) { this(option, target, -1, -1, true, strictTarget); } - AbstractMenuEntry(String option, String target, int id, int type, boolean strictOption, boolean strictTarget) + public AbstractMenuEntry(String option, String target, int id, int type, boolean strictOption, boolean strictTarget) { this.option = option; this.target = target; @@ -88,7 +90,7 @@ class AbstractMenuEntry return true; } - boolean equals(AbstractMenuEntry other) + /*boolean equals(AbstractMenuEntry other) { return target.equals(other.getTarget()) && option.equals(other.getOption()) @@ -96,5 +98,5 @@ class AbstractMenuEntry && type == other.getType() && strictOption == other.isStrictOption() && strictTarget == other.isStrictTarget(); - } + }*/ } diff --git a/runelite-client/src/main/java/net/runelite/client/menus/MenuManager.java b/runelite-client/src/main/java/net/runelite/client/menus/MenuManager.java index 4fba85094b..7e4e236faa 100644 --- a/runelite-client/src/main/java/net/runelite/client/menus/MenuManager.java +++ b/runelite-client/src/main/java/net/runelite/client/menus/MenuManager.java @@ -26,6 +26,7 @@ package net.runelite.client.menus; import com.google.common.base.Preconditions; import com.google.common.collect.HashMultimap; +import com.google.common.collect.Lists; import com.google.common.collect.Multimap; import java.util.ArrayList; import java.util.Arrays; @@ -36,7 +37,6 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.regex.Pattern; -import java.util.stream.Collectors; import javax.inject.Inject; import javax.inject.Singleton; import lombok.extern.slf4j.Slf4j; @@ -168,7 +168,15 @@ public class MenuManager MenuEntry newestEntry = menuEntries[menuEntries.length - 1]; - boolean isPrio = priorityEntries.stream().anyMatch(p -> p.matches(newestEntry)); + boolean isPrio = false; + for (AbstractMenuEntry p : priorityEntries) + { + if (p.matches(newestEntry)) + { + isPrio = true; + break; + } + } // If the last entry was a priority entry, keep track of it if (isPrio) @@ -187,26 +195,42 @@ public class MenuManager copy.add(CANCEL()); } - /*// Find the current entry in the swaps map - Optional swapEntry = swaps.keySet().stream().filter(e -> e.matches(newestEntry)).findFirst(); - - if (swapEntry.isPresent()) + // Find the current entry in the swaps map + AbstractMenuEntry swapEntry = null; + for (AbstractMenuEntry e : swaps.keySet()) { - AbstractMenuEntry swap = swapEntry.get(); - AbstractMenuEntry swapTarget = swaps.get(swap); + if (e.matches(newestEntry)) + { + swapEntry = e; + break; + } + } + + if (swapEntry != null) + { + AbstractMenuEntry swapTarget = swaps.get(swapEntry); // Find the target for the swap in current menu entries - Optional foundSwap = Lists.reverse(copy).stream().filter(swapTarget::matches).findFirst(); + MenuEntry foundSwap = null; + for (MenuEntry entry : Lists.reverse(copy)) + { + if (swapTarget.matches(entry)) + { + foundSwap = entry; + break; + } + } - if (foundSwap.isPresent()) + if (foundSwap != null) { // Swap - int index = copy.indexOf(foundSwap.get()); + int index = copy.indexOf(foundSwap); + int newIndex = copy.indexOf(newestEntry); copy.set(index, newestEntry); - copy.set(copy.size() - 1, foundSwap.get()); + copy.set(newIndex, foundSwap); } - }*/ + } client.setMenuEntries(copy.toArray(new MenuEntry[0])); } @@ -401,8 +425,121 @@ public class MenuManager AbstractMenuEntry entry = new AbstractMenuEntry(option, target); - Set toRemove = priorityEntries.stream().filter(entry::equals).collect(Collectors.toSet()); + Set toRemove = new HashSet<>(); + for (AbstractMenuEntry priorityEntry : priorityEntries) + { + if (entry.equals(priorityEntry)) + { + toRemove.add(entry); + } + } - priorityEntries.removeAll(toRemove); + for (AbstractMenuEntry e : toRemove) + { + priorityEntries.remove(e); + } + } + + + /** + * Adds to the set of menu entries which when present, will remove all entries except for this one + * This method will add one with strict option, but not-strict target (contains for target, equals for option) + */ + public void addPriorityEntry(String option) + { + option = Text.standardize(option); + + AbstractMenuEntry entry = new AbstractMenuEntry(option, "", false); + + priorityEntries.add(entry); + } + + public void removePriorityEntry(String option) + { + option = Text.standardize(option); + + AbstractMenuEntry entry = new AbstractMenuEntry(option, "", false); + + Set toRemove = new HashSet<>(); + for (AbstractMenuEntry priorityEntry : priorityEntries) + { + if (entry.equals(priorityEntry)) + { + toRemove.add(entry); + } + } + + for (AbstractMenuEntry e : toRemove) + { + priorityEntries.remove(e); + } + } + + /** + * Adds to the map of swaps. - Strict option + target + */ + public void addSwap(String option, String target, String option2, String target2) + { + option = Text.standardize(option); + target = Text.standardize(target); + + option2 = Text.standardize(option2); + target2 = Text.standardize(target2); + + AbstractMenuEntry swapFrom = new AbstractMenuEntry(option, target); + AbstractMenuEntry swapTo = new AbstractMenuEntry(option2, target2); + + if (swapTo.equals(swapFrom)) + { + log.warn("You shouldn't try swapping an entry for itself"); + return; + } + + swaps.put(swapFrom, swapTo); + } + + /** + * Adds to the map of swaps - Pre-baked Abstract entry + */ + public void addSwap(AbstractMenuEntry swapFrom, AbstractMenuEntry swapTo) + { + if (swapTo.equals(swapFrom)) + { + log.warn("You shouldn't try swapping an entry for itself"); + return; + } + + swaps.put(swapFrom, swapTo); + } + + public void removeSwap(String option, String target, String option2, String target2) + { + option = Text.standardize(option); + target = Text.standardize(target); + + option2 = Text.standardize(option2); + target2 = Text.standardize(target2); + + AbstractMenuEntry swapFrom = new AbstractMenuEntry(option, target); + AbstractMenuEntry swapTo = new AbstractMenuEntry(option2, target2); + + removeSwap(swapFrom, swapTo); + } + + public void removeSwap(AbstractMenuEntry swapFrom, AbstractMenuEntry swapTo) + { + Set toRemove = new HashSet<>(); + for (Map.Entry e : swaps.entrySet()) + { + if (e.getKey().equals(swapFrom) && e.getValue().equals(swapTo)) + { + toRemove.add(e.getKey()); + } + } + + for (AbstractMenuEntry entry : toRemove) + { + swaps.remove(entry); + } } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperConfig.java index f1a39f4427..e0fd5d28e4 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperConfig.java @@ -32,6 +32,17 @@ import net.runelite.client.config.ConfigItem; @ConfigGroup("menuentryswapper") public interface MenuEntrySwapperConfig extends Config { + @ConfigItem( + position = -3, + keyName = "customSwaps", + name = "Custom swaps", + description = "Add custom swaps here, 1 per line. Syntax: option, target : option, target
Note that the first entry should be the left click one!" + ) + default String customSwaps() + { + return ""; + } + @ConfigItem( position = -2, keyName = "shiftClickCustomization", diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java index 155795761d..4c5d6ec01f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java @@ -25,10 +25,14 @@ */ package net.runelite.client.plugins.menuentryswapper; +import com.google.common.base.Splitter; import com.google.common.collect.ImmutableSet; import com.google.inject.Provides; +import java.util.HashMap; +import java.util.Map; import java.util.Set; import javax.inject.Inject; +import joptsimple.internal.Strings; import lombok.Getter; import lombok.Setter; import net.runelite.api.Client; @@ -51,6 +55,7 @@ import net.runelite.client.eventbus.Subscribe; import net.runelite.client.game.ItemManager; import net.runelite.client.game.ItemVariationMapping; import net.runelite.client.input.KeyManager; +import net.runelite.client.menus.AbstractMenuEntry; import net.runelite.client.menus.MenuManager; import net.runelite.client.menus.WidgetMenuOption; import net.runelite.client.plugins.Plugin; @@ -71,7 +76,6 @@ public class MenuEntrySwapperPlugin extends Plugin private static final String SAVE = "Save"; private static final String RESET = "Reset"; private static final String MENU_TARGET = "Shift-click"; - private static final String CONFIG_GROUP = "shiftclick"; private static final String ITEM_KEY_PREFIX = "item_"; @@ -101,6 +105,13 @@ public class MenuEntrySwapperPlugin extends Plugin MenuAction.NPC_FIFTH_OPTION, MenuAction.EXAMINE_NPC); + private static final Splitter NEWLINE_SPLITTER = Splitter + .on("\n") + .omitEmptyStrings() + .trimResults(); + + private final Map customSwaps = new HashMap<>(); + @Inject private Client client; @@ -131,9 +142,6 @@ public class MenuEntrySwapperPlugin extends Plugin @Setter private boolean shiftModifier = false; - @Setter - private boolean controlModifier = false; - @Provides MenuEntrySwapperConfig provideConfig(ConfigManager configManager) { @@ -160,6 +168,11 @@ public class MenuEntrySwapperPlugin extends Plugin { if (!CONFIG_GROUP.equals(event.getGroup())) { + if (event.getKey().equals("customSwaps")) + { + loadCustomSwaps(config.customSwaps()); + } + return; } @@ -455,20 +468,6 @@ public class MenuEntrySwapperPlugin extends Plugin } } - else if (option.equalsIgnoreCase("climb") && config.swapClimbUpDown()) - { - if (controlModifier ^ shiftModifier) - { - if (shiftModifier) - { - swap(client, "climb-up", option, target, true); - } - if (controlModifier) - { - swap(client, "climb-down", option, target, true); - } - } - } else if (config.swapTravel() && option.equals("pass") && target.equals("energy barrier")) { swap(client, "pay-toll(2-ecto)", option, target, true); @@ -667,4 +666,96 @@ public class MenuEntrySwapperPlugin extends Plugin menuManager.addManagedCustomMenu(RESIZABLE_INVENTORY_TAB_CONFIGURE); } } + + private void loadCustomSwaps(String config) + { + Map tmp = new HashMap<>(); + + if (!Strings.isNullOrEmpty(config)) + { + Map split = NEWLINE_SPLITTER.withKeyValueSeparator(':').split(config); + + for (Map.Entry entry : split.entrySet()) + { + String from = entry.getKey(); + String to = entry.getValue(); + String[] splitFrom = Text.standardize(from).split(","); + String optionFrom = splitFrom[0].trim(); + String targetFrom; + if (splitFrom.length == 1) + { + targetFrom = ""; + } + else + { + targetFrom = splitFrom[1].trim(); + } + + AbstractMenuEntry fromEntry = new AbstractMenuEntry(optionFrom, targetFrom); + + String[] splitTo = Text.standardize(to).split(","); + String optionTo = splitTo[0].trim(); + String targetTo; + if (splitTo.length == 1) + { + targetTo = ""; + } + else + { + targetTo = splitTo[1].trim(); + } + + AbstractMenuEntry toEntry = new AbstractMenuEntry(optionTo, targetTo); + + tmp.put(fromEntry, toEntry); + } + } + + for (Map.Entry e : customSwaps.entrySet()) + { + AbstractMenuEntry key = e.getKey(); + AbstractMenuEntry value = e.getValue(); + menuManager.removeSwap(key, value); + } + + customSwaps.clear(); + customSwaps.putAll(tmp); + + for (Map.Entry entry : customSwaps.entrySet()) + { + AbstractMenuEntry a1 = entry.getKey(); + AbstractMenuEntry a2 = entry.getValue(); + menuManager.addSwap(a1, a2); + } + } + + void startShift() + { + if (!config.swapClimbUpDown()) + { + return; + } + + menuManager.addPriorityEntry("climb-up"); + } + + void stopShift() + { + menuManager.removePriorityEntry("climb-up"); + } + + void startControl() + { + if (!config.swapClimbUpDown()) + { + return; + } + + menuManager.addPriorityEntry("climb-down"); + } + + void stopControl() + { + menuManager.removePriorityEntry("climb-down"); + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/ShiftClickInputListener.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/ShiftClickInputListener.java index cea447b527..5df37f45b2 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/ShiftClickInputListener.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/ShiftClickInputListener.java @@ -26,18 +26,10 @@ package net.runelite.client.plugins.menuentryswapper; import java.awt.event.KeyEvent; import javax.inject.Inject; -import net.runelite.api.Client; -import net.runelite.client.callback.ClientThread; import net.runelite.client.input.KeyListener; public class ShiftClickInputListener implements KeyListener { - @Inject - private ClientThread clientThread; - - @Inject - private Client client; - @Inject private MenuEntrySwapperPlugin plugin; @@ -53,10 +45,11 @@ public class ShiftClickInputListener implements KeyListener if (event.getKeyCode() == KeyEvent.VK_SHIFT) { plugin.setShiftModifier(true); + plugin.startShift(); } if (event.getKeyCode() == KeyEvent.VK_CONTROL) { - plugin.setControlModifier(true); + plugin.startControl(); } } @@ -66,10 +59,11 @@ public class ShiftClickInputListener implements KeyListener if (event.getKeyCode() == KeyEvent.VK_SHIFT) { plugin.setShiftModifier(false); + plugin.stopShift(); } if (event.getKeyCode() == KeyEvent.VK_CONTROL) { - plugin.setControlModifier(false); + plugin.stopControl(); } } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/shiftwalker/ShiftWalkerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/shiftwalker/ShiftWalkerPlugin.java index 9602c34d2b..b7798d2b43 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/shiftwalker/ShiftWalkerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/shiftwalker/ShiftWalkerPlugin.java @@ -48,7 +48,7 @@ import net.runelite.client.plugins.PluginType; public class ShiftWalkerPlugin extends Plugin { - private static final String WALK_HERE = "WALK HERE"; + private static final String WALK_HERE = "Walk here"; @Inject private ShiftWalkerConfig config; @@ -91,11 +91,11 @@ public class ShiftWalkerPlugin extends Plugin void startPrioritizing() { - menuManager.addPriorityEntry(WALK_HERE, ""); + menuManager.addPriorityEntry(WALK_HERE); } void stopPrioritizing() { - menuManager.removePriorityEntry(WALK_HERE, ""); + menuManager.removePriorityEntry(WALK_HERE); } } diff --git a/runelite-client/src/main/java/net/runelite/client/util/MenuUtil.java b/runelite-client/src/main/java/net/runelite/client/util/MenuUtil.java index e98c3d1dd3..1e7135e3ab 100644 --- a/runelite-client/src/main/java/net/runelite/client/util/MenuUtil.java +++ b/runelite-client/src/main/java/net/runelite/client/util/MenuUtil.java @@ -33,6 +33,7 @@ import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; import net.runelite.api.MenuEntry; +@Deprecated @Slf4j public class MenuUtil {