Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

[SOLVED]How to do area based sound with radios?

Asked by 4 years ago
Edited 4 years ago

Hey guys! I'm working on a new project for a guy, and he wants to have area based sound, but with a way for there to be some sort of a boombox. This question will mainly be asking about ideas and optional solutions to this potentially complex issue.


The first thing I had to address was the fact that sounds play on every client if they are played from one client. Thankfully, there's this simple solution:

local sound_service = game:GetService("SoundService")
sound_service.RespectFilteringEnabled = true

Next, I decided every sound would be client side except for boombox sounds. First, I ran into the problem of deciding how to do areas. Region3 is an idea, but I figured it'd be more ideal to just have transparent and non-cancollide parts as the areas and detect when a touch began and ended on the client. Basically, the idea is that there will be a table with whatever elements of the player that have touched the sound area. Then, when the TouchEnded event fires, I'll remove the associated object from the table. This isn't as simple as Region3s, but it makes it easier on the dev that I'm working for to maneuver the areas around. If you have any suggestions on how to make this better, just let me know.


Anyway, I was wondering if there was an efficient way of detecting if a server side (aka a boombox) sound gets in range. I could fire a remote to every client telling them when a boombox turns on so that they can specifically check to see if that player gets in range, but that still seems rather inefficient, especially if there are multiple people with boomboxes on. Is there an event to tell me if a player is in range of a sound (I certainly couldn't find one)? If I wanted to just do the most inefficient method, then I could do something like this:

local players = game:GetService("Players")
local music_play_distance = 1000

while true do

    local player_array = players:GetPlayers()

    for i = 1, #player_array do

        local player_to_check = player_array[i]

        if player_to_check ~= player then

            local boom_box_is_active = player:FindFirstChild("Boom_Box_Is_Active")

            if boom_box_is_active and boom_box_is_active.Value then

                local character = player_to_check.Character or player_to_check.PlayerAdded:Wait()
                local root_part = character:WaitForChild("HumanoidRootPart")

                if player:DistanceFromCharacter(root_part.Position) < music_play_distance then
                    -- function to fade out area music is called
                end

            end

        end

    end

    wait(0.5)

end

but again, I feel like there's a better solution. Any suggestions are immensely appreciated.


Finally, I come to one of the two main problems I encountered when working on this project (the first being the detection of sound / when to play what sound). Sounds don't start immediately when you call the Play method on them even if their IsLoaded property is set to true. You can read more about that here. The time delay before a song plays appears to be arbitrary, so merging songs into other songs seems to be nigh on impossible, but games like MinersHaven seem to have pulled it off. Songs should be able to be easily merged into each other as a player moves around the map and perhaps encounters someone with a boombox.


Any recommendations/ideas/suggestions are immensely appreciated. Thank you for taking the time to read this. If you have any additional questions/comments, please post them in the comments below.

0
MAGNITUDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE greatneil80 2647 — 4y

1 answer

Log in to vote
0
Answered by 4 years ago

The solution I found to this problem was relatively simple, yet hard to find. What I did was I had all the area songs playing on the client at the same time, but the volume turned to zero. Also, when a different player turned on a radio, I had it add that song to the playing songs on the client, but muted it. I had a table for all the tween objects for fading the volume in and out for each song that was playing on the client. When the player got within a certain range of another player, the radio song would have its volume tweened on and the area music would have its volume tweened off. If no players were in range, the area music would then be turned on. The area detection system was just me checking if a player's position was within certain bounds (because part collision detection wasn't the best idea, considering the size of areas I'd be encountering). There were some other things I had to work around, but what I just explained was the backbone of the whole structure.

Ad

Answer this question