So I’m trying to make a script that lets you grab onto ledges and climb stuff. First it detects the closest part in front of the player then sends a bunch of rays diagonally in front of the player to detect where the ledge is.
I got 2 issues:
I don’t know if I’m doing something wrong or it’s just raycast errors. Any ideas?
ContextActionService:BindAction("ShootRay",
function(ActionName, InputState, InputObject)
if InputState == Enum.UserInputState.End then
if rig.IsGrabbingLedge == false then
-- Grab onto ledge
-- Check distance
rig.IsGrabbingLedge = true
local origin = rig.Root.Position
local destination = rig.Root.CFrame.LookVector*300
local distanceResult = workspace:Raycast(origin,destination,ledgeRayParams)
local distanceFromPlayer;
print(distanceResult == nil)
VisualizeRay(origin, destination,distanceResult, Color3.fromRGB(255, 255, 255), 500)
if distanceResult then
-- If the ray hits, check if it's distance is small enough for the player to grab to climb.
distanceFromPlayer = (distanceResult.Position - rig.Root.Position).Magnitude
print(distanceFromPlayer)
local rayClosestToLedge;
local part;
if distanceFromPlayer < ledgeDistance then
-- numeric loop to create many rays that will intersect the part, until no more rays can be made and the last one is used.
for i = 1, 20, 1 do
local origin1 = rig.Root.Position
local destination1 = distanceResult.Position + (Yvector*i)
local result1 = workspace:Raycast(origin1, destination1, ledgeRayParams)
if result1 then
print("Instance is "..result1.Instance.Name)
part = VisualizeVector(destination1, Color3.fromRGB(255, 255, 255), 100)
rayClosestToLedge = result1
elseif not result1 then
break
end
end
part.Color = Color3.fromRGB(55, 255, 0)
if rayClosestToLedge then
VisualizeRay(rig.Root.Position, nil, rayClosestToLedge, Color3.fromRGB(0, 255, 0), 100)
else
end
end
end
else
rig.IsGrabbingLedge = false
print("IS grabbing ledge")
-- Vault
end
end
end,
false, Enum.KeyCode.R )
1 post - 1 participant