local system = script.Parent.Parent.Parent local zones = {} local mic = script.Parent["Panel Mic"].mic.AudioListener local buttons = {} local leds = {} local ptt = false pttButton = script.Parent["Panel Mic"].mic.CD local selectedZones = {} 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 function toggleZone(zoneNumber) if ptt then return end -- We're transmitting, don't toggle zones if selectedZones[zoneNumber] then selectedZones[zoneNumber] = nil leds[zoneNumber].Color = Color3.new(202/255, 203/255, 209/255) leds[zoneNumber].Material = Enum.Material.SmoothPlastic else if zones[zoneNumber].ZoneInput.Wire.Connected then -- Nothing, in use else selectedZones[zoneNumber] = zones[zoneNumber] end end end function flashSelected() local state = false while true do while not ptt do for i,e in pairs(selectedZones) do if state then leds[i].Material = Enum.Material.SmoothPlastic leds[i].Color = Color3.new(202/255, 203/255, 209/255) else leds[i].Material = Enum.Material.Neon leds[i].Color = Color3.new(1,1,0) end end state = not state wait(.2) end wait() end end function checkZones() while true do for i,e in pairs(leds) do if not selectedZones[e.Name] then if zones[e.Name].ZoneInput.Wire.Connected then e.Material = Enum.Material.Neon e.Color = Color3.new(1,0,0) else e.Material = Enum.Material.SmoothPlastic e.Color = Color3.new(202/255, 203/255, 209/255) end elseif not ptt and selectedZones[e.Name] and zones[e.Name].ZoneInput.Wire.Connected then -- Someone else took the zone, drop it from selections toggleZone(e.Name) end end wait(0) end end function checkReady() local ready = true while true do if ptt then ready = true for i,e in pairs(selectedZones) do print("checking " .. e.Name) leds[e.Name].Material = Enum.Material.Neon local thisTone = tones[e.PageTone.Value] if thisTone.TimeLength == 0 then -- Empty audio, stop playing it thisTone:Stop() end if waiting or thisTone.IsPlaying then leds[e.Name].Color = Color3.new(1,1,0) ready = false else leds[e.Name].Color = Color3.new(0,1,0) end end else ready = false end wait() end end function togglePTT() print("toggling ptt") if ptt then ptt = false print("off") thisTimeout = nil for i,e in pairs(selectedZones) 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 local ready = false for i,e in pairs(selectedZones) do ready = true print("we have a zone, continue") end if not ready then return end ptt = true for i,e in pairs(selectedZones) 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 for i,e in ipairs(script.Parent.Buttons:GetChildren()) do buttons[e.Name] = e print("Adding button " .. e.Name) e.CD.MouseClick:Connect(function() toggleZone(e.Name) print("button pressed " .. e.Name) end) end pttButton.MouseClick:Connect(function() togglePTT() end) for i,e in ipairs(script.Parent.Leds:GetChildren()) do leds[e.Name] = e 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(flashSelected) task.spawn(checkReady)