Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Copyright (c) 2018, Adam <Adam@sigterm.info>
- * Copyright (c) 2018, Kamiel
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- package net.runelite.client.plugins.menuentryswapper;
- import com.google.common.collect.ImmutableSet;
- import com.google.inject.Provides;
- import java.util.Set;
- import javax.inject.Inject;
- import lombok.Getter;
- import lombok.Setter;
- import net.runelite.api.Client;
- import net.runelite.api.GameState;
- import net.runelite.api.ItemComposition;
- import net.runelite.api.MenuAction;
- import net.runelite.api.MenuEntry;
- import net.runelite.api.NPC;
- import net.runelite.api.events.ConfigChanged;
- import net.runelite.api.events.FocusChanged;
- import net.runelite.api.events.MenuEntryAdded;
- import net.runelite.api.events.MenuOpened;
- import net.runelite.api.events.MenuOptionClicked;
- import net.runelite.api.events.PostItemComposition;
- import net.runelite.api.events.WidgetMenuOptionClicked;
- import net.runelite.api.widgets.WidgetInfo;
- import net.runelite.client.config.ConfigManager;
- import net.runelite.client.eventbus.Subscribe;
- import net.runelite.client.game.ItemVariationMapping;
- import net.runelite.client.input.KeyManager;
- import net.runelite.client.menus.MenuManager;
- import net.runelite.client.menus.WidgetMenuOption;
- import net.runelite.client.plugins.Plugin;
- import net.runelite.client.plugins.PluginDescriptor;
- import net.runelite.client.util.Text;
- import org.apache.commons.lang3.ArrayUtils;
- import net.runelite.api.events.*;
- import static net.runelite.api.Skill.THIEVING;
- import static net.runelite.api.Skill.MAGIC;
- import static net.runelite.api.Skill.CONSTRUCTION;
- import java.util.Arrays;
- @PluginDescriptor(
- name = "Menu Entry Swapper",
- description = "Change the default option that is displayed when hovering over objects",
- tags = {"npcs", "inventory", "items", "objects"},
- enabledByDefault = false
- )
- 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 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);
- 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 = new WidgetMenuOption(CONFIGURE,
- MENU_TARGET, WidgetInfo.RESIZABLE_VIEWPORT_INVENTORY_TAB);
- private static final WidgetMenuOption RESIZABLE_INVENTORY_TAB_SAVE = new WidgetMenuOption(SAVE,
- MENU_TARGET, WidgetInfo.RESIZABLE_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_BOTTOM_LINE_INVENTORY_TAB_SAVE = new WidgetMenuOption(SAVE,
- MENU_TARGET, WidgetInfo.RESIZABLE_VIEWPORT_BOTTOM_LINE_INVENTORY_TAB);
- @Inject
- private Client client;
- @Inject
- private MenuEntrySwapperConfig config;
- @Inject
- private ShiftClickInputListener inputListener;
- @Inject
- private ConfigManager configManager;
- @Inject
- private KeyManager keyManager;
- @Inject
- private MenuManager menuManager;
- @Getter
- private boolean configuringShiftClick = false;
- @Setter
- private boolean shiftModifier = false;
- @Provides
- MenuEntrySwapperConfig provideConfig(ConfigManager configManager)
- {
- return configManager.getConfig(MenuEntrySwapperConfig.class);
- }
- @Override
- public void startUp()
- {
- if (config.shiftClickCustomization())
- {
- enableCustomization();
- }
- }
- @Override
- public void shutDown()
- {
- disableCustomization();
- }
- @Subscribe
- public void onConfigChanged(ConfigChanged event)
- {
- if (event.getKey().equals("shiftClickCustomization"))
- {
- if (config.shiftClickCustomization())
- {
- enableCustomization();
- }
- else
- {
- disableCustomization();
- }
- }
- }
- private Integer getSwapConfig(int itemId)
- {
- itemId = ItemVariationMapping.map(itemId);
- String config = configManager.getConfiguration(CONFIG_GROUP, ITEM_KEY_PREFIX + itemId);
- if (config == null || config.isEmpty())
- {
- return null;
- }
- return Integer.parseInt(config);
- }
- private void setSwapConfig(int itemId, int index)
- {
- itemId = ItemVariationMapping.map(itemId);
- configManager.setConfiguration(CONFIG_GROUP, ITEM_KEY_PREFIX + itemId, index);
- }
- private void unsetSwapConfig(int itemId)
- {
- configManager.unsetConfiguration(CONFIG_GROUP, ITEM_KEY_PREFIX + itemId);
- }
- private void enableCustomization()
- {
- keyManager.registerKeyListener(inputListener);
- refreshShiftClickCustomizationMenus();
- }
- private void disableCustomization()
- {
- keyManager.unregisterKeyListener(inputListener);
- removeShiftClickCustomizationMenus();
- configuringShiftClick = false;
- }
- @Subscribe
- public void onWidgetMenuOptionClicked(WidgetMenuOptionClicked event)
- {
- if (event.getWidget() == WidgetInfo.FIXED_VIEWPORT_INVENTORY_TAB
- || 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();
- }
- }
- @Subscribe
- public void onMenuOpened(MenuOpened event)
- {
- if (!configuringShiftClick)
- {
- return;
- }
- MenuEntry firstEntry = event.getFirstEntry();
- if (firstEntry == null)
- {
- return;
- }
- int widgetId = firstEntry.getParam1();
- if (widgetId != WidgetInfo.INVENTORY.getId())
- {
- return;
- }
- int itemId = firstEntry.getIdentifier();
- if (itemId == -1)
- {
- return;
- }
- ItemComposition itemComposition = client.getItemDefinition(itemId);
- String itemName = itemComposition.getName();
- String option = "Use";
- int shiftClickActionindex = itemComposition.getShiftClickActionIndex();
- String[] inventoryActions = itemComposition.getInventoryActions();
- if (shiftClickActionindex >= 0 && shiftClickActionindex < inventoryActions.length)
- {
- option = inventoryActions[shiftClickActionindex];
- }
- MenuEntry[] entries = event.getMenuEntries();
- for (MenuEntry entry : entries)
- {
- if (itemName.equals(Text.removeTags(entry.getTarget())))
- {
- entry.setType(MenuAction.RUNELITE.getId());
- if (option.equals(entry.getOption()))
- {
- entry.setOption("* " + option);
- }
- }
- }
- final MenuEntry resetShiftClickEntry = new MenuEntry();
- resetShiftClickEntry.setOption(RESET);
- resetShiftClickEntry.setTarget(MENU_TARGET);
- resetShiftClickEntry.setIdentifier(itemId);
- resetShiftClickEntry.setParam1(widgetId);
- resetShiftClickEntry.setType(MenuAction.RUNELITE.getId());
- client.setMenuEntries(ArrayUtils.addAll(entries, resetShiftClickEntry));
- }
- @Subscribe
- public void onMenuOptionClicked(MenuOptionClicked event)
- {
- if (event.getMenuAction() != MenuAction.RUNELITE || event.getWidgetId() != WidgetInfo.INVENTORY.getId())
- {
- return;
- }
- int itemId = event.getId();
- if (itemId == -1)
- {
- return;
- }
- String option = event.getMenuOption();
- String target = event.getMenuTarget();
- ItemComposition itemComposition = client.getItemDefinition(itemId);
- if (option.equals(RESET) && target.equals(MENU_TARGET))
- {
- unsetSwapConfig(itemId);
- itemComposition.resetShiftClickActionIndex();
- return;
- }
- if (!itemComposition.getName().equals(Text.removeTags(target)))
- {
- return;
- }
- int index = -1;
- boolean valid = false;
- if (option.equals("Use")) //because "Use" is not in inventoryActions
- {
- valid = true;
- }
- else
- {
- String[] inventoryActions = itemComposition.getInventoryActions();
- for (index = 0; index < inventoryActions.length; index++)
- {
- if (option.equals(inventoryActions[index]))
- {
- valid = true;
- break;
- }
- }
- }
- if (valid)
- {
- setSwapConfig(itemId, index);
- itemComposition.setShiftClickActionIndex(index);
- }
- }
- int cachedXp = 0;
- boolean knockOutFirst = true;
- boolean hasPickpocketed = false;
- int cachedMagic = 0;
- int cachedCons = 0;
- int timesBuilt = 0;
- boolean castHomeTele = false;
- @Subscribe
- public void onExperienceChanged(ExperienceChanged event)
- {
- if (event.getSkill() == THIEVING)
- {
- int thievingXp = client.getSkillExperience(THIEVING);
- if (thievingXp <= cachedXp)
- {
- return;
- }
- if (cachedXp == 0)
- {
- // this is the initial xp sent on login
- cachedXp = thievingXp;
- return;
- }
- int xpDrop = thievingXp - cachedXp;
- if (xpDrop < 50)
- {
- // successful knockout
- knockOutFirst = false;
- hasPickpocketed = false;
- }
- else
- {
- // successful pickpocket
- if (hasPickpocketed)
- {
- // knock out again next
- knockOutFirst = true;
- hasPickpocketed = false;
- }
- else
- {
- hasPickpocketed = true;
- }
- }
- cachedXp = thievingXp;
- }
- else if(event.getSkill() == MAGIC)
- {
- int mageXp = client.getSkillExperience(MAGIC);
- if (mageXp <= cachedMagic)
- {
- return;
- }
- if (cachedMagic == 0)
- {
- // this is the initial xp sent on login
- cachedMagic = mageXp;
- return;
- }
- int xpDrop = mageXp - cachedMagic;
- if (xpDrop > 0)
- {
- timesBuilt = 0;
- }
- }
- else if(event.getSkill() == CONSTRUCTION)
- {
- int consXp = client.getSkillExperience(CONSTRUCTION);
- if (consXp <= cachedCons)
- {
- return;
- }
- if (cachedCons == 0)
- {
- // this is the initial xp sent on login
- cachedCons = consXp;
- return;
- }
- int xpDrop = consXp - cachedCons;
- if (xpDrop > 0 && timesBuilt < 7)
- {
- timesBuilt++;
- castHomeTele = true;
- }
- else if(xpDrop > 0)
- {
- timesBuilt = 0;
- castHomeTele = false;
- }
- xpDrop = 0;
- cachedCons = consXp;
- }
- }
- @Subscribe
- public void onMenuEntryAdded(MenuEntryAdded event)
- {
- if (client.getGameState() != GameState.LOGGED_IN)
- {
- return;
- }
- int itemId = event.getIdentifier();
- String option = Text.removeTags(event.getOption()).toLowerCase();
- String target = Text.removeTags(event.getTarget()).toLowerCase();
- if (option.equals("talk-to"))
- {
- if (config.swapPickpocket())
- {
- if (knockOutFirst)
- {
- swap("knock-out", option, target, true);
- swap("pickpocket", option, target, true);
- }
- else
- {
- swap("pickpocket", option, target, true);
- swap("knock-out", option, target, true);
- }
- }
- if (config.swapPickpocket() && target.contains("h.a.m."))
- {
- swap("pickpocket", option, target, true);
- }
- if (config.swapAbyssTeleport() && target.contains("mage of zamorak"))
- {
- swap("teleport", option, target, true);
- }
- if (config.swapBank())
- {
- swap("bank", option, target, true);
- }
- if (config.swapExchange())
- {
- swap("exchange", option, target, true);
- }
- if (config.swapDarkMage())
- {
- swap("repairs", option, target, true);
- }
- // make sure assignment swap is higher priority than trade swap for slayer masters
- if (config.swapAssignment())
- {
- swap("assignment", option, target, true);
- }
- if (config.swapTrade())
- {
- swap("trade", option, target, true);
- swap("trade-with", option, target, true);
- }
- if (config.claimSlime() && target.equals("robin"))
- {
- swap("claim-slime", option, target, true);
- }
- if (config.swapTravel())
- {
- swap("travel", option, target, true);
- swap("pay-fare", option, target, true);
- swap("charter", option, target, true);
- swap("take-boat", option, target, true);
- swap("fly", option, target, true);
- swap("jatizso", option, target, true);
- swap("neitiznot", option, target, true);
- swap("rellekka", option, target, true);
- swap("follow", option, target, true);
- swap("transport", option, target, true);
- }
- if (config.swapPay())
- {
- swap("pay", option, target, true);
- }
- if (config.swapDecant())
- {
- swap("decant", option, target, true);
- }
- if (config.swapQuick())
- {
- swap("quick-travel", option, target, true);
- }
- }
- else if(config.swapBuildOptions() && (target.equals("fencing") || target.equals("stone space")))
- {
- swapWalkHere("build", "walk here", target,true);
- }
- else if(config.swapBuildOptions() && (target.equals("attack stone") || target.equals("wooden fence")))
- {
- swapWalkHere("remove", "walk here", target, true);
- }
- else if(config.swapBuildOptions() && (target.equals("door hotspot") || target.equals("hedging") || target.equals("small plant") || target.equals("small plant 2")))
- {
- removeOptions(option, target, true);
- }
- else if(config.swapBuildOptions() && target.equals("razmire keelgan"))
- {
- swap("trade-builders-store", option, target, true);
- }
- else if(config.swapBuildOptions() && target.contains("morytania"))
- {
- swap("burgh teleport", option, target, true);
- }
- else if(config.swapBuildOptions() && target.equals("flamtaer bag") && castHomeTele)
- {
- swap("empty", option, target, true);
- }
- else if(config.swapBuildOptions() && option.equals("value"))
- {
- swap("buy 50", option, target, true);
- }
- else if(config.swapChop() && option.equals("chop down"))
- {
- swapWalkHere("walk here", option, "", true);
- }
- else if(config.marinsKitchen() && option.equals("take"))
- {
- swap("take-x", option, target, true);
- }
- else if(config.leftClickDismiss() && option.equals("talk to"))
- {
- swap("dismiss", option, target, true);
- }
- else if (config.swapTravel() && option.equals("pass") && target.equals("energy barrier"))
- {
- swap("pay-toll(2-ecto)", option, target, true);
- }
- else if (config.swapTravel() && option.equals("open") && target.equals("gate"))
- {
- swap("pay-toll(10gp)", option, target, true);
- }
- else if (config.swapTravel() && option.equals("inspect") && target.equals("trapdoor"))
- {
- swap("travel", option, target, true);
- }
- else if (config.swapHarpoon() && option.equals("cage"))
- {
- swap("harpoon", option, target, true);
- }
- else if (config.swapHarpoon() && (option.equals("big net") || option.equals("net")))
- {
- swap("harpoon", option, target, true);
- }
- else if (config.swapHomePortal() != HouseMode.ENTER && option.equals("enter"))
- {
- switch (config.swapHomePortal())
- {
- case HOME:
- swap("home", option, target, true);
- break;
- case BUILD_MODE:
- swap("build mode", option, target, true);
- break;
- case FRIENDS_HOUSE:
- swap("friend's house", option, target, true);
- break;
- }
- }
- else if (config.swapFairyRing() != FairyRingMode.OFF && config.swapFairyRing() != FairyRingMode.ZANARIS
- && (option.equals("zanaris") || option.equals("configure") || option.equals("tree")))
- {
- if (config.swapFairyRing() == FairyRingMode.LAST_DESTINATION)
- {
- swap("last-destination", option, target, false);
- }
- else if (config.swapFairyRing() == FairyRingMode.CONFIGURE)
- {
- swap("configure", option, target, false);
- }
- }
- else if (config.swapFairyRing() == FairyRingMode.ZANARIS && option.equals("tree"))
- {
- swap("zanaris", option, target, false);
- }
- else if (config.swapBoxTrap() && (option.equals("check") || option.equals("dismantle")))
- {
- swap("reset", option, target, true);
- }
- else if (config.swapBoxTrap() && option.equals("take"))
- {
- swap("lay", option, target, true);
- }
- else if (config.swapChase() && option.equals("pick-up"))
- {
- swap("chase", option, target, true);
- }
- else if (config.swapBirdhouseEmpty() && option.equals("interact") && target.contains("birdhouse"))
- {
- swap("empty", option, target, true);
- }
- else if (config.swapQuick() && option.equals("ring"))
- {
- swap("quick-start", option, target, true);
- }
- else if (config.swapQuick() && option.equals("pass"))
- {
- swap("quick-pass", option, target, true);
- swap("quick pass", option, target, true);
- }
- else if (config.swapAdmire() && option.equals("admire"))
- {
- swap("teleport", option, target, true);
- swap("spellbook", option, target, true);
- swap("perks", option, target, true);
- }
- else if (config.shiftClickCustomization() && shiftModifier && !option.equals("use"))
- {
- Integer customOption = getSwapConfig(itemId);
- if (customOption != null && customOption == -1)
- {
- swap("use", option, target, true);
- }
- }
- // Put all item-related swapping after shift-click
- else if (config.swapTeleportItem() && option.equals("wear"))
- {
- swap("rub", option, target, true);
- swap("teleport", option, target, true);
- }
- else if (option.equals("wield"))
- {
- if (config.swapTeleportItem())
- {
- swap("teleport", option, target, true);
- }
- }
- else if (config.swapBones() && option.equals("bury"))
- {
- swap("use", option, target, true);
- }
- }
- @Subscribe
- public void onPostItemComposition(PostItemComposition event)
- {
- ItemComposition itemComposition = event.getItemComposition();
- Integer option = getSwapConfig(itemComposition.getId());
- if (option != null)
- {
- itemComposition.setShiftClickActionIndex(option);
- }
- }
- @Subscribe
- public void onFocusChanged(FocusChanged event)
- {
- if (!event.isFocused())
- {
- shiftModifier = false;
- }
- }
- private int searchIndex(MenuEntry[] entries, String option, String target, boolean strict)
- {
- for (int i = entries.length - 1; i >= 0; i--)
- {
- MenuEntry entry = entries[i];
- String entryOption = Text.removeTags(entry.getOption()).toLowerCase();
- String entryTarget = Text.removeTags(entry.getTarget()).toLowerCase();
- if (strict)
- {
- if (entryOption.equals(option) && entryTarget.equals(target))
- {
- return i;
- }
- }
- else
- {
- if (entryOption.contains(option.toLowerCase()) && entryTarget.equals(target))
- {
- return i;
- }
- }
- }
- return -1;
- }
- private void swap(String optionA, String optionB, String target, boolean strict)
- {
- MenuEntry[] entries = client.getMenuEntries();
- int idxA = searchIndex(entries, optionA, target, strict);
- int idxB = searchIndex(entries, optionB, target, strict);
- if (idxA >= 0 && idxB >= 0)
- {
- MenuEntry entry = entries[idxA];
- entries[idxA] = entries[idxB];
- entries[idxB] = entry;
- client.setMenuEntries(entries);
- }
- }
- private void removeOptions(String option, String target, boolean strict)
- {
- MenuEntry[] entries = client.getMenuEntries();
- MenuEntry[] tempEntries = new MenuEntry[1];
- tempEntries[0] = entries[0];
- client.setMenuEntries(tempEntries);
- }
- private void swapWalkHere(String optionA, String optionB, String target, boolean strict)
- {
- MenuEntry[] entries = client.getMenuEntries();
- int idxA = searchIndex(entries, optionA, target, strict);
- MenuEntry[] tempEntries = new MenuEntry[1];
- tempEntries[0] = entries[idxA];
- client.setMenuEntries(tempEntries);
- }
- private void removeShiftClickCustomizationMenus()
- {
- 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);
- }
- private void refreshShiftClickCustomizationMenus()
- {
- removeShiftClickCustomizationMenus();
- if (configuringShiftClick)
- {
- menuManager.addManagedCustomMenu(FIXED_INVENTORY_TAB_SAVE);
- menuManager.addManagedCustomMenu(RESIZABLE_BOTTOM_LINE_INVENTORY_TAB_SAVE);
- menuManager.addManagedCustomMenu(RESIZABLE_INVENTORY_TAB_SAVE);
- }
- else
- {
- menuManager.addManagedCustomMenu(FIXED_INVENTORY_TAB_CONFIGURE);
- menuManager.addManagedCustomMenu(RESIZABLE_BOTTOM_LINE_INVENTORY_TAB_CONFIGURE);
- menuManager.addManagedCustomMenu(RESIZABLE_INVENTORY_TAB_CONFIGURE);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement