diff options
author | Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> | 2024-03-09 16:56:14 -0500 |
---|---|---|
committer | Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> | 2024-03-09 16:56:14 -0500 |
commit | 4a43b965bb0b105eb5c614932f965449e930f56b (patch) | |
tree | b2a03f646b9dde4e62ae5e0b8a56a77e781ee911 /src/main/java/de/hysky/skyblocker/config | |
parent | ef2ceee11a07b2861aca28aa73f87a1932a640d2 (diff) | |
download | Skyblocker-4a43b965bb0b105eb5c614932f965449e930f56b.tar.gz Skyblocker-4a43b965bb0b105eb5c614932f965449e930f56b.tar.bz2 Skyblocker-4a43b965bb0b105eb5c614932f965449e930f56b.zip |
Refactor Hud Config Screens and fix dragging
Diffstat (limited to 'src/main/java/de/hysky/skyblocker/config')
5 files changed, 134 insertions, 55 deletions
diff --git a/src/main/java/de/hysky/skyblocker/config/HudConfigScreen.java b/src/main/java/de/hysky/skyblocker/config/HudConfigScreen.java index c33e2f54..6884af83 100644 --- a/src/main/java/de/hysky/skyblocker/config/HudConfigScreen.java +++ b/src/main/java/de/hysky/skyblocker/config/HudConfigScreen.java @@ -2,82 +2,142 @@ package de.hysky.skyblocker.config; import de.hysky.skyblocker.skyblock.tabhud.widget.Widget; import de.hysky.skyblocker.utils.render.RenderHelper; -import it.unimi.dsi.fastutil.ints.IntIntImmutablePair; -import it.unimi.dsi.fastutil.ints.IntIntPair; +import it.unimi.dsi.fastutil.ints.IntIntMutablePair; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; import net.minecraft.text.Text; +import net.minecraft.util.math.MathHelper; import java.awt.*; +import java.util.List; +/** + * A screen for configuring the positions of HUD widgets. + * <p> + * This class takes care of rendering the widgets, dragging them, and resetting their positions. + * Create one subclass for each collection of HUD widgets that are displayed at the same time. + * (i.e. one for dwarven mines, one for the end, etc.) See an implementation for an example. + */ public abstract class HudConfigScreen extends Screen { - private final Widget widget; private final Screen parent; + private final List<Widget> widgets; - private int hudX = 0; - private int hudY = 0; - public HudConfigScreen(Text title, Widget widget, Screen parent) { + private Widget draggingWidget; + private double mouseClickRelativeX; + private double mouseClickRelativeY; + + /** + * Creates a new HudConfigScreen with the passed title, parent, and widget + * @param title the title of the screen + * @param parent the parent screen + * @param widget the widget to configure + */ + public HudConfigScreen(Text title, Screen parent, Widget widget) { + this(title, parent, List.of(widget)); + } + + /** + * Creates a new HudConfigScreen with the passed title, parent, and widgets + * @param title the title of the screen + * @param parent the parent screen + * @param widgets the widgets to configure + */ + public HudConfigScreen(Text title, Screen parent, List<Widget> widgets) { super(title); - this.widget = widget; this.parent = parent; - - int[] posFromConfig = getPosFromConfig(SkyblockerConfigManager.get()); - hudX = posFromConfig[0]; - hudY = posFromConfig[1]; + this.widgets = widgets; + resetPos(); } @Override - public void render(DrawContext context, int mouseX, int mouseY, float delta) { + public final void render(DrawContext context, int mouseX, int mouseY, float delta) { super.render(context, mouseX, mouseY, delta); renderBackground(context, mouseX, mouseY, delta); - renderWidget(context, hudX, hudY); + renderWidget(context, widgets); context.drawCenteredTextWithShadow(textRenderer, "Right Click To Reset Position", width / 2, height / 2, Color.GRAY.getRGB()); } + /** + * Renders the widgets using the default {@link Widget#render(DrawContext, boolean)} method. Override to change the behavior. + * @param context the context to render in + * @param widgets the widgets to render + */ + protected void renderWidget(DrawContext context, List<Widget> widgets) { + for (Widget widget : widgets) { + widget.render(context, SkyblockerConfigManager.get().general.tabHud.enableHudBackground); + } + } + @Override - public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) { - IntIntPair dims = getDimensions(); - if (RenderHelper.pointIsInArea(mouseX, mouseY, hudX, hudY, hudX + dims.leftInt(), hudY + dims.rightInt()) && button == 0) { - hudX = (int) Math.max(Math.min(mouseX - (double) dims.leftInt() / 2, this.width - dims.leftInt()), 0); - hudY = (int) Math.max(Math.min(mouseY - (double) dims.rightInt() / 2, this.height - dims.rightInt()), 0); + public final boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) { + if (button == 0 && draggingWidget != null) { + draggingWidget.setX((int) MathHelper.clamp(mouseX - mouseClickRelativeX, 0, this.width - draggingWidget.getWidth())); + draggingWidget.setY((int) MathHelper.clamp(mouseY - mouseClickRelativeY, 0, this.height - draggingWidget.getHeight())); } return super.mouseDragged(mouseX, mouseY, button, deltaX, deltaY); } @Override - public boolean mouseClicked(double mouseX, double mouseY, int button) { - if (button == 1) { - IntIntPair dims = getDimensions(); - hudX = this.width / 2 - dims.leftInt(); - hudY = this.height / 2 - dims.rightInt(); + public final boolean mouseClicked(double mouseX, double mouseY, int button) { + if (button == 0) { + for (Widget widget : widgets) { + if (RenderHelper.pointIsInArea(mouseX, mouseY, widget.getX(), widget.getY(), widget.getX() + widget.getWidth(), widget.getY() + widget.getHeight())) { + draggingWidget = widget; + mouseClickRelativeX = mouseX - widget.getX(); + mouseClickRelativeY = mouseY - widget.getY(); + break; + } + } + } else if (button == 1) { + resetPos(); } return super.mouseClicked(mouseX, mouseY, button); } - abstract protected int[] getPosFromConfig(SkyblockerConfig config); + @Override + public final boolean mouseReleased(double mouseX, double mouseY, int button) { + draggingWidget = null; + return super.mouseReleased(mouseX, mouseY, button); + } - protected IntIntPair getDimensions() { - return new IntIntImmutablePair(widget.getHeight(), widget.getWidth()); + /** + * Resets the positions of the widgets to the positions in the config. Override to change the behavior. + */ + protected void resetPos() { + List<IntIntMutablePair> configPositions = getConfigPos(SkyblockerConfigManager.get()); + if (configPositions.size() != widgets.size()) { + throw new IllegalStateException("The number of positions (" + configPositions.size() + ") does not match the number of widgets (" + widgets.size() + ")"); + } + for (int i = 0; i < widgets.size(); i++) { + Widget widget = widgets.get(i); + IntIntMutablePair configPos = configPositions.get(i); + widget.setX(configPos.leftInt()); + widget.setY(configPos.rightInt()); + } } + /** + * Returns the positions of the widgets in the config + * @param config the config to get the positions from + * @return the positions of the widgets + */ + protected abstract List<IntIntMutablePair> getConfigPos(SkyblockerConfig config); + @Override - public void close() { + public final void close() { SkyblockerConfig skyblockerConfig = SkyblockerConfigManager.get(); - savePos(skyblockerConfig, hudX, hudY); + savePos(skyblockerConfig, widgets); SkyblockerConfigManager.save(); client.setScreen(parent); } /** - * This method should save the passed position to the config + * Saves the passed positions to the config. * <p> * NOTE: The parent class will call {@link SkyblockerConfigManager#save()} right after this method * @param configManager the config so you don't have to get it - * @param x x - * @param y y + * @param widgets the widgets to save */ - abstract protected void savePos(SkyblockerConfig configManager, int x, int y); - - abstract protected void renderWidget(DrawContext context, int x, int y); + protected abstract void savePos(SkyblockerConfig configManager, List<Widget> widgets); } diff --git a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java index 9db212c1..e60aa03b 100644 --- a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java @@ -267,6 +267,9 @@ public class SkyblockerConfig { public int tabHudScale = 100; @SerialEntry + public boolean enableHudBackground = true; + + @SerialEntry public boolean plainPlayerNames = false; @SerialEntry @@ -942,9 +945,6 @@ public class SkyblockerConfig { public DwarvenHudStyle style = DwarvenHudStyle.SIMPLE; @SerialEntry - public boolean enableBackground = true; - - @SerialEntry public int x = 10; @SerialEntry @@ -1060,9 +1060,6 @@ public class SkyblockerConfig { public boolean hudEnabled = true; @SerialEntry - public boolean enableBackground = true; - - @SerialEntry public boolean waypoint = true; @SerialEntry @@ -1087,12 +1084,26 @@ public class SkyblockerConfig { public static class Garden { @SerialEntry + public FarmingHud farmingHud = new FarmingHud(); + + @SerialEntry public boolean dicerTitlePrevent = true; @SerialEntry public boolean visitorHelper = true; } + public static class FarmingHud { + @SerialEntry + public boolean enableHud = true; + + @SerialEntry + public int x; + + @SerialEntry + public int y; + } + public static class Slayer { @SerialEntry public EndermanSlayer endermanSlayer = new EndermanSlayer(); @@ -1196,6 +1207,7 @@ public class SkyblockerConfig { @SerialEntry public ChatRuleConfig chatRuleConfig = new ChatRuleConfig(); } + public static class ChatRuleConfig { @SerialEntry public int announcementLength = 60; diff --git a/src/main/java/de/hysky/skyblocker/config/categories/DwarvenMinesCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/DwarvenMinesCategory.java index 97b48bc4..4ae0fc35 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/DwarvenMinesCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/DwarvenMinesCategory.java @@ -76,13 +76,6 @@ public class DwarvenMinesCategory { .text(Text.translatable("text.skyblocker.open")) .action((screen, opt) -> MinecraftClient.getInstance().setScreen(new DwarvenHudConfigScreen(screen))) .build()) - .option(Option.<Boolean>createBuilder() - .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.enableBackground")) - .binding(defaults.locations.dwarvenMines.dwarvenHud.enableBackground, - () -> config.locations.dwarvenMines.dwarvenHud.enableBackground, - newValue -> config.locations.dwarvenMines.dwarvenHud.enableBackground = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) .build()) //crystal HUD .group(OptionGroup.createBuilder() diff --git a/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java index afd688d8..23ce7bb6 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java @@ -107,6 +107,14 @@ public class GeneralCategory { .controller(opt -> IntegerSliderControllerBuilder.create(opt).range(10, 200).step(1)) .build()) .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.general.tabHud.enableHudBackground")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.general.tabHud.enableHudBackground.@Tooltip"))) + .binding(defaults.general.tabHud.enableHudBackground, + () -> config.general.tabHud.enableHudBackground, + newValue -> config.general.tabHud.enableHudBackground = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() .name(Text.translatable("text.autoconfig.skyblocker.option.general.tabHud.plainPlayerNames")) .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.general.tabHud.plainPlayerNames.@Tooltip"))) .binding(defaults.general.tabHud.plainPlayerNames, diff --git a/src/main/java/de/hysky/skyblocker/config/categories/LocationsCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/LocationsCategory.java index d97513f8..86ed3f6c 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/LocationsCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/LocationsCategory.java @@ -4,6 +4,7 @@ import de.hysky.skyblocker.config.ConfigUtils; import de.hysky.skyblocker.config.SkyblockerConfig; import de.hysky.skyblocker.skyblock.end.EndHudConfigScreen; import de.hysky.skyblocker.skyblock.end.TheEnd; +import de.hysky.skyblocker.skyblock.garden.FarmingHudConfigScreen; import dev.isxander.yacl3.api.*; import dev.isxander.yacl3.api.controller.IntegerSliderControllerBuilder; import net.minecraft.client.MinecraftClient; @@ -91,13 +92,6 @@ public class LocationsCategory { .controller(ConfigUtils::createBooleanController) .build()) .option(Option.<Boolean>createBuilder() - .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dwarvenMines.dwarvenHud.enableBackground")) // Reusing that string cuz sure - .binding(defaults.locations.end.enableBackground, - () -> config.locations.end.enableBackground, - newValue -> config.locations.end.enableBackground = newValue) - .controller(ConfigUtils::createBooleanController) - .build()) - .option(Option.<Boolean>createBuilder() .name(Text.translatable("text.autoconfig.skyblocker.option.locations.end.waypoint")) .binding(defaults.locations.end.waypoint, () -> config.locations.end.waypoint, @@ -147,6 +141,18 @@ public class LocationsCategory { .name(Text.translatable("text.autoconfig.skyblocker.option.locations.garden")) .collapsed(false) .option(Option.<Boolean>createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.garden.farmingHud.enableHud")) + .binding(defaults.locations.garden.farmingHud.enableHud, + () -> config.locations.garden.farmingHud.enableHud, + newValue -> config.locations.garden.farmingHud.enableHud = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(ButtonOption.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.garden.farmingHud.config")) + .text(Text.translatable("text.skyblocker.open")) + .action((screen, opt) -> MinecraftClient.getInstance().setScreen(new FarmingHudConfigScreen(screen))) + .build()) + .option(Option.<Boolean>createBuilder() .name(Text.translatable("text.autoconfig.skyblocker.option.locations.garden.dicerTitlePrevent")) .binding(defaults.locations.garden.dicerTitlePrevent, () -> config.locations.garden.dicerTitlePrevent, @@ -154,7 +160,7 @@ public class LocationsCategory { .controller(ConfigUtils::createBooleanController) .build()) .option(Option.<Boolean>createBuilder() - .name(Text.translatable("text.autoconfig.skyblocker.option.general.visitorHelper")) + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.garden.visitorHelper")) .binding(defaults.locations.garden.visitorHelper, () -> config.locations.garden.visitorHelper, newValue -> config.locations.garden.visitorHelper = newValue) |