mes: add left click customization

This commit is contained in:
Adam
2021-11-30 15:45:29 -05:00
parent d45d79c2ce
commit 8944eb9be6
2 changed files with 179 additions and 79 deletions

View File

@@ -113,6 +113,18 @@ public interface MenuEntrySwapperConfig extends Config
KALPHITE_CAVE,
}
@ConfigItem(
position = -3,
keyName = "leftClickCustomization",
name = "Customizable left-click",
description = "Allows customization of left-clicks on items",
section = itemSection
)
default boolean leftClickCustomization()
{
return true;
}
@ConfigItem(
position = -2,
keyName = "shiftClickCustomization",

View File

@@ -29,6 +29,7 @@ package net.runelite.client.plugins.menuentryswapper;
import com.google.common.annotations.VisibleForTesting;
import static com.google.common.base.Predicates.alwaysTrue;
import static com.google.common.base.Predicates.equalTo;
import com.google.common.base.Strings;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.LinkedHashMultimap;
@@ -42,7 +43,6 @@ import java.util.Set;
import java.util.function.Predicate;
import java.util.function.Supplier;
import javax.inject.Inject;
import lombok.Getter;
import net.runelite.api.Client;
import net.runelite.api.GameState;
import net.runelite.api.ItemComposition;
@@ -87,28 +87,43 @@ public class MenuEntrySwapperPlugin extends Plugin
private static final String CONFIGURE = "Configure";
private static final String SAVE = "Save";
private static final String RESET = "Reset";
private static final String MENU_TARGET = "Shift-click";
private static final String LEFT_CLICK_MENU_TARGET = "Left-click";
private static final String SHIFT_CLICK_MENU_TARGET = "Shift-click";
private static final String SHIFTCLICK_CONFIG_GROUP = "shiftclick";
private static final String ITEM_KEY_PREFIX = "item_";
private static final WidgetMenuOption FIXED_INVENTORY_TAB_CONFIGURE = new WidgetMenuOption(CONFIGURE,
MENU_TARGET, WidgetInfo.FIXED_VIEWPORT_INVENTORY_TAB);
// Shift click
private static final WidgetMenuOption FIXED_INVENTORY_TAB_CONFIGURE_SC = new WidgetMenuOption(CONFIGURE,
SHIFT_CLICK_MENU_TARGET, WidgetInfo.FIXED_VIEWPORT_INVENTORY_TAB);
private static final WidgetMenuOption FIXED_INVENTORY_TAB_SAVE_SC = new WidgetMenuOption(SAVE,
SHIFT_CLICK_MENU_TARGET, WidgetInfo.FIXED_VIEWPORT_INVENTORY_TAB);
private static final WidgetMenuOption FIXED_INVENTORY_TAB_SAVE = new WidgetMenuOption(SAVE,
MENU_TARGET, WidgetInfo.FIXED_VIEWPORT_INVENTORY_TAB);
private static final WidgetMenuOption RESIZABLE_INVENTORY_TAB_CONFIGURE_SC = new WidgetMenuOption(CONFIGURE,
SHIFT_CLICK_MENU_TARGET, WidgetInfo.RESIZABLE_VIEWPORT_INVENTORY_TAB);
private static final WidgetMenuOption RESIZABLE_INVENTORY_TAB_SAVE_SC = new WidgetMenuOption(SAVE,
SHIFT_CLICK_MENU_TARGET, WidgetInfo.RESIZABLE_VIEWPORT_INVENTORY_TAB);
private static final WidgetMenuOption RESIZABLE_INVENTORY_TAB_CONFIGURE = new WidgetMenuOption(CONFIGURE,
MENU_TARGET, WidgetInfo.RESIZABLE_VIEWPORT_INVENTORY_TAB);
private static final WidgetMenuOption RESIZABLE_BOTTOM_LINE_INVENTORY_TAB_CONFIGURE_SC = new WidgetMenuOption(CONFIGURE,
SHIFT_CLICK_MENU_TARGET, WidgetInfo.RESIZABLE_VIEWPORT_BOTTOM_LINE_INVENTORY_TAB);
private static final WidgetMenuOption RESIZABLE_BOTTOM_LINE_INVENTORY_TAB_SAVE_SC = new WidgetMenuOption(SAVE,
SHIFT_CLICK_MENU_TARGET, WidgetInfo.RESIZABLE_VIEWPORT_BOTTOM_LINE_INVENTORY_TAB);
private static final WidgetMenuOption RESIZABLE_INVENTORY_TAB_SAVE = new WidgetMenuOption(SAVE,
MENU_TARGET, WidgetInfo.RESIZABLE_VIEWPORT_INVENTORY_TAB);
// Left click
private static final WidgetMenuOption FIXED_INVENTORY_TAB_CONFIGURE_LC = new WidgetMenuOption(CONFIGURE,
LEFT_CLICK_MENU_TARGET, WidgetInfo.FIXED_VIEWPORT_INVENTORY_TAB);
private static final WidgetMenuOption FIXED_INVENTORY_TAB_SAVE_LC = new WidgetMenuOption(SAVE,
LEFT_CLICK_MENU_TARGET, WidgetInfo.FIXED_VIEWPORT_INVENTORY_TAB);
private static final WidgetMenuOption RESIZABLE_BOTTOM_LINE_INVENTORY_TAB_CONFIGURE = new WidgetMenuOption(CONFIGURE,
MENU_TARGET, WidgetInfo.RESIZABLE_VIEWPORT_BOTTOM_LINE_INVENTORY_TAB);
private static final WidgetMenuOption RESIZABLE_INVENTORY_TAB_CONFIGURE_LC = new WidgetMenuOption(CONFIGURE,
LEFT_CLICK_MENU_TARGET, WidgetInfo.RESIZABLE_VIEWPORT_INVENTORY_TAB);
private static final WidgetMenuOption RESIZABLE_INVENTORY_TAB_SAVE_LC = new WidgetMenuOption(SAVE,
LEFT_CLICK_MENU_TARGET, WidgetInfo.RESIZABLE_VIEWPORT_INVENTORY_TAB);
private static final WidgetMenuOption RESIZABLE_BOTTOM_LINE_INVENTORY_TAB_SAVE = new WidgetMenuOption(SAVE,
MENU_TARGET, WidgetInfo.RESIZABLE_VIEWPORT_BOTTOM_LINE_INVENTORY_TAB);
private static final WidgetMenuOption RESIZABLE_BOTTOM_LINE_INVENTORY_TAB_CONFIGURE_LC = new WidgetMenuOption(CONFIGURE,
LEFT_CLICK_MENU_TARGET, WidgetInfo.RESIZABLE_VIEWPORT_BOTTOM_LINE_INVENTORY_TAB);
private static final WidgetMenuOption RESIZABLE_BOTTOM_LINE_INVENTORY_TAB_SAVE_LC = new WidgetMenuOption(SAVE,
LEFT_CLICK_MENU_TARGET, WidgetInfo.RESIZABLE_VIEWPORT_BOTTOM_LINE_INVENTORY_TAB);
private static final Set<MenuAction> ITEM_MENU_TYPES = ImmutableSet.of(
MenuAction.ITEM_FIRST_OPTION,
@@ -161,8 +176,8 @@ public class MenuEntrySwapperPlugin extends Plugin
@Inject
private ItemManager itemManager;
@Getter
private boolean configuringShiftClick = false;
private boolean configuringLeftClick = false;
private final Multimap<String, Swap> swaps = LinkedHashMultimap.create();
private final ArrayListMultimap<String, Integer> optionIndexes = ArrayListMultimap.create();
@@ -176,11 +191,7 @@ public class MenuEntrySwapperPlugin extends Plugin
@Override
public void startUp()
{
if (config.shiftClickCustomization())
{
enableCustomization();
}
enableCustomization();
setupSwaps();
}
@@ -440,16 +451,10 @@ public class MenuEntrySwapperPlugin extends Plugin
@Subscribe
public void onConfigChanged(ConfigChanged event)
{
if (event.getGroup().equals(MenuEntrySwapperConfig.GROUP) && event.getKey().equals("shiftClickCustomization"))
if (event.getGroup().equals(MenuEntrySwapperConfig.GROUP)
&& (event.getKey().equals("shiftClickCustomization") || event.getKey().equals("leftClickCustomization")))
{
if (config.shiftClickCustomization())
{
enableCustomization();
}
else
{
disableCustomization();
}
enableCustomization();
}
else if (event.getGroup().equals(SHIFTCLICK_CONFIG_GROUP) && event.getKey().startsWith(ITEM_KEY_PREFIX))
{
@@ -462,10 +467,10 @@ public class MenuEntrySwapperPlugin extends Plugin
client.getItemCompositionCache().reset();
}
private Integer getSwapConfig(int itemId)
private Integer getSwapConfig(boolean shift, int itemId)
{
itemId = ItemVariationMapping.map(itemId);
String config = configManager.getConfiguration(SHIFTCLICK_CONFIG_GROUP, ITEM_KEY_PREFIX + itemId);
String config = configManager.getConfiguration(shift ? SHIFTCLICK_CONFIG_GROUP : MenuEntrySwapperConfig.GROUP, ITEM_KEY_PREFIX + itemId);
if (config == null || config.isEmpty())
{
return null;
@@ -474,29 +479,29 @@ public class MenuEntrySwapperPlugin extends Plugin
return Integer.parseInt(config);
}
private void setSwapConfig(int itemId, int index)
private void setSwapConfig(boolean shift, int itemId, int index)
{
itemId = ItemVariationMapping.map(itemId);
configManager.setConfiguration(SHIFTCLICK_CONFIG_GROUP, ITEM_KEY_PREFIX + itemId, index);
configManager.setConfiguration(shift ? SHIFTCLICK_CONFIG_GROUP : MenuEntrySwapperConfig.GROUP, ITEM_KEY_PREFIX + itemId, index);
}
private void unsetSwapConfig(int itemId)
private void unsetSwapConfig(boolean shift, int itemId)
{
itemId = ItemVariationMapping.map(itemId);
configManager.unsetConfiguration(SHIFTCLICK_CONFIG_GROUP, ITEM_KEY_PREFIX + itemId);
configManager.unsetConfiguration(shift ? SHIFTCLICK_CONFIG_GROUP : MenuEntrySwapperConfig.GROUP, ITEM_KEY_PREFIX + itemId);
}
private void enableCustomization()
{
refreshShiftClickCustomizationMenus();
rebuildCustomizationMenus();
// set shift click action index on the item compositions
clientThread.invoke(this::resetItemCompositionCache);
}
private void disableCustomization()
{
removeShiftClickCustomizationMenus();
configuringShiftClick = false;
removeCusomizationMenus();
configuringShiftClick = configuringLeftClick = false;
// flush item compositions to reset the shift click action index
clientThread.invoke(this::resetItemCompositionCache);
}
@@ -508,15 +513,21 @@ public class MenuEntrySwapperPlugin extends Plugin
|| event.getWidget() == WidgetInfo.RESIZABLE_VIEWPORT_INVENTORY_TAB
|| event.getWidget() == WidgetInfo.RESIZABLE_VIEWPORT_BOTTOM_LINE_INVENTORY_TAB)
{
configuringShiftClick = event.getMenuOption().equals(CONFIGURE) && Text.removeTags(event.getMenuTarget()).equals(MENU_TARGET);
refreshShiftClickCustomizationMenus();
String option = event.getMenuOption();
String target = Text.removeTags(event.getMenuTarget());
if ((option.equals(CONFIGURE) || option.equals(SAVE)) && (target.equals(LEFT_CLICK_MENU_TARGET) || target.equals(SHIFT_CLICK_MENU_TARGET)))
{
configuringShiftClick = option.equals(CONFIGURE) && target.equals(SHIFT_CLICK_MENU_TARGET);
configuringLeftClick = option.equals(CONFIGURE) && target.equals(LEFT_CLICK_MENU_TARGET);
rebuildCustomizationMenus();
}
}
}
@Subscribe
public void onMenuOpened(MenuOpened event)
{
if (!configuringShiftClick)
if (!configuringShiftClick && !configuringLeftClick)
{
return;
}
@@ -539,13 +550,41 @@ public class MenuEntrySwapperPlugin extends Plugin
return;
}
ItemComposition itemComposition = itemManager.getItemComposition(itemId);
MenuAction shiftClickAction = MenuAction.ITEM_USE;
final int shiftClickActionIndex = itemComposition.getShiftClickActionIndex();
MenuAction activeAction = MenuAction.ITEM_USE;
final ItemComposition itemComposition = itemManager.getItemComposition(itemId);
if (shiftClickActionIndex >= 0)
if (configuringShiftClick)
{
shiftClickAction = MenuAction.of(MenuAction.ITEM_FIRST_OPTION.getId() + shiftClickActionIndex);
// For shift-click read the active action off of the item composition, since it may be set by
// that even if we have no existing config for it
final int shiftClickActionIndex = itemComposition.getShiftClickActionIndex();
if (shiftClickActionIndex >= 0)
{
activeAction = MenuAction.of(MenuAction.ITEM_FIRST_OPTION.getId() + shiftClickActionIndex);
}
}
else
{
// The default left click on items is the highest priority action 0-2, and otherwise is use.
final String[] actions = itemComposition.getInventoryActions();
for (int i = 0; i <= 2; ++i)
{
if (!Strings.isNullOrEmpty(actions[i]))
{
activeAction = MenuAction.of(MenuAction.ITEM_FIRST_OPTION.getId() + i);
break;
}
}
// Apply left click action from configuration
Integer config = getSwapConfig(false, itemId);
if (config != null)
{
activeAction = config >= 0
? MenuAction.of(MenuAction.ITEM_FIRST_OPTION.getId() + config)
: MenuAction.ITEM_USE;
}
}
MenuEntry[] entries = event.getMenuEntries();
@@ -558,7 +597,7 @@ public class MenuEntrySwapperPlugin extends Plugin
{
entry.setType(MenuAction.RUNELITE.getId());
if (shiftClickAction == menuAction)
if (activeAction == menuAction)
{
entry.setOption("* " + entry.getOption());
}
@@ -567,7 +606,7 @@ public class MenuEntrySwapperPlugin extends Plugin
final MenuEntry resetShiftClickEntry = new MenuEntry();
resetShiftClickEntry.setOption(RESET);
resetShiftClickEntry.setTarget(MENU_TARGET);
resetShiftClickEntry.setTarget(configuringShiftClick ? SHIFT_CLICK_MENU_TARGET : LEFT_CLICK_MENU_TARGET);
resetShiftClickEntry.setIdentifier(itemId);
resetShiftClickEntry.setParam1(widgetId);
resetShiftClickEntry.setType(MenuAction.RUNELITE.getId());
@@ -664,9 +703,14 @@ public class MenuEntrySwapperPlugin extends Plugin
String target = event.getMenuTarget();
ItemComposition itemComposition = itemManager.getItemComposition(itemId);
if (option.equals(RESET) && target.equals(MENU_TARGET))
if (option.equals(RESET) && target.equals(SHIFT_CLICK_MENU_TARGET))
{
unsetSwapConfig(itemId);
unsetSwapConfig(true, itemId);
return;
}
if (option.equals(RESET) && target.equals(LEFT_CLICK_MENU_TARGET))
{
unsetSwapConfig(false, itemId);
return;
}
@@ -677,7 +721,7 @@ public class MenuEntrySwapperPlugin extends Plugin
if (option.equals("Use")) //because "Use" is not in inventoryActions
{
setSwapConfig(itemId, -1);
setSwapConfig(configuringShiftClick, itemId, -1);
}
else
{
@@ -687,14 +731,14 @@ public class MenuEntrySwapperPlugin extends Plugin
{
if (option.equals(inventoryActions[index]))
{
setSwapConfig(itemId, index);
setSwapConfig(configuringShiftClick, itemId, index);
break;
}
}
}
}
private void swapMenuEntry(int index, MenuEntry menuEntry)
private void swapMenuEntry(MenuEntry[] menuEntries, int index, MenuEntry menuEntry)
{
final int eventId = menuEntry.getIdentifier();
final MenuAction menuAction = MenuAction.of(menuEntry.getType());
@@ -702,6 +746,7 @@ public class MenuEntrySwapperPlugin extends Plugin
final String target = Text.removeTags(menuEntry.getTarget()).toLowerCase();
final NPC hintArrowNpc = client.getHintArrowNpc();
// Don't swap on hint arrow npcs, usually they need "Talk-to" for clues.
if (hintArrowNpc != null
&& hintArrowNpc.getIndex() == eventId
&& NPC_MENU_TYPES.contains(menuAction))
@@ -709,22 +754,23 @@ public class MenuEntrySwapperPlugin extends Plugin
return;
}
if (shiftModifier() && (menuAction == MenuAction.ITEM_FIRST_OPTION
final boolean itemOp = menuAction == MenuAction.ITEM_FIRST_OPTION
|| menuAction == MenuAction.ITEM_SECOND_OPTION
|| menuAction == MenuAction.ITEM_THIRD_OPTION
|| menuAction == MenuAction.ITEM_FOURTH_OPTION
|| menuAction == MenuAction.ITEM_FIFTH_OPTION
|| menuAction == MenuAction.ITEM_USE))
|| menuAction == MenuAction.ITEM_USE;
if (shiftModifier() && itemOp)
{
// Special case use shift click due to items not actually containing a "Use" option, making
// the client unable to perform the swap itself.
if (config.shiftClickCustomization() && !option.equals("use"))
{
Integer customOption = getSwapConfig(eventId);
Integer customOption = getSwapConfig(true, eventId);
if (customOption != null && customOption == -1)
{
swap("use", target, index, true);
swap(menuEntries, "use", target, index, true);
}
}
@@ -733,12 +779,31 @@ public class MenuEntrySwapperPlugin extends Plugin
return;
}
// Custom left-click item swap
if (itemOp)
{
Integer swapIndex = getSwapConfig(false, eventId);
if (swapIndex != null && index < menuEntries.length - 1)
{
MenuAction swapAction = swapIndex >= 0
? MenuAction.of(MenuAction.ITEM_FIRST_OPTION.getId() + swapIndex)
: MenuAction.ITEM_USE;
if (menuAction == swapAction)
{
swap(optionIndexes, menuEntries, index, menuEntries.length - 1);
return;
}
}
}
// Built-in swaps
Collection<Swap> swaps = this.swaps.get(option);
for (Swap swap : swaps)
{
if (swap.getTargetPredicate().test(target) && swap.getEnabled().get())
{
if (swap(swap.getSwappedOption(), target, index, swap.isStrict()))
if (swap(menuEntries, swap.getSwappedOption(), target, index, swap.isStrict()))
{
break;
}
@@ -771,7 +836,7 @@ public class MenuEntrySwapperPlugin extends Plugin
idx = 0;
for (MenuEntry entry : menuEntries)
{
swapMenuEntry(idx++, entry);
swapMenuEntry(menuEntries, idx++, entry);
}
}
@@ -786,7 +851,7 @@ public class MenuEntrySwapperPlugin extends Plugin
}
ItemComposition itemComposition = event.getItemComposition();
Integer option = getSwapConfig(itemComposition.getId());
Integer option = getSwapConfig(true, itemComposition.getId());
if (option != null)
{
@@ -794,10 +859,8 @@ public class MenuEntrySwapperPlugin extends Plugin
}
}
private boolean swap(String option, String target, int index, boolean strict)
private boolean swap(MenuEntry[] menuEntries, String option, String target, int index, boolean strict)
{
MenuEntry[] menuEntries = client.getMenuEntries();
// find option to swap with
int optionIdx = findIndex(menuEntries, index, option, target, strict);
@@ -882,30 +945,55 @@ public class MenuEntrySwapperPlugin extends Plugin
list.add(idx < 0 ? -idx - 1 : idx, value);
}
private void removeShiftClickCustomizationMenus()
private void removeCusomizationMenus()
{
menuManager.removeManagedCustomMenu(FIXED_INVENTORY_TAB_CONFIGURE);
menuManager.removeManagedCustomMenu(FIXED_INVENTORY_TAB_SAVE);
menuManager.removeManagedCustomMenu(RESIZABLE_BOTTOM_LINE_INVENTORY_TAB_CONFIGURE);
menuManager.removeManagedCustomMenu(RESIZABLE_BOTTOM_LINE_INVENTORY_TAB_SAVE);
menuManager.removeManagedCustomMenu(RESIZABLE_INVENTORY_TAB_CONFIGURE);
menuManager.removeManagedCustomMenu(RESIZABLE_INVENTORY_TAB_SAVE);
// Shift click
menuManager.removeManagedCustomMenu(FIXED_INVENTORY_TAB_CONFIGURE_SC);
menuManager.removeManagedCustomMenu(FIXED_INVENTORY_TAB_SAVE_SC);
menuManager.removeManagedCustomMenu(RESIZABLE_BOTTOM_LINE_INVENTORY_TAB_CONFIGURE_SC);
menuManager.removeManagedCustomMenu(RESIZABLE_BOTTOM_LINE_INVENTORY_TAB_SAVE_SC);
menuManager.removeManagedCustomMenu(RESIZABLE_INVENTORY_TAB_CONFIGURE_SC);
menuManager.removeManagedCustomMenu(RESIZABLE_INVENTORY_TAB_SAVE_SC);
// Left click
menuManager.removeManagedCustomMenu(FIXED_INVENTORY_TAB_CONFIGURE_LC);
menuManager.removeManagedCustomMenu(FIXED_INVENTORY_TAB_SAVE_LC);
menuManager.removeManagedCustomMenu(RESIZABLE_BOTTOM_LINE_INVENTORY_TAB_CONFIGURE_LC);
menuManager.removeManagedCustomMenu(RESIZABLE_BOTTOM_LINE_INVENTORY_TAB_SAVE_LC);
menuManager.removeManagedCustomMenu(RESIZABLE_INVENTORY_TAB_CONFIGURE_LC);
menuManager.removeManagedCustomMenu(RESIZABLE_INVENTORY_TAB_SAVE_LC);
}
private void refreshShiftClickCustomizationMenus()
private void rebuildCustomizationMenus()
{
removeShiftClickCustomizationMenus();
if (configuringShiftClick)
removeCusomizationMenus();
if (configuringLeftClick)
{
menuManager.addManagedCustomMenu(FIXED_INVENTORY_TAB_SAVE);
menuManager.addManagedCustomMenu(RESIZABLE_BOTTOM_LINE_INVENTORY_TAB_SAVE);
menuManager.addManagedCustomMenu(RESIZABLE_INVENTORY_TAB_SAVE);
menuManager.addManagedCustomMenu(FIXED_INVENTORY_TAB_SAVE_LC);
menuManager.addManagedCustomMenu(RESIZABLE_BOTTOM_LINE_INVENTORY_TAB_SAVE_LC);
menuManager.addManagedCustomMenu(RESIZABLE_INVENTORY_TAB_SAVE_LC);
}
else if (configuringShiftClick)
{
menuManager.addManagedCustomMenu(FIXED_INVENTORY_TAB_SAVE_SC);
menuManager.addManagedCustomMenu(RESIZABLE_BOTTOM_LINE_INVENTORY_TAB_SAVE_SC);
menuManager.addManagedCustomMenu(RESIZABLE_INVENTORY_TAB_SAVE_SC);
}
else
{
menuManager.addManagedCustomMenu(FIXED_INVENTORY_TAB_CONFIGURE);
menuManager.addManagedCustomMenu(RESIZABLE_BOTTOM_LINE_INVENTORY_TAB_CONFIGURE);
menuManager.addManagedCustomMenu(RESIZABLE_INVENTORY_TAB_CONFIGURE);
// Left click
if (config.leftClickCustomization())
{
menuManager.addManagedCustomMenu(FIXED_INVENTORY_TAB_CONFIGURE_LC);
menuManager.addManagedCustomMenu(RESIZABLE_BOTTOM_LINE_INVENTORY_TAB_CONFIGURE_LC);
menuManager.addManagedCustomMenu(RESIZABLE_INVENTORY_TAB_CONFIGURE_LC);
}
// Shift click
if (config.shiftClickCustomization())
{
menuManager.addManagedCustomMenu(FIXED_INVENTORY_TAB_CONFIGURE_SC);
menuManager.addManagedCustomMenu(RESIZABLE_BOTTOM_LINE_INVENTORY_TAB_CONFIGURE_SC);
menuManager.addManagedCustomMenu(RESIZABLE_INVENTORY_TAB_CONFIGURE_SC);
}
}
}