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


local ReplicatedStorage = game:GetService("ReplicatedStorage")

-- Настройки
local config = {
	MaxSegments = 20, -- Переменная количества плит
	PartsFolder = ReplicatedStorage:WaitForChild("Parts"),
	SpawnModel = workspace:WaitForChild("Spawn")
}

-- Функция для получения случайной точки выхода из предыдущей модели
local function getRandomExit(pointFolder)
	local points = pointFolder:GetChildren()
	return points[math.random(1, #points)]
end

local function generateLevel()
	local lastExitPoint = getRandomExit(config.SpawnModel.Points)
	local allParts = config.PartsFolder:GetChildren()

	for i = 1, config.MaxSegments do
		-- Выбираем случайную модель из папки Parts
		local randomModelTemplate = allParts[math.random(1, #allParts)]
		local newPart = randomModelTemplate:Clone()
		
		-- Находим точки в новой модели
		local startPoint = newPart.Points:FindFirstChild("Start")
		local endPointsFolder = newPart.Points
		
		if startPoint then
			-- Устанавливаем PrimaryPart для корректного перемещения
			newPart.Parent = workspace
			
			-- Магия позиционирования:
			-- Мы вычисляем смещение новой модели так, чтобы её Start совпал с lastExitPoint прошлого объекта
			local currentPivot = newPart:GetPivot()
			local startRelativeCFrame = startPoint.WorldCFrame:ToObjectSpace(currentPivot)
			local targetCFrame = lastExitPoint.WorldCFrame:ToWorldSpace(startRelativeCFrame)
			
			newPart:PivotTo(targetCFrame)
			
			-- Обновляем последнюю точку выхода для следующей итерации
			lastExitPoint = getRandomExit(endPointsFolder)
			-- Если в папке есть Start, его не считаем за выход
			if lastExitPoint.Name == "Start" and #endPointsFolder:GetChildren() > 1 then
				repeat lastExitPoint = getRandomExit(endPointsFolder) 
				until lastExitPoint.Name ~= "Start"
			end
		else
			warn("В модели " .. newPart.Name .. " не найдена точка Start!")
			newPart:Destroy()
		end
	end
end

-- Запуск генерации
generateLevel()