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


local Teams = game:GetService("Teams")
local Players = game:GetService("Players")

-- Настройки времени (в секундах)
local INTERMISSION_TIME = 30 -- Время на клики между гонками (пока поставим меньше, чтобы не ждать долго на тестах)
local RACE_TIME = 90 -- Время гонки (1.5 минуты)

-- Находим нашу зону полета и саму трубу
local flyZone = workspace:FindFirstChild("FlyZone") 
-- Нам понадобится деталь-дверь, которая будет закрывать вход. Создадим её программно, чтобы ты не строил вручную!
local door = Instance.new("Part")
door.Name = "RaceDoor"
door.Size = Vector3.new(10, 15, 2) -- Размер двери, чтобы закрыть твою арку
door.Anchored = true
door.Material = Enum.Material.ForceField -- Сделаем её красиво светящейся
door.Color = Color3.fromRGB(255, 0, 0) -- Красный цвет (закрыто)
door.Parent = workspace

-- Функция для поиска места, куда ставить дверь. 
-- Поставь свою дверь на место арки вручную или укажи координаты. Пока привяжем к FlyZone:
if flyZone then
	door.Position = flyZone.Position + Vector3.new(0, -flyZone.Size.Y/2 + 7.5, 15) -- Подгоним под вход
end

local isRaceActive = false
local flyingPlayers = {}

-- Создаем глобальный таймер, который будет виден всем игрокам
local gameTime = Instance.new("IntValue")
gameTime.Name = "GameTime"
gameTime.Value = INTERMISSION_TIME
gameTime.Parent = game.ReplicatedStorage

-- Основной цикл игры
task.spawn(function()
	while true do
		-- === ЭТАП 1: ОЖИДАНИЕ (КЛИКИ) ===
		isRaceActive = false
		door.CanCollide = true -- Закрываем дверь в трубу
		door.Color = Color3.fromRGB(255, 0, 0)
		
		for i = INTERMISSION_TIME, 0, -1 do
			gameTime.Value = i
			task.wait(1)
		end
		
		-- === ЭТАП 2: СТАРТ ГОНКИ ===
		isRaceActive = true
		door.CanCollide = false -- Открываем дверь! Проход свободен
		door.Color = Color3.fromRGB(0, 255, 0) -- Зеленый цвет
		
		-- Телепортируем всех игроков прямо ко входу в трубу, чтобы никто не опоздал
		for _, player in pairs(Players:GetPlayers()) do
			local char = player.Character
			if char and char:FindFirstChild("HumanoidRootPart") and flyZone then
				char.HumanoidRootPart.Position = flyZone.Position - Vector3.new(0, flyZone.Size.Y/2 - 5, -15)
			end
		end
		
		for i = RACE_TIME, 0, -1 do
			gameTime.Value = i
			task.wait(1)
		end
		
		-- === ЭТАП 3: КОНЕЦ ГОНКИ ===
		-- Возвращаем всех выживших на спавн
		for _, player in pairs(Players:GetPlayers()) do
			player:LoadCharacter() -- Самый простой способ вернуть на спавн и восстановить стамину!
		end
		
		-- Очищаем список летящих
		flyingPlayers = {}
	end
end)

-- А этот кусок кода отвечает за сам полет внутри трубы во время гонки
if flyZone then
	flyZone.Touched:Connect(function(hit)
		if not isRaceActive then return end -- Если гонка не началась, лететь нельзя
		
		local character = hit.Parent
		local player = Players:GetPlayerFromCharacter(character)
		
		if player and not flyingPlayers[player.UserId] then
			local leaderstats = player:WaitForChild("leaderstats")
			local speed = leaderstats:WaitForChild("Speed")
			local stamina = leaderstats:WaitForChild("Stamina")
			local coins = leaderstats:WaitForChild("Coins")
			
			if stamina.Value <= 0 then return end
			flyingPlayers[player.UserId] = true
			
			local hrp = character:WaitForChild("HumanoidRootPart")
			local startY = hrp.Position.Y
			
			local bodyVelocity = Instance.new("BodyVelocity")
			bodyVelocity.MaxForce = Vector3.new(0, 400000, 0)
			bodyVelocity.Velocity = Vector3.new(0, speed.Value * 10, 0)
			bodyVelocity.Parent = hrp
			
			while isRaceActive and flyingPlayers[player.UserId] and stamina.Value > 0 do
				task.wait(1)
				stamina.Value = stamina.Value - 1
				bodyVelocity.Velocity = Vector3.new(0, speed.Value * 10, 0)
			end
			
			bodyVelocity:Destroy()
			
			local endY = hrp.Position.Y
			local distance = math.max(0, endY - startY)
			local earnedCoins = math.floor(distance / 10)
			if earnedCoins > 0 then
				coins.Value = coins.Value + earnedCoins
			end
		end
	end)
end