From 7a1f71ce139677cf64ecfc425424726c735e5292 Mon Sep 17 00:00:00 2001 From: VDPineapple <166444460+VDPineapple@users.noreply.github.com> Date: Sun, 18 Aug 2024 22:38:56 +0100 Subject: [PATCH 1/7] 1.21 All Advancements Support --- src/main/java/ninjabrainbot/gui/GUI.java | 4 +- .../gui/frames/ThemeEditorDialog.java | 5 +- .../alladvancements/AllAdvancementsPanel.java | 54 +++++++++-- .../alladvancements/StructurePanel.java | 7 +- .../gui/mainwindow/main/MainTextArea.java | 11 ++- .../sections/AllAdvancementsOptionsPanel.java | 7 ++ .../PreviewAllAdvancementsDataState.java | 20 +++++ .../panels/PreviewPlayerPosition.java | 5 ++ .../preferences/NinjabrainBotPreferences.java | 2 + .../TryAddAllAdvancementsStructureAction.java | 84 +++++++++++++++--- .../common/SetGeneralLocationAction.java | 22 +++++ .../AllAdvancementsDataState.java | 29 ++++++ .../IAllAdvancementsDataState.java | 8 ++ .../alladvancements/StructureType.java | 2 +- .../common/DetailedPlayerPosition.java | 20 +++-- .../datastate/common/IPlayerPosition.java | 2 + .../common/LimitedPlayerPosition.java | 5 ++ .../datastate/common/StructurePosition.java | 16 ++++ .../endereye/CoordinateInputSource.java | 24 ++++- .../model/datastate/endereye/F3CData.java | 19 ++-- .../model/datastate/endereye/MCDimension.java | 5 ++ .../input/GeneralLocationInputHandler.java | 37 ++++++++ .../input/IGeneralLocationInputSource.java | 13 +++ .../input/PlayerPositionInputHandler.java | 8 +- src/main/resources/city_query_icon.png | Bin 0 -> 1047 bytes src/main/resources/deep_dark_icon.png | Bin 0 -> 948 bytes src/main/resources/general_location_icon.png | Bin 0 -> 1073 bytes src/main/resources/lang/I18n.properties | 1 + src/main/resources/shulker_transport_icon.png | Bin 0 -> 799 bytes .../DataStateIntegrationTests.java | 6 +- ...NextDirectionProviderIntegrationTests.java | 3 +- .../RandomPlayerPositionProvider.java | 3 +- .../java/ninjabrainbot/util/TestUtils.java | 7 +- 33 files changed, 375 insertions(+), 54 deletions(-) create mode 100644 src/main/java/ninjabrainbot/model/actions/common/SetGeneralLocationAction.java create mode 100644 src/main/java/ninjabrainbot/model/datastate/endereye/MCDimension.java create mode 100644 src/main/java/ninjabrainbot/model/input/GeneralLocationInputHandler.java create mode 100644 src/main/java/ninjabrainbot/model/input/IGeneralLocationInputSource.java create mode 100644 src/main/resources/city_query_icon.png create mode 100644 src/main/resources/deep_dark_icon.png create mode 100644 src/main/resources/general_location_icon.png create mode 100644 src/main/resources/shulker_transport_icon.png diff --git a/src/main/java/ninjabrainbot/gui/GUI.java b/src/main/java/ninjabrainbot/gui/GUI.java index 1b297fe1..10c64046 100644 --- a/src/main/java/ninjabrainbot/gui/GUI.java +++ b/src/main/java/ninjabrainbot/gui/GUI.java @@ -34,6 +34,7 @@ import ninjabrainbot.model.input.ActiveInstanceInputHandler; import ninjabrainbot.model.input.ButtonInputHandler; import ninjabrainbot.model.input.FossilInputHandler; +import ninjabrainbot.model.input.GeneralLocationInputHandler; import ninjabrainbot.model.input.HotkeyInputHandler; import ninjabrainbot.model.input.IButtonInputHandler; import ninjabrainbot.model.input.PlayerPositionInputHandler; @@ -104,10 +105,11 @@ private void initModel() { private void initInputHandlers() { Progress.setTask("Initializing input handlers", 0.08f); - coordinateInputSource = disposeHandler.add(new CoordinateInputSource(clipboardReader)); + coordinateInputSource = disposeHandler.add(new CoordinateInputSource(clipboardReader, preferences)); IEnderEyeThrowFactory enderEyeThrowFactory = new EnderEyeThrowFactory(preferences, dataState.boatDataState()); disposeHandler.add(new PlayerPositionInputHandler(coordinateInputSource, dataState, actionExecutor, preferences, enderEyeThrowFactory)); disposeHandler.add(new FossilInputHandler(coordinateInputSource, dataState, actionExecutor)); + disposeHandler.add(new GeneralLocationInputHandler(coordinateInputSource, dataState, actionExecutor)); disposeHandler.add(new ActiveInstanceInputHandler(activeInstanceProvider, domainModel, dataState, environmentState, actionExecutor, preferences)); disposeHandler.add(new HotkeyInputHandler(preferences, domainModel, dataState, actionExecutor)); buttonInputHandler = new ButtonInputHandler(domainModel, dataState, actionExecutor); diff --git a/src/main/java/ninjabrainbot/gui/frames/ThemeEditorDialog.java b/src/main/java/ninjabrainbot/gui/frames/ThemeEditorDialog.java index a055726a..b1888607 100644 --- a/src/main/java/ninjabrainbot/gui/frames/ThemeEditorDialog.java +++ b/src/main/java/ninjabrainbot/gui/frames/ThemeEditorDialog.java @@ -47,6 +47,7 @@ import ninjabrainbot.model.datastate.divine.Fossil; import ninjabrainbot.model.datastate.endereye.IEnderEyeThrow; import ninjabrainbot.model.datastate.endereye.NormalEnderEyeThrow; +import ninjabrainbot.model.datastate.endereye.MCDimension; import ninjabrainbot.model.information.InformationMessageList; import ninjabrainbot.util.Assert; import ninjabrainbot.util.I18n; @@ -171,8 +172,8 @@ private ThemedPanel createPreviewsPanel(StyleManager styleManager) { NinjabrainBotPreferences defaultPreferences = new NinjabrainBotPreferences(new UnsavedPreferences()); ArrayList eyeThrows = new ArrayList<>(); - IEnderEyeThrow t1 = new NormalEnderEyeThrow(new DetailedPlayerPosition(659.70, 80, 1950.30, -253.82, -31.75, false), 0).withCorrection(0.01); - IEnderEyeThrow t2 = new NormalEnderEyeThrow(new DetailedPlayerPosition(-3.75, 80, 2002.63, -184.67, -31.75, false), 0).withCorrection(-0.01).withToggledAltStd(); + IEnderEyeThrow t1 = new NormalEnderEyeThrow(new DetailedPlayerPosition(659.70, 80, 1950.30, -253.82, -31.75, MCDimension.OVERWORLD), 0).withCorrection(0.01); + IEnderEyeThrow t2 = new NormalEnderEyeThrow(new DetailedPlayerPosition(-3.75, 80, 2002.63, -184.67, -31.75, MCDimension.OVERWORLD), 0).withCorrection(-0.01).withToggledAltStd(); eyeThrows.add(t1); eyeThrows.add(t2); Fossil f = new Fossil(3); diff --git a/src/main/java/ninjabrainbot/gui/mainwindow/alladvancements/AllAdvancementsPanel.java b/src/main/java/ninjabrainbot/gui/mainwindow/alladvancements/AllAdvancementsPanel.java index df3ac261..f2df5c1f 100644 --- a/src/main/java/ninjabrainbot/gui/mainwindow/alladvancements/AllAdvancementsPanel.java +++ b/src/main/java/ninjabrainbot/gui/mainwindow/alladvancements/AllAdvancementsPanel.java @@ -1,31 +1,73 @@ package ninjabrainbot.gui.mainwindow.alladvancements; +import java.awt.Dimension; import java.util.Objects; +import java.util.ArrayList; import javax.swing.BoxLayout; import javax.swing.ImageIcon; import ninjabrainbot.Main; +import ninjabrainbot.event.IDisposable; +import ninjabrainbot.event.Subscription; import ninjabrainbot.model.datastate.alladvancements.IAllAdvancementsDataState; import ninjabrainbot.gui.components.panels.ThemedPanel; import ninjabrainbot.gui.style.StyleManager; +import ninjabrainbot.io.preferences.NinjabrainBotPreferences; import ninjabrainbot.model.input.IButtonInputHandler; -public class AllAdvancementsPanel extends ThemedPanel { +public class AllAdvancementsPanel extends ThemedPanel implements IDisposable { + private final NinjabrainBotPreferences preferences; private static final ImageIcon strongholdIcon = new ImageIcon(Objects.requireNonNull(Main.class.getResource("/stronghold_icon.png"))); private static final ImageIcon shulkerIcon = new ImageIcon(Objects.requireNonNull(Main.class.getResource("/spawn_icon.png"))); private static final ImageIcon outpostIcon = new ImageIcon(Objects.requireNonNull(Main.class.getResource("/outpost_icon.png"))); private static final ImageIcon monumentIcon = new ImageIcon(Objects.requireNonNull(Main.class.getResource("/monument_icon.png"))); + private static final ImageIcon deepDarkIcon = new ImageIcon(Objects.requireNonNull(Main.class.getResource("/deep_dark_icon.png"))); + private static final ImageIcon shulkerTransportIcon = new ImageIcon(Objects.requireNonNull(Main.class.getResource("/shulker_transport_icon.png"))); + private static final ImageIcon cityQueryIcon = new ImageIcon(Objects.requireNonNull(Main.class.getResource("/city_query_icon.png"))); + private static final ImageIcon generalLocationIcon = new ImageIcon(Objects.requireNonNull(Main.class.getResource("/general_location_icon.png"))); - public AllAdvancementsPanel(StyleManager styleManager, IButtonInputHandler buttonInputHandler, IAllAdvancementsDataState allAdvancementsDataState) { + private final ArrayList oneDotTwentyPlusPanels = new ArrayList<>(); + final Subscription generalLocationSubscription; + + public AllAdvancementsPanel(StyleManager styleManager, IButtonInputHandler buttonInputHandler, IAllAdvancementsDataState allAdvancementsDataState, NinjabrainBotPreferences preferences) { super(styleManager); setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); add(new AllAdvancementsHeader(styleManager)); - add(new StructurePanel(styleManager, buttonInputHandler, allAdvancementsDataState.strongholdPosition(), strongholdIcon, false, true)); - add(new StructurePanel(styleManager, buttonInputHandler, allAdvancementsDataState.spawnPosition(), shulkerIcon, true, true)); - add(new StructurePanel(styleManager, buttonInputHandler, allAdvancementsDataState.outpostPosition(), outpostIcon, true, true)); - add(new StructurePanel(styleManager, buttonInputHandler, allAdvancementsDataState.monumentPosition(), monumentIcon, true, false)); + add(new StructurePanel(styleManager, buttonInputHandler, allAdvancementsDataState.strongholdPosition(), strongholdIcon, false, true, true)); + add(new StructurePanel(styleManager, buttonInputHandler, allAdvancementsDataState.spawnPosition(), shulkerIcon, true, true, true)); + add(new StructurePanel(styleManager, buttonInputHandler, allAdvancementsDataState.outpostPosition(), outpostIcon, true, true, true)); + add(new StructurePanel(styleManager, buttonInputHandler, allAdvancementsDataState.monumentPosition(), monumentIcon, true, true, true)); + oneDotTwentyPlusPanels.add(new StructurePanel(styleManager, buttonInputHandler, allAdvancementsDataState.deepDarkPosition(), deepDarkIcon, true, true, true)); + oneDotTwentyPlusPanels.add(new StructurePanel(styleManager, buttonInputHandler, allAdvancementsDataState.shulkerTransportPosition(), shulkerTransportIcon, true, true, false)); + oneDotTwentyPlusPanels.add(new StructurePanel(styleManager, buttonInputHandler, allAdvancementsDataState.cityQueryPosition(), cityQueryIcon, true, true, false)); + oneDotTwentyPlusPanels.add(new StructurePanel(styleManager, buttonInputHandler, allAdvancementsDataState.generalLocationPosition(), generalLocationIcon, true, false, false)); + generalLocationSubscription = allAdvancementsDataState.generalLocationPosition().subscribeEDT(__ -> updateOneDotTwentyPlusAAEnabled()); + for (StructurePanel panel : oneDotTwentyPlusPanels) { + add(panel); + } + for (StructurePanel panel : oneDotTwentyPlusPanels) { + panel.setEnabled(preferences.oneDotTwentyPlusAA.get()); + panel.setVisible(preferences.oneDotTwentyPlusAA.get()); + } + this.preferences = preferences; + } + + public void updateOneDotTwentyPlusAAEnabled() { + // print contents of oneDotTwentyPlusPanels for debugging + + for (StructurePanel panel : oneDotTwentyPlusPanels) { + panel.setEnabled(preferences.oneDotTwentyPlusAA.get()); + panel.setVisible(preferences.oneDotTwentyPlusAA.get()); + } + + this.revalidate(); + this.repaint(); } + @Override + public void dispose() { + generalLocationSubscription.dispose(); + } } diff --git a/src/main/java/ninjabrainbot/gui/mainwindow/alladvancements/StructurePanel.java b/src/main/java/ninjabrainbot/gui/mainwindow/alladvancements/StructurePanel.java index ca653a36..8250599d 100644 --- a/src/main/java/ninjabrainbot/gui/mainwindow/alladvancements/StructurePanel.java +++ b/src/main/java/ninjabrainbot/gui/mainwindow/alladvancements/StructurePanel.java @@ -23,13 +23,14 @@ public class StructurePanel extends ThemedPanel implements IDisposable { final ThemedLabel nether; final ThemedLabel angle; + private final boolean showNether; private final boolean showBorder; private final WrappedColor borderColor; private final DisposeHandler disposeHandler = new DisposeHandler(); private Subscription angleSubscription; - public StructurePanel(StyleManager styleManager, IButtonInputHandler buttonInputHandler, IObservable structurePosition, ImageIcon icon, boolean addDeleteButton, boolean showBorder) { + public StructurePanel(StyleManager styleManager, IButtonInputHandler buttonInputHandler, IObservable structurePosition, ImageIcon icon, boolean addDeleteButton, boolean showBorder, boolean showNether) { super(styleManager); setOpaque(true); ThemedLabel iconLabel = new ThemedLabel(styleManager, true); @@ -53,6 +54,7 @@ public StructurePanel(StyleManager styleManager, IButtonInputHandler buttonInput add(angle); add(deleteButton); + this.showNether = showNether; this.showBorder = showBorder; borderColor = styleManager.currentTheme.COLOR_DIVIDER; setBackgroundColor(styleManager.currentTheme.COLOR_SLIGHTLY_WEAK); @@ -75,8 +77,9 @@ private RemoveStructureButton createDeleteButton(StyleManager styleManager, IObs public void onStructurePositionUpdated(StructurePosition structurePosition) { if (structurePosition != null) { location.setText(String.format("(%.0f, %.0f)", structurePosition.xInOverworld(), structurePosition.zInOverworld())); - nether.setText(String.format("(%.0f, %.0f)", structurePosition.xInNether(), structurePosition.zInNether())); angle.setText(String.format("%.1f", structurePosition.getTravelAngle())); + if (showNether) + nether.setText(String.format("(%.0f, %.0f)", structurePosition.xInNether(), structurePosition.zInNether())); } else { location.setText(""); nether.setText(""); diff --git a/src/main/java/ninjabrainbot/gui/mainwindow/main/MainTextArea.java b/src/main/java/ninjabrainbot/gui/mainwindow/main/MainTextArea.java index 6c607b84..bb654387 100644 --- a/src/main/java/ninjabrainbot/gui/mainwindow/main/MainTextArea.java +++ b/src/main/java/ninjabrainbot/gui/mainwindow/main/MainTextArea.java @@ -45,7 +45,7 @@ public MainTextArea(StyleManager styleManager, IButtonInputHandler buttonInputHa detailedTriangulation = new DetailedTriangulationPanel(styleManager, preferences); blind = new BlindPanel(styleManager); divine = new DivinePanel(styleManager); - allAdvancements = new AllAdvancementsPanel(styleManager, buttonInputHandler, dataState.allAdvancementsDataState()); + allAdvancements = new AllAdvancementsPanel(styleManager, buttonInputHandler, dataState.allAdvancementsDataState(), preferences); add(basicTriangulation, TRIANGULATION); add(detailedTriangulation, TRIANGULATION_DETAILED); add(blind, BLIND); @@ -61,11 +61,18 @@ public MainTextArea(StyleManager styleManager, IButtonInputHandler buttonInputHa updateResult(); } + private void updateOneDotTwentyPlusAAEnabled() { + allAdvancements.updateOneDotTwentyPlusAAEnabled(); + // Update the size of the panel + whenSizeModified.notifySubscribers(this); + } + private void setupSubscriptions() { // Settings disposeHandler.add(preferences.showNetherCoords.whenModified().subscribeEDT(this::setNetherCoordsEnabled)); disposeHandler.add(preferences.showAngleUpdates.whenModified().subscribeEDT(this::setAngleUpdatesEnabled)); disposeHandler.add(preferences.view.whenModified().subscribeEDT(__ -> onViewTypeChanged())); + disposeHandler.add(preferences.oneDotTwentyPlusAA.whenModified().subscribeEDT(__ -> updateOneDotTwentyPlusAAEnabled())); // Data state disposeHandler.add(dataState.calculatorResult().subscribeEDT(this::setResult)); disposeHandler.add(dataState.blindResult().subscribeEDT(this::setResult)); @@ -145,6 +152,8 @@ private void setAngleUpdatesEnabled(boolean b) { public Dimension getPreferredSize() { if (preferences.view.get() == MainViewType.BASIC && !dataState.allAdvancementsDataState().allAdvancementsModeEnabled().get()) { return basicTriangulation.getPreferredSize(); + } else if (dataState.allAdvancementsDataState().allAdvancementsModeEnabled().get()) { + return allAdvancements.getPreferredSize(); } else { return detailedTriangulation.getPreferredSize(); } diff --git a/src/main/java/ninjabrainbot/gui/options/sections/AllAdvancementsOptionsPanel.java b/src/main/java/ninjabrainbot/gui/options/sections/AllAdvancementsOptionsPanel.java index a5c11d1f..c98d713c 100644 --- a/src/main/java/ninjabrainbot/gui/options/sections/AllAdvancementsOptionsPanel.java +++ b/src/main/java/ninjabrainbot/gui/options/sections/AllAdvancementsOptionsPanel.java @@ -17,6 +17,7 @@ public class AllAdvancementsOptionsPanel extends StackPanel { private final NinjabrainBotPreferences preferences; + private final CheckboxPanel oneDotTwentyPlusAA; private final RadioButtonPanel switchTypeRadioButtonPanel; private final HotkeyPanel toggleHotkeyPanel; @@ -36,15 +37,21 @@ public int getTextSize(SizePreference p) { } }); add(new CheckboxPanel(styleManager, I18n.get("settings.enable_all_advancements_mode"), preferences.allAdvancements)); + + + add(oneDotTwentyPlusAA = new CheckboxPanel(styleManager, I18n.get("settings.enable_120plus_all_advancements_mode"), preferences.oneDotTwentyPlusAA)); + add(switchTypeRadioButtonPanel = new RadioButtonPanel(styleManager, I18n.get("settings.all_advancements.switch_type"), preferences.allAdvancementsToggleType, true)); add(toggleHotkeyPanel = new HotkeyPanel(styleManager, I18n.get("settings.all_advancements.toggle_aa_mode_hotkey"), preferences.hotkeyToggleAllAdvancementsMode)); updateComponentsEnabled(); preferences.allAdvancements.whenModified().subscribeEDT(this::updateComponentsEnabled); + preferences.oneDotTwentyPlusAA.whenModified().subscribeEDT(this::updateComponentsEnabled); preferences.allAdvancementsToggleType.whenModified().subscribeEDT(this::updateComponentsEnabled); } private void updateComponentsEnabled() { + oneDotTwentyPlusAA.setEnabled(preferences.allAdvancements.get()); switchTypeRadioButtonPanel.setEnabled(preferences.allAdvancements.get()); toggleHotkeyPanel.setEnabled(preferences.allAdvancements.get() && preferences.allAdvancementsToggleType.get() == AllAdvancementsToggleType.Hotkey); } diff --git a/src/main/java/ninjabrainbot/gui/themeeditor/PreviewAllAdvancementsDataState.java b/src/main/java/ninjabrainbot/gui/themeeditor/PreviewAllAdvancementsDataState.java index 4459d391..8d711545 100644 --- a/src/main/java/ninjabrainbot/gui/themeeditor/PreviewAllAdvancementsDataState.java +++ b/src/main/java/ninjabrainbot/gui/themeeditor/PreviewAllAdvancementsDataState.java @@ -32,4 +32,24 @@ public IDataComponent outpostPosition() { public IDataComponent monumentPosition() { return new DataComponent<>(null); } + + @Override + public IDataComponent deepDarkPosition() { + return new DataComponent<>(null); + } + + @Override + public IDataComponent cityQueryPosition() { + return new DataComponent<>(null); + } + + @Override + public IDataComponent shulkerTransportPosition() { + return new DataComponent<>(null); + } + + @Override + public IDataComponent generalLocationPosition() { + return new DataComponent<>(null); + } } diff --git a/src/main/java/ninjabrainbot/gui/themeeditor/panels/PreviewPlayerPosition.java b/src/main/java/ninjabrainbot/gui/themeeditor/panels/PreviewPlayerPosition.java index 497382bd..0aca7826 100644 --- a/src/main/java/ninjabrainbot/gui/themeeditor/panels/PreviewPlayerPosition.java +++ b/src/main/java/ninjabrainbot/gui/themeeditor/panels/PreviewPlayerPosition.java @@ -41,6 +41,11 @@ public boolean isInNether() { return false; } + @Override + public boolean isInEnd() { + return false; + } + @Override public double horizontalAngle() { return 0; diff --git a/src/main/java/ninjabrainbot/io/preferences/NinjabrainBotPreferences.java b/src/main/java/ninjabrainbot/io/preferences/NinjabrainBotPreferences.java index 43cbbfae..1a1f8411 100644 --- a/src/main/java/ninjabrainbot/io/preferences/NinjabrainBotPreferences.java +++ b/src/main/java/ninjabrainbot/io/preferences/NinjabrainBotPreferences.java @@ -52,6 +52,7 @@ public class NinjabrainBotPreferences { public final BooleanPreference overlayAutoHide; public final BooleanPreference overlayHideWhenLocked; public final BooleanPreference allAdvancements; + public final BooleanPreference oneDotTwentyPlusAA; public final BooleanPreference informationMismeasureEnabled; public final BooleanPreference informationDirectionHelpEnabled; public final BooleanPreference informationCombinedCertaintyEnabled; @@ -117,6 +118,7 @@ public NinjabrainBotPreferences(IPreferenceSource source) { overlayAutoHide = new BooleanPreference("overlay_auto_hide", false, source); overlayHideWhenLocked = new BooleanPreference("overlay_lock_hide", false, source); allAdvancements = new BooleanPreference("all_advancements", false, source); + oneDotTwentyPlusAA = new BooleanPreference("one_dot_twenty_plus_aa", false, source); informationMismeasureEnabled = new BooleanPreference("mismeasure_warning_enabled", false, source); informationDirectionHelpEnabled = new BooleanPreference("direction_help_enabled", false, source); informationCombinedCertaintyEnabled = new BooleanPreference("combined_offset_information_enabled", true, source); diff --git a/src/main/java/ninjabrainbot/model/actions/alladvancements/TryAddAllAdvancementsStructureAction.java b/src/main/java/ninjabrainbot/model/actions/alladvancements/TryAddAllAdvancementsStructureAction.java index a811ef83..04b51c2b 100644 --- a/src/main/java/ninjabrainbot/model/actions/alladvancements/TryAddAllAdvancementsStructureAction.java +++ b/src/main/java/ninjabrainbot/model/actions/alladvancements/TryAddAllAdvancementsStructureAction.java @@ -1,6 +1,7 @@ package ninjabrainbot.model.actions.alladvancements; import ninjabrainbot.event.IObservable; +import ninjabrainbot.io.preferences.NinjabrainBotPreferences; import ninjabrainbot.model.datastate.IDataState; import ninjabrainbot.model.actions.IAction; import ninjabrainbot.model.datastate.alladvancements.IAllAdvancementsDataState; @@ -12,14 +13,32 @@ public class TryAddAllAdvancementsStructureAction implements IAction { + private final NinjabrainBotPreferences preferences; private final IAllAdvancementsDataState allAdvancementsDataState; private final IObservable playerPositionObservable; private final IDetailedPlayerPosition playerPosition; - public TryAddAllAdvancementsStructureAction(IDataState dataState, IDetailedPlayerPosition playerPosition) { + public TryAddAllAdvancementsStructureAction(IDataState dataState, IDetailedPlayerPosition playerPosition, NinjabrainBotPreferences preferences) { this.allAdvancementsDataState = dataState.allAdvancementsDataState(); this.playerPositionObservable = dataState.playerPosition(); this.playerPosition = playerPosition; + this.preferences = preferences; + } + + public StructurePosition getStructurePosition(StructureType structureType) { + switch (structureType) { + case Outpost: + return getOutpostPosition(playerPosition); + case CityQuery: + return getCityRegionCentre(playerPosition); + default: + return new StructurePosition((int) Math.floor(playerPosition.xInOverworld()), (int) Math.floor(playerPosition.zInOverworld()), playerPositionObservable); + } + } + + public void generalLocationSet(StructurePosition structurePosition) { + IDataComponent dataComponent = getDataComponentFromStructureType(StructureType.GeneralLocation); + dataComponent.set(structurePosition); } @Override @@ -28,29 +47,49 @@ public void execute() { if (structureType == StructureType.Unknown) return; - StructurePosition structurePosition = - structureType == StructureType.Outpost - ? getOutpostPosition(playerPosition) - : new StructurePosition((int) Math.floor(playerPosition.xInOverworld()), (int) Math.floor(playerPosition.zInOverworld()), playerPositionObservable); + StructurePosition structurePosition = getStructurePosition(structureType); IDataComponent dataComponent = getDataComponentFromStructureType(structureType); - if (dataComponent.get() != null) + // Cities can be queried multiple times, so overwrite the position. + if (structureType != StructureType.CityQuery && dataComponent.get() != null) return; dataComponent.set(structurePosition); } private StructureType getAllAdvancementStructureTypeFromPlayerPosition(IDetailedPlayerPosition t) { - if (t.isInNether()) - return StructureType.Unknown; + if (!preferences.oneDotTwentyPlusAA.get()) { + if (t.isInNether()) + return StructureType.Unknown; - if (Math.abs(t.xInOverworld()) <= 300 && Math.abs(t.zInOverworld()) <= 300 && Math.abs(Math.round(t.yInPlayerDimension()) - t.yInPlayerDimension()) < 0.001) - return StructureType.Spawn; + if (Math.abs(t.xInOverworld()) <= 300 && Math.abs(t.zInOverworld()) <= 300 && Math.abs(Math.round(t.yInPlayerDimension()) - t.yInPlayerDimension()) < 0.001) + return StructureType.Spawn; - if (t.yInPlayerDimension() < 63) - return StructureType.Monument; + if (t.yInPlayerDimension() < 63) + return StructureType.Monument; - return StructureType.Outpost; + return StructureType.Outpost; + } else { + if (t.isInNether()) + return StructureType.Unknown; + + if (t.isInEnd()) + return StructureType.ShulkerTransport; + + if (Math.abs(t.xInOverworld()) <= 300 && Math.abs(t.zInOverworld()) <= 300 && Math.abs(Math.round(t.yInPlayerDimension()) - t.yInPlayerDimension()) < 0.001) + return StructureType.Spawn; + + if (t.yInPlayerDimension() > 30 && t.yInPlayerDimension() < 63 && t.isInOverworld()) + return StructureType.Monument; + + if (t.yInPlayerDimension() <= 30 && t.isInOverworld()) + return StructureType.DeepDark; + + if (t.yInPlayerDimension() > 160 && t.isInOverworld()) + return StructureType.CityQuery; + + return StructureType.Outpost; + } } private StructurePosition getOutpostPosition(IDetailedPlayerPosition t) { @@ -64,6 +103,17 @@ private StructurePosition getOutpostPosition(IDetailedPlayerPosition t) { return new StructurePosition((int) (t.xInOverworld() + deltaX), (int) (t.zInOverworld() + deltaZ), playerPositionObservable); } + + // City region centres are at chunk positions 24m + 8, where m is an integer. + // Find the closest city region centre to the player's position. + private StructurePosition getCityRegionCentre(IDetailedPlayerPosition t) { + int chunkX = (int) Math.floor(t.xInOverworld() / 16); + int chunkZ = (int) Math.floor(t.zInOverworld() / 16); + int cityRegionCentreX = 24 * (int) Math.round((chunkX - 8) / 24D) + 8; + int cityRegionCentreZ = 24 * (int) Math.round((chunkZ - 8) / 24D) + 8; + return new StructurePosition(cityRegionCentreX * 16 + 8, cityRegionCentreZ * 16 + 8, playerPositionObservable); + } + private IDataComponent getDataComponentFromStructureType(StructureType structureType) { switch (structureType) { case Spawn: @@ -72,6 +122,14 @@ private IDataComponent getDataComponentFromStructureType(Stru return allAdvancementsDataState.outpostPosition(); case Monument: return allAdvancementsDataState.monumentPosition(); + case DeepDark: + return allAdvancementsDataState.deepDarkPosition(); + case CityQuery: + return allAdvancementsDataState.cityQueryPosition(); + case ShulkerTransport: + return allAdvancementsDataState.shulkerTransportPosition(); + case GeneralLocation: + return allAdvancementsDataState.generalLocationPosition(); default: throw new IllegalArgumentException("Setting of structure type " + structureType + " is not supported."); } diff --git a/src/main/java/ninjabrainbot/model/actions/common/SetGeneralLocationAction.java b/src/main/java/ninjabrainbot/model/actions/common/SetGeneralLocationAction.java new file mode 100644 index 00000000..1114edb0 --- /dev/null +++ b/src/main/java/ninjabrainbot/model/actions/common/SetGeneralLocationAction.java @@ -0,0 +1,22 @@ +package ninjabrainbot.model.actions.common; + +import ninjabrainbot.model.actions.IAction; +import ninjabrainbot.model.datastate.alladvancements.IAllAdvancementsDataState; +import ninjabrainbot.model.datastate.common.StructurePosition; + +public class SetGeneralLocationAction implements IAction { + + private final IAllAdvancementsDataState allAdvancementsDataState; + private final StructurePosition structurePosition; + + public SetGeneralLocationAction(IAllAdvancementsDataState allAdvancementsDataState, StructurePosition structurePosition) { + this.allAdvancementsDataState = allAdvancementsDataState; + this.structurePosition = structurePosition; + } + + @Override + public void execute() { + allAdvancementsDataState.generalLocationPosition().set(structurePosition); + } + +} diff --git a/src/main/java/ninjabrainbot/model/datastate/alladvancements/AllAdvancementsDataState.java b/src/main/java/ninjabrainbot/model/datastate/alladvancements/AllAdvancementsDataState.java index 3f16021a..c6e39bbc 100644 --- a/src/main/java/ninjabrainbot/model/datastate/alladvancements/AllAdvancementsDataState.java +++ b/src/main/java/ninjabrainbot/model/datastate/alladvancements/AllAdvancementsDataState.java @@ -20,6 +20,11 @@ public class AllAdvancementsDataState implements IAllAdvancementsDataState, IDis private final DataComponent spawnPosition; private final DataComponent outpostPosition; private final DataComponent monumentPosition; + private final DataComponent deepDarkPosition; + private final DataComponent cityQueryPosition; + private final DataComponent shulkerTransportPosition; + private final DataComponent generalLocationPosition; + private final DisposeHandler disposeHandler = new DisposeHandler(); @@ -30,6 +35,10 @@ public AllAdvancementsDataState(IDomainModelComponent currentSt spawnPosition = new DataComponent<>(domainModel); outpostPosition = new DataComponent<>(domainModel); monumentPosition = new DataComponent<>(domainModel); + deepDarkPosition = new DataComponent<>(domainModel); + cityQueryPosition = new DataComponent<>(domainModel); + shulkerTransportPosition = new DataComponent<>(domainModel); + generalLocationPosition = new DataComponent<>(domainModel); disposeHandler.add(environmentState.allAdvancementsModeEnabled().subscribeInternal(this::updateAllAdvancementsMode)); disposeHandler.add(environmentState.hasEnteredEnd().subscribeInternal(this::updateAllAdvancementsMode)); disposeHandler.add(currentStrongholdPrediction.subscribeInternal(strongholdPosition::set)); @@ -64,6 +73,26 @@ public IDataComponent monumentPosition() { return monumentPosition; } + @Override + public IDataComponent deepDarkPosition() { + return deepDarkPosition; + } + + @Override + public IDataComponent cityQueryPosition() { + return cityQueryPosition; + } + + @Override + public IDataComponent shulkerTransportPosition() { + return shulkerTransportPosition; + } + + @Override + public IDataComponent generalLocationPosition() { + return generalLocationPosition; + } + @Override public void dispose() { disposeHandler.dispose(); diff --git a/src/main/java/ninjabrainbot/model/datastate/alladvancements/IAllAdvancementsDataState.java b/src/main/java/ninjabrainbot/model/datastate/alladvancements/IAllAdvancementsDataState.java index 25ae8dac..06ddec6a 100644 --- a/src/main/java/ninjabrainbot/model/datastate/alladvancements/IAllAdvancementsDataState.java +++ b/src/main/java/ninjabrainbot/model/datastate/alladvancements/IAllAdvancementsDataState.java @@ -17,4 +17,12 @@ public interface IAllAdvancementsDataState { IDataComponent monumentPosition(); + IDataComponent deepDarkPosition(); + + IDataComponent cityQueryPosition(); + + IDataComponent shulkerTransportPosition(); + + IDataComponent generalLocationPosition(); + } diff --git a/src/main/java/ninjabrainbot/model/datastate/alladvancements/StructureType.java b/src/main/java/ninjabrainbot/model/datastate/alladvancements/StructureType.java index 454e7996..c3a26c1a 100644 --- a/src/main/java/ninjabrainbot/model/datastate/alladvancements/StructureType.java +++ b/src/main/java/ninjabrainbot/model/datastate/alladvancements/StructureType.java @@ -1,5 +1,5 @@ package ninjabrainbot.model.datastate.alladvancements; public enum StructureType { - Spawn, Outpost, Monument, Stronghold, Unknown + Spawn, Outpost, Monument, Stronghold, DeepDark, CityQuery, ShulkerTransport, GeneralLocation, Unknown } diff --git a/src/main/java/ninjabrainbot/model/datastate/common/DetailedPlayerPosition.java b/src/main/java/ninjabrainbot/model/datastate/common/DetailedPlayerPosition.java index be618f4c..7983da09 100644 --- a/src/main/java/ninjabrainbot/model/datastate/common/DetailedPlayerPosition.java +++ b/src/main/java/ninjabrainbot/model/datastate/common/DetailedPlayerPosition.java @@ -1,27 +1,29 @@ package ninjabrainbot.model.datastate.common; +import ninjabrainbot.model.datastate.endereye.MCDimension; + public class DetailedPlayerPosition implements IDetailedPlayerPosition { private final double x, y, z, horizontalAngle, verticalAngle; - private final boolean isInNether; + private final MCDimension dimension; - public DetailedPlayerPosition(double x, double y, double z, double horizontalAngle, double verticalAngle, boolean isInNether) { + public DetailedPlayerPosition(double x, double y, double z, double horizontalAngle, double verticalAngle, MCDimension dimension) { this.x = x; this.y = y; this.z = z; this.horizontalAngle = horizontalAngle; this.verticalAngle = verticalAngle; - this.isInNether = isInNether; + this.dimension = dimension; } @Override public double xInOverworld() { - return x * (isInNether ? 8.0 : 1.0); + return x * (dimension == MCDimension.NETHER ? 8.0 : 1.0); } @Override public double zInOverworld() { - return z * (isInNether ? 8.0 : 1.0); + return z * (dimension == MCDimension.NETHER ? 8.0 : 1.0); } @Override @@ -56,12 +58,16 @@ public boolean lookingBelowHorizon() { @Override public boolean isInOverworld() { - return !isInNether; + return dimension == MCDimension.OVERWORLD; } @Override public boolean isInNether() { - return isInNether; + return dimension == MCDimension.NETHER; } + @Override + public boolean isInEnd() { + return dimension == MCDimension.END; + } } diff --git a/src/main/java/ninjabrainbot/model/datastate/common/IPlayerPosition.java b/src/main/java/ninjabrainbot/model/datastate/common/IPlayerPosition.java index 6854aecc..33b48ca2 100644 --- a/src/main/java/ninjabrainbot/model/datastate/common/IPlayerPosition.java +++ b/src/main/java/ninjabrainbot/model/datastate/common/IPlayerPosition.java @@ -10,4 +10,6 @@ public interface IPlayerPosition extends IOverworldRay { boolean isInNether(); + boolean isInEnd(); + } diff --git a/src/main/java/ninjabrainbot/model/datastate/common/LimitedPlayerPosition.java b/src/main/java/ninjabrainbot/model/datastate/common/LimitedPlayerPosition.java index b2e28078..94ecac1b 100644 --- a/src/main/java/ninjabrainbot/model/datastate/common/LimitedPlayerPosition.java +++ b/src/main/java/ninjabrainbot/model/datastate/common/LimitedPlayerPosition.java @@ -47,4 +47,9 @@ public boolean isInOverworld() { public boolean isInNether() { return false; } + + @Override + public boolean isInEnd() { + return false; + } } diff --git a/src/main/java/ninjabrainbot/model/datastate/common/StructurePosition.java b/src/main/java/ninjabrainbot/model/datastate/common/StructurePosition.java index 5b4ec10d..a0f4077f 100644 --- a/src/main/java/ninjabrainbot/model/datastate/common/StructurePosition.java +++ b/src/main/java/ninjabrainbot/model/datastate/common/StructurePosition.java @@ -7,6 +7,7 @@ import ninjabrainbot.event.ISubscribable; import ninjabrainbot.event.ObservableProperty; import ninjabrainbot.event.Subscription; +import ninjabrainbot.model.datastate.divine.Fossil; import ninjabrainbot.util.I18n; public class StructurePosition implements IOverworldPosition, IDisposable { @@ -128,4 +129,19 @@ public void dispose() { playerPosSubscription.dispose(); } + public static StructurePosition tryParseGeneralLocation(String f3i) { + if (!f3i.startsWith("/setblock ")) + return null; + String[] substrings = f3i.split(" "); + if (substrings.length != 5) + return null; + try { + int x = Integer.parseInt(substrings[1]); + int z = Integer.parseInt(substrings[3]); + return new StructurePosition(x, z); + } catch (NullPointerException | NumberFormatException e) { + return null; + } + } + } diff --git a/src/main/java/ninjabrainbot/model/datastate/endereye/CoordinateInputSource.java b/src/main/java/ninjabrainbot/model/datastate/endereye/CoordinateInputSource.java index 1f36e85c..24dbab41 100644 --- a/src/main/java/ninjabrainbot/model/datastate/endereye/CoordinateInputSource.java +++ b/src/main/java/ninjabrainbot/model/datastate/endereye/CoordinateInputSource.java @@ -5,32 +5,39 @@ import ninjabrainbot.event.ISubscribable; import ninjabrainbot.event.ObservableField; import ninjabrainbot.io.IClipboardProvider; +import ninjabrainbot.io.preferences.NinjabrainBotPreferences; import ninjabrainbot.model.datastate.common.DetailedPlayerPosition; import ninjabrainbot.model.datastate.common.IDetailedPlayerPosition; import ninjabrainbot.model.datastate.common.IPlayerPosition; import ninjabrainbot.model.datastate.common.IPlayerPositionInputSource; import ninjabrainbot.model.datastate.common.LimitedPlayerPosition; +import ninjabrainbot.model.datastate.common.StructurePosition; import ninjabrainbot.model.datastate.divine.Fossil; import ninjabrainbot.model.input.IFossilInputSource; +import ninjabrainbot.model.input.IGeneralLocationInputSource; /** * Listens changes of the clipboard in the ClipboardProvider and parses any compatible clipboard strings * into player positions and fossils, exposed through the streams whenNewPlayerPositionInputted(), and whenNewFossilInputted(). */ -public class CoordinateInputSource implements IPlayerPositionInputSource, IFossilInputSource, IDisposable { +public class CoordinateInputSource implements IPlayerPositionInputSource, IFossilInputSource, IGeneralLocationInputSource, IDisposable { + private final NinjabrainBotPreferences preferences; private final ObservableField whenNewDetailedPlayerPositionInputted; private final ObservableField whenNewLimitedPlayerPositionInputted; private final ObservableField whenNewFossilInputted; + private final ObservableField whenNewGeneralLocationInputted; private final DisposeHandler disposeHandler = new DisposeHandler(); - public CoordinateInputSource(IClipboardProvider clipboardProvider) { + public CoordinateInputSource(IClipboardProvider clipboardProvider, NinjabrainBotPreferences preferences) { whenNewDetailedPlayerPositionInputted = new ObservableField<>(null, true); whenNewLimitedPlayerPositionInputted = new ObservableField<>(null, true); whenNewFossilInputted = new ObservableField<>(null, true); + whenNewGeneralLocationInputted = new ObservableField<>(null, true); disposeHandler.add(clipboardProvider.clipboardText().subscribe(this::parseF3C)); + this.preferences = preferences; } private void parseF3C(String f3c) { @@ -39,7 +46,7 @@ private void parseF3C(String f3c) { F3CData f3cData = F3CData.tryParseF3CString(f3c); if (f3cData != null) { - whenNewDetailedPlayerPositionInputted.set(new DetailedPlayerPosition(f3cData.x, f3cData.y, f3cData.z, f3cData.horizontalAngle, f3cData.verticalAngle, f3cData.nether)); + whenNewDetailedPlayerPositionInputted.set(new DetailedPlayerPosition(f3cData.x, f3cData.y, f3cData.z, f3cData.horizontalAngle, f3cData.verticalAngle, f3cData.dimension)); return; } @@ -53,6 +60,13 @@ private void parseF3C(String f3c) { if (f != null) { whenNewFossilInputted.setAndAlwaysNotifySubscribers(f); } + + if (preferences.oneDotTwentyPlusAA.get() && preferences.allAdvancements.get()) { + StructurePosition generalLocation = StructurePosition.tryParseGeneralLocation(f3c); + if (generalLocation != null) { + whenNewGeneralLocationInputted.setAndAlwaysNotifySubscribers(generalLocation); + } + } } public ISubscribable whenNewDetailedPlayerPositionInputted() { @@ -67,6 +81,10 @@ public ISubscribable whenNewFossilInputted() { return whenNewFossilInputted; } + public ISubscribable whenNewGeneralLocationInputted() { + return whenNewGeneralLocationInputted; + } + @Override public void dispose() { disposeHandler.dispose(); diff --git a/src/main/java/ninjabrainbot/model/datastate/endereye/F3CData.java b/src/main/java/ninjabrainbot/model/datastate/endereye/F3CData.java index 21ae2e55..e9914796 100644 --- a/src/main/java/ninjabrainbot/model/datastate/endereye/F3CData.java +++ b/src/main/java/ninjabrainbot/model/datastate/endereye/F3CData.java @@ -3,15 +3,15 @@ public class F3CData { public final double x, y, z, horizontalAngle, verticalAngle; - public final boolean nether; + public final MCDimension dimension; - private F3CData(double x, double y, double z, double horizontalAngle, double verticalAngle, boolean nether) { + private F3CData(double x, double y, double z, double horizontalAngle, double verticalAngle, MCDimension dimension) { this.x = x; this.y = y; this.z = z; this.horizontalAngle = horizontalAngle; this.verticalAngle = verticalAngle; - this.nether = nether; + this.dimension = dimension; } public static F3CData tryParseF3CString(String string) { @@ -23,16 +23,21 @@ public static F3CData tryParseF3CString(String string) { return null; try { String world = substrings[2]; - if (world.endsWith("_end")) { - return null; + MCDimension dimension = null; + if (world.endsWith("overworld")) { + dimension = MCDimension.OVERWORLD; + } else if (world.endsWith("the_nether")) { + dimension = MCDimension.NETHER; + } else if (world.endsWith("the_end")) { + dimension = MCDimension.END; } - boolean nether = world.endsWith("_nether"); + double x = Double.parseDouble(substrings[6]); double y = Double.parseDouble(substrings[7]); double z = Double.parseDouble(substrings[8]); double horizontalAngle = Double.parseDouble(substrings[9]); double verticalAngle = Double.parseDouble(substrings[10]); - return new F3CData(x, y, z, horizontalAngle, verticalAngle, nether); + return new F3CData(x, y, z, horizontalAngle, verticalAngle, dimension); } catch (NullPointerException | NumberFormatException e) { return null; } diff --git a/src/main/java/ninjabrainbot/model/datastate/endereye/MCDimension.java b/src/main/java/ninjabrainbot/model/datastate/endereye/MCDimension.java new file mode 100644 index 00000000..04669cb7 --- /dev/null +++ b/src/main/java/ninjabrainbot/model/datastate/endereye/MCDimension.java @@ -0,0 +1,5 @@ +package ninjabrainbot.model.datastate.endereye; + +public enum MCDimension { + OVERWORLD, NETHER, END; +} diff --git a/src/main/java/ninjabrainbot/model/input/GeneralLocationInputHandler.java b/src/main/java/ninjabrainbot/model/input/GeneralLocationInputHandler.java new file mode 100644 index 00000000..727b5e05 --- /dev/null +++ b/src/main/java/ninjabrainbot/model/input/GeneralLocationInputHandler.java @@ -0,0 +1,37 @@ +package ninjabrainbot.model.input; + +import ninjabrainbot.event.DisposeHandler; +import ninjabrainbot.event.IDisposable; +import ninjabrainbot.model.actions.IActionExecutor; +import ninjabrainbot.model.actions.common.SetGeneralLocationAction; +import ninjabrainbot.model.datastate.IDataState; +import ninjabrainbot.model.datastate.common.StructurePosition; + +/** + * Listens to the stream of fossils and decides if/how the fossils should be inputted into the data state. + */ +public class GeneralLocationInputHandler implements IDisposable { + + private final IDataState dataState; + private final IActionExecutor actionExecutor; + + final DisposeHandler disposeHandler = new DisposeHandler(); + + public GeneralLocationInputHandler(IGeneralLocationInputSource generalLocationInputSource, IDataState dataState, IActionExecutor actionExecutor) { + this.dataState = dataState; + this.actionExecutor = actionExecutor; + disposeHandler.add(generalLocationInputSource.whenNewGeneralLocationInputted().subscribe(this::onNewGeneralLocation)); + } + + private void onNewGeneralLocation(StructurePosition pos) { + if (dataState.locked().get()) + return; + + actionExecutor.executeImmediately(new SetGeneralLocationAction(dataState.allAdvancementsDataState(), pos)); + } + + @Override + public void dispose() { + disposeHandler.dispose(); + } +} diff --git a/src/main/java/ninjabrainbot/model/input/IGeneralLocationInputSource.java b/src/main/java/ninjabrainbot/model/input/IGeneralLocationInputSource.java new file mode 100644 index 00000000..5054fa42 --- /dev/null +++ b/src/main/java/ninjabrainbot/model/input/IGeneralLocationInputSource.java @@ -0,0 +1,13 @@ +package ninjabrainbot.model.input; + +import ninjabrainbot.event.ISubscribable; +import ninjabrainbot.model.datastate.common.StructurePosition; + +public interface IGeneralLocationInputSource { + + /** + * Notifies subscribers whenever new general coordinates have been inputted, e.g. as a result of a F3+I command. + */ + ISubscribable whenNewGeneralLocationInputted(); + +} \ No newline at end of file diff --git a/src/main/java/ninjabrainbot/model/input/PlayerPositionInputHandler.java b/src/main/java/ninjabrainbot/model/input/PlayerPositionInputHandler.java index cb3319b7..0cdaac3e 100644 --- a/src/main/java/ninjabrainbot/model/input/PlayerPositionInputHandler.java +++ b/src/main/java/ninjabrainbot/model/input/PlayerPositionInputHandler.java @@ -56,13 +56,13 @@ private IAction getActionForInputtedPlayerPosition(IDetailedPlayerPosition playe if (preferences.usePreciseAngle.get() && dataState.boatDataState().reducingModulo360().get()) return new ReduceBoatAngleMod360Action(dataState.boatDataState(), playerPosition.horizontalAngle(), preferences.sensitivityAutomatic.get()); + + if (dataState.allAdvancementsDataState().allAdvancementsModeEnabled().get()) + return new TryAddAllAdvancementsStructureAction(dataState, playerPosition, preferences); if (!playerPosition.isInOverworld()) return null; - - if (dataState.allAdvancementsDataState().allAdvancementsModeEnabled().get()) - return new TryAddAllAdvancementsStructureAction(dataState, playerPosition); - + if (playerPosition.lookingBelowHorizon()) return null; diff --git a/src/main/resources/city_query_icon.png b/src/main/resources/city_query_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ed12d8979607747c42ac6c2aba882f786a087ca0 GIT binary patch literal 1047 zcmV+y1nB#TP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!Tzx$Z+OvcXGiBp=!Bqb>+2m$H3st_PbQ6*s42vsZ^^*`Xx=pM1DR4K5BY)ZvL zf(mL5MRSzW+nj5~ZqM74GFtGw{+cdjwN|eNuNMs5Z+eL17k7Rh*{p@pk^F?I@mqSv__9Kb*VNx^wdk)aWqft-!65Iyuq39qbm>C`Ld0t>lH^(x zNxRo|QLQ&vD~yIIXOs6G_Y)rUKQ8Y!Ru9^);EZ{`*Nqa10mmAgJNE_*(^CCodCu8l z)-q=Eg#vB$`{;%YYg2Q`>~50Y?vAl5Fxqvy?`u-N4Jm(9278Ijfd6e#qh4WN-<@HM zp2=Aj)AKfFu3rZ&okDJU23gC(*~xK4g)uD}IZ+~(bpe!pm!uzYtU+P85U+`hMsMhx z<=ed;s?|DnzF9){qsusbwg_LgpP{_8Kqs zB$+1aoJn2B`1}=6JCE5HCo%Nn_b}dl2c^@K(488dY(0Q%)&q6QHWQg6QZwLGhv>BO zZOvS)+b3to42^bO7ye&6m|3_6p3$*==Ub4qGPEE-y|E9`?Scuht+ukzciS6@)PPh4 zf*Xw5BQs3X&vd*#TXxzAFJ45CQ~04k`Q}ZK^XEaOgzt7x%$YFNZ-rrVV=R|>l*k;B zs$gi?o&?iAmzwqp;S8@1aoD~O@xf(OIvxD}^=+K0?LilP>^JI=VFVI|j*P;qroqd# z+P+Mr2Ba!r8AGS0QSz-Uh#Gc881Ak-#>&Gcepy_C{^kV)u7_r|h9D4#lrp8{Q51!b z13|(>=7?iY5m9^4)viOQjz9M5I8Z{~K@0l!I;J1qg-HZDs_!yxQxH^y5T6-_>4d6< zPm?l;+_oQtVa2yck!iO;9S5@0hP?L!<}3|%=;5HL2CHs)c=(j8tF(>ySy6r|QZq0p z??j9*Q@8aN@jc2YH4GV%mu(YVc<8I!+-|GEhaq~N=LA7;H6*00oTQ4%yqPE+l6p-? z4g(QXD}*`w1ZC_N7=M9`jFv3nv#GH>e9wbW4$5Fz8NQdvWSrQTbB^`(xS)SY8Q4Y^ z!cx~Q@Z(P^2`NcUAJ+|I$=0d57HrUa#g_8;lu-JUJZu%>3Z6V=@SJB2@HZ*?v}?A3 R3$6eF002ovPDHLkV1iIn?^yr< literal 0 HcmV?d00001 diff --git a/src/main/resources/deep_dark_icon.png b/src/main/resources/deep_dark_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..bc878727beb7573d2a9ba110e15c84da30c4f4f8 GIT binary patch literal 948 zcmV;l155mgP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!TmK2aAk}uqcN_GG0_-x;lfuH z5fw26MZrh4AV>>zXqk4}>AbF|!vv6P-0H$_F*h^kJLjA8y7-U34kT_c(`9 zDj=z~Vb89^0%s|D`|on2lE(_I88VAt_l_gK@L6~+AU&SJz~?axe#s-%GmOFaDIS^x zym|Y8KYc!e!O!`?C;k0vXjz0H(3;e+p427qqnUh{LlBUtj*uiIVhY+C8HT@3 z;c@SEp-c~ZuJMt~G+H$VHLlPXhDhCa83X}PgMH5jV-k`L2^6vw*tKe4%KXUkp^skz zF~_cEP+R37oll9s9Sc=-SqZb2o1xH8c^}>YO}r z9nYf-M1g2{E?_)6g>=?}>lV=cTF1-G4-C!5ajI(*Zd|?t&SV@qz7JQQe}Z9paQylZ zR3JxHFrJ$avIIf~sh)A9USx6cK^lD|X4z%b3V9-WkfI7?S;pGdCb-2}RA;BrH<=5# zsTY%Y{A@govIt>IlLwA+n;LDCvqaOucXpy-co-)Rc4GUMcF>w*=$no!cVD6`DUd9a z=0ZYjWgDW@W#h@6Ut$UZ@f~}q%^V7is^fd`V=+jT3N~vpjvnhmX~x3+N6(P493Vnt zNk2mmaLSI+{?vLO{rReph#aNoy0#9)sAuu)B&3>!Lf*jWrvg5t3($1~%(fAu$zjyo zAdDgdyLZk9Spsp28j^4+hl$)6q|zK@3J@=s;Z!Y*PM1-(9dO5jTq(n&ekd00NUVX@ z+6Mai!zhaoGpHD}3{<3I0S*Q5DPe9^U^z7mPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1I9^2K~zXf?Nm)~ z8&woN^X9`}iEF1(f>E53*iqytiJL_zMSv)%QW2$5RurjHs{#u^NJwm0!V-xMzky9* zQ#FDG2&ssOC=^ObapJ0OL!8e#jqNyg;`w^>xHEAoj4QhArbn{wc;>!y=AL`!;t3u* zq(*E)e00c*wr#^QO-7g9LI|eohVc7+P*qh@71fcLRN#)|Febrq1l+iCGwYo_!2by_ z&UuF_E8XqE;1q<2DzfZY4u``XM!aRiw$50b7l^n-0-n$#1!AcID6#^Xv9zXXm)Zh> z&Uen8KO72&rPOE|nd`qJm&@Vq;-bjh&K5baRoClhO~aVed_FAy^$3C9ks(;NmFfr| zx-ym=9O#P2F}1t_V`L0|RfT@-7nqji9eg3=gT^^B`NiDk*8K^;KagFzIloWTK#M@% z(c$5?K=AU=k-lVUr-lVtL;1!mIV2$51W5t2bVwxDo*qY95*SGh;_9{8JH>K&k_0jy zQ3GxRo8VWq>C-R2nka8qa6?EQxn$JA+#mCUpZtK5!hpVqow?s|oeSK`-om?YolAs* z!RZFg1GES*S&sDe_e;gv4(dc8^tyLnC_eCGlj!~MP4Mvv2-)X}xH;?FMJO~`WJknH z{uf#VEW^b5+8W-wa1nhyJ?n5aTo_mg7)&J58R@|C+A6(?fUKyn$Bsk%_#Fbm!KqhH;`sQp*sWGEGdqjh z^9#^*{j&y@hn6O{N24P6{EHZ++Ipf9#9}dQ7K@0}G%e-x;8c-QuR|t7dY+D9eSHI~ zr84FmpguE=YPsCR*;0XD(>@BS%y;jlQe4~D$D5Y>LP0t1Oq|* zNzJ{#XJ9^k4B8(v!Yr05hGBf(pz_dKK`1mVE6U~eR4N(z;!CK$0FHkB6$0+spqY2= zv-kE;pef6wpMy=-`M&)IwOsBFx2(zP?rzhVwg}Ld>xPu#_g#r569e%h{V0C?2@qH814=Ednmus0tU2hpte!MO)cxfD1{IRK^?% r1^O_l2nVvvK$W0YYZiEd#|_{gT^Xk6lY-%A00000NkvXXu0mjf0&4#j literal 0 HcmV?d00001 diff --git a/src/main/resources/lang/I18n.properties b/src/main/resources/lang/I18n.properties index 2aa8a0ba..656e8d4b 100644 --- a/src/main/resources/lang/I18n.properties +++ b/src/main/resources/lang/I18n.properties @@ -34,6 +34,7 @@ settings.all_advancements.spawn_coords=Spawn/shulker, press F3+C at spawn (x and settings.all_advancements.monument_coords=Monument, press F3+C while underwater (y less than 63). settings.all_advancements.outpost_coords=Outpost, look at the center of the outpost and press F3+C. The bot will approximate the location of the outpost based on where you are looking. settings.enable_all_advancements_mode=Enable all advancements mode +settings.enable_120plus_all_advancements_mode=Enable 1.20+ all advancements mode settings.all_advancements.switch_type=Switch to all advancements mode when settings.all_advancements.automatic=Entering end (Windows only) settings.all_advancements.hotkey=Pressing hotkey diff --git a/src/main/resources/shulker_transport_icon.png b/src/main/resources/shulker_transport_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..414ceeab552854e3c399a1f14fd31cb8f57038f7 GIT binary patch literal 799 zcmV+)1K|9LP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0<=j)K~zXf?NnJ# z8$l3#v)Lw`0)^Y5D9K?^BBWdfjjK4u-YQe3!I&QK~H@>YOEfXxVpYN z@|nLpUqxFB)wI|@ZqYv0*xYTff2z^$8yIb%2aVm+mU~<5p10Vp)@XM%4s8cR+fzvb zh?27o@cg>~?>(G$2x99qIO8xYW?0M?0M*QkE`m5q+@(7up{c4F@+^z^Ne~eqJOYCa z!vN!0iPaI{jCz4DMNuIO3F2vhtfG=+L_?7x%V}Jos0w}rV!ps^R-!B`CXq8J-Nzs_ z%2>^bBmrW^@(*Gd=t!J6cq^E(st89GE6j6#GcHr79d)K+k0c484uTd&~&u zCU``Q;T{}`W9`k7?4!__kdkfbH78& z)wC^Yu8z7sVtXt}S8o6O4Qq(7tK|}xmzT`e#qXTvu@8i7)C2BU zcliGM$C1yZf?*uc?>Y>d2IIDcTJO+3?_rdtJJOWSRo4+p%>f(8e+8wcL3>M*0D(;= zXV^?KgPBWnIndF8mrB?hjyQar4W7%aurJ5L5!$eaY?`Jj3n z`W}NGqmBeN0v`*?1+x=LK>PLWI#^z4Qo(dAH;r5cd=n>pIyw|+SjVde`Lcxd=gl!q dKjotZ_z(A?+?=}JEGhs1002ovPDHLkV1llOU|RqH literal 0 HcmV?d00001 diff --git a/src/test/java/ninjabrainbot/integrationtests/DataStateIntegrationTests.java b/src/test/java/ninjabrainbot/integrationtests/DataStateIntegrationTests.java index 23c3fdde..1c9bff37 100644 --- a/src/test/java/ninjabrainbot/integrationtests/DataStateIntegrationTests.java +++ b/src/test/java/ninjabrainbot/integrationtests/DataStateIntegrationTests.java @@ -9,6 +9,8 @@ import ninjabrainbot.model.datastate.common.DetailedPlayerPosition; import ninjabrainbot.model.datastate.common.ResultType; import ninjabrainbot.model.datastate.divine.Fossil; +import ninjabrainbot.model.datastate.endereye.MCDimension; + import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -20,8 +22,8 @@ void dataComponentsOnlySendsOneEventOnReset() { IntegrationTestBuilder testBuilder = new IntegrationTestBuilder().withProSettings().withAllAdvancementsSettings(); testBuilder.inputFossil(new Fossil(4)); - testBuilder.inputDetailedPlayerPosition(new DetailedPlayerPosition(0, 80, 0, 12, -31, false)); - testBuilder.inputDetailedPlayerPosition(new DetailedPlayerPosition(0, 80, 1000, 12, -31, true)); + testBuilder.inputDetailedPlayerPosition(new DetailedPlayerPosition(0, 80, 0, 12, -31, MCDimension.OVERWORLD)); + testBuilder.inputDetailedPlayerPosition(new DetailedPlayerPosition(0, 80, 1000, 12, -31, MCDimension.NETHER)); List resultTypeEvents = new ArrayList<>(); List calculatorResultEvents = new ArrayList<>(); diff --git a/src/test/java/ninjabrainbot/integrationtests/NextDirectionProviderIntegrationTests.java b/src/test/java/ninjabrainbot/integrationtests/NextDirectionProviderIntegrationTests.java index 8d75727f..d0aa0467 100644 --- a/src/test/java/ninjabrainbot/integrationtests/NextDirectionProviderIntegrationTests.java +++ b/src/test/java/ninjabrainbot/integrationtests/NextDirectionProviderIntegrationTests.java @@ -8,6 +8,7 @@ import ninjabrainbot.model.datastate.common.DetailedPlayerPosition; import ninjabrainbot.model.datastate.common.IDetailedPlayerPosition; import ninjabrainbot.model.datastate.stronghold.Chunk; +import ninjabrainbot.model.datastate.endereye.MCDimension; import ninjabrainbot.model.information.NextThrowDirectionInformationProvider; import ninjabrainbot.simulations.RandomPlayerPositionProvider; import ninjabrainbot.util.Assert; @@ -69,7 +70,7 @@ private IDetailedPlayerPosition getPlayerPositionForNextThrow(IDetailedPlayerPos double x = playerPosition.xInOverworld() + Coords.getX(leftDistance, leftAngle); double z = playerPosition.zInOverworld() + Coords.getZ(leftDistance, leftAngle); double horizontalAngle = Coords.getPhi(stronghold.eightEightX() - x, stronghold.eightEightZ() - z) / Math.PI * 180.0; - return new DetailedPlayerPosition(x, 80, z, horizontalAngle, -31, false); + return new DetailedPlayerPosition(x, 80, z, horizontalAngle, -31, MCDimension.OVERWORLD); } private static int getFirstInt(String[] words) { diff --git a/src/test/java/ninjabrainbot/simulations/RandomPlayerPositionProvider.java b/src/test/java/ninjabrainbot/simulations/RandomPlayerPositionProvider.java index 4c42c0d4..889fa649 100644 --- a/src/test/java/ninjabrainbot/simulations/RandomPlayerPositionProvider.java +++ b/src/test/java/ninjabrainbot/simulations/RandomPlayerPositionProvider.java @@ -4,6 +4,7 @@ import ninjabrainbot.model.datastate.common.DetailedPlayerPosition; import ninjabrainbot.model.datastate.common.IDetailedPlayerPosition; +import ninjabrainbot.model.datastate.endereye.MCDimension; import ninjabrainbot.model.datastate.stronghold.Ring; import ninjabrainbot.util.Coords; @@ -21,7 +22,7 @@ public IDetailedPlayerPosition nextPlayerPositionFirstRing() { double r = random.nextDouble() * ring.outerRadiusPostSnapping * 16; double x = Coords.getX(r, phi); double z = Coords.getZ(r, phi); - return new DetailedPlayerPosition(x, 80, z, random.nextDouble() * 2 * Math.PI, -31, false); + return new DetailedPlayerPosition(x, 80, z, random.nextDouble() * 2 * Math.PI, -31, MCDimension.OVERWORLD); } } diff --git a/src/test/java/ninjabrainbot/util/TestUtils.java b/src/test/java/ninjabrainbot/util/TestUtils.java index 1c9c2524..82c8d407 100644 --- a/src/test/java/ninjabrainbot/util/TestUtils.java +++ b/src/test/java/ninjabrainbot/util/TestUtils.java @@ -11,6 +11,7 @@ import ninjabrainbot.model.datastate.common.DetailedPlayerPosition; import ninjabrainbot.model.datastate.common.IDetailedPlayerPosition; import ninjabrainbot.model.datastate.common.IOverworldRay; +import ninjabrainbot.model.datastate.endereye.MCDimension; import ninjabrainbot.model.domainmodel.IDomainModel; import org.junit.jupiter.api.Assertions; @@ -37,15 +38,15 @@ public double horizontalAngle() { } public static IDetailedPlayerPosition createPlayerPosition(double x, double z, double alpha) { - return new DetailedPlayerPosition(x, 80, z, alpha, -31, false); + return new DetailedPlayerPosition(x, 80, z, alpha, -31, MCDimension.OVERWORLD); } public static IDetailedPlayerPosition createPlayerPositionLookDown(double x, double z, double alpha) { - return new DetailedPlayerPosition(x, 80, z, alpha, 90, false); + return new DetailedPlayerPosition(x, 80, z, alpha, 90, MCDimension.OVERWORLD); } public static IDetailedPlayerPosition createPlayerPositionInNether(double x, double z, double alpha) { - return new DetailedPlayerPosition(x, 80, z, alpha, 0, true); + return new DetailedPlayerPosition(x, 80, z, alpha, 0, MCDimension.NETHER); } public static void assertIterableEquals(Iterable iterable1, Iterable iterable2) { From 091144ee61c461fbb8b1dc8aeb39eb5b52d72f7c Mon Sep 17 00:00:00 2001 From: VDPineapple Date: Tue, 3 Sep 2024 21:28:08 +0100 Subject: [PATCH 2/7] Refactoring for consistency. --- src/main/java/ninjabrainbot/gui/GUI.java | 6 +-- .../RemoveStructureAction.java | 16 +++++++ .../SetF3ILocationAction.java} | 45 ++++++++--------- .../TryAddAllAdvancementsStructureAction.java | 48 +++++++++---------- .../datastate/common/StructurePosition.java | 2 +- .../endereye/CoordinateInputSource.java | 25 ++++------ .../model/datastate/endereye/F3CData.java | 20 ++++---- .../model/datastate/endereye/F3IData.java | 29 +++++++++++ .../model/input/F3ILocationInputHandler.java | 43 +++++++++++++++++ .../input/GeneralLocationInputHandler.java | 37 -------------- .../model/input/IF3ILocationInputSource.java | 13 +++++ .../input/IGeneralLocationInputSource.java | 13 ----- .../JsonIntegrationTests.java | 12 +++-- 13 files changed, 179 insertions(+), 130 deletions(-) rename src/main/java/ninjabrainbot/model/actions/{common/SetGeneralLocationAction.java => alladvancements/SetF3ILocationAction.java} (53%) create mode 100644 src/main/java/ninjabrainbot/model/datastate/endereye/F3IData.java create mode 100644 src/main/java/ninjabrainbot/model/input/F3ILocationInputHandler.java delete mode 100644 src/main/java/ninjabrainbot/model/input/GeneralLocationInputHandler.java create mode 100644 src/main/java/ninjabrainbot/model/input/IF3ILocationInputSource.java delete mode 100644 src/main/java/ninjabrainbot/model/input/IGeneralLocationInputSource.java diff --git a/src/main/java/ninjabrainbot/gui/GUI.java b/src/main/java/ninjabrainbot/gui/GUI.java index 39f32962..c57bfe6f 100644 --- a/src/main/java/ninjabrainbot/gui/GUI.java +++ b/src/main/java/ninjabrainbot/gui/GUI.java @@ -35,7 +35,7 @@ import ninjabrainbot.model.input.ActiveInstanceInputHandler; import ninjabrainbot.model.input.ButtonInputHandler; import ninjabrainbot.model.input.FossilInputHandler; -import ninjabrainbot.model.input.GeneralLocationInputHandler; +import ninjabrainbot.model.input.F3ILocationInputHandler; import ninjabrainbot.model.input.HotkeyInputHandler; import ninjabrainbot.model.input.IButtonInputHandler; import ninjabrainbot.model.input.PlayerPositionInputHandler; @@ -107,11 +107,11 @@ private void initModel() { private void initInputHandlers() { Progress.setTask("Initializing input handlers", 0.08f); - coordinateInputSource = disposeHandler.add(new CoordinateInputSource(clipboardReader, preferences)); + coordinateInputSource = disposeHandler.add(new CoordinateInputSource(clipboardReader)); IEnderEyeThrowFactory enderEyeThrowFactory = new EnderEyeThrowFactory(preferences, dataState.boatDataState()); disposeHandler.add(new PlayerPositionInputHandler(coordinateInputSource, dataState, actionExecutor, preferences, enderEyeThrowFactory)); disposeHandler.add(new FossilInputHandler(coordinateInputSource, dataState, actionExecutor)); - disposeHandler.add(new GeneralLocationInputHandler(coordinateInputSource, dataState, actionExecutor)); + disposeHandler.add(new F3ILocationInputHandler(coordinateInputSource, dataState, actionExecutor, preferences)); disposeHandler.add(new ActiveInstanceInputHandler(activeInstanceProvider, domainModel, dataState, environmentState, actionExecutor, preferences)); disposeHandler.add(new HotkeyInputHandler(preferences, domainModel, dataState, actionExecutor)); buttonInputHandler = new ButtonInputHandler(domainModel, dataState, actionExecutor); diff --git a/src/main/java/ninjabrainbot/model/actions/alladvancements/RemoveStructureAction.java b/src/main/java/ninjabrainbot/model/actions/alladvancements/RemoveStructureAction.java index a532d83b..9360270f 100644 --- a/src/main/java/ninjabrainbot/model/actions/alladvancements/RemoveStructureAction.java +++ b/src/main/java/ninjabrainbot/model/actions/alladvancements/RemoveStructureAction.java @@ -28,6 +28,22 @@ public void execute() { allAdvancementsDataState.monumentPosition().reset(); return; } + if (allAdvancementsDataState.shulkerTransportPosition().get() == structurePosition) { + allAdvancementsDataState.shulkerTransportPosition().reset(); + return; + } + if (allAdvancementsDataState.deepDarkPosition().get() == structurePosition) { + allAdvancementsDataState.deepDarkPosition().reset(); + return; + } + if (allAdvancementsDataState.cityQueryPosition().get() == structurePosition) { + allAdvancementsDataState.cityQueryPosition().reset(); + return; + } + if (allAdvancementsDataState.generalLocationPosition().get() == structurePosition) { + allAdvancementsDataState.generalLocationPosition().reset(); + return; + } throw new IllegalArgumentException(String.format("Cannot remove structure position %s because it not present in the data state.", structurePosition)); } diff --git a/src/main/java/ninjabrainbot/model/actions/common/SetGeneralLocationAction.java b/src/main/java/ninjabrainbot/model/actions/alladvancements/SetF3ILocationAction.java similarity index 53% rename from src/main/java/ninjabrainbot/model/actions/common/SetGeneralLocationAction.java rename to src/main/java/ninjabrainbot/model/actions/alladvancements/SetF3ILocationAction.java index 1114edb0..a055efe6 100644 --- a/src/main/java/ninjabrainbot/model/actions/common/SetGeneralLocationAction.java +++ b/src/main/java/ninjabrainbot/model/actions/alladvancements/SetF3ILocationAction.java @@ -1,22 +1,23 @@ -package ninjabrainbot.model.actions.common; - -import ninjabrainbot.model.actions.IAction; -import ninjabrainbot.model.datastate.alladvancements.IAllAdvancementsDataState; -import ninjabrainbot.model.datastate.common.StructurePosition; - -public class SetGeneralLocationAction implements IAction { - - private final IAllAdvancementsDataState allAdvancementsDataState; - private final StructurePosition structurePosition; - - public SetGeneralLocationAction(IAllAdvancementsDataState allAdvancementsDataState, StructurePosition structurePosition) { - this.allAdvancementsDataState = allAdvancementsDataState; - this.structurePosition = structurePosition; - } - - @Override - public void execute() { - allAdvancementsDataState.generalLocationPosition().set(structurePosition); - } - -} +package ninjabrainbot.model.actions.alladvancements; + +import ninjabrainbot.model.actions.IAction; +import ninjabrainbot.model.datastate.alladvancements.IAllAdvancementsDataState; +import ninjabrainbot.model.datastate.common.StructurePosition; +import ninjabrainbot.model.datastate.endereye.F3IData; + +public class SetF3ILocationAction implements IAction { + + private final IAllAdvancementsDataState allAdvancementsDataState; + private final StructurePosition structurePosition; + + public SetF3ILocationAction(IAllAdvancementsDataState allAdvancementsDataState, F3IData f3iData) { + this.allAdvancementsDataState = allAdvancementsDataState; + this.structurePosition = new StructurePosition(f3iData.x, f3iData.z); + } + + @Override + public void execute() { + allAdvancementsDataState.generalLocationPosition().set(structurePosition); + } + +} diff --git a/src/main/java/ninjabrainbot/model/actions/alladvancements/TryAddAllAdvancementsStructureAction.java b/src/main/java/ninjabrainbot/model/actions/alladvancements/TryAddAllAdvancementsStructureAction.java index 04b51c2b..3d1f7107 100644 --- a/src/main/java/ninjabrainbot/model/actions/alladvancements/TryAddAllAdvancementsStructureAction.java +++ b/src/main/java/ninjabrainbot/model/actions/alladvancements/TryAddAllAdvancementsStructureAction.java @@ -25,7 +25,7 @@ public TryAddAllAdvancementsStructureAction(IDataState dataState, IDetailedPlaye this.preferences = preferences; } - public StructurePosition getStructurePosition(StructureType structureType) { + private StructurePosition getStructurePosition(StructureType structureType) { switch (structureType) { case Outpost: return getOutpostPosition(playerPosition); @@ -36,11 +36,6 @@ public StructurePosition getStructurePosition(StructureType structureType) { } } - public void generalLocationSet(StructurePosition structurePosition) { - IDataComponent dataComponent = getDataComponentFromStructureType(StructureType.GeneralLocation); - dataComponent.set(structurePosition); - } - @Override public void execute() { StructureType structureType = getAllAdvancementStructureTypeFromPlayerPosition(playerPosition); @@ -58,38 +53,39 @@ public void execute() { } private StructureType getAllAdvancementStructureTypeFromPlayerPosition(IDetailedPlayerPosition t) { - if (!preferences.oneDotTwentyPlusAA.get()) { - if (t.isInNether()) - return StructureType.Unknown; - - if (Math.abs(t.xInOverworld()) <= 300 && Math.abs(t.zInOverworld()) <= 300 && Math.abs(Math.round(t.yInPlayerDimension()) - t.yInPlayerDimension()) < 0.001) - return StructureType.Spawn; - - if (t.yInPlayerDimension() < 63) - return StructureType.Monument; + if (t.isInNether()) + return StructureType.Unknown; - return StructureType.Outpost; - } else { - if (t.isInNether()) - return StructureType.Unknown; - - if (t.isInEnd()) + if (t.isInEnd()) { + if (preferences.oneDotTwentyPlusAA.get()) { return StructureType.ShulkerTransport; + } else { + return StructureType.Unknown; + } + } - if (Math.abs(t.xInOverworld()) <= 300 && Math.abs(t.zInOverworld()) <= 300 && Math.abs(Math.round(t.yInPlayerDimension()) - t.yInPlayerDimension()) < 0.001) - return StructureType.Spawn; + if (Math.abs(t.xInOverworld()) <= 300 && Math.abs(t.zInOverworld()) <= 300 && Math.abs(Math.round(t.yInPlayerDimension()) - t.yInPlayerDimension()) < 0.001) + return StructureType.Spawn; - if (t.yInPlayerDimension() > 30 && t.yInPlayerDimension() < 63 && t.isInOverworld()) + if (t.yInPlayerDimension() < 63) { + if (preferences.oneDotTwentyPlusAA.get()) { + if (t.yInPlayerDimension() > 30 && t.isInOverworld()) { + return StructureType.Monument; + } + } else { return StructureType.Monument; + } + } + if (preferences.oneDotTwentyPlusAA.get()) { if (t.yInPlayerDimension() <= 30 && t.isInOverworld()) return StructureType.DeepDark; if (t.yInPlayerDimension() > 160 && t.isInOverworld()) return StructureType.CityQuery; - - return StructureType.Outpost; } + + return StructureType.Outpost; } private StructurePosition getOutpostPosition(IDetailedPlayerPosition t) { diff --git a/src/main/java/ninjabrainbot/model/datastate/common/StructurePosition.java b/src/main/java/ninjabrainbot/model/datastate/common/StructurePosition.java index a0f4077f..b60fb134 100644 --- a/src/main/java/ninjabrainbot/model/datastate/common/StructurePosition.java +++ b/src/main/java/ninjabrainbot/model/datastate/common/StructurePosition.java @@ -129,7 +129,7 @@ public void dispose() { playerPosSubscription.dispose(); } - public static StructurePosition tryParseGeneralLocation(String f3i) { + public static StructurePosition tryParseF3ILocation(String f3i) { if (!f3i.startsWith("/setblock ")) return null; String[] substrings = f3i.split(" "); diff --git a/src/main/java/ninjabrainbot/model/datastate/endereye/CoordinateInputSource.java b/src/main/java/ninjabrainbot/model/datastate/endereye/CoordinateInputSource.java index 2fb8e8d0..93c3a266 100644 --- a/src/main/java/ninjabrainbot/model/datastate/endereye/CoordinateInputSource.java +++ b/src/main/java/ninjabrainbot/model/datastate/endereye/CoordinateInputSource.java @@ -5,34 +5,31 @@ import ninjabrainbot.event.ISubscribable; import ninjabrainbot.event.ObservableField; import ninjabrainbot.io.IClipboardProvider; -import ninjabrainbot.io.preferences.NinjabrainBotPreferences; import ninjabrainbot.model.datastate.common.*; import ninjabrainbot.model.datastate.divine.Fossil; import ninjabrainbot.model.input.IFossilInputSource; -import ninjabrainbot.model.input.IGeneralLocationInputSource; +import ninjabrainbot.model.input.IF3ILocationInputSource; /** * Listens changes of the clipboard in the ClipboardProvider and parses any compatible clipboard strings * into player positions and fossils, exposed through the streams whenNewPlayerPositionInputted(), and whenNewFossilInputted(). */ -public class CoordinateInputSource implements IPlayerPositionInputSource, IFossilInputSource, IGeneralLocationInputSource, IDisposable { +public class CoordinateInputSource implements IPlayerPositionInputSource, IFossilInputSource, IF3ILocationInputSource, IDisposable { - private final NinjabrainBotPreferences preferences; private final ObservableField whenNewDetailedPlayerPositionInputted; private final ObservableField whenNewLimitedPlayerPositionInputted; private final ObservableField whenNewFossilInputted; - private final ObservableField whenNewGeneralLocationInputted; + private final ObservableField whenNewF3ILocationInputted; private final DisposeHandler disposeHandler = new DisposeHandler(); - public CoordinateInputSource(IClipboardProvider clipboardProvider, NinjabrainBotPreferences preferences) { + public CoordinateInputSource(IClipboardProvider clipboardProvider) { whenNewDetailedPlayerPositionInputted = new ObservableField<>(null, true); whenNewLimitedPlayerPositionInputted = new ObservableField<>(null, true); whenNewFossilInputted = new ObservableField<>(null, true); - whenNewGeneralLocationInputted = new ObservableField<>(null, true); + whenNewF3ILocationInputted = new ObservableField<>(null, true); disposeHandler.add(clipboardProvider.clipboardText().subscribe(this::parseF3C)); - this.preferences = preferences; } private void parseF3C(String f3c) { @@ -56,11 +53,9 @@ private void parseF3C(String f3c) { whenNewFossilInputted.setAndAlwaysNotifySubscribers(f); } - if (preferences.oneDotTwentyPlusAA.get() && preferences.allAdvancements.get()) { - StructurePosition generalLocation = StructurePosition.tryParseGeneralLocation(f3c); - if (generalLocation != null) { - whenNewGeneralLocationInputted.setAndAlwaysNotifySubscribers(generalLocation); - } + F3IData f3iData = F3IData.tryParseF3IString(f3c); + if (f3iData != null) { + whenNewF3ILocationInputted.setAndAlwaysNotifySubscribers(f3iData); } } @@ -76,8 +71,8 @@ public ISubscribable whenNewFossilInputted() { return whenNewFossilInputted; } - public ISubscribable whenNewGeneralLocationInputted() { - return whenNewGeneralLocationInputted; + public ISubscribable whenNewF3ILocationInputted() { + return whenNewF3ILocationInputted; } @Override diff --git a/src/main/java/ninjabrainbot/model/datastate/endereye/F3CData.java b/src/main/java/ninjabrainbot/model/datastate/endereye/F3CData.java index e9914796..d8778915 100644 --- a/src/main/java/ninjabrainbot/model/datastate/endereye/F3CData.java +++ b/src/main/java/ninjabrainbot/model/datastate/endereye/F3CData.java @@ -14,6 +14,17 @@ private F3CData(double x, double y, double z, double horizontalAngle, double ver this.dimension = dimension; } + private static MCDimension getMCDimension(String world) { + if (world.endsWith("overworld")) { + return MCDimension.OVERWORLD; + } else if (world.endsWith("the_nether")) { + return MCDimension.NETHER; + } else if (world.endsWith("the_end")) { + return MCDimension.END; + } + return null; + } + public static F3CData tryParseF3CString(String string) { if (!(string.startsWith("/execute in minecraft:"))) { return null; @@ -23,14 +34,7 @@ public static F3CData tryParseF3CString(String string) { return null; try { String world = substrings[2]; - MCDimension dimension = null; - if (world.endsWith("overworld")) { - dimension = MCDimension.OVERWORLD; - } else if (world.endsWith("the_nether")) { - dimension = MCDimension.NETHER; - } else if (world.endsWith("the_end")) { - dimension = MCDimension.END; - } + MCDimension dimension = getMCDimension(world); double x = Double.parseDouble(substrings[6]); double y = Double.parseDouble(substrings[7]); diff --git a/src/main/java/ninjabrainbot/model/datastate/endereye/F3IData.java b/src/main/java/ninjabrainbot/model/datastate/endereye/F3IData.java new file mode 100644 index 00000000..b4e0c4f1 --- /dev/null +++ b/src/main/java/ninjabrainbot/model/datastate/endereye/F3IData.java @@ -0,0 +1,29 @@ +package ninjabrainbot.model.datastate.endereye; + +public class F3IData { + + public final int x, y, z; + + private F3IData(int x, int y, int z) { + this.x = x; + this.y = y; + this.z = z; + } + + public static F3IData tryParseF3IString(String string) { + if (!string.startsWith("/setblock ")) + return null; + String[] substrings = string.split(" "); + if (substrings.length != 5) + return null; + try { + int x = Integer.parseInt(substrings[1]); + int y = Integer.parseInt(substrings[2]); + int z = Integer.parseInt(substrings[3]); + return new F3IData(x, y, z); + } catch (NullPointerException | NumberFormatException e) { + return null; + } + } + +} diff --git a/src/main/java/ninjabrainbot/model/input/F3ILocationInputHandler.java b/src/main/java/ninjabrainbot/model/input/F3ILocationInputHandler.java new file mode 100644 index 00000000..61eff96a --- /dev/null +++ b/src/main/java/ninjabrainbot/model/input/F3ILocationInputHandler.java @@ -0,0 +1,43 @@ +package ninjabrainbot.model.input; + +import ninjabrainbot.event.DisposeHandler; +import ninjabrainbot.event.IDisposable; +import ninjabrainbot.io.preferences.NinjabrainBotPreferences; +import ninjabrainbot.model.actions.IActionExecutor; +import ninjabrainbot.model.actions.alladvancements.SetF3ILocationAction; +import ninjabrainbot.model.datastate.IDataState; +import ninjabrainbot.model.datastate.endereye.F3IData; + +/** + * Listens to the stream of fossils and decides if/how the fossils should be inputted into the data state. + */ +public class F3ILocationInputHandler implements IDisposable { + + private final NinjabrainBotPreferences preferences; + private final IDataState dataState; + private final IActionExecutor actionExecutor; + + final DisposeHandler disposeHandler = new DisposeHandler(); + + public F3ILocationInputHandler(IF3ILocationInputSource f3iLocationInputSource, IDataState dataState, IActionExecutor actionExecutor, NinjabrainBotPreferences preferences) { + this.preferences = preferences; + this.dataState = dataState; + this.actionExecutor = actionExecutor; + disposeHandler.add(f3iLocationInputSource.whenNewF3ILocationInputted().subscribe(this::onNewF3ILocation)); + } + + private void onNewF3ILocation(F3IData pos) { + if (dataState.locked().get()) + return; + + // Only execute if 1.20+ AA mode enabled. + if (preferences.oneDotTwentyPlusAA.get() && preferences.allAdvancements.get()) { + actionExecutor.executeImmediately(new SetF3ILocationAction(dataState.allAdvancementsDataState(), pos)); + } + } + + @Override + public void dispose() { + disposeHandler.dispose(); + } +} diff --git a/src/main/java/ninjabrainbot/model/input/GeneralLocationInputHandler.java b/src/main/java/ninjabrainbot/model/input/GeneralLocationInputHandler.java deleted file mode 100644 index 727b5e05..00000000 --- a/src/main/java/ninjabrainbot/model/input/GeneralLocationInputHandler.java +++ /dev/null @@ -1,37 +0,0 @@ -package ninjabrainbot.model.input; - -import ninjabrainbot.event.DisposeHandler; -import ninjabrainbot.event.IDisposable; -import ninjabrainbot.model.actions.IActionExecutor; -import ninjabrainbot.model.actions.common.SetGeneralLocationAction; -import ninjabrainbot.model.datastate.IDataState; -import ninjabrainbot.model.datastate.common.StructurePosition; - -/** - * Listens to the stream of fossils and decides if/how the fossils should be inputted into the data state. - */ -public class GeneralLocationInputHandler implements IDisposable { - - private final IDataState dataState; - private final IActionExecutor actionExecutor; - - final DisposeHandler disposeHandler = new DisposeHandler(); - - public GeneralLocationInputHandler(IGeneralLocationInputSource generalLocationInputSource, IDataState dataState, IActionExecutor actionExecutor) { - this.dataState = dataState; - this.actionExecutor = actionExecutor; - disposeHandler.add(generalLocationInputSource.whenNewGeneralLocationInputted().subscribe(this::onNewGeneralLocation)); - } - - private void onNewGeneralLocation(StructurePosition pos) { - if (dataState.locked().get()) - return; - - actionExecutor.executeImmediately(new SetGeneralLocationAction(dataState.allAdvancementsDataState(), pos)); - } - - @Override - public void dispose() { - disposeHandler.dispose(); - } -} diff --git a/src/main/java/ninjabrainbot/model/input/IF3ILocationInputSource.java b/src/main/java/ninjabrainbot/model/input/IF3ILocationInputSource.java new file mode 100644 index 00000000..0fc821b3 --- /dev/null +++ b/src/main/java/ninjabrainbot/model/input/IF3ILocationInputSource.java @@ -0,0 +1,13 @@ +package ninjabrainbot.model.input; + +import ninjabrainbot.event.ISubscribable; +import ninjabrainbot.model.datastate.endereye.F3IData; + +public interface IF3ILocationInputSource { + + /** + * Notifies subscribers whenever new F3+I coordinates have been inputted. + */ + ISubscribable whenNewF3ILocationInputted(); + +} \ No newline at end of file diff --git a/src/main/java/ninjabrainbot/model/input/IGeneralLocationInputSource.java b/src/main/java/ninjabrainbot/model/input/IGeneralLocationInputSource.java deleted file mode 100644 index 5054fa42..00000000 --- a/src/main/java/ninjabrainbot/model/input/IGeneralLocationInputSource.java +++ /dev/null @@ -1,13 +0,0 @@ -package ninjabrainbot.model.input; - -import ninjabrainbot.event.ISubscribable; -import ninjabrainbot.model.datastate.common.StructurePosition; - -public interface IGeneralLocationInputSource { - - /** - * Notifies subscribers whenever new general coordinates have been inputted, e.g. as a result of a F3+I command. - */ - ISubscribable whenNewGeneralLocationInputted(); - -} \ No newline at end of file diff --git a/src/test/java/ninjabrainbot/integrationtests/JsonIntegrationTests.java b/src/test/java/ninjabrainbot/integrationtests/JsonIntegrationTests.java index 97f3671d..61df782d 100644 --- a/src/test/java/ninjabrainbot/integrationtests/JsonIntegrationTests.java +++ b/src/test/java/ninjabrainbot/integrationtests/JsonIntegrationTests.java @@ -2,6 +2,8 @@ import ninjabrainbot.io.api.queries.StrongholdQuery; import ninjabrainbot.model.datastate.common.DetailedPlayerPosition; +import ninjabrainbot.model.datastate.endereye.MCDimension; + import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; @@ -13,10 +15,10 @@ void testJson_triangulation() { // Arrange IntegrationTestBuilder testBuilder = new IntegrationTestBuilder().withProSettings(); - testBuilder.inputDetailedPlayerPosition(new DetailedPlayerPosition(0, 80, 0, 161.9, -31, false)); - testBuilder.inputDetailedPlayerPosition(new DetailedPlayerPosition(20, 80, 0, 161.2, -31, false)); + testBuilder.inputDetailedPlayerPosition(new DetailedPlayerPosition(0, 80, 0, 161.9, -31, MCDimension.OVERWORLD)); + testBuilder.inputDetailedPlayerPosition(new DetailedPlayerPosition(20, 80, 0, 161.2, -31, MCDimension.OVERWORLD)); testBuilder.inputSubpixelCorrections(2); - testBuilder.inputDetailedPlayerPosition(new DetailedPlayerPosition(-60, 80, -150, 12, -31, true)); + testBuilder.inputDetailedPlayerPosition(new DetailedPlayerPosition(-60, 80, -150, 12, -31, MCDimension.NETHER)); testBuilder.inputStandardDeviationToggle(); StrongholdQuery jsonConverter = new StrongholdQuery(true); @@ -38,8 +40,8 @@ void testJson_failed() { // Arrange IntegrationTestBuilder testBuilder = new IntegrationTestBuilder().withProSettings(); - testBuilder.inputDetailedPlayerPosition(new DetailedPlayerPosition(0, 80, 0, 161.9, -31, false)); - testBuilder.inputDetailedPlayerPosition(new DetailedPlayerPosition(20, 80, 0, -30, -31, false)); + testBuilder.inputDetailedPlayerPosition(new DetailedPlayerPosition(0, 80, 0, 161.9, -31, MCDimension.OVERWORLD)); + testBuilder.inputDetailedPlayerPosition(new DetailedPlayerPosition(20, 80, 0, -30, -31, MCDimension.OVERWORLD)); StrongholdQuery jsonConverter = new StrongholdQuery(true); From b57674b7c4f250d215edb4fd6c845bffa7538f4f Mon Sep 17 00:00:00 2001 From: Filip Ryblad Date: Thu, 5 Sep 2024 21:55:05 +0200 Subject: [PATCH 3/7] Merge FossilInputHandler and F3ILocationInputHandler --- src/main/java/ninjabrainbot/gui/GUI.java | 4 +- .../model/datastate/divine/Fossil.java | 24 ++++-------- .../endereye/CoordinateInputSource.java | 21 +++-------- .../model/input/F3ILocationInputHandler.java | 17 ++++++--- .../model/input/FossilInputHandler.java | 37 ------------------- .../model/input/IFossilInputSource.java | 13 ------- 6 files changed, 26 insertions(+), 90 deletions(-) delete mode 100644 src/main/java/ninjabrainbot/model/input/FossilInputHandler.java delete mode 100644 src/main/java/ninjabrainbot/model/input/IFossilInputSource.java diff --git a/src/main/java/ninjabrainbot/gui/GUI.java b/src/main/java/ninjabrainbot/gui/GUI.java index c57bfe6f..83098db9 100644 --- a/src/main/java/ninjabrainbot/gui/GUI.java +++ b/src/main/java/ninjabrainbot/gui/GUI.java @@ -10,12 +10,12 @@ import ninjabrainbot.io.AutoResetTimer; import ninjabrainbot.io.ClipboardReader; import ninjabrainbot.io.KeyboardListener; +import ninjabrainbot.io.api.NinjabrainBotHttpServer; import ninjabrainbot.io.mcinstance.ActiveInstanceProviderFactory; import ninjabrainbot.io.mcinstance.IActiveInstanceProvider; import ninjabrainbot.io.overlay.NinjabrainBotOverlayImageWriter; import ninjabrainbot.io.overlay.OBSOverlay; import ninjabrainbot.io.preferences.NinjabrainBotPreferences; -import ninjabrainbot.io.api.NinjabrainBotHttpServer; import ninjabrainbot.io.updatechecker.GithubUpdateChecker; import ninjabrainbot.model.ModelState; import ninjabrainbot.model.actions.IActionExecutor; @@ -34,7 +34,6 @@ import ninjabrainbot.model.information.PortalLinkingWarningProvider; import ninjabrainbot.model.input.ActiveInstanceInputHandler; import ninjabrainbot.model.input.ButtonInputHandler; -import ninjabrainbot.model.input.FossilInputHandler; import ninjabrainbot.model.input.F3ILocationInputHandler; import ninjabrainbot.model.input.HotkeyInputHandler; import ninjabrainbot.model.input.IButtonInputHandler; @@ -110,7 +109,6 @@ private void initInputHandlers() { coordinateInputSource = disposeHandler.add(new CoordinateInputSource(clipboardReader)); IEnderEyeThrowFactory enderEyeThrowFactory = new EnderEyeThrowFactory(preferences, dataState.boatDataState()); disposeHandler.add(new PlayerPositionInputHandler(coordinateInputSource, dataState, actionExecutor, preferences, enderEyeThrowFactory)); - disposeHandler.add(new FossilInputHandler(coordinateInputSource, dataState, actionExecutor)); disposeHandler.add(new F3ILocationInputHandler(coordinateInputSource, dataState, actionExecutor, preferences)); disposeHandler.add(new ActiveInstanceInputHandler(activeInstanceProvider, domainModel, dataState, environmentState, actionExecutor, preferences)); disposeHandler.add(new HotkeyInputHandler(preferences, domainModel, dataState, actionExecutor)); diff --git a/src/main/java/ninjabrainbot/model/datastate/divine/Fossil.java b/src/main/java/ninjabrainbot/model/datastate/divine/Fossil.java index bfb87b3b..f06875bd 100644 --- a/src/main/java/ninjabrainbot/model/datastate/divine/Fossil.java +++ b/src/main/java/ninjabrainbot/model/datastate/divine/Fossil.java @@ -1,5 +1,7 @@ package ninjabrainbot.model.datastate.divine; +import ninjabrainbot.model.datastate.endereye.F3IData; + public class Fossil { public final int x; @@ -9,25 +11,13 @@ public Fossil(int x) { } /** - * Returns a Fossil object if the given string is the result of an F3+I command + * Returns a Fossil object if the given F3+I-location is * in the 0,0 chunk, null otherwise. */ - public static Fossil parseF3I(String string) { - if (!string.startsWith("/setblock ")) - return null; - String[] substrings = string.split(" "); - if (substrings.length != 5) - return null; - try { - int x = Integer.parseInt(substrings[1]); - int z = Integer.parseInt(substrings[3]); - if (0 <= x && x < 16 && 0 <= z && z < 16) { - return new Fossil(x); - } - return null; - } catch (NullPointerException | NumberFormatException e) { - return null; - } + public static Fossil tryCreateFromF3I(F3IData f3IData) { + if (0 <= f3IData.x && f3IData.x < 16 && 0 <= f3IData.z && f3IData.z < 16) + return new Fossil(f3IData.x); + return null; } @Override diff --git a/src/main/java/ninjabrainbot/model/datastate/endereye/CoordinateInputSource.java b/src/main/java/ninjabrainbot/model/datastate/endereye/CoordinateInputSource.java index 93c3a266..687d0bc5 100644 --- a/src/main/java/ninjabrainbot/model/datastate/endereye/CoordinateInputSource.java +++ b/src/main/java/ninjabrainbot/model/datastate/endereye/CoordinateInputSource.java @@ -5,20 +5,21 @@ import ninjabrainbot.event.ISubscribable; import ninjabrainbot.event.ObservableField; import ninjabrainbot.io.IClipboardProvider; -import ninjabrainbot.model.datastate.common.*; -import ninjabrainbot.model.datastate.divine.Fossil; -import ninjabrainbot.model.input.IFossilInputSource; +import ninjabrainbot.model.datastate.common.DetailedPlayerPosition; +import ninjabrainbot.model.datastate.common.IDetailedPlayerPosition; +import ninjabrainbot.model.datastate.common.ILimitedPlayerPosition; +import ninjabrainbot.model.datastate.common.IPlayerPositionInputSource; +import ninjabrainbot.model.datastate.common.LimitedPlayerPosition; import ninjabrainbot.model.input.IF3ILocationInputSource; /** * Listens changes of the clipboard in the ClipboardProvider and parses any compatible clipboard strings * into player positions and fossils, exposed through the streams whenNewPlayerPositionInputted(), and whenNewFossilInputted(). */ -public class CoordinateInputSource implements IPlayerPositionInputSource, IFossilInputSource, IF3ILocationInputSource, IDisposable { +public class CoordinateInputSource implements IPlayerPositionInputSource, IF3ILocationInputSource, IDisposable { private final ObservableField whenNewDetailedPlayerPositionInputted; private final ObservableField whenNewLimitedPlayerPositionInputted; - private final ObservableField whenNewFossilInputted; private final ObservableField whenNewF3ILocationInputted; private final DisposeHandler disposeHandler = new DisposeHandler(); @@ -26,7 +27,6 @@ public class CoordinateInputSource implements IPlayerPositionInputSource, IFossi public CoordinateInputSource(IClipboardProvider clipboardProvider) { whenNewDetailedPlayerPositionInputted = new ObservableField<>(null, true); whenNewLimitedPlayerPositionInputted = new ObservableField<>(null, true); - whenNewFossilInputted = new ObservableField<>(null, true); whenNewF3ILocationInputted = new ObservableField<>(null, true); disposeHandler.add(clipboardProvider.clipboardText().subscribe(this::parseF3C)); @@ -48,11 +48,6 @@ private void parseF3C(String f3c) { return; } - final Fossil f = Fossil.parseF3I(f3c); - if (f != null) { - whenNewFossilInputted.setAndAlwaysNotifySubscribers(f); - } - F3IData f3iData = F3IData.tryParseF3IString(f3c); if (f3iData != null) { whenNewF3ILocationInputted.setAndAlwaysNotifySubscribers(f3iData); @@ -67,10 +62,6 @@ public ISubscribable whenNewLimitedPlayerPositionInputte return whenNewLimitedPlayerPositionInputted; } - public ISubscribable whenNewFossilInputted() { - return whenNewFossilInputted; - } - public ISubscribable whenNewF3ILocationInputted() { return whenNewF3ILocationInputted; } diff --git a/src/main/java/ninjabrainbot/model/input/F3ILocationInputHandler.java b/src/main/java/ninjabrainbot/model/input/F3ILocationInputHandler.java index 61eff96a..6b891ea0 100644 --- a/src/main/java/ninjabrainbot/model/input/F3ILocationInputHandler.java +++ b/src/main/java/ninjabrainbot/model/input/F3ILocationInputHandler.java @@ -5,11 +5,13 @@ import ninjabrainbot.io.preferences.NinjabrainBotPreferences; import ninjabrainbot.model.actions.IActionExecutor; import ninjabrainbot.model.actions.alladvancements.SetF3ILocationAction; +import ninjabrainbot.model.actions.common.SetFossilAction; import ninjabrainbot.model.datastate.IDataState; +import ninjabrainbot.model.datastate.divine.Fossil; import ninjabrainbot.model.datastate.endereye.F3IData; /** - * Listens to the stream of fossils and decides if/how the fossils should be inputted into the data state. + * Listens to the stream of F3+I-inputs and decides if/how they should be inputted into the data state. */ public class F3ILocationInputHandler implements IDisposable { @@ -26,13 +28,18 @@ public F3ILocationInputHandler(IF3ILocationInputSource f3iLocationInputSource, I disposeHandler.add(f3iLocationInputSource.whenNewF3ILocationInputted().subscribe(this::onNewF3ILocation)); } - private void onNewF3ILocation(F3IData pos) { + private void onNewF3ILocation(F3IData f3IData) { if (dataState.locked().get()) return; - // Only execute if 1.20+ AA mode enabled. - if (preferences.oneDotTwentyPlusAA.get() && preferences.allAdvancements.get()) { - actionExecutor.executeImmediately(new SetF3ILocationAction(dataState.allAdvancementsDataState(), pos)); + if (dataState.allAdvancementsDataState().allAdvancementsModeEnabled().get()) { + // Only execute if 1.20+ AA mode enabled. + if (preferences.oneDotTwentyPlusAA.get() && preferences.allAdvancements.get()) { + actionExecutor.executeImmediately(new SetF3ILocationAction(dataState.allAdvancementsDataState(), f3IData)); + } + } else { + Fossil fossil = Fossil.tryCreateFromF3I(f3IData); + actionExecutor.executeImmediately(new SetFossilAction(dataState.getDivineContext(), fossil)); } } diff --git a/src/main/java/ninjabrainbot/model/input/FossilInputHandler.java b/src/main/java/ninjabrainbot/model/input/FossilInputHandler.java deleted file mode 100644 index c4819233..00000000 --- a/src/main/java/ninjabrainbot/model/input/FossilInputHandler.java +++ /dev/null @@ -1,37 +0,0 @@ -package ninjabrainbot.model.input; - -import ninjabrainbot.event.DisposeHandler; -import ninjabrainbot.event.IDisposable; -import ninjabrainbot.model.actions.IActionExecutor; -import ninjabrainbot.model.actions.common.SetFossilAction; -import ninjabrainbot.model.datastate.IDataState; -import ninjabrainbot.model.datastate.divine.Fossil; - -/** - * Listens to the stream of fossils and decides if/how the fossils should be inputted into the data state. - */ -public class FossilInputHandler implements IDisposable { - - private final IDataState dataState; - private final IActionExecutor actionExecutor; - - final DisposeHandler disposeHandler = new DisposeHandler(); - - public FossilInputHandler(IFossilInputSource fossilInputSource, IDataState dataState, IActionExecutor actionExecutor) { - this.dataState = dataState; - this.actionExecutor = actionExecutor; - disposeHandler.add(fossilInputSource.whenNewFossilInputted().subscribe(this::onNewFossil)); - } - - private void onNewFossil(Fossil fossil) { - if (dataState.locked().get()) - return; - - actionExecutor.executeImmediately(new SetFossilAction(dataState.getDivineContext(), fossil)); - } - - @Override - public void dispose() { - disposeHandler.dispose(); - } -} diff --git a/src/main/java/ninjabrainbot/model/input/IFossilInputSource.java b/src/main/java/ninjabrainbot/model/input/IFossilInputSource.java deleted file mode 100644 index b167158c..00000000 --- a/src/main/java/ninjabrainbot/model/input/IFossilInputSource.java +++ /dev/null @@ -1,13 +0,0 @@ -package ninjabrainbot.model.input; - -import ninjabrainbot.model.datastate.divine.Fossil; -import ninjabrainbot.event.ISubscribable; - -public interface IFossilInputSource { - - /** - * Notifies subscribers whenever new fossil coordinates have been inputted, e.g. as a result of a F3+I command. - */ - ISubscribable whenNewFossilInputted(); - -} From 0f8b4bdc624719a53a5f89afa4a601aeed3837e6 Mon Sep 17 00:00:00 2001 From: Filip Ryblad Date: Thu, 5 Sep 2024 21:58:09 +0200 Subject: [PATCH 4/7] Rename SetAllAdvancementsGeneralLocationAction --- ...ion.java => SetAllAdvancementsGeneralLocationAction.java} | 5 ++--- .../ninjabrainbot/model/input/F3ILocationInputHandler.java | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) rename src/main/java/ninjabrainbot/model/actions/alladvancements/{SetF3ILocationAction.java => SetAllAdvancementsGeneralLocationAction.java} (78%) diff --git a/src/main/java/ninjabrainbot/model/actions/alladvancements/SetF3ILocationAction.java b/src/main/java/ninjabrainbot/model/actions/alladvancements/SetAllAdvancementsGeneralLocationAction.java similarity index 78% rename from src/main/java/ninjabrainbot/model/actions/alladvancements/SetF3ILocationAction.java rename to src/main/java/ninjabrainbot/model/actions/alladvancements/SetAllAdvancementsGeneralLocationAction.java index a055efe6..1d643bbd 100644 --- a/src/main/java/ninjabrainbot/model/actions/alladvancements/SetF3ILocationAction.java +++ b/src/main/java/ninjabrainbot/model/actions/alladvancements/SetAllAdvancementsGeneralLocationAction.java @@ -5,12 +5,12 @@ import ninjabrainbot.model.datastate.common.StructurePosition; import ninjabrainbot.model.datastate.endereye.F3IData; -public class SetF3ILocationAction implements IAction { +public class SetAllAdvancementsGeneralLocationAction implements IAction { private final IAllAdvancementsDataState allAdvancementsDataState; private final StructurePosition structurePosition; - public SetF3ILocationAction(IAllAdvancementsDataState allAdvancementsDataState, F3IData f3iData) { + public SetAllAdvancementsGeneralLocationAction(IAllAdvancementsDataState allAdvancementsDataState, F3IData f3iData) { this.allAdvancementsDataState = allAdvancementsDataState; this.structurePosition = new StructurePosition(f3iData.x, f3iData.z); } @@ -19,5 +19,4 @@ public SetF3ILocationAction(IAllAdvancementsDataState allAdvancementsDataState, public void execute() { allAdvancementsDataState.generalLocationPosition().set(structurePosition); } - } diff --git a/src/main/java/ninjabrainbot/model/input/F3ILocationInputHandler.java b/src/main/java/ninjabrainbot/model/input/F3ILocationInputHandler.java index 6b891ea0..22d61a06 100644 --- a/src/main/java/ninjabrainbot/model/input/F3ILocationInputHandler.java +++ b/src/main/java/ninjabrainbot/model/input/F3ILocationInputHandler.java @@ -4,7 +4,7 @@ import ninjabrainbot.event.IDisposable; import ninjabrainbot.io.preferences.NinjabrainBotPreferences; import ninjabrainbot.model.actions.IActionExecutor; -import ninjabrainbot.model.actions.alladvancements.SetF3ILocationAction; +import ninjabrainbot.model.actions.alladvancements.SetAllAdvancementsGeneralLocationAction; import ninjabrainbot.model.actions.common.SetFossilAction; import ninjabrainbot.model.datastate.IDataState; import ninjabrainbot.model.datastate.divine.Fossil; @@ -35,7 +35,7 @@ private void onNewF3ILocation(F3IData f3IData) { if (dataState.allAdvancementsDataState().allAdvancementsModeEnabled().get()) { // Only execute if 1.20+ AA mode enabled. if (preferences.oneDotTwentyPlusAA.get() && preferences.allAdvancements.get()) { - actionExecutor.executeImmediately(new SetF3ILocationAction(dataState.allAdvancementsDataState(), f3IData)); + actionExecutor.executeImmediately(new SetAllAdvancementsGeneralLocationAction(dataState.allAdvancementsDataState(), f3IData)); } } else { Fossil fossil = Fossil.tryCreateFromF3I(f3IData); From 2d6924eb91002360d25eb102b34501b8b0573bd0 Mon Sep 17 00:00:00 2001 From: Filip Ryblad Date: Thu, 5 Sep 2024 22:44:20 +0200 Subject: [PATCH 5/7] cleanup --- .../alladvancements/AllAdvancementsPanel.java | 11 +------ .../gui/mainwindow/main/MainTextArea.java | 17 +++++----- .../TryAddAllAdvancementsStructureAction.java | 32 ++++++++----------- .../datastate/common/StructurePosition.java | 15 --------- .../endereye/CoordinateInputSource.java | 12 +++---- .../model/datastate/endereye/F3CData.java | 22 ++++++------- 6 files changed, 39 insertions(+), 70 deletions(-) diff --git a/src/main/java/ninjabrainbot/gui/mainwindow/alladvancements/AllAdvancementsPanel.java b/src/main/java/ninjabrainbot/gui/mainwindow/alladvancements/AllAdvancementsPanel.java index f2df5c1f..4c1c2745 100644 --- a/src/main/java/ninjabrainbot/gui/mainwindow/alladvancements/AllAdvancementsPanel.java +++ b/src/main/java/ninjabrainbot/gui/mainwindow/alladvancements/AllAdvancementsPanel.java @@ -16,7 +16,7 @@ import ninjabrainbot.io.preferences.NinjabrainBotPreferences; import ninjabrainbot.model.input.IButtonInputHandler; -public class AllAdvancementsPanel extends ThemedPanel implements IDisposable { +public class AllAdvancementsPanel extends ThemedPanel { private final NinjabrainBotPreferences preferences; private static final ImageIcon strongholdIcon = new ImageIcon(Objects.requireNonNull(Main.class.getResource("/stronghold_icon.png"))); @@ -29,7 +29,6 @@ public class AllAdvancementsPanel extends ThemedPanel implements IDisposable { private static final ImageIcon generalLocationIcon = new ImageIcon(Objects.requireNonNull(Main.class.getResource("/general_location_icon.png"))); private final ArrayList oneDotTwentyPlusPanels = new ArrayList<>(); - final Subscription generalLocationSubscription; public AllAdvancementsPanel(StyleManager styleManager, IButtonInputHandler buttonInputHandler, IAllAdvancementsDataState allAdvancementsDataState, NinjabrainBotPreferences preferences) { super(styleManager); @@ -43,7 +42,6 @@ public AllAdvancementsPanel(StyleManager styleManager, IButtonInputHandler butto oneDotTwentyPlusPanels.add(new StructurePanel(styleManager, buttonInputHandler, allAdvancementsDataState.shulkerTransportPosition(), shulkerTransportIcon, true, true, false)); oneDotTwentyPlusPanels.add(new StructurePanel(styleManager, buttonInputHandler, allAdvancementsDataState.cityQueryPosition(), cityQueryIcon, true, true, false)); oneDotTwentyPlusPanels.add(new StructurePanel(styleManager, buttonInputHandler, allAdvancementsDataState.generalLocationPosition(), generalLocationIcon, true, false, false)); - generalLocationSubscription = allAdvancementsDataState.generalLocationPosition().subscribeEDT(__ -> updateOneDotTwentyPlusAAEnabled()); for (StructurePanel panel : oneDotTwentyPlusPanels) { add(panel); } @@ -55,8 +53,6 @@ public AllAdvancementsPanel(StyleManager styleManager, IButtonInputHandler butto } public void updateOneDotTwentyPlusAAEnabled() { - // print contents of oneDotTwentyPlusPanels for debugging - for (StructurePanel panel : oneDotTwentyPlusPanels) { panel.setEnabled(preferences.oneDotTwentyPlusAA.get()); panel.setVisible(preferences.oneDotTwentyPlusAA.get()); @@ -65,9 +61,4 @@ public void updateOneDotTwentyPlusAAEnabled() { this.revalidate(); this.repaint(); } - - @Override - public void dispose() { - generalLocationSubscription.dispose(); - } } diff --git a/src/main/java/ninjabrainbot/gui/mainwindow/main/MainTextArea.java b/src/main/java/ninjabrainbot/gui/mainwindow/main/MainTextArea.java index bb654387..c66f2fdb 100644 --- a/src/main/java/ninjabrainbot/gui/mainwindow/main/MainTextArea.java +++ b/src/main/java/ninjabrainbot/gui/mainwindow/main/MainTextArea.java @@ -61,23 +61,17 @@ public MainTextArea(StyleManager styleManager, IButtonInputHandler buttonInputHa updateResult(); } - private void updateOneDotTwentyPlusAAEnabled() { - allAdvancements.updateOneDotTwentyPlusAAEnabled(); - // Update the size of the panel - whenSizeModified.notifySubscribers(this); - } - private void setupSubscriptions() { // Settings disposeHandler.add(preferences.showNetherCoords.whenModified().subscribeEDT(this::setNetherCoordsEnabled)); disposeHandler.add(preferences.showAngleUpdates.whenModified().subscribeEDT(this::setAngleUpdatesEnabled)); - disposeHandler.add(preferences.view.whenModified().subscribeEDT(__ -> onViewTypeChanged())); - disposeHandler.add(preferences.oneDotTwentyPlusAA.whenModified().subscribeEDT(__ -> updateOneDotTwentyPlusAAEnabled())); + disposeHandler.add(preferences.view.whenModified().subscribeEDT(this::onViewTypeChanged)); + disposeHandler.add(preferences.oneDotTwentyPlusAA.whenModified().subscribeEDT(this::updateOneDotTwentyPlusAAEnabled)); // Data state disposeHandler.add(dataState.calculatorResult().subscribeEDT(this::setResult)); disposeHandler.add(dataState.blindResult().subscribeEDT(this::setResult)); disposeHandler.add(dataState.divineResult().subscribeEDT(this::setResult)); - disposeHandler.add(dataState.resultType().subscribeEDT(__ -> updateResult())); + disposeHandler.add(dataState.resultType().subscribeEDT(this::updateResult)); } private void onViewTypeChanged() { @@ -148,6 +142,11 @@ private void setAngleUpdatesEnabled(boolean b) { whenSizeModified.notifySubscribers(this); } + private void updateOneDotTwentyPlusAAEnabled() { + allAdvancements.updateOneDotTwentyPlusAAEnabled(); + whenSizeModified.notifySubscribers(this); + } + @Override public Dimension getPreferredSize() { if (preferences.view.get() == MainViewType.BASIC && !dataState.allAdvancementsDataState().allAdvancementsModeEnabled().get()) { diff --git a/src/main/java/ninjabrainbot/model/actions/alladvancements/TryAddAllAdvancementsStructureAction.java b/src/main/java/ninjabrainbot/model/actions/alladvancements/TryAddAllAdvancementsStructureAction.java index 3d1f7107..2962808e 100644 --- a/src/main/java/ninjabrainbot/model/actions/alladvancements/TryAddAllAdvancementsStructureAction.java +++ b/src/main/java/ninjabrainbot/model/actions/alladvancements/TryAddAllAdvancementsStructureAction.java @@ -25,17 +25,6 @@ public TryAddAllAdvancementsStructureAction(IDataState dataState, IDetailedPlaye this.preferences = preferences; } - private StructurePosition getStructurePosition(StructureType structureType) { - switch (structureType) { - case Outpost: - return getOutpostPosition(playerPosition); - case CityQuery: - return getCityRegionCentre(playerPosition); - default: - return new StructurePosition((int) Math.floor(playerPosition.xInOverworld()), (int) Math.floor(playerPosition.zInOverworld()), playerPositionObservable); - } - } - @Override public void execute() { StructureType structureType = getAllAdvancementStructureTypeFromPlayerPosition(playerPosition); @@ -56,13 +45,8 @@ private StructureType getAllAdvancementStructureTypeFromPlayerPosition(IDetailed if (t.isInNether()) return StructureType.Unknown; - if (t.isInEnd()) { - if (preferences.oneDotTwentyPlusAA.get()) { - return StructureType.ShulkerTransport; - } else { - return StructureType.Unknown; - } - } + if (t.isInEnd()) + return preferences.oneDotTwentyPlusAA.get() ? StructureType.ShulkerTransport : StructureType.Unknown; if (Math.abs(t.xInOverworld()) <= 300 && Math.abs(t.zInOverworld()) <= 300 && Math.abs(Math.round(t.yInPlayerDimension()) - t.yInPlayerDimension()) < 0.001) return StructureType.Spawn; @@ -88,6 +72,17 @@ private StructureType getAllAdvancementStructureTypeFromPlayerPosition(IDetailed return StructureType.Outpost; } + private StructurePosition getStructurePosition(StructureType structureType) { + switch (structureType) { + case Outpost: + return getOutpostPosition(playerPosition); + case CityQuery: + return getCityRegionCentre(playerPosition); + default: + return new StructurePosition((int) Math.floor(playerPosition.xInOverworld()), (int) Math.floor(playerPosition.zInOverworld()), playerPositionObservable); + } + } + private StructurePosition getOutpostPosition(IDetailedPlayerPosition t) { int averageOutpostY = 80; double deltaY = averageOutpostY - t.yInPlayerDimension(); @@ -99,7 +94,6 @@ private StructurePosition getOutpostPosition(IDetailedPlayerPosition t) { return new StructurePosition((int) (t.xInOverworld() + deltaX), (int) (t.zInOverworld() + deltaZ), playerPositionObservable); } - // City region centres are at chunk positions 24m + 8, where m is an integer. // Find the closest city region centre to the player's position. private StructurePosition getCityRegionCentre(IDetailedPlayerPosition t) { diff --git a/src/main/java/ninjabrainbot/model/datastate/common/StructurePosition.java b/src/main/java/ninjabrainbot/model/datastate/common/StructurePosition.java index b60fb134..7d1102ed 100644 --- a/src/main/java/ninjabrainbot/model/datastate/common/StructurePosition.java +++ b/src/main/java/ninjabrainbot/model/datastate/common/StructurePosition.java @@ -129,19 +129,4 @@ public void dispose() { playerPosSubscription.dispose(); } - public static StructurePosition tryParseF3ILocation(String f3i) { - if (!f3i.startsWith("/setblock ")) - return null; - String[] substrings = f3i.split(" "); - if (substrings.length != 5) - return null; - try { - int x = Integer.parseInt(substrings[1]); - int z = Integer.parseInt(substrings[3]); - return new StructurePosition(x, z); - } catch (NullPointerException | NumberFormatException e) { - return null; - } - } - } diff --git a/src/main/java/ninjabrainbot/model/datastate/endereye/CoordinateInputSource.java b/src/main/java/ninjabrainbot/model/datastate/endereye/CoordinateInputSource.java index 687d0bc5..5710f9e8 100644 --- a/src/main/java/ninjabrainbot/model/datastate/endereye/CoordinateInputSource.java +++ b/src/main/java/ninjabrainbot/model/datastate/endereye/CoordinateInputSource.java @@ -29,26 +29,26 @@ public CoordinateInputSource(IClipboardProvider clipboardProvider) { whenNewLimitedPlayerPositionInputted = new ObservableField<>(null, true); whenNewF3ILocationInputted = new ObservableField<>(null, true); - disposeHandler.add(clipboardProvider.clipboardText().subscribe(this::parseF3C)); + disposeHandler.add(clipboardProvider.clipboardText().subscribe(this::onClipboardModified)); } - private void parseF3C(String f3c) { - if (f3c == null) + private void onClipboardModified(String clipboardString) { + if (clipboardString == null) return; - F3CData f3cData = F3CData.tryParseF3CString(f3c); + F3CData f3cData = F3CData.tryParseF3CString(clipboardString); if (f3cData != null) { whenNewDetailedPlayerPositionInputted.set(new DetailedPlayerPosition(f3cData.x, f3cData.y, f3cData.z, f3cData.horizontalAngle, f3cData.verticalAngle, f3cData.dimension)); return; } - InputData1_12 data1_12 = InputData1_12.parseInputString(f3c); + InputData1_12 data1_12 = InputData1_12.parseInputString(clipboardString); if (data1_12 != null) { whenNewLimitedPlayerPositionInputted.set(new LimitedPlayerPosition(data1_12.x, data1_12.z, data1_12.horizontalAngle, data1_12.correctionIncrements)); return; } - F3IData f3iData = F3IData.tryParseF3IString(f3c); + F3IData f3iData = F3IData.tryParseF3IString(clipboardString); if (f3iData != null) { whenNewF3ILocationInputted.setAndAlwaysNotifySubscribers(f3iData); } diff --git a/src/main/java/ninjabrainbot/model/datastate/endereye/F3CData.java b/src/main/java/ninjabrainbot/model/datastate/endereye/F3CData.java index d8778915..3d76f654 100644 --- a/src/main/java/ninjabrainbot/model/datastate/endereye/F3CData.java +++ b/src/main/java/ninjabrainbot/model/datastate/endereye/F3CData.java @@ -14,17 +14,6 @@ private F3CData(double x, double y, double z, double horizontalAngle, double ver this.dimension = dimension; } - private static MCDimension getMCDimension(String world) { - if (world.endsWith("overworld")) { - return MCDimension.OVERWORLD; - } else if (world.endsWith("the_nether")) { - return MCDimension.NETHER; - } else if (world.endsWith("the_end")) { - return MCDimension.END; - } - return null; - } - public static F3CData tryParseF3CString(String string) { if (!(string.startsWith("/execute in minecraft:"))) { return null; @@ -47,4 +36,15 @@ public static F3CData tryParseF3CString(String string) { } } + private static MCDimension getMCDimension(String world) { + if (world.endsWith("overworld")) { + return MCDimension.OVERWORLD; + } else if (world.endsWith("the_nether")) { + return MCDimension.NETHER; + } else if (world.endsWith("the_end")) { + return MCDimension.END; + } + return null; + } + } From c88d0500c4dc07b8cb8861541c049a5ecd3a8253 Mon Sep 17 00:00:00 2001 From: Filip Ryblad Date: Thu, 5 Sep 2024 23:17:00 +0200 Subject: [PATCH 6/7] fix size inconsistency --- .../mainwindow/alladvancements/RemoveStructureButton.java | 3 +++ .../ninjabrainbot/gui/mainwindow/main/MainTextArea.java | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/ninjabrainbot/gui/mainwindow/alladvancements/RemoveStructureButton.java b/src/main/java/ninjabrainbot/gui/mainwindow/alladvancements/RemoveStructureButton.java index 5d4e1a1c..14db0410 100644 --- a/src/main/java/ninjabrainbot/gui/mainwindow/alladvancements/RemoveStructureButton.java +++ b/src/main/java/ninjabrainbot/gui/mainwindow/alladvancements/RemoveStructureButton.java @@ -1,5 +1,7 @@ package ninjabrainbot.gui.mainwindow.alladvancements; +import javax.swing.border.EmptyBorder; + import ninjabrainbot.event.DisposeHandler; import ninjabrainbot.event.IDisposable; import ninjabrainbot.event.IObservable; @@ -18,6 +20,7 @@ public RemoveStructureButton(StyleManager styleManager, IObservable { if (structurePosition.get() != null) buttonInputHandler.onRemoveAllAdvancementsStructureButtonPressed(structurePosition.get()); diff --git a/src/main/java/ninjabrainbot/gui/mainwindow/main/MainTextArea.java b/src/main/java/ninjabrainbot/gui/mainwindow/main/MainTextArea.java index c66f2fdb..b5c6a0de 100644 --- a/src/main/java/ninjabrainbot/gui/mainwindow/main/MainTextArea.java +++ b/src/main/java/ninjabrainbot/gui/mainwindow/main/MainTextArea.java @@ -149,10 +149,10 @@ private void updateOneDotTwentyPlusAAEnabled() { @Override public Dimension getPreferredSize() { - if (preferences.view.get() == MainViewType.BASIC && !dataState.allAdvancementsDataState().allAdvancementsModeEnabled().get()) { - return basicTriangulation.getPreferredSize(); - } else if (dataState.allAdvancementsDataState().allAdvancementsModeEnabled().get()) { + if (dataState.allAdvancementsDataState().allAdvancementsModeEnabled().get()) { return allAdvancements.getPreferredSize(); + } else if (preferences.view.get() == MainViewType.BASIC) { + return basicTriangulation.getPreferredSize(); } else { return detailedTriangulation.getPreferredSize(); } From 29d7d97055b83715c926656e64777d8328b2fb2b Mon Sep 17 00:00:00 2001 From: Filip Ryblad Date: Thu, 5 Sep 2024 23:25:08 +0200 Subject: [PATCH 7/7] Fix tests --- .../model/datastate/endereye/F3IData.java | 2 +- .../DataStateIntegrationTests.java | 4 ++-- .../IntegrationTestBuilder.java | 20 +++++++++---------- .../model/ResultTypeProviderTests.java | 11 +++++----- .../util/FakeCoordinateInputSource.java | 18 ++++++++--------- 5 files changed, 27 insertions(+), 28 deletions(-) diff --git a/src/main/java/ninjabrainbot/model/datastate/endereye/F3IData.java b/src/main/java/ninjabrainbot/model/datastate/endereye/F3IData.java index b4e0c4f1..b08633b9 100644 --- a/src/main/java/ninjabrainbot/model/datastate/endereye/F3IData.java +++ b/src/main/java/ninjabrainbot/model/datastate/endereye/F3IData.java @@ -4,7 +4,7 @@ public class F3IData { public final int x, y, z; - private F3IData(int x, int y, int z) { + public F3IData(int x, int y, int z) { this.x = x; this.y = y; this.z = z; diff --git a/src/test/java/ninjabrainbot/integrationtests/DataStateIntegrationTests.java b/src/test/java/ninjabrainbot/integrationtests/DataStateIntegrationTests.java index 1c9bff37..cdcac8b1 100644 --- a/src/test/java/ninjabrainbot/integrationtests/DataStateIntegrationTests.java +++ b/src/test/java/ninjabrainbot/integrationtests/DataStateIntegrationTests.java @@ -1,7 +1,6 @@ package ninjabrainbot.integrationtests; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -9,6 +8,7 @@ import ninjabrainbot.model.datastate.common.DetailedPlayerPosition; import ninjabrainbot.model.datastate.common.ResultType; import ninjabrainbot.model.datastate.divine.Fossil; +import ninjabrainbot.model.datastate.endereye.F3IData; import ninjabrainbot.model.datastate.endereye.MCDimension; import org.junit.jupiter.api.Assertions; @@ -21,7 +21,7 @@ void dataComponentsOnlySendsOneEventOnReset() { // Arrange IntegrationTestBuilder testBuilder = new IntegrationTestBuilder().withProSettings().withAllAdvancementsSettings(); - testBuilder.inputFossil(new Fossil(4)); + testBuilder.inputF3I(new F3IData(4, 0, 0)); testBuilder.inputDetailedPlayerPosition(new DetailedPlayerPosition(0, 80, 0, 12, -31, MCDimension.OVERWORLD)); testBuilder.inputDetailedPlayerPosition(new DetailedPlayerPosition(0, 80, 1000, 12, -31, MCDimension.NETHER)); diff --git a/src/test/java/ninjabrainbot/integrationtests/IntegrationTestBuilder.java b/src/test/java/ninjabrainbot/integrationtests/IntegrationTestBuilder.java index 9f77d206..db10413c 100644 --- a/src/test/java/ninjabrainbot/integrationtests/IntegrationTestBuilder.java +++ b/src/test/java/ninjabrainbot/integrationtests/IntegrationTestBuilder.java @@ -14,23 +14,23 @@ import ninjabrainbot.io.preferences.NinjabrainBotPreferences; import ninjabrainbot.io.preferences.UnsavedPreferences; import ninjabrainbot.io.preferences.enums.AllAdvancementsToggleType; +import ninjabrainbot.io.preferences.enums.AngleAdjustmentType; import ninjabrainbot.io.preferences.enums.MainViewType; import ninjabrainbot.io.preferences.enums.StrongholdDisplayType; -import ninjabrainbot.io.preferences.enums.AngleAdjustmentType; import ninjabrainbot.model.ModelState; import ninjabrainbot.model.actions.IActionExecutor; import ninjabrainbot.model.datastate.IDataState; import ninjabrainbot.model.datastate.common.IDetailedPlayerPosition; -import ninjabrainbot.model.datastate.divine.Fossil; import ninjabrainbot.model.datastate.endereye.CoordinateInputSource; import ninjabrainbot.model.datastate.endereye.EnderEyeThrowFactory; +import ninjabrainbot.model.datastate.endereye.F3IData; import ninjabrainbot.model.datastate.endereye.IEnderEyeThrowFactory; import ninjabrainbot.model.domainmodel.IDomainModel; import ninjabrainbot.model.environmentstate.IEnvironmentState; import ninjabrainbot.model.information.InformationMessageList; import ninjabrainbot.model.input.ActiveInstanceInputHandler; import ninjabrainbot.model.input.ButtonInputHandler; -import ninjabrainbot.model.input.FossilInputHandler; +import ninjabrainbot.model.input.F3ILocationInputHandler; import ninjabrainbot.model.input.HotkeyInputHandler; import ninjabrainbot.model.input.PlayerPositionInputHandler; import ninjabrainbot.util.Assert; @@ -58,8 +58,8 @@ public class IntegrationTestBuilder { private PlayerPositionInputHandler playerPositionInputHandler; private PlayerPositionInputHandler fakePlayerPositionInputHandler; - private FossilInputHandler fossilInputHandler; - private FossilInputHandler fakeFossilInputHandler; + private F3ILocationInputHandler f3iLocationInputHandler; + private F3ILocationInputHandler fakeF3ILocationInputHandler; private HotkeyInputHandler hotkeyInputHandler; private ButtonInputHandler buttonInputHandler; private ActiveInstanceInputHandler activeInstanceInputHandler; @@ -122,7 +122,7 @@ public void setClipboard(String clipboardString) { if (clipboardReader == null) clipboardReader = new MockedClipboardReader(); if (coordinateInputSource == null) coordinateInputSource = new CoordinateInputSource(clipboardReader); if (playerPositionInputHandler == null) playerPositionInputHandler = createPlayerPositionInputHandler(); - if (fossilInputHandler == null) fossilInputHandler = new FossilInputHandler(coordinateInputSource, dataState, actionExecutor); + if (f3iLocationInputHandler == null) f3iLocationInputHandler = new F3ILocationInputHandler(coordinateInputSource, dataState, actionExecutor, preferences); clipboardReader.setClipboard(clipboardString); } @@ -195,12 +195,12 @@ public void inputDetailedPlayerPosition(IDetailedPlayerPosition detailedPlayerPo fakeCoordinateInputSource.whenNewDetailedPlayerPositionInputted.notifySubscribers(detailedPlayerPosition); } - public void inputFossil(Fossil fossil) { + public void inputF3I(F3IData f3IData) { if (fakeCoordinateInputSource == null) fakeCoordinateInputSource = new FakeCoordinateInputSource(); - if (fakeFossilInputHandler == null) - fakeFossilInputHandler = new FossilInputHandler(fakeCoordinateInputSource, dataState, actionExecutor); - fakeCoordinateInputSource.whenNewFossilInputted.notifySubscribers(fossil); + if (fakeF3ILocationInputHandler == null) + fakeF3ILocationInputHandler = new F3ILocationInputHandler(fakeCoordinateInputSource, dataState, actionExecutor, preferences); + fakeCoordinateInputSource.whenNewF3IInputted.notifySubscribers(f3IData); } public void resetCalculator() { diff --git a/src/test/java/ninjabrainbot/model/ResultTypeProviderTests.java b/src/test/java/ninjabrainbot/model/ResultTypeProviderTests.java index 7872b1a1..964d46a5 100644 --- a/src/test/java/ninjabrainbot/model/ResultTypeProviderTests.java +++ b/src/test/java/ninjabrainbot/model/ResultTypeProviderTests.java @@ -9,13 +9,12 @@ import ninjabrainbot.model.datastate.blind.BlindResult; import ninjabrainbot.model.datastate.common.IDetailedPlayerPosition; import ninjabrainbot.model.datastate.common.ResultType; -import ninjabrainbot.model.datastate.divine.Fossil; import ninjabrainbot.model.datastate.endereye.EnderEyeThrowFactory; +import ninjabrainbot.model.datastate.endereye.F3IData; import ninjabrainbot.model.datastate.endereye.IEnderEyeThrowFactory; import ninjabrainbot.model.domainmodel.DomainModel; -import ninjabrainbot.model.environmentstate.CalculatorSettings; import ninjabrainbot.model.environmentstate.EnvironmentState; -import ninjabrainbot.model.input.FossilInputHandler; +import ninjabrainbot.model.input.F3ILocationInputHandler; import ninjabrainbot.model.input.PlayerPositionInputHandler; import ninjabrainbot.util.FakeCoordinateInputSource; import ninjabrainbot.util.TestUtils; @@ -47,14 +46,14 @@ void resultTypeUpdatesCorrectly() { FakeCoordinateInputSource coordinateInputSource = new FakeCoordinateInputSource(); IEnderEyeThrowFactory enderEyeThrowFactory = new EnderEyeThrowFactory(preferences, dataState.boatDataState()); new PlayerPositionInputHandler(coordinateInputSource, dataState, actionExecutor, preferences, enderEyeThrowFactory); - new FossilInputHandler(coordinateInputSource, dataState, actionExecutor); + new F3ILocationInputHandler(coordinateInputSource, dataState, actionExecutor, preferences); ObservableProperty playerPositionStream = coordinateInputSource.whenNewDetailedPlayerPositionInputted; - ObservableProperty fossilStream = coordinateInputSource.whenNewFossilInputted; + ObservableProperty f3iStream = coordinateInputSource.whenNewF3IInputted; assertEquals(dataState.resultType().get(), ResultType.NONE); - fossilStream.notifySubscribers(new Fossil(1)); + f3iStream.notifySubscribers(new F3IData(1, 0, 0)); assertEquals(dataState.resultType().get(), ResultType.DIVINE); assertEquals(dataState.divineResult().get().fossil.x, 1); diff --git a/src/test/java/ninjabrainbot/util/FakeCoordinateInputSource.java b/src/test/java/ninjabrainbot/util/FakeCoordinateInputSource.java index 51a9bd2a..f127fe0a 100644 --- a/src/test/java/ninjabrainbot/util/FakeCoordinateInputSource.java +++ b/src/test/java/ninjabrainbot/util/FakeCoordinateInputSource.java @@ -1,23 +1,23 @@ package ninjabrainbot.util; +import ninjabrainbot.event.ISubscribable; +import ninjabrainbot.event.ObservableProperty; import ninjabrainbot.model.datastate.common.IDetailedPlayerPosition; import ninjabrainbot.model.datastate.common.ILimitedPlayerPosition; import ninjabrainbot.model.datastate.common.IPlayerPositionInputSource; -import ninjabrainbot.model.datastate.divine.Fossil; -import ninjabrainbot.model.input.IFossilInputSource; -import ninjabrainbot.event.ISubscribable; -import ninjabrainbot.event.ObservableProperty; +import ninjabrainbot.model.datastate.endereye.F3IData; +import ninjabrainbot.model.input.IF3ILocationInputSource; -public class FakeCoordinateInputSource implements IPlayerPositionInputSource, IFossilInputSource { +public class FakeCoordinateInputSource implements IPlayerPositionInputSource, IF3ILocationInputSource { public final ObservableProperty whenNewDetailedPlayerPositionInputted; public final ObservableProperty whenNewLimitedPlayerPositionInputted; - public final ObservableProperty whenNewFossilInputted; + public final ObservableProperty whenNewF3IInputted; public FakeCoordinateInputSource() { whenNewDetailedPlayerPositionInputted = new ObservableProperty<>(); whenNewLimitedPlayerPositionInputted = new ObservableProperty<>(); - whenNewFossilInputted = new ObservableProperty<>(); + whenNewF3IInputted = new ObservableProperty<>(); } public ISubscribable whenNewDetailedPlayerPositionInputted() { @@ -28,7 +28,7 @@ public ISubscribable whenNewLimitedPlayerPositionInputte return whenNewLimitedPlayerPositionInputted; } - public ISubscribable whenNewFossilInputted() { - return whenNewFossilInputted; + public ISubscribable whenNewF3ILocationInputted() { + return whenNewF3IInputted; } }