Clients/Client2018/content/internal/AppShell/Modules/Shell/CameraManagerModules/ZoneManager.lua

101 lines
1.9 KiB
Lua

local runService = game:GetService("RunService")
local ZoneAnimator;
do
local animators = {}
local function GetAnimator(zone)
if animators[zone] then
return animators[zone]
end
local moduleScript = script.Parent:WaitForChild("CameraManager_Zones"):FindFirstChild("CameraManagerZone_" .. tostring(zone))
if not moduleScript then
return
end
local animator = require(moduleScript)
animators[zone] = animator
return animator
end
ZoneAnimator = {
CurrentZone = nil;
}
local connection;
function ZoneAnimator:SetZone(zone)
if ZoneAnimator.CurrentZone == zone then
return
end
ZoneAnimator.CurrentZone = zone
if connection then
connection:disconnect()
connection = nil
end
local animator = GetAnimator(zone)
if not animator then
return
end
animator:SetEnabled(true)
connection = {
disconnect = function()
animator:SetEnabled(false)
end
}
end
end
local SkyboxManager;
do
SkyboxManager = {}
local activeSkybox = nil
function SkyboxManager:SetZone(id)
if activeSkybox then
activeSkybox.Parent = nil
activeSkybox:Destroy()
activeSkybox = nil
end
local Skyboxes = game:GetService("ReplicatedStorage"):WaitForChild("Skyboxes")
local skybox = Skyboxes:FindFirstChild(id or "default")
if skybox then
activeSkybox = skybox:Clone()
local lighting = game:GetService("Lighting")
activeSkybox.Parent = lighting
pcall(function()
for k, v in pairs(activeSkybox:GetChildren()) do
lighting[v.Name] = v.Value
end
end)
end
end
end
local ZoneManager = {
Zone = nil;
}
local function setZoneInternal(zone)
ZoneManager.Zone = zone
SkyboxManager:SetZone(zone)
ZoneAnimator:SetZone(zone)
end
function ZoneManager:SetZone(zone)
if zone == ZoneManager.Zone then
return
end
if runService:IsRunning() then
setZoneInternal(zone)
else
spawn(function()
while not runService:IsRunning() do wait() end
setZoneInternal(zone)
end)
end
end
return ZoneManager