From 137bc80f8a82223ad9aae30aa5119628df7b39a0 Mon Sep 17 00:00:00 2001 From: Hugo-CASTELL Date: Thu, 27 Mar 2025 10:05:23 +0100 Subject: [PATCH 1/5] v1.3.1 Target block coordinates added (#7) --- .../java/dev/quickinfos/QuickInfosClient.java | 2 +- .../java/dev/quickinfos/StaticVariables.java | 8 +++++ .../infos/TargetedBlockCoordinates.java | 33 +++++++++++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 src/client/java/dev/quickinfos/infos/TargetedBlockCoordinates.java diff --git a/src/client/java/dev/quickinfos/QuickInfosClient.java b/src/client/java/dev/quickinfos/QuickInfosClient.java index 65524db..822f19f 100644 --- a/src/client/java/dev/quickinfos/QuickInfosClient.java +++ b/src/client/java/dev/quickinfos/QuickInfosClient.java @@ -37,7 +37,7 @@ private void onInitializeLoadStatic() { } } - for (Info info : new Info[] {new Coordinates(), new DeathCoordinates(), new TargetedBlock(), new CurrentBiome(), new FacingDirection()}) { + for (Info info : new Info[] {new Coordinates(), new DeathCoordinates(), new TargetedBlock(), new TargetedBlockCoordinates(), new CurrentBiome(), new FacingDirection()}) { try { StaticVariables.INFOS_INSTANCES.put(info.getClass().getName(), info); } catch (Throwable e) { diff --git a/src/client/java/dev/quickinfos/StaticVariables.java b/src/client/java/dev/quickinfos/StaticVariables.java index 0a4f7eb..2e9bb99 100644 --- a/src/client/java/dev/quickinfos/StaticVariables.java +++ b/src/client/java/dev/quickinfos/StaticVariables.java @@ -45,5 +45,13 @@ public static void useUserConfig(){ ORDERED_INFOS.add(info); } } + + for (Info info : INFOS_INSTANCES.values()) { + if(!ORDERED_INFOS.contains(info)){ + System.out.println(info.getHumanReadableName() + " not found in config, adding it to the list ----------------------"); + ORDERED_INFOS.add(info); + info.setOn(false); + } + } } } diff --git a/src/client/java/dev/quickinfos/infos/TargetedBlockCoordinates.java b/src/client/java/dev/quickinfos/infos/TargetedBlockCoordinates.java new file mode 100644 index 0000000..c038a07 --- /dev/null +++ b/src/client/java/dev/quickinfos/infos/TargetedBlockCoordinates.java @@ -0,0 +1,33 @@ +package dev.quickinfos.infos; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.util.hit.BlockHitResult; +import net.minecraft.util.hit.HitResult; +import net.minecraft.util.math.BlockPos; +import org.jetbrains.annotations.NotNull; + +public class TargetedBlockCoordinates extends Info { + + @Override + public String getHumanReadableName() { + return "Targeted Block's Coordinates"; + } + + @Override + public String toHUDScreen(@NotNull MinecraftClient client) { + if (client.player == null || client.world == null) { + return "Unknown targeted entity"; + } + + double range = client.player.getBlockInteractionRange(); + HitResult hitResult = client.player.raycast(range, 1, false); + if(hitResult.getType() == HitResult.Type.BLOCK) { + BlockPos pos = ((BlockHitResult) hitResult).getBlockPos(); + return String.format("Target at %d / %d / %d", pos.getX(), pos.getY(), pos.getZ()); + } + else { + return ""; + } + } + +} From 6e226f99657e09037a2123d78639e9f62123c68e Mon Sep 17 00:00:00 2001 From: Hugo-CASTELL Date: Thu, 27 Mar 2025 11:22:01 +0100 Subject: [PATCH 2/5] v1.3.2 Keybindings partial addition --- .../java/dev/quickinfos/QuickInfosClient.java | 14 ++++- .../java/dev/quickinfos/StaticVariables.java | 16 ++++++ .../java/dev/quickinfos/config/Config.java | 18 ++++++ .../dev/quickinfos/config/ConfigManager.java | 5 +- .../dev/quickinfos/screen/KeybindWidget.java | 55 +++++++++++++++++++ .../quickinfos/screen/QuickInfosScreen.java | 12 +++- 6 files changed, 114 insertions(+), 6 deletions(-) create mode 100644 src/client/java/dev/quickinfos/screen/KeybindWidget.java diff --git a/src/client/java/dev/quickinfos/QuickInfosClient.java b/src/client/java/dev/quickinfos/QuickInfosClient.java index 822f19f..449cf55 100644 --- a/src/client/java/dev/quickinfos/QuickInfosClient.java +++ b/src/client/java/dev/quickinfos/QuickInfosClient.java @@ -61,7 +61,7 @@ private void onInitializeRegisterEvents() { // #-----------------# // # Attach Trackers # // #-----------------# - ClientTickEvents.END_CLIENT_TICK.register((client) -> { + ClientTickEvents.START_CLIENT_TICK.register((client) -> { if(client == null){ return; } @@ -82,6 +82,15 @@ private void onInitializeRegisterEvents() { StaticVariables.QUICKINFOS_LAYER, QuickInfosClient::onCrosshairRender)); + // #-------------# + // # Keybindings # + // #-------------# + ClientTickEvents.END_CLIENT_TICK.register((client) -> { + while (StaticVariables.TOGGLE_KEY.wasPressed()){ + StaticVariables.SHOW = !StaticVariables.SHOW; + } + }); + // #-------------# // # /quickinfos # // #-------------# @@ -112,7 +121,8 @@ private static void onCrosshairRender(DrawContext drawContext, RenderTickCounter client.getDebugHud().shouldShowDebugHud() || StaticVariables.ORDERED_INFOS.isEmpty() || client.player == null || - client.world == null) { + client.world == null || + !StaticVariables.SHOW) { return; } diff --git a/src/client/java/dev/quickinfos/StaticVariables.java b/src/client/java/dev/quickinfos/StaticVariables.java index 2e9bb99..f71c580 100644 --- a/src/client/java/dev/quickinfos/StaticVariables.java +++ b/src/client/java/dev/quickinfos/StaticVariables.java @@ -7,7 +7,11 @@ import dev.quickinfos.infos.FacingDirection; import dev.quickinfos.infos.Info; import dev.quickinfos.trackers.Tracker; +import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; +import net.minecraft.client.option.KeyBinding; +import net.minecraft.client.util.InputUtil; import net.minecraft.util.Identifier; +import org.lwjgl.glfw.GLFW; import java.util.ArrayList; import java.util.HashMap; @@ -19,6 +23,8 @@ public class StaticVariables { public static final HashMap TRACKERS = new HashMap<>(); public static final ArrayList ORDERED_INFOS = new ArrayList<>(); public static Positions POSITION; + public static KeyBinding TOGGLE_KEY; + public static boolean SHOW; public static Config config; private StaticVariables() {} @@ -33,10 +39,20 @@ public static void useDefaultConfig(){ INFOS_INSTANCES.get(FacingDirection.class.getName()).setOn(true); POSITION = Positions.TOP_RIGHT; + SHOW = true; + int defaultKeyCode = GLFW.GLFW_KEY_K; + TOGGLE_KEY = KeyBindingHelper.registerKeyBinding(new KeyBinding( + "key.quickinfos.toggle", // Translation key for the keybind + InputUtil.Type.KEYSYM, + defaultKeyCode, + "category.quickinfos.main" // Category for the controls menu + )); } public static void useUserConfig(){ POSITION = config.getPosition(); + SHOW = config.getShow(); + TOGGLE_KEY = new KeyBinding(InputUtil.Type.KEYSYM.createFromCode(config.getToggleKeyCode()).getTranslationKey(), config.getToggleKeyCode(), ""); for (Map.Entry entry : config.getEnabledModules().entrySet()) { Info info = INFOS_INSTANCES.getOrDefault(entry.getKey(), null); diff --git a/src/client/java/dev/quickinfos/config/Config.java b/src/client/java/dev/quickinfos/config/Config.java index 546de6c..6a888eb 100644 --- a/src/client/java/dev/quickinfos/config/Config.java +++ b/src/client/java/dev/quickinfos/config/Config.java @@ -8,6 +8,8 @@ public class Config { private final Map enabledModules = new LinkedHashMap<>(); private Positions position; + private int toggleKeyCode; + private boolean show; public boolean isValid(){ return position != null && !enabledModules.isEmpty(); @@ -36,4 +38,20 @@ public void clearPosition() { public void setPosition(Positions position) { this.position = position; } + + public int getToggleKeyCode() { + return toggleKeyCode; + } + + public void setToggleKeyCode(int toggleKeyCode) { + this.toggleKeyCode = toggleKeyCode; + } + + public boolean getShow() { + return show; + } + + public void setShow(boolean show) { + this.show = show; + } } diff --git a/src/client/java/dev/quickinfos/config/ConfigManager.java b/src/client/java/dev/quickinfos/config/ConfigManager.java index 488de00..895e658 100644 --- a/src/client/java/dev/quickinfos/config/ConfigManager.java +++ b/src/client/java/dev/quickinfos/config/ConfigManager.java @@ -28,10 +28,13 @@ public static Config loadConfig() { } } - public static void saveConfig(Positions position, ArrayList infos, Config config) { + public static void saveConfig(boolean show, int toggleKeyCode, Positions position, ArrayList infos, Config config) { config.clearPosition(); config.setPosition(position); + config.setShow(show); + config.setToggleKeyCode(toggleKeyCode); + config.clearEnabledModules(); for (Info info : infos) { config.addEnabledModule(info.getClass().getName(), info.isOn()); diff --git a/src/client/java/dev/quickinfos/screen/KeybindWidget.java b/src/client/java/dev/quickinfos/screen/KeybindWidget.java new file mode 100644 index 0000000..a837556 --- /dev/null +++ b/src/client/java/dev/quickinfos/screen/KeybindWidget.java @@ -0,0 +1,55 @@ +package dev.quickinfos.screen; + +import net.minecraft.client.gui.widget.ButtonWidget; +import net.minecraft.client.option.KeyBinding; +import net.minecraft.client.util.InputUtil; +import net.minecraft.text.Text; +import org.lwjgl.glfw.GLFW; + +public class KeybindWidget extends ButtonWidget { + private final KeyBinding keyBinding; + private boolean isListening; + + public KeybindWidget(KeyBinding keyBinding, int x, int y, int width, int height, Text message, PressAction onPress) { + super(x, y, width, height, message, onPress, DEFAULT_NARRATION_SUPPLIER); + this.keyBinding = keyBinding; + } + + @Override + public void onPress() { + super.onPress(); + this.isListening = true; + this.updateMessage(); + } + + private void updateMessage() { + if (this.isListening) { + this.setMessage(Text.of("Press a key...")); + } else { + this.setMessage(Text.of(keyBinding.getBoundKeyLocalizedText().getString())); + } + } + + @Override + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + if(this.isListening) { + if(keyCode != GLFW.GLFW_KEY_ESCAPE){ + this.keyBinding.setBoundKey(InputUtil.Type.KEYSYM.createFromCode(keyCode)); + } + this.isListening = false; + this.updateMessage(); + return true; + } + return super.keyPressed(keyCode, scanCode, modifiers); + } + + @Override + public void onRelease(double mouseX, double mouseY) { + super.onRelease(mouseX, mouseY); + if (this.isListening && !this.isMouseOver(mouseX, mouseY)) { + // Cancel if clicked outside while listening + this.isListening = false; + this.updateMessage(); + } + } +} diff --git a/src/client/java/dev/quickinfos/screen/QuickInfosScreen.java b/src/client/java/dev/quickinfos/screen/QuickInfosScreen.java index fa87657..f0d84d3 100644 --- a/src/client/java/dev/quickinfos/screen/QuickInfosScreen.java +++ b/src/client/java/dev/quickinfos/screen/QuickInfosScreen.java @@ -20,6 +20,7 @@ public QuickInfosScreen(Text title) { @Override public void init() { + createToggleButton(); createPositionButton(); refreshUpDownList(); } @@ -33,7 +34,7 @@ public void render(DrawContext context, int mouseX, int mouseY, float delta) { @Override public void close() { try { - ConfigManager.saveConfig(StaticVariables.POSITION, StaticVariables.ORDERED_INFOS, StaticVariables.config); + ConfigManager.saveConfig(StaticVariables.SHOW, StaticVariables.TOGGLE_KEY.getDefaultKey().getCode(), StaticVariables.POSITION, StaticVariables.ORDERED_INFOS, StaticVariables.config); } finally { super.close(); } @@ -80,7 +81,7 @@ private void refreshUpDownList(){ } upDownWidgets.clear(); } - int y = 80; + int y = 100; for(Info orderedInfo : StaticVariables.ORDERED_INFOS){ upDownWidgets.add(new UpDownWidget(orderedInfo, 40, y, 320, 20, this)); y+= 22; @@ -102,8 +103,13 @@ private void createPositionButton(){ } button.setMessage(Text.of(buildMessage(StaticVariables.POSITION))); }) - .dimensions(40, 40, 160, 20) + .dimensions(60, 40, 160, 20) .build(); this.addDrawableChild(posButton); } + + private void createToggleButton(){ + KeybindWidget toggleButton = new KeybindWidget(StaticVariables.TOGGLE_KEY, 40, 60, 160, 20, Text.of("Toggle QuickInfos"), button -> {boolean pass = true;}); + this.addDrawableChild(toggleButton); + } } From 6615ca2db32501237185bc68ffda829314124b1c Mon Sep 17 00:00:00 2001 From: Hugo-CASTELL Date: Fri, 28 Mar 2025 08:19:06 +0100 Subject: [PATCH 3/5] v1.3.3 Toggle keybind added --- .../java/dev/quickinfos/StaticVariables.java | 7 ++- .../java/dev/quickinfos/config/Config.java | 9 +++ .../dev/quickinfos/config/ConfigManager.java | 3 + .../dev/quickinfos/screen/KeybindWidget.java | 55 ------------------- .../quickinfos/screen/QuickInfosScreen.java | 8 +-- 5 files changed, 20 insertions(+), 62 deletions(-) delete mode 100644 src/client/java/dev/quickinfos/screen/KeybindWidget.java diff --git a/src/client/java/dev/quickinfos/StaticVariables.java b/src/client/java/dev/quickinfos/StaticVariables.java index f71c580..46917bb 100644 --- a/src/client/java/dev/quickinfos/StaticVariables.java +++ b/src/client/java/dev/quickinfos/StaticVariables.java @@ -52,7 +52,12 @@ public static void useDefaultConfig(){ public static void useUserConfig(){ POSITION = config.getPosition(); SHOW = config.getShow(); - TOGGLE_KEY = new KeyBinding(InputUtil.Type.KEYSYM.createFromCode(config.getToggleKeyCode()).getTranslationKey(), config.getToggleKeyCode(), ""); + TOGGLE_KEY = KeyBindingHelper.registerKeyBinding(new KeyBinding( + "Toggle Key", // Translation key for the keybind + InputUtil.Type.KEYSYM, + config.getToggleKeyCode(), + "QuickInfos" // Category for the controls menu + )); for (Map.Entry entry : config.getEnabledModules().entrySet()) { Info info = INFOS_INSTANCES.getOrDefault(entry.getKey(), null); diff --git a/src/client/java/dev/quickinfos/config/Config.java b/src/client/java/dev/quickinfos/config/Config.java index 6a888eb..2d251e0 100644 --- a/src/client/java/dev/quickinfos/config/Config.java +++ b/src/client/java/dev/quickinfos/config/Config.java @@ -1,6 +1,7 @@ package dev.quickinfos.config; import dev.quickinfos.enums.Positions; +import org.lwjgl.glfw.GLFW; import java.util.LinkedHashMap; import java.util.Map; @@ -39,6 +40,10 @@ public void setPosition(Positions position) { this.position = position; } + public void clearToggleKeyCode() { + this.toggleKeyCode = GLFW.GLFW_KEY_K; + } + public int getToggleKeyCode() { return toggleKeyCode; } @@ -47,6 +52,10 @@ public void setToggleKeyCode(int toggleKeyCode) { this.toggleKeyCode = toggleKeyCode; } + public void clearShow() { + this.show = true; + } + public boolean getShow() { return show; } diff --git a/src/client/java/dev/quickinfos/config/ConfigManager.java b/src/client/java/dev/quickinfos/config/ConfigManager.java index 895e658..4b7b891 100644 --- a/src/client/java/dev/quickinfos/config/ConfigManager.java +++ b/src/client/java/dev/quickinfos/config/ConfigManager.java @@ -32,7 +32,10 @@ public static void saveConfig(boolean show, int toggleKeyCode, Positions positio config.clearPosition(); config.setPosition(position); + config.clearShow(); config.setShow(show); + + config.clearToggleKeyCode(); config.setToggleKeyCode(toggleKeyCode); config.clearEnabledModules(); diff --git a/src/client/java/dev/quickinfos/screen/KeybindWidget.java b/src/client/java/dev/quickinfos/screen/KeybindWidget.java deleted file mode 100644 index a837556..0000000 --- a/src/client/java/dev/quickinfos/screen/KeybindWidget.java +++ /dev/null @@ -1,55 +0,0 @@ -package dev.quickinfos.screen; - -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.client.option.KeyBinding; -import net.minecraft.client.util.InputUtil; -import net.minecraft.text.Text; -import org.lwjgl.glfw.GLFW; - -public class KeybindWidget extends ButtonWidget { - private final KeyBinding keyBinding; - private boolean isListening; - - public KeybindWidget(KeyBinding keyBinding, int x, int y, int width, int height, Text message, PressAction onPress) { - super(x, y, width, height, message, onPress, DEFAULT_NARRATION_SUPPLIER); - this.keyBinding = keyBinding; - } - - @Override - public void onPress() { - super.onPress(); - this.isListening = true; - this.updateMessage(); - } - - private void updateMessage() { - if (this.isListening) { - this.setMessage(Text.of("Press a key...")); - } else { - this.setMessage(Text.of(keyBinding.getBoundKeyLocalizedText().getString())); - } - } - - @Override - public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - if(this.isListening) { - if(keyCode != GLFW.GLFW_KEY_ESCAPE){ - this.keyBinding.setBoundKey(InputUtil.Type.KEYSYM.createFromCode(keyCode)); - } - this.isListening = false; - this.updateMessage(); - return true; - } - return super.keyPressed(keyCode, scanCode, modifiers); - } - - @Override - public void onRelease(double mouseX, double mouseY) { - super.onRelease(mouseX, mouseY); - if (this.isListening && !this.isMouseOver(mouseX, mouseY)) { - // Cancel if clicked outside while listening - this.isListening = false; - this.updateMessage(); - } - } -} diff --git a/src/client/java/dev/quickinfos/screen/QuickInfosScreen.java b/src/client/java/dev/quickinfos/screen/QuickInfosScreen.java index f0d84d3..74f1d59 100644 --- a/src/client/java/dev/quickinfos/screen/QuickInfosScreen.java +++ b/src/client/java/dev/quickinfos/screen/QuickInfosScreen.java @@ -20,7 +20,6 @@ public QuickInfosScreen(Text title) { @Override public void init() { - createToggleButton(); createPositionButton(); refreshUpDownList(); } @@ -29,6 +28,7 @@ public void init() { public void render(DrawContext context, int mouseX, int mouseY, float delta) { super.render(context, mouseX, mouseY, delta); context.drawText(this.textRenderer, "Quick infos menu", 40, 40 - this.textRenderer.fontHeight - 10, 0xFFFFFFFF, true); + context.drawText(this.textRenderer, "Checkout Minecraft default controls menu for keybindings", 40, 60 - this.textRenderer.fontHeight - 10, 0xFFFFFFFF, true); } @Override @@ -103,13 +103,9 @@ private void createPositionButton(){ } button.setMessage(Text.of(buildMessage(StaticVariables.POSITION))); }) - .dimensions(60, 40, 160, 20) + .dimensions(40, 65, 160, 20) .build(); this.addDrawableChild(posButton); } - private void createToggleButton(){ - KeybindWidget toggleButton = new KeybindWidget(StaticVariables.TOGGLE_KEY, 40, 60, 160, 20, Text.of("Toggle QuickInfos"), button -> {boolean pass = true;}); - this.addDrawableChild(toggleButton); - } } From 2d1f997235d0995448a051802fbabc160e8fbd68 Mon Sep 17 00:00:00 2001 From: Hugo-CASTELL Date: Fri, 28 Mar 2025 08:58:09 +0100 Subject: [PATCH 4/5] v1.3.4 Show menu keybind added --- .../java/dev/quickinfos/QuickInfosClient.java | 3 +++ .../java/dev/quickinfos/StaticVariables.java | 18 ++++++++++++++++-- .../java/dev/quickinfos/config/Config.java | 13 +++++++++++++ .../dev/quickinfos/config/ConfigManager.java | 5 ++++- .../quickinfos/screen/QuickInfosScreen.java | 2 +- 5 files changed, 37 insertions(+), 4 deletions(-) diff --git a/src/client/java/dev/quickinfos/QuickInfosClient.java b/src/client/java/dev/quickinfos/QuickInfosClient.java index 449cf55..7ec935d 100644 --- a/src/client/java/dev/quickinfos/QuickInfosClient.java +++ b/src/client/java/dev/quickinfos/QuickInfosClient.java @@ -89,6 +89,9 @@ private void onInitializeRegisterEvents() { while (StaticVariables.TOGGLE_KEY.wasPressed()){ StaticVariables.SHOW = !StaticVariables.SHOW; } + while (StaticVariables.SHOWMENU_KEY.wasPressed()){ + client.send(() -> client.setScreen(new QuickInfosScreen(Text.empty()))); + } }); // #-------------# diff --git a/src/client/java/dev/quickinfos/StaticVariables.java b/src/client/java/dev/quickinfos/StaticVariables.java index 46917bb..34cd0ab 100644 --- a/src/client/java/dev/quickinfos/StaticVariables.java +++ b/src/client/java/dev/quickinfos/StaticVariables.java @@ -24,6 +24,7 @@ public class StaticVariables { public static final ArrayList ORDERED_INFOS = new ArrayList<>(); public static Positions POSITION; public static KeyBinding TOGGLE_KEY; + public static KeyBinding SHOWMENU_KEY; public static boolean SHOW; public static Config config; @@ -42,10 +43,17 @@ public static void useDefaultConfig(){ SHOW = true; int defaultKeyCode = GLFW.GLFW_KEY_K; TOGGLE_KEY = KeyBindingHelper.registerKeyBinding(new KeyBinding( - "key.quickinfos.toggle", // Translation key for the keybind + "Toggle Key", // Translation key for the keybind InputUtil.Type.KEYSYM, defaultKeyCode, - "category.quickinfos.main" // Category for the controls menu + "QuickInfos" // Category for the controls menu + )); + defaultKeyCode = GLFW.GLFW_KEY_M; + SHOWMENU_KEY = KeyBindingHelper.registerKeyBinding(new KeyBinding( + "Show Menu Key", // Translation key for the keybind + InputUtil.Type.KEYSYM, + defaultKeyCode, + "QuickInfos" // Category for the controls menu )); } @@ -58,6 +66,12 @@ public static void useUserConfig(){ config.getToggleKeyCode(), "QuickInfos" // Category for the controls menu )); + SHOWMENU_KEY = KeyBindingHelper.registerKeyBinding(new KeyBinding( + "Show Menu Key", // Translation key for the keybind + InputUtil.Type.KEYSYM, + config.getShowMenuKeyCode(), + "QuickInfos" // Category for the controls menu + )); for (Map.Entry entry : config.getEnabledModules().entrySet()) { Info info = INFOS_INSTANCES.getOrDefault(entry.getKey(), null); diff --git a/src/client/java/dev/quickinfos/config/Config.java b/src/client/java/dev/quickinfos/config/Config.java index 2d251e0..eb5f59c 100644 --- a/src/client/java/dev/quickinfos/config/Config.java +++ b/src/client/java/dev/quickinfos/config/Config.java @@ -10,6 +10,7 @@ public class Config { private final Map enabledModules = new LinkedHashMap<>(); private Positions position; private int toggleKeyCode; + private int showMenuKeyCode; private boolean show; public boolean isValid(){ @@ -63,4 +64,16 @@ public boolean getShow() { public void setShow(boolean show) { this.show = show; } + + public void clearShowMenuKeyCode() { + this.showMenuKeyCode = GLFW.GLFW_KEY_M; + } + + public int getShowMenuKeyCode() { + return showMenuKeyCode; + } + + public void setShowMenuKeyCode(int showMenuKeyCode) { + this.showMenuKeyCode = showMenuKeyCode; + } } diff --git a/src/client/java/dev/quickinfos/config/ConfigManager.java b/src/client/java/dev/quickinfos/config/ConfigManager.java index 4b7b891..b9b7929 100644 --- a/src/client/java/dev/quickinfos/config/ConfigManager.java +++ b/src/client/java/dev/quickinfos/config/ConfigManager.java @@ -28,7 +28,7 @@ public static Config loadConfig() { } } - public static void saveConfig(boolean show, int toggleKeyCode, Positions position, ArrayList infos, Config config) { + public static void saveConfig(boolean show, int showMenuKeyCode, int toggleKeyCode, Positions position, ArrayList infos, Config config) { config.clearPosition(); config.setPosition(position); @@ -38,6 +38,9 @@ public static void saveConfig(boolean show, int toggleKeyCode, Positions positio config.clearToggleKeyCode(); config.setToggleKeyCode(toggleKeyCode); + config.clearShowMenuKeyCode(); + config.setShowMenuKeyCode(showMenuKeyCode); + config.clearEnabledModules(); for (Info info : infos) { config.addEnabledModule(info.getClass().getName(), info.isOn()); diff --git a/src/client/java/dev/quickinfos/screen/QuickInfosScreen.java b/src/client/java/dev/quickinfos/screen/QuickInfosScreen.java index 74f1d59..82dae90 100644 --- a/src/client/java/dev/quickinfos/screen/QuickInfosScreen.java +++ b/src/client/java/dev/quickinfos/screen/QuickInfosScreen.java @@ -34,7 +34,7 @@ public void render(DrawContext context, int mouseX, int mouseY, float delta) { @Override public void close() { try { - ConfigManager.saveConfig(StaticVariables.SHOW, StaticVariables.TOGGLE_KEY.getDefaultKey().getCode(), StaticVariables.POSITION, StaticVariables.ORDERED_INFOS, StaticVariables.config); + ConfigManager.saveConfig(StaticVariables.SHOW, StaticVariables.SHOWMENU_KEY.getDefaultKey().getCode(), StaticVariables.TOGGLE_KEY.getDefaultKey().getCode(), StaticVariables.POSITION, StaticVariables.ORDERED_INFOS, StaticVariables.config); } finally { super.close(); } From e73aba09236196ab6f0386b029cb1d0b2e194a63 Mon Sep 17 00:00:00 2001 From: Hugo-CASTELL Date: Fri, 28 Mar 2025 10:49:03 +0100 Subject: [PATCH 5/5] v1.4.0 Overall code rework --- gradle.properties | 2 +- .../java/dev/quickinfos/QuickInfosClient.java | 81 +++++++++++-------- .../{StaticVariables.java => Singleton.java} | 64 +++++---------- .../java/dev/quickinfos/config/Config.java | 60 ++++++++------ .../dev/quickinfos/config/ConfigManager.java | 3 +- ...CheckTriggerConditionTrackerException.java | 13 +++ .../exceptions/CannotRenderInfoException.java | 13 +++ .../CannotTriggerTrackerException.java | 13 +++ .../dev/quickinfos/infos/Coordinates.java | 9 +-- .../dev/quickinfos/infos/CurrentBiome.java | 12 +-- .../quickinfos/infos/DeathCoordinates.java | 17 ++-- .../dev/quickinfos/infos/FacingDirection.java | 45 +++++------ .../java/dev/quickinfos/infos/Info.java | 3 +- .../dev/quickinfos/infos/TargetedBlock.java | 23 +++--- .../infos/TargetedBlockCoordinates.java | 29 ++++--- .../quickinfos/screen/QuickInfosScreen.java | 28 +++---- .../trackers/DeathCoordinatesTracker.java | 6 +- .../java/dev/quickinfos/trackers/Tracker.java | 6 +- .../quickinfos/utils/DefaultConfigUtils.java | 8 ++ .../java/dev/quickinfos/utils/KeyUtils.java | 25 ++++++ .../dev/quickinfos/utils/PlayerUtils.java | 16 ++++ .../dev/quickinfos/utils/ScreenUtils.java | 12 +++ .../dev/quickinfos/utils/StaticUtils.java | 9 +++ 23 files changed, 305 insertions(+), 192 deletions(-) rename src/client/java/dev/quickinfos/{StaticVariables.java => Singleton.java} (53%) create mode 100644 src/client/java/dev/quickinfos/exceptions/CannotCheckTriggerConditionTrackerException.java create mode 100644 src/client/java/dev/quickinfos/exceptions/CannotRenderInfoException.java create mode 100644 src/client/java/dev/quickinfos/exceptions/CannotTriggerTrackerException.java create mode 100644 src/client/java/dev/quickinfos/utils/DefaultConfigUtils.java create mode 100644 src/client/java/dev/quickinfos/utils/KeyUtils.java create mode 100644 src/client/java/dev/quickinfos/utils/PlayerUtils.java create mode 100644 src/client/java/dev/quickinfos/utils/ScreenUtils.java create mode 100644 src/client/java/dev/quickinfos/utils/StaticUtils.java diff --git a/gradle.properties b/gradle.properties index 052db24..436e5d9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,7 +9,7 @@ yarn_mappings=1.21.4+build.8 loader_version=0.16.10 # Mod Properties -mod_version=1.3.0 +mod_version=1.4.0 maven_group=dev.quickinfos archives_base_name=quickinfos diff --git a/src/client/java/dev/quickinfos/QuickInfosClient.java b/src/client/java/dev/quickinfos/QuickInfosClient.java index 7ec935d..e4bacd6 100644 --- a/src/client/java/dev/quickinfos/QuickInfosClient.java +++ b/src/client/java/dev/quickinfos/QuickInfosClient.java @@ -1,10 +1,14 @@ package dev.quickinfos; import dev.quickinfos.config.ConfigManager; +import dev.quickinfos.exceptions.CannotCheckTriggerConditionTrackerException; +import dev.quickinfos.exceptions.CannotRenderInfoException; +import dev.quickinfos.exceptions.CannotTriggerTrackerException; import dev.quickinfos.infos.*; -import dev.quickinfos.screen.QuickInfosScreen; import dev.quickinfos.trackers.DeathCoordinatesTracker; import dev.quickinfos.trackers.Tracker; +import dev.quickinfos.utils.ScreenUtils; +import dev.quickinfos.utils.StaticUtils; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; @@ -16,6 +20,7 @@ import net.minecraft.client.render.RenderTickCounter; import net.minecraft.text.Text; import net.minecraft.util.Colors; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -31,7 +36,7 @@ public void onInitializeClient() { private void onInitializeLoadStatic() { for (Tracker tracker : new Tracker[] {new DeathCoordinatesTracker()}) { try { - StaticVariables.TRACKERS.put(tracker.getClass().getName(), tracker); + Singleton.TRACKERS.put(tracker.getClass().getName(), tracker); } catch (Throwable e) { System.err.println("Failed to load a tracker at start: " + e.getMessage()); } @@ -39,7 +44,7 @@ private void onInitializeLoadStatic() { for (Info info : new Info[] {new Coordinates(), new DeathCoordinates(), new TargetedBlock(), new TargetedBlockCoordinates(), new CurrentBiome(), new FacingDirection()}) { try { - StaticVariables.INFOS_INSTANCES.put(info.getClass().getName(), info); + Singleton.INFOS_INSTANCES.put(info.getClass().getName(), info); } catch (Throwable e) { System.err.println("Failed to load info at start: " + e.getMessage()); } @@ -47,13 +52,13 @@ private void onInitializeLoadStatic() { } private void onInitializeLoadConfig() { - StaticVariables.config = ConfigManager.loadConfig(); - if(StaticVariables.config.isValid()){ - StaticVariables.useUserConfig(); + Singleton.config = ConfigManager.loadConfig(); + if(Singleton.config.isValid()){ + Singleton.useUserConfig(); } else { - StaticVariables.useDefaultConfig(); - StaticVariables.useDefaultOrderedInfos(); + Singleton.useDefaultConfig(); + Singleton.useDefaultOrderedInfos(); } } @@ -62,15 +67,17 @@ private void onInitializeRegisterEvents() { // # Attach Trackers # // #-----------------# ClientTickEvents.START_CLIENT_TICK.register((client) -> { - if(client == null){ - return; - } - - for(Tracker tracker : StaticVariables.TRACKERS.values()) { - if(tracker.shouldTrigger(client)) { - tracker.trigger(client); + for(Tracker tracker : Singleton.TRACKERS.values()) { + try { + if (tracker.shouldTrigger(client)) { + tracker.trigger(client); + } } - } + catch (CannotCheckTriggerConditionTrackerException | CannotTriggerTrackerException e){ + // Cancel other trackers if one fails as they all depend on client + return; + } + } }); // #--------------------# @@ -79,18 +86,18 @@ private void onInitializeRegisterEvents() { HudLayerRegistrationCallback.EVENT.register( layeredDrawer -> layeredDrawer.attachLayerBefore( IdentifiedLayer.CROSSHAIR, - StaticVariables.QUICKINFOS_LAYER, + Singleton.QUICKINFOS_LAYER, QuickInfosClient::onCrosshairRender)); // #-------------# // # Keybindings # // #-------------# ClientTickEvents.END_CLIENT_TICK.register((client) -> { - while (StaticVariables.TOGGLE_KEY.wasPressed()){ - StaticVariables.SHOW = !StaticVariables.SHOW; + while (Singleton.TOGGLE_INFO_KEY.wasPressed()){ + Singleton.SHOW = !Singleton.SHOW; } - while (StaticVariables.SHOWMENU_KEY.wasPressed()){ - client.send(() -> client.setScreen(new QuickInfosScreen(Text.empty()))); + while (Singleton.SHOW_MENU_KEY.wasPressed()){ + ScreenUtils.openScreen(client); } }); @@ -99,11 +106,10 @@ private void onInitializeRegisterEvents() { // #-------------# ClientCommandRegistrationCallback.EVENT.register( ((commandDispatcher, registryAccess) -> - commandDispatcher.register(ClientCommandManager.literal("quickinfos").executes( + commandDispatcher.register(ClientCommandManager.literal(StaticUtils.COMMAND_LITERAL).executes( commandContext -> { try{ - MinecraftClient client = commandContext.getSource().getClient(); - client.send(() -> client.setScreen(new QuickInfosScreen(Text.empty()))); + ScreenUtils.openScreen(commandContext.getSource().getClient()); return 0; }catch (Throwable e){ commandContext.getSource().sendError(Text.of(e.toString())); @@ -122,27 +128,32 @@ private static void onCrosshairRender(DrawContext drawContext, RenderTickCounter client == null || client.options.hudHidden || client.getDebugHud().shouldShowDebugHud() || - StaticVariables.ORDERED_INFOS.isEmpty() || + Singleton.ORDERED_INFOS.isEmpty() || client.player == null || client.world == null || - !StaticVariables.SHOW) { + !Singleton.SHOW) { return; } // Split the selected infos into separate lines - String[] rawLines = StaticVariables.ORDERED_INFOS.stream().map(info -> { - try { - return info.isOn() ? info.toHUDScreen(client) : ""; - } catch (Throwable e){ - return ""; - } - }).toArray(String[]::new); + String[] rawLines; + try { + rawLines = Singleton.ORDERED_INFOS.stream().map(info -> info.isOn() ? info.render(client) : "").toArray(String[]::new); + } + catch (CannotRenderInfoException e){ + // Abort if one info cannot be rendered as they all depend on client + return; + } ArrayList lines = new ArrayList<>(); for(String line : rawLines) { if(line != null && !line.isEmpty()) lines.add(line) ; } + renderLines(client, lines, drawContext); + } + + private static void renderLines(@NotNull MinecraftClient client, @NotNull ArrayList lines, @NotNull DrawContext drawContext) { // Calculate the screen width and set a y_margin int screenWidth = client.getWindow().getScaledWidth(); int y_margin = 2; @@ -152,8 +163,8 @@ private static void onCrosshairRender(DrawContext drawContext, RenderTickCounter for (String line : lines) { int textWidth = client.textRenderer.getWidth(line); int bottom_top = lines.size() * (client.textRenderer.fontHeight + y_margin); - int x = y_margin; - switch (StaticVariables.POSITION){ + int x = 2; + switch (Singleton.POSITION){ case TOP_RIGHT: x = screenWidth - textWidth - y_margin; drawContext.drawText(client.textRenderer, line, x, y, Colors.WHITE, false); diff --git a/src/client/java/dev/quickinfos/StaticVariables.java b/src/client/java/dev/quickinfos/Singleton.java similarity index 53% rename from src/client/java/dev/quickinfos/StaticVariables.java rename to src/client/java/dev/quickinfos/Singleton.java index 34cd0ab..cd77480 100644 --- a/src/client/java/dev/quickinfos/StaticVariables.java +++ b/src/client/java/dev/quickinfos/Singleton.java @@ -7,32 +7,28 @@ import dev.quickinfos.infos.FacingDirection; import dev.quickinfos.infos.Info; import dev.quickinfos.trackers.Tracker; -import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; +import dev.quickinfos.utils.DefaultConfigUtils; +import dev.quickinfos.utils.KeyUtils; +import dev.quickinfos.utils.StaticUtils; import net.minecraft.client.option.KeyBinding; -import net.minecraft.client.util.InputUtil; import net.minecraft.util.Identifier; -import org.lwjgl.glfw.GLFW; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; -public class StaticVariables { - public static final Identifier QUICKINFOS_LAYER = Identifier.of("quickinfos"); +public class Singleton { + public static final Identifier QUICKINFOS_LAYER = Identifier.of(StaticUtils.LAYER_ID); public static final HashMap INFOS_INSTANCES = new HashMap<>(); public static final HashMap TRACKERS = new HashMap<>(); public static final ArrayList ORDERED_INFOS = new ArrayList<>(); public static Positions POSITION; - public static KeyBinding TOGGLE_KEY; - public static KeyBinding SHOWMENU_KEY; + public static KeyBinding TOGGLE_INFO_KEY; + public static KeyBinding SHOW_MENU_KEY; public static boolean SHOW; public static Config config; - private StaticVariables() {} - - public static void useDefaultOrderedInfos() { - ORDERED_INFOS.addAll(INFOS_INSTANCES.values()); - } + private Singleton() {} public static void useDefaultConfig(){ INFOS_INSTANCES.get(Coordinates.class.getName()).setOn(true); @@ -41,38 +37,16 @@ public static void useDefaultConfig(){ POSITION = Positions.TOP_RIGHT; SHOW = true; - int defaultKeyCode = GLFW.GLFW_KEY_K; - TOGGLE_KEY = KeyBindingHelper.registerKeyBinding(new KeyBinding( - "Toggle Key", // Translation key for the keybind - InputUtil.Type.KEYSYM, - defaultKeyCode, - "QuickInfos" // Category for the controls menu - )); - defaultKeyCode = GLFW.GLFW_KEY_M; - SHOWMENU_KEY = KeyBindingHelper.registerKeyBinding(new KeyBinding( - "Show Menu Key", // Translation key for the keybind - InputUtil.Type.KEYSYM, - defaultKeyCode, - "QuickInfos" // Category for the controls menu - )); + + TOGGLE_INFO_KEY = KeyUtils.registerToggleInfo(DefaultConfigUtils.TOGGLE_INFO_KEYCODE); + SHOW_MENU_KEY = KeyUtils.registerShowMenu(DefaultConfigUtils.SHOW_MENU_KEYCODE); } - public static void useUserConfig(){ - POSITION = config.getPosition(); - SHOW = config.getShow(); - TOGGLE_KEY = KeyBindingHelper.registerKeyBinding(new KeyBinding( - "Toggle Key", // Translation key for the keybind - InputUtil.Type.KEYSYM, - config.getToggleKeyCode(), - "QuickInfos" // Category for the controls menu - )); - SHOWMENU_KEY = KeyBindingHelper.registerKeyBinding(new KeyBinding( - "Show Menu Key", // Translation key for the keybind - InputUtil.Type.KEYSYM, - config.getShowMenuKeyCode(), - "QuickInfos" // Category for the controls menu - )); + public static void useDefaultOrderedInfos() { + ORDERED_INFOS.addAll(INFOS_INSTANCES.values()); + } + public static void useUserConfig(){ for (Map.Entry entry : config.getEnabledModules().entrySet()) { Info info = INFOS_INSTANCES.getOrDefault(entry.getKey(), null); if(info != null){ @@ -81,12 +55,18 @@ public static void useUserConfig(){ } } + // For new infos in mod updates for (Info info : INFOS_INSTANCES.values()) { if(!ORDERED_INFOS.contains(info)){ - System.out.println(info.getHumanReadableName() + " not found in config, adding it to the list ----------------------"); ORDERED_INFOS.add(info); info.setOn(false); } } + + POSITION = config.getPosition(); + SHOW = config.getShow(); + + TOGGLE_INFO_KEY = KeyUtils.registerToggleInfo(config.getToggleKeyCode()); + SHOW_MENU_KEY = KeyUtils.registerShowMenu(config.getShowMenuKeyCode()); } } diff --git a/src/client/java/dev/quickinfos/config/Config.java b/src/client/java/dev/quickinfos/config/Config.java index eb5f59c..e2ff0b8 100644 --- a/src/client/java/dev/quickinfos/config/Config.java +++ b/src/client/java/dev/quickinfos/config/Config.java @@ -7,15 +7,18 @@ import java.util.Map; public class Config { + + //#region Fields + private final Map enabledModules = new LinkedHashMap<>(); private Positions position; private int toggleKeyCode; private int showMenuKeyCode; private boolean show; - public boolean isValid(){ - return position != null && !enabledModules.isEmpty(); - } + //#endregion Fields + + //#region Getters and setters public Map getEnabledModules() { return enabledModules; @@ -25,26 +28,14 @@ public void addEnabledModule(String enabledModule, boolean isOn) { this.enabledModules.put(enabledModule, isOn); } - public void clearEnabledModules() { - this.enabledModules.clear(); - } - public Positions getPosition() { return this.position; } - public void clearPosition() { - this.position = null; - } - public void setPosition(Positions position) { this.position = position; } - public void clearToggleKeyCode() { - this.toggleKeyCode = GLFW.GLFW_KEY_K; - } - public int getToggleKeyCode() { return toggleKeyCode; } @@ -53,10 +44,6 @@ public void setToggleKeyCode(int toggleKeyCode) { this.toggleKeyCode = toggleKeyCode; } - public void clearShow() { - this.show = true; - } - public boolean getShow() { return show; } @@ -65,10 +52,6 @@ public void setShow(boolean show) { this.show = show; } - public void clearShowMenuKeyCode() { - this.showMenuKeyCode = GLFW.GLFW_KEY_M; - } - public int getShowMenuKeyCode() { return showMenuKeyCode; } @@ -76,4 +59,35 @@ public int getShowMenuKeyCode() { public void setShowMenuKeyCode(int showMenuKeyCode) { this.showMenuKeyCode = showMenuKeyCode; } + + //#endregion Getters and setters + + //#region Methods + + public boolean isValid() { + return position != null && !enabledModules.isEmpty(); + } + + public void clearEnabledModules() { + this.enabledModules.clear(); + } + + public void clearPosition() { + this.position = null; + } + + public void clearToggleKeyCode() { + this.toggleKeyCode = GLFW.GLFW_KEY_K; + } + + public void clearShow() { + this.show = true; + } + + public void clearShowMenuKeyCode() { + this.showMenuKeyCode = GLFW.GLFW_KEY_M; + } + + //#endregion Methods + } diff --git a/src/client/java/dev/quickinfos/config/ConfigManager.java b/src/client/java/dev/quickinfos/config/ConfigManager.java index b9b7929..f3862bf 100644 --- a/src/client/java/dev/quickinfos/config/ConfigManager.java +++ b/src/client/java/dev/quickinfos/config/ConfigManager.java @@ -4,6 +4,7 @@ import com.google.gson.GsonBuilder; import dev.quickinfos.enums.Positions; import dev.quickinfos.infos.Info; +import dev.quickinfos.utils.StaticUtils; import net.fabricmc.loader.api.FabricLoader; import java.nio.file.Files; @@ -12,7 +13,7 @@ public class ConfigManager { private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); - private static final Path CONFIG_FILE = FabricLoader.getInstance().getConfigDir().resolve("quickinfos_mod.json"); + private static final Path CONFIG_FILE = FabricLoader.getInstance().getConfigDir().resolve(StaticUtils.CONFIG_FILE_PATH); public static Config loadConfig() { try { diff --git a/src/client/java/dev/quickinfos/exceptions/CannotCheckTriggerConditionTrackerException.java b/src/client/java/dev/quickinfos/exceptions/CannotCheckTriggerConditionTrackerException.java new file mode 100644 index 0000000..38122cc --- /dev/null +++ b/src/client/java/dev/quickinfos/exceptions/CannotCheckTriggerConditionTrackerException.java @@ -0,0 +1,13 @@ +package dev.quickinfos.exceptions; + +import dev.quickinfos.trackers.Tracker; + +public class CannotCheckTriggerConditionTrackerException extends RuntimeException { + public CannotCheckTriggerConditionTrackerException(Tracker tracker) { + this(tracker.getClass().getName() + " could not verify trigger condition"); + } + + public CannotCheckTriggerConditionTrackerException(String message) { + super(message); + } +} diff --git a/src/client/java/dev/quickinfos/exceptions/CannotRenderInfoException.java b/src/client/java/dev/quickinfos/exceptions/CannotRenderInfoException.java new file mode 100644 index 0000000..33b2923 --- /dev/null +++ b/src/client/java/dev/quickinfos/exceptions/CannotRenderInfoException.java @@ -0,0 +1,13 @@ +package dev.quickinfos.exceptions; + +import dev.quickinfos.infos.Info; + +public class CannotRenderInfoException extends RuntimeException { + public CannotRenderInfoException(Info info) { + this(info.getHumanReadableName() + " could not be rendered"); + } + + public CannotRenderInfoException(String message) { + super(message); + } +} diff --git a/src/client/java/dev/quickinfos/exceptions/CannotTriggerTrackerException.java b/src/client/java/dev/quickinfos/exceptions/CannotTriggerTrackerException.java new file mode 100644 index 0000000..1ef624b --- /dev/null +++ b/src/client/java/dev/quickinfos/exceptions/CannotTriggerTrackerException.java @@ -0,0 +1,13 @@ +package dev.quickinfos.exceptions; + +import dev.quickinfos.trackers.Tracker; + +public class CannotTriggerTrackerException extends RuntimeException { + public CannotTriggerTrackerException(Tracker tracker) { + this(tracker.getClass().getName() + " could not be triggered"); + } + + public CannotTriggerTrackerException(String message) { + super(message); + } +} diff --git a/src/client/java/dev/quickinfos/infos/Coordinates.java b/src/client/java/dev/quickinfos/infos/Coordinates.java index d8155d1..e3c7932 100644 --- a/src/client/java/dev/quickinfos/infos/Coordinates.java +++ b/src/client/java/dev/quickinfos/infos/Coordinates.java @@ -1,5 +1,6 @@ package dev.quickinfos.infos; +import dev.quickinfos.exceptions.CannotRenderInfoException; import net.minecraft.client.MinecraftClient; import net.minecraft.util.math.Vec3d; import org.jetbrains.annotations.NotNull; @@ -12,13 +13,11 @@ public String getHumanReadableName() { } @Override - public String toHUDScreen(@NotNull MinecraftClient client) { - if (client.player == null) { - return "Unknown player position"; - } + public String render(@NotNull MinecraftClient client) { + if (client.player == null) + throw new CannotRenderInfoException(this); Vec3d pos = client.player.getPos(); - return String.format("%.1f / %.1f / %.1f", pos.getX(), pos.getY(), pos.getZ()); } diff --git a/src/client/java/dev/quickinfos/infos/CurrentBiome.java b/src/client/java/dev/quickinfos/infos/CurrentBiome.java index 2cba5d9..36c1c5e 100644 --- a/src/client/java/dev/quickinfos/infos/CurrentBiome.java +++ b/src/client/java/dev/quickinfos/infos/CurrentBiome.java @@ -1,5 +1,7 @@ package dev.quickinfos.infos; +import dev.quickinfos.exceptions.CannotRenderInfoException; +import dev.quickinfos.utils.StaticUtils; import net.minecraft.client.MinecraftClient; import net.minecraft.registry.RegistryKey; import net.minecraft.util.math.BlockPos; @@ -15,15 +17,13 @@ public String getHumanReadableName() { } @Override - public String toHUDScreen(@NotNull MinecraftClient client) { - if (client.player == null || client.world == null) { - return "Unknown biome"; - } + public String render(@NotNull MinecraftClient client) { + if (client.player == null || client.world == null) + throw new CannotRenderInfoException(this); BlockPos playerPos = client.player.getBlockPos(); Optional> biome = client.world.getBiome(playerPos).getKey(); - return biome.map(biomeRegistryKey -> biomeRegistryKey.getValue().toString()) - .orElse("Unknown biome"); + .orElse(StaticUtils.NONE_INFO_CALCULATED); } } diff --git a/src/client/java/dev/quickinfos/infos/DeathCoordinates.java b/src/client/java/dev/quickinfos/infos/DeathCoordinates.java index b0a76fb..dee5bdc 100644 --- a/src/client/java/dev/quickinfos/infos/DeathCoordinates.java +++ b/src/client/java/dev/quickinfos/infos/DeathCoordinates.java @@ -1,7 +1,9 @@ package dev.quickinfos.infos; -import dev.quickinfos.StaticVariables; +import dev.quickinfos.Singleton; +import dev.quickinfos.exceptions.CannotRenderInfoException; import dev.quickinfos.trackers.DeathCoordinatesTracker; +import dev.quickinfos.utils.StaticUtils; import net.minecraft.client.MinecraftClient; import net.minecraft.util.math.BlockPos; import org.jetbrains.annotations.NotNull; @@ -14,14 +16,13 @@ public String getHumanReadableName() { } @Override - public String toHUDScreen(@NotNull MinecraftClient client) { - if (client.player == null) { - return "Unknown player position"; - } + public String render(@NotNull MinecraftClient client) { + if (client.player == null) + throw new CannotRenderInfoException(this); - BlockPos pos = ((DeathCoordinatesTracker)StaticVariables.TRACKERS.get(DeathCoordinatesTracker.class.getName())).getLastDeathPos(); - - return String.format("Died at %d / %d / %d", pos.getX(), pos.getY(), pos.getZ()); + BlockPos pos = ((DeathCoordinatesTracker) Singleton.TRACKERS.get(DeathCoordinatesTracker.class.getName())).getLastDeathPos(); + return pos != null ? String.format("Died at %d / %d / %d", pos.getX(), pos.getY(), pos.getZ()) : + StaticUtils.NONE_INFO_CALCULATED; } } diff --git a/src/client/java/dev/quickinfos/infos/FacingDirection.java b/src/client/java/dev/quickinfos/infos/FacingDirection.java index fe1b853..17dff92 100644 --- a/src/client/java/dev/quickinfos/infos/FacingDirection.java +++ b/src/client/java/dev/quickinfos/infos/FacingDirection.java @@ -1,5 +1,7 @@ package dev.quickinfos.infos; +import dev.quickinfos.exceptions.CannotRenderInfoException; +import dev.quickinfos.utils.StaticUtils; import net.minecraft.client.MinecraftClient; import org.jetbrains.annotations.NotNull; @@ -11,10 +13,9 @@ public String getHumanReadableName() { } @Override - public String toHUDScreen(@NotNull MinecraftClient client) { - if (client.player == null) { - return "Unknown player direction"; - } + public String render(@NotNull MinecraftClient client) { + if (client.player == null) + throw new CannotRenderInfoException(this); float yaw = client.player.getYaw(); @@ -22,25 +23,23 @@ public String toHUDScreen(@NotNull MinecraftClient client) { float normalizedYaw = (yaw % 360 + 360) % 360; // Determine the cardinal direction based on the yaw - if (normalizedYaw >= 337.5 || normalizedYaw < 22.5) { - return "South"; - } else if (normalizedYaw >= 22.5 && normalizedYaw < 67.5) { - return "South-West"; - } else if (normalizedYaw >= 67.5 && normalizedYaw < 112.5) { - return "West"; - } else if (normalizedYaw >= 112.5 && normalizedYaw < 157.5) { - return "North-West"; - } else if (normalizedYaw >= 157.5 && normalizedYaw < 202.5) { - return "North"; - } else if (normalizedYaw >= 202.5 && normalizedYaw < 247.5) { - return "North-East"; - } else if (normalizedYaw >= 247.5 && normalizedYaw < 292.5) { - return "East"; - } else if (normalizedYaw >= 292.5 && normalizedYaw < 337.5) { - return "South-East"; - } else { - return "Unknown"; - } + return getDirection(normalizedYaw); + } + + public static String getDirection(double normalizedYaw) { + int sector = (int) ((normalizedYaw + 22.5) / 45) % 8; + + return switch (sector) { + case 0 -> "South"; + case 1 -> "South-West"; + case 2 -> "West"; + case 3 -> "North-West"; + case 4 -> "North"; + case 5 -> "North-East"; + case 6 -> "East"; + case 7 -> "South-East"; + default -> StaticUtils.NONE_INFO_CALCULATED; + }; } } diff --git a/src/client/java/dev/quickinfos/infos/Info.java b/src/client/java/dev/quickinfos/infos/Info.java index b7053cd..598a5c4 100644 --- a/src/client/java/dev/quickinfos/infos/Info.java +++ b/src/client/java/dev/quickinfos/infos/Info.java @@ -1,5 +1,6 @@ package dev.quickinfos.infos; +import dev.quickinfos.exceptions.CannotRenderInfoException; import net.minecraft.client.MinecraftClient; import org.jetbrains.annotations.NotNull; @@ -10,5 +11,5 @@ public abstract class Info { public void setOn(boolean on) { isOn = on; } public abstract String getHumanReadableName(); - public abstract String toHUDScreen(@NotNull MinecraftClient client); + public abstract String render(@NotNull MinecraftClient client) throws CannotRenderInfoException; } diff --git a/src/client/java/dev/quickinfos/infos/TargetedBlock.java b/src/client/java/dev/quickinfos/infos/TargetedBlock.java index 10f577c..d6652e6 100644 --- a/src/client/java/dev/quickinfos/infos/TargetedBlock.java +++ b/src/client/java/dev/quickinfos/infos/TargetedBlock.java @@ -1,9 +1,11 @@ package dev.quickinfos.infos; +import dev.quickinfos.exceptions.CannotRenderInfoException; +import dev.quickinfos.utils.PlayerUtils; +import dev.quickinfos.utils.StaticUtils; import net.minecraft.client.MinecraftClient; import net.minecraft.registry.Registries; import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.hit.HitResult; import org.jetbrains.annotations.NotNull; public class TargetedBlock extends Info { @@ -14,20 +16,13 @@ public String getHumanReadableName() { } @Override - public String toHUDScreen(@NotNull MinecraftClient client) { - if (client.player == null || client.world == null) { - return "Unknown targeted entity"; - } + public String render(@NotNull MinecraftClient client) { + if (client.player == null || client.world == null) + throw new CannotRenderInfoException(this); - double range = client.player.getBlockInteractionRange(); - HitResult hitResult = client.player.raycast(range, 1, false); - if(hitResult.getType() == HitResult.Type.BLOCK) { - String blockName = Registries.BLOCK.getId(client.world.getBlockState(((BlockHitResult) hitResult).getBlockPos()).getBlock()).toString(); - return String.format("Target %s", blockName); - } - else { - return ""; - } + BlockHitResult targetedBlock = PlayerUtils.getTargetedBlockInRange(client.player, false); + return targetedBlock != null ? String.format("Target %s", Registries.BLOCK.getId(client.world.getBlockState(targetedBlock.getBlockPos()).getBlock())) : + StaticUtils.NONE_INFO_CALCULATED; } } diff --git a/src/client/java/dev/quickinfos/infos/TargetedBlockCoordinates.java b/src/client/java/dev/quickinfos/infos/TargetedBlockCoordinates.java index c038a07..5997222 100644 --- a/src/client/java/dev/quickinfos/infos/TargetedBlockCoordinates.java +++ b/src/client/java/dev/quickinfos/infos/TargetedBlockCoordinates.java @@ -1,8 +1,10 @@ package dev.quickinfos.infos; +import dev.quickinfos.exceptions.CannotRenderInfoException; +import dev.quickinfos.utils.PlayerUtils; +import dev.quickinfos.utils.StaticUtils; import net.minecraft.client.MinecraftClient; import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.hit.HitResult; import net.minecraft.util.math.BlockPos; import org.jetbrains.annotations.NotNull; @@ -14,20 +16,17 @@ public String getHumanReadableName() { } @Override - public String toHUDScreen(@NotNull MinecraftClient client) { - if (client.player == null || client.world == null) { - return "Unknown targeted entity"; - } - - double range = client.player.getBlockInteractionRange(); - HitResult hitResult = client.player.raycast(range, 1, false); - if(hitResult.getType() == HitResult.Type.BLOCK) { - BlockPos pos = ((BlockHitResult) hitResult).getBlockPos(); - return String.format("Target at %d / %d / %d", pos.getX(), pos.getY(), pos.getZ()); - } - else { - return ""; - } + public String render(@NotNull MinecraftClient client) { + if (client.player == null || client.world == null) + throw new CannotRenderInfoException(this); + + BlockHitResult targetedBlock = PlayerUtils.getTargetedBlockInRange(client.player, false); + + if(targetedBlock == null) + return StaticUtils.NONE_INFO_CALCULATED; + + BlockPos pos = targetedBlock.getBlockPos(); + return String.format("Target at %d / %d / %d", pos.getX(), pos.getY(), pos.getZ()); } } diff --git a/src/client/java/dev/quickinfos/screen/QuickInfosScreen.java b/src/client/java/dev/quickinfos/screen/QuickInfosScreen.java index 82dae90..694ece6 100644 --- a/src/client/java/dev/quickinfos/screen/QuickInfosScreen.java +++ b/src/client/java/dev/quickinfos/screen/QuickInfosScreen.java @@ -1,6 +1,6 @@ package dev.quickinfos.screen; -import dev.quickinfos.StaticVariables; +import dev.quickinfos.Singleton; import dev.quickinfos.config.ConfigManager; import dev.quickinfos.enums.Positions; import dev.quickinfos.infos.Info; @@ -34,7 +34,7 @@ public void render(DrawContext context, int mouseX, int mouseY, float delta) { @Override public void close() { try { - ConfigManager.saveConfig(StaticVariables.SHOW, StaticVariables.SHOWMENU_KEY.getDefaultKey().getCode(), StaticVariables.TOGGLE_KEY.getDefaultKey().getCode(), StaticVariables.POSITION, StaticVariables.ORDERED_INFOS, StaticVariables.config); + ConfigManager.saveConfig(Singleton.SHOW, Singleton.SHOW_MENU_KEY.getDefaultKey().getCode(), Singleton.TOGGLE_INFO_KEY.getDefaultKey().getCode(), Singleton.POSITION, Singleton.ORDERED_INFOS, Singleton.config); } finally { super.close(); } @@ -63,11 +63,11 @@ public void onMoveDown(UpDownWidget upDownWidget) { } private void move(UpDownWidget upDownWidget, boolean up) { - int index = StaticVariables.ORDERED_INFOS.indexOf(upDownWidget.getInfo()); + int index = Singleton.ORDERED_INFOS.indexOf(upDownWidget.getInfo()); if(up ? index > 0 : - index != -1 && index < StaticVariables.ORDERED_INFOS.size()-1) { - StaticVariables.ORDERED_INFOS.remove(index); - StaticVariables.ORDERED_INFOS.add(index + (up ? -1 : +1), upDownWidget.getInfo()); + index != -1 && index < Singleton.ORDERED_INFOS.size()-1) { + Singleton.ORDERED_INFOS.remove(index); + Singleton.ORDERED_INFOS.add(index + (up ? -1 : +1), upDownWidget.getInfo()); } refreshUpDownList(); } @@ -82,7 +82,7 @@ private void refreshUpDownList(){ upDownWidgets.clear(); } int y = 100; - for(Info orderedInfo : StaticVariables.ORDERED_INFOS){ + for(Info orderedInfo : Singleton.ORDERED_INFOS){ upDownWidgets.add(new UpDownWidget(orderedInfo, 40, y, 320, 20, this)); y+= 22; } @@ -94,14 +94,14 @@ private void refreshUpDownList(){ } private void createPositionButton(){ - ButtonWidget posButton = ButtonWidget.builder(Text.of(buildMessage(StaticVariables.POSITION)), button -> { - switch (StaticVariables.POSITION){ - case TOP_RIGHT -> StaticVariables.POSITION = Positions.BOTTOM_RIGHT; - case BOTTOM_RIGHT -> StaticVariables.POSITION = Positions.BOTTOM_LEFT; - case BOTTOM_LEFT -> StaticVariables.POSITION = Positions.TOP_LEFT; - case TOP_LEFT -> StaticVariables.POSITION = Positions.TOP_RIGHT; + ButtonWidget posButton = ButtonWidget.builder(Text.of(buildMessage(Singleton.POSITION)), button -> { + switch (Singleton.POSITION){ + case TOP_RIGHT -> Singleton.POSITION = Positions.BOTTOM_RIGHT; + case BOTTOM_RIGHT -> Singleton.POSITION = Positions.BOTTOM_LEFT; + case BOTTOM_LEFT -> Singleton.POSITION = Positions.TOP_LEFT; + case TOP_LEFT -> Singleton.POSITION = Positions.TOP_RIGHT; } - button.setMessage(Text.of(buildMessage(StaticVariables.POSITION))); + button.setMessage(Text.of(buildMessage(Singleton.POSITION))); }) .dimensions(40, 65, 160, 20) .build(); diff --git a/src/client/java/dev/quickinfos/trackers/DeathCoordinatesTracker.java b/src/client/java/dev/quickinfos/trackers/DeathCoordinatesTracker.java index cc17787..5d6f929 100644 --- a/src/client/java/dev/quickinfos/trackers/DeathCoordinatesTracker.java +++ b/src/client/java/dev/quickinfos/trackers/DeathCoordinatesTracker.java @@ -1,5 +1,7 @@ package dev.quickinfos.trackers; +import dev.quickinfos.exceptions.CannotCheckTriggerConditionTrackerException; +import dev.quickinfos.exceptions.CannotTriggerTrackerException; import net.minecraft.client.MinecraftClient; import net.minecraft.util.math.BlockPos; import org.jetbrains.annotations.NotNull; @@ -14,13 +16,13 @@ public BlockPos getLastDeathPos() { @Override public boolean shouldTrigger(@NotNull MinecraftClient client) { - if (client.player == null) return false; + if (client.player == null) throw new CannotCheckTriggerConditionTrackerException(this); return client.player.getHealth() == 0; } @Override public void trigger(@NotNull MinecraftClient client) { - if (client.player == null) return; + if (client.player == null) throw new CannotTriggerTrackerException(this); lastDeathPos = new BlockPos(client.player.getBlockPos()); } } diff --git a/src/client/java/dev/quickinfos/trackers/Tracker.java b/src/client/java/dev/quickinfos/trackers/Tracker.java index e664e27..34ac540 100644 --- a/src/client/java/dev/quickinfos/trackers/Tracker.java +++ b/src/client/java/dev/quickinfos/trackers/Tracker.java @@ -1,9 +1,11 @@ package dev.quickinfos.trackers; +import dev.quickinfos.exceptions.CannotCheckTriggerConditionTrackerException; +import dev.quickinfos.exceptions.CannotTriggerTrackerException; import net.minecraft.client.MinecraftClient; import org.jetbrains.annotations.NotNull; public interface Tracker { - boolean shouldTrigger(@NotNull MinecraftClient client); - void trigger(@NotNull MinecraftClient client); + boolean shouldTrigger(@NotNull MinecraftClient client) throws CannotCheckTriggerConditionTrackerException; + void trigger(@NotNull MinecraftClient client) throws CannotTriggerTrackerException; } diff --git a/src/client/java/dev/quickinfos/utils/DefaultConfigUtils.java b/src/client/java/dev/quickinfos/utils/DefaultConfigUtils.java new file mode 100644 index 0000000..a45ba23 --- /dev/null +++ b/src/client/java/dev/quickinfos/utils/DefaultConfigUtils.java @@ -0,0 +1,8 @@ +package dev.quickinfos.utils; + +import org.lwjgl.glfw.GLFW; + +public class DefaultConfigUtils { + public static int SHOW_MENU_KEYCODE = GLFW.GLFW_KEY_M; + public static int TOGGLE_INFO_KEYCODE = GLFW.GLFW_KEY_K; +} diff --git a/src/client/java/dev/quickinfos/utils/KeyUtils.java b/src/client/java/dev/quickinfos/utils/KeyUtils.java new file mode 100644 index 0000000..6ee6312 --- /dev/null +++ b/src/client/java/dev/quickinfos/utils/KeyUtils.java @@ -0,0 +1,25 @@ +package dev.quickinfos.utils; + +import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; +import net.minecraft.client.option.KeyBinding; +import net.minecraft.client.util.InputUtil; + +public class KeyUtils { + + public static KeyBinding registerToggleInfo(int keyCode){ + return registerKeyBindingInMinecraftControls("Toggle Key", keyCode); + } + + public static KeyBinding registerShowMenu(int keyCode){ + return registerKeyBindingInMinecraftControls("Show Menu Key", keyCode); + } + + public static KeyBinding registerKeyBindingInMinecraftControls(String translationKey, int keyCode){ + return KeyBindingHelper.registerKeyBinding(new KeyBinding( + translationKey, + InputUtil.Type.KEYSYM, + keyCode, + StaticUtils.QUICKINFOS_CATEGORY_CONTROLS + )); + } +} diff --git a/src/client/java/dev/quickinfos/utils/PlayerUtils.java b/src/client/java/dev/quickinfos/utils/PlayerUtils.java new file mode 100644 index 0000000..de5fbc1 --- /dev/null +++ b/src/client/java/dev/quickinfos/utils/PlayerUtils.java @@ -0,0 +1,16 @@ +package dev.quickinfos.utils; + +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.util.hit.HitResult; +import net.minecraft.util.hit.BlockHitResult; + +public class PlayerUtils { + public static HitResult getTargetedObjectInRange(ClientPlayerEntity player, boolean includeFluids){ + return player.raycast(player.getBlockInteractionRange(), 1, includeFluids); + } + + public static BlockHitResult getTargetedBlockInRange(ClientPlayerEntity player, boolean includeFluids){ + HitResult hitResult = getTargetedObjectInRange(player, includeFluids); + return hitResult.getType() == HitResult.Type.BLOCK ? (BlockHitResult) hitResult : null; + } +} diff --git a/src/client/java/dev/quickinfos/utils/ScreenUtils.java b/src/client/java/dev/quickinfos/utils/ScreenUtils.java new file mode 100644 index 0000000..6f5bff9 --- /dev/null +++ b/src/client/java/dev/quickinfos/utils/ScreenUtils.java @@ -0,0 +1,12 @@ +package dev.quickinfos.utils; + +import dev.quickinfos.screen.QuickInfosScreen; +import net.minecraft.client.MinecraftClient; +import net.minecraft.text.Text; +import org.jetbrains.annotations.NotNull; + +public class ScreenUtils { + public static void openScreen(@NotNull MinecraftClient client){ + client.send(() -> client.setScreen(new QuickInfosScreen(Text.empty()))); + } +} diff --git a/src/client/java/dev/quickinfos/utils/StaticUtils.java b/src/client/java/dev/quickinfos/utils/StaticUtils.java new file mode 100644 index 0000000..b4af6ee --- /dev/null +++ b/src/client/java/dev/quickinfos/utils/StaticUtils.java @@ -0,0 +1,9 @@ +package dev.quickinfos.utils; + +public class StaticUtils { + public static final String NONE_INFO_CALCULATED = ""; + public static final String CONFIG_FILE_PATH = "quickinfos_mod.json"; + public static final String LAYER_ID = "quickinfos"; + public static final String COMMAND_LITERAL = "quickinfos"; + public static final String QUICKINFOS_CATEGORY_CONTROLS = "Quickinfos"; +}