diff --git a/README.md b/README.md index 3243bdad..8ba433b6 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,7 @@ Sailing quality-of-life for charting, navigation, facilities, and more. ## Menu Entry Swaps - Sails At Helm Only: Deprioritizes sail interaction options when you’re not at the helm. - Prioritize Cargo Hold: Prioritizes clicking the Cargo Hold over nearby objects to make it easier to open. +- Lock to Helm During Trials: Deprioritizes non-movement facilities while sailing through Barracuda Trials. ## Sea Charting - Highlight Sea Charting Locations: Highlights nearby chartable locations. diff --git a/src/main/java/com/duckblade/osrs/sailing/SailingConfig.java b/src/main/java/com/duckblade/osrs/sailing/SailingConfig.java index 25968c9f..0a455ad6 100644 --- a/src/main/java/com/duckblade/osrs/sailing/SailingConfig.java +++ b/src/main/java/com/duckblade/osrs/sailing/SailingConfig.java @@ -1,6 +1,9 @@ package com.duckblade.osrs.sailing; import java.awt.Color; +import java.util.Set; + +import com.duckblade.osrs.sailing.features.barracudatrials.locktohelm.LockToHelmFilter; import net.runelite.client.config.Alpha; import net.runelite.client.config.Config; import net.runelite.client.config.ConfigGroup; @@ -443,18 +446,6 @@ default boolean prioritizeCargoHold() return true; } - @ConfigItem( - keyName = "hideStopNavigatingDuringTrials", - name = "Deprio Stop-navigating During BT", - description = "Deprioritizes the 'Stop-navigating' and 'Escape' option while you are in a Barracuda Trial.", - section = SECTION_MES, - position = 3 - ) - default boolean hideStopNavigatingDuringTrials() - { - return true; - } - enum ShowChartsMode { NONE, @@ -587,12 +578,26 @@ default boolean chartingMermaidSolver() return true; } + String LOCK_PLAYER_TO_HELM = "lockToHelmDuringTrials"; + @ConfigItem( + keyName = LOCK_PLAYER_TO_HELM, + name = "Lock to Helm", + description = "Hides actions unrelated to the trial or selected movement facilities. " + + "Selecting \"Disabled\" turns this feature off.", + section = SECTION_BARRACUDA_TRIALS, + position = 1 + ) + default Set lockToHelmFilter() + { + return Set.of(LockToHelmFilter.WIND_GALE_CATCHER, LockToHelmFilter.CRYSTAL_EXTRACTOR); + } + @ConfigItem( keyName = "barracudaHighlightLostCrates", name = "Highlight Crates", description = "Highlight lost crates that need to be collected during Barracuda Trials.", section = SECTION_BARRACUDA_TRIALS, - position = 1 + position = 2 ) default boolean barracudaHighlightLostCrates() { @@ -604,7 +609,7 @@ default boolean barracudaHighlightLostCrates() name = "Crate Colour", description = "The colour to highlight lost crates.", section = SECTION_BARRACUDA_TRIALS, - position = 2 + position = 3 ) @Alpha default Color barracudaHighlightLostCratesColour() @@ -617,7 +622,7 @@ default Color barracudaHighlightLostCratesColour() name = "Hide Portal Transitions", description = "Hide the transition animation when taking a portal in The Gwenith Glide.", section = SECTION_BARRACUDA_TRIALS, - position = 3 + position = 4 ) default boolean barracudaHidePortalTransitions() { @@ -629,7 +634,7 @@ default boolean barracudaHidePortalTransitions() name = "TT: Show Rum Target", description = "Show whether you have rum/need to drop-off rum in the Tempor Tantrum course.", section = SECTION_BARRACUDA_TRIALS, - position = 4 + position = 5 ) default boolean barracudaTemporTantrumShowRumTarget() { @@ -641,7 +646,7 @@ default boolean barracudaTemporTantrumShowRumTarget() name = "JJ: Show Toady Targets", description = "Show which outcrops need toadies thrown at them in the Jubbly Jive course.", section = SECTION_BARRACUDA_TRIALS, - position = 5 + position = 6 ) default boolean barracudaJubblyJiveShowToadyTargets() { @@ -653,7 +658,7 @@ default boolean barracudaJubblyJiveShowToadyTargets() name = "Splits Chat Message", description = "Post Barracuda Trials split times to chat.", section = SECTION_BARRACUDA_TRIALS, - position = 6 + position = 7 ) default boolean barracudaSplitsChatMessage() { @@ -665,7 +670,7 @@ default boolean barracudaSplitsChatMessage() name = "Splits Overlay Panel", description = "Show an overlay panel with Barracuda Trials split times.", section = SECTION_BARRACUDA_TRIALS, - position = 7 + position = 8 ) default boolean barracudaSplitsOverlayPanel() { diff --git a/src/main/java/com/duckblade/osrs/sailing/features/barracudatrials/locktohelm/LockToHelmDuringTrials.java b/src/main/java/com/duckblade/osrs/sailing/features/barracudatrials/locktohelm/LockToHelmDuringTrials.java new file mode 100644 index 00000000..e230fd65 --- /dev/null +++ b/src/main/java/com/duckblade/osrs/sailing/features/barracudatrials/locktohelm/LockToHelmDuringTrials.java @@ -0,0 +1,102 @@ +package com.duckblade.osrs.sailing.features.barracudatrials.locktohelm; + +import com.duckblade.osrs.sailing.SailingConfig; +import com.duckblade.osrs.sailing.features.util.SailingUtil; +import com.duckblade.osrs.sailing.model.BarracudaTrialTier; +import com.duckblade.osrs.sailing.model.SailTier; +import com.duckblade.osrs.sailing.model.WindFacilityTier; +import com.duckblade.osrs.sailing.module.PluginLifecycleComponent; +import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Client; +import net.runelite.api.MenuAction; +import net.runelite.api.events.MenuEntryAdded; +import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.events.ConfigChanged; +import java.util.Arrays; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import javax.inject.Inject; +import javax.inject.Singleton; + +@Slf4j +@Singleton +public class LockToHelmDuringTrials + implements PluginLifecycleComponent +{ + + private final Client client; + private final SailingConfig config; + private Set clickableObjects; + private Set lockToHelmFilters; + + @Inject + public LockToHelmDuringTrials(Client client, SailingConfig config) + { + this.client = client; + this.config = config; + this.lockToHelmFilters = config.lockToHelmFilter(); + this.clickableObjects = reloadClickableObjects(); + } + + private Set reloadClickableObjects() + { + return Stream.of( + Arrays.stream(BarracudaTrialTier.values()) + .map(BarracudaTrialTier::getGameObjectIds) + .flatMapToInt(Arrays::stream), + Arrays.stream(SailTier.values()) + .map(SailTier::getGameObjectIds) + .flatMapToInt(Arrays::stream), + Arrays.stream(WindFacilityTier.getWindFacilityObjectIDs(WindFacilityTier.WIND_CATCHER, WindFacilityTier.GALE_CATCHER)) + .filter(s -> lockToHelmFilters.contains(LockToHelmFilter.WIND_GALE_CATCHER)), + Arrays.stream(WindFacilityTier.CRYSTAL_EXTRACTOR.getGameObjectIds()) + .filter(s -> lockToHelmFilters.contains(LockToHelmFilter.CRYSTAL_EXTRACTOR)) + ) + .flatMapToInt(s -> s) + .boxed() + .collect(Collectors.toUnmodifiableSet()); + } + + @Subscribe + public void onConfigChanged(ConfigChanged e) + { + if (isEnabled(config) && SailingConfig.LOCK_PLAYER_TO_HELM.equals(e.getKey())) + { + log.info("{}: {} -> {}", e.getKey(), e.getOldValue(), e.getNewValue()); + lockToHelmFilters = config.lockToHelmFilter(); + clickableObjects = reloadClickableObjects(); + } + } + + @Subscribe(priority = -99) + public void onMenuEntryAdded(MenuEntryAdded e) + { + if (!SailingUtil.isInBarracudaTrialAndAtHelm(client)) + { + return; + } + + if (e.getMenuEntry().getType() != MenuAction.SET_HEADING) + { + if (!clickableObjects.contains(e.getIdentifier())) + { + e.getMenuEntry().setDeprioritized(true); + } + } + } + + @Override + public boolean isEnabled(SailingConfig config) + { + return !config.lockToHelmFilter().contains(LockToHelmFilter.DISABLED); + } + + @Override + public void startUp() + { + lockToHelmFilters = config.lockToHelmFilter(); + clickableObjects = reloadClickableObjects(); + log.info("{}: {}", this.getClass().getSimpleName(), lockToHelmFilters); + } +} diff --git a/src/main/java/com/duckblade/osrs/sailing/features/barracudatrials/locktohelm/LockToHelmFilter.java b/src/main/java/com/duckblade/osrs/sailing/features/barracudatrials/locktohelm/LockToHelmFilter.java new file mode 100644 index 00000000..1695a4f9 --- /dev/null +++ b/src/main/java/com/duckblade/osrs/sailing/features/barracudatrials/locktohelm/LockToHelmFilter.java @@ -0,0 +1,39 @@ +package com.duckblade.osrs.sailing.features.barracudatrials.locktohelm; + +import com.duckblade.osrs.sailing.model.WindFacilityTier; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public enum LockToHelmFilter +{ + DISABLED(new int[] {}) + { + @Override + public final String toString() + { + return "Disabled"; + } + }, + + WIND_GALE_CATCHER(WindFacilityTier.getWindFacilityObjectIDs(WindFacilityTier.WIND_CATCHER, WindFacilityTier.GALE_CATCHER)) + { + @Override + public final String toString() + { + return "Wind/Gale Catcher"; + } + }, + + CRYSTAL_EXTRACTOR(WindFacilityTier.CRYSTAL_EXTRACTOR.getGameObjectIds()) + { + @Override + public String toString() + { + return "Crystal Extractor"; + } + }; + + @Getter + private final int[] facility; +} \ No newline at end of file diff --git a/src/main/java/com/duckblade/osrs/sailing/features/mes/HideStopNavigatingDuringTrials.java b/src/main/java/com/duckblade/osrs/sailing/features/mes/HideStopNavigatingDuringTrials.java deleted file mode 100644 index 79315bf8..00000000 --- a/src/main/java/com/duckblade/osrs/sailing/features/mes/HideStopNavigatingDuringTrials.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.duckblade.osrs.sailing.features.mes; - -import com.duckblade.osrs.sailing.SailingConfig; -import com.duckblade.osrs.sailing.module.PluginLifecycleComponent; -import javax.inject.Inject; -import javax.inject.Singleton; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import net.runelite.api.Client; -import net.runelite.api.events.MenuEntryAdded; -import net.runelite.api.gameval.VarbitID; -import net.runelite.client.eventbus.Subscribe; - -@Slf4j -@Singleton -@RequiredArgsConstructor(onConstructor_ = @Inject) -public class HideStopNavigatingDuringTrials implements PluginLifecycleComponent -{ - - private static final String OPTION_STOP_NAVIGATING = "Stop-navigating"; - private static final String OPTION_ESCAPE = "Escape"; - - private final Client client; - - @Override - public boolean isEnabled(SailingConfig config) - { - return config.hideStopNavigatingDuringTrials(); - } - - @Subscribe - public void onMenuEntryAdded(MenuEntryAdded e) - { - if (client.getVarbitValue(VarbitID.SAILING_BT_IN_TRIAL) == 0) - { - return; - } - - if (OPTION_STOP_NAVIGATING.equals(e.getOption()) || - OPTION_ESCAPE.equals(e.getOption())) - { - // Push the Stop-navigating option down instead of removing it - e.getMenuEntry().setDeprioritized(true); - } - } -} diff --git a/src/main/java/com/duckblade/osrs/sailing/features/util/SailingUtil.java b/src/main/java/com/duckblade/osrs/sailing/features/util/SailingUtil.java index b86f7982..f62c9629 100644 --- a/src/main/java/com/duckblade/osrs/sailing/features/util/SailingUtil.java +++ b/src/main/java/com/duckblade/osrs/sailing/features/util/SailingUtil.java @@ -25,6 +25,7 @@ public class SailingUtil 3 // 3? confirm sloop? ); public static final int ACCOUNT_TYPE_UIM = 2; + public static final int SAILING_BOAT_FACILITY_LOCKEDIN_HELM = 3; @SuppressWarnings("BooleanMethodIsAlwaysInverted") public static boolean isSailing(Client client) @@ -33,6 +34,13 @@ public static boolean isSailing(Client client) !client.getLocalPlayer().getWorldView().isTopLevel(); } + public static boolean isInBarracudaTrialAndAtHelm(Client client) + { + return isSailing(client) + && client.getVarbitValue(VarbitID.SAILING_BT_IN_TRIAL) > 0 + && client.getVarbitValue(VarbitID.SAILING_BOAT_FACILITY_LOCKEDIN) == SAILING_BOAT_FACILITY_LOCKEDIN_HELM; + } + public static boolean isUim(Client client) { return client.getVarbitValue(VarbitID.IRONMAN) == ACCOUNT_TYPE_UIM; diff --git a/src/main/java/com/duckblade/osrs/sailing/model/BarracudaTrialTier.java b/src/main/java/com/duckblade/osrs/sailing/model/BarracudaTrialTier.java new file mode 100644 index 00000000..625db19b --- /dev/null +++ b/src/main/java/com/duckblade/osrs/sailing/model/BarracudaTrialTier.java @@ -0,0 +1,47 @@ +package com.duckblade.osrs.sailing.model; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import net.runelite.api.gameval.NpcID; +import net.runelite.api.gameval.ObjectID; + +@RequiredArgsConstructor +@Getter +public enum BarracudaTrialTier +{ + + TEMPOR_TANTRUM( + new int[]{ + ObjectID.SAILING_BT_SCOREBOARD_TEMPOR_TANTRUM, + ObjectID.SAILING_BT_TEMPOR_TANTRUM_NORTH_LOC_PARENT, + ObjectID.SAILING_BT_TEMPOR_TANTRUM_SOUTH_LOC_PARENT, + } + ), + JUBBLY_JIVE( + new int[]{ + ObjectID.SAILING_BT_SCOREBOARD_JUBBLY_JIVE, + ObjectID.SAILING_BT_JUBBLY_JIVE_TOAD_SUPPLIES_PARENT, + ObjectID.SAILING_BT_JUBBLY_JIVE_PILLAR_CLICKBOX_0_PARENT, + ObjectID.SAILING_BT_JUBBLY_JIVE_PILLAR_CLICKBOX_1_PARENT, + ObjectID.SAILING_BT_JUBBLY_JIVE_PILLAR_CLICKBOX_2_PARENT, + ObjectID.SAILING_BT_JUBBLY_JIVE_PILLAR_CLICKBOX_3_PARENT, + ObjectID.SAILING_BT_JUBBLY_JIVE_PILLAR_CLICKBOX_4_PARENT, + ObjectID.SAILING_BT_JUBBLY_JIVE_PILLAR_CLICKBOX_5_PARENT, + ObjectID.SAILING_BT_JUBBLY_JIVE_PILLAR_CLICKBOX_6_PARENT, + ObjectID.SAILING_BT_JUBBLY_JIVE_PILLAR_CLICKBOX_7_PARENT, + } + ), + GWENITH_GLIDE( + new int[]{ + ObjectID.SAILING_BT_SCOREBOARD_GWENITH_GLIDE, + ObjectID.SAILING_BOAT_STEERING_KANDARIN_1X3_CRYSTALLISED, + ObjectID.SAILING_BOAT_STEERING_KANDARIN_2X5_CRYSTALLISED, + ObjectID.SAILING_BOAT_STEERING_KANDARIN_3X8_CRYSTALLISED, + NpcID.SAILING_BT_GWENITH_GLIDE_CRYSTAL_STEERING_HEADBAR_NPC + } + ), + ; + + private final int[] gameObjectIds; + +} diff --git a/src/main/java/com/duckblade/osrs/sailing/model/WindFacilityTier.java b/src/main/java/com/duckblade/osrs/sailing/model/WindFacilityTier.java new file mode 100644 index 00000000..5d5088f4 --- /dev/null +++ b/src/main/java/com/duckblade/osrs/sailing/model/WindFacilityTier.java @@ -0,0 +1,44 @@ +package com.duckblade.osrs.sailing.model; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import net.runelite.api.gameval.ObjectID; +import java.util.Arrays; + +@RequiredArgsConstructor +@Getter +public enum WindFacilityTier +{ + + WIND_CATCHER( + new int[]{ + ObjectID.SAILING_WIND_CATCHER_ACTIVATED, + ObjectID.SAILING_WIND_CATCHER_DEACTIVATED + } + ), + + GALE_CATCHER( + new int[]{ + ObjectID.SAILING_GALE_CATCHER_ACTIVATED, + ObjectID.SAILING_GALE_CATCHER_DEACTIVATED + } + ), + + CRYSTAL_EXTRACTOR( + new int[]{ + ObjectID.SAILING_CRYSTAL_EXTRACTOR_ACTIVATED, + ObjectID.SAILING_CRYSTAL_EXTRACTOR_DEACTIVATED + } + ); + + private final int[] gameObjectIds; + + public static int[] getWindFacilityObjectIDs(WindFacilityTier... facilities) + { + return Arrays.stream(facilities) + .map(WindFacilityTier::getGameObjectIds) + .flatMapToInt(Arrays::stream) + .toArray(); + } + +} diff --git a/src/main/java/com/duckblade/osrs/sailing/module/SailingModule.java b/src/main/java/com/duckblade/osrs/sailing/module/SailingModule.java index f60bbf5b..a884aa66 100644 --- a/src/main/java/com/duckblade/osrs/sailing/module/SailingModule.java +++ b/src/main/java/com/duckblade/osrs/sailing/module/SailingModule.java @@ -5,6 +5,7 @@ import com.duckblade.osrs.sailing.features.barracudatrials.JubblyJiveHelper; import com.duckblade.osrs.sailing.features.barracudatrials.LostCargoHighlighter; import com.duckblade.osrs.sailing.features.barracudatrials.TemporTantrumHelper; +import com.duckblade.osrs.sailing.features.barracudatrials.locktohelm.LockToHelmDuringTrials; import com.duckblade.osrs.sailing.features.barracudatrials.splits.BarracudaSplitsChatMessage; import com.duckblade.osrs.sailing.features.barracudatrials.splits.BarracudaSplitsFileWriter; import com.duckblade.osrs.sailing.features.barracudatrials.splits.BarracudaSplitsOverlayPanel; @@ -25,7 +26,6 @@ import com.duckblade.osrs.sailing.features.facilities.LuffOverlay; import com.duckblade.osrs.sailing.features.facilities.SpeedBoostInfoBox; import com.duckblade.osrs.sailing.features.mes.DeprioSailsOffHelm; -import com.duckblade.osrs.sailing.features.mes.HideStopNavigatingDuringTrials; import com.duckblade.osrs.sailing.features.mes.PrioritizeCargoHold; import com.duckblade.osrs.sailing.features.navigation.LightningCloudsOverlay; import com.duckblade.osrs.sailing.features.navigation.LowHPNotification; @@ -83,9 +83,9 @@ Set lifecycleComponents( DeprioSailsOffHelm deprioSailsOffHelm, GiantClam giantClam, HidePortalTransitions hidePortalTransitions, - HideStopNavigatingDuringTrials hideStopNavigatingDuringTrials, JubblyJiveHelper jubblyJiveHelper, LightningCloudsOverlay lightningCloudsOverlay, + LockToHelmDuringTrials lockToHelmDuringTrials, LostCargoHighlighter lostCargoHighlighter, LostShipment lostShipment, LowHPNotification lowHPNotification, @@ -127,9 +127,9 @@ Set lifecycleComponents( .add(deprioSailsOffHelm) .add(giantClam) .add(hidePortalTransitions) - .add(hideStopNavigatingDuringTrials) .add(jubblyJiveHelper) .add(lightningCloudsOverlay) + .add(lockToHelmDuringTrials) .add(lostCargoHighlighter) .add(lostShipment) .add(lowHPNotification)