Super-Nostalgia-Zone/Client/HumanoidSound.client.lua

142 lines
3.3 KiB
Lua

local CollectionService = game:GetService("CollectionService")
local RunService = game:GetService("RunService")
local Debris = game:GetService("Debris")
local soundTag = "HumanoidSound"
local soundMounted = CollectionService:GetInstanceAddedSignal(soundTag)
----------------------------------------------------------------------------------------------------
local function deleteSound(sound)
sound.EmitterSize = 0
Debris:AddItem(sound, 0.1)
end
local function setSoundId(soundId, andThen)
return function (sound, humanoid)
sound.SoundId = "rbxasset://sounds/" .. soundId
sound.Pitch = 1
if andThen then
andThen(sound, humanoid)
end
end
end
local function mountSoundToState(sound)
return function (state)
sound.TimePosition = 0
sound.Playing = state
end
end
local function createSound(name, fileName, parent)
local sound = Instance.new("Sound")
sound.SoundId = "rbxasset://sounds/" .. fileName
sound.Parent = parent
sound.Name = name
return sound
end
local function promiseChild(object, name, andThen, ...)
local args = {...}
local callback = coroutine.wrap(function ()
local child = object:WaitForChild(name, 10)
if child then
andThen(child, unpack(args))
end
end)
callback()
end
----------------------------------------------------------------------------------------------------
local soundActions =
{
Splash = deleteSound;
Landing = deleteSound;
Climbing = deleteSound;
Swimming = deleteSound;
FreeFalling = deleteSound;
GettingUp = setSoundId("hit.wav");
Running = setSoundId("bfsl-minifigfoots1.mp3");
Jumping = setSoundId("button.wav", function (jumping, humanoid)
humanoid.Jumping:Connect(function ()
wait(0.1 + (math.random() / 10))
jumping:Stop()
end)
end);
}
local function onSoundMounted(humanoid)
if not humanoid:IsA("Humanoid") then
return
end
local avatar = humanoid.Parent
promiseChild(avatar, "HumanoidRootPart", function (rootPart)
local fallingDown = createSound("FallingDown", "splat.wav", rootPart)
humanoid.FallingDown:Connect(mountSoundToState(fallingDown))
local freeFalling = createSound("FreeFall", "swoosh.wav", rootPart)
humanoid.FreeFalling:Connect(mountSoundToState(freeFalling))
for soundName, soundAction in pairs(soundActions) do
promiseChild(rootPart, soundName, soundAction, humanoid)
end
local mountClimbSound = coroutine.wrap(function ()
local running = rootPart:WaitForChild("Running", 10)
local climbing = avatar:WaitForChild("Climbing", 10)
if not (running and climbing) then
return
end
local function onClimbing(isClimbing)
if not isClimbing then
return
end
while climbing.Value do
if not avatar:IsDescendantOf(workspace) then
break
end
local state = humanoid:GetState()
if state.Name == "Freefall" then
if running.IsPaused then
running:Resume()
end
if freeFalling.IsPlaying then
freeFalling:Stop()
end
end
RunService.Heartbeat:Wait()
end
end
climbing.Changed:Connect(onClimbing)
end)
mountClimbSound()
end)
end
for _,humanoid in pairs(CollectionService:GetTagged(soundTag)) do
onSoundMounted(humanoid)
end
soundMounted:Connect(onSoundMounted)
----------------------------------------------------------------------------------------------------