Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

Stop camera from moving when holding onto a ledge?

Asked by 1 year ago

So while working on my game i came upon two problems that i don't find a way to fix. The first problem is that when the player is holding onto an edge i want him to be able to move his head in each direction a bit ( not to be able to do a 360 ) and not his entire body like roblox def settings do. The second problem i found is that when the player is holding on a ledge the left arm animation is glitching , i tried remaking the anim but still doesn't work. Also the game is first person only.

Here is the ledge grabbing script : P.S i tried using the CameraType but doesnt work.

local plr = game.Players.LocalPlayer
local Character = plr.Character or plr.CharacterAdded:Wait()
local Root = Character:WaitForChild("HumanoidRootPart")
local Head = Character:WaitForChild("Head")
local Hum = Character:WaitForChild("Humanoid")
local CA = Hum:LoadAnimation(script:WaitForChild("ClimbAnim"))
local HA = Hum:LoadAnimation(script:WaitForChild("HoldAnim"))
local TouchGui = plr:WaitForChild("PlayerGui"):FindFirstChild("TouchGui")
local UIS = game:GetService("UserInputService")
local Camera = workspace.CurrentCamera

ledgeavailable = true
holding = false

while game:GetService("RunService").Heartbeat:Wait() do
    local r = Ray.new(Head.CFrame.p, Head.CFrame.LookVector * 5)
    local part,position = workspace:FindPartOnRay(r,Character)

    if part and ledgeavailable and not holding then
        if part.Size.Y >= 7 then
            if Head.Position.Y >= (part.Position.Y + (part.Size.Y / 2)) - 1 and Head.Position.Y <= part.Position.Y + (part.Size.Y / 2) and  Root.Velocity.Y <= 0 then
                Root.Anchored = true holding = true HA:Play() ledgeavailable = false
            end
        end
    end

    function climb()
        local Vele = Instance.new("BodyVelocity",Root)
        Root.Anchored = false
        Vele.MaxForce = Vector3.new(1,1,1) * math.huge
        Vele.Velocity = Root.CFrame.LookVector * 10 + Vector3.new(0,30,0)
        HA:Stop() CA:Play()
        game.Debris:AddItem(Vele,.15)
        holding = false
        wait(.75)
        ledgeavailable = true
    end

    UIS.InputBegan:Connect(function(Key,Chat)
        if not holding then return end 
        if Key.KeyCode == Enum.KeyCode.Space and not Chat then
            climb()
        end
    end)

    if TouchGui then
        TouchGui:WaitForChild("TouchControlFrame"):WaitForChild("JumpButton").MouseButton1Click:Connect(function()
            if not holding then return end climb()
        end)
    end
end

function camera()

    if holding == true then

        Camera.CameraType = 0

        if not then

            Camera.CameraType = 5
        end

    end

end 

and here is the first person camera script :

repeat wait() until game:GetService("Players").LocalPlayer.Character ~= nil
local runService = game:GetService("RunService")
local input = game:GetService("UserInputService")
local players = game:GetService("Players")

CanToggleMouse = {allowed = true; activationkey = Enum.KeyCode.F;} -- will only be used for studio work
CanViewBody = true      
Sensitivity = 0.2       
Smoothness = 0.05   

local cam = game.Workspace.CurrentCamera
local player = players.LocalPlayer
local m = player:GetMouse()
m.Icon = "http://www.roblox.com/asset/?id=569021388" 
local character = player.Character or player.CharacterAdded:wait()
local humanoidpart = character.HumanoidRootPart

local head = character:WaitForChild("Head")
local CamPos,TargetCamPos = cam.CoordinateFrame.p,cam.CoordinateFrame.p 
local AngleX,TargetAngleX = 0,0
local AngleY,TargetAngleY = 0,0

local running = true
local freemouse = false



if not character or not character.Parent then
    character = player.CharacterAdded:wait()
end
local humanoid = character:WaitForChild("Humanoid")
local torso = character:WaitForChild("Torso")
local rightShoulder = torso:WaitForChild("Right Shoulder")
local leftShoulder = torso:WaitForChild("Left Shoulder")
local rootpart = character:WaitForChild("HumanoidRootPart")

updateSpeed = 0.5/2


