local SETTINGS = {
-- lightning
LIGHTNING_VOL = 0.5,
LIGHTNING_INTERVAL = {10, 15}, -- 10 min sec 15 max sec
-- main *rain*
RAIN_DENSITY = 8,
RAIN_DISTANCE = 125,
RAIN_HEIGHT = 60,
RAIN_FALL_SPEED = -120,
-- global sounds
GLOBAL_SOUND_VOL = 0.1,
}
local Lighting = game:GetService("Lighting")
local RunService = game:GetService("RunService")
local Players = game:GetService("Players")
local TweenService = game:GetService("TweenService")
local player = Players.LocalPlayer
local camera = workspace.CurrentCamera
-- ids
local SKY_ID = "rbxassetid://93362504723753"
local RAIN_SOUND_ID = "rbxassetid://9064263922"
local LIGHTNING_SOUND_ID = "rbxassetid://139968319088532"
-- create visual flash effect
local colorCorrection = Instance.new("ColorCorrectionEffect")
colorCorrection.Name = "LightningFlash_FX"
colorCorrection.Brightness = 0
colorCorrection.Parent = Lighting
-- 1. environment cleanup
local function purgeEnvironment()
for _, obj in pairs(Lighting:GetChildren()) do
if (obj:IsA("Sky") or obj:IsA("Atmosphere") or obj:IsA("Clouds")) and obj.Name ~= "LightningFlash_FX" then
obj:Destroy()
end
end
Lighting.Brightness = 0.2
Lighting.OutdoorAmbient = Color3.fromRGB(50, 50, 60)
Lighting.ClockTime = 18
end
-- 2. lightning strike logic
local function strikeLightning(soundObj)
soundObj.Volume = SETTINGS.LIGHTNING_VOL
soundObj:Play()
-- Screen Flash
colorCorrection.Brightness = 0.8
local fadeTween = TweenService:Create(colorCorrection, TweenInfo.new(0.5, Enum.EasingStyle.Quad, Enum.EasingDirection.Out), {Brightness = 0})
fadeTween:Play()
end
-- 3. sound setup
local rainSound = Instance.new("Sound", camera)
rainSound.SoundId = RAIN_SOUND_ID
rainSound.Volume = 0.5
rainSound.Looped = true
rainSound:Play()
task.spawn(function()
local lightningSound = Instance.new("Sound", camera)
lightningSound.SoundId = LIGHTNING_SOUND_ID
while true do
local waitTime = math.random(SETTINGS.LIGHTNING_INTERVAL[1], SETTINGS.LIGHTNING_INTERVAL[2])
task.wait(waitTime)
strikeLightning(lightningSound)
end
end)
-- 4. global audio mixer
local function mix()
for _, s in pairs(game:GetDescendants()) do
if s:IsA("Sound") and s ~= rainSound then
s.Volume = SETTINGS.GLOBAL_SOUND_VOL
end
end
end
game.DescendantAdded:Connect(function(d)
if d:IsA("Sound") and d ~= rainSound then
d.Volume = SETTINGS.GLOBAL_SOUND_VOL
end
end)
-- 5. rain spawner
local folder = Instance.new("Folder", camera)
local function spawnDrop()
local char = player.Character
local root = char and char:FindFirstChild("HumanoidRootPart")
if not root then return end
local dist = SETTINGS.RAIN_DISTANCE
local drop = Instance.new("Part")
drop.Size = Vector3.new(0.06, 7, 0.06)
drop.Color = Color3.fromRGB(180, 180, 200)
drop.Transparency = 0.7
drop.Material = Enum.Material.Neon
drop.CanCollide, drop.CanQuery, drop.CastShadow = false, false, false
-- position based on settings
local spawnPos = root.Position + Vector3.new(math.random(-dist, dist), SETTINGS.RAIN_HEIGHT, math.random(-dist, dist))
drop.CFrame = CFrame.new(spawnPos)
drop.AssemblyLinearVelocity = Vector3.new(0, SETTINGS.RAIN_FALL_SPEED, 0)
drop.Parent = folder
task.delay(1.1, function() drop:Destroy() end)
end
-- execution
purgeEnvironment()
mix()
RunService.RenderStepped:Connect(function()
for i = 1, SETTINGS.RAIN_DENSITY do
spawnDrop()
end
end)
print("rain loaded by fartioso" .. SETTINGS.LIGHTNING_VOL)