diff --git a/src/main/java/markil3/immersive_hud/ConfigManager.java b/src/main/java/markil3/immersive_hud/ConfigManager.java index dbf6ce8..08dd7df 100644 --- a/src/main/java/markil3/immersive_hud/ConfigManager.java +++ b/src/main/java/markil3/immersive_hud/ConfigManager.java @@ -3,9 +3,6 @@ package markil3.immersive_hud; import net.minecraft.util.math.MathHelper; import me.shedaniel.autoconfig.AutoConfig; -import me.shedaniel.autoconfig.ConfigData; -import me.shedaniel.autoconfig.annotation.Config; -import me.shedaniel.autoconfig.annotation.ConfigEntry; import static markil3.immersive_hud.Main.TICKS_PER_SECOND; @@ -15,13 +12,11 @@ import static markil3.immersive_hud.Main.TICKS_PER_SECOND; *
* The methods that change this mod's configuration do not automatically write * those changes to the configuration file on disk. Instead, they only update - * the configuration in memory. To write any changes, use the {@link #save()} - * method. + * the configuration in memory. * * @author Markil 3 */ -@Config(name = "immersive_hud") -public class ConfigManager implements ConfigData +public class ConfigManager { public static class TimeValues { @@ -90,7 +85,6 @@ public class ConfigManager implements ConfigData private int handTime = 30 * TICKS_PER_SECOND; private boolean showArmor = true; private double minHealth = 0.5; - @ConfigEntry.BoundedDiscrete(max = 20) private int minHunger = 17; /** @@ -100,7 +94,22 @@ public class ConfigManager implements ConfigData */ public static ConfigManager getInstance() { - return AutoConfig.getConfigHolder(ConfigManager.class).getConfig(); + try + { + if (Class.forName("me.shedaniel.autoconfig.AutoConfig") != null) + { + return AutoConfig.getConfigHolder(ConfigManagerCloth.class) + .getConfig(); + } + else + { + throw new ClassNotFoundException(); + } + } + catch (ClassNotFoundException e) + { + return new ConfigManager(); + } } // Validations @@ -268,12 +277,6 @@ public class ConfigManager implements ConfigData { this.minHunger = MathHelper.clamp(boundary, 0, 20); } - - @Override - public void validatePostLoad() throws ValidationException - { - this.setMinHealth(this.minHealth); - } /** * Saves changes to this mod's configuration. */ diff --git a/src/main/java/markil3/immersive_hud/ConfigManagerCloth.java b/src/main/java/markil3/immersive_hud/ConfigManagerCloth.java new file mode 100644 index 0000000..7451fa9 --- /dev/null +++ b/src/main/java/markil3/immersive_hud/ConfigManagerCloth.java @@ -0,0 +1,14 @@ +package markil3.immersive_hud; + +import me.shedaniel.autoconfig.ConfigData; +import me.shedaniel.autoconfig.annotation.Config; + +@Config(name = "immersive_hud") +public class ConfigManagerCloth extends ConfigManager implements ConfigData +{ + @Override + public void validatePostLoad() throws ValidationException + { + this.setMinHealth(this.getMinHealth()); + } +} diff --git a/src/main/java/markil3/immersive_hud/Main.java b/src/main/java/markil3/immersive_hud/Main.java index d62b2df..c556d9b 100644 --- a/src/main/java/markil3/immersive_hud/Main.java +++ b/src/main/java/markil3/immersive_hud/Main.java @@ -17,18 +17,10 @@ */ package markil3.immersive_hud; -import com.terraformersmc.modmenu.api.ConfigScreenFactory; -import com.terraformersmc.modmenu.api.ModMenuApi; - import net.fabricmc.api.ModInitializer; -import net.minecraft.text.TranslatableText; import me.shedaniel.autoconfig.AutoConfig; import me.shedaniel.autoconfig.serializer.Toml4jConfigSerializer; -import me.shedaniel.clothconfig2.api.ConfigBuilder; -import me.shedaniel.clothconfig2.api.ConfigCategory; -import me.shedaniel.clothconfig2.api.ConfigEntryBuilder; -import me.shedaniel.clothconfig2.gui.entries.DoubleListEntry; /** * The main entry point for the Immersive HUD mod. @@ -36,158 +28,25 @@ import me.shedaniel.clothconfig2.gui.entries.DoubleListEntry; * @author Markil 3 * @version 0.1-1.16.4-fabric */ -public class Main implements ModInitializer, ModMenuApi +public class Main implements ModInitializer { public static final int TICKS_PER_SECOND = 20; @Override public void onInitialize() { - AutoConfig.register(ConfigManager.class, Toml4jConfigSerializer::new); - } - - private void startTimeField(String name, ConfigEntryBuilder entryBuilder, - ConfigCategory cat, - ConfigManager.TimeValues value) - { - final float SHOW_TIME = 6; - final float FADE_IN = 0.25F; - final float FADE_OUT = 0.5F; - - DoubleListEntry maxTime = - entryBuilder.startDoubleField(new TranslatableText( - "option.immersive_hud." + name + - "MaxTime"), - (float) value.getMaxTime() / TICKS_PER_SECOND) - .setDefaultValue(SHOW_TIME) - .setMin(0) - .setMax(10 * 60 * TICKS_PER_SECOND) // 10 Minutes - .setTooltip(new TranslatableText( - "tooltip.immersive_hud." + name + - "MaxTime")) - .setSaveConsumer(val -> value.setMaxTime((int) (val * TICKS_PER_SECOND))) - .build(); - - DoubleListEntry fadeIn = - entryBuilder.startDoubleField(new TranslatableText( - "option.immersive_hud." + name + - "FadeIn"), - (float) value.getFadeInTime() / TICKS_PER_SECOND) - .setDefaultValue(FADE_IN) - .setMin(0) - .setMax(10 * 60 * TICKS_PER_SECOND) - .setTooltip(new TranslatableText( - "tooltip.immersive_hud." + name + - "FadeIn")) - .setSaveConsumer(val -> value.setFadeInTime((int) (val * TICKS_PER_SECOND))) - .build(); - - DoubleListEntry fadeOut = - entryBuilder.startDoubleField(new TranslatableText( - "option.immersive_hud." + name + - "FadeOut"), - (float) value.getFadeOutTime() / TICKS_PER_SECOND) - .setDefaultValue(FADE_OUT) - .setMin(0) - .setMax(10 * 60 * TICKS_PER_SECOND) - .setTooltip(new TranslatableText( - "tooltip.immersive_hud." + name + - "FadeOut")) - .setSaveConsumer(val -> value.setFadeOutTime((int) (val * TICKS_PER_SECOND))) - .build(); - - cat.addEntry(maxTime); - cat.addEntry(fadeIn); - cat.addEntry(fadeOut); - } - - @Override - public ConfigScreenFactory> getModConfigScreenFactory() - { - return screen -> { - ConfigCategory general; - ConfigEntryBuilder entryBuilder; - ConfigManager instance = ConfigManager.getInstance(); - final ConfigBuilder builder = ConfigBuilder.create() - .setParentScreen(screen) - .setTitle(new TranslatableText( - "immersive_hud.configGui.title")) - .setSavingRunnable(() -> { - AutoConfig.getConfigHolder(ConfigManager.class).save(); - }); - general = - builder.getOrCreateCategory(new TranslatableText( - "category.immersive_hud.general")); - entryBuilder = builder.entryBuilder(); - - startTimeField("hotbar", entryBuilder, - general, - instance.getHotbarTime()); - startTimeField("experience", entryBuilder, - general, - instance.getExperienceTime()); - startTimeField("jump", entryBuilder, - general, - instance.getJumpTime()); - startTimeField("jump", entryBuilder, - general, - instance.getHealthTime()); - startTimeField("hunger", entryBuilder, - general, - instance.getHungerTime()); - startTimeField("effect", entryBuilder, - general, - instance.getPotionTime()); - - general.addEntry(entryBuilder.startDoubleField(new TranslatableText( - "option.immersive_hud" + - ".crosshairTime"), - (float) instance.getCrosshairTime() / TICKS_PER_SECOND) - .setDefaultValue(6) - .setTooltip(new TranslatableText( - "tooltip.immersive_hud" + - ".crosshairTime")) - .setSaveConsumer(val -> instance.setCrosshairTime((int) (val * TICKS_PER_SECOND))) - .build()); - - general.addEntry(entryBuilder.startDoubleField(new TranslatableText( - "option.immersive_hud.handTime"), - (float) instance.getHandTime() / TICKS_PER_SECOND) - .setDefaultValue(30) - .setTooltip(new TranslatableText( - "tooltip.immersive_hud.handTime")) - .setSaveConsumer(val -> instance.setHandTime((int) (val * TICKS_PER_SECOND))) - .build()); - - general.addEntry(entryBuilder.startDoubleField(new TranslatableText( - "option.immersive_hud.minHealth"), - instance.getMinHealth()) - .setDefaultValue(0.5) - .setTooltip(new TranslatableText( - "tooltip.immersive_hud.minHealth")) - .setSaveConsumer(val -> instance.setMinHealth(val)) - .build()); - - general.addEntry(entryBuilder.startIntField(new TranslatableText( - "option.immersive_hud.minHunger"), - instance.getMinHunger()) - .setDefaultValue(17) - .setTooltip(new TranslatableText( - "tooltip.immersive_hud.minHunger")) - .setSaveConsumer(val -> instance.setMinHunger(val)) - .build()); - - general.addEntry(entryBuilder.startBooleanToggle(new TranslatableText( - "option.immersive_hud.showArmor"), - instance.shouldShowArmor()) - .setDefaultValue(true) - .setTooltip(new TranslatableText( - "tooltip.immersive_hud.showArmor")) - .setSaveConsumer(val -> instance.shouldShowArmor(val)) - .build()); - - return builder.build(); - }; + try + { + if (Class.forName("me.shedaniel.autoconfig.AutoConfig") != null) + { + AutoConfig.register(ConfigManagerCloth.class, + Toml4jConfigSerializer::new); + } + } + catch (ClassNotFoundException e) + { + // Do nothing + } } /** @@ -201,7 +60,10 @@ public class Main implements ModInitializer, ModMenuApi * * @since 0.1-1.16.4-fabric */ - static float getAlpha(double renderTime, double maxTime, double fadeInTime, double fadeOutTime) + static float getAlpha(double renderTime, + double maxTime, + double fadeInTime, + double fadeOutTime) { if (renderTime <= fadeOutTime) { diff --git a/src/main/java/markil3/immersive_hud/ModMenu.java b/src/main/java/markil3/immersive_hud/ModMenu.java new file mode 100644 index 0000000..d165e27 --- /dev/null +++ b/src/main/java/markil3/immersive_hud/ModMenu.java @@ -0,0 +1,173 @@ +package markil3.immersive_hud; + +import com.terraformersmc.modmenu.api.ConfigScreenFactory; +import com.terraformersmc.modmenu.api.ModMenuApi; + +import net.minecraft.text.TranslatableText; + +import me.shedaniel.autoconfig.AutoConfig; +import me.shedaniel.clothconfig2.api.ConfigBuilder; +import me.shedaniel.clothconfig2.api.ConfigCategory; +import me.shedaniel.clothconfig2.api.ConfigEntryBuilder; +import me.shedaniel.clothconfig2.gui.entries.DoubleListEntry; + +import static markil3.immersive_hud.Main.TICKS_PER_SECOND; + +public class ModMenu implements ModMenuApi +{ + + private void startTimeField(String name, ConfigEntryBuilder entryBuilder, + ConfigCategory cat, + ConfigManager.TimeValues value) + { + final float SHOW_TIME = 6; + final float FADE_IN = 0.25F; + final float FADE_OUT = 0.5F; + + DoubleListEntry maxTime = + entryBuilder.startDoubleField(new TranslatableText( + "option.immersive_hud." + name + + "MaxTime"), + (float) value.getMaxTime() / TICKS_PER_SECOND) + .setDefaultValue(SHOW_TIME) + .setMin(0) + .setMax(10 * 60 * TICKS_PER_SECOND) // 10 Minutes + .setTooltip(new TranslatableText( + "tooltip.immersive_hud." + name + + "MaxTime")) + .setSaveConsumer(val -> value.setMaxTime((int) (val * TICKS_PER_SECOND))) + .build(); + + DoubleListEntry fadeIn = + entryBuilder.startDoubleField(new TranslatableText( + "option.immersive_hud." + name + + "FadeIn"), + (float) value.getFadeInTime() / TICKS_PER_SECOND) + .setDefaultValue(FADE_IN) + .setMin(0) + .setMax(10 * 60 * TICKS_PER_SECOND) + .setTooltip(new TranslatableText( + "tooltip.immersive_hud." + name + + "FadeIn")) + .setSaveConsumer(val -> value.setFadeInTime((int) (val * TICKS_PER_SECOND))) + .build(); + + DoubleListEntry fadeOut = + entryBuilder.startDoubleField(new TranslatableText( + "option.immersive_hud." + name + + "FadeOut"), + (float) value.getFadeOutTime() / TICKS_PER_SECOND) + .setDefaultValue(FADE_OUT) + .setMin(0) + .setMax(10 * 60 * TICKS_PER_SECOND) + .setTooltip(new TranslatableText( + "tooltip.immersive_hud." + name + + "FadeOut")) + .setSaveConsumer(val -> value.setFadeOutTime((int) (val * TICKS_PER_SECOND))) + .build(); + + cat.addEntry(maxTime); + cat.addEntry(fadeIn); + cat.addEntry(fadeOut); + } + + @Override + public ConfigScreenFactory> getModConfigScreenFactory() + { + return screen -> { + ConfigCategory general; + ConfigEntryBuilder entryBuilder; + ConfigManager instance = ConfigManager.getInstance(); + final ConfigBuilder builder = ConfigBuilder.create() + .setParentScreen(screen) + .setTitle(new TranslatableText( + "immersive_hud.configGui.title")) + .setSavingRunnable(() -> { + try + { + if (Class.forName("me.shedaniel.autoconfig.AutoConfig") != null) + { + AutoConfig.getConfigHolder(ConfigManagerCloth.class) + .save(); + } + } + catch (ClassNotFoundException e) + { + // Do nothing + } + }); + general = + builder.getOrCreateCategory(new TranslatableText( + "category.immersive_hud.general")); + entryBuilder = builder.entryBuilder(); + + startTimeField("hotbar", entryBuilder, + general, + instance.getHotbarTime()); + startTimeField("experience", entryBuilder, + general, + instance.getExperienceTime()); + startTimeField("jump", entryBuilder, + general, + instance.getJumpTime()); + startTimeField("jump", entryBuilder, + general, + instance.getHealthTime()); + startTimeField("hunger", entryBuilder, + general, + instance.getHungerTime()); + startTimeField("effect", entryBuilder, + general, + instance.getPotionTime()); + + general.addEntry(entryBuilder.startDoubleField(new TranslatableText( + "option.immersive_hud" + + ".crosshairTime"), + (float) instance.getCrosshairTime() / TICKS_PER_SECOND) + .setDefaultValue(6) + .setTooltip(new TranslatableText( + "tooltip.immersive_hud" + + ".crosshairTime")) + .setSaveConsumer(val -> instance.setCrosshairTime((int) (val * TICKS_PER_SECOND))) + .build()); + + general.addEntry(entryBuilder.startDoubleField(new TranslatableText( + "option.immersive_hud.handTime"), + (float) instance.getHandTime() / TICKS_PER_SECOND) + .setDefaultValue(30) + .setTooltip(new TranslatableText( + "tooltip.immersive_hud.handTime")) + .setSaveConsumer(val -> instance.setHandTime((int) (val * TICKS_PER_SECOND))) + .build()); + + general.addEntry(entryBuilder.startDoubleField(new TranslatableText( + "option.immersive_hud.minHealth"), + instance.getMinHealth()) + .setDefaultValue(0.5) + .setTooltip(new TranslatableText( + "tooltip.immersive_hud.minHealth")) + .setSaveConsumer(val -> instance.setMinHealth(val)) + .build()); + + general.addEntry(entryBuilder.startIntField(new TranslatableText( + "option.immersive_hud.minHunger"), + instance.getMinHunger()) + .setDefaultValue(17) + .setTooltip(new TranslatableText( + "tooltip.immersive_hud.minHunger")) + .setSaveConsumer(val -> instance.setMinHunger(val)) + .build()); + + general.addEntry(entryBuilder.startBooleanToggle(new TranslatableText( + "option.immersive_hud.showArmor"), + instance.shouldShowArmor()) + .setDefaultValue(true) + .setTooltip(new TranslatableText( + "tooltip.immersive_hud.showArmor")) + .setSaveConsumer(val -> instance.shouldShowArmor(val)) + .build()); + + return builder.build(); + }; + } +} diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index a8a8893..1b4d264 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -22,7 +22,7 @@ "markil3.immersive_hud.Main" ], "modmenu": [ - "markil3.immersive_hud.Main" + "markil3.immersive_hud.ModMenu" ] }, "mixins": [ @@ -35,5 +35,9 @@ "depends": { "fabricloader": ">=0.7.4", "minecraft": "1.16.x" + }, + "suggests": { + "modmenu": "*", + "cloth-config2": "*" } }