local system = script.Parent.Parent.Parent local mic = script.Parent.WallMic["Mic Enclosure"].AudioListener local buttons = {} local led = script.Parent.LED local ptt = false pttButton = script.Parent.WallMic["Mic Enclosure"].CD local zones = {} local tones = {} local thisTimeout = nil local TweenService = game:GetService("TweenService") local waiting = false function smoothTransition(startValue, endValue, duration, updateFunction) local finished = false -- Create a temporary NumberValue to tween local numberValue = Instance.new("NumberValue") numberValue.Value = startValue -- Create TweenInfo local tweenInfo = TweenInfo.new( duration, -- Duration of the tween Enum.EasingStyle.Linear, -- Easing style Enum.EasingDirection.InOut, -- Easing direction 0, -- Number of times to repeat false, -- Whether to reverse the tween 0 -- Delay time before starting the tween ) -- Create tween goal local tweenGoal = {Value = endValue} -- Create the tween local tween = TweenService:Create(numberValue, tweenInfo, tweenGoal) -- Connect the update function to the Changed event local connection connection = numberValue.Changed:Connect(function() -- Call the update function with the current value updateFunction(numberValue.Value) end) -- Play the tween tween:Play() -- Cleanup after tween completes tween.Completed:Connect(function() -- Ensure the final value is set to endValue updateFunction(endValue) -- Disconnect the event and remove the NumberValue instance connection:Disconnect() numberValue:Destroy() finished = true end) repeat wait() until finished finished = false end for i, e in ipairs(system.Tones:GetChildren()) do tones[e.Name] = e end for i, e in ipairs(system.Zones:GetChildren()) do zones[e.Name] = e end local zone = zones[script.Parent.Zone.Value] function checkZones() while true do if zone.ZoneInput.Wire.Connected and not ptt then led.Material = Enum.Material.Neon led.Color = Color3.new(1, 0, 0) elseif not ptt then led.Material = Enum.Material.SmoothPlastic led.Color = Color3.new(163/255, 162/255, 165/255) end wait(0) end end function checkReady() local ready = true while true do if ptt then ready = true -- print("checking " .. zone) led.Material = Enum.Material.Neon local thisTone = tones[zone.PageTone.Value] if thisTone.TimeLength == 0 then -- Empty audio, stop playing it thisTone:Stop() end if waiting or thisTone.IsPlaying then led.Color = Color3.new(1, 1, 0) ready = false else led.Color = Color3.new(0, 1, 0) end else ready = false end wait() end end function togglePTT() -- print("toggling ptt") if ptt then ptt = false thisTimeout = nil -- print("off") task.spawn(function() local thisTone = tones[zone.EndTone.Value] zone.ZoneInput.Wire.SourceInstance = thisTone thisTone:Play() wait(thisTone.TimeLength) zone.ZoneInput.Wire.SourceInstance = nil smoothTransition(zone.BGM.Volume, script.Parent.BGMUp.Value, 1, function(value) zone.BGM.Volume = value end) end) else if zone.ZoneInput.Wire.Connected then return end ptt = true task.spawn(function() local thisTone = tones[zone.PageTone.Value] waiting = true smoothTransition(zone.BGM.Volume, script.Parent.BGMDown.Value, 1, function(value) zone.BGM.Volume = value end) waiting = false zone.ZoneInput.Wire.SourceInstance = thisTone thisTone:Play() wait(thisTone.TimeLength) if (ptt) then -- We havent stopped PTT before page tone done, hit it zone.ZoneInput.Wire.SourceInstance = script.Parent.StationOutput thisTimeout = math.random(1, 1000000) task.spawn(function() local myTimeout = tonumber(tostring(thisTimeout)) wait(script.Parent.TimeoutSeconds.Value) if myTimeout == thisTimeout then togglePTT() end end) end end) end end pttButton.MouseClick:Connect(function() togglePTT() end) task.spawn(checkReady) task.spawn(checkZones)