From 53e24b2e088da2e8e8ca3132bf1e3bcf568436ed Mon Sep 17 00:00:00 2001 From: alemi Date: Sun, 12 Mar 2023 00:16:19 +0100 Subject: [PATCH] feat: prefix correctly depending on anchoring --- .../java/ftbsc/bscv/modules/HudModule.java | 9 +++ .../ftbsc/bscv/modules/hud/ActiveModules.java | 5 +- .../ftbsc/bscv/modules/hud/EntityList.java | 5 +- .../ftbsc/bscv/modules/hud/InfoDisplay.java | 69 ++++++++++++++++--- src/main/java/ftbsc/bscv/tools/Anchor.java | 34 +++++++++ 5 files changed, 106 insertions(+), 16 deletions(-) diff --git a/src/main/java/ftbsc/bscv/modules/HudModule.java b/src/main/java/ftbsc/bscv/modules/HudModule.java index 031995e..eff3c2d 100644 --- a/src/main/java/ftbsc/bscv/modules/HudModule.java +++ b/src/main/java/ftbsc/bscv/modules/HudModule.java @@ -17,6 +17,8 @@ public abstract class HudModule extends AbstractModule { return "HUD"; } + // TODO there should be a way for HUD mods to specify their defaults for x/y and anchor settings + protected HudModule() { super(); this.x = Setting.Number.builder() @@ -44,6 +46,13 @@ public abstract class HudModule extends AbstractModule { .build(this); } + protected String affixed(String in, Object... args) { + Anchor anchor = this.anchor.get(); + String prefix = anchor.isLeft() ? "> " : ""; + String postfix = anchor.isRight() ? " <" : ""; + return String.format(prefix + in + postfix, args); + } + protected boolean shouldHide() { return ICommons.MC.options.renderDebug; } diff --git a/src/main/java/ftbsc/bscv/modules/hud/ActiveModules.java b/src/main/java/ftbsc/bscv/modules/hud/ActiveModules.java index 60558b5..f2c9c3d 100644 --- a/src/main/java/ftbsc/bscv/modules/hud/ActiveModules.java +++ b/src/main/java/ftbsc/bscv/modules/hud/ActiveModules.java @@ -2,7 +2,6 @@ package ftbsc.bscv.modules.hud; import com.google.auto.service.AutoService; import ftbsc.bscv.Boscovicino; -import ftbsc.bscv.ICommons; import ftbsc.bscv.api.ILoadable; import ftbsc.bscv.api.IModule; import ftbsc.bscv.modules.HudModule; @@ -13,7 +12,7 @@ import net.minecraftforge.eventbus.api.SubscribeEvent; import static ftbsc.bscv.tools.Text.TextBuilder; @AutoService(ILoadable.class) -public class ActiveModules extends HudModule implements ICommons { +public class ActiveModules extends HudModule { @SubscribeEvent public void onRenderOverlay(RenderGameOverlayEvent event) { if (event.getType() != ElementType.TEXT) return; @@ -22,7 +21,7 @@ public class ActiveModules extends HudModule implements ICommons { for (IModule m : Boscovicino.modManager.mods) { if (m.isEnabled() && !m.getGroup().equalsIgnoreCase("HUD")) { TextBuilder() - .txt(String.format("%s <", m.getName())) + .txt(this.affixed(m.getName())) .anchor(this.anchor.get()) .x(this.x.get()) .y(this.y.get() + offset) diff --git a/src/main/java/ftbsc/bscv/modules/hud/EntityList.java b/src/main/java/ftbsc/bscv/modules/hud/EntityList.java index 40423f2..e3fb69b 100644 --- a/src/main/java/ftbsc/bscv/modules/hud/EntityList.java +++ b/src/main/java/ftbsc/bscv/modules/hud/EntityList.java @@ -1,7 +1,6 @@ package ftbsc.bscv.modules.hud; import com.google.auto.service.AutoService; -import ftbsc.bscv.ICommons; import ftbsc.bscv.api.ILoadable; import ftbsc.bscv.modules.HudModule; import ftbsc.bscv.tools.Setting; @@ -22,7 +21,7 @@ import java.util.stream.Collectors; import static ftbsc.bscv.tools.Text.TextBuilder; @AutoService(ILoadable.class) -public class EntityList extends HudModule implements ICommons { +public class EntityList extends HudModule { public final ForgeConfigSpec.ConfigValue search; @@ -60,7 +59,7 @@ public class EntityList extends HudModule implements ICommons { int offset = 0; for (String u : uniques) { TextBuilder() - .txt(String.format("%s", u)) + .txt(this.affixed(u)) .anchor(this.anchor.get()) .x(this.x.get()) .y(this.y.get() + offset) diff --git a/src/main/java/ftbsc/bscv/modules/hud/InfoDisplay.java b/src/main/java/ftbsc/bscv/modules/hud/InfoDisplay.java index 757bceb..96a8687 100644 --- a/src/main/java/ftbsc/bscv/modules/hud/InfoDisplay.java +++ b/src/main/java/ftbsc/bscv/modules/hud/InfoDisplay.java @@ -15,7 +15,6 @@ import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.TickEvent.Phase; import net.minecraftforge.eventbus.api.SubscribeEvent; -import java.util.ArrayDeque; import java.util.LinkedList; import java.util.Queue; @@ -31,6 +30,7 @@ public class InfoDisplay extends HudModule implements ICommons { public final ForgeConfigSpec.ConfigValue logo; public final ForgeConfigSpec.ConfigValue speed; + public final ForgeConfigSpec.ConfigValue age; public final ForgeConfigSpec.ConfigValue time; public final ForgeConfigSpec.ConfigValue fps; // public final ForgeConfigSpec.ConfigValue biome; @@ -60,6 +60,12 @@ public class InfoDisplay extends HudModule implements ICommons { .fallback(true) .build(this); + this.age = Setting.Bool.builder() + .name("age") + .comment("show age of the world") + .fallback(true) + .build(this); + this.time = Setting.Bool.builder() .name("time") .comment("show world time") @@ -98,6 +104,11 @@ public class InfoDisplay extends HudModule implements ICommons { double buf = 0.0; for (double v : this.history_speed) { buf += v; } this.average_speed = buf / this.history_speed.size(); + + if (this.last_fps_string != MC.fpsString) { + this.last_fps_string = MC.fpsString; + this.curr_fps = this.last_fps_string.split(" ")[0]; + } } @SubscribeEvent @@ -125,13 +136,16 @@ public class InfoDisplay extends HudModule implements ICommons { offset += MC.font.lineHeight * scale * 4.0; } - if (this.time.get()) { - long daytime = 0; - if (MC.level != null) { - daytime = MC.level.dayTime(); - } + long day = 0; + long time = 0; + if (MC.level != null) { + day = MC.level.dayTime() / 24000L; + time = MC.level.dayTime() % 24000L; + } + + if (this.fps.get()) { TextBuilder() - .txt(String.format("> time: %d/1200 (%d day)", (daytime / 20) % 1200, daytime / (20 * 1200) )) + .txt(this.affixed("fps: %s", this.curr_fps)) .anchor(this.anchor.get()) .x(this.x.get()) .y(this.y.get() + offset) @@ -142,7 +156,7 @@ public class InfoDisplay extends HudModule implements ICommons { if (this.speed.get()) { TextBuilder() - .txt(String.format("> speed: %.1f [%.1f] m/s", this.instant_speed * 20.0, this.average_speed * 20.0)) + .txt(this.affixed("speed: %.1f [%.1f] m/s", this.instant_speed * 20.0, this.average_speed * 20.0)) .anchor(this.anchor.get()) .x(this.x.get()) .y(this.y.get() + offset) @@ -151,9 +165,20 @@ public class InfoDisplay extends HudModule implements ICommons { offset += MC.font.lineHeight * scale; } - if (this.fps.get()) { + if (this.age.get()) { TextBuilder() - .txt("> " + MC.fpsString) + .txt(this.affixed("age: %d (~%d days)", day, day / (3 * 24) )) // 3 mc days last 1 hour + .anchor(this.anchor.get()) + .x(this.x.get()) + .y(this.y.get() + offset) + .scale(scale) + .render(event.getMatrixStack(), event.getWindow()); + offset += MC.font.lineHeight * scale; + } + + if (this.time.get()) { + TextBuilder() + .txt(this.affixed("time: %d/%d (%s)", (time / TPS), this.getNextStep(time) / TPS, this.getTimePhase(time) )) .anchor(this.anchor.get()) .x(this.x.get()) .y(this.y.get() + offset) @@ -162,4 +187,28 @@ public class InfoDisplay extends HudModule implements ICommons { offset += MC.font.lineHeight * scale; } } + + private String last_fps_string; + private String curr_fps = "0"; + + // Time utils + private String getTimePhase(long time) { + if (time > 23000) return "Dawn"; + if (time > 18500) return "Night"; + if (time > 17500) return "Midnight"; + if (time > 13000) return "Evening"; + if (time > 12000) return "Dusk"; + if (time > 6500) return "Afternoon"; + if (time > 5500) return "Noon"; + return "Morning"; + } + + private int getNextStep(long time) { + if (time > 23000) return 24000; + if (time > 13000) return 23000; + if (time > 12000) return 13000; + return 12000; + } + + private final int TPS = 20; } diff --git a/src/main/java/ftbsc/bscv/tools/Anchor.java b/src/main/java/ftbsc/bscv/tools/Anchor.java index c1d94d9..5de79f4 100644 --- a/src/main/java/ftbsc/bscv/tools/Anchor.java +++ b/src/main/java/ftbsc/bscv/tools/Anchor.java @@ -13,6 +13,40 @@ public enum Anchor implements ICommons { private Anchor(String in) { } + public boolean isLeft() { + switch (this) { + case BOTTOMLEFT: + case MIDDLELEFT: + case TOPLEFT: + return true; + case BOTTOMRIGHT: + case MIDDLERIGHT: + case TOPRIGHT: + case BOTTOMCENTER: + case MIDDLECENTER: + case TOPCENTER: + default: + return false; + } + } + + public boolean isRight() { + switch (this) { + case BOTTOMRIGHT: + case MIDDLERIGHT: + case TOPRIGHT: + return true; + case BOTTOMLEFT: + case MIDDLELEFT: + case TOPLEFT: + case BOTTOMCENTER: + case MIDDLECENTER: + case TOPCENTER: + default: + return false; + } + } + public Vector2f translate(Vector2f in, int textWidth, int lineHeight, float scale, MainWindow window) { int offset = 0; switch (this) {