local system = script.Parent.Parent.Parent local zones = {} 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 tones = {} local thisTimeout = nil local systemReady = true local systemOverride = script.Parent.override.Value 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 function checkZones() while true do systemReady = true for i,e in pairs(zones) do if e.ZoneInput.Wire.Connected then if not systemOverride then systemReady = false end end end if not ptt then if not systemReady then led.Material = Enum.Material.Neon led.Color = Color3.new(1,0,0) else led.Material = Enum.Material.SmoothPlastic led.Color = Color3.new(202/255, 203/255, 209/255) end end wait(0) end end function checkReady() while true do ready = true for i,e in pairs(zones) do local thisTone = tones[e.PageTone.Value] if thisTone.TimeLength == 0 then -- Empty audio, stop playing it thisTone:Stop() end if thisTone.IsPlaying or waiting then ready = false end end if ready and ptt then -- set led to green led.Material = Enum.Material.Neon led.Color = Color3.new(0,1,0) elseif ptt then -- set led to solid yellow led.Material = Enum.Material.Neon led.Color = Color3.new(1,1,0) end wait() end end function togglePTT() print(ready) print("toggling ptt") if ptt then ptt = false print("off") thisTimeout = nil for i,e in pairs(zones) do task.spawn(function() local thisTone = tones[zones[e.Name].EndTone.Value] zones[e.Name].ZoneInput.Wire.SourceInstance = thisTone thisTone:Play() wait(thisTone.TimeLength) zones[e.Name].ZoneInput.Wire.SourceInstance = nil smoothTransition(zones[e.Name].BGM.Volume,script.Parent.BGMUp.Value, 1, function(value) zones[e.Name].BGM.Volume = value end) end) end else if not systemReady then return end ptt = true for i,e in pairs(zones) do task.spawn(function() local thisTone = tones[zones[e.Name].PageTone.Value] waiting = true smoothTransition(zones[e.Name].BGM.Volume, script.Parent.BGMDown.Value, 1, function(value) zones[e.Name].BGM.Volume = value end) waiting = false zones[e.Name].ZoneInput.Wire.SourceInstance = thisTone thisTone:Play() wait(thisTone.TimeLength) if(ptt) then -- We havent stopped PTT before page tone done, hit it zones[e.Name].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 end pttButton.MouseClick:Connect(function() togglePTT() end) for i,e in ipairs(system.Zones:GetChildren()) do zones[e.Name] = e end for i,e in ipairs(system.Tones:GetChildren()) do tones[e.Name] = e end task.spawn(checkZones) task.spawn(checkReady)