From bcfade25defa19ddde47d27ebd1f97447b32c4f6 Mon Sep 17 00:00:00 2001 From: Wanja <105125277+Manchick0@users.noreply.github.com> Date: Sat, 21 Dec 2024 06:38:35 +0100 Subject: Add customizable night vision strength feature (#1078) * Add customizable night vision strength feature Introduced a `nightVision` subcommand to adjust night vision strength with options for `full` (= 100), `off` (= 0), and any other value between 0 and 100. Integrated the setting into the configuration menu and game rendering, with default strength set to 100. Updated localization to include feedback for strength changes. * Update GameRendererMixin.java Clamped the applied value to ensure it's not overflowing. Although you can't put an invalid value in-game, it's still possible to do so directly via the config file. * Update en_us.json Added the missing translation for the night vision strength option. * Add description tooltip for night vision strength option A tooltip was added to the "Night Vision Strength" option to improve user understanding of its functionality. Unused import(s) were also removed, following the requested changes. * Use clamp * Apply suggestions from code review --------- Co-authored-by: Manchick0 Co-authored-by: Kevin <92656833+kevinthegreat1@users.noreply.github.com> --- .../config/categories/UIAndVisualsCategory.java | 10 +++++- .../config/configs/UIAndVisualsConfig.java | 3 ++ .../hysky/skyblocker/mixins/GameRendererMixin.java | 21 ++++++++++++ .../skyblocker/skyblock/NightVisionCommand.java | 40 ++++++++++++++++++++++ 4 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 src/main/java/de/hysky/skyblocker/mixins/GameRendererMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/NightVisionCommand.java (limited to 'src/main/java') diff --git a/src/main/java/de/hysky/skyblocker/config/categories/UIAndVisualsCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/UIAndVisualsCategory.java index 5f8bdd3e..658c00bb 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/UIAndVisualsCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/UIAndVisualsCategory.java @@ -27,9 +27,17 @@ import java.awt.*; public class UIAndVisualsCategory { public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig config) { return ConfigCategory.createBuilder() - .name(Text.translatable("skyblocker.config.uiAndVisuals")) + .name(Text.translatable("skyblocker.config.uiAndVisuals")) //Ungrouped Options + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.uiAndVisuals.nightVisionStrength")) + .description(OptionDescription.of(Text.translatable("skyblocker.config.uiAndVisuals.nightVisionStrength.@Tooltip"))) + .binding(defaults.uiAndVisuals.nightVisionStrength, + () -> config.uiAndVisuals.nightVisionStrength, + newValue -> config.uiAndVisuals.nightVisionStrength = newValue) + .controller(opt -> IntegerSliderControllerBuilder.create(opt).range(0, 100).step(1)) + .build()) .option(Option.createBuilder() .name(Text.translatable("skyblocker.config.uiAndVisuals.compactorDeletorPreview")) .binding(defaults.uiAndVisuals.compactorDeletorPreview, diff --git a/src/main/java/de/hysky/skyblocker/config/configs/UIAndVisualsConfig.java b/src/main/java/de/hysky/skyblocker/config/configs/UIAndVisualsConfig.java index 1d4301e0..55ec5094 100644 --- a/src/main/java/de/hysky/skyblocker/config/configs/UIAndVisualsConfig.java +++ b/src/main/java/de/hysky/skyblocker/config/configs/UIAndVisualsConfig.java @@ -11,6 +11,9 @@ import java.util.ArrayList; import java.util.List; public class UIAndVisualsConfig { + @SerialEntry + public int nightVisionStrength = 100; + @SerialEntry public boolean compactorDeletorPreview = true; diff --git a/src/main/java/de/hysky/skyblocker/mixins/GameRendererMixin.java b/src/main/java/de/hysky/skyblocker/mixins/GameRendererMixin.java new file mode 100644 index 00000000..36c76c44 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/GameRendererMixin.java @@ -0,0 +1,21 @@ +package de.hysky.skyblocker.mixins; + +import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.utils.Utils; +import net.minecraft.client.render.GameRenderer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(GameRenderer.class) +public class GameRendererMixin { + + @ModifyReturnValue(method = "getNightVisionStrength", at = @At("RETURN")) + private static float onGetNightVisionStrength(float original) { + if (original == 1.0F && Utils.isOnSkyblock()) { + var strength = SkyblockerConfigManager.get().uiAndVisuals.nightVisionStrength; + return Math.clamp(strength / 100.0F, 0, 100); + } + return original; + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/NightVisionCommand.java b/src/main/java/de/hysky/skyblocker/skyblock/NightVisionCommand.java new file mode 100644 index 00000000..7fa9d780 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/NightVisionCommand.java @@ -0,0 +1,40 @@ +package de.hysky.skyblocker.skyblock; + +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.IntegerArgumentType; +import com.mojang.brigadier.context.CommandContext; +import de.hysky.skyblocker.SkyblockerMod; +import de.hysky.skyblocker.annotations.Init; +import de.hysky.skyblocker.config.SkyblockerConfig; +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; +import net.minecraft.command.CommandRegistryAccess; +import net.minecraft.text.Text; + +import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.argument; +import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal; + +public class NightVisionCommand { + + @Init + public static void init() { + ClientCommandRegistrationCallback.EVENT.register(NightVisionCommand::register); + } + + private static void register(CommandDispatcher dispatcher, CommandRegistryAccess access) { + dispatcher.register(literal(SkyblockerMod.NAMESPACE) + .then(literal("nightVision") + .then(argument("strength", IntegerArgumentType.integer(0, 100)) + .executes(context -> NightVisionCommand.writeStrength(context, IntegerArgumentType.getInteger(context, "strength")))) + .then(literal("off").executes(context -> NightVisionCommand.writeStrength(context, 0))) + .then(literal("full").executes(context -> NightVisionCommand.writeStrength(context, 100))))); + } + + private static int writeStrength(CommandContext context, int strength) { + SkyblockerConfigManager.get().uiAndVisuals.nightVisionStrength = strength; + context.getSource().sendFeedback(Text.translatable("skyblocker.nightVision.success", strength)); + SkyblockerConfigManager.save(); + return 1; + } +} -- cgit