diff --git a/Parts/TazTech/SingleZoneStation.rbxm b/Parts/TazTech/SingleZoneStation.rbxm index 4d14ef9..9c7f91a 100644 Binary files a/Parts/TazTech/SingleZoneStation.rbxm and b/Parts/TazTech/SingleZoneStation.rbxm differ diff --git a/Parts/TazTech/Station.rbxm b/Parts/TazTech/Station.rbxm index f9deb1a..696ebef 100644 Binary files a/Parts/TazTech/Station.rbxm and b/Parts/TazTech/Station.rbxm differ diff --git a/Scripts/ButtonLeds.lua b/Scripts/ButtonLeds.lua new file mode 100644 index 0000000..ac9c0d9 --- /dev/null +++ b/Scripts/ButtonLeds.lua @@ -0,0 +1,215 @@ +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") + +function smoothTransition(startValue, endValue, duration, updateFunction) + -- 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() + end) +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 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] + smoothTransition(zones[e.Name].BGM.Volume, script.Parent.BGMDown.Value, 1, function(value) + zones[e.Name].BGM.Volume = value + end) + 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.Buttons: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) \ No newline at end of file diff --git a/Scripts/SeparateLEDsStation.lua b/Scripts/SeparateLEDsStation.lua new file mode 100644 index 0000000..8c33ff6 --- /dev/null +++ b/Scripts/SeparateLEDsStation.lua @@ -0,0 +1,215 @@ +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") + +function smoothTransition(startValue, endValue, duration, updateFunction) + -- 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() + end) +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 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] + smoothTransition(zones[e.Name].BGM.Volume, script.Parent.BGMDown.Value, 1, function(value) + zones[e.Name].BGM.Volume = value + end) + 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) \ No newline at end of file