I am making a horizontal obby game and I'm trying to make a moving platform that can reach more than 2 position points. However, as I tested and stand on the moving platform, I can't ride and I have to move manually.

I have added the BodyMovers and looked at the forums, and still... no luck.

Here's the footage: https://youtu.be/e4SSQVHDRz8

(Client:)

local map = script.obj.Value
local mapController = require(game.ReplicatedStorage.MapController)
local platformController = require(mapController.PlatformController)
local platforms = map.platforms
local routeData = platformController.newData(3, false, true, {platforms.p1, platforms.p2, platforms.p3, platforms.p4})
local newPlatform = platformController.takeEffect(map.platform)
platformController.playData(routeData, newPlatform)

(Module:)

local module = {}

function module.newData(duration, reverse, loop, route)
	local parsed = {}
	parsed = {
		Reversed = false;
		DurationEach = 1;
		Loop = false;
		Route = {};
	}
	
	for i = 1, #route do
		local v = route[i]
		if v then
			parsed.Route[i] = {Orientation = v.Orientation; Position = v.Position}
			v.CanCollide = false
		end
	end
		
	if duration then
		parsed.DurationEach = duration
	end
		
	if reverse then
		parsed.Reversed = reverse
	end
	
	if loop then
		parsed.Loop = loop
	end
	return parsed
end

function module.takeEffect(oldObject)
	local new = oldObject:Clone()
	new.Anchored = false
	new.Parent = oldObject.Parent
	oldObject:Destroy()
	
	local bodyPosition = Instance.new("BodyPosition")
	bodyPosition.Name = "bp"
	bodyPosition.MaxForce = Vector3.new(4000, 500000000, 4000)
	bodyPosition.P = 10000
	bodyPosition.Position = new.Position
	bodyPosition.Parent = new
	
	local bodyGyro = Instance.new("BodyGyro")
	bodyGyro.Name = "bg"
	bodyGyro.MaxTorque = Vector3.new(3999999947964416, 399999991808, 400000001507328)
	bodyGyro.MaxTorque = Vector3.new(4000, 500000000, 4000)
	bodyGyro.P = 3000
	bodyGyro.D = 500
	bodyGyro.CFrame = CFrame.new()
	bodyGyro.Parent = new
	
	return new
end

function module.playData(data, object)
	if object and typeof(data) == "table" then
		local motionDuration, boolReversed, tableRoute = data.DurationEach, data.Reversed, data.Route
		local tweenings = {}
		
		for i, v in ipairs(tableRoute) do
			local tweenInfo = TweenInfo.new(motionDuration, Enum.EasingStyle.Quint, Enum.EasingDirection.InOut, 0, false, 0)
			tweenings[i] = {
				OrientationTween = game:GetService("TweenService"):Create(object, tweenInfo, {Orientation = v.Orientation;});
				PositionTween = game:GetService("TweenService"):Create(object.bp, tweenInfo, {Position = v.Position;});
			}
		end
		
		coroutine.resume(coroutine.create(function()
			while wait() do
				for _, v in ipairs(tweenings) do
					v.PositionTween:Play()
					v.OrientationTween:Play()
					v.PositionTween.Completed:Wait()
				end
			end
		end))
 	end
end

return module