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)
Comments
No comments yet
Be the first to share your thoughts!