diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm index 742af92489..142ec8fc93 100644 --- a/code/game/objects/structures/musician.dm +++ b/code/game/objects/structures/musician.dm @@ -1,4 +1,5 @@ +#define MUSICIAN_HEARCHECK_MINDELAY 4 #define MUSIC_MAXLINES 300 #define MUSIC_MAXLINECHARS 50 @@ -16,6 +17,8 @@ var/instrumentDir = "piano" // the folder with the sounds var/instrumentExt = "ogg" // the file extension var/obj/instrumentObj = null // the associated obj playing the sound + var/last_hearcheck = 0 + var/list/hearers /datum/song/New(dir, obj, ext = "ogg") tempo = sanitize_tempo(tempo) @@ -61,10 +64,17 @@ return // and play var/turf/source = get_turf(instrumentObj) - for(var/mob/M in get_hearers_in_view(15, source)) - if(!M.client || !(M.client.prefs.toggles & SOUND_INSTRUMENTS)) - continue - M.playsound_local(source, soundfile, 100, falloff = 5) + if((world.time - MUSICIAN_HEARCHECK_MINDELAY) > last_hearcheck) + hearers = list() + for(var/mob/M in get_hearers_in_view(15, source)) + if(!M.client || !(M.client.prefs.toggles & SOUND_INSTRUMENTS)) + continue + LAZYSET(hearers, M, TRUE) + last_hearcheck = world.time + if(LAZYLEN(hearers)) + for(var/i in hearers) + var/mob/M = hearers[i] + M.playsound_local(source, soundfile, 100, falloff = 5) /datum/song/proc/updateDialog(mob/user) instrumentObj.updateDialog() // assumes it's an object in world, override if otherwise @@ -94,6 +104,7 @@ //to_chat(world, "note: [note]") if(!playing || shouldStopPlaying(user))//If the instrument is playing, or special case playing = FALSE + hearers = null return if(!lentext(note)) continue @@ -125,6 +136,7 @@ else sleep(tempo) repeat-- + hearers = null playing = FALSE repeat = 0 updateDialog(user) @@ -286,6 +298,7 @@ else if(href_list["stop"]) playing = FALSE + hearers = null updateDialog(usr) return