Run it
Copy the script and paste it into your executor.
RunService = :()
PathfindingService = :()
UserInputService = :()
Players = :()
Player = Players.LocalPlayer
TornadoActive =
TornadoModel =
FunnelSegments = {}
CurrentPath = {}
CurrentWaypoint =
Settings = {
EF_Level = ,
WanderSpeed = ,
PhysicsMode = ,
PullStrengthMult = ,
RadiusMult = ,
LiftSpeed = ,
RotationSpeed = ,
DebrisDensity = ,
FunnelTrans = ,
Color_R = ,
Color_G = ,
Color_B = ,
}
EF_STATS = {
[] = {Radius = , Strength = , Height = , Scale = },
[] = {Radius = , Strength = , Height = , Scale = },
[] = {Radius = , Strength = , Height = , Scale = },
[] = {Radius = , Strength = , Height = , Scale = },
[] = {Radius = , Strength = , Height = , Scale = }
}
ScreenGui = .(, Player:())
ScreenGui.Name =
ScreenGui.ResetOnSpawn =
MainFrame = .(, ScreenGui)
MainFrame.Size, MainFrame.Position = .(, , , ), .(, -, , -)
MainFrame.BackgroundColor3 = .(, , )
MainFrame.Active =
.(, MainFrame).CornerRadius = .(, )
.(, MainFrame).Color = .(, , )
dragging, dragInput, dragStart, startPos
MainFrame.InputBegan:((input)
input.UserInputType == .UserInputType.MouseButton1
dragging = dragStart = input.Position startPos = MainFrame.Position
input.Changed:(() input.UserInputState == .UserInputState.End dragging = )
)
MainFrame.InputChanged:((input)
input.UserInputType == .UserInputType.MouseMovement dragInput = input
)
UserInputService.InputChanged:((input)
input == dragInput dragging
delta = input.Position - dragStart
MainFrame.Position = .(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y)
)
Title = .(, MainFrame)
Title.Size, Title.Text = .(, , , ),
Title.Font, Title.TextColor3, Title.TextSize = .Font.GothamBlack, .(,,),
Title.BackgroundTransparency =
TabContainer = .(, MainFrame)
TabContainer.Size, TabContainer.Position = .(, -, , ), .(, , , )
TabContainer.BackgroundTransparency =
TabLayout = .(, TabContainer)
TabLayout.FillDirection, TabLayout.Padding = .FillDirection.Horizontal, .(, )
ContentArea = .(, MainFrame)
ContentArea.Size, ContentArea.Position = .(, -, , -), .(, , , )
ContentArea.BackgroundColor3 = .(, , )
.(, ContentArea)
Tabs = {}
(name)
btn = .(, TabContainer)
btn.Size, btn.Text, btn.BackgroundColor3 = .(, , , ), name, .(, , )
btn.TextColor3, btn.Font, btn.TextSize = .(,,), .Font.GothamBold,
.(, btn)
frame = .(, ContentArea)
frame.Size, frame.BackgroundTransparency = .(, -, , -),
frame.Position = .(, , , )
frame.ScrollBarThickness, frame.Visible = ,
layout = .(, frame)
layout.Padding, layout.HorizontalAlignment = .(, ), .HorizontalAlignment.Center
btn.MouseButton1Click:(()
_, t (Tabs) t.Btn.BackgroundColor3 = .(,,) t.Btn.TextColor3 = .(,,) t.Frame.Visible =
btn.BackgroundColor3 = .(, , )
btn.TextColor3 = .(,,)
frame.Visible =
)
.(Tabs, {Btn = btn, Frame = frame})
frame
TabControl = ()
TabPhysics = ()
TabVisuals = ()
Tabs[].Btn.BackgroundColor3 = .(, , )
Tabs[].Btn.TextColor3 = .(,,)
TabControl.Visible =
(parent, text, settingKey, min, max, step)
row = .(, parent)
row.Size, row.BackgroundTransparency = .(, , , ),
lbl = .(, row)
lbl.Size, lbl.Text, lbl.TextColor3 = .(, , , ), text, .(,,)
lbl.BackgroundTransparency, lbl.Font, lbl.TextXAlignment = , .Font.Gotham, .TextXAlignment.Left
valLbl = .(, row)
valLbl.Size, valLbl.Position, valLbl.Text = .(, , , ), .(, , , ), (Settings[settingKey])
valLbl.BackgroundTransparency, valLbl.TextColor3, valLbl.Font = , .(, , ), .Font.GothamBold
minus = .(, row)
minus.Size, minus.Position, minus.Text, minus.BackgroundColor3 = .(, , , ), .(, , , -), , .(,,)
minus.TextColor3, minus.Font = .(,,), .Font.GothamBold
.(, minus)
plus = .(, row)
plus.Size, plus.Position, plus.Text, plus.BackgroundColor3 = .(, , , ), .(, , , -), , .(,,)
plus.TextColor3, plus.Font = .(,,), .Font.GothamBold
.(, plus)
(change)
Settings[settingKey] = .(Settings[settingKey] + change, min, max)
valLbl.Text = (.(Settings[settingKey]*)/)
settingKey == settingKey == settingKey == settingKey ==
TornadoModel ()
minus.MouseButton1Click:(() (-step) )
plus.MouseButton1Click:(() (step) )
(parent, text, settingKey, options)
row = .(, parent)
row.Size, row.BackgroundTransparency = .(, , , ),
row.ClipsDescendants =
lbl = .(, row)
lbl.Size, lbl.Text, lbl.TextColor3 = .(, , , ), text, .(,,)
lbl.BackgroundTransparency, lbl.Font, lbl.TextXAlignment = , .Font.Gotham, .TextXAlignment.Left
dropBtn = .(, row)
dropBtn.Size, dropBtn.Position, dropBtn.Text = .(, , , ), .(, , , ), Settings[settingKey]
dropBtn.BackgroundColor3, dropBtn.TextColor3 = .(, , ), .(,,)
dropBtn.Font = .Font.GothamBold
.(, dropBtn)
currentIndex =
dropBtn.MouseButton1Click:(()
currentIndex = currentIndex +
currentIndex > #options currentIndex =
Settings[settingKey] = options[currentIndex]
dropBtn.Text = options[currentIndex]
dropBtn.BackgroundColor3 = .(, , )
.()
dropBtn.BackgroundColor3 = .(, , )
)
(parent, text, color, callback)
b = .(, parent)
b.Size, b.BackgroundColor3, b.Text = .(, , , ), color, text
b.Font, b.TextColor3, b.TextSize = .Font.GothamBold, .(,,),
.(, b)
b.MouseButton1Click:(callback)
(TabControl, , .(, , ), () () )
(TabControl, , .(, , ), () () )
(TabControl, , , , , )
(TabControl, , , , , )
(TabPhysics, , , {, })
(TabPhysics, , , , , )
(TabPhysics, , , , , )
(TabPhysics, , , , , )
(TabPhysics, , , , , )
(TabVisuals, , , , , )
(TabVisuals, , , , , )
(TabVisuals, , , , , )
(TabVisuals, , , , , )
(TabVisuals, , , , , )
DebrisEmitter =
()
col = .(Settings.Color_R, Settings.Color_G, Settings.Color_B)
_, data (FunnelSegments)
data.Part.Color = col
data.Part.Transparency = Settings.FunnelTrans
DebrisEmitter
DebrisEmitter.Rate = Settings.DebrisDensity
DebrisEmitter.Color = ColorSequence.(col)
()
TornadoActive
TornadoActive =
TornadoModel = .(, )
Core = .(, TornadoModel)
Core.Anchored, Core.CanCollide, Core.Transparency = , ,
Core.Position = .(, , )
TornadoModel.PrimaryPart = Core
attach = .(, Core)
DebrisEmitter = .(, attach)
DebrisEmitter.Texture =
DebrisEmitter.Size = NumberSequence.({NumberSequenceKeypoint.(, ), NumberSequenceKeypoint.(, )})
DebrisEmitter.Transparency = NumberSequence.(, )
DebrisEmitter.Speed = NumberRange.(, )
DebrisEmitter.Lifetime = NumberRange.(, )
DebrisEmitter.SpreadAngle = .(, )
stats = EF_STATS[Settings.EF_Level]
segments = + (Settings.EF_Level * )
.(()
i = , segments
p = .()
p.Shape, p.Anchored = .PartType.Cylinder,
p.CanCollide, p.CanTouch, p.CanQuery = , ,
p.Material = .Material.SmoothPlastic
ratio = i / segments
width = ( + (ratio ^ ) * ( * stats.Scale))
p.Size = .((stats.Height/segments) * , width, width)
decal = .(, p)
decal.Texture =
decal.Transparency =
p.Parent = TornadoModel
.(FunnelSegments, {Part = p, Height = i * (stats.Height/segments), Speed = * ( - ratio)})
i % == .()
()
)
.(()
TornadoActive
target = Core.Position + .(.(-, ), , .(-, ))
path = PathfindingService:({AgentRadius = , AgentCanJump = })
path:(Core.Position, target)
path.Status == .PathStatus.Success
CurrentPath = path:()
CurrentWaypoint =
.(.(, ))
)
()
TornadoActive =
TornadoModel TornadoModel:()
.(FunnelSegments)
CurrentPath = {}
RunService.Heartbeat:((dt)
TornadoActive TornadoModel TornadoModel.PrimaryPart
t = ()
stats = EF_STATS[Settings.EF_Level]
rootPos = TornadoModel.PrimaryPart.Position
#CurrentPath > CurrentWaypoint <= #CurrentPath
wp = CurrentPath[CurrentWaypoint].Position
targetPos = .(wp.X, rootPos.Y, wp.Z)
diff = targetPos - rootPos
diff.Magnitude < CurrentWaypoint += TornadoModel.PrimaryPart.Position = rootPos + (diff.Unit * Settings.WanderSpeed * dt)
_, data (FunnelSegments)
rot = .(, t * data.Speed * Settings.RotationSpeed, )
wobble = .(.(t* + data.Height)*, , .(t* + data.Height)*)
data.Part.CFrame = .(rootPos + .(, data.Height, ) + wobble) * rot * .(, , .())
params = OverlapParams.()
params.FilterType = .RaycastFilterType.Exclude
params.FilterDescendantsInstances = {TornadoModel, Player.Character}
searchRadius = stats.Radius * Settings.RadiusMult
partsInRadius = :(rootPos, searchRadius, params)
_, p (partsInRadius)
p:() p.Anchored
offset = p.Position - rootPos
currentHeight = p.Position.Y - rootPos.Y
horizontalDist = .(offset.X, , offset.Z).Magnitude
forceMult = stats.Strength * Settings.PullStrengthMult
Settings.PhysicsMode ==
currentHeight > (stats.Height * )
p.AssemblyLinearVelocity = .(.(-, ), , .(-, )).Unit * (stats.Strength * )
tangent = .(-offset.Z, , offset.X).Unit
inward = -.(offset.X, , offset.Z).Unit
upward = .(, * Settings.LiftSpeed, )
p.AssemblyLinearVelocity = (tangent * forceMult) + (inward * (forceMult * )) + (upward * forceMult)
Settings.PhysicsMode ==
currentHeight > (stats.Height * ) .(, ) ==
throwDir = .(.(-, ), .(-, ), .(-, )).Unit
p.AssemblyLinearVelocity = throwDir * (stats.Strength * .(, ))
distPercent = .(horizontalDist / searchRadius, , )
liftPower = - distPercent
liftPower < liftPower =
tangent = .(-offset.Z, , offset.X).Unit
inward = -.(offset.X, , offset.Z).Unit
upward = .(, * Settings.LiftSpeed * liftPower, )
suckForce = inward * (forceMult * ( - distPercent))
p.AssemblyLinearVelocity = (tangent * forceMult) + suckForce + (upward * forceMult)
)an actual tornado not any ring parts script an actual tornado (may bug sometimes and it makes you bounce sometimes, and could also lag your game)

Universal