menu swapper: add npc walk here swap
This commit is contained in:
@@ -41,6 +41,7 @@ import java.util.Collection;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.function.Consumer;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
@@ -100,6 +101,7 @@ public class MenuEntrySwapperPlugin extends Plugin
|
|||||||
private static final String ITEM_KEY_PREFIX = "item_";
|
private static final String ITEM_KEY_PREFIX = "item_";
|
||||||
private static final String OBJECT_KEY_PREFIX = "object_";
|
private static final String OBJECT_KEY_PREFIX = "object_";
|
||||||
private static final String NPC_KEY_PREFIX = "npc_";
|
private static final String NPC_KEY_PREFIX = "npc_";
|
||||||
|
private static final String NPC_SHIFT_KEY_PREFIX = "npc_shift_";
|
||||||
|
|
||||||
// Shift click
|
// Shift click
|
||||||
private static final WidgetMenuOption FIXED_INVENTORY_TAB_CONFIGURE_SC = new WidgetMenuOption(CONFIGURE,
|
private static final WidgetMenuOption FIXED_INVENTORY_TAB_CONFIGURE_SC = new WidgetMenuOption(CONFIGURE,
|
||||||
@@ -702,6 +704,26 @@ public class MenuEntrySwapperPlugin extends Plugin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Consumer<MenuEntry> walkHereConsumer(boolean shift, NPCComposition composition)
|
||||||
|
{
|
||||||
|
return e ->
|
||||||
|
{
|
||||||
|
final String message = new ChatMessageBuilder()
|
||||||
|
.append("The default ").append(shift ? "shift" : "left").append(" click option for '").append(Text.removeTags(composition.getName())).append("' ")
|
||||||
|
.append("has been set to Walk here.")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
chatMessageManager.queue(QueuedMessage.builder()
|
||||||
|
.type(ChatMessageType.CONSOLE)
|
||||||
|
.runeLiteFormattedMessage(message)
|
||||||
|
.build());
|
||||||
|
|
||||||
|
log.debug("Set npc {} click swap for {} to Walk here", shift ? "shift" : "left", composition.getId());
|
||||||
|
|
||||||
|
setNpcSwapConfig(shift, composition.getId(), -1);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
private void configureNpcClick(MenuOpened event)
|
private void configureNpcClick(MenuOpened event)
|
||||||
{
|
{
|
||||||
if (!shiftModifier() || !config.npcLeftClickCustomization())
|
if (!shiftModifier() || !config.npcLeftClickCustomization())
|
||||||
@@ -722,16 +744,17 @@ public class MenuEntrySwapperPlugin extends Plugin
|
|||||||
final NPCComposition composition = npc.getTransformedComposition();
|
final NPCComposition composition = npc.getTransformedComposition();
|
||||||
final String[] actions = composition.getActions();
|
final String[] actions = composition.getActions();
|
||||||
|
|
||||||
final Integer swapConfig = getNpcSwapConfig(composition.getId());
|
final Integer swapConfig = getNpcSwapConfig(false, composition.getId());
|
||||||
final boolean hasAttack = Arrays.stream(composition.getActions()).anyMatch("Attack"::equalsIgnoreCase);
|
final boolean hasAttack = Arrays.stream(composition.getActions()).anyMatch("Attack"::equalsIgnoreCase);
|
||||||
final MenuAction currentAction = swapConfig != null ? NPC_MENU_TYPES.get(swapConfig) :
|
final MenuAction currentAction = swapConfig == null ?
|
||||||
// Attackable NPCs always have Attack as the first, last (deprioritized), or when hidden, no, option.
|
// Attackable NPCs always have Attack as the first, last (deprioritized), or when hidden, no, option.
|
||||||
// Due to this the default action would be either Attack or the first non-Attack option, based on
|
// Due to this the default action would be either Attack or the first non-Attack option, based on
|
||||||
// the game settings. Since it may be valid to swap an option up to override Attack, even when Attack
|
// the game settings. Since it may be valid to swap an option up to override Attack, even when Attack
|
||||||
// is left-click, we cannot assume any default currentAction on attackable NPCs.
|
// is left-click, we cannot assume any default currentAction on attackable NPCs.
|
||||||
// Non-attackable NPCS have a predictable default action which we can prevent a swap to if no swap
|
// Non-attackable NPCS have a predictable default action which we can prevent a swap to if no swap
|
||||||
// config is set, which just avoids showing a Swap option on a 1-op NPC, which looks odd.
|
// config is set, which just avoids showing a Swap option on a 1-op NPC, which looks odd.
|
||||||
(hasAttack ? null : defaultAction(composition));
|
(hasAttack ? null : defaultAction(composition)) :
|
||||||
|
(swapConfig == -1 ? MenuAction.WALK : NPC_MENU_TYPES.get(swapConfig));
|
||||||
|
|
||||||
for (int actionIdx = 0; actionIdx < NPC_MENU_TYPES.size(); ++actionIdx)
|
for (int actionIdx = 0; actionIdx < NPC_MENU_TYPES.size(); ++actionIdx)
|
||||||
{
|
{
|
||||||
@@ -775,11 +798,24 @@ public class MenuEntrySwapperPlugin extends Plugin
|
|||||||
|
|
||||||
log.debug("Set npc swap for {} to {}", composition.getId(), menuAction);
|
log.debug("Set npc swap for {} to {}", composition.getId(), menuAction);
|
||||||
|
|
||||||
setNpcSwapConfig(composition.getId(), menuIdx);
|
setNpcSwapConfig(false, composition.getId(), menuIdx);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (getNpcSwapConfig(composition.getId()) != null)
|
// Walk here swap
|
||||||
|
client.createMenuEntry(idx)
|
||||||
|
.setOption("Swap left click Walk here")
|
||||||
|
.setTarget(entry.getTarget())
|
||||||
|
.setType(MenuAction.RUNELITE)
|
||||||
|
.onClick(walkHereConsumer(false, composition));
|
||||||
|
|
||||||
|
client.createMenuEntry(idx)
|
||||||
|
.setOption("Swap shift click Walk here")
|
||||||
|
.setTarget(entry.getTarget())
|
||||||
|
.setType(MenuAction.RUNELITE)
|
||||||
|
.onClick(walkHereConsumer(true, composition));
|
||||||
|
|
||||||
|
if (getNpcSwapConfig(true, composition.getId()) != null || getNpcSwapConfig(false, composition.getId()) != null)
|
||||||
{
|
{
|
||||||
// Reset
|
// Reset
|
||||||
client.createMenuEntry(idx)
|
client.createMenuEntry(idx)
|
||||||
@@ -789,8 +825,8 @@ public class MenuEntrySwapperPlugin extends Plugin
|
|||||||
.onClick(e ->
|
.onClick(e ->
|
||||||
{
|
{
|
||||||
final String message = new ChatMessageBuilder()
|
final String message = new ChatMessageBuilder()
|
||||||
.append("The default left click option for '").append(Text.removeTags(composition.getName())).append("' ")
|
.append("The default left and shift click options for '").append(Text.removeTags(composition.getName())).append("' ")
|
||||||
.append("has been reset.")
|
.append("have been reset.")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
chatMessageManager.queue(QueuedMessage.builder()
|
chatMessageManager.queue(QueuedMessage.builder()
|
||||||
@@ -799,7 +835,8 @@ public class MenuEntrySwapperPlugin extends Plugin
|
|||||||
.build());
|
.build());
|
||||||
|
|
||||||
log.debug("Unset npc swap for {}", composition.getId());
|
log.debug("Unset npc swap for {}", composition.getId());
|
||||||
unsetNpcSwapConfig(composition.getId());
|
unsetNpcSwapConfig(true, composition.getId());
|
||||||
|
unsetNpcSwapConfig(false, composition.getId());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -971,24 +1008,33 @@ public class MenuEntrySwapperPlugin extends Plugin
|
|||||||
assert npc != null;
|
assert npc != null;
|
||||||
final NPCComposition composition = npc.getTransformedComposition();
|
final NPCComposition composition = npc.getTransformedComposition();
|
||||||
|
|
||||||
Integer customOption = getNpcSwapConfig(composition.getId());
|
Integer customOption = getNpcSwapConfig(shiftModifier(), composition.getId());
|
||||||
if (customOption != null)
|
if (customOption != null)
|
||||||
{
|
{
|
||||||
MenuAction swapAction = NPC_MENU_TYPES.get(customOption);
|
// Walk here swap
|
||||||
if (swapAction == menuAction)
|
if (customOption == -1)
|
||||||
{
|
{
|
||||||
// Advance to the top-most op for this NPC. Normally menuEntries.length - 1 is examine, and swapping
|
// we can achieve this by just deprioritizing the normal npc menus
|
||||||
// with that works due to it being sorted later, but if other plugins like NPC indicators add additional
|
menuEntry.setDeprioritized(true);
|
||||||
// menus before examine that are also >1000, like RUNELITE menus, that would result in the >1000 menus being
|
}
|
||||||
// reordered relative to each other.
|
else
|
||||||
int i = index;
|
{
|
||||||
while (i < menuEntries.length - 1 && NPC_MENU_TYPES.contains(menuEntries[i + 1].getType()))
|
MenuAction swapAction = NPC_MENU_TYPES.get(customOption);
|
||||||
|
if (swapAction == menuAction)
|
||||||
{
|
{
|
||||||
++i;
|
// Advance to the top-most op for this NPC. Normally menuEntries.length - 1 is examine, and swapping
|
||||||
}
|
// with that works due to it being sorted later, but if other plugins like NPC indicators add additional
|
||||||
|
// menus before examine that are also >1000, like RUNELITE menus, that would result in the >1000 menus being
|
||||||
|
// reordered relative to each other.
|
||||||
|
int i = index;
|
||||||
|
while (i < menuEntries.length - 1 && NPC_MENU_TYPES.contains(menuEntries[i + 1].getType()))
|
||||||
|
{
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
|
||||||
swap(optionIndexes, menuEntries, index, i);
|
swap(optionIndexes, menuEntries, index, i);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1315,9 +1361,10 @@ public class MenuEntrySwapperPlugin extends Plugin
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Integer getNpcSwapConfig(int npcId)
|
private Integer getNpcSwapConfig(boolean shift, int npcId)
|
||||||
{
|
{
|
||||||
String config = configManager.getConfiguration(MenuEntrySwapperConfig.GROUP, NPC_KEY_PREFIX + npcId);
|
String config = configManager.getConfiguration(MenuEntrySwapperConfig.GROUP,
|
||||||
|
(shift ? NPC_SHIFT_KEY_PREFIX : NPC_KEY_PREFIX) + npcId);
|
||||||
if (config == null || config.isEmpty())
|
if (config == null || config.isEmpty())
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
@@ -1326,14 +1373,14 @@ public class MenuEntrySwapperPlugin extends Plugin
|
|||||||
return Integer.parseInt(config);
|
return Integer.parseInt(config);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setNpcSwapConfig(int npcId, int index)
|
private void setNpcSwapConfig(boolean shift, int npcId, int index)
|
||||||
{
|
{
|
||||||
configManager.setConfiguration(MenuEntrySwapperConfig.GROUP, NPC_KEY_PREFIX + npcId, index);
|
configManager.setConfiguration(MenuEntrySwapperConfig.GROUP, (shift ? NPC_SHIFT_KEY_PREFIX : NPC_KEY_PREFIX) + npcId, index);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void unsetNpcSwapConfig(int npcId)
|
private void unsetNpcSwapConfig(boolean shift, int npcId)
|
||||||
{
|
{
|
||||||
configManager.unsetConfiguration(MenuEntrySwapperConfig.GROUP, NPC_KEY_PREFIX + npcId);
|
configManager.unsetConfiguration(MenuEntrySwapperConfig.GROUP, (shift ? NPC_SHIFT_KEY_PREFIX : NPC_KEY_PREFIX) + npcId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static MenuAction defaultAction(NPCComposition composition)
|
private static MenuAction defaultAction(NPCComposition composition)
|
||||||
|
|||||||
Reference in New Issue
Block a user