Super-Nostalgia-Zone/Client/Sky/init.client.lua

160 lines
4.3 KiB
Lua

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Services
local Lighting = game:GetService("Lighting")
local RunService = game:GetService("RunService")
local TeleportService = game:GetService("TeleportService")
local UserInputService = game:GetService("UserInputService")
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Sky Colors
local midnight = 0
local day = 86400
local hour = day / 24
local sunRise = day * .25
local sunSet = day * .75
local riseAndSetTime = hour / 2
local times =
{
midnight;
sunRise - hour;
sunRise - riseAndSetTime;
sunRise;
sunRise + riseAndSetTime;
sunSet - riseAndSetTime;
sunSet;
sunSet + (hour/3);
day;
}
local colors =
{
Color3.new();
Color3.new();
Color3.new(.2, .15, .01);
Color3.new(.2, .15, .01);
Color3.new(1, 1, 1);
Color3.new(1, 1, 1);
Color3.new(.4, .2, .05);
Color3.new();
Color3.new();
}
local function linearSpline(x, times, values)
assert(#times == #values)
if #values == 1 or x < times[1] then
return values[1]
end
for i = 2, #times do
if x < times[i] then
local alpha = (times[i] - x) / (times[i] - times[i - 1])
return values[i - 1]:lerp(values[i], 1 - alpha)
end
end
return values[#values]
end
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
local function r()
return -1 + (math.random() * 2)
end
local lastTime = 0
local camera = workspace.CurrentCamera
local skyAdorn = script:WaitForChild("SkyAdorn")
local night = skyAdorn:WaitForChild("Night")
local nightFrame = night:WaitForChild("NightFrame")
local star = script:WaitForChild("Star")
local shadowsOn = true
local black = Color3.new()
local toneMap do
toneMap = Instance.new("ColorCorrectionEffect")
toneMap.TintColor = Color3.new(1.25, 1.25, 1.25)
toneMap.Name = "LegacyToneMap"
toneMap.Brightness = 0.03
toneMap.Saturation = 0.07
toneMap.Contrast = -0.15
toneMap.Parent = Lighting
if Lighting.Ambient ~= black then
Lighting.OutdoorAmbient = Lighting.Ambient
Lighting.Ambient = black:Lerp(Lighting.Ambient, 0.5)
end
Lighting.GlobalShadows = true
Lighting.ShadowSoftness = 0.1
end
for i = 1, 3000 do
local bb = star:Clone()
local size = math.random(2, 6) / 2
bb.StudsOffsetWorldSpace = Vector3.new(r(), r(), r()).Unit * 2500
bb.Star.Transparency = (math.random(1, 4) - 1) / 4
-- bb.Size = UDim2.new(0, size, 0, size)
bb.Adornee = skyAdorn
bb.Parent = skyAdorn
end
local function updateSky()
local shadowState = TeleportService:GetTeleportSetting("StencilShadows")
if shadowState == nil then
TeleportService:SetTeleportSetting("StencilShadows", true)
shadowState = true
end
if shadowState ~= shadowsOn then
shadowsOn = shadowState
if shadowsOn then
local black = Color3.new()
Lighting.GlobalShadows = true
Lighting.Ambient = black:Lerp(Lighting.OutdoorAmbient, 0.5)
else
Lighting.GlobalShadows = false
Lighting.Ambient = Lighting.OutdoorAmbient
end
end
local sunDir = Lighting:GetSunDirection()
local globalLight = math.clamp((sunDir.Y + .033) * 10, 0, 1)
toneMap.Contrast = -0.15 * globalLight
toneMap.Saturation = 0.07 * globalLight
if TeleportService:GetTeleportSetting("ClassicSky") then
local camera = workspace.CurrentCamera
local seconds = Lighting:GetMinutesAfterMidnight() * 60
if seconds < 0 then
seconds = day + seconds
end
if seconds ~= lastTime then
local sunDir = game.Lighting:GetSunDirection()
local skyColor = linearSpline(seconds, times, colors)
nightFrame.BackgroundTransparency = globalLight
nightFrame.BackgroundColor3 = skyColor
lastTime = seconds
end
skyAdorn.CFrame = CFrame.new(camera.CFrame.Position) * CFrame.new(Vector3.new(), sunDir)
skyAdorn.Parent = (nightFrame.BackgroundTransparency < 1 and camera or nil)
else
skyAdorn.Parent = nil
end
end
RunService:BindToRenderStep("UpdateSky", 1000, updateSky)
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------