Run it
Copy the script and paste it into your executor.
Players = :()
RunService = :()
LocalPlayer = Players.LocalPlayer
Character = LocalPlayer.Character LocalPlayer.CharacterAdded:()
RootPart = Character:()
ID_SOM =
(config)
ALCANCE_SUCCAO = config.AlcanceSuccao
FORCA_PUXAO = config.ForcaPuxao
VELOCIDADE_TORNADO = config.Velocidade
ALTURA_NUVENS = config.AlturaNuvens
DISTANCIA_SPAWN = config.DistanciaSpawn
LARGURA_BASE = config.LarguraBase
LARGURA_TOPO = config.LarguraTopo
QTD_BLOCOS = config.QtdBlocos
posicaoInicial = RootPart.CFrame * .(, , -DISTANCIA_SPAWN)
baseTornado = .()
baseTornado.Name = config.Nome
baseTornado.Size = .(, , )
baseTornado.CFrame = .(posicaoInicial.Position)
baseTornado.Anchored =
baseTornado.CanCollide =
baseTornado.Transparency =
baseTornado.Parent =
somTornado = .()
somTornado.Name =
somTornado.SoundId = ID_SOM
somTornado.Volume = config.Volume
somTornado.Looped =
somTornado.RollOffMaxDistance = config.DistanciaSom
somTornado.RollOffMinDistance =
somTornado.Parent = baseTornado
somTornado:()
nuvemSky = .()
nuvemSky.Size = .(, , )
nuvemSky.Anchored =
nuvemSky.CanCollide =
nuvemSky.Transparency =
nuvemSky.CFrame = baseTornado.CFrame * .(, ALTURA_NUVENS, )
nuvemSky.Parent =
attachmentNuvem = .(, nuvemSky)
emissorNuvem = .(, attachmentNuvem)
emissorNuvem.Texture =
emissorNuvem.Rate = config.TaxaFumaca
emissorNuvem.Lifetime = NumberRange.(, )
emissorNuvem.Speed = NumberRange.(, )
emissorNuvem.SpreadAngle = .(, )
emissorNuvem.Color = ColorSequence.(.(, , ))
emissorNuvem.Size = NumberSequence.({
NumberSequenceKeypoint.(, ),
NumberSequenceKeypoint.(, ),
NumberSequenceKeypoint.(, )
})
emissorNuvem.Transparency = NumberSequence.({
NumberSequenceKeypoint.(, ),
NumberSequenceKeypoint.(, ),
NumberSequenceKeypoint.(, )
})
emissorChuva = .(, attachmentNuvem)
emissorChuva.Texture =
emissorChuva.Rate =
emissorChuva.Lifetime = NumberRange.(, )
emissorChuva.Speed = NumberRange.(, )
emissorChuva.EmissionDirection = .NormalId.Bottom
emissorChuva.Acceleration = .(, -, )
emissorChuva.Orientation = .ParticleOrientation.VelocityParallel
emissorChuva.SpreadAngle = .(, )
emissorChuva.Color = ColorSequence.(.(, , ))
emissorChuva.Size = NumberSequence.({
NumberSequenceKeypoint.(, ),
NumberSequenceKeypoint.(, )
})
emissorChuva.Transparency = NumberSequence.({
NumberSequenceKeypoint.(, ),
NumberSequenceKeypoint.(, )
})
attachmentBase = .(, baseTornado)
fumacaCorpo = .(, attachmentBase)
fumacaCorpo.Texture =
fumacaCorpo.Rate = config.TaxaFumaca
fumacaCorpo.Lifetime = NumberRange.(, )
fumacaCorpo.Speed = NumberRange.(, )
fumacaCorpo.SpreadAngle = .(, )
fumacaCorpo.Acceleration = .(, , )
fumacaCorpo.Color = ColorSequence.(.(, , ))
fumacaCorpo.Size = NumberSequence.({
NumberSequenceKeypoint.(, LARGURA_BASE),
NumberSequenceKeypoint.(, LARGURA_TOPO * ),
NumberSequenceKeypoint.(, LARGURA_TOPO)
})
fumacaCorpo.RotSpeed = NumberRange.(, )
blocosVoadores = {}
i = , QTD_BLOCOS
bloco = .()
bloco.Size = .(, , )
bloco.Color = .(, , )
bloco.Material = .Material.Wood
bloco.Anchored =
bloco.CanCollide =
bloco.Parent =
.(blocosVoadores, {
Objeto = bloco,
Altura = .(, ),
Angulo = .(, ),
RaioGiro = .(, )
})
()
.(
baseTornado.Position.X + .(-, ),
posicaoInicial.Position.Y,
baseTornado.Position.Z + .(-, )
)
destinoAtual = ()
tempoSegurando =
noTornado =
cooldownArremesso =
anguloJogador =
conexao = RunService.RenderStepped:((dt)
baseTornado baseTornado.Parent
direcao = (destinoAtual - baseTornado.Position)
direcao.Magnitude <
destinoAtual = ()
proximaPosicao = baseTornado.Position + (direcao.Unit * VELOCIDADE_TORNADO * dt)
baseTornado.CFrame = .(proximaPosicao)
nuvemSky.CFrame = baseTornado.CFrame * .(, ALTURA_NUVENS, )
_, dados (blocosVoadores)
dados.Angulo = dados.Angulo + ( * dt)
dados.Altura = dados.Altura + ( * dt)
dados.Altura > dados.Altura =
raio = (dados.Altura / ) * dados.RaioGiro +
x = .(dados.Angulo) * raio
z = .(dados.Angulo) * raio
dados.Objeto.CFrame = .(baseTornado.Position + .(x, dados.Altura, z))
RootPart Character:()
posCentro = .(baseTornado.Position.X, , baseTornado.Position.Z)
posJogador = .(RootPart.Position.X, , RootPart.Position.Z)
distancia = (posJogador - posCentro).Magnitude
cooldownArremesso >
cooldownArremesso = cooldownArremesso - dt
distancia <= ALCANCE_SUCCAO noTornado
noTornado =
tempoSegurando = tempoSegurando + dt
anguloJogador = anguloJogador + ( * dt)
tempoSegurando <
raioGiro = (LARGURA_BASE > )
offsetX = .(anguloJogador) * raioGiro
offsetZ = .(anguloJogador) * raioGiro
alvoX = baseTornado.Position.X + offsetX
alvoZ = baseTornado.Position.Z + offsetZ
RootPart.AssemblyLinearVelocity = .(
(alvoX - RootPart.Position.X) * FORCA_PUXAO,
,
(alvoZ - RootPart.Position.Z) * FORCA_PUXAO
)
direcaoFora = (RootPart.Position - baseTornado.Position).Unit
direcaoFora.Magnitude ==
direcaoFora = .(.(-,), , .(-,)).Unit
forcaArremesso = (LARGURA_BASE > )
RootPart.AssemblyLinearVelocity = (direcaoFora * forcaArremesso) + .(, , )
noTornado =
tempoSegurando =
cooldownArremesso =
tempoSegurando =
noTornado =
)
()
({
Nome = ,
AlcanceSuccao = ,
ForcaPuxao = ,
Velocidade = ,
AlturaNuvens = ,
DistanciaSpawn = ,
LarguraBase = ,
LarguraTopo = ,
QtdBlocos = ,
Volume = ,
DistanciaSom = ,
TaxaFumaca =
})
.(()
.()
()
({
Nome = ,
AlcanceSuccao = ,
ForcaPuxao = ,
Velocidade = ,
AlturaNuvens = ,
DistanciaSpawn = ,
LarguraBase = ,
LarguraTopo = ,
QtdBlocos = ,
Volume = ,
DistanciaSom = ,
TaxaFumaca =
})
)
Um script que se pode spawnar um tornado mas é visual!!

Universal