diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b01da52..8fc3827 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -8,29 +8,22 @@ on: [pull_request, push] jobs: build: - strategy: - matrix: - # Use these Java versions - java: [ - 21, # Current Java LTS - ] - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - name: checkout repository uses: actions/checkout@v4 - name: validate gradle wrapper - uses: gradle/wrapper-validation-action@v2 - - name: setup jdk ${{ matrix.java }} + uses: gradle/actions/wrapper-validation@v4 + - name: setup jdk uses: actions/setup-java@v4 with: - java-version: ${{ matrix.java }} + java-version: '21' distribution: 'microsoft' - name: make gradle wrapper executable run: chmod +x ./gradlew - name: build run: ./gradlew build - name: capture build artifacts - if: ${{ matrix.java == '21' }} # Only upload artifacts built from latest java uses: actions/upload-artifact@v4 with: name: Artifacts diff --git a/gradle.properties b/gradle.properties index d92565e..7e55711 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,7 +10,7 @@ loader_version=0.17.3 loom_version=1.11-SNAPSHOT # Mod Properties -mod_version=1.1.1 +mod_version=2.0.0 maven_group=dsns.betterhud archives_base_name=betterhud diff --git a/src/main/java/dsns/betterhud/BetterHUD.java b/src/main/java/dsns/betterhud/BetterHUD.java index 348f931..81b401c 100644 --- a/src/main/java/dsns/betterhud/BetterHUD.java +++ b/src/main/java/dsns/betterhud/BetterHUD.java @@ -1,28 +1,48 @@ package dsns.betterhud; +import dsns.betterhud.mods.*; +import dsns.betterhud.util.BaseMod; +import java.util.ArrayList; +import java.util.Arrays; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.rendering.v1.hud.HudElementRegistry; import net.minecraft.util.Identifier; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Environment(EnvType.CLIENT) public class BetterHUD implements ClientModInitializer { - // This logger is used to write text to the console and the log file. - // It is considered best practice to use your mod id as the logger's name. - // That way, it's clear which mod wrote info, warnings, and errors. - public static final Logger LOGGER = LoggerFactory.getLogger("betterhud"); - @Override - public void onInitializeClient() { - Config.configure(); + // This logger is used to write text to the console and the log file. + // It is considered best practice to use your mod id as the logger's name. + // That way, it's clear which mod wrote info, warnings, and errors. + public static final Logger LOGGER = LoggerFactory.getLogger("betterhud"); + + public static ArrayList mods = new ArrayList<>( + Arrays.asList( + new FPS(), + new Ping(), + new Momentum(), + new Coordinates(), + new Biome(), + new Facing(), + new Time() + ) + ); + + @Override + public void onInitializeClient() { + Config.configure(); + + BetterHUDGUI betterHUDGUI = new BetterHUDGUI(); - BetterHUDGUI betterHUDGUI = new BetterHUDGUI(); - HudElementRegistry.addLast(Identifier.of("betterhud", "hud"), betterHUDGUI::onHudRender); - ClientTickEvents.START_CLIENT_TICK.register(betterHUDGUI); - } -} \ No newline at end of file + HudElementRegistry.addLast( + Identifier.of("betterhud", "hud"), + betterHUDGUI::onHudRender + ); + ClientTickEvents.START_CLIENT_TICK.register(betterHUDGUI); + } +} diff --git a/src/main/java/dsns/betterhud/BetterHUDGUI.java b/src/main/java/dsns/betterhud/BetterHUDGUI.java index a909e1a..0cc3313 100644 --- a/src/main/java/dsns/betterhud/BetterHUDGUI.java +++ b/src/main/java/dsns/betterhud/BetterHUDGUI.java @@ -1,136 +1,172 @@ package dsns.betterhud; -import java.util.ArrayList; -import java.util.List; - +import dsns.betterhud.util.BaseMod; +import dsns.betterhud.util.CustomText; +import dsns.betterhud.util.ModSettings; import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import java.util.List; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.render.RenderTickCounter; -import dsns.betterhud.mods.*; -import dsns.betterhud.util.BaseMod; -import dsns.betterhud.util.CustomText; public class BetterHUDGUI implements ClientTickEvents.StartTick { - private final MinecraftClient client = MinecraftClient.getInstance(); - private final List topLeftText = new ObjectArrayList<>(); - private final List topRightText = new ObjectArrayList<>(); - private final List bottomLeftList = new ObjectArrayList<>(); - private final List bottomRightText = new ObjectArrayList<>(); - private final List customPositionText = new ObjectArrayList<>(); - - @Override - public void onStartTick(MinecraftClient client) { - this.topLeftText.clear(); - this.topRightText.clear(); - this.bottomLeftList.clear(); - this.bottomRightText.clear(); - this.customPositionText.clear(); - - ArrayList mods = new ArrayList<>(); - mods.add(new FPS()); - mods.add(new Ping()); - mods.add(new Momentum()); - mods.add(new Coordinates()); - mods.add(new Biome()); - mods.add(new Facing()); - mods.add(new Time()); - - for (BaseMod mod : mods) { - ModSettings modSettings = Config.settings.get(mod.getModID()); - if (!modSettings.enabled) - continue; - - CustomText modText = mod.onStartTick(client); - if (modText == null) - continue; - - if (modSettings.customPosition) { - modText.customPosition = true; - modText.customX = modSettings.customX; - modText.customY = modSettings.customY; - this.customPositionText.add(modText); - } else if (modSettings.orientation.equals("top-left")) { - this.topLeftText.add(modText); - } else if (modSettings.orientation.equals("top-right")) { - this.topRightText.add(modText); - } else if (modSettings.orientation.equals("bottom-left")) { - this.bottomLeftList.add(modText); - } else if (modSettings.orientation.equals("bottom-right")) { - this.bottomRightText.add(modText); - } - } - } - - public void onHudRender(DrawContext drawContext, RenderTickCounter tickCounter) { - if (client.getDebugHud().shouldShowDebugHud()) - return; - if (client.options.hudHidden) - return; - - int x = Config.horizontalMargin; - int y = Config.verticalMargin; - - for (CustomText text : topLeftText) { - drawString(drawContext, text, x, y); - - y += (client.textRenderer.fontHeight - 1) + (Config.verticalPadding * 2) + Config.lineHeight; - } - - y = client.getWindow().getScaledHeight() - Config.verticalMargin; - - for (CustomText text : bottomLeftList) { - y -= (client.textRenderer.fontHeight - 1) + (Config.verticalPadding * 2); - drawString(drawContext, text, x, y); - y -= Config.lineHeight; - } - - y = Config.verticalMargin; - for (CustomText text : topRightText) { - int offset = (client.textRenderer.getWidth(text.text) - 1) + (Config.horizontalPadding * 2) - + Config.horizontalMargin; - x = client.getWindow().getScaledWidth() - offset; - drawString(drawContext, text, x, y); - - y += (client.textRenderer.fontHeight - 1) + (Config.verticalPadding * 2) + Config.lineHeight; - } - - y = client.getWindow().getScaledHeight() - Config.verticalMargin; - for (CustomText text : bottomRightText) { - int offset = (client.textRenderer.getWidth(text.text) - 1) + (Config.horizontalPadding * 2) - + Config.horizontalMargin; - x = client.getWindow().getScaledWidth() - offset; - - y -= (client.textRenderer.fontHeight - 1) + (Config.verticalPadding * 2); - - drawString(drawContext, text, x, y); - - y -= Config.lineHeight; - } - - for (CustomText text : customPositionText) { - float xPercent = text.customX / 100.0f; - float yPercent = text.customY / 100.0f; - - int maxX = client.getWindow().getScaledWidth() - (Config.horizontalPadding * 2) - - (client.textRenderer.getWidth(text.text) - 1); - int maxY = client.getWindow().getScaledHeight() - (Config.verticalPadding * 2) - - (client.textRenderer.fontHeight - 1); - - int scaledX = (int) (xPercent * maxX); - int scaledY = (int) (yPercent * maxY); - - drawString(drawContext, text, scaledX, scaledY); - } - } - - private void drawString(DrawContext drawContext, CustomText text, int x, int y) { - drawContext.fill(x, y, - x + (client.textRenderer.getWidth(text.text) - 1) + (Config.horizontalPadding * 2), - y + (client.textRenderer.fontHeight - 1) + (Config.verticalPadding * 2), text.backgroundColor); - - drawContext.drawText(client.textRenderer, text.text, x + Config.horizontalPadding, y + Config.verticalPadding, - text.color, true); - } + + public static int verticalPadding = 4; + public static int horizontalPadding = 4; + + public static int verticalMargin = 1; + public static int horizontalMargin = 1; + + public static int lineHeight = 1; + + private final MinecraftClient client = MinecraftClient.getInstance(); + private final List topLeftText = new ObjectArrayList<>(); + private final List topRightText = new ObjectArrayList<>(); + private final List bottomLeftList = new ObjectArrayList<>(); + private final List bottomRightText = new ObjectArrayList<>(); + private final List customPositionText = new ObjectArrayList<>(); + + @Override + public void onStartTick(MinecraftClient client) { + this.topLeftText.clear(); + this.topRightText.clear(); + this.bottomLeftList.clear(); + this.bottomRightText.clear(); + this.customPositionText.clear(); + + for (BaseMod mod : BetterHUD.mods) { + ModSettings modSettings = mod.getModSettings(); + if (!modSettings.getSetting("Enabled").getBooleanValue()) continue; + + CustomText modText = mod.onStartTick(client); + if (modText == null) continue; + + String orientation = modSettings + .getSetting("Orientation") + .getStringValue(); + + if (modSettings.getSetting("Custom Position").getBooleanValue()) { + modText.customPosition = true; + modText.customX = modSettings + .getSetting("Custom X") + .getIntValue(); + modText.customY = modSettings + .getSetting("Custom Y") + .getIntValue(); + this.customPositionText.add(modText); + } else if (orientation.equals("top-left")) { + this.topLeftText.add(modText); + } else if (orientation.equals("top-right")) { + this.topRightText.add(modText); + } else if (orientation.equals("bottom-left")) { + this.bottomLeftList.add(modText); + } else if (orientation.equals("bottom-right")) { + this.bottomRightText.add(modText); + } + } + } + + public void onHudRender( + DrawContext drawContext, + RenderTickCounter tickCounter + ) { + if (client.getDebugHud().shouldShowDebugHud()) return; + if (client.options.hudHidden) return; + + int x = horizontalMargin; + int y = verticalMargin; + + for (CustomText text : topLeftText) { + drawString(drawContext, text, x, y); + + y += + (client.textRenderer.fontHeight - 1) + + (verticalPadding * 2) + + lineHeight; + } + + y = client.getWindow().getScaledHeight() - verticalMargin; + + for (CustomText text : bottomLeftList) { + y -= (client.textRenderer.fontHeight - 1) + (verticalPadding * 2); + drawString(drawContext, text, x, y); + y -= lineHeight; + } + + y = verticalMargin; + for (CustomText text : topRightText) { + int offset = + (client.textRenderer.getWidth(text.text) - 1) + + (horizontalPadding * 2) + + horizontalMargin; + x = client.getWindow().getScaledWidth() - offset; + drawString(drawContext, text, x, y); + + y += + (client.textRenderer.fontHeight - 1) + + (verticalPadding * 2) + + lineHeight; + } + + y = client.getWindow().getScaledHeight() - verticalMargin; + for (CustomText text : bottomRightText) { + int offset = + (client.textRenderer.getWidth(text.text) - 1) + + (horizontalPadding * 2) + + horizontalMargin; + x = client.getWindow().getScaledWidth() - offset; + + y -= (client.textRenderer.fontHeight - 1) + (verticalPadding * 2); + + drawString(drawContext, text, x, y); + + y -= lineHeight; + } + + for (CustomText text : customPositionText) { + float xPercent = text.customX / 100.0f; + float yPercent = text.customY / 100.0f; + + int maxX = + client.getWindow().getScaledWidth() - + (horizontalPadding * 2) - + (client.textRenderer.getWidth(text.text) - 1); + int maxY = + client.getWindow().getScaledHeight() - + (verticalPadding * 2) - + (client.textRenderer.fontHeight - 1); + + int scaledX = (int) (xPercent * maxX); + int scaledY = (int) (yPercent * maxY); + + drawString(drawContext, text, scaledX, scaledY); + } + } + + private void drawString( + DrawContext drawContext, + CustomText text, + int x, + int y + ) { + drawContext.fill( + x, + y, + x + + (client.textRenderer.getWidth(text.text) - 1) + + (horizontalPadding * 2), + y + (client.textRenderer.fontHeight - 1) + (verticalPadding * 2), + text.backgroundColor + ); + + drawContext.drawText( + client.textRenderer, + text.text, + x + horizontalPadding, + y + verticalPadding, + text.color, + true + ); + } } diff --git a/src/main/java/dsns/betterhud/Config.java b/src/main/java/dsns/betterhud/Config.java index b606a08..deff5a1 100644 --- a/src/main/java/dsns/betterhud/Config.java +++ b/src/main/java/dsns/betterhud/Config.java @@ -1,158 +1,154 @@ package dsns.betterhud; +import dsns.betterhud.util.BaseMod; +import dsns.betterhud.util.ModSettings; +import dsns.betterhud.util.Setting; import java.nio.file.Files; import java.nio.file.Path; import java.util.HashMap; +import java.util.Map; import java.util.Properties; - import net.fabricmc.loader.api.FabricLoader; -class ModSettings { - public String orientation; - public boolean enabled; - public boolean customPosition; - public int customX; - public int customY; - - public ModSettings(String orientation, boolean enabled, boolean customPosition, int customX, int customY) { - this.orientation = orientation; - this.enabled = enabled; - this.customPosition = customPosition; - this.customX = customX; - this.customY = customY; - } - - public ModSettings(String orientation) { - this(orientation, true, false, 0, 0); - } - - public ModSettings() { - this("top-left", true, false, 0, 0); - } -} - public class Config { - public static int verticalPadding = 4; - public static int horizontalPadding = 4; - - public static int verticalMargin = 1; - public static int horizontalMargin = 1; - - public static int lineHeight = 1; - - public static int textColor = 0xffffffff; - public static int backgroundColor = 0x88000000; - - public static HashMap settings = new HashMap(); - - private static final Path configPath = FabricLoader.getInstance().getConfigDir() - .resolve("betterhud.properties"); - - public static HashMap getDefaults() { - HashMap defaults = new HashMap(); - - defaults.put("FPS", new ModSettings("top-left")); - defaults.put("Ping", new ModSettings("top-left")); - defaults.put("Momentum", new ModSettings("top-left")); - defaults.put("Coordinates", new ModSettings("top-right")); - defaults.put("Biome", new ModSettings("top-right")); - defaults.put("Facing", new ModSettings("top-right")); - defaults.put("Time", new ModSettings("bottom-right")); - - return defaults; - } - - public static void configure() { - if (settings.size() == 0) { - settings = getDefaults(); - } - - if (Files.exists(configPath)) { - deserialize(); - } else { - serialize(); - } - } - - public static void serialize() { - Properties prop = new Properties(); - for (String modID : settings.keySet()) { - ModSettings modSettings = settings.get(modID); - prop.setProperty(modID + ".enabled", String.valueOf(modSettings.enabled)); - prop.setProperty(modID + ".orientation", modSettings.orientation); - prop.setProperty(modID + ".customPosition", String.valueOf(modSettings.customPosition)); - prop.setProperty(modID + ".customX", String.valueOf(modSettings.customX)); - prop.setProperty(modID + ".customY", String.valueOf(modSettings.customY)); - } - - prop.setProperty("verticalPadding", String.valueOf(Config.verticalPadding)); - prop.setProperty("horizontalPadding" + "", String.valueOf(Config.horizontalPadding)); - prop.setProperty("verticalMargin", String.valueOf(Config.verticalMargin)); - prop.setProperty("horizontalMargin" + "", String.valueOf(Config.horizontalMargin)); - prop.setProperty("lineHeight", String.valueOf(Config.lineHeight)); - prop.setProperty("textColor", String.valueOf(Config.textColor)); - prop.setProperty("backgroundColor", String.valueOf(Config.backgroundColor)); - - try { - prop.store(Files.newOutputStream(configPath), null); - } catch (Exception e) { - e.printStackTrace(); - } - } - - public static void deserialize() { - Properties prop = new Properties(); - try { - prop.load(Files.newInputStream(configPath)); - } catch (Exception e) { - e.printStackTrace(); - } - - for (String modID : settings.keySet()) { - ModSettings modSettings = settings.get(modID); - modSettings.enabled = getBooleanProperty(prop, modID + ".enabled", modSettings.enabled); - modSettings.orientation = getStringProperty(prop, modID + ".orientation", modSettings.orientation); - modSettings.customPosition = getBooleanProperty(prop, modID + ".customPosition", - modSettings.customPosition); - modSettings.customX = getIntProperty(prop, modID + ".customX", modSettings.customX); - modSettings.customY = getIntProperty(prop, modID + ".customY", modSettings.customY); - } - - Config.verticalPadding = getIntProperty(prop, "verticalPadding", Config.verticalPadding); - Config.horizontalPadding = getIntProperty(prop, "horizontalPadding", Config.horizontalPadding); - Config.verticalMargin = getIntProperty(prop, "verticalMargin", Config.verticalMargin); - Config.horizontalMargin = getIntProperty(prop, "horizontalMargin", Config.horizontalMargin); - Config.lineHeight = getIntProperty(prop, "lineHeight", Config.lineHeight); - Config.textColor = getIntProperty(prop, "textColor", Config.textColor); - Config.backgroundColor = getIntProperty(prop, "backgroundColor", Config.backgroundColor); - - serialize(); - } - - private static String getStringProperty(Properties prop, String key, String defaultValue) { - try { - String value = prop.getProperty(key); - return (value != null) ? value : defaultValue; - } catch (Exception e) { - return defaultValue; - } - } - - private static int getIntProperty(Properties prop, String key, int defaultValue) { - try { - String value = prop.getProperty(key); - return (value != null) ? Integer.parseInt(value) : defaultValue; - } catch (Exception e) { - return defaultValue; - } - } - - private static boolean getBooleanProperty(Properties prop, String key, boolean defaultValue) { - try { - String value = prop.getProperty(key); - return (value != null) ? Boolean.parseBoolean(value) : defaultValue; - } catch (Exception e) { - return defaultValue; - } - } + + private static final Path configPath = FabricLoader.getInstance() + .getConfigDir() + .resolve("betterhud.properties"); + + private static HashMap settings = new HashMap<>(); + + public static void configure() { + if (settings.isEmpty()) { + for (BaseMod mod : BetterHUD.mods) { + settings.put(mod.getModID(), mod.getModSettings()); + } + } + + if (Files.exists(configPath)) { + deserialize(); + } else { + serialize(); + } + } + + private static String titleCaseToCamelCase(String title) { + if (title == null || title.trim().isEmpty()) { + return title; + } + + String[] words = title.trim().split("\\s+"); + if (words.length == 0) { + return ""; + } + + StringBuilder result = new StringBuilder(words[0].toLowerCase()); + + for (int i = 1; i < words.length; i++) { + String word = words[i]; + if (!word.isEmpty()) { + String camelWord = + word.substring(0, 1).toUpperCase() + + word.substring(1).toLowerCase(); + result.append(camelWord); + } + } + + return result.toString(); + } + + public static void serialize() { + Properties prop = new Properties(); + HashMap serialized = new HashMap(); + + for (Map.Entry entry : settings.entrySet()) { + ModSettings modSettings = entry.getValue(); + + for (Map.Entry settingEntry : modSettings + .getSettings() + .entrySet()) { + serialized.put( + entry.getKey() + "." + settingEntry.getKey(), + settingEntry.getValue().getStringValue() + ); + } + } + + prop.putAll(serialized); + + try { + prop.store(Files.newOutputStream(configPath), null); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static void deserialize() { + Properties prop = new Properties(); + try { + prop.load(Files.newInputStream(configPath)); + } catch (Exception e) { + System.err.println("Failed to load config: " + e.getMessage()); + e.printStackTrace(); + return; + } + + Map map = new HashMap(); + for (final String name : prop.stringPropertyNames()) { + map.put(name, prop.getProperty(name)); + } + + for (Map.Entry modEntry : settings.entrySet()) { + String modID = modEntry.getKey(); + ModSettings modSetting = modEntry.getValue(); + + for (Map.Entry entry : modSetting + .getSettings() + .entrySet()) { + String fullKey = modID + "." + entry.getKey(); + String oldConfigKey = + modID + "." + titleCaseToCamelCase(entry.getKey()); + + String val = map.get(fullKey); + String oldVal = map.get(oldConfigKey); + if (val != null) { + entry.getValue().setValue(val); + } else if (oldVal != null) { + entry.getValue().setValue(oldVal); + } + } + } + + String globalBg = map.get("backgroundColor"); + if (globalBg != null) { + for (Map.Entry< + String, + ModSettings + > modEntry : settings.entrySet()) { + Setting bgSetting = modEntry + .getValue() + .getSetting("Background Color"); + if (bgSetting != null) { + bgSetting.setValue(globalBg); + } + } + } + + String globalText = map.get("textColor"); + if (globalText != null) { + for (Map.Entry< + String, + ModSettings + > modEntry : settings.entrySet()) { + Setting textSetting = modEntry + .getValue() + .getSetting("Text Color"); + if (textSetting != null) { + textSetting.setValue(globalText); + } + } + } + + serialize(); + } } diff --git a/src/main/java/dsns/betterhud/ModMenu.java b/src/main/java/dsns/betterhud/ModMenu.java index fc55ca4..c38d39c 100644 --- a/src/main/java/dsns/betterhud/ModMenu.java +++ b/src/main/java/dsns/betterhud/ModMenu.java @@ -1,112 +1,129 @@ package dsns.betterhud; -import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.text.Text; - -import java.util.Arrays; - import com.terraformersmc.modmenu.api.ConfigScreenFactory; import com.terraformersmc.modmenu.api.ModMenuApi; +import dsns.betterhud.util.BaseMod; +import dsns.betterhud.util.Setting; +import java.util.Arrays; +import java.util.Map; import me.shedaniel.clothconfig2.api.ConfigBuilder; import me.shedaniel.clothconfig2.api.ConfigCategory; import me.shedaniel.clothconfig2.api.ConfigEntryBuilder; +import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.text.Text; public class ModMenu implements ModMenuApi { - @Override - public ConfigScreenFactory getModConfigScreenFactory() { - if (!FabricLoader.getInstance().isModLoaded("cloth-config2")) { - return parent -> null; - } - return parent -> { - ConfigBuilder builder = ConfigBuilder.create() - .setParentScreen(parent) - .setTitle(Text.literal("BetterHUD Settings")); - - // same as builder.setSavingRunnable(() -> Config.serialize()); - builder.setSavingRunnable(Config::serialize); - - ConfigEntryBuilder entryBuilder = builder.entryBuilder(); - - ConfigCategory general = builder.getOrCreateCategory(Text.literal("General")); - general.addEntry(entryBuilder - .startIntSlider(Text.literal("Vertical Padding"), Config.verticalPadding, 0, 40) - .setDefaultValue(4) - .setSaveConsumer(newValue -> Config.verticalPadding = newValue) - .build()); - - general.addEntry(entryBuilder - .startIntSlider(Text.literal("Horizontal Padding"), Config.horizontalPadding, 0, 40) - .setDefaultValue(4) - .setSaveConsumer(newValue -> Config.horizontalPadding = newValue) - .build()); - - general.addEntry(entryBuilder - .startIntSlider(Text.literal("Vertical Margin"), Config.verticalMargin, 0, 40) - .setDefaultValue(1) - .setSaveConsumer(newValue -> Config.verticalMargin = newValue) - .build()); - - general.addEntry(entryBuilder - .startIntSlider(Text.literal("Horizontal Margin"), Config.horizontalMargin, 0, 40) - .setDefaultValue(1) - .setSaveConsumer(newValue -> Config.horizontalMargin = newValue) - .build()); - - general.addEntry(entryBuilder - .startIntSlider(Text.literal("Line Height"), Config.lineHeight, 0, 40) - .setDefaultValue(1) - .setSaveConsumer(newValue -> Config.lineHeight = newValue) - .build()); - - general.addEntry(entryBuilder - .startAlphaColorField(Text.literal("Text Color"), Config.textColor) - .setDefaultValue(0xffffffff) - .setSaveConsumer(newValue -> Config.textColor = newValue) - .build()); - - general.addEntry(entryBuilder - .startAlphaColorField(Text.literal("Background Color"), Config.backgroundColor) - .setDefaultValue(0x88000000) - .setSaveConsumer(newValue -> Config.backgroundColor = newValue) - .build()); - - for (String modID : Config.getDefaults().keySet()) { - ConfigCategory category = builder.getOrCreateCategory(Text.literal(modID)); - - category.addEntry(entryBuilder - .startBooleanToggle(Text.literal("Enabled"), Config.settings.get(modID).enabled) - .setDefaultValue(Config.getDefaults().get(modID).enabled) - .setSaveConsumer(newValue -> Config.settings.get(modID).enabled = newValue) - .build()); - - category.addEntry(entryBuilder - .startStringDropdownMenu(Text.literal("Orientation"), Config.settings.get(modID).orientation) - .setDefaultValue(Config.getDefaults().get(modID).orientation) - .setSelections(Arrays.asList("top-left", "top-right", "bottom-left", "bottom-right")) - .setSuggestionMode(false) - .setSaveConsumer(newValue -> Config.settings.get(modID).orientation = newValue) - .build()); - - category.addEntry(entryBuilder - .startBooleanToggle(Text.literal("Custom Position"), Config.settings.get(modID).customPosition) - .setDefaultValue(Config.getDefaults().get(modID).customPosition) - .setSaveConsumer(newValue -> Config.settings.get(modID).customPosition = newValue) - .build()); - - category.addEntry(entryBuilder - .startIntSlider(Text.literal("Custom X"), Config.settings.get(modID).customX, 0, 100) - .setDefaultValue(Config.getDefaults().get(modID).customX) - .setSaveConsumer(newValue -> Config.settings.get(modID).customX = newValue) - .build()); - - category.addEntry(entryBuilder - .startIntSlider(Text.literal("Custom Y"), Config.settings.get(modID).customY, 0, 100) - .setDefaultValue(Config.getDefaults().get(modID).customY) - .setSaveConsumer(newValue -> Config.settings.get(modID).customY = newValue) - .build()); - } - return builder.build(); - }; - } -} \ No newline at end of file + @Override + public ConfigScreenFactory getModConfigScreenFactory() { + if (!FabricLoader.getInstance().isModLoaded("cloth-config2")) { + return parent -> null; + } + return parent -> { + ConfigBuilder builder = ConfigBuilder.create() + .setParentScreen(parent) + .setTitle(Text.literal("BetterHUD Settings")); + + // same as builder.setSavingRunnable(() -> Config.serialize()); + builder.setSavingRunnable(Config::serialize); + + ConfigEntryBuilder entryBuilder = builder.entryBuilder(); + + for (BaseMod mod : BetterHUD.mods) { + ConfigCategory category = builder.getOrCreateCategory( + Text.literal(mod.getModID()) + ); + + for (Map.Entry entry : mod + .getModSettings() + .getSettings() + .entrySet()) { + String key = entry.getKey(); + Setting setting = entry.getValue(); + + if (setting.getType().equals("boolean")) { + category.addEntry( + entryBuilder + .startBooleanToggle( + Text.literal(key), + setting.getBooleanValue() + ) + .setDefaultValue( + Boolean.valueOf(setting.getDefaultValue()) + ) + .setSaveConsumer(value -> + setting.setValue(String.valueOf(value)) + ) + .build() + ); + } else if (setting.getType().equals("string")) { + category.addEntry( + entryBuilder + .startStringDropdownMenu( + Text.literal(key), + setting.getStringValue() + ) + .setSelections( + Arrays.asList(setting.getPossibleValues()) + ) + .setDefaultValue(setting.getDefaultValue()) + .setSaveConsumer(value -> + setting.setValue(value) + ) + .build() + ); + } else if (setting.getType().equals("integer")) { + category.addEntry( + entryBuilder + .startIntField( + Text.literal(key), + setting.getIntValue() + ) + .setDefaultValue( + Integer.parseInt(setting.getDefaultValue()) + ) + .setSaveConsumer(value -> + setting.setValue(String.valueOf(value)) + ) + .build() + ); + } else if (setting.getType().equals("double")) { + category.addEntry( + entryBuilder + .startDoubleField( + Text.literal(key), + setting.getDoubleValue() + ) + .setDefaultValue( + Double.parseDouble( + setting.getDefaultValue() + ) + ) + .setSaveConsumer(value -> + setting.setValue(String.valueOf(value)) + ) + .build() + ); + } else if (setting.getType().equals("color")) { + category.addEntry( + entryBuilder + .startAlphaColorField( + Text.literal(key), + setting.getColorValue() + ) + .setDefaultValue( + Integer.parseInt(setting.getDefaultValue()) + ) + .setSaveConsumer(value -> + setting.setValue(String.valueOf(value)) + ) + .build() + ); + } + } + } + + return builder.build(); + }; + } +} diff --git a/src/main/java/dsns/betterhud/mixin/MinecraftClientAccessor.java b/src/main/java/dsns/betterhud/mixin/MinecraftClientAccessor.java index d106fd6..4620f79 100644 --- a/src/main/java/dsns/betterhud/mixin/MinecraftClientAccessor.java +++ b/src/main/java/dsns/betterhud/mixin/MinecraftClientAccessor.java @@ -6,8 +6,8 @@ @Mixin(MinecraftClient.class) public interface MinecraftClientAccessor { - @Accessor("currentFps") - static int getCurrentFPS() { - return 0; - } -} \ No newline at end of file + @Accessor("currentFps") + static int getCurrentFPS() { + return 0; + } +} diff --git a/src/main/java/dsns/betterhud/mods/Biome.java b/src/main/java/dsns/betterhud/mods/Biome.java index 52f0b3e..a5125c1 100644 --- a/src/main/java/dsns/betterhud/mods/Biome.java +++ b/src/main/java/dsns/betterhud/mods/Biome.java @@ -1,94 +1,101 @@ package dsns.betterhud.mods; -import net.minecraft.client.MinecraftClient; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.registry.RegistryKey; - +import dsns.betterhud.util.BaseMod; +import dsns.betterhud.util.CustomText; +import dsns.betterhud.util.ModSettings; import java.util.LinkedHashMap; import java.util.Map; import java.util.Optional; - -import dsns.betterhud.util.BaseMod; -import dsns.betterhud.util.CustomText; +import net.minecraft.client.MinecraftClient; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.registry.RegistryKey; public class Biome implements BaseMod { - @Override - public String getModID() { - return "Biome"; - } - - @Override - public CustomText onStartTick(MinecraftClient client) { - PlayerEntity player = client.player; - - if (player == null) - return null; - - // have to specify this because name of class is Biome - Optional> biome = client.world.getBiome(player.getBlockPos()) - .getKey(); - - if (!biome.isPresent()) - return null; - - String biomeString = formatSnakeCase(biome.get().getValue().getPath()); - - // used to maintain order when iterating - LinkedHashMap biomeColors = new LinkedHashMap<>(); - biomeColors.put("Bamboo", 0xff32cd32); - biomeColors.put("Snowy", 0xffffffff); - biomeColors.put("Frozen", 0xff87ceeb); - biomeColors.put("Void", 0xff000000); - biomeColors.put("Flower", 0xffff1493); - biomeColors.put("Ice", 0xff00ffff); - biomeColors.put("Soul Sand", 0xff8b4513); - biomeColors.put("Crimson", 0xffff0000); - biomeColors.put("Warped", 0xff00ff7f); - biomeColors.put("Nether", 0xffff4500); - biomeColors.put("End", 0xff8a2be2); - biomeColors.put("Mushroom", 0xffff00ff); - biomeColors.put("Savanna", 0xffff4500); - biomeColors.put("Badlands", 0xffcd853f); - biomeColors.put("Swamp", 0xff8b4513); - biomeColors.put("Shore", 0xff808080); - biomeColors.put("Taiga", 0xff556b2f); - biomeColors.put("Mountains", 0xffa9a9a9); - biomeColors.put("Jungle", 0xff00ff00); - biomeColors.put("Birch", 0xff7fff00); - biomeColors.put("Dark Forest", 0xff006400); - biomeColors.put("Forest", 0xff228b22); - biomeColors.put("River", 0xff4169e1); - biomeColors.put("Warm Ocean", 0xff26d9ed); - biomeColors.put("Cold Ocean", 0xff377de6); - biomeColors.put("Deep Ocean", 0xff377de6); - biomeColors.put("Ocean", 0xff34b1eb); - biomeColors.put("Plains", 0xff00ff00); - biomeColors.put("Desert", 0xffffff00); - biomeColors.put("Beach", 0xffffd700); - biomeColors.put("Hills", 0xff2e8b57); - - int color = 0xffffffff; // default color - - for (Map.Entry entry : biomeColors.entrySet()) { - if (biomeString.contains(entry.getKey())) { - color = entry.getValue(); - break; - } - } - - return new CustomText(biomeString, color); - } - - public String formatSnakeCase(String biomeName) { - // Split the string by underscores - String[] words = biomeName.split("_"); - - // Capitalize each word - for (int i = 0; i < words.length; i++) { - words[i] = words[i].substring(0, 1).toUpperCase() + words[i].substring(1).toLowerCase(); - } - - // Join the words with spaces - return String.join(" ", words); - } + + private static final ModSettings SETTINGS = new ModSettings("top-right"); + + @Override + public String getModID() { + return "Biome"; + } + + @Override + public ModSettings getModSettings() { + return SETTINGS; + } + + @Override + public CustomText onStartTick(MinecraftClient client) { + PlayerEntity player = client.player; + + if (player == null) return null; + + // have to specify this because name of class is Biome + Optional> biome = + client.world.getBiome(player.getBlockPos()).getKey(); + + if (!biome.isPresent()) return null; + + String biomeString = formatSnakeCase(biome.get().getValue().getPath()); + + // used to maintain order when iterating + LinkedHashMap biomeColors = new LinkedHashMap<>(); + biomeColors.put("Bamboo", 0xff32cd32); + biomeColors.put("Snowy", 0xffffffff); + biomeColors.put("Frozen", 0xff87ceeb); + biomeColors.put("Void", 0xff000000); + biomeColors.put("Flower", 0xffff1493); + biomeColors.put("Ice", 0xff00ffff); + biomeColors.put("Soul Sand", 0xff8b4513); + biomeColors.put("Crimson", 0xffff0000); + biomeColors.put("Warped", 0xff00ff7f); + biomeColors.put("Nether", 0xffff4500); + biomeColors.put("End", 0xff8a2be2); + biomeColors.put("Mushroom", 0xffff00ff); + biomeColors.put("Savanna", 0xffff4500); + biomeColors.put("Badlands", 0xffcd853f); + biomeColors.put("Swamp", 0xff8b4513); + biomeColors.put("Shore", 0xff808080); + biomeColors.put("Taiga", 0xff556b2f); + biomeColors.put("Mountains", 0xffa9a9a9); + biomeColors.put("Jungle", 0xff00ff00); + biomeColors.put("Birch", 0xff7fff00); + biomeColors.put("Dark Forest", 0xff006400); + biomeColors.put("Forest", 0xff228b22); + biomeColors.put("River", 0xff4169e1); + biomeColors.put("Warm Ocean", 0xff26d9ed); + biomeColors.put("Cold Ocean", 0xff377de6); + biomeColors.put("Deep Ocean", 0xff377de6); + biomeColors.put("Ocean", 0xff34b1eb); + biomeColors.put("Plains", 0xff00ff00); + biomeColors.put("Desert", 0xffffff00); + biomeColors.put("Beach", 0xffffd700); + biomeColors.put("Hills", 0xff2e8b57); + + int color = 0xffffffff; // default color + + for (Map.Entry entry : biomeColors.entrySet()) { + if (biomeString.contains(entry.getKey())) { + color = entry.getValue(); + break; + } + } + + return new CustomText(biomeString, color, getModSettings()); + } + + public String formatSnakeCase(String biomeName) { + // Split the string by underscores + String[] words = biomeName.split("_"); + + // Capitalize each word + for (int i = 0; i < words.length; i++) { + words[i] = + words[i].substring(0, 1).toUpperCase() + + words[i].substring(1).toLowerCase(); + } + + // Join the words with spaces + return String.join(" ", words); + } } diff --git a/src/main/java/dsns/betterhud/mods/Coordinates.java b/src/main/java/dsns/betterhud/mods/Coordinates.java index 118ad0c..dfc410b 100644 --- a/src/main/java/dsns/betterhud/mods/Coordinates.java +++ b/src/main/java/dsns/betterhud/mods/Coordinates.java @@ -1,27 +1,80 @@ package dsns.betterhud.mods; -import net.minecraft.client.MinecraftClient; -import net.minecraft.entity.player.PlayerEntity; import dsns.betterhud.util.BaseMod; import dsns.betterhud.util.CustomText; +import dsns.betterhud.util.ModSettings; +import dsns.betterhud.util.Setting; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import net.minecraft.client.MinecraftClient; +import net.minecraft.entity.player.PlayerEntity; + +class CoordinatesSettings extends ModSettings { + + public CoordinatesSettings(String position) { + super(position); + LinkedHashMap settings = super.getSettings(); + + List> entries = new ArrayList<>( + settings.entrySet() + ); + settings.clear(); + + int insertIndex = 2; + + for (int i = 0; i < Math.min(insertIndex, entries.size()); i++) { + Map.Entry entry = entries.get(i); + settings.put(entry.getKey(), entry.getValue()); + } + + settings.put("Decimal", Setting.createBooleanSetting(false)); + + for (int i = insertIndex; i < entries.size(); i++) { + Map.Entry entry = entries.get(i); + settings.put(entry.getKey(), entry.getValue()); + } + } +} public class Coordinates implements BaseMod { - @Override - public String getModID() { - return "Coordinates"; - } - @Override - public CustomText onStartTick(MinecraftClient client) { - PlayerEntity player = client.player; + private static final CoordinatesSettings SETTINGS = new CoordinatesSettings( + "top-right" + ); + + @Override + public String getModID() { + return "Coordinates"; + } + + @Override + public ModSettings getModSettings() { + return SETTINGS; + } + + @Override + public CustomText onStartTick(MinecraftClient client) { + PlayerEntity player = client.player; + + if (player == null) return null; - if (player == null) - return null; + if (SETTINGS.getSetting("Decimal").getBooleanValue()) { + String roundX = String.format("%.2f", player.getX()); + String roundY = String.format("%.2f", player.getY()); + String roundZ = String.format("%.2f", player.getZ()); - String roundX = String.format("%.2f", player.getX()); - String roundY = String.format("%.2f", player.getY()); - String roundZ = String.format("%.2f", player.getZ()); + return new CustomText( + roundX + ", " + roundY + ", " + roundZ, + getModSettings() + ); + } else { + int x = (int) player.getX(); + int y = (int) player.getY(); + int z = (int) player.getZ(); - return new CustomText(roundX + ", " + roundY + ", " + roundZ); - } + return new CustomText(x + ", " + y + ", " + z, getModSettings()); + } + } } diff --git a/src/main/java/dsns/betterhud/mods/FPS.java b/src/main/java/dsns/betterhud/mods/FPS.java index 5291d1f..4e37acb 100644 --- a/src/main/java/dsns/betterhud/mods/FPS.java +++ b/src/main/java/dsns/betterhud/mods/FPS.java @@ -1,20 +1,29 @@ package dsns.betterhud.mods; -import net.minecraft.client.MinecraftClient; import dsns.betterhud.mixin.MinecraftClientAccessor; import dsns.betterhud.util.BaseMod; import dsns.betterhud.util.CustomText; +import dsns.betterhud.util.ModSettings; +import net.minecraft.client.MinecraftClient; public class FPS implements BaseMod { - @Override - public String getModID() { - return "FPS"; - } - @Override - public CustomText onStartTick(MinecraftClient client) { - int currentFPS = MinecraftClientAccessor.getCurrentFPS(); + private static final ModSettings SETTINGS = new ModSettings("top-left"); + + @Override + public String getModID() { + return "FPS"; + } + + @Override + public ModSettings getModSettings() { + return SETTINGS; + } + + @Override + public CustomText onStartTick(MinecraftClient client) { + int currentFPS = MinecraftClientAccessor.getCurrentFPS(); - return new CustomText(currentFPS + " FPS"); - } + return new CustomText(currentFPS + " FPS", getModSettings()); + } } diff --git a/src/main/java/dsns/betterhud/mods/Facing.java b/src/main/java/dsns/betterhud/mods/Facing.java index 158b5c2..198adab 100644 --- a/src/main/java/dsns/betterhud/mods/Facing.java +++ b/src/main/java/dsns/betterhud/mods/Facing.java @@ -1,36 +1,51 @@ package dsns.betterhud.mods; -import net.minecraft.client.MinecraftClient; -import net.minecraft.entity.player.PlayerEntity; import dsns.betterhud.util.BaseMod; import dsns.betterhud.util.CustomText; +import dsns.betterhud.util.ModSettings; +import net.minecraft.client.MinecraftClient; +import net.minecraft.entity.player.PlayerEntity; public class Facing implements BaseMod { - @Override - public String getModID() { - return "Facing"; - } - - @Override - public CustomText onStartTick(MinecraftClient client) { - PlayerEntity player = client.player; - - if (player == null || player.getHorizontalFacing() == null) - return null; - - return new CustomText(formatSnakeCase(player.getHorizontalFacing().name())); - } - - public String formatSnakeCase(String biomeName) { - // Split the string by underscores - String[] words = biomeName.split("_"); - - // Capitalize each word - for (int i = 0; i < words.length; i++) { - words[i] = words[i].substring(0, 1).toUpperCase() + words[i].substring(1).toLowerCase(); - } - // Join the words with spaces - return String.join(" ", words); - } + private static final ModSettings SETTINGS = new ModSettings( + "top-right" + ); + + @Override + public String getModID() { + return "Facing"; + } + + @Override + public ModSettings getModSettings() { + return SETTINGS; + } + + @Override + public CustomText onStartTick(MinecraftClient client) { + PlayerEntity player = client.player; + + if (player == null || player.getHorizontalFacing() == null) return null; + + return new CustomText( + formatSnakeCase(player.getHorizontalFacing().name()), + getModSettings() + ); + } + + public String formatSnakeCase(String biomeName) { + // Split the string by underscores + String[] words = biomeName.split("_"); + + // Capitalize each word + for (int i = 0; i < words.length; i++) { + words[i] = + words[i].substring(0, 1).toUpperCase() + + words[i].substring(1).toLowerCase(); + } + + // Join the words with spaces + return String.join(" ", words); + } } diff --git a/src/main/java/dsns/betterhud/mods/Momentum.java b/src/main/java/dsns/betterhud/mods/Momentum.java index 337ccd5..9a332ce 100644 --- a/src/main/java/dsns/betterhud/mods/Momentum.java +++ b/src/main/java/dsns/betterhud/mods/Momentum.java @@ -1,28 +1,43 @@ package dsns.betterhud.mods; +import dsns.betterhud.util.BaseMod; +import dsns.betterhud.util.CustomText; +import dsns.betterhud.util.ModSettings; import net.minecraft.client.MinecraftClient; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.math.MathHelper; -import dsns.betterhud.util.BaseMod; -import dsns.betterhud.util.CustomText; public class Momentum implements BaseMod { - @Override - public String getModID() { - return "Momentum"; - } - @Override - public CustomText onStartTick(MinecraftClient client) { - PlayerEntity player = client.player; + private static final ModSettings SETTINGS = new ModSettings("top-left"); + + @Override + public String getModID() { + return "Momentum"; + } + + @Override + public ModSettings getModSettings() { + return SETTINGS; + } + + @Override + public CustomText onStartTick(MinecraftClient client) { + PlayerEntity player = client.player; - if (player == null) - return null; + if (player == null) return null; - double travelledX = player.getX() - player.lastRenderX; - double travelledZ = player.getZ() - player.lastRenderZ; - double currentSpeed = MathHelper.sqrt((float) (travelledX * travelledX + travelledZ * travelledZ)) / 0.05F; + double travelledX = player.getX() - player.lastRenderX; + double travelledZ = player.getZ() - player.lastRenderZ; + double currentSpeed = + MathHelper.sqrt( + (float) (travelledX * travelledX + travelledZ * travelledZ) + ) / + 0.05F; - return new CustomText(String.format("%.2f m/s", currentSpeed)); - } + return new CustomText( + String.format("%.2f m/s", currentSpeed), + getModSettings() + ); + } } diff --git a/src/main/java/dsns/betterhud/mods/Ping.java b/src/main/java/dsns/betterhud/mods/Ping.java index cb04527..003057a 100644 --- a/src/main/java/dsns/betterhud/mods/Ping.java +++ b/src/main/java/dsns/betterhud/mods/Ping.java @@ -1,23 +1,44 @@ package dsns.betterhud.mods; -import net.minecraft.client.MinecraftClient; -import net.minecraft.entity.player.PlayerEntity; import dsns.betterhud.util.BaseMod; import dsns.betterhud.util.CustomText; +import dsns.betterhud.util.ModSettings; +import net.minecraft.client.MinecraftClient; +import net.minecraft.entity.player.PlayerEntity; public class Ping implements BaseMod { - @Override - public String getModID() { - return "Ping"; - } - @Override - public CustomText onStartTick(MinecraftClient client) { - PlayerEntity player = client.player; + private static final ModSettings SETTINGS = new ModSettings("top-left"); + + @Override + public String getModID() { + return "Ping"; + } + + @Override + public ModSettings getModSettings() { + return SETTINGS; + } + + @Override + public CustomText onStartTick(MinecraftClient client) { + PlayerEntity player = client.player; - if (player == null || player.getUuid() == null || client.getNetworkHandler() == null || client.getNetworkHandler().getPlayerListEntry(player.getUuid()) == null) - return null; + if ( + player == null || + player.getUuid() == null || + client.getNetworkHandler() == null || + client.getNetworkHandler().getPlayerListEntry(player.getUuid()) == + null + ) return null; - return new CustomText(client.getNetworkHandler().getPlayerListEntry(player.getUuid()).getLatency() + " ms"); - } + return new CustomText( + client + .getNetworkHandler() + .getPlayerListEntry(player.getUuid()) + .getLatency() + + " ms", + getModSettings() + ); + } } diff --git a/src/main/java/dsns/betterhud/mods/Time.java b/src/main/java/dsns/betterhud/mods/Time.java index ada0bc5..073b523 100644 --- a/src/main/java/dsns/betterhud/mods/Time.java +++ b/src/main/java/dsns/betterhud/mods/Time.java @@ -1,23 +1,32 @@ package dsns.betterhud.mods; -import net.minecraft.client.MinecraftClient; import dsns.betterhud.util.BaseMod; import dsns.betterhud.util.CustomText; +import dsns.betterhud.util.ModSettings; import java.time.LocalTime; import java.time.format.DateTimeFormatter; +import net.minecraft.client.MinecraftClient; public class Time implements BaseMod { - @Override - public String getModID() { - return "Time"; - } - @Override - public CustomText onStartTick(MinecraftClient client) { - LocalTime currentTime = LocalTime.now(); - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("h:mm a"); - String formattedTime = currentTime.format(formatter); + private static final ModSettings SETTINGS = new ModSettings("bottom-right"); + + @Override + public String getModID() { + return "Time"; + } + + @Override + public ModSettings getModSettings() { + return SETTINGS; + } + + @Override + public CustomText onStartTick(MinecraftClient client) { + LocalTime currentTime = LocalTime.now(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("h:mm a"); + String formattedTime = currentTime.format(formatter); - return new CustomText(formattedTime); - } + return new CustomText(formattedTime, getModSettings()); + } } diff --git a/src/main/java/dsns/betterhud/util/BaseMod.java b/src/main/java/dsns/betterhud/util/BaseMod.java index 0bebb85..80f8e17 100644 --- a/src/main/java/dsns/betterhud/util/BaseMod.java +++ b/src/main/java/dsns/betterhud/util/BaseMod.java @@ -3,7 +3,9 @@ import net.minecraft.client.MinecraftClient; public interface BaseMod { - public String getModID(); + public String getModID(); - public CustomText onStartTick(MinecraftClient client); + public ModSettings getModSettings(); + + public CustomText onStartTick(MinecraftClient client); } diff --git a/src/main/java/dsns/betterhud/util/CustomText.java b/src/main/java/dsns/betterhud/util/CustomText.java index 79884b0..c6427f2 100644 --- a/src/main/java/dsns/betterhud/util/CustomText.java +++ b/src/main/java/dsns/betterhud/util/CustomText.java @@ -1,25 +1,33 @@ package dsns.betterhud.util; -import dsns.betterhud.Config; public class CustomText { - public String text; - public int color; // colors are in ARGB format - public int backgroundColor; // colors are in ARGB format - public boolean customPosition = false; - public int customX = 0; - public int customY = 0; - public CustomText(String text, int color, int backgroundColor) { - this.text = text; - this.color = color; - this.backgroundColor = backgroundColor; - } + public String text; + public int color; // colors are in ARGB format + public int backgroundColor; // colors are in ARGB format + public boolean customPosition = false; + public int customX = 0; + public int customY = 0; - public CustomText(String text) { - this(text, Config.textColor, Config.backgroundColor); - } + public CustomText(String text, int color, int backgroundColor) { + this.text = text; + this.color = color; + this.backgroundColor = backgroundColor; + } - public CustomText(String text, int color) { - this(text, color, Config.backgroundColor); - } -} \ No newline at end of file + public CustomText(String text, ModSettings settings) { + this( + text, + settings.getSetting("Text Color").getColorValue(), + settings.getSetting("Background Color").getColorValue() + ); + } + + public CustomText(String text, int color, ModSettings settings) { + this( + text, + color, + settings.getSetting("Background Color").getColorValue() + ); + } +} diff --git a/src/main/java/dsns/betterhud/util/ModSettings.java b/src/main/java/dsns/betterhud/util/ModSettings.java new file mode 100644 index 0000000..22a75a2 --- /dev/null +++ b/src/main/java/dsns/betterhud/util/ModSettings.java @@ -0,0 +1,65 @@ +package dsns.betterhud.util; + +import java.util.LinkedHashMap; + +public class ModSettings { + + private LinkedHashMap settings = new LinkedHashMap< + String, + Setting + >(); + + public ModSettings() { + settings.put("Enabled", Setting.createBooleanSetting(true)); + + settings.put( + "Orientation", + Setting.createStringSetting( + "top-left", + new String[] { + "top-left", + "top-right", + "bottom-left", + "bottom-right", + } + ) + ); + + settings.put("Custom Position", Setting.createBooleanSetting(false)); + settings.put("Custom X", Setting.createIntegerSetting(0, 0, 100)); + settings.put("Custom Y", Setting.createIntegerSetting(0, 0, 100)); + settings.put("Text Color", Setting.createColorSetting(0xffffffff)); + settings.put( + "Background Color", + Setting.createColorSetting(0x88000000) + ); + } + + public ModSettings(String orientation) { + this(); + settings.replace( + "Orientation", + Setting.createStringSetting( + orientation, + new String[] { + "top-left", + "top-right", + "bottom-left", + "bottom-right", + } + ) + ); + } + + public LinkedHashMap getSettings() { + return settings; + } + + public Setting getSetting(String key) { + return settings.get(key); + } + + public void setSettings(LinkedHashMap settings) { + this.settings = settings; + } +} diff --git a/src/main/java/dsns/betterhud/util/Setting.java b/src/main/java/dsns/betterhud/util/Setting.java new file mode 100644 index 0000000..a644d9e --- /dev/null +++ b/src/main/java/dsns/betterhud/util/Setting.java @@ -0,0 +1,98 @@ +package dsns.betterhud.util; + +public class Setting { + + private String value; + private String type; + private final String defaultValue; + private String[] possibleValues; + + public Setting(String value, String type, String[] possibleValues) { + this.value = value; + this.type = type; + this.defaultValue = value; + this.possibleValues = possibleValues; + } + + public static Setting createStringSetting( + String value, + String[] possibleValues + ) { + return new Setting(value, "string", possibleValues); + } + + public static Setting createBooleanSetting(boolean value) { + return new Setting( + String.valueOf(value), + "boolean", + new String[] { "true", "false" } + ); + } + + public static Setting createIntegerSetting(int value, int min, int max) { + return new Setting( + String.valueOf(value), + "integer", + new String[] { String.valueOf(min), String.valueOf(max) } + ); + } + + public static Setting createColorSetting(int value) { + return new Setting( + String.valueOf(value), + "color", + new String[] { + String.valueOf(0x00000000), + String.valueOf(0xffffffff), + } + ); + } + + public static Setting createDoubleSetting( + double value, + double min, + double max + ) { + return new Setting( + String.valueOf(value), + "double", + new String[] { String.valueOf(min), String.valueOf(max) } + ); + } + + public String getType() { + return type; + } + + public String getStringValue() { + return value; + } + + public int getIntValue() { + return Integer.parseInt(value); + } + + public double getDoubleValue() { + return Double.parseDouble(value); + } + + public int getColorValue() { + return Integer.parseInt(value); + } + + public boolean getBooleanValue() { + return Boolean.parseBoolean(value); + } + + public String[] getPossibleValues() { + return possibleValues; + } + + public String getDefaultValue() { + return defaultValue; + } + + public void setValue(String value) { + this.value = value; + } +}