local Players = game:GetService("Players") local RunService = game:GetService("RunService") local TweenService = game:GetService("TweenService") local LocalPlayer = Players.LocalPlayer --// GUI SETUP local ScreenGui = Instance.new("ScreenGui", LocalPlayer:WaitForChild("PlayerGui")) ScreenGui.ResetOnSpawn = false local frame = Instance.new("Frame", ScreenGui); frame.Size = UDim2.new(0, 240, 0, 140); frame.Position = UDim2.new(0.05, 0, 0.4, 0); frame.BackgroundColor3 = Color3.fromRGB(10, 10, 10); Instance.new("UICorner", frame) local btn = Instance.new("TextButton", frame); btn.Size = UDim2.new(0.9, 0, 0, 40); btn.Position = UDim2.new(0.05, 0, 0.1, 0); btn.Text = "INITIATE STORM"; btn.BackgroundColor3 = Color3.fromRGB(40, 40, 40); btn.TextColor3 = Color3.new(1, 1, 1); btn.Font = Enum.Font.GothamBold; Instance.new("UICorner", btn) local statusLabel = Instance.new("TextLabel", frame); statusLabel.Size = UDim2.new(0.9, 0, 0, 60); statusLabel.Position = UDim2.new(0.05, 0, 0.5, 0); statusLabel.Text = "Status: Clear"; statusLabel.TextColor3 = Color3.new(1, 0, 0); statusLabel.BackgroundTransparency = 1; statusLabel.TextWrapped = true --// ASSETS local supercell = Instance.new("Part"); supercell.Shape = Enum.PartType.Cylinder; supercell.Color = Color3.fromRGB(15, 15, 20); supercell.Size = Vector3.new(60, 2200, 2200); supercell.Anchored = true; supercell.CanCollide = false local tornado = Instance.new("Part"); tornado.Shape = Enum.PartType.Cylinder; tornado.Color = Color3.fromRGB(20, 20, 20); tornado.Anchored = true; tornado.CanCollide = false; tornado.Transparency = 1 --// SOUNDS (ADDED PER YOUR IDs) local rainSound = Instance.new("Sound", supercell); rainSound.SoundId = "rbxassetid://140078833518611"; rainSound.Looped = true; rainSound.Volume = 0 local tornadoSound = Instance.new("Sound", tornado); tornadoSound.SoundId = "rbxassetid://107570305797094"; tornadoSound.Looped = true; tornadoSound.Volume = 0; tornadoSound.RollOffMaxDistance = 5000 local tornadoPos = Vector3.new(0,0,0) local active = false local startTime = 0 --// LIGHTNING FUNCTION (ADDED PER YOUR ID) local function spawnLightning() local strike = Instance.new("Part", workspace); strike.Color = Color3.new(1, 1, 1); strike.Material = Enum.Material.Neon; strike.Anchored = true; strike.CanCollide = false; strike.Size = Vector3.new(10, 2000, 10); strike.Position = tornadoPos + Vector3.new(math.random(-1000, 1000), 1000, math.random(-1000, 1000)) local s = Instance.new("Sound", strike); s.SoundId = "rbxassetid://108914009221156"; s.Volume = 8; s:Play() TweenService:Create(strike, TweenInfo.new(0.2), {Transparency = 1}):Play(); game.Debris:AddItem(strike, 0.4) end --// SMOOTH MASSIVE EFFECTS local function spawnMassiveEffects(radius, scale) local wind = Instance.new("Part", workspace); wind.Shape = Enum.PartType.Cylinder; wind.Size = Vector3.new(2, radius * 2, radius * 2); wind.Color = Color3.fromRGB(200, 200, 200); wind.Transparency = 0.8; wind.Anchored = true; wind.CanCollide = false wind.CFrame = CFrame.new(tornadoPos + Vector3.new(0, math.random(50, 450), 0)) * CFrame.Angles(0, 0, math.rad(90)) TweenService:Create(wind, TweenInfo.new(1.5), {Transparency = 1, Size = wind.Size * 1.4}):Play() game.Debris:AddItem(wind, 1.5) local deb = Instance.new("Part", workspace); deb.Shape = Enum.PartType.Cylinder; deb.Size = Vector3.new(2, 25 * scale, 25 * scale); deb.Color = Color3.fromRGB(60, 45, 30); deb.Transparency = 0.4; deb.Anchored = true; deb.CanCollide = false local offset = Vector3.new(math.sin(tick()*5) * (radius * 0.98), 10, math.cos(tick()*5) * (radius * 0.98)) deb.CFrame = CFrame.new(tornadoPos + offset) * CFrame.Angles(math.random(), tick()*8, math.rad(90)) TweenService:Create(deb, TweenInfo.new(1.2), {Transparency = 1}):Play() game.Debris:AddItem(deb, 1.2) end btn.MouseButton1Click:Connect(function() active = not active btn.Text = active and "STOP STORM" or "INITIATE STORM" if active and LocalPlayer.Character then startTime = tick() tornadoPos = LocalPlayer.Character.HumanoidRootPart.Position + (LocalPlayer.Character.HumanoidRootPart.CFrame.LookVector * 250) supercell.Parent = workspace; tornado.Parent = workspace supercell.Transparency = 1 rainSound:Play(); tornadoSound:Play() -- START SOUNDS else active = false rainSound:Stop(); tornadoSound:Stop() -- STOP SOUNDS supercell.Parent = nil; tornado.Parent = nil end end) RunService.Heartbeat:Connect(function() if active and LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") then local elapsed = tick() - startTime local h, w, stageScale = 0, 0, 1 local stage = "" -- PERFECT SMOOTH GROWTH & FADE LOGIC if elapsed < 30 then stage = "SUPERCELL FORMING" supercell.Transparency = math.clamp(1 - (elapsed/30), 0, 1) tornado.Transparency = 1 elseif elapsed < 60 then stage = "FUNNEL DESCENDING" tornado.Transparency = 0; supercell.Transparency = 0 local p = (elapsed - 30) / 30 h = 700 * p; w = 45 elseif elapsed < 120 then stage = "CONE TORNADO (STABLE)"; h = 700; supercell.Transparency = 0 local p = (elapsed - 60) / 60 w = 45 + (p * 115) stageScale = 1 + (p * 0.5) elseif elapsed < 180 then stage = "EVOLVING TO WEDGE"; h = 700; supercell.Transparency = 0 local p = (elapsed - 120) / 60 w = 160 + (p * 540) stageScale = 1.5 + (p * 1.5) elseif elapsed < 300 then stage = "MEGA WEDGE ACTIVE"; h = 700; w = 1400; stageScale = 5; supercell.Transparency = 0 tornado.Color = Color3.fromRGB(5, 5, 5) if math.random(1, 40) == 1 then spawnLightning() end -- LIGHTNING DURING MEGA elseif elapsed < 360 then stage = "STORM DISSIPATING" local p = 1 - ((elapsed - 300) / 60) h = 700 * p; w = 1400 * p; stageScale = p * 5 supercell.Transparency = 1 - p else active = false supercell.Parent = nil; tornado.Parent = nil end statusLabel.Text = "Status: " .. stage -- UPDATE VISUALS supercell.CFrame = CFrame.new(tornadoPos + Vector3.new(0, 650, 0)) * CFrame.Angles(0, tick()*0.2, math.rad(90)) tornado.Size = Vector3.new(h, w, w) tornado.CFrame = CFrame.new(tornadoPos + Vector3.new(0, 650 - (h/2), 0)) * CFrame.Angles(0, tick()*4, math.rad(90)) tornadoPos = tornadoPos + Vector3.new(math.sin(tick()*0.2)*0.5, 0, math.cos(tick()*0.1)*0.5) -- SOUND VOLUME SCALING (BASED ON DISTANCE) local dist = (LocalPlayer.Character.HumanoidRootPart.Position - tornadoPos).Magnitude if active then rainSound.Volume = math.clamp(1.5 - (dist/2000), 0, 1.5) tornadoSound.Volume = math.clamp(2.5 - (dist/2000), 0, 3) end -- CALM SCREEN SHAKE (ONLY YOU) if dist < (w/2 + 200) then local intensity = 0.05 + (w/20000) LocalPlayer.Character.Humanoid.CameraOffset = Vector3.new(math.random(-1,1)*intensity, math.random(-1,1)*intensity, math.random(-1,1)*intensity) else LocalPlayer.Character.Humanoid.CameraOffset = Vector3.new(0,0,0) end -- SPAWN DEBRIS if w > 40 and math.random(1,4) == 1 then spawnMassiveEffects(w/2, stageScale) end -- FLING OTHERS (SKIP YOU) local killRadius = w/1.1 for _, plr in pairs(Players:GetPlayers()) do if plr ~= LocalPlayer and plr.Character and plr.Character:FindFirstChild("HumanoidRootPart") then local root = plr.Character.HumanoidRootPart local d = (Vector3.new(tornadoPos.X, root.Position.Y, tornadoPos.Z) - root.Position).Magnitude if d < killRadius then plr.Character.Humanoid.Sit = true local rel = root.Position - tornadoPos local rot = CFrame.Angles(0, math.rad(22), 0) root.CFrame = CFrame.new(tornadoPos + rot * rel + Vector3.new(0, 20, 0), tornadoPos) root.Velocity = (root.CFrame.LookVector * -800) + Vector3.new(0, 9e6, 0) end end end end end)