From 800f219fa6356d3e0c2e68b4a18e6da8593069a1 Mon Sep 17 00:00:00 2001 From: isXander Date: Sun, 16 Apr 2023 17:44:39 +0100 Subject: [PATCH] ui sounds --- build.gradle.kts | 7 +++++- .../dev/isxander/controlify/Controlify.java | 3 +++ .../controlify/ControlifyEntrypoint.java | 10 +++++++++ .../controlify/config/GlobalSettings.java | 1 + .../controlify/config/gui/YACLHelper.java | 6 ++++++ .../mixins/core/MinecraftMixin.java | 5 ----- .../controlify/screenop/ScreenProcessor.java | 4 ++++ .../controlify/sound/ControlifySounds.java | 20 ++++++++++++++++++ .../assets/controlify/lang/en_us.json | 2 ++ .../resources/assets/controlify/sounds.json | 7 ++++++ .../assets/controlify/sounds/ui_focus.ogg | Bin 0 -> 6089 bytes src/main/resources/fabric.mod.json | 3 +++ 12 files changed, 62 insertions(+), 6 deletions(-) create mode 100644 src/main/java/dev/isxander/controlify/ControlifyEntrypoint.java create mode 100644 src/main/java/dev/isxander/controlify/sound/ControlifySounds.java create mode 100644 src/main/resources/assets/controlify/sounds.json create mode 100644 src/main/resources/assets/controlify/sounds/ui_focus.ogg 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 0000000000000000000000000000000000000000..61bca83500cec985f04249abf9aac0931c2036f5 GIT binary patch literal 6089 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 literal 0 HcmV?d00001 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": [