Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
11 changes: 5 additions & 6 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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
fabric_version=0.139.4+1.21.11
20 changes: 10 additions & 10 deletions src/main/java/com/bvengo/soundcontroller/Translations.java
Original file line number Diff line number Diff line change
@@ -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) {
Expand Down
10 changes: 3 additions & 7 deletions src/main/java/com/bvengo/soundcontroller/Utils.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
18 changes: 9 additions & 9 deletions src/main/java/com/bvengo/soundcontroller/VolumeData.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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);
Expand All @@ -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));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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);
}
}
19 changes: 9 additions & 10 deletions src/main/java/com/bvengo/soundcontroller/config/VolumeConfig.java
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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));
}
}
Expand All @@ -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);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;

Expand All @@ -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() {
Expand All @@ -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() {
Expand All @@ -89,63 +88,63 @@ 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);
});
}

@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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<VolumeWidgetEntry> {
public class VolumeListWidget extends ContainerObjectSelectionList<VolumeWidgetEntry> {
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;
}
Expand Down
Loading
Loading