Загрузка данных


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