Had to redo the whole repo, fun fun

This commit is contained in:
Christopher Cookman 2024-10-08 08:58:09 -06:00
commit 4cd0136197
20 changed files with 786 additions and 0 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
old/

BIN
AudioInit.rbxm Normal file

Binary file not shown.

BIN
PagingSystemv1.rbxm Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

17
README.md Normal file
View file

@ -0,0 +1,17 @@
# Paging System
The models used here were created and graciously donated by [Taz Tech](https://www.roblox.com/groups/12396612/Liminal-Existance-Group)
## Legal Stuff
<p xmlns:cc="http://creativecommons.org/ns#" xmlns:dct="http://purl.org/dc/terms/"><span property="dct:title">All Models Used</span> by <a rel="cc:attributionURL dct:creator" property="cc:attributionName" href="https://www.roblox.com/groups/12396612/Liminal-Existance-Group">TazTech/Liminal Existance Group</a> is licensed under <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/?ref=chooser-v1" target="_blank" rel="license noopener noreferrer" style="display:inline-block;">CC BY-NC-SA 4.0<img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;" src="https://mirrors.creativecommons.org/presskit/icons/cc.svg?ref=chooser-v1" alt=""><img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;" src="https://mirrors.creativecommons.org/presskit/icons/by.svg?ref=chooser-v1" alt=""><img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;" src="https://mirrors.creativecommons.org/presskit/icons/nc.svg?ref=chooser-v1" alt=""><img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;" src="https://mirrors.creativecommons.org/presskit/icons/sa.svg?ref=chooser-v1" alt=""></a></p>
Scripts are licensed under GPL-3.0 or later
## Basic Setup
- TODO: Setup instructions.
## AudioInit.rbxm
- This is used to initialize the mic and speaker objects for each player. Place this in StarterCharacterScripts.
## Important Note
- The Audio API Beta needs to be enabled for this to work.
- The UseAudioApi property of VoiceChatService (hidden, enable in Explorer studio settings) needs to be set to Enabled for the microphone to work at all.

172
Scripts/AllZones.lua Normal file
View file

@ -0,0 +1,172 @@
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)

223
Scripts/ButtonLeds.lua Normal file
View file

@ -0,0 +1,223 @@
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 waiting = false
local TweenService = game:GetService("TweenService")
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()
toggleZone(e.Name)
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.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)

View file

@ -0,0 +1,221 @@
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)

152
Scripts/SingleStation.lua Normal file
View file

@ -0,0 +1,152 @@
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)