From 7854e18bcba8c94e34d47af2c92d1e33455e91ac Mon Sep 17 00:00:00 2001 From: Filip Ryblad Date: Thu, 28 Mar 2024 02:25:27 +0100 Subject: [PATCH] Option to activate boat mode by default --- .../sections/HighPrecisionOptionsPanel.java | 36 +++++++++++-------- .../preferences/NinjabrainBotPreferences.java | 2 ++ .../java/ninjabrainbot/model/ModelState.java | 2 +- .../actions/boat/ResetBoatStateAction.java | 25 +++++++++++++ .../model/datastate/DataState.java | 6 +++- .../highprecision/BoatDataState.java | 8 +++-- .../model/input/HotkeyInputHandler.java | 10 +++--- .../input/PlayerPositionInputHandler.java | 2 +- src/main/resources/lang/I18n.properties | 1 + 9 files changed, 69 insertions(+), 23 deletions(-) create mode 100644 src/main/java/ninjabrainbot/model/actions/boat/ResetBoatStateAction.java diff --git a/src/main/java/ninjabrainbot/gui/options/sections/HighPrecisionOptionsPanel.java b/src/main/java/ninjabrainbot/gui/options/sections/HighPrecisionOptionsPanel.java index bab5a6f6..7061f77b 100644 --- a/src/main/java/ninjabrainbot/gui/options/sections/HighPrecisionOptionsPanel.java +++ b/src/main/java/ninjabrainbot/gui/options/sections/HighPrecisionOptionsPanel.java @@ -7,6 +7,7 @@ import ninjabrainbot.event.DisposeHandler; import ninjabrainbot.gui.components.labels.ThemedLabel; +import ninjabrainbot.gui.components.layout.Divider; import ninjabrainbot.gui.components.layout.StackPanel; import ninjabrainbot.gui.components.preferences.CheckboxPanel; import ninjabrainbot.gui.components.preferences.DoublePreferencePanel; @@ -21,7 +22,8 @@ public class HighPrecisionOptionsPanel extends JPanel { - private final CheckboxPanel sensitivityCheckbox; + private final CheckboxPanel enableBoatMeasurementsCheckbox; + private final CheckboxPanel activateBoatOnResetCheckbox; private final FloatPreferencePanel resolutionHeight; private final DoublePreferencePanel sensitivity; private final FloatPreferencePanel boatErrorLimit; @@ -42,54 +44,60 @@ public int getTextSize(SizePreference p) { return p.TEXT_SIZE_SMALL; } }); - column1.add(new CheckboxPanel(styleManager, I18n.get("settings.tall_resolution"), preferences.useTallRes)); + JPanel tallResRow = new JPanel(new GridLayout(1, 2, 2 * OptionsFrame.PADDING, 0)); + tallResRow.setOpaque(false); + tallResRow.add(new CheckboxPanel(styleManager, I18n.get("settings.tall_resolution"), preferences.useTallRes)); resolutionHeight = new FloatPreferencePanel(styleManager, I18n.get("settings.resolution_height"), preferences.resolutionHeight); resolutionHeight.setDecimals(0); - resolutionHeight.setEnabled(preferences.useTallRes.get()); - column1.add(resolutionHeight); + tallResRow.add(resolutionHeight); + column1.add(tallResRow); // Precise Sens Column - sensitivityCheckbox = new CheckboxPanel(styleManager, I18n.get("settings.use_precise_angle"), preferences.usePreciseAngle); - sensitivityCheckbox.setEnabled(preferences.useTallRes.get()); - column1.add(sensitivityCheckbox); + column1.add(new Divider(styleManager)); + + enableBoatMeasurementsCheckbox = new CheckboxPanel(styleManager, I18n.get("settings.use_precise_angle"), preferences.usePreciseAngle); + column1.add(enableBoatMeasurementsCheckbox); sensitivity = new DoublePreferencePanel(styleManager, I18n.get("settings.sensitivity"), preferences.sensitivity); sensitivity.setWidth(150); sensitivity.setDecimals(10); - sensitivity.setEnabled(preferences.usePreciseAngle.get() && preferences.useTallRes.get()); column1.add(sensitivity); if (KeyboardListener.registered) { enterBoatHotkey = new HotkeyPanel(styleManager, I18n.get("settings.enter_boat"), preferences.hotkeyBoat); - enterBoatHotkey.setEnabled(preferences.usePreciseAngle.get() && preferences.useTallRes.get()); column1.add(enterBoatHotkey); } + activateBoatOnResetCheckbox = new CheckboxPanel(styleManager, I18n.get("settings.enter_boat_on_reset"), preferences.activateBoatOnReset); + column1.add(activateBoatOnResetCheckbox); + boatErrorLimit = new FloatPreferencePanel(styleManager, I18n.get("settings.boat_error"), preferences.boatErrorLimit); boatErrorLimit.setDecimals(2); - boatErrorLimit.setEnabled(preferences.usePreciseAngle.get() && preferences.useTallRes.get()); column1.add(boatErrorLimit); sigmaBoat = new FloatPreferencePanel(styleManager, I18n.get("settings.boat_standard_deviation"), preferences.sigmaBoat); - sigmaBoat.setEnabled(preferences.usePreciseAngle.get() && preferences.useTallRes.get()); column1.add(sigmaBoat); disposeHandler.add(preferences.useTallRes.whenModified().subscribeEDT(b -> setTallResolutionEnabled(b, preferences))); disposeHandler.add(preferences.usePreciseAngle.whenModified().subscribeEDT(this::setPreciseAngleEnabled)); disposeHandler.add(preferences.sigmaBoat.whenModified().subscribeEDT(sigmaBoat::updateValue)); + setTallResolutionEnabled(preferences.useTallRes.get(), preferences); } private void setTallResolutionEnabled(boolean b, NinjabrainBotPreferences preferences) { resolutionHeight.setEnabled(b); resolutionHeight.descLabel.updateColors(); - sensitivityCheckbox.setEnabled(b); - sensitivityCheckbox.descLabel.updateColors(); + enableBoatMeasurementsCheckbox.setEnabled(b); + enableBoatMeasurementsCheckbox.descLabel.updateColors(); setPreciseAngleEnabled(b && preferences.usePreciseAngle.get()); } private void setPreciseAngleEnabled(boolean b) { sensitivity.setEnabled(b); - enterBoatHotkey.setEnabled(b); + activateBoatOnResetCheckbox.setEnabled(b); + activateBoatOnResetCheckbox.descLabel.updateColors(); boatErrorLimit.setEnabled(b); sigmaBoat.setEnabled(b); + if (enterBoatHotkey != null) + enterBoatHotkey.setEnabled(b); } } diff --git a/src/main/java/ninjabrainbot/io/preferences/NinjabrainBotPreferences.java b/src/main/java/ninjabrainbot/io/preferences/NinjabrainBotPreferences.java index 3e30e538..21211a0e 100644 --- a/src/main/java/ninjabrainbot/io/preferences/NinjabrainBotPreferences.java +++ b/src/main/java/ninjabrainbot/io/preferences/NinjabrainBotPreferences.java @@ -54,6 +54,7 @@ public class NinjabrainBotPreferences { public final BooleanPreference colorCodeNegativeCoords; public final BooleanPreference useTallRes; public final BooleanPreference usePreciseAngle; + public final BooleanPreference activateBoatOnReset; public final BooleanPreference useOverlay; public final BooleanPreference overlayAutoHide; public final BooleanPreference overlayHideWhenLocked; @@ -115,6 +116,7 @@ public NinjabrainBotPreferences(IPreferenceSource source) { colorCodeNegativeCoords = new BooleanPreference("color_negative_coords", false, source); useTallRes = new BooleanPreference("use_tall_res", false, source); usePreciseAngle = new BooleanPreference("use_precise_angle", false, source); + activateBoatOnReset = new BooleanPreference("activate_boat_on_reset", false, source); useOverlay = new BooleanPreference("use_obs_overlay", false, source); overlayAutoHide = new BooleanPreference("overlay_auto_hide", false, source); overlayHideWhenLocked = new BooleanPreference("overlay_lock_hide", false, source); diff --git a/src/main/java/ninjabrainbot/model/ModelState.java b/src/main/java/ninjabrainbot/model/ModelState.java index 7b426a9a..1ccbd74e 100644 --- a/src/main/java/ninjabrainbot/model/ModelState.java +++ b/src/main/java/ninjabrainbot/model/ModelState.java @@ -26,7 +26,7 @@ public ModelState(NinjabrainBotPreferences preferences) { this.domainModel = domainModel; actionExecutor = new ActionExecutor(domainModel); environmentState = disposeHandler.add(new EnvironmentState(domainModel, preferences)); - dataState = disposeHandler.add(new DataState(domainModel, environmentState)); + dataState = disposeHandler.add(new DataState(domainModel, environmentState, preferences.activateBoatOnReset.get())); domainModel.finishInitialization(); } diff --git a/src/main/java/ninjabrainbot/model/actions/boat/ResetBoatStateAction.java b/src/main/java/ninjabrainbot/model/actions/boat/ResetBoatStateAction.java new file mode 100644 index 00000000..d9d409e4 --- /dev/null +++ b/src/main/java/ninjabrainbot/model/actions/boat/ResetBoatStateAction.java @@ -0,0 +1,25 @@ +package ninjabrainbot.model.actions.boat; + +import ninjabrainbot.model.actions.IAction; +import ninjabrainbot.model.datastate.IDataState; +import ninjabrainbot.model.datastate.highprecision.IBoatDataState; + +public class ResetBoatStateAction implements IAction { + + private final IDataState dataState; + + public ResetBoatStateAction(IDataState dataState) { + this.dataState = dataState; + } + + @Override + public void execute() { + if (dataState.locked().get()) + return; + + IBoatDataState boatDataState = dataState.boatDataState(); + boatDataState.enteringBoat().reset(); + boatDataState.boatState().reset(); + boatDataState.boatAngle().reset(); + } +} diff --git a/src/main/java/ninjabrainbot/model/datastate/DataState.java b/src/main/java/ninjabrainbot/model/datastate/DataState.java index 8c49a543..d3aad50b 100644 --- a/src/main/java/ninjabrainbot/model/datastate/DataState.java +++ b/src/main/java/ninjabrainbot/model/datastate/DataState.java @@ -43,6 +43,10 @@ public class DataState implements IDataState, IDisposable { private final DisposeHandler disposeHandler = new DisposeHandler(); public DataState(IDomainModel domainModel, IEnvironmentState environmentState) { + this(domainModel, environmentState, false); + } + + public DataState(IDomainModel domainModel, IEnvironmentState environmentState, boolean isBoatActivatedByDefault) { divineContext = disposeHandler.add(new DivineContext(domainModel)); throwSet = new ListComponent<>(domainModel, 10); playerPosition = new DataComponent<>(domainModel); @@ -50,7 +54,7 @@ public DataState(IDomainModel domainModel, IEnvironmentState environmentState) { calculatorManager = disposeHandler.add(new CalculatorManager(domainModel, environmentState, throwSet, playerPosition, divineContext)); allAdvancementsDataState = disposeHandler.add(new AllAdvancementsDataState(calculatorManager.topPrediction(), domainModel, environmentState)); - boatDataState = new BoatDataState(domainModel); + boatDataState = new BoatDataState(domainModel, isBoatActivatedByDefault); resultTypeProvider = disposeHandler.add(new ResultTypeProvider(this, domainModel)); } diff --git a/src/main/java/ninjabrainbot/model/datastate/highprecision/BoatDataState.java b/src/main/java/ninjabrainbot/model/datastate/highprecision/BoatDataState.java index 66a10569..6e2efbba 100644 --- a/src/main/java/ninjabrainbot/model/datastate/highprecision/BoatDataState.java +++ b/src/main/java/ninjabrainbot/model/datastate/highprecision/BoatDataState.java @@ -11,9 +11,13 @@ public class BoatDataState implements IBoatDataState { private final DataComponent boatState; public BoatDataState(IDomainModel domainModel) { - enteringBoat = new DataComponent<>(domainModel, false); + this(domainModel, false); + } + + public BoatDataState(IDomainModel domainModel, boolean isBoatActivatedByDefault) { + enteringBoat = new DataComponent<>(domainModel, isBoatActivatedByDefault); boatAngle = new DataComponent<>(domainModel); - boatState = new DataComponent<>(domainModel, BoatState.NONE); + boatState = new DataComponent<>(domainModel, isBoatActivatedByDefault ? BoatState.MEASURING : BoatState.NONE); } @Override diff --git a/src/main/java/ninjabrainbot/model/input/HotkeyInputHandler.java b/src/main/java/ninjabrainbot/model/input/HotkeyInputHandler.java index 7242fd26..255bad75 100644 --- a/src/main/java/ninjabrainbot/model/input/HotkeyInputHandler.java +++ b/src/main/java/ninjabrainbot/model/input/HotkeyInputHandler.java @@ -4,6 +4,7 @@ import ninjabrainbot.event.IDisposable; import ninjabrainbot.io.preferences.NinjabrainBotPreferences; import ninjabrainbot.model.actions.IActionExecutor; +import ninjabrainbot.model.actions.boat.ResetBoatStateAction; import ninjabrainbot.model.actions.boat.ToggleEnteringBoatAction; import ninjabrainbot.model.actions.common.ResetAction; import ninjabrainbot.model.actions.common.ToggleLockedAction; @@ -36,6 +37,7 @@ public HotkeyInputHandler(NinjabrainBotPreferences preferences, IDomainModel dom disposeHandler.add(preferences.hotkeyBoat.whenTriggered().subscribe(this::toggleEnteringBoatIfNotLocked)); disposeHandler.add(preferences.hotkeyLock.whenTriggered().subscribe(__ -> actionExecutor.executeImmediately(new ToggleLockedAction(dataState)))); disposeHandler.add(preferences.usePreciseAngle.whenModified().subscribe(this::resetBoatState)); + disposeHandler.add(preferences.useTallRes.whenModified().subscribe(this::resetBoatState)); } private void resetIfNotLocked() { @@ -64,13 +66,13 @@ private void toggleAltStdIfNotLocked() { } private void toggleEnteringBoatIfNotLocked() { - if (preferences.usePreciseAngle.get() && !dataState.locked().get() && !dataState.allAdvancementsDataState().allAdvancementsModeEnabled().get()) + if (preferences.useTallRes.get() && preferences.usePreciseAngle.get() && !dataState.locked().get() && !dataState.allAdvancementsDataState().allAdvancementsModeEnabled().get()) actionExecutor.executeImmediately(new ToggleEnteringBoatAction(dataState)); } - private void resetBoatState(){ - if (!preferences.usePreciseAngle.get() && dataState.boatDataState().enteringBoat().get()) - actionExecutor.executeImmediately(new ToggleEnteringBoatAction(dataState)); + private void resetBoatState() { + if (!(preferences.useTallRes.get() && preferences.usePreciseAngle.get())) + actionExecutor.executeImmediately(new ResetBoatStateAction(dataState)); } @Override diff --git a/src/main/java/ninjabrainbot/model/input/PlayerPositionInputHandler.java b/src/main/java/ninjabrainbot/model/input/PlayerPositionInputHandler.java index 27d986d5..f4ccb986 100644 --- a/src/main/java/ninjabrainbot/model/input/PlayerPositionInputHandler.java +++ b/src/main/java/ninjabrainbot/model/input/PlayerPositionInputHandler.java @@ -56,7 +56,7 @@ private IAction getActionForInputtedPlayerPosition(IDetailedPlayerPosition playe if (dataState.allAdvancementsDataState().allAdvancementsModeEnabled().get()) return new TryAddAllAdvancementsStructureAction(dataState, playerPosition); - if (dataState.boatDataState().enteringBoat().get()) + if (preferences.useTallRes.get() && preferences.usePreciseAngle.get() && dataState.boatDataState().enteringBoat().get()) return new SetBoatAngleAction(dataState.boatDataState(), playerPosition.horizontalAngle(), preferences); if (playerPosition.lookingBelowHorizon()) diff --git a/src/main/resources/lang/I18n.properties b/src/main/resources/lang/I18n.properties index affa1e1b..00b9b34d 100644 --- a/src/main/resources/lang/I18n.properties +++ b/src/main/resources/lang/I18n.properties @@ -60,6 +60,7 @@ settings.keyboard_shortcuts=Hotkeys settings.up_001_to_last_angle=Change the last angle by +0.01 settings.down_001_to_last_angle=Change the last angle by -0.01 settings.enter_boat=Indicate boat angle reset on next F3+C +settings.enter_boat_on_reset=Enter boat mode automatically after resetting (requires restart) settings.not_in_use=Not in use settings.overlay=OBS overlay settings.overlay_explanation=An image that looks identical to Ninjabrain Bot, but automatically hides when nothing is being shown. Add in OBS using an image source.