You basically create 2 reference vectors and have the player go there with the gravitational force. I made this before but you didnt want the script so 
EDIT: I dug through my place files and found it put in server script service.rbxm (1.8 KB)
EDIT 2: Scared of links? Here is the code (note multiply other dependencies are at play)
local function getMass(char)
local mass = 0
for _, v in pairs(char:GetDescendants()) do
if v:IsA("BasePart") then
mass += v:GetMass()
end
end
return mass
end
local function getClosestFaux(char, fauxs)
local closest = 0
local faux = nil
for i, v in pairs(fauxs:GetChildren()) do
if v:IsA("BasePart") then
local dif = (v.Position - char.HumanoidRootPart.Position).Magnitude
if dif > closest then
closest = dif
faux = v
end
end
end
return closest, faux, faux:GetMass()
end
local function getScalar(char)
local m1 = getMass(char)
local difference, faux, m2 = getClosestFaux(char, workspace.Fauxs)
return m1 * m2 / difference^2, faux, difference
end
local function getNormal(char, faux)
return (faux.Position - char.HumanoidRootPart.Position).Unit
end
local function getRotationBetween(u, v, axis)
local dot, uxv = u:Dot(v), u:Cross(v)
if (dot < -0.99999) then return CFrame.fromAxisAngle(axis, math.pi) end
return CFrame.new(0,0,0, uxv.x, uxv.y, uxv.z, 1 + dot)
end
game.Players.PlayerAdded:Connect(function(plr)
plr.CharacterAdded:Connect(function(char)
char.Humanoid.PlatformStand = false
local attractor = script.attractor:Clone()
attractor.Parent = char.HumanoidRootPart
game:GetService("RunService").Heartbeat:Connect(function()
local scalar, faux, difference = getScalar(char)
local normal = getNormal(char, faux)
normal = char.HumanoidRootPart.CFrame:VectorToObjectSpace(normal)
local force = scalar * normal
attractor.Force = force
local u = char.HumanoidRootPart.CFrame.UpVector
local axis = u:Cross(normal)
char.LowerTorso.Root.C0 = CFrame.new(0,-1,0,1,0,0,0,1,0,0,0,1) * getRotationBetween(u, -normal, axis)
end)
end)
end)