function updatechar()

    for _, v in pairs(character:GetChildren())do
        if CanViewBody then
            if v.Name == 'Head' then
                v.LocalTransparencyModifier = 1
                v.CanCollide = false
            end
        else
            if v:IsA'Part' or v:IsA'UnionOperation' or v:IsA'MeshPart' then
                v.LocalTransparencyModifier = 1
                v.CanCollide = false
            end
        end
        if v:IsA'Accessory' then
            v:FindFirstChild('Handle').LocalTransparencyModifier = 1
            v:FindFirstChild('Handle').CanCollide = false
        end
        if v:IsA'Hat' then
            v:FindFirstChild('Handle').LocalTransparencyModifier = 1
            v:FindFirstChild('Handle').CanCollide = false
        end

    end

end

input.InputChanged:connect(function(inputObject)

    if inputObject.UserInputType == Enum.UserInputType.MouseMovement then
        local delta = Vector2.new(inputObject.Delta.x/Sensitivity,inputObject.Delta.y/Sensitivity) * Smoothness

        local X = TargetAngleX - delta.y 
        TargetAngleX = (X >= 80 and 80) or (X <= -80 and -80) or X 
        TargetAngleY = (TargetAngleY - delta.x) %360 
    end 

end)

input.InputBegan:connect(function(inputObject)

    if inputObject.UserInputType == Enum.UserInputType.Keyboard then
        if inputObject.KeyCode == CanToggleMouse.activationkey then
            if CanToggleMouse.allowed and freemouse == false then
                freemouse = true
            else
                freemouse = false
            end
        end
    end

end)

runService.RenderStepped:connect(function()

    if running then
        updatechar()

        CamPos = CamPos + (TargetCamPos - CamPos) *0.28 
        AngleX = AngleX + (TargetAngleX - AngleX) *0.35 
        local dist = TargetAngleY - AngleY 
        dist = math.abs(dist) > 180 and dist - (dist / math.abs(dist)) * 360 or dist 
        AngleY = (AngleY + dist *0.35) %360
        cam.CameraType = Enum.CameraType.Scriptable

        cam.CoordinateFrame = CFrame.new(head.Position) 
        * CFrame.Angles(0,math.rad(AngleY),0) 
        * CFrame.Angles(math.rad(AngleX),0,0)
        * CFrame.new(0,0.8,0) -- offset

        humanoidpart.CFrame=CFrame.new(humanoidpart.Position)*CFrame.Angles(0,math.rad(AngleY),0)
        character.Humanoid.AutoRotate = false
        else game:GetService("UserInputService").MouseBehavior = Enum.MouseBehavior.Default; character.Humanoid.AutoRotate = true
    end

    if (cam.Focus.p-cam.CoordinateFrame.p).magnitude < 1 then
        running = false
    else
        running = true
        if freemouse == true then
            game:GetService("UserInputService").MouseBehavior = Enum.MouseBehavior.Default
        else
            game:GetService("UserInputService").MouseBehavior = Enum.MouseBehavior.LockCenter
        end
    end

    if not CanToggleMouse.allowed then
        freemouse = false
    end


end)



game:GetService("RunService").RenderStepped:Connect(function()
    character["Right Arm"].LocalTransparencyModifier = character["Right Arm"].Transparency
    character["Left Arm"].LocalTransparencyModifier = character["Left Arm"].Transparency
    local camCF = cam.CoordinateFrame
    local distance = (character.Head.Position - camCF.p).magnitude
    if distance <= 2 and humanoid.Health ~= 0 then
        rightShoulder.C0 = rightShoulder.C0:lerp((camCF * CFrame.new(1, -1, -.5)):toObjectSpace(torso.CFrame):inverse() * CFrame.Angles(0, math.pi/2, 0), updateSpeed)
        leftShoulder.C0 = leftShoulder.C0:lerp((camCF * CFrame.new(-1, -1, -.5)):toObjectSpace(torso.CFrame):inverse() * CFrame.Angles(0, -math.pi/2, 0), updateSpeed)
        humanoid.CameraOffset = (rootpart.CFrame+Vector3.new(0,1.5,0)):pointToObjectSpace(head.CFrame.p)
    else
        rightShoulder.C0 = CFrame.new(1, 0.5, 0) * CFrame.Angles(0, math.pi/2, 0)
        leftShoulder.C0 = CFrame.new(-1, 0.5, 0) * CFrame.Angles(0, -math.pi/2, 0)
        humanoid.CameraOffset = Vector3.new(0,0,0)
    end
end)

If someone can help me it would be awesome.

0
here's a video with the issues : https://youtu.be/CjbNPkSzvyU TheD4rkPow3r_WFE 13 — 1y
0
Managed to fix the glitching arm , the problem came from the models hitbox as it was imported from blender. TheD4rkPow3r_WFE 13 — 1y

Answer this question