diff --git a/build.gradle.kts b/build.gradle.kts index f0be9a2..2415412 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -73,12 +73,17 @@ dependencies { "fabric-resource-loader-v0", "fabric-lifecycle-events-v1", "fabric-key-binding-api-v1", + "fabric-registry-sync-v0", + ).forEach { + modImplementation(fabricApi.module(it, libs.versions.fabric.api.get())) + } + listOf( // sodium requirements "fabric-rendering-data-attachment-v1", "fabric-rendering-fluids-v1", ).forEach { - modImplementation(fabricApi.module(it, libs.versions.fabric.api.get())) + modRuntimeOnly(fabricApi.module(it, libs.versions.fabric.api.get())) } modImplementation(libs.yet.another.config.lib) diff --git a/src/main/java/dev/isxander/controlify/Controlify.java b/src/main/java/dev/isxander/controlify/Controlify.java index d092817..42db320 100644 --- a/src/main/java/dev/isxander/controlify/Controlify.java +++ b/src/main/java/dev/isxander/controlify/Controlify.java @@ -19,6 +19,7 @@ import dev.isxander.controlify.api.event.ControlifyEvents; import dev.isxander.controlify.ingame.guide.InGameButtonGuide; import dev.isxander.controlify.ingame.InGameInputHandler; import dev.isxander.controlify.mixins.feature.virtualmouse.MouseHandlerAccessor; +import dev.isxander.controlify.sound.ControlifySounds; import dev.isxander.controlify.utils.DebugLog; import dev.isxander.controlify.utils.ToastUtils; import dev.isxander.controlify.virtualmouse.VirtualMouseHandler; @@ -156,6 +157,8 @@ public class Controlify implements ControlifyApi { ResourcePackActivationType.DEFAULT_ENABLED ); + ControlifySounds.init(); + this.inGameInputHandler = null; this.virtualMouseHandler = new VirtualMouseHandler(); diff --git a/src/main/java/dev/isxander/controlify/ControlifyEntrypoint.java b/src/main/java/dev/isxander/controlify/ControlifyEntrypoint.java new file mode 100644 index 0000000..30c080f --- /dev/null +++ b/src/main/java/dev/isxander/controlify/ControlifyEntrypoint.java @@ -0,0 +1,10 @@ +package dev.isxander.controlify; + +import net.fabricmc.api.ClientModInitializer; + +public class ControlifyEntrypoint implements ClientModInitializer { + @Override + public void onInitializeClient() { + Controlify.instance().preInitialiseControlify(); + } +} diff --git a/src/main/java/dev/isxander/controlify/config/GlobalSettings.java b/src/main/java/dev/isxander/controlify/config/GlobalSettings.java index 21c7d94..a45d488 100644 --- a/src/main/java/dev/isxander/controlify/config/GlobalSettings.java +++ b/src/main/java/dev/isxander/controlify/config/GlobalSettings.java @@ -18,4 +18,5 @@ public class GlobalSettings { public boolean loadVibrationNatives = false; public boolean vibrationOnboarded = false; public ReachAroundMode reachAround = ReachAroundMode.OFF; + public boolean uiSounds = false; } diff --git a/src/main/java/dev/isxander/controlify/config/gui/YACLHelper.java b/src/main/java/dev/isxander/controlify/config/gui/YACLHelper.java index cc90283..26199d9 100644 --- a/src/main/java/dev/isxander/controlify/config/gui/YACLHelper.java +++ b/src/main/java/dev/isxander/controlify/config/gui/YACLHelper.java @@ -81,6 +81,12 @@ public class YACLHelper { .binding(GlobalSettings.DEFAULT.reachAround, () -> globalSettings.reachAround, v -> globalSettings.reachAround = v) .controller(EnumController::new) .build()) + .option(Option.createBuilder(boolean.class) + .name(Component.translatable("controlify.gui.ui_sounds")) + .tooltip(Component.translatable("controlify.gui.ui_sounds.tooltip")) + .binding(GlobalSettings.DEFAULT.uiSounds, () -> globalSettings.uiSounds, v -> globalSettings.uiSounds = v) + .controller(TickBoxController::new) + .build()) .option(Option.createBuilder(boolean.class) .name(Component.translatable("controlify.gui.out_of_focus_input")) .tooltip(Component.translatable("controlify.gui.out_of_focus_input.tooltip")) diff --git a/src/main/java/dev/isxander/controlify/mixins/core/MinecraftMixin.java b/src/main/java/dev/isxander/controlify/mixins/core/MinecraftMixin.java index ec76b57..18f2685 100644 --- a/src/main/java/dev/isxander/controlify/mixins/core/MinecraftMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/core/MinecraftMixin.java @@ -43,11 +43,6 @@ public abstract class MinecraftMixin { } } - @Inject(method = "", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/KeyboardHandler;setup(J)V", shift = At.Shift.AFTER)) - private void onInputInitialized(CallbackInfo ci) { - Controlify.instance().preInitialiseControlify(); - } - @Inject(method = "runTick", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MouseHandler;turnPlayer()V")) private void doPlayerLook(boolean tick, CallbackInfo ci) { Controlify.instance().inGameInputHandler().ifPresent(ih -> ih.processPlayerLook(getDeltaFrameTime())); diff --git a/src/main/java/dev/isxander/controlify/screenop/ScreenProcessor.java b/src/main/java/dev/isxander/controlify/screenop/ScreenProcessor.java index 4d85edc..6a5acbc 100644 --- a/src/main/java/dev/isxander/controlify/screenop/ScreenProcessor.java +++ b/src/main/java/dev/isxander/controlify/screenop/ScreenProcessor.java @@ -6,6 +6,7 @@ import dev.isxander.controlify.controller.Controller; import dev.isxander.controlify.api.event.ControlifyEvents; import dev.isxander.controlify.mixins.feature.screenop.vanilla.ScreenAccessor; import dev.isxander.controlify.mixins.feature.screenop.vanilla.TabNavigationBarAccessor; +import dev.isxander.controlify.sound.ControlifySounds; import dev.isxander.controlify.utils.NavigationHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.ComponentPath; @@ -101,6 +102,9 @@ public class ScreenProcessor { navigationHelper.onNavigate(); + if (Controlify.instance().config().globalSettings().uiSounds) + minecraft.getSoundManager().play(SimpleSoundInstance.forUI(ControlifySounds.SCREEN_FOCUS_CHANGE, 1.0F)); + var newFocusTree = getFocusTree(); while (!newFocusTree.isEmpty() && !focuses.contains(newFocusTree.peek())) { ComponentProcessorProvider.provide(newFocusTree.poll()).onFocusGained(this, controller); diff --git a/src/main/java/dev/isxander/controlify/sound/ControlifySounds.java b/src/main/java/dev/isxander/controlify/sound/ControlifySounds.java new file mode 100644 index 0000000..e491c24 --- /dev/null +++ b/src/main/java/dev/isxander/controlify/sound/ControlifySounds.java @@ -0,0 +1,20 @@ +package dev.isxander.controlify.sound; + +import dev.isxander.controlify.Controlify; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; + +public final class ControlifySounds { + public static final SoundEvent SCREEN_FOCUS_CHANGE = register("controlify.ui.focus"); + + private static SoundEvent register(String id) { + ResourceLocation location = Controlify.id(id); + return Registry.register(BuiltInRegistries.SOUND_EVENT, location, SoundEvent.createVariableRangeEvent(location)); + } + + public static void init() { + // calling init now calls which is where the sounds are registered + } +} diff --git a/src/main/resources/assets/controlify/lang/en_us.json b/src/main/resources/assets/controlify/lang/en_us.json index 7dc52b5..fe2e738 100644 --- a/src/main/resources/assets/controlify/lang/en_us.json +++ b/src/main/resources/assets/controlify/lang/en_us.json @@ -13,6 +13,8 @@ "controlify.reach_around.singleplayer_only": "Singleplayer Only", "controlify.reach_around.singleplayer_and_lan": "Singleplayer and LAN", "controlify.reach_around.everywhere": "Everywhere", + "controlify.gui.ui_sounds": "UI Sounds", + "controlify.gui.ui_sounds.tooltip": "If enabled, Controlify will play UI sounds when you interact with the UI, like in legacy console editions of Minecraft.", "controlify.gui.out_of_focus_input": "Out of Focus Input", "controlify.gui.out_of_focus_input.tooltip": "If enabled, Controlify will still receive input even if the game window is not focused.", "controlify.gui.keyboard_movement": "Keyboard-like Movement", diff --git a/src/main/resources/assets/controlify/sounds.json b/src/main/resources/assets/controlify/sounds.json new file mode 100644 index 0000000..ad82c36 --- /dev/null +++ b/src/main/resources/assets/controlify/sounds.json @@ -0,0 +1,7 @@ +{ + "controlify.ui.focus": { + "sounds": [ + "controlify:ui_focus" + ] + } +} diff --git a/src/main/resources/assets/controlify/sounds/ui_focus.ogg b/src/main/resources/assets/controlify/sounds/ui_focus.ogg new file mode 100644 index 0000000..61bca83 Binary files /dev/null and b/src/main/resources/assets/controlify/sounds/ui_focus.ogg differ diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index e6ac52a..a62a891 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -20,6 +20,9 @@ ], "modmenu": [ "dev.isxander.controlify.config.gui.ModMenuIntegration" + ], + "client": [ + "dev.isxander.controlify.ControlifyEntrypoint" ] }, "mixins": [