-- Укажите переменную папку с моделями NPC
local npcFolder = script.Creeps

-- Задайте позиции спавна крипов
local spawnPositions = {
	RadiantForceSpawn = Vector3.new(133.165, 0.5, 47.051),
	DireForceSpawn = Vector3.new(-132.107, 0.5, 43.742)
}

-- Создаем крипов
function spawnCreeps()
	local RadiantForceModels = npcFolder.RadiantForce:GetChildren()
	local DireForceModels = npcFolder.DireForce:GetChildren()

	for i, model in ipairs(RadiantForceModels) do
		cloneNpc(model, spawnPositions.RadiantForceSpawn, "RadiantForce")
	end

	for i, model in ipairs(DireForceModels) do
		cloneNpc(model, spawnPositions.DireForceSpawn, "DireForce")
	end
end

-- Клонируем крипов и добавляем функциональность
function cloneNpc(npcModel, spawnPos, faction)
	local clone = npcModel:Clone()
	clone:SetPrimaryPartCFrame(CFrame.new(spawnPos))
	clone.Parent = workspace

	-- Добавляем StringValue для фракции крипа
	local factionValue = Instance.new("StringValue")
	factionValue.Name = "Faction"
	factionValue.Value = faction
	factionValue.Parent = clone

	-- Добавляем функцию обработки попадания игрока
	local touchPart = clone.PrimaryPart
	touchPart.Touched:Connect(function(part)
		local humanoid = part.Parent:FindFirstChild("Humanoid")
		if humanoid and humanoid:IsA("Humanoid") then
			-- Игрок подошел слишком близко, крип отвлекается
			clone:FindFirstChild("Humanoid"):MoveTo(humanoid.RootPart.Position)
		end
	end)

	-- Прибавляем функцию Pathfinding
	local pathfindService = game:GetService("PathfindingService")
	local path = pathfindService:CreatePath()
	path:ComputeAsync(clone.PrimaryPart.Position, game.Workspace.Middle.Position) -- Измените Middle на середину вашей карты

	clone.Humanoid.MoveToFinished:Connect(function(reachedDestination)
		if reachedDestination then
			-- Достигли середины карты, начинаем сражаться
			attackEnemy(clone, faction)
		else
			-- Продолжаем движение по пути
			path:ComputeAsync(clone.PrimaryPart.Position, game.Workspace.Middle.Position)
			path.MoveToFinished:Wait()
		end
	end)

	clone.Humanoid:MoveTo(path:GetPointAtIndex(2).Position)
end

-- Функция для атаки врага
function attackEnemy(creep, faction)
	local enemyFaction = faction == "RadiantForce" and "DireForce" or "RadiantForce"

	local enemyCreeps = workspace:FindFirstChild(enemyFaction):GetChildren()
	for i, enemyCreep in ipairs(enemyCreeps) do
		if enemyCreep:FindFirstChild("Humanoid") then
			-- Выполните атаку противника
			-- Можете добавить свою собственную логику атаки
			break
		end
	end

	-- Проверяем, остались ли враги в радиусе атаки
	local remainingEnemies = workspace:FindFirstChild(enemyFaction):GetChildren()
	if #remainingEnemies > 0 then
		-- Продолжаем атаковать
		attackEnemy(creep, faction)
	else
		-- Никого не осталось, возвращаемся в исходную точку
		local pathfindService = game:GetService("PathfindingService")
		local path = pathfindService:CreatePath()
		path:ComputeAsync(creep.PrimaryPart.Position, creep.Origin.Position) -- Вам потребуется установить Origin на исходную точку

		creep.Humanoid.MoveToFinished:Connect(function(reachedDestination)
			if reachedDestination then
				-- Вернулись на исходную точку
				despawnCreep(creep)
			else
				-- Продолжаем движение по пути
				path:ComputeAsync(creep.PrimaryPart.Position, creep.Origin.Position)
				path.MoveToFinished:Wait()
			end
		end)

		creep.Humanoid:MoveTo(path:GetPointAtIndex(2).Position)
	end
end

-- Удаление крипа
function despawnCreep(creep)
	creep:Destroy()
end

-- Запускаем генерацию крипов с задержкой
spawnCreeps()
 роблокс выдал эту ошибку. "GetPointAtIndex is not a valid member of Path "Instance"" на строчке 62