Run it
Copy the script and paste it into your executor.
Players = :()
UserInputService = :()
Camera = .CurrentCamera
RunService = :()
player = Players.LocalPlayer
isHolding =
anchorPart =
visualBall =
laserPart =
handPart =
radius =
theta =
phi =
targetTheta =
targetPhi =
startTheta =
startPhi =
sensitivity =
maxSpeed =
isFloor =
isWall =
isFlying =
()
char = player.Character
char
char:(), char:()
,
()
visualBall
visualBall = .()
visualBall.Name =
visualBall.Shape = .PartType.Ball
visualBall.Size = .(, , )
visualBall.Material = .Material.Neon
visualBall.Color = .(, , )
visualBall.Anchored =
visualBall.CanCollide =
visualBall.CanQuery =
visualBall.Parent =
()
handPart
handPart = .()
handPart.Name =
handPart.Size = .(, , )
handPart.Transparency =
handPart.CanCollide =
handPart.CanQuery =
handPart.Anchored =
handPart.Massless =
handPart.Parent =
()
rootPart = ()
rootPart handPart
handPart.CFrame = rootPart.CFrame * .(, , -)
(endPos)
laserPart
laserPart = .()
laserPart.Name =
laserPart.Anchored =
laserPart.CanCollide =
laserPart.CanQuery =
laserPart.CanTouch =
laserPart.Material = .Material.Neon
laserPart.Color = .(, , )
laserPart.Transparency =
laserPart.Size = .(, , )
laserPart.Parent =
startPos = handPart.Position
distance = (endPos - startPos).Magnitude
distance < distance =
laserPart.Size = .(, , distance)
laserPart.CFrame = .(startPos, endPos) * .(, , -distance / )
()
laserPart laserPart:() laserPart =
()
screenCenter = Camera.ViewportSize /
unitRay = Camera:(screenCenter.X, screenCenter.Y)
raycastParams = RaycastParams.()
raycastParams.FilterDescendantsInstances = {player.Character, laserPart, handPart, anchorPart, visualBall}
raycastParams.FilterType = .RaycastFilterType.Exclude
result = :(unitRay.Origin, unitRay.Direction * , raycastParams)
result
(result.Position)
result.Position, result.Normal,
(unitRay.Origin + unitRay.Direction * )
unitRay.Origin + unitRay.Direction * , ,
(pos, origin)
offset = pos - origin
r = offset.Magnitude
r < r =
t = .(offset.Z, offset.X)
p = .(.(offset.Y / r, -, ))
r, t, p
(origin, r, t, p)
x = r * .(p) * .(t)
y = r * .(p)
z = r * .(p) * .(t)
origin + .(x, y, z)
()
rootPart, humanoid = ()
rootPart humanoid
hitPos, hitNormal, didHit = ()
didHit hitNormal
anchorPart anchorPart:()
anchorPart = .()
anchorPart.Name =
anchorPart.Size = .(, , )
anchorPart.Transparency =
anchorPart.CanCollide =
anchorPart.CanQuery =
anchorPart.Anchored =
anchorPart.Position = hitPos + (hitNormal * )
anchorPart.Parent =
.(hitNormal.Y) >
isFloor =
isWall =
isFloor =
isWall =
rootPart.Anchored =
rootPart.CanCollide =
radius, theta, phi = (rootPart.Position, anchorPart.Position)
startTheta = theta
startPhi = phi
targetTheta = theta
targetPhi = phi
()
rootPart, humanoid = ()
rootPart
rootPart.Anchored =
rootPart.CanCollide =
anchorPart anchorPart:() anchorPart =
angleDiff = .(targetTheta - startTheta) + .(targetPhi - startPhi)
speed = maxSpeed
angleDiff < speed =
impulseDir = .(, , )
isFloor
forwardDir = rootPart.CFrame.LookVector
forwardDir = .(forwardDir.X, , forwardDir.Z).Unit
forwardDir.Magnitude <
camLook = Camera.CFrame.LookVector
forwardDir = .(camLook.X, , camLook.Z).Unit
impulseDir = forwardDir * speed
impulseDir = impulseDir + .(, , )
isWall
impulseDir = .(, speed, )
rootPart.AssemblyLinearVelocity = impulseDir
rootPart.AssemblyAngularVelocity = .(, , )
isFlying =
.(, ()
isFlying =
)
radius =
theta =
phi =
isFloor =
isWall =
UserInputService.InputBegan:((input, gameProcessed)
gameProcessed
input.UserInputType == .UserInputType.MouseButton1
isHolding
isHolding =
()
()
()
)
UserInputService.InputEnded:((input)
input.UserInputType == .UserInputType.MouseButton1 isHolding
isHolding =
()
visualBall visualBall:() visualBall =
()
)
UserInputService.InputChanged:((input)
isHolding input.UserInputType == .UserInputType.MouseMovement
isFloor
targetTheta = targetTheta - (input.Delta.X * sensitivity)
targetPhi = phi
isWall
targetTheta = theta
targetPhi = targetPhi + (input.Delta.Y * sensitivity)
targetPhi = .(targetPhi, , .pi - )
)
RunService.RenderStepped:((dt)
()
isFlying
rootPart = ()
rootPart
moveDir = .(, , )
UserInputService:(.KeyCode.W) moveDir = moveDir + Camera.CFrame.LookVector
UserInputService:(.KeyCode.S) moveDir = moveDir - Camera.CFrame.LookVector
UserInputService:(.KeyCode.A) moveDir = moveDir - Camera.CFrame.RightVector
UserInputService:(.KeyCode.D) moveDir = moveDir + Camera.CFrame.RightVector
moveDir.Magnitude >
rootPart:(moveDir.Unit * )
visualBall handPart
screenCenter = Camera.ViewportSize /
unitRay = Camera:(screenCenter.X, screenCenter.Y)
raycastParams = RaycastParams.()
raycastParams.FilterDescendantsInstances = {player.Character, laserPart, handPart, anchorPart, visualBall}
raycastParams.FilterType = .RaycastFilterType.Exclude
result = :(unitRay.Origin, unitRay.Direction * , raycastParams)
endPos = unitRay.Origin + unitRay.Direction *
result
endPos = result.Position
visualBall.Color = .(, , )
visualBall.Color = .(, , )
visualBall.CFrame = .(endPos)
isHolding
(endPos)
isHolding anchorPart
rootPart, humanoid = ()
rootPart radius >
theta = theta + (targetTheta - theta) *
phi = phi + (targetPhi - phi) *
targetPos = (anchorPart.Position, radius, theta, phi)
targetPos.Y < anchorPart.Position.Y
targetPos = .(targetPos.X, anchorPart.Position.Y, targetPos.Z)
lookDir = (targetPos - rootPart.Position)
lookDir.Magnitude > lookDir = lookDir.Unit lookDir = (anchorPart.Position - rootPart.Position).Unit
rootPart.CFrame = .(targetPos, targetPos + lookDir)
)An improved and reworked version of the Fling to Climb mechanics. This script brings Spider-Man physics with smooth controls and a visual aiming system. How to use: Aim at a wall or the floor (a green target ball will appear). Hold Left Click to grab (you won't fall). Move your mouse up/down or left/right to swing and build momentum. Release Left Click to launch yourself with maximum power. Features: Smart anchoring (no falling while grabbing). Always max launch power (no timing required). Context-aware launch (shoot forward from the floor, shoot upward from walls). Universal script (works in most games). This script is made for experiments and speedruns. Use at your own risk.

Universal