From 4afb5a2456cf8b4d5b322f90efc5f15f4ed0689a Mon Sep 17 00:00:00 2001 From: Magnus Date: Fri, 12 Dec 2025 15:00:07 +0000 Subject: [PATCH] chore: migrate to mojang mappings, update to 1.21.11, and do some small refactors, including getting rid of unused/unneccesary accessors --- build.gradle | 2 +- gradle.properties | 11 ++- .../bvengo/soundcontroller/Translations.java | 20 +++--- .../com/bvengo/soundcontroller/Utils.java | 10 +-- .../bvengo/soundcontroller/VolumeData.java | 18 ++--- .../soundcontroller/config/ConfigParser.java | 3 +- .../config/ModMenuIntegration.java | 4 +- .../soundcontroller/config/VolumeConfig.java | 19 +++-- .../gui/AllSoundOptionsScreen.java | 69 +++++++++---------- .../soundcontroller/gui/VolumeListWidget.java | 10 +-- .../gui/VolumeWidgetEntry.java | 63 +++++++++-------- .../gui/buttons/AudioButtonWidget.java | 6 +- .../gui/buttons/HoverableButtonWidget.java | 32 ++++----- .../gui/buttons/ToggleButtonWidget.java | 6 +- .../gui/buttons/TriggerButtonWidget.java | 12 ++-- .../mixin/GameOptionsScreenAccessor.java | 17 ----- .../mixin/GameOptionsScreenMixin.java | 60 ---------------- .../mixin/OptionsSubScreenMixin.java | 58 ++++++++++++++++ .../soundcontroller/mixin/ScreenAccessor.java | 14 ---- .../mixin/SoundEngineMixin.java | 25 +++++++ .../mixin/SoundManagerAccessor.java | 12 ---- .../mixin/SoundSystemAccessor.java | 12 ---- .../mixin/SoundSystemMixin.java | 29 -------- .../mixin/SubtitleOverlayMixin.java | 40 +++++++++++ .../mixin/SubtitlesHudMixin.java | 40 ----------- .../resources/soundcontroller.mixins.json | 10 +-- 26 files changed, 264 insertions(+), 338 deletions(-) delete mode 100644 src/main/java/com/bvengo/soundcontroller/mixin/GameOptionsScreenAccessor.java delete mode 100644 src/main/java/com/bvengo/soundcontroller/mixin/GameOptionsScreenMixin.java create mode 100644 src/main/java/com/bvengo/soundcontroller/mixin/OptionsSubScreenMixin.java delete mode 100644 src/main/java/com/bvengo/soundcontroller/mixin/ScreenAccessor.java create mode 100644 src/main/java/com/bvengo/soundcontroller/mixin/SoundEngineMixin.java delete mode 100644 src/main/java/com/bvengo/soundcontroller/mixin/SoundManagerAccessor.java delete mode 100644 src/main/java/com/bvengo/soundcontroller/mixin/SoundSystemAccessor.java delete mode 100644 src/main/java/com/bvengo/soundcontroller/mixin/SoundSystemMixin.java create mode 100644 src/main/java/com/bvengo/soundcontroller/mixin/SubtitleOverlayMixin.java delete mode 100644 src/main/java/com/bvengo/soundcontroller/mixin/SubtitlesHudMixin.java diff --git a/build.gradle b/build.gradle index 9b14ed5..b911e6c 100644 --- a/build.gradle +++ b/build.gradle @@ -23,7 +23,7 @@ repositories { dependencies { // To change the versions see the gradle.properties file minecraft "com.mojang:minecraft:${project.minecraft_version}" - mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" + mappings loom.officialMojangMappings() modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" // Fabric API. This is technically optional, but you probably want it anyway. diff --git a/gradle.properties b/gradle.properties index f7c06b1..66b12cb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,12 +11,11 @@ archives_base_name = soundcontroller ## Fabric: https://fabricmc.net/develop ## ModMenu: https://maven.terraformersmc.com/com/terraformersmc/modmenu -modmenu_version=16.0.0-rc.1 +modmenu_version=17.0.0-alpha.1 -minecraft_version=1.21.10 -yarn_mappings=1.21.10+build.2 -loader_version=0.17.2 -loom_version=1.11-SNAPSHOT +minecraft_version=1.21.11 +loader_version=0.18.1 +loom_version=1.13-SNAPSHOT # Fabric API -fabric_version=0.135.0+1.21.10 \ No newline at end of file +fabric_version=0.139.4+1.21.11 \ No newline at end of file diff --git a/src/main/java/com/bvengo/soundcontroller/Translations.java b/src/main/java/com/bvengo/soundcontroller/Translations.java index ca9e8e5..c399d13 100644 --- a/src/main/java/com/bvengo/soundcontroller/Translations.java +++ b/src/main/java/com/bvengo/soundcontroller/Translations.java @@ -1,19 +1,19 @@ package com.bvengo.soundcontroller; -import net.minecraft.text.Text; +import net.minecraft.network.chat.Component; public abstract class Translations { // Text constants - public static final Text SOUND_SCREEN_TITLE = translatableOf("title"); - public static final Text SEARCH_FIELD_PLACEHOLDER = translatableOf("search.placeholder"); - public static final Text SEARCH_FIELD_TITLE = translatableOf("search.title"); - public static final Text FILTER_BUTTON_TOOLTIP = translatableOf("filter.tooltip"); - public static final Text SUBTITLES_BUTTON_TOOLTIP = translatableOf("subtitles.tooltip"); - public static final Text RESET_BUTTON_TOOLTIP = translatableOf("reset.tooltip"); - public static final Text PLAY_BUTTON_TOOLTIP = translatableOf("play.tooltip"); + public static final Component SOUND_SCREEN_TITLE = translatableOf("title"); + public static final Component SEARCH_FIELD_PLACEHOLDER = translatableOf("search.placeholder"); + public static final Component SEARCH_FIELD_TITLE = translatableOf("search.title"); + public static final Component FILTER_BUTTON_TOOLTIP = translatableOf("filter.tooltip"); + public static final Component SUBTITLES_BUTTON_TOOLTIP = translatableOf("subtitles.tooltip"); + public static final Component RESET_BUTTON_TOOLTIP = translatableOf("reset.tooltip"); + public static final Component PLAY_BUTTON_TOOLTIP = translatableOf("play.tooltip"); - public static Text translatableOf(String key) { - return Text.translatable(getTranslationKey(key)); + public static Component translatableOf(String key) { + return Component.translatable(getTranslationKey(key)); } public static String getTranslationKey(String key) { diff --git a/src/main/java/com/bvengo/soundcontroller/Utils.java b/src/main/java/com/bvengo/soundcontroller/Utils.java index a345798..e90c222 100644 --- a/src/main/java/com/bvengo/soundcontroller/Utils.java +++ b/src/main/java/com/bvengo/soundcontroller/Utils.java @@ -1,14 +1,10 @@ package com.bvengo.soundcontroller; -import com.bvengo.soundcontroller.mixin.SoundManagerAccessor; -import com.bvengo.soundcontroller.mixin.SoundSystemAccessor; -import net.minecraft.client.MinecraftClient; -import net.minecraft.sound.SoundCategory; +import net.minecraft.client.Minecraft; +import net.minecraft.sounds.SoundSource; public class Utils { public static void updateExistingSounds() { - SoundSystemAccessor soundSystem = (SoundSystemAccessor) ((SoundManagerAccessor) MinecraftClient.getInstance().getSoundManager()).getSoundSystem(); - // Trigger updates for all existing sounds. AMBIENT is an arbitrary category - as long as it isn't MASTER, all existing volumes will be updated. - soundSystem.invokeUpdateSoundVolume(SoundCategory.AMBIENT); + Minecraft.getInstance().getSoundManager().refreshCategoryVolume(SoundSource.AMBIENT); } } diff --git a/src/main/java/com/bvengo/soundcontroller/VolumeData.java b/src/main/java/com/bvengo/soundcontroller/VolumeData.java index 3a98f60..3b4099c 100644 --- a/src/main/java/com/bvengo/soundcontroller/VolumeData.java +++ b/src/main/java/com/bvengo/soundcontroller/VolumeData.java @@ -1,11 +1,11 @@ package com.bvengo.soundcontroller; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.sound.PositionedSoundInstance; -import net.minecraft.client.sound.SoundInstance; -import net.minecraft.client.sound.SoundManager; -import net.minecraft.sound.SoundEvent; -import net.minecraft.util.Identifier; +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.sounds.SimpleSoundInstance; +import net.minecraft.client.resources.sounds.SoundInstance; +import net.minecraft.client.sounds.SoundManager; +import net.minecraft.resources.Identifier; +import net.minecraft.sounds.SoundEvent; public class VolumeData { public static final Float DEFAULT_VOLUME = 1.0f; @@ -31,7 +31,7 @@ public Float getVolume() { } public Float getAdjustedVolume(SoundInstance sound) { - float baseCategoryVolume = MinecraftClient.getInstance().options.getSoundVolume(sound.getCategory()); + float baseCategoryVolume = Minecraft.getInstance().options.getFinalSoundSourceVolume(sound.getSource()); float adjustment = volume * baseCategoryVolume; return Math.max(adjustment * sound.getVolume(), 0.0F); @@ -51,7 +51,7 @@ public boolean inFilter(String search, boolean showModifiedOnly) { } public void playSound(SoundManager soundManager) { - SoundEvent soundEvent = SoundEvent.of(soundId); - soundManager.play(PositionedSoundInstance.master(soundEvent, 1.0f)); + SoundEvent soundEvent = SoundEvent.createVariableRangeEvent(soundId); + soundManager.play(SimpleSoundInstance.forUI(soundEvent, 1.0f)); } } \ No newline at end of file diff --git a/src/main/java/com/bvengo/soundcontroller/config/ConfigParser.java b/src/main/java/com/bvengo/soundcontroller/config/ConfigParser.java index b523d38..c215e5a 100644 --- a/src/main/java/com/bvengo/soundcontroller/config/ConfigParser.java +++ b/src/main/java/com/bvengo/soundcontroller/config/ConfigParser.java @@ -4,8 +4,7 @@ import com.bvengo.soundcontroller.VolumeData; import com.google.gson.*; import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.util.Identifier; - +import net.minecraft.resources.Identifier; import java.io.*; import java.util.Comparator; import java.util.HashMap; diff --git a/src/main/java/com/bvengo/soundcontroller/config/ModMenuIntegration.java b/src/main/java/com/bvengo/soundcontroller/config/ModMenuIntegration.java index 488db3d..45d78d1 100644 --- a/src/main/java/com/bvengo/soundcontroller/config/ModMenuIntegration.java +++ b/src/main/java/com/bvengo/soundcontroller/config/ModMenuIntegration.java @@ -1,14 +1,14 @@ package com.bvengo.soundcontroller.config; -import com.bvengo.soundcontroller.mixin.ScreenAccessor; import com.bvengo.soundcontroller.gui.AllSoundOptionsScreen; import com.terraformersmc.modmenu.api.ConfigScreenFactory; import com.terraformersmc.modmenu.api.ModMenuApi; +import net.minecraft.client.Minecraft; public class ModMenuIntegration implements ModMenuApi { @Override public ConfigScreenFactory getModConfigScreenFactory() { - return parent -> new AllSoundOptionsScreen(parent, ((ScreenAccessor)(Object)parent).getClient().options); + return parent -> new AllSoundOptionsScreen(parent, Minecraft.getInstance().options); } } diff --git a/src/main/java/com/bvengo/soundcontroller/config/VolumeConfig.java b/src/main/java/com/bvengo/soundcontroller/config/VolumeConfig.java index 2bb6145..c9dafd0 100644 --- a/src/main/java/com/bvengo/soundcontroller/config/VolumeConfig.java +++ b/src/main/java/com/bvengo/soundcontroller/config/VolumeConfig.java @@ -1,13 +1,12 @@ package com.bvengo.soundcontroller.config; import com.bvengo.soundcontroller.VolumeData; -import net.minecraft.client.sound.SoundInstance; -import net.minecraft.registry.Registries; -import net.minecraft.sound.SoundEvent; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.Identifier; - import java.util.HashMap; +import net.minecraft.client.resources.sounds.SoundInstance; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.Identifier; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; public class VolumeConfig { private static VolumeConfig instance; @@ -37,9 +36,9 @@ public void save() { private void updateVolumes() { // Update map with any sounds missing from the config file - for (SoundEvent soundEvent : Registries.SOUND_EVENT) { - if (soundEvent != SoundEvents.INTENTIONALLY_EMPTY) { - Identifier soundId = soundEvent.id(); + for (SoundEvent soundEvent : BuiltInRegistries.SOUND_EVENT) { + if (soundEvent != SoundEvents.EMPTY) { + Identifier soundId = soundEvent.location(); soundVolumes.putIfAbsent(soundId, new VolumeData(soundId)); } } @@ -54,7 +53,7 @@ public VolumeData getVolumeData(Identifier soundId) { } public float getAdjustedVolume(SoundInstance sound) { - VolumeData volumeData = getVolumeData(sound.getId()); + VolumeData volumeData = getVolumeData(sound.getIdentifier()); return volumeData.getAdjustedVolume(sound); } diff --git a/src/main/java/com/bvengo/soundcontroller/gui/AllSoundOptionsScreen.java b/src/main/java/com/bvengo/soundcontroller/gui/AllSoundOptionsScreen.java index 03f1268..2f6cc49 100644 --- a/src/main/java/com/bvengo/soundcontroller/gui/AllSoundOptionsScreen.java +++ b/src/main/java/com/bvengo/soundcontroller/gui/AllSoundOptionsScreen.java @@ -2,15 +2,14 @@ import com.bvengo.soundcontroller.config.VolumeConfig; import com.bvengo.soundcontroller.gui.buttons.ToggleButtonWidget; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.option.GameOptionsScreen; -import net.minecraft.client.gui.tooltip.Tooltip; -import net.minecraft.client.gui.widget.*; -import net.minecraft.client.option.GameOptions; -import net.minecraft.screen.ScreenTexts; - +import net.minecraft.client.Options; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.client.gui.components.Tooltip; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.options.OptionsSubScreen; +import net.minecraft.network.chat.CommonComponents; import java.util.Comparator; import static com.bvengo.soundcontroller.Translations.SOUND_SCREEN_TITLE; @@ -22,20 +21,20 @@ /** * Screen that displays all sound options. */ -public class AllSoundOptionsScreen extends GameOptionsScreen { +public class AllSoundOptionsScreen extends OptionsSubScreen { VolumeConfig config = VolumeConfig.getInstance(); protected final Screen parent; private VolumeListWidget volumeListWidget; - private TextFieldWidget searchField; + private EditBox searchField; private ToggleButtonWidget filterButton; private ToggleButtonWidget subtitlesButton; private boolean showModifiedOnly = false; - public AllSoundOptionsScreen(Screen parent, GameOptions options) { + public AllSoundOptionsScreen(Screen parent, Options options) { super(parent, options, SOUND_SCREEN_TITLE); this.parent = parent; @@ -59,10 +58,10 @@ protected void addOptions() {} private void addSearchField() { // Add search field - x, y, width, height - this.searchField = new TextFieldWidget(this.textRenderer, 80, 35, this.width - 167, 20, + this.searchField = new EditBox(this.font, 80, 35, this.width - 167, 20, SEARCH_FIELD_PLACEHOLDER); - this.searchField.setChangedListener(serverName -> this.loadOptions()); - this.addSelectableChild(this.searchField); + this.searchField.setResponder(serverName -> this.loadOptions()); + this.addWidget(this.searchField); } private void addFilterButton() { @@ -76,8 +75,8 @@ private void addFilterButton() { false ); - this.filterButton.setTooltip(Tooltip.of(FILTER_BUTTON_TOOLTIP)); - this.addDrawableChild(this.filterButton); + this.filterButton.setTooltip(Tooltip.create(FILTER_BUTTON_TOOLTIP)); + this.addRenderableWidget(this.filterButton); } private void addSubtitlesButton() { @@ -89,33 +88,33 @@ private void addSubtitlesButton() { }, config.areSubtitlesEnabled()); - this.subtitlesButton.setTooltip(Tooltip.of(SUBTITLES_BUTTON_TOOLTIP)); - this.addDrawableChild(this.subtitlesButton); + this.subtitlesButton.setTooltip(Tooltip.create(SUBTITLES_BUTTON_TOOLTIP)); + this.addRenderableWidget(this.subtitlesButton); } private void addVolumeList() { - this.volumeListWidget = new VolumeListWidget(this.client, this.width, this.searchField.getBottom() + 32, this); + this.volumeListWidget = new VolumeListWidget(this.minecraft, this.width, this.searchField.getBottom() + 32, this); loadOptions(); - this.addDrawableChild(this.volumeListWidget); + this.addRenderableWidget(this.volumeListWidget); } private void addDoneButton() { - this.addDrawableChild(ButtonWidget.builder(ScreenTexts.DONE, button -> this.close()) - .dimensions(this.width / 2 - 100, this.height - 27, 200, 20).build()); + this.addRenderableWidget(Button.builder(CommonComponents.GUI_DONE, button -> this.onClose()) + .bounds(this.width / 2 - 100, this.height - 27, 200, 20).build()); } private void loadOptions() { this.volumeListWidget.clearEntries(); - this.volumeListWidget.setScrollY(0); + this.volumeListWidget.setScrollAmount(0); - String search = this.searchField.getText().toLowerCase(); + String search = this.searchField.getValue().toLowerCase(); // Update all buttons config.getVolumes().values().stream() .filter(volumeData -> volumeData.inFilter(search, showModifiedOnly)) .sorted(Comparator.comparing(v -> v.getId().toString())) .forEach(volumeData -> { - VolumeWidgetEntry volumeEntry = new VolumeWidgetEntry(volumeData, this, this.gameOptions); + VolumeWidgetEntry volumeEntry = new VolumeWidgetEntry(volumeData, this, this.options); this.volumeListWidget.addWidgetEntry(volumeEntry); }); } @@ -123,29 +122,29 @@ private void loadOptions() { @Override public void removed() { config.save(); - this.searchField.setText(""); // Clear search field + this.searchField.setValue(""); // Clear search field } @Override - public void resize(MinecraftClient client, int width, int height) { + public void resize(int width, int height) { // Cache search before clearing - String search = this.searchField.getText(); + String search = this.searchField.getValue(); this.width = width; this.height = height; - this.clearChildren(); - this.blur(); + this.clearWidgets(); + this.clearFocus(); this.init(); - this.searchField.setText(search); + this.searchField.setValue(search); } @Override - public void render(DrawContext context, int mouseX, int mouseY, float delta) { + public void render(GuiGraphics context, int mouseX, int mouseY, float delta) { super.render(context, mouseX, mouseY, delta); - context.drawCenteredTextWithShadow(this.textRenderer, this.title, this.width / 2, 20, 0xFFFFFF); - context.drawTextWithShadow(this.textRenderer, SEARCH_FIELD_TITLE, 32, 40, 0xA0A0A0); + context.drawCenteredString(this.font, this.title, this.width / 2, 20, 0xFFFFFF); + context.drawString(this.font, SEARCH_FIELD_TITLE, 32, 40, 0xA0A0A0); this.searchField.render(context, mouseX, mouseY, delta); } } diff --git a/src/main/java/com/bvengo/soundcontroller/gui/VolumeListWidget.java b/src/main/java/com/bvengo/soundcontroller/gui/VolumeListWidget.java index ae9b875..b69b072 100644 --- a/src/main/java/com/bvengo/soundcontroller/gui/VolumeListWidget.java +++ b/src/main/java/com/bvengo/soundcontroller/gui/VolumeListWidget.java @@ -2,19 +2,19 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.option.GameOptionsScreen; -import net.minecraft.client.gui.widget.ElementListWidget; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.components.ContainerObjectSelectionList; +import net.minecraft.client.gui.screens.options.OptionsSubScreen; /** * The list widget that contains all the individual records. Contains a list of {@link VolumeWidgetEntry}. */ @Environment(value=EnvType.CLIENT) -public class VolumeListWidget extends ElementListWidget { +public class VolumeListWidget extends ContainerObjectSelectionList { private static final int rowWidth = VolumeWidgetEntry.totalWidth; private static final int rowHeight = 25; - public VolumeListWidget(MinecraftClient client, int width, int i, GameOptionsScreen optionsScreen) { + public VolumeListWidget(Minecraft client, int width, int i, OptionsSubScreen optionsScreen) { super(client, width, optionsScreen.layout.getContentHeight(), optionsScreen.layout.getHeaderHeight(), rowHeight); this.centerListVertically = false; } diff --git a/src/main/java/com/bvengo/soundcontroller/gui/VolumeWidgetEntry.java b/src/main/java/com/bvengo/soundcontroller/gui/VolumeWidgetEntry.java index 6cf5ea6..1d18cc7 100644 --- a/src/main/java/com/bvengo/soundcontroller/gui/VolumeWidgetEntry.java +++ b/src/main/java/com/bvengo/soundcontroller/gui/VolumeWidgetEntry.java @@ -5,21 +5,20 @@ import com.bvengo.soundcontroller.VolumeData; import com.bvengo.soundcontroller.gui.buttons.AudioButtonWidget; import com.bvengo.soundcontroller.gui.buttons.TriggerButtonWidget; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.Element; -import net.minecraft.client.gui.Selectable; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.tooltip.Tooltip; -import net.minecraft.client.gui.widget.ClickableWidget; -import net.minecraft.client.gui.widget.ElementListWidget.Entry; -import net.minecraft.client.option.GameOptions; -import net.minecraft.client.option.SimpleOption; -import net.minecraft.client.sound.SoundManager; -import net.minecraft.screen.ScreenTexts; -import net.minecraft.text.Text; - import java.util.List; +import net.minecraft.client.Minecraft; +import net.minecraft.client.OptionInstance; +import net.minecraft.client.Options; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.AbstractWidget; +import net.minecraft.client.gui.components.ContainerObjectSelectionList.Entry; +import net.minecraft.client.gui.components.Tooltip; +import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.client.gui.narration.NarratableEntry; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.sounds.SoundManager; +import net.minecraft.network.chat.CommonComponents; +import net.minecraft.network.chat.Component; /** * A widget entry allowing control of a single volume. Should be used in a {@link VolumeListWidget}. @@ -28,7 +27,7 @@ public class VolumeWidgetEntry extends Entry { private final VolumeData volumeData; private final SoundManager soundManager; private final Screen screen; - private final GameOptions gameOptions; + private final Options options; private static final int sliderWidth = 310; private static final int buttonSize = 20; @@ -36,19 +35,19 @@ public class VolumeWidgetEntry extends Entry { private static final int paddingBetweenButtons = 4; public static final int totalWidth = sliderWidth + buttonSize * 2 + paddingAfterSearch + paddingBetweenButtons; - public SimpleOption volumeOption; + public OptionInstance volumeOption; - public ClickableWidget volumeSlider; + public AbstractWidget volumeSlider; public TriggerButtonWidget playSoundButton; public TriggerButtonWidget resetButton; private static final float MAX_VOLUME = 2.0f; - public VolumeWidgetEntry(VolumeData volumeData, Screen screen, GameOptions gameOptions) { + public VolumeWidgetEntry(VolumeData volumeData, Screen screen, Options options) { this.volumeData = volumeData; this.screen = screen; - this.gameOptions = gameOptions; - this.soundManager = MinecraftClient.getInstance().getSoundManager(); + this.options = options; + this.soundManager = Minecraft.getInstance().getSoundManager(); init(); } @@ -65,9 +64,9 @@ private float getVolumeFromSlider(double value) { private void addSlider() { // Volume slider (options) - this.volumeOption = new SimpleOption<>( + this.volumeOption = new OptionInstance<>( volumeData.getId().toString(), - SimpleOption.emptyTooltip(), + OptionInstance.noTooltip(), (prefix, value) -> { // Use volumeData instead of value, noting that it gets updated immediately by the slider as well. // This allows us to list the actual volume (which may be over/under set), not whatever the slider @@ -75,20 +74,20 @@ private void addSlider() { int volume = getPercentageValue(volumeData.getVolume()); if (volume == 0) { - return Text.translatable("options.generic_value", prefix, ScreenTexts.OFF); + return Component.translatable("options.generic_value", prefix, CommonComponents.OPTION_OFF); } if (volume > MAX_VOLUME * 100 || volume < 0) { // Make the value red if it's over the max - return Text.translatable("options.generic_value", + return Component.translatable("options.generic_value", prefix, - Text.literal(volume + "%").styled(style -> style.withColor(0xFF5555)) + Component.literal(volume + "%").withStyle(style -> style.withColor(0xFF5555)) ); } - return Text.translatable("options.percent_value", prefix, volume); + return Component.translatable("options.percent_value", prefix, volume); }, - SimpleOption.DoubleSliderCallbacks.INSTANCE, + OptionInstance.UnitDouble.INSTANCE, Math.clamp(volumeData.getVolume().doubleValue() / MAX_VOLUME, 0.0, 1.0), value -> { volumeData.setVolume(getVolumeFromSlider(value)); @@ -96,7 +95,7 @@ private void addSlider() { }); // Volume slider (widget, created from options) - this.volumeSlider = volumeOption.createWidget(gameOptions, 0, 0, sliderWidth); + this.volumeSlider = volumeOption.createButton(options, 0, 0, sliderWidth); } private void addPlayButton() { @@ -112,7 +111,7 @@ private void addResetButton() { Utils.updateExistingSounds(); }); - this.resetButton.setTooltip(Tooltip.of(Translations.RESET_BUTTON_TOOLTIP)); + this.resetButton.setTooltip(Tooltip.create(Translations.RESET_BUTTON_TOOLTIP)); } private void init() { @@ -122,7 +121,7 @@ private void init() { } @Override - public void render(DrawContext context, int mouseX, int mouseY, boolean hovered, float tickDelta) { + public void renderContent(GuiGraphics context, int mouseX, int mouseY, boolean hovered, float tickDelta) { int leftSide = (this.screen.width - totalWidth) / 2; this.volumeSlider.setPosition(leftSide, getY()); @@ -136,12 +135,12 @@ public void render(DrawContext context, int mouseX, int mouseY, boolean hovered, } @Override - public List children() { + public List children() { return List.of(volumeSlider, playSoundButton, resetButton); } @Override - public List selectableChildren() { + public List narratables() { return List.of(volumeSlider, playSoundButton, resetButton); } } diff --git a/src/main/java/com/bvengo/soundcontroller/gui/buttons/AudioButtonWidget.java b/src/main/java/com/bvengo/soundcontroller/gui/buttons/AudioButtonWidget.java index 3a033c8..496611b 100644 --- a/src/main/java/com/bvengo/soundcontroller/gui/buttons/AudioButtonWidget.java +++ b/src/main/java/com/bvengo/soundcontroller/gui/buttons/AudioButtonWidget.java @@ -2,8 +2,8 @@ import com.bvengo.soundcontroller.Translations; import com.bvengo.soundcontroller.VolumeData; -import net.minecraft.client.gui.tooltip.Tooltip; -import net.minecraft.client.sound.SoundManager; +import net.minecraft.client.gui.components.Tooltip; +import net.minecraft.client.sounds.SoundManager; /** * Custom button widget that is used to trigger audio events. @@ -11,7 +11,7 @@ public class AudioButtonWidget extends TriggerButtonWidget { public AudioButtonWidget(int x, int y, int width, int height, SoundManager soundManager, VolumeData volumeData) { super("audio", x, y, width, height, (button) -> volumeData.playSound(soundManager)); - setTooltip(Tooltip.of(Translations.PLAY_BUTTON_TOOLTIP)); + setTooltip(Tooltip.create(Translations.PLAY_BUTTON_TOOLTIP)); } @Override diff --git a/src/main/java/com/bvengo/soundcontroller/gui/buttons/HoverableButtonWidget.java b/src/main/java/com/bvengo/soundcontroller/gui/buttons/HoverableButtonWidget.java index 2da9dcc..b5282c0 100644 --- a/src/main/java/com/bvengo/soundcontroller/gui/buttons/HoverableButtonWidget.java +++ b/src/main/java/com/bvengo/soundcontroller/gui/buttons/HoverableButtonWidget.java @@ -3,18 +3,18 @@ import com.bvengo.soundcontroller.SoundController; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.gl.RenderPipelines; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.screen.ScreenTexts; -import net.minecraft.util.Identifier; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.renderer.RenderPipelines; +import net.minecraft.network.chat.CommonComponents; +import net.minecraft.resources.Identifier; /** * Custom button widget that is used as a trigger rather than a toggle. * i.e. it is only active while the button is being pressed. */ @Environment(EnvType.CLIENT) -public class HoverableButtonWidget extends ButtonWidget { +public class HoverableButtonWidget extends Button { protected boolean isPressed = false; private final Identifier ON_TEXTURE; @@ -24,22 +24,22 @@ public class HoverableButtonWidget extends ButtonWidget { String buttonId; - public HoverableButtonWidget(String buttonId, int x, int y, int width, int height, PressAction pressAction) { - super(x, y, width, height, ScreenTexts.EMPTY, pressAction, DEFAULT_NARRATION_SUPPLIER); + public HoverableButtonWidget(String buttonId, int x, int y, int width, int height, OnPress onPress) { + super(x, y, width, height, CommonComponents.EMPTY, onPress, DEFAULT_NARRATION); this.buttonId = buttonId; - ON_TEXTURE = Identifier.of(SoundController.MOD_ID, buttonId + "_button_on"); - OFF_TEXTURE = Identifier.of(SoundController.MOD_ID, buttonId + "_button_off"); - ON_HOVER_TEXTURE = Identifier.of(SoundController.MOD_ID, buttonId + "_button_on_hovered"); - OFF_HOVER_TEXTURE = Identifier.of(SoundController.MOD_ID, buttonId + "_button_off_hovered"); + ON_TEXTURE = Identifier.fromNamespaceAndPath(SoundController.MOD_ID, buttonId + "_button_on"); + OFF_TEXTURE = Identifier.fromNamespaceAndPath(SoundController.MOD_ID, buttonId + "_button_off"); + ON_HOVER_TEXTURE = Identifier.fromNamespaceAndPath(SoundController.MOD_ID, buttonId + "_button_on_hovered"); + OFF_HOVER_TEXTURE = Identifier.fromNamespaceAndPath(SoundController.MOD_ID, buttonId + "_button_off_hovered"); } @Override - public void renderWidget(DrawContext context, int mouseX, int mouseY, float delta) { - Identifier texture = isPressed ? (hovered ? ON_HOVER_TEXTURE : ON_TEXTURE) - : (hovered ? OFF_HOVER_TEXTURE : OFF_TEXTURE); + public void renderContents(GuiGraphics context, int mouseX, int mouseY, float delta) { + Identifier texture = isPressed ? (isHovered ? ON_HOVER_TEXTURE : ON_TEXTURE) + : (isHovered ? OFF_HOVER_TEXTURE : OFF_TEXTURE); - context.drawGuiTexture(RenderPipelines.GUI_TEXTURED, texture, getX(), getY(), width, height); + context.blitSprite(RenderPipelines.GUI_TEXTURED, texture, getX(), getY(), width, height); } } diff --git a/src/main/java/com/bvengo/soundcontroller/gui/buttons/ToggleButtonWidget.java b/src/main/java/com/bvengo/soundcontroller/gui/buttons/ToggleButtonWidget.java index 7cf4a3f..82c1142 100644 --- a/src/main/java/com/bvengo/soundcontroller/gui/buttons/ToggleButtonWidget.java +++ b/src/main/java/com/bvengo/soundcontroller/gui/buttons/ToggleButtonWidget.java @@ -2,7 +2,7 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.input.AbstractInput; +import net.minecraft.client.input.InputWithModifiers; /** * Custom button widget that is used as a trigger rather than a toggle. @@ -11,13 +11,13 @@ @Environment(EnvType.CLIENT) public class ToggleButtonWidget extends HoverableButtonWidget { - public ToggleButtonWidget(String buttonId, int x, int y, int width, int height, PressAction pressAction, boolean isToggled) { + public ToggleButtonWidget(String buttonId, int x, int y, int width, int height, OnPress pressAction, boolean isToggled) { super(buttonId, x, y, width, height, pressAction); this.isPressed = isToggled; } @Override - public void onPress(AbstractInput input) { + public void onPress(InputWithModifiers input) { // Natural toggle when button is pressed this.onPress.onPress(this); isPressed = !isPressed; diff --git a/src/main/java/com/bvengo/soundcontroller/gui/buttons/TriggerButtonWidget.java b/src/main/java/com/bvengo/soundcontroller/gui/buttons/TriggerButtonWidget.java index 51827fb..bfe3075 100644 --- a/src/main/java/com/bvengo/soundcontroller/gui/buttons/TriggerButtonWidget.java +++ b/src/main/java/com/bvengo/soundcontroller/gui/buttons/TriggerButtonWidget.java @@ -2,8 +2,8 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.gui.Click; -import net.minecraft.client.input.AbstractInput; +import net.minecraft.client.input.InputWithModifiers; +import net.minecraft.client.input.MouseButtonEvent; /** * Custom button widget that is used as a trigger rather than a toggle. @@ -12,20 +12,20 @@ @Environment(EnvType.CLIENT) public class TriggerButtonWidget extends HoverableButtonWidget { - public TriggerButtonWidget(String buttonId, int x, int y, int width, int height, PressAction pressAction) { + public TriggerButtonWidget(String buttonId, int x, int y, int width, int height, OnPress pressAction) { super(buttonId, x, y, width, height, pressAction); } @Override - public void onPress(AbstractInput input) { + public void onPress(InputWithModifiers input) { isPressed = true; } @Override - public void onRelease(Click click) { + public void onRelease(MouseButtonEvent click) { // Release toggle texture on release, and perform press action. // Only perform press action if button remains hovered. - if(hovered) { + if(isHovered) { this.onPress.onPress(this); } diff --git a/src/main/java/com/bvengo/soundcontroller/mixin/GameOptionsScreenAccessor.java b/src/main/java/com/bvengo/soundcontroller/mixin/GameOptionsScreenAccessor.java deleted file mode 100644 index 154f000..0000000 --- a/src/main/java/com/bvengo/soundcontroller/mixin/GameOptionsScreenAccessor.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.bvengo.soundcontroller.mixin; - -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.option.GameOptions; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; -import net.minecraft.client.gui.screen.option.GameOptionsScreen; - - -@Mixin(GameOptionsScreen.class) -public interface GameOptionsScreenAccessor { - @Accessor("parent") - Screen getParent(); - - @Accessor("gameOptions") - GameOptions getOptions(); -} diff --git a/src/main/java/com/bvengo/soundcontroller/mixin/GameOptionsScreenMixin.java b/src/main/java/com/bvengo/soundcontroller/mixin/GameOptionsScreenMixin.java deleted file mode 100644 index ff38bbb..0000000 --- a/src/main/java/com/bvengo/soundcontroller/mixin/GameOptionsScreenMixin.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.bvengo.soundcontroller.mixin; - -import com.bvengo.soundcontroller.Translations; -import com.bvengo.soundcontroller.gui.AllSoundOptionsScreen; - -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.option.GameOptionsScreen; -import net.minecraft.client.gui.screen.option.SoundOptionsScreen; -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.client.gui.widget.DirectionalLayoutWidget; -import net.minecraft.client.gui.widget.ThreePartsLayoutWidget; -import net.minecraft.client.option.GameOptions; -import net.minecraft.screen.ScreenTexts; - -import net.minecraft.text.Text; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(GameOptionsScreen.class) -public class GameOptionsScreenMixin { - @Shadow @Final public ThreePartsLayoutWidget layout; - - @Inject(method = "initFooter", at = @At("HEAD"), cancellable = true) - private void replaceDoneButton(CallbackInfo ci) { - - //noinspection ConstantValue - if (!((Object)this instanceof SoundOptionsScreen)) { - return; - } - - ScreenAccessor screenAccessor = (ScreenAccessor) (Object) this; - GameOptionsScreenAccessor gameOptionsScreenAccessor = (GameOptionsScreenAccessor) (Object) this; - - MinecraftClient client = screenAccessor.getClient(); - Screen parent = gameOptionsScreenAccessor.getParent(); - GameOptions options = gameOptionsScreenAccessor.getOptions(); - - DirectionalLayoutWidget directionalLayoutWidget = this.layout.addFooter(DirectionalLayoutWidget.horizontal().spacing(8)); - - // To individual volume options screen - AllSoundOptionsScreen volumeOptionsScreen = new AllSoundOptionsScreen((SoundOptionsScreen)(Object)this, options); - soundcontroller$addLayoutButton(client, directionalLayoutWidget, Translations.SOUND_SCREEN_TITLE, volumeOptionsScreen); - soundcontroller$addLayoutButton(client, directionalLayoutWidget, ScreenTexts.DONE, parent); - - ci.cancel(); - } - - @Unique - private void soundcontroller$addLayoutButton(MinecraftClient client, DirectionalLayoutWidget layout, Text text, Screen nextScreen) { - layout.add(ButtonWidget.builder(text, button -> { - client.setScreen(nextScreen); - }).build()); - } -} \ No newline at end of file diff --git a/src/main/java/com/bvengo/soundcontroller/mixin/OptionsSubScreenMixin.java b/src/main/java/com/bvengo/soundcontroller/mixin/OptionsSubScreenMixin.java new file mode 100644 index 0000000..c3d107f --- /dev/null +++ b/src/main/java/com/bvengo/soundcontroller/mixin/OptionsSubScreenMixin.java @@ -0,0 +1,58 @@ +package com.bvengo.soundcontroller.mixin; + +import com.bvengo.soundcontroller.Translations; +import com.bvengo.soundcontroller.gui.AllSoundOptionsScreen; +import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import net.minecraft.client.Minecraft; +import net.minecraft.client.Options; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.layouts.HeaderAndFooterLayout; +import net.minecraft.client.gui.layouts.LinearLayout; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.options.OptionsSubScreen; +import net.minecraft.client.gui.screens.options.SoundOptionsScreen; +import net.minecraft.network.chat.CommonComponents; +import net.minecraft.network.chat.Component; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(OptionsSubScreen.class) +public class OptionsSubScreenMixin { + @Shadow @Final public HeaderAndFooterLayout layout; + + @Shadow @Final protected Screen lastScreen; + + @Shadow @Final protected Options options; + + @WrapMethod(method = "addFooter") + private void replaceDoneButton(Operation original) { + + //noinspection ConstantValue + if (!((Object)this instanceof SoundOptionsScreen)) { + return; + } + + + Minecraft client = Minecraft.getInstance(); + + LinearLayout directionalLayoutWidget = this.layout.addToFooter(LinearLayout.horizontal().spacing(8)); + + // To individual volume options screen + AllSoundOptionsScreen volumeOptionsScreen = new AllSoundOptionsScreen((SoundOptionsScreen)(Object)this, this.options); + soundcontroller$addLayoutButton(client, directionalLayoutWidget, Translations.SOUND_SCREEN_TITLE, volumeOptionsScreen); + soundcontroller$addLayoutButton(client, directionalLayoutWidget, CommonComponents.GUI_DONE, this.lastScreen); + } + + @Unique + private void soundcontroller$addLayoutButton(Minecraft client, LinearLayout layout, Component text, Screen nextScreen) { + layout.addChild(Button.builder(text, button -> { + client.setScreen(nextScreen); + }).build()); + } +} \ No newline at end of file diff --git a/src/main/java/com/bvengo/soundcontroller/mixin/ScreenAccessor.java b/src/main/java/com/bvengo/soundcontroller/mixin/ScreenAccessor.java deleted file mode 100644 index 1b3fd01..0000000 --- a/src/main/java/com/bvengo/soundcontroller/mixin/ScreenAccessor.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.bvengo.soundcontroller.mixin; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import net.minecraft.client.MinecraftClient; - -import net.minecraft.client.gui.screen.Screen; - -@Mixin(Screen.class) -public interface ScreenAccessor { - @Accessor("client") - MinecraftClient getClient(); -} diff --git a/src/main/java/com/bvengo/soundcontroller/mixin/SoundEngineMixin.java b/src/main/java/com/bvengo/soundcontroller/mixin/SoundEngineMixin.java new file mode 100644 index 0000000..b728e2f --- /dev/null +++ b/src/main/java/com/bvengo/soundcontroller/mixin/SoundEngineMixin.java @@ -0,0 +1,25 @@ +package com.bvengo.soundcontroller.mixin; + +import com.bvengo.soundcontroller.SoundController; +import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import net.minecraft.client.resources.sounds.SoundInstance; +import net.minecraft.client.sounds.SoundEngine; +import net.minecraft.sounds.SoundSource; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(SoundEngine.class) +public class SoundEngineMixin { + @WrapOperation(method = "play(Lnet/minecraft/client/resources/sounds/SoundInstance;)Lnet/minecraft/client/sounds/SoundEngine$PlayResult;", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/sounds/SoundEngine;calculateVolume(FLnet/minecraft/sounds/SoundSource;)F")) + private float modifyH(SoundEngine instance, float volume, SoundSource category, Operation original, SoundInstance sound) { + // h comes from getAdjustedVolume(float volume, Category category) - we can't inject there, because no ID is available + return SoundController.CONFIG.getAdjustedVolume(sound); + } + + @WrapMethod(method = "calculateVolume(Lnet/minecraft/client/resources/sounds/SoundInstance;)F") + private float modifyGetAdjustedVolume(SoundInstance sound, Operation original) { + return SoundController.CONFIG.getAdjustedVolume(sound); + } +} \ No newline at end of file diff --git a/src/main/java/com/bvengo/soundcontroller/mixin/SoundManagerAccessor.java b/src/main/java/com/bvengo/soundcontroller/mixin/SoundManagerAccessor.java deleted file mode 100644 index 7116e21..0000000 --- a/src/main/java/com/bvengo/soundcontroller/mixin/SoundManagerAccessor.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.bvengo.soundcontroller.mixin; - -import net.minecraft.client.sound.SoundManager; -import net.minecraft.client.sound.SoundSystem; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(SoundManager.class) -public interface SoundManagerAccessor { - @Accessor - SoundSystem getSoundSystem(); -} diff --git a/src/main/java/com/bvengo/soundcontroller/mixin/SoundSystemAccessor.java b/src/main/java/com/bvengo/soundcontroller/mixin/SoundSystemAccessor.java deleted file mode 100644 index c452b28..0000000 --- a/src/main/java/com/bvengo/soundcontroller/mixin/SoundSystemAccessor.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.bvengo.soundcontroller.mixin; - -import net.minecraft.client.sound.SoundSystem; -import net.minecraft.sound.SoundCategory; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -@Mixin(SoundSystem.class) -public interface SoundSystemAccessor { - @Invoker("updateSoundVolume") - void invokeUpdateSoundVolume(SoundCategory category); -} diff --git a/src/main/java/com/bvengo/soundcontroller/mixin/SoundSystemMixin.java b/src/main/java/com/bvengo/soundcontroller/mixin/SoundSystemMixin.java deleted file mode 100644 index 1b39a12..0000000 --- a/src/main/java/com/bvengo/soundcontroller/mixin/SoundSystemMixin.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.bvengo.soundcontroller.mixin; - -import com.bvengo.soundcontroller.SoundController; -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; -import net.minecraft.sound.SoundCategory; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; - -import net.minecraft.client.sound.SoundInstance; -import net.minecraft.client.sound.SoundSystem; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -@Mixin(SoundSystem.class) -public class SoundSystemMixin { - @WrapOperation(method = "play(Lnet/minecraft/client/sound/SoundInstance;)Lnet/minecraft/client/sound/SoundSystem$PlayResult;", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/sound/SoundSystem;getAdjustedVolume(FLnet/minecraft/sound/SoundCategory;)F")) - private float modifyH(SoundSystem instance, float volume, SoundCategory category, Operation original, SoundInstance sound) { - // h comes from getAdjustedVolume(float volume, Category category) - we can't inject there, because no ID is available - return SoundController.CONFIG.getAdjustedVolume(sound); - } - - @Inject(method = "getAdjustedVolume(Lnet/minecraft/client/sound/SoundInstance;)F", at = @At("HEAD"), cancellable = true) - private void modifyGetAdjustedVolume(SoundInstance sound, CallbackInfoReturnable ci) { - float volume = SoundController.CONFIG.getAdjustedVolume(sound); - ci.setReturnValue(volume); - ci.cancel(); - } -} \ No newline at end of file diff --git a/src/main/java/com/bvengo/soundcontroller/mixin/SubtitleOverlayMixin.java b/src/main/java/com/bvengo/soundcontroller/mixin/SubtitleOverlayMixin.java new file mode 100644 index 0000000..bb8adda --- /dev/null +++ b/src/main/java/com/bvengo/soundcontroller/mixin/SubtitleOverlayMixin.java @@ -0,0 +1,40 @@ +package com.bvengo.soundcontroller.mixin; + +import com.bvengo.soundcontroller.SoundController; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import net.minecraft.client.OptionInstance; +import net.minecraft.client.gui.components.SubtitleOverlay; +import net.minecraft.client.resources.sounds.SoundInstance; +import net.minecraft.client.sounds.WeighedSoundEvents; +import net.minecraft.network.chat.Component; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(SubtitleOverlay.class) +public class SubtitleOverlayMixin { + @WrapOperation(method = "onPlaySound", at=@At(value = "INVOKE", target="Lnet/minecraft/client/sounds/WeighedSoundEvents;getSubtitle()Lnet/minecraft/network/chat/Component;")) + private Component replaceSubtitleText(WeighedSoundEvents instance, Operation original, SoundInstance sound) { + return SoundController.CONFIG.areSubtitlesEnabled() ? Component.translationArg(sound.getIdentifier()) : original.call(instance); + } + + @WrapOperation( + method = "render", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/client/OptionInstance;get()Ljava/lang/Object;", + ordinal = 0) // Targets the first getShowSubtitles().getValue() call + ) + private Object modifyFirstShowSubtitlesCheck(OptionInstance instance, Operation original) { + return (Boolean)(original.call(instance)) || SoundController.CONFIG.areSubtitlesEnabled(); + } + + @WrapOperation( + method = "render", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/client/OptionInstance;get()Ljava/lang/Object;", + ordinal = 1) // Targets the first getShowSubtitles().getValue() call + ) + private Object modifySecondShowSubtitlesCheck(OptionInstance instance, Operation original) { + return (Boolean)(original.call(instance)) || SoundController.CONFIG.areSubtitlesEnabled(); + } +} diff --git a/src/main/java/com/bvengo/soundcontroller/mixin/SubtitlesHudMixin.java b/src/main/java/com/bvengo/soundcontroller/mixin/SubtitlesHudMixin.java deleted file mode 100644 index 11dcfd1..0000000 --- a/src/main/java/com/bvengo/soundcontroller/mixin/SubtitlesHudMixin.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.bvengo.soundcontroller.mixin; - -import com.bvengo.soundcontroller.SoundController; -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; -import net.minecraft.client.gui.hud.SubtitlesHud; -import net.minecraft.client.option.SimpleOption; -import net.minecraft.client.sound.SoundInstance; -import net.minecraft.client.sound.WeightedSoundSet; -import net.minecraft.text.Text; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -@Mixin(SubtitlesHud.class) -public class SubtitlesHudMixin { - @WrapOperation(method = "onSoundPlayed", at=@At(value = "INVOKE", target="Lnet/minecraft/client/sound/WeightedSoundSet;getSubtitle()Lnet/minecraft/text/Text;")) - private Text replaceSubtitleText(WeightedSoundSet instance, Operation original, SoundInstance sound) { - return SoundController.CONFIG.areSubtitlesEnabled() ? Text.of(sound.getId()) : original.call(instance); - } - - @WrapOperation( - method = "render", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/client/option/SimpleOption;getValue()Ljava/lang/Object;", - ordinal = 0) // Targets the first getShowSubtitles().getValue() call - ) - private Object modifyFirstShowSubtitlesCheck(SimpleOption instance, Operation original) { - return (Boolean)(original.call(instance)) || SoundController.CONFIG.areSubtitlesEnabled(); - } - - @WrapOperation( - method = "render", - at = @At(value = "INVOKE", - target = "Lnet/minecraft/client/option/SimpleOption;getValue()Ljava/lang/Object;", - ordinal = 1) // Targets the first getShowSubtitles().getValue() call - ) - private Object modifySecondShowSubtitlesCheck(SimpleOption instance, Operation original) { - return (Boolean)(original.call(instance)) || SoundController.CONFIG.areSubtitlesEnabled(); - } -} diff --git a/src/main/resources/soundcontroller.mixins.json b/src/main/resources/soundcontroller.mixins.json index 1b890b6..9e4e37c 100644 --- a/src/main/resources/soundcontroller.mixins.json +++ b/src/main/resources/soundcontroller.mixins.json @@ -4,13 +4,9 @@ "compatibilityLevel": "JAVA_21", "mixins": [], "client": [ - "GameOptionsScreenAccessor", - "GameOptionsScreenMixin", - "ScreenAccessor", - "SoundManagerAccessor", - "SoundSystemAccessor", - "SoundSystemMixin", - "SubtitlesHudMixin" + "OptionsSubScreenMixin", + "SoundEngineMixin", + "SubtitleOverlayMixin" ], "injectors": { "defaultRequire": 1