local tornado = script.Parent
tornado.Anchored = true
tornado.CanCollide = false
-- Сохраняем исходные параметры твоей воронки
local baseSize = tornado.Size
local startRotation = tornado.CFrame - tornado.CFrame.Position
local currentPos = tornado.Position
local spinAngle = 0
-- Настройки категорий EF0 - EF5 (радиус захвата и максимальный размер сносимых деталей)
local CATEGORIES = {
[0] = { Radius = 25, MaxSize = 8, Force = 50, Speed = 16 },
[1] = { Radius = 45, MaxSize = 18, Force = 70, Speed = 20 },
[2] = { Radius = 70, MaxSize = 35, Force = 90, Speed = 24 },
[3] = { Radius = 95, MaxSize = 70, Force = 120, Speed = 28 },
[4] = { Radius = 125, MaxSize = 140, Force = 150, Speed = 32 },
[5] = { Radius = 160, MaxSize = 350, Force = 190, Speed = 36 },
}
local rayParams = RaycastParams.new()
rayParams.FilterType = Enum.RaycastFilterType.Exclude
rayParams.FilterDescendantsInstances = {tornado}
while true do
local category = math.random(0, 5)
local conf = CATEGORIES[category]
-- Масштабируем саму воронку под мощность категории
local scale = 0.8 + (category * 0.35)
tornado.Size = baseSize * scale
-- Выбираем случайное направление движения
local moveDir = Vector3.new(math.random() - 0.5, 0, math.random() - 0.5).Unit
print("--- Торнадо активен: EF" .. category .. " ---")
-- Цикл жизни торнадо (около 15 секунд)
for step = 1, 300 do
-- Случайный поворот направления движения
if math.random() < 0.04 then
moveDir = Vector3.new(math.random() - 0.5, 0, math.random() - 0.5).Unit
end
currentPos += moveDir * (conf.Speed * 0.05)
spinAngle += 0.3
-- Прижимаем низ воронки точно к земле/дороге, чтобы она не парила
local ray = workspace:Raycast(Vector3.new(currentPos.X, currentPos.Y + 200, currentPos.Z), Vector3.new(0, -500, 0), rayParams)
local groundY = ray and ray.Position.Y or (currentPos.Y - tornado.Size.Y / 2)
currentPos = Vector3.new(currentPos.X, groundY + tornado.Size.Y / 2, currentPos.Z)
-- Вращаем торнадо вокруг своей оси
tornado.CFrame = CFrame.new(currentPos) * CFrame.Angles(0, spinAngle, 0) * startRotation
-- Поиск и затягивание объектов вокруг
local nearbyParts = workspace:GetPartBoundsInRadius(currentPos, conf.Radius)
for _, part in ipairs(nearbyParts) do
if part ~= tornado and part.Name ~= "Baseplate" and part.Size.Magnitude <= conf.MaxSize then
-- Срываем объект (разанкериваем и ломаем соединения)
if part.Anchored then
part.Anchored = false
part:BreakJoints()
end
-- Физика вихря: тянем к центру и подбрасываем вверх
local pullVector = (currentPos - part.Position).Unit * conf.Force
part.AssemblyLinearVelocity = pullVector + Vector3.new(0, conf.Force * 0.8, 0)
end
end
task.wait(0.05)
end
-- Телепортация в новую случайную точку карты для следующего захода
currentPos = Vector3.new(math.random(-150, 150), currentPos.Y, math.random(-150, 150))
task.wait(2)
end