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.