Skip to content

Commit

Permalink
Merge pull request #589 from kevinthegreat1/farming-hud
Browse files Browse the repository at this point in the history
Farming HUD & HUD Refactor
  • Loading branch information
kevinthegreat1 authored Mar 18, 2024
2 parents 40fc055 + 5cf396a commit 02a7ecc
Show file tree
Hide file tree
Showing 22 changed files with 504 additions and 262 deletions.
6 changes: 4 additions & 2 deletions src/main/java/de/hysky/skyblocker/SkyblockerMod.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
import de.hysky.skyblocker.debug.Debug;
import de.hysky.skyblocker.skyblock.*;
import de.hysky.skyblocker.skyblock.chat.ChatRuleAnnouncementScreen;
import de.hysky.skyblocker.skyblock.crimson.kuudra.Kuudra;
import de.hysky.skyblocker.skyblock.chat.ChatRulesHandler;
import de.hysky.skyblocker.skyblock.crimson.kuudra.Kuudra;
import de.hysky.skyblocker.skyblock.dungeon.*;
import de.hysky.skyblocker.skyblock.dungeon.partyfinder.PartyFinderScreen;
import de.hysky.skyblocker.skyblock.dungeon.puzzle.*;
Expand All @@ -22,6 +22,7 @@
import de.hysky.skyblocker.skyblock.dwarven.DwarvenHud;
import de.hysky.skyblocker.skyblock.end.BeaconHighlighter;
import de.hysky.skyblocker.skyblock.end.TheEnd;
import de.hysky.skyblocker.skyblock.garden.FarmingHud;
import de.hysky.skyblocker.skyblock.garden.VisitorHelper;
import de.hysky.skyblocker.skyblock.item.*;
import de.hysky.skyblocker.skyblock.item.tooltip.BackpackPreview;
Expand Down Expand Up @@ -108,8 +109,10 @@ public void onInitializeClient() {
BackpackPreview.init();
QuickNav.init();
ItemCooldowns.init();
TabHud.init();
DwarvenHud.init();
CrystalsHud.init();
FarmingHud.init();
CrystalsLocationsManager.init();
ChatMessageListener.init();
Shortcuts.init();
Expand All @@ -118,7 +121,6 @@ public void onInitializeClient() {
DiscordRPCManager.init();
LividColor.init();
FishingHelper.init();
TabHud.init();
DungeonMap.init();
DungeonManager.init();
DungeonBlaze.init();
Expand Down
129 changes: 94 additions & 35 deletions src/main/java/de/hysky/skyblocker/config/HudConfigScreen.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,82 +2,141 @@

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);
}
24 changes: 18 additions & 6 deletions src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,9 @@ public static class TabHudConf {
@SerialEntry
public int tabHudScale = 100;

@SerialEntry
public boolean enableHudBackground = true;

@SerialEntry
public boolean plainPlayerNames = false;

Expand Down Expand Up @@ -944,9 +947,6 @@ public static class DwarvenHud {
@SerialEntry
public DwarvenHudStyle style = DwarvenHudStyle.SIMPLE;

@SerialEntry
public boolean enableBackground = true;

@SerialEntry
public int x = 10;

Expand Down Expand Up @@ -1062,9 +1062,6 @@ public static class TheEnd {
@SerialEntry
public boolean hudEnabled = true;

@SerialEntry
public boolean enableBackground = true;

@SerialEntry
public boolean waypoint = true;

Expand All @@ -1089,13 +1086,27 @@ public static class Relics {
}

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();
Expand Down Expand Up @@ -1199,6 +1210,7 @@ public static class Messages {
@SerialEntry
public ChatRuleConfig chatRuleConfig = new ChatRuleConfig();
}

public static class ChatRuleConfig {
@SerialEntry
public int announcementLength = 60;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,13 +76,6 @@ public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig
.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()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,14 @@ public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig
newValue -> config.general.tabHud.tabHudScale = newValue)
.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")))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
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;
Expand Down Expand Up @@ -90,13 +91,6 @@ public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig
newValue -> config.locations.end.hudEnabled = newValue)
.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,
Expand Down Expand Up @@ -146,6 +140,18 @@ public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig
.group(OptionGroup.createBuilder()
.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,
Expand All @@ -154,7 +160,7 @@ public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig
.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)
Expand Down
Loading

0 comments on commit 02a7ecc

Please sign in to comment.