From b1ee40b157f79bf957ff3ab104296c3b8bf50142 Mon Sep 17 00:00:00 2001 From: LT3 <83487515+lessthnthree@users.noreply.github.com> Date: Sat, 5 Apr 2025 13:27:05 -0700 Subject: [PATCH] Jukebox volume fixes (#90417) ## About The Pull Request - Fixes jukebox volume reverting to 100% instead of preference setting when adjusted at the jukebox. - Fixes jukebox volume preference not applying to active jukebox music track - Splits jukebox and instrument into two different preferences. ## Why It's Good For The Game The jukebox volume correctly updates and remains at what the player sets. ## Changelog :cl: LT3 fix: Jukebox volume preference applies to currently playing music fix: Jukebox volume no longer resets to 100% when adjusted from the object /:cl: --- code/__DEFINES/dcs/signals/signals_music.dm | 5 +++++ code/datums/components/jukebox.dm | 16 ++++++++++++---- code/modules/client/preferences/sounds.dm | 13 ++++++++++--- .../features/game_preferences/sounds.tsx | 7 +++++++ 4 files changed, 34 insertions(+), 7 deletions(-) diff --git a/code/__DEFINES/dcs/signals/signals_music.dm b/code/__DEFINES/dcs/signals/signals_music.dm index 2f15f4e6322..107a2bff02a 100644 --- a/code/__DEFINES/dcs/signals/signals_music.dm +++ b/code/__DEFINES/dcs/signals/signals_music.dm @@ -10,3 +10,8 @@ #define COMSIG_INSTRUMENT_REPEAT "instrument_repeat" ///sent to the instrument when tempo changes, skipped on new. (datum/song) #define COMSIG_INSTRUMENT_TEMPO_CHANGE "instrument_tempo_change" + +// /datum/jukebox signals + +///sent to the jukebox when the volume preference is changed and applied +#define COMSIG_MOB_JUKEBOX_PREFERENCE_APPLIED "jukebox_pref_applied" diff --git a/code/datums/components/jukebox.dm b/code/datums/components/jukebox.dm index f5593e1ab0f..7e9f9657134 100644 --- a/code/datums/components/jukebox.dm +++ b/code/datums/components/jukebox.dm @@ -100,7 +100,7 @@ var/datum/track/new_track = new() new_track.song_path = file("[global.config.directory]/jukebox_music/sounds/[track_file]") var/list/track_data = splittext(track_file, "+") - if(length(track_data) != 3) + if(length(track_data) < 3) continue new_track.song_name = track_data[1] new_track.song_length = text2num(track_data[2]) @@ -215,9 +215,9 @@ RegisterSignal(new_listener, COMSIG_MOB_LOGIN, PROC_REF(listener_login)) return - RegisterSignal(new_listener, COMSIG_MOVABLE_MOVED, PROC_REF(listener_moved)) + RegisterSignals(new_listener, list(COMSIG_MOVABLE_MOVED, COMSIG_MOB_JUKEBOX_PREFERENCE_APPLIED), PROC_REF(listener_moved)) RegisterSignals(new_listener, list(SIGNAL_ADDTRAIT(TRAIT_DEAF), SIGNAL_REMOVETRAIT(TRAIT_DEAF)), PROC_REF(listener_deaf)) - var/pref_volume = new_listener.client?.prefs.read_preference(/datum/preference/numeric/volume/sound_instruments) + var/pref_volume = new_listener.client?.prefs.read_preference(/datum/preference/numeric/volume/sound_jukebox) if(HAS_TRAIT(new_listener, TRAIT_DEAF) || !pref_volume) listeners[new_listener] |= SOUND_MUTE @@ -280,7 +280,7 @@ if((reason & MUTE_DEAF) && HAS_TRAIT(listener, TRAIT_DEAF)) return FALSE - var/pref_volume = listener.client?.prefs.read_preference(/datum/preference/numeric/volume/sound_instruments) + var/pref_volume = listener.client?.prefs.read_preference(/datum/preference/numeric/volume/sound_jukebox) if((reason & MUTE_PREF) && !pref_volume) return FALSE @@ -309,6 +309,7 @@ COMSIG_MOB_LOGIN, COMSIG_QDELETING, COMSIG_MOVABLE_MOVED, + COMSIG_MOB_JUKEBOX_PREFERENCE_APPLIED, SIGNAL_ADDTRAIT(TRAIT_DEAF), SIGNAL_REMOVETRAIT(TRAIT_DEAF), )) @@ -342,6 +343,13 @@ active_song_sound.x = new_x active_song_sound.z = new_z + var/pref_volume = listener.client?.prefs.read_preference(/datum/preference/numeric/volume/sound_jukebox) + if(!pref_volume) + listeners[listener] |= SOUND_MUTE + else + unmute_listener(listener, MUTE_PREF) + active_song_sound.volume = volume * (pref_volume/100) + SEND_SOUND(listener, active_song_sound) /// When the jukebox moves, we need to update all listeners. diff --git a/code/modules/client/preferences/sounds.dm b/code/modules/client/preferences/sounds.dm index 9a5b15e34cd..febb1f46af6 100644 --- a/code/modules/client/preferences/sounds.dm +++ b/code/modules/client/preferences/sounds.dm @@ -38,9 +38,16 @@ savefile_key = "sound_instruments" savefile_identifier = PREFERENCE_PLAYER -/datum/preference/numeric/volume/sound_instruments/apply_to_client_updated(client/client, value) - if (!value) - client.mob.stop_sound_channel(CHANNEL_JUKEBOX) +/// Controls jukebox track volume +/datum/preference/numeric/volume/sound_jukebox + category = PREFERENCE_CATEGORY_GAME_PREFERENCES + savefile_key = "sound_jukebox" + savefile_identifier = PREFERENCE_PLAYER + +/datum/preference/numeric/volume/sound_jukebox/apply_to_client_updated(client/client, value) + var/mob/client_mob = client.mob + if(!isnull(client_mob)) + SEND_SIGNAL(client_mob, COMSIG_MOB_JUKEBOX_PREFERENCE_APPLIED) /datum/preference/choiced/sound_tts category = PREFERENCE_CATEGORY_GAME_PREFERENCES diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/sounds.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/sounds.tsx index e6982af7b58..9c265179d5e 100644 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/sounds.tsx +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/sounds.tsx @@ -56,6 +56,13 @@ export const sound_instruments: Feature = { component: FeatureSliderInput, }; +export const sound_jukebox: Feature = { + name: 'Jukebox volume', + category: 'SOUND', + description: 'Volume of jukebox tracks.', + component: FeatureSliderInput, +}; + export const sound_tts: FeatureChoiced = { name: 'Enable TTS', category: 'SOUND',