From 08f953aa649759f4975f176eb15932a0cd11e3ec Mon Sep 17 00:00:00 2001 From: DeDiamondPro <67508414+DeDiamondPro@users.noreply.github.com> Date: Mon, 27 Jun 2022 12:28:30 +0200 Subject: hud things --- .../java/cc/polyfrost/oneconfig/config/Config.java | 4 +- .../java/cc/polyfrost/oneconfig/gui/HudGui.java | 58 +------- .../java/cc/polyfrost/oneconfig/hud/Cacheable.java | 9 -- .../java/cc/polyfrost/oneconfig/hud/HUDUtils.java | 3 - src/main/java/cc/polyfrost/oneconfig/hud/Hud.java | 102 +++++--------- .../cc/polyfrost/oneconfig/hud/MultiTextHud.java | 116 --------------- .../cc/polyfrost/oneconfig/hud/SingleTextHud.java | 156 ++++++++------------- .../java/cc/polyfrost/oneconfig/hud/TextHud.java | 96 ++++++++++--- .../polyfrost/oneconfig/internal/hud/HudCore.java | 11 ++ .../cc/polyfrost/oneconfig/test/TestHud_Test.java | 2 +- .../oneconfig/test/TestMultilineHud_Test.java | 6 +- 11 files changed, 191 insertions(+), 372 deletions(-) delete mode 100644 src/main/java/cc/polyfrost/oneconfig/hud/Cacheable.java delete mode 100644 src/main/java/cc/polyfrost/oneconfig/hud/MultiTextHud.java (limited to 'src/main/java/cc/polyfrost') diff --git a/src/main/java/cc/polyfrost/oneconfig/config/Config.java b/src/main/java/cc/polyfrost/oneconfig/config/Config.java index f864d71..6ef9494 100644 --- a/src/main/java/cc/polyfrost/oneconfig/config/Config.java +++ b/src/main/java/cc/polyfrost/oneconfig/config/Config.java @@ -48,9 +48,7 @@ public class Config { */ public Config(Mod modData, String configFile, boolean initialize) { this.configFile = configFile; - if (initialize) { - init(modData); - } + if (initialize) init(modData); } /** diff --git a/src/main/java/cc/polyfrost/oneconfig/gui/HudGui.java b/src/main/java/cc/polyfrost/oneconfig/gui/HudGui.java index 8364afe..b13170a 100644 --- a/src/main/java/cc/polyfrost/oneconfig/gui/HudGui.java +++ b/src/main/java/cc/polyfrost/oneconfig/gui/HudGui.java @@ -59,13 +59,12 @@ public class HudGui extends UScreen { editingHud.yUnscaled = (yFloat + (hud.getHeight(hud.scale) + hud.paddingY * hud.scale)) / (double) this.height; } - int width = (int) (hud.getWidth(hud.scale) + hud.paddingX * hud.scale); - int height = (int) (hud.getHeight(hud.scale) + hud.paddingY * hud.scale); + int width = (int) (hud.getExampleWidth(hud.scale) + hud.paddingX * hud.scale); + int height = (int) (hud.getExampleHeight(hud.scale) + hud.paddingY * hud.scale); int x = (int) hud.getXScaled(this.width); int y = (int) hud.getYScaled(this.height); - if (hud.parent == null) - hud.drawExampleAll(x, y, hud.scale, true); + hud.drawExampleAll(x, y, hud.scale, true); int color = new Color(215, 224, 235).getRGB(); if (editingHud == hud) { color = new Color(43, 159, 235).getRGB(); @@ -83,35 +82,12 @@ public class HudGui extends UScreen { if (hud == editingHud && !isDragging) { RenderManager.setupAndDraw(true, (vg) -> RenderManager.drawCircle(vg, x + width, y + height, 3, new Color(43, 159, 235).getRGB())); } - - if (hud.childBottom != null) processHud(hud.childBottom, mouseX); - if (hud.childRight != null) processHud(hud.childRight, mouseX); } private void setPosition(float newX, float newY, boolean snap) { float width = editingHud.getWidth(editingHud.scale) + editingHud.paddingX * editingHud.scale; float height = editingHud.getHeight(editingHud.scale) + editingHud.paddingY * editingHud.scale; - /* Childing disabled since it still needs some extra work - if (editingHud.childRight != null) { - HudCore.huds.add(editingHud.childRight); - editingHud.childRight.parent = null; - editingHud.childRight = null; - } - if (editingHud.childBottom != null) { - HudCore.huds.add(editingHud.childBottom); - editingHud.childBottom.parent = null; - editingHud.childBottom = null; - } - if (editingHud.parent != null) { - HudCore.huds.add(editingHud); - if (editingHud.parent.childBottom == editingHud) - editingHud.parent.childBottom = null; - else if (editingHud.parent.childRight == editingHud) - editingHud.parent.childRight = null; - editingHud.parent = null; - }*/ - if (newX < 0) newX = 0; else if (newX + width > this.width) @@ -127,11 +103,6 @@ public class HudGui extends UScreen { if (snapX != newX || snapY != newY) { newX = snapX; newY = snapY; - for (Hud hud : HudCore.huds) { - if (!hud.enabled) continue; - if (findParent(hud, snapX, snapY)) - break; - } } } @@ -145,25 +116,6 @@ public class HudGui extends UScreen { editingHud.yUnscaled = (newY + height) / (double) this.height; } - private boolean findParent(Hud hud, float snapX, float snapY) { - int hudWidth = (int) (hud.getWidth(hud.scale) + hud.paddingX * hud.scale); - int hudX = (int) hud.getXScaled(this.width); - int hudHeight = (int) (hud.getHeight(hud.scale) + hud.paddingY * hud.scale); - int hudY = (int) hud.getYScaled(this.height); - if (hudX + hudWidth == snapX && hudY == snapY && hud.childRight == null) { - editingHud.parent = hud; - hud.childRight = editingHud; - HudCore.huds.remove(editingHud); - return true; - } else if (hudX == snapX && hudY + hudHeight == snapY && hud.childBottom == null) { - editingHud.parent = hud; - hud.childBottom = editingHud; - HudCore.huds.remove(editingHud); - return true; - } - return hud.childRight != null && findParent(hud.childRight, snapX, snapY) || hud.childBottom != null && findParent(hud.childBottom, snapX, snapY); - } - private float getXSnapping(float pos, boolean rightOnly) { float width = editingHud.getWidth(editingHud.scale) + editingHud.paddingX * editingHud.scale; ArrayList verticalLines = new ArrayList<>(); @@ -196,7 +148,6 @@ public class HudGui extends UScreen { private ArrayList getXSnappingHud(Hud hud) { ArrayList verticalLines = new ArrayList<>(); if (hud == editingHud) return verticalLines; - if (hud.childRight != null) verticalLines.addAll(getXSnappingHud(hud.childRight)); int hudWidth = (int) (hud.getWidth(hud.scale) + hud.paddingX * hud.scale); int hudX = (int) hud.getXScaled(this.width); verticalLines.add((float) hudX); @@ -236,7 +187,6 @@ public class HudGui extends UScreen { private ArrayList getYSnappingHud(Hud hud) { ArrayList horizontalLines = new ArrayList<>(); if (hud == editingHud) return horizontalLines; - if (hud.childBottom != null) horizontalLines.addAll(getYSnappingHud(hud.childBottom)); int hudHeight = (int) (hud.getHeight(hud.scale) + hud.paddingY * hud.scale); int hudY = (int) hud.getYScaled(this.height); horizontalLines.add((float) hudY); @@ -290,7 +240,7 @@ public class HudGui extends UScreen { isDragging = true; return true; } - return hud.childBottom != null && mouseClickedHud(hud.childBottom, mouseX, mouseY) || hud.childRight != null && mouseClickedHud(hud.childRight, mouseX, mouseY); + return false; } @Override diff --git a/src/main/java/cc/polyfrost/oneconfig/hud/Cacheable.java b/src/main/java/cc/polyfrost/oneconfig/hud/Cacheable.java deleted file mode 100644 index c4ff151..0000000 --- a/src/main/java/cc/polyfrost/oneconfig/hud/Cacheable.java +++ /dev/null @@ -1,9 +0,0 @@ -package cc.polyfrost.oneconfig.hud; - -import cc.polyfrost.oneconfig.config.elements.BasicOption; - -import java.util.ArrayList; - -public interface Cacheable { - void addCacheOptions(String category, String subcategory, ArrayList options); -} diff --git a/src/main/java/cc/polyfrost/oneconfig/hud/HUDUtils.java b/src/main/java/cc/polyfrost/oneconfig/hud/HUDUtils.java index babb810..e91a7ce 100644 --- a/src/main/java/cc/polyfrost/oneconfig/hud/HUDUtils.java +++ b/src/main/java/cc/polyfrost/oneconfig/hud/HUDUtils.java @@ -23,9 +23,6 @@ public class HUDUtils { options.add(new ConfigHeader(field, hud, hudAnnotation.name(), category, subcategory, 2)); options.add(new ConfigSwitch(hud.getClass().getField("enabled"), hud, "Enabled", category, subcategory, 2)); options.addAll(ConfigUtils.getClassOptions(hud)); - if (hud instanceof Cacheable) { - ((Cacheable) hud).addCacheOptions(category, subcategory, options); - } options.add(new ConfigCheckbox(hud.getClass().getField("rounded"), hud, "Rounded corners", category, subcategory, 1)); options.get(options.size() - 1).addDependency(() -> hud.enabled); options.add(new ConfigCheckbox(hud.getClass().getField("border"), hud, "Outline/border", category, subcategory, 1)); diff --git a/src/main/java/cc/polyfrost/oneconfig/hud/Hud.java b/src/main/java/cc/polyfrost/oneconfig/hud/Hud.java index 61e960d..62cfb2e 100644 --- a/src/main/java/cc/polyfrost/oneconfig/hud/Hud.java +++ b/src/main/java/cc/polyfrost/oneconfig/hud/Hud.java @@ -1,14 +1,19 @@ package cc.polyfrost.oneconfig.hud; +import cc.polyfrost.oneconfig.config.annotations.Switch; import cc.polyfrost.oneconfig.config.core.OneColor; +import cc.polyfrost.oneconfig.gui.OneConfigGui; +import cc.polyfrost.oneconfig.libs.universal.UMinecraft; +import cc.polyfrost.oneconfig.libs.universal.UScreen; import cc.polyfrost.oneconfig.renderer.RenderManager; import cc.polyfrost.oneconfig.config.Config; +import net.minecraft.client.gui.GuiChat; /** * Represents a HUD element in OneConfig. * A HUD element can be used to display useful information to the user, like FPS or CPS. *

- * If you simply want to display text, extend {@link SingleTextHud} or {@link MultiTextHud}, + * If you simply want to display text, extend {@link TextHud} or {@link SingleTextHud}, * whichever applies to the use case. Then, override the required methods. *

* If you want to display something else, extend this class and override {@link Hud#getWidth(float)}, {@link Hud#getHeight(float)}, and {@link Hud#draw(int, int, float)} with the width, height, and the drawing code respectively. @@ -47,9 +52,6 @@ public abstract class Hud { public float scale; public float paddingX; public float paddingY; - public Hud parent; - public Hud childRight; - public Hud childBottom; /** * @param enabled If the hud is enabled @@ -157,6 +159,13 @@ public abstract class Hud { return getHeight(scale); } + /** + * @return If the background should be drawn + */ + public boolean drawBackground() { + return true; + } + /** * Draw the background, the hud and all childed huds, used by HudCore * @@ -166,12 +175,11 @@ public abstract class Hud { * @param background If background should be drawn or not */ public void drawAll(float x, float y, float scale, boolean background) { - if (background) drawBackground(x, y, getTotalWidth(scale), getTotalHeight(scale), scale); + if (!showInGuis && UScreen.getCurrentScreen() != null && !(UScreen.getCurrentScreen() instanceof OneConfigGui)) return; + if (!showInChat && UScreen.getCurrentScreen() instanceof GuiChat) return; + if (!showInDebug && UMinecraft.getSettings().showDebugInfo) return; + if (background && drawBackground()) drawBackground(x, y, getWidth(scale), getHeight(scale), scale); draw((int) (x + paddingX * scale / 2f), (int) (y + paddingY * scale / 2f), scale); - if (childRight != null) - childRight.drawAll((int) x + paddingX * scale / 2f + getWidth(scale), (int) y, childRight.scale, false); - if (childBottom != null) - childBottom.drawAll((int) x, (int) y + paddingY * scale / 2f + getHeight(scale), childBottom.scale, false); } /** @@ -183,12 +191,8 @@ public abstract class Hud { * @param background If background should be drawn or not */ public void drawExampleAll(float x, float y, float scale, boolean background) { - if (background) drawBackground(x, y, getTotalExampleWidth(scale), getTotalExampleHeight(scale), scale); + if (background) drawBackground(x, y, getWidth(scale), getHeight(scale), scale); drawExample((int) (x + paddingX * scale / 2f), (int) (y + paddingY * scale / 2f), scale); - if (childRight != null) - childRight.drawExampleAll((int) x + paddingX * scale / 2f + getWidth(scale), (int) y, childRight.scale, false); - if (childBottom != null) - childBottom.drawExampleAll((int) x, (int) y + paddingY * scale / 2f + getHeight(scale), childBottom.scale, false); } /** @@ -219,14 +223,8 @@ public abstract class Hud { * @return X-coordinate of the hud */ public float getXScaled(int screenWidth) { - if (parent != null && parent.childRight == this) { - return parent.getXScaled(screenWidth) + parent.getWidth(parent.scale) + parent.paddingX * parent.scale / 2f; - } else if (parent != null) { - return parent.getXScaled(screenWidth); - } - if (xUnscaled <= 0.5) { + if (xUnscaled <= 0.5) return (int) (screenWidth * xUnscaled); - } return (float) (screenWidth - (1d - xUnscaled) * screenWidth - (getWidth(scale) + paddingX * scale)); } @@ -235,58 +233,22 @@ public abstract class Hud { * @return Y-coordinate of the hud */ public float getYScaled(int screenHeight) { - if (parent != null && parent.childBottom == this) { - return parent.getYScaled(screenHeight) + parent.getHeight(parent.scale) + parent.paddingY * parent.scale / 2f; - } else if (parent != null) { - return parent.getYScaled(screenHeight); - } - if (yUnscaled <= 0.5) { - return (int) (screenHeight * yUnscaled); - } + if (yUnscaled <= 0.5) return (int) (screenHeight * yUnscaled); return (float) (screenHeight - (1d - yUnscaled) * screenHeight - (getHeight(scale) + paddingY * scale)); } - /** - * @param scale Scale of the hud - * @return The width of the hud and all childed huds - */ - public float getTotalWidth(float scale) { - float width = getWidth(scale); - if (childRight != null) width += childRight.getTotalWidth(childRight.scale) + paddingY * scale / 2f; - if (childBottom != null) width = Math.max(childBottom.getTotalWidth(childBottom.scale), width); - return width; - } + @Switch( + name = "Show in Chat" + ) + public boolean showInChat = true; - /** - * @param scale Scale of the hud - * @return The height of the hud and all childed huds - */ - public float getTotalHeight(float scale) { - float height = getHeight(scale); - if (childBottom != null) height += childBottom.getTotalHeight(childBottom.scale) + paddingY * scale / 2f; - if (childRight != null) height = Math.max(childRight.getTotalHeight(childRight.scale), height); - return height; - } - - /** - * @param scale Scale of the hud - * @return The example width of the hud and all childed huds - */ - public float getTotalExampleWidth(float scale) { - float width = getExampleWidth(scale); - if (childRight != null) width += childRight.getTotalExampleWidth(childRight.scale) + paddingX * scale / 2f; - if (childBottom != null) width = Math.max(childBottom.getTotalExampleWidth(childBottom.scale), width); - return width; - } + @Switch( + name = "Show in F3 (Debug)" + ) + public boolean showInDebug = false; - /** - * @param scale Scale of the hud - * @return The example height of the hud and all childed huds - */ - public float getTotalExampleHeight(float scale) { - float height = getExampleHeight(scale); - if (childBottom != null) height += childBottom.getTotalExampleHeight(childBottom.scale) + paddingY * scale / 2f; - if (childRight != null) height = Math.max(childRight.getTotalExampleHeight(childRight.scale), height); - return height; - } + @Switch( + name = "Show in GUIs" + ) + public boolean showInGuis = true; } \ No newline at end of file diff --git a/src/main/java/cc/polyfrost/oneconfig/hud/MultiTextHud.java b/src/main/java/cc/polyfrost/oneconfig/hud/MultiTextHud.java deleted file mode 100644 index 5dbff4c..0000000 --- a/src/main/java/cc/polyfrost/oneconfig/hud/MultiTextHud.java +++ /dev/null @@ -1,116 +0,0 @@ -package cc.polyfrost.oneconfig.hud; - -import cc.polyfrost.oneconfig.config.annotations.Exclude; -import cc.polyfrost.oneconfig.config.elements.BasicOption; -import cc.polyfrost.oneconfig.events.EventManager; -import cc.polyfrost.oneconfig.events.event.Stage; -import cc.polyfrost.oneconfig.events.event.TickEvent; -import cc.polyfrost.oneconfig.gui.OneConfigGui; -import cc.polyfrost.oneconfig.gui.elements.config.ConfigSwitch; -import cc.polyfrost.oneconfig.libs.eventbus.Subscribe; -import cc.polyfrost.oneconfig.libs.universal.UMinecraft; -import cc.polyfrost.oneconfig.libs.universal.UScreen; -import cc.polyfrost.oneconfig.renderer.RenderManager; -import net.minecraft.client.gui.GuiChat; - -import java.util.ArrayList; -import java.util.List; - -public abstract class MultiTextHud extends TextHud implements Cacheable { - private transient int width = 100; - private transient int height; - private transient List cachedStrings = null; - private transient final boolean caching; - - public MultiTextHud(boolean enabled) { - this(enabled, 0, 0); - } - - public MultiTextHud(boolean enabled, boolean caching) { - this(enabled, 0, 0, caching); - } - - public MultiTextHud(boolean enabled, int x, int y) { - this(enabled, x, y, true); - } - - public MultiTextHud(boolean enabled, int x, int y, boolean caching) { - super(enabled, x, y); - this.caching = caching; - if (caching) { - EventManager.INSTANCE.register(new TextCacher()); - } - } - - @Override - public void addCacheOptions(String category, String subcategory, ArrayList options) { - if (caching) { - try { - System.out.println("AIJSIOJ!!"); - options.add(new ConfigSwitch(getClass().getField("cacheText"), this, "Cache Text", category, subcategory, 1)); - } catch (NoSuchFieldException e) { - e.printStackTrace(); - } - } - } - - @Exclude(type = Exclude.ExcludeType.HUD) - public boolean cacheText = true; - - @Override - public int getWidth(float scale) { - return (int) (width * scale); - } - - @Override - public int getHeight(float scale) { - return (int) (height * scale); - } - - @Override - public void draw(int x, int y, float scale) { - if (!showInGuis && UScreen.getCurrentScreen() != null && !(UScreen.getCurrentScreen() instanceof OneConfigGui)) return; - if (!showInChat && UScreen.getCurrentScreen() instanceof GuiChat) return; - if (!showInDebug && UMinecraft.getSettings().showDebugInfo) return; - - int textY = y; - width = 0; - for (String line : cachedStrings == null ? getLines() : cachedStrings) { - RenderManager.drawScaledString(line, x, textY, color.getRGB(), RenderManager.TextType.toType(textType), scale); - width = Math.max(width, UMinecraft.getFontRenderer().getStringWidth(line)); - textY += 12 * scale; - } - height = (int) ((textY - y) / scale - 3); - } - - @Override - public void drawExample(int x, int y, float scale) { - int textY = y; - width = 0; - for (String line : getExampleLines()) { - RenderManager.drawScaledString(line, x, textY, color.getRGB(), RenderManager.TextType.toType(textType), scale); - width = Math.max(width, UMinecraft.getFontRenderer().getStringWidth(line)); - textY += 12 * scale; - } - height = (int) ((textY - y) / scale - 3); - } - - public abstract List getLines(); - - public List getExampleLines() { - return getLines(); - } - - private class TextCacher { - @Subscribe - private void onTick(TickEvent event) { - if (event.stage == Stage.START) { - if (cacheText) { - cachedStrings = getLines(); - } else { - cachedStrings = null; - } - } - } - } -} diff --git a/src/main/java/cc/polyfrost/oneconfig/hud/SingleTextHud.java b/src/main/java/cc/polyfrost/oneconfig/hud/SingleTextHud.java index f1a4125..2e32d8a 100644 --- a/src/main/java/cc/polyfrost/oneconfig/hud/SingleTextHud.java +++ b/src/main/java/cc/polyfrost/oneconfig/hud/SingleTextHud.java @@ -1,113 +1,81 @@ package cc.polyfrost.oneconfig.hud; import cc.polyfrost.oneconfig.config.annotations.Dropdown; -import cc.polyfrost.oneconfig.config.annotations.Exclude; import cc.polyfrost.oneconfig.config.annotations.Switch; import cc.polyfrost.oneconfig.config.annotations.Text; -import cc.polyfrost.oneconfig.config.elements.BasicOption; -import cc.polyfrost.oneconfig.events.EventManager; -import cc.polyfrost.oneconfig.events.event.Stage; -import cc.polyfrost.oneconfig.events.event.TickEvent; -import cc.polyfrost.oneconfig.gui.OneConfigGui; -import cc.polyfrost.oneconfig.gui.elements.config.ConfigSwitch; -import cc.polyfrost.oneconfig.libs.eventbus.Subscribe; -import cc.polyfrost.oneconfig.libs.universal.UMinecraft; -import cc.polyfrost.oneconfig.libs.universal.UScreen; -import cc.polyfrost.oneconfig.renderer.RenderManager; -import net.minecraft.client.gui.GuiChat; - -import java.util.ArrayList; - -public abstract class SingleTextHud extends TextHud implements Cacheable { - - private transient String cachedString = null; - private transient final boolean caching; - - public SingleTextHud(String title) { - this(title, true); - } +import java.util.Collections; +import java.util.List; + +public abstract class SingleTextHud extends TextHud { public SingleTextHud(String title, boolean enabled) { this(title, enabled, 0, 0); } - public SingleTextHud(String title, boolean enabled, boolean caching) { - this(title, enabled, 0, 0, caching); - } - public SingleTextHud(String title, boolean enabled, int x, int y) { - this(title, enabled, x, y, true); - } - - public SingleTextHud(String title, boolean enabled, int x, int y, boolean caching) { super(enabled, x, y); this.title = title; - this.caching = caching; - if (caching) { - EventManager.INSTANCE.register(new TextCacher()); - } } - @Override - public void addCacheOptions(String category, String subcategory, ArrayList options) { - if (caching) { - try { - options.add(new ConfigSwitch(getClass().getField("cacheText"), this, "Cache Text", category, subcategory, 1)); - } catch (NoSuchFieldException e) { - e.printStackTrace(); - } - } + /** + * This function is called every tick + * + * @return The new text + */ + protected abstract String getText(); + + /** + * This function is called every frame + * + * @return The new text, null to use the cached value + */ + protected String getTextFrequent() { + return null; } - @Exclude(type = Exclude.ExcludeType.HUD) - public boolean cacheText = true; - - @Switch( - name = "Brackets" - ) - public boolean brackets = false; - - @Text( - name = "Title" - ) - public String title; - - @Dropdown( - name = "Title Location", - options = {"Left", "Right"} - ) - public int titleLocation = 0; + /** + * This function is called every tick in the move GUI + * + * @return The new text + */ + protected String getExampleText() { + return getText(); + } - @Override - public int getWidth(float scale) { - return (int) (UMinecraft.getFontRenderer().getStringWidth(getCompleteText(false)) * scale); + /** + * This function is called every frame in the move GUI + * + * @return The new text, null to use the cached value + */ + protected String getExampleTextFrequent() { + return getTextFrequent(); } @Override - public int getExampleWidth(float scale) { - return (int) (UMinecraft.getFontRenderer().getStringWidth(getCompleteText(true)) * scale); + protected List update() { + return Collections.singletonList(getCompleteText(getText())); } @Override - public int getHeight(float scale) { - return (int) (UMinecraft.getFontRenderer().FONT_HEIGHT * scale); + protected List updateFrequent() { + String text = getTextFrequent(); + if (text == null) return null; + return Collections.singletonList(getCompleteText(text)); } @Override - public void draw(int x, int y, float scale) { - if (!showInGuis && UScreen.getCurrentScreen() != null && !(UScreen.getCurrentScreen() instanceof OneConfigGui)) return; - if (!showInChat && UScreen.getCurrentScreen() instanceof GuiChat) return; - if (!showInDebug && UMinecraft.getSettings().showDebugInfo) return; - - RenderManager.drawScaledString(getCompleteText(false), x, y, color.getRGB(), RenderManager.TextType.toType(textType), scale); + protected List updateExampleFrequent() { + String text = getExampleTextFrequent(); + if (text == null) return null; + return Collections.singletonList(getCompleteText(text)); } @Override - public void drawExample(int x, int y, float scale) { - RenderManager.drawScaledString(getCompleteText(true), x, y, color.getRGB(), RenderManager.TextType.toType(textType), scale); + protected List updateExample() { + return Collections.singletonList(getCompleteText(getExampleText())); } - protected final String getCompleteText(boolean example) { + protected final String getCompleteText(String text) { boolean showTitle = !title.trim().isEmpty(); StringBuilder builder = new StringBuilder(); if (brackets) { @@ -118,7 +86,7 @@ public abstract class SingleTextHud extends TextHud implements Cacheable { builder.append(title).append(": "); } - builder.append(example ? getExampleText() : (cachedString == null ? getText() : cachedString)); + builder.append(text); if (showTitle && titleLocation == 1) { builder.append(" ").append(title); @@ -130,22 +98,20 @@ public abstract class SingleTextHud extends TextHud implements Cacheable { return builder.toString(); } - public abstract String getText(); - public String getExampleText() { - return getText(); - } + @Switch( + name = "Brackets" + ) + public boolean brackets = false; - private class TextCacher { - @Subscribe - private void onTick(TickEvent event) { - if (event.stage == Stage.START) { - if (cacheText) { - cachedString = getText(); - } else { - cachedString = null; - } - } - } - } + @Text( + name = "Title" + ) + public String title; + + @Dropdown( + name = "Title Location", + options = {"Left", "Right"} + ) + public int titleLocation = 0; } diff --git a/src/main/java/cc/polyfrost/oneconfig/hud/TextHud.java b/src/main/java/cc/polyfrost/oneconfig/hud/TextHud.java index 7a05ef7..7895f26 100644 --- a/src/main/java/cc/polyfrost/oneconfig/hud/TextHud.java +++ b/src/main/java/cc/polyfrost/oneconfig/hud/TextHud.java @@ -2,38 +2,98 @@ package cc.polyfrost.oneconfig.hud; import cc.polyfrost.oneconfig.config.annotations.Color; import cc.polyfrost.oneconfig.config.annotations.Dropdown; -import cc.polyfrost.oneconfig.config.annotations.Switch; import cc.polyfrost.oneconfig.config.core.OneColor; +import cc.polyfrost.oneconfig.internal.hud.HudCore; +import cc.polyfrost.oneconfig.libs.universal.UMinecraft; +import cc.polyfrost.oneconfig.renderer.RenderManager; + +import java.util.List; + +public abstract class TextHud extends Hud { + protected transient List lines = null; + private transient int width; + private transient int height; -abstract class TextHud extends Hud { @Color( name = "Text Color" ) public OneColor color = new OneColor(255, 255, 255); - @Switch( - name = "Show in Chat" - ) - public boolean showInChat; - - @Switch( - name = "Show in F3 (Debug)" - ) - public boolean showInDebug; - - @Switch( - name = "Show in GUIs" - ) - public boolean showInGuis = true; - @Dropdown( name = "Text Type", options = {"No Shadow", "Shadow", "Full Shadow"} ) public int textType = 0; - public TextHud(boolean enabled, int x, int y) { super(enabled, x, y); } + public TextHud(boolean enabled) { + this(enabled, 0, 0); + } + + /** + * This function is called every tick + * + * @return The new lines + */ + protected abstract List update(); + + /** + * This function is called every frame + * + * @return The new lines, null if you want to use the cached lines + */ + protected List updateFrequent() { + return null; + } + + /** + * This function is called every tick in the move GUI + * + * @return The new lines + */ + protected List updateExample() { + return update(); + } + + /** + * This function is called every frame in the move GUI + * + * @return The new lines, null if you want to use the cached lines + */ + protected List updateExampleFrequent() { + return updateFrequent(); + } + + @Override + public void draw(int x, int y, float scale) { + List frequentLines = HudCore.editing ? updateExampleFrequent() : updateFrequent(); + if (frequentLines != null) lines = frequentLines; + if (lines == null) return; + + int textY = y; + width = 0; + for (String line : lines) { + RenderManager.drawScaledString(line, x, textY, color.getRGB(), RenderManager.TextType.toType(textType), scale); + width = Math.max(width, UMinecraft.getFontRenderer().getStringWidth(line)); + textY += 12 * scale; + } + height = (int) ((textY - y) / scale - 3); + } + + @Override + public int getWidth(float scale) { + return (int) (width * scale); + } + + @Override + public int getHeight(float scale) { + return (int) (height * scale); + } + + public void tick() { + if (!HudCore.editing) lines = update(); + else lines = updateExample(); + } } diff --git a/src/main/java/cc/polyfrost/oneconfig/internal/hud/HudCore.java b/src/main/java/cc/polyfrost/oneconfig/internal/hud/HudCore.java index 2d92b3c..79bf4d8 100644 --- a/src/main/java/cc/polyfrost/oneconfig/internal/hud/HudCore.java +++ b/src/main/java/cc/polyfrost/oneconfig/internal/hud/HudCore.java @@ -1,7 +1,9 @@ package cc.polyfrost.oneconfig.internal.hud; import cc.polyfrost.oneconfig.events.event.HudRenderEvent; +import cc.polyfrost.oneconfig.events.event.TickEvent; import cc.polyfrost.oneconfig.hud.Hud; +import cc.polyfrost.oneconfig.hud.TextHud; import cc.polyfrost.oneconfig.libs.universal.UResolution; import cc.polyfrost.oneconfig.libs.eventbus.Subscribe; @@ -19,4 +21,13 @@ public class HudCore { hud.drawAll(hud.getXScaled(UResolution.getScaledWidth()), hud.getYScaled(UResolution.getScaledHeight()), hud.scale, true); } } + + @Subscribe + public void onTick(TickEvent event) { + for (Hud hud : huds) { + if (hud instanceof TextHud) { + ((TextHud) hud).tick(); + } + } + } } diff --git a/src/main/java/cc/polyfrost/oneconfig/test/TestHud_Test.java b/src/main/java/cc/polyfrost/oneconfig/test/TestHud_Test.java index d62f664..ae557c7 100644 --- a/src/main/java/cc/polyfrost/oneconfig/test/TestHud_Test.java +++ b/src/main/java/cc/polyfrost/oneconfig/test/TestHud_Test.java @@ -11,7 +11,7 @@ public class TestHud_Test extends SingleTextHud { public boolean yes; public TestHud_Test() { - super("Time"); + super("Time", true); } @Override diff --git a/src/main/java/cc/polyfrost/oneconfig/test/TestMultilineHud_Test.java b/src/main/java/cc/polyfrost/oneconfig/test/TestMultilineHud_Test.java index d3bad28..48ccfb2 100644 --- a/src/main/java/cc/polyfrost/oneconfig/test/TestMultilineHud_Test.java +++ b/src/main/java/cc/polyfrost/oneconfig/test/TestMultilineHud_Test.java @@ -1,18 +1,18 @@ package cc.polyfrost.oneconfig.test; -import cc.polyfrost.oneconfig.hud.MultiTextHud; +import cc.polyfrost.oneconfig.hud.TextHud; import com.google.common.collect.Lists; import net.minecraft.client.Minecraft; import java.util.List; -public class TestMultilineHud_Test extends MultiTextHud { +public class TestMultilineHud_Test extends TextHud { public TestMultilineHud_Test() { super(true); } @Override - public List getLines() { + public List update() { return Lists.newArrayList(String.valueOf(System.currentTimeMillis()), String.valueOf(Minecraft.getSystemTime())); } } -- cgit