From 4442ba71db63b76b0b173995a9b4dff7642fad82 Mon Sep 17 00:00:00 2001 From: viciscat <51047087+viciscat@users.noreply.github.com> Date: Sun, 8 Sep 2024 22:49:06 +0200 Subject: refactor and javadoc a bit --- .../skyblock/dwarven/CrystalsHudWidget.java | 2 +- .../skyblocker/skyblock/garden/FarmingHud.java | 2 - .../skyblock/garden/FarmingHudWidget.java | 7 +- .../tabhud/widget/ComponentBasedWidget.java | 3 +- .../skyblock/tabhud/widget/HudWidget.java | 106 ++++++--------------- .../utils/render/gui/AbstractWidget.java | 84 ++++++++++++++++ 6 files changed, 122 insertions(+), 82 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/utils/render/gui/AbstractWidget.java (limited to 'src/main/java') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHudWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHudWidget.java index f472f734..01f591a0 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHudWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsHudWidget.java @@ -81,7 +81,7 @@ public class CrystalsHudWidget extends HudWidget { } @Override - public void render(DrawContext context, int mouseX, int mouseY, float delta) { + public void renderWidget(DrawContext context, int mouseX, int mouseY, float delta) { float scale = SkyblockerConfigManager.get().mining.crystalsHud.mapScaling; //make sure the map renders infront of some stuff - improve this in the future with better layering (1.20.5?) diff --git a/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHud.java b/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHud.java index 095f9b76..eea3a3b7 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHud.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHud.java @@ -63,8 +63,6 @@ public class FarmingHud { if (stack == null || !tryGetCounter(stack, CounterType.CULTIVATING) && !tryGetCounter(stack, CounterType.COUNTER)) { counterType = CounterType.NONE; } - - FarmingHudWidget.getInstance().update(); } }); ClientPlayerBlockBreakEvents.AFTER.register((world, player, pos, state) -> { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHudWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHudWidget.java index 5f7516b7..215956c5 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHudWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHudWidget.java @@ -65,7 +65,12 @@ public class FarmingHudWidget extends ComponentBasedWidget { update(); } - @Override + @Override + protected boolean shouldUpdateBeforeRendering() { + return true; + } + + @Override public void updateContent() { if (client.player == null) { addComponent(new PlainTextComponent(Text.literal("Nothing to show :p"))); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ComponentBasedWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ComponentBasedWidget.java index a6e901ba..81fc08c0 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ComponentBasedWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/ComponentBasedWidget.java @@ -83,7 +83,7 @@ public abstract class ComponentBasedWidget extends HudWidget { } @Override - public void render(DrawContext context, int mouseX, int mouseY, float delta) { + public final void renderWidget(DrawContext context, int mouseX, int mouseY, float delta) { MatrixStack ms = context.getMatrices(); // not sure if this is the way to go, but it fixes Z-layer issues @@ -145,6 +145,7 @@ public abstract class ComponentBasedWidget extends HudWidget { // min width is dependent on title w = Math.max(w, BORDER_SZE_W + BORDER_SZE_E + txtRend.getWidth(title) + 4 + 4 + 1); + // update the positions so it doesn't wait for the next tick or something if (h != prevH || w != prevW) ScreenBuilder.positionsNeedsUpdating = true; prevW = w; prevH = h; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/HudWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/HudWidget.java index 414f9241..e1c36606 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/HudWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/HudWidget.java @@ -1,22 +1,15 @@ package de.hysky.skyblocker.skyblock.tabhud.widget; import java.util.Objects; -import java.util.function.Consumer; -import de.hysky.skyblocker.skyblock.tabhud.screenbuilder.ScreenMaster; import de.hysky.skyblocker.utils.Location; +import de.hysky.skyblocker.utils.render.gui.AbstractWidget; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.Drawable; -import net.minecraft.client.gui.Element; -import net.minecraft.client.gui.ScreenRect; -import net.minecraft.client.gui.widget.ClickableWidget; -import net.minecraft.client.gui.widget.Widget; -public abstract class HudWidget implements Element, Widget, Drawable { +public abstract class HudWidget extends AbstractWidget { private final String internalID; - protected int w = 0, h = 0; - protected int x = 0, y = 0; + /** @@ -25,80 +18,44 @@ public abstract class HudWidget implements Element, Widget, Drawable { */ public HudWidget(String internalID) { this.internalID = internalID; - ScreenMaster.widgetInstances.put(internalID, this); } + /** + * Whether the widget should render in this location. This should check any config if need be. + * This method is used in the WidgetsConfigScreen, hence the location parameter. + * {@link de.hysky.skyblocker.utils.Utils#getLocation()} should not be used unless you know what you're doing. + * @param location the location + * @return true if the widget should render in the specified location + */ public abstract boolean shouldRender(Location location); + /** + * Perform all your logic here. Or in the {@link #renderWidget(DrawContext, int, int, float)} method if you feel like it. + * But this will be called much less often. See usages of it. + * @see #shouldUpdateBeforeRendering() + */ public abstract void update(); + /** + * Returns true if the update method should be called right before rendering. + * @return true if it should update + */ + protected boolean shouldUpdateBeforeRendering() { + return false; + } + public void render(DrawContext context) { render(context, -1, -1, MinecraftClient.getInstance().getRenderTickCounter().getLastFrameDuration()); } + @Override + public final void render(DrawContext context, int mouseX, int mouseY, float delta) { + if (shouldUpdateBeforeRendering()) update(); + renderWidget(context, mouseX, mouseY, delta); + } - - public final int getX() { - return this.x; - } - - public final void setX(int x) { - this.x = x; - } - - public final int getY() { - return this.y; - } - - public final void setY(int y) { - this.y = y; - } - - public final int getWidth() { - return this.w; - } - - public void setWidth(int width) { - this.w = width; - } - - public final int getHeight() { - return this.h; - } - - @Override - public void forEachChild(Consumer consumer) {} - - public void setHeight(int height) { - this.h = height; - } - - public void setDimensions(int size) { - setDimensions(size, size); - } - - public void setDimensions(int width, int height) { - this.w = width; - this.h = height; - } - - private boolean focused = false; - - @Override - public void setFocused(boolean focused) { - this.focused = focused; - } - - @Override - public boolean isFocused() { - return focused; - } - - @Override - public boolean isMouseOver(double mouseX, double mouseY) { - return mouseX >= getX() && mouseX <= getX() + getWidth() && mouseY >= getY() && mouseY <= getY() + getHeight(); - } + protected abstract void renderWidget(DrawContext context, int mouseX, int mouseY, float delta); /** * @@ -114,11 +71,6 @@ public abstract class HudWidget implements Element, Widget, Drawable { return Objects.equals(getInternalID(), widget.getInternalID()); } - @Override - public ScreenRect getNavigationFocus() { - return Element.super.getNavigationFocus(); - } - public String getInternalID() { return internalID; } diff --git a/src/main/java/de/hysky/skyblocker/utils/render/gui/AbstractWidget.java b/src/main/java/de/hysky/skyblocker/utils/render/gui/AbstractWidget.java new file mode 100644 index 00000000..8b891fa3 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/render/gui/AbstractWidget.java @@ -0,0 +1,84 @@ +package de.hysky.skyblocker.utils.render.gui; + +import net.minecraft.client.gui.Drawable; +import net.minecraft.client.gui.Element; +import net.minecraft.client.gui.ScreenRect; +import net.minecraft.client.gui.widget.ClickableWidget; +import net.minecraft.client.gui.widget.Widget; + +import java.util.function.Consumer; + +/** + * Implements a few things so you don't have to! + */ +public abstract class AbstractWidget implements Widget, Element, Drawable { + + protected int w = 0, h = 0; + protected int x = 0, y = 0; + + public final int getX() { + return this.x; + } + + public final void setX(int x) { + this.x = x; + } + + public final int getY() { + return this.y; + } + + public final void setY(int y) { + this.y = y; + } + + public final int getWidth() { + return this.w; + } + + public void setWidth(int width) { + this.w = width; + } + + public final int getHeight() { + return this.h; + } + + @Override + public void forEachChild(Consumer consumer) {} + + public void setHeight(int height) { + this.h = height; + } + + public void setDimensions(int size) { + setDimensions(size, size); + } + + public void setDimensions(int width, int height) { + this.w = width; + this.h = height; + } + + private boolean focused = false; + + @Override + public void setFocused(boolean focused) { + this.focused = focused; + } + + @Override + public boolean isFocused() { + return focused; + } + + @Override + public boolean isMouseOver(double mouseX, double mouseY) { + return mouseX >= getX() && mouseX <= getX() + getWidth() && mouseY >= getY() && mouseY <= getY() + getHeight(); + } + + @Override + public ScreenRect getNavigationFocus() { + return Element.super.getNavigationFocus(); + } +} -- cgit