Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --[[
- [Head/Waist Follow Mouse/Camera Script.]
- [Works with both R6 and R15, lets you turn your character's head and waist towards your mouse/camera.]
- [Scripted by (Unknown), upgraded by OhHeyItsCory.]
- [I'm not sure who made the original script and the person I found it from definitely didn't make it.]
- [If you find the original creator, please let me know so I can properly credit them <3]
- [Anyways, here's a list of what I've added.]
- [Waist rotation. (Previously, only the head turned.)]
- [Tweening. (Basically, animating the rotation instead of instantly turning.)]
- [Full body rotation. (If set to true, rotates the entire body towards the mouse.)]
- [Specific rotation limits. (The original script used one variable to set the limits of both horizontal and vertical rotation, now there's variables for both limits!)]
- --]]
- wait()
- --[Pre-Funcs]:
- local Ang = CFrame.Angles --[Storing these as variables so I dont have to type them out.]
- local aSin = math.asin
- local aTan = math.atan
- --[Constants]:
- local Cam = game.Workspace.CurrentCamera
- local Plr = game.Players.LocalPlayer
- local Mouse = Plr:GetMouse()
- local Body = Plr.Character or Plr.CharacterAdded:wait()
- local Head = Body:WaitForChild("Head")
- local Hum = Body:WaitForChild("Humanoid")
- local Core = Body:WaitForChild("HumanoidRootPart")
- local IsR6 = (Hum.RigType.Value==0) --[Checking if the player is using R15 or R6.]
- local Trso = (IsR6 and Body:WaitForChild("Torso")) or Body:WaitForChild("UpperTorso")
- local Neck = (IsR6 and Trso:WaitForChild("Neck")) or Head:WaitForChild("Neck") --[Once we know the Rig, we know what to find.]
- local Waist = (not IsR6 and Trso:WaitForChild("Waist")) --[R6 doesn't have a waist joint, unfortunately.]
- --[[
- [Whether rotation follows the camera or the mouse.]
- [Useful with tools if true, but camera tracking runs smoother.]
- --]]
- local MseGuide = false
- --[[
- [Whether the whole character turns to face the mouse.]
- [If set to true, MseGuide will be set to true and both HeadHorFactor and BodyHorFactor will be set to 0]
- --]]
- local TurnCharacterToMouse = false
- --[[
- [Horizontal and Vertical limits for head and body tracking.]
- [Setting to 0 negates tracking, setting to 1 is normal tracking, and setting to anything higher than 1 goes past real life head/body rotation capabilities.]
- --]]
- local HeadHorFactor = 1
- local HeadVertFactor = 0.6
- local BodyHorFactor = 0.5
- local BodyVertFactor = 0.4
- --[[
- [How fast the body rotates.]
- [Setting to 0 negates tracking, and setting to 1 is instant rotation. 0.5 is a nice in-between that works with MseGuide on or off.]
- [Setting this any higher than 1 causes weird glitchy shaking occasionally.]
- --]]
- local UpdateSpeed = 0.5
- local NeckOrgnC0 = Neck.C0 --[Get the base C0 to manipulate off of.]
- local WaistOrgnC0 = (not IsR6 and Waist.C0) --[Get the base C0 to manipulate off of.]
- --[Setup]:
- Neck.MaxVelocity = 1/3
- -- Activation]:
- if TurnCharacterToMouse == true then
- MseGuide = true
- HeadHorFactor = 0
- BodyHorFactor = 0
- end
- game:GetService("RunService").RenderStepped:Connect(function()
- local CamCF = Cam.CoordinateFrame
- if ((IsR6 and Body["Torso"]) or Body["UpperTorso"])~=nil and Body["Head"]~=nil then --[Check for the Torso and Head...]
- local TrsoLV = Trso.CFrame.lookVector
- local HdPos = Head.CFrame.p
- if IsR6 and Neck or Neck and Waist then --[Make sure the Neck still exists.]
- if Cam.CameraSubject:IsDescendantOf(Body) or Cam.CameraSubject:IsDescendantOf(Plr) then
- local Dist = nil;
- local Diff = nil;
- if not MseGuide then --[If not tracking the Mouse then get the Camera.]
- Dist = (Head.CFrame.p-CamCF.p).magnitude
- Diff = Head.CFrame.Y-CamCF.Y
- if not IsR6 then --[R6 and R15 Neck rotation C0s are different; R15: X axis inverted and Z is now the Y.]
- Neck.C0 = Neck.C0:lerp(NeckOrgnC0*Ang((aSin(Diff/Dist)*HeadVertFactor), -(((HdPos-CamCF.p).Unit):Cross(TrsoLV)).Y*HeadHorFactor, 0), UpdateSpeed/2)
- Waist.C0 = Waist.C0:lerp(WaistOrgnC0*Ang((aSin(Diff/Dist)*BodyVertFactor), -(((HdPos-CamCF.p).Unit):Cross(TrsoLV)).Y*BodyHorFactor, 0), UpdateSpeed/2)
- else --[R15s actually have the properly oriented Neck CFrame.]
- Neck.C0 = Neck.C0:lerp(NeckOrgnC0*Ang(-(aSin(Diff/Dist)*HeadVertFactor), 0, -(((HdPos-CamCF.p).Unit):Cross(TrsoLV)).Y*HeadHorFactor),UpdateSpeed/2)
- end
- else
- local Point = Mouse.Hit.p
- Dist = (Head.CFrame.p-Point).magnitude
- Diff = Head.CFrame.Y-Point.Y
- if not IsR6 then
- Neck.C0 = Neck.C0:lerp(NeckOrgnC0*Ang(-(aTan(Diff/Dist)*HeadVertFactor), (((HdPos-Point).Unit):Cross(TrsoLV)).Y*HeadHorFactor, 0), UpdateSpeed/2)
- Waist.C0 = Waist.C0:lerp(WaistOrgnC0*Ang(-(aTan(Diff/Dist)*BodyVertFactor), (((HdPos-Point).Unit):Cross(TrsoLV)).Y*BodyHorFactor, 0), UpdateSpeed/2)
- else
- Neck.C0 = Neck.C0:lerp(NeckOrgnC0*Ang((aTan(Diff/Dist)*HeadVertFactor), 0, (((HdPos-Point).Unit):Cross(TrsoLV)).Y*HeadHorFactor), UpdateSpeed/2)
- end
- end
- end
- end
- end
- if TurnCharacterToMouse == true then
- Hum.AutoRotate = false
- Core.CFrame = Core.CFrame:lerp(CFrame.new(Core.Position, Vector3.new(Mouse.Hit.p.x, Core.Position.Y, Mouse.Hit.p.z)), UpdateSpeed / 2)
- else
- Hum.AutoRotate = true
- plr = game.Players.LocalPlayer
- mouse = plr:GetMouse()
- part = nil
- bp = nil
- particles = nil
- function clerp(a,b,c,d)
- for i = 0,d,.01 do
- a.CFrame = CFrame.new(b:lerp(c,i))
- wait()
- end
- end
- function slerp(a2,b2,c2,d2)
- for i2 = 0,d2,.01 do
- a2.CFrame = CFrame.new(b2:lerp(c2,i2))
- wait()
- end
- end
- mouse.KeyDown:connect(function(key)
- if key == "e" and plr.Character.Parent == workspace then
- plr.Character.Parent = workspace.Camera
- plr.Character.Archivable = true
- Instance.new("ForceField",plr.Character).Visible = false
- for y,t in pairs(plr.Character:GetChildren()) do
- if t:IsA("Part") and t.Name ~= "HumanoidRootPart" then
- t.Transparency = 1
- if t.Name == "Head" and t:FindFirstChild("face") then
- t.face.Transparency = 1
- end
- elseif t:IsA("Accessory") and t:FindFirstChild("Handle") then
- t.Handle.Transparency = 1
- end
- end
- elseif key == "z" and plr.Character.Parent == workspace.Camera and part == nil then
- plr.Character.Torso.CFrame = CFrame.new(Vector3.new(mouse.hit.p.X,mouse.hit.p.Y+1.5,mouse.hit.p.Z),plr.Character.Torso.CFrame.p)
- elseif key == "x" and plr.Character.Parent == workspace.Camera and part == nil then
- if plr.Character.Torso.Anchored == true then
- for y,t in pairs(plr.Character:GetChildren()) do
- if t:IsA("Part") then
- t.Anchored = false
- end
- end
- else
- for y,t in pairs(plr.Character:GetChildren()) do
- if t:IsA("Part") then
- t.Anchored = true
- end
- end
- end
- elseif key == "c" and plr.Character.Parent == workspace.Camera and part ~= nil then
- local clone = part:Clone()
- clone.Parent = workspace
- clone.Anchored = false
- clone:ClearAllChildren()
- clone.CanCollide = true
- bp.Parent = clone
- particles.Parent = clone
- if part.Parent:FindFirstChildOfClass("Humanoid") then
- part.Parent:FindFirstChildOfClass("Humanoid").PlatformStand = false
- end
- part:Destroy()
- part = clone
- elseif key == "t" and plr.Character.Parent == workspace.Camera and part == nil then
- plr.Character.Parent = workspace
- plr.Character.Archivable = false
- plr.Character:FindFirstChildOfClass("ForceField"):Remove()
- for y,t in pairs(plr.Character:GetChildren()) do
- if t:IsA("Part") and t.Name ~= "HumanoidRootPart" then
- t.Transparency = 0
- if t.Name == "Head" and t:FindFirstChild("face") then
- t.face.Transparency = 0
- end
- elseif t:IsA("Accessory") and t:FindFirstChild("Handle") then
- t.Handle.Transparency = 0
- end
- end
- end
- end)
- mouse.Button1Down:connect(function()
- if plr.Character.Parent == workspace.Camera then
- if mouse ~= nil then
- if mouse.Target ~= nil then
- part = mouse.Target
- bp = Instance.new("BodyPosition",part)
- bp.MaxForce = Vector3.new(math.huge,math.huge,math.huge)
- bp.Position = part.Position
- particles = Instance.new("ParticleEmitter",part)
- particles.Color = ColorSequence.new(Color3.new(0,0,0))
- particles.Size = NumberSequence.new(1)
- particles.Texture = "rbxassetid://292289455"
- particles.VelocitySpread = 360
- particles.Speed = NumberRange.new(0)
- particles.RotSpeed = NumberRange.new(0)
- particles.Rotation = NumberRange.new(0)
- particles.Rate = 250
- particles.Lifetime = NumberRange.new(.2,.4)
- particles.Transparency = NumberSequence.new({NumberSequenceKeypoint.new(0,1,0),NumberSequenceKeypoint.new(.12,.688,0),NumberSequenceKeypoint.new(.891,.887,0),NumberSequenceKeypoint.new(1,1,0)})
- dwn = true
- end
- end
- while dwn == true do
- wait()
- bp.Position = mouse.hit.p
- if part then
- if part.Parent:FindFirstChildOfClass("Humanoid") then
- part.Parent:FindFirstChildOfClass("Humanoid").PlatformStand = true
- mouse.Button1Up:connect(function()
- dwn = false
- if part then if part.Parent:FindFirstChildOfClass("Humanoid") then part.Parent:FindFirstChildOfClass("Humanoid").PlatformStand = false end part = nil end
- if bp then bp:Destroy() end
- if particles then particles:Destroy() end
- end)
- base = Instance.new("ScreenGui",plr.PlayerGui)
- bbg = Instance.new("BillboardGui",plr.Character.Head)
- bbg.Size = UDim2.new(0,200,0,50)
- bbg.StudsOffset = Vector3.new(0,3,0)
- bbgTl = Instance.new("TextLabel",bbg)
- bbgTl.BackgroundTransparency = 1
- bbgTl.Size = UDim2.new(10,0,1,0)
- bbgTl.Position = UDim2.new(-4.5,0,0,0)
- bbgTl.Font = "Code"
- bbgTl.Text = " "
- bbgTl.TextSize = 25
- bbgTl.TextStrokeColor3 = Color3.new(1,1,1)
- bbgTl.TextColor3 = Color3.new(0,0,0)
- bbgTl.TextStrokeTransparency = 0
- bbgTl.TextWrapped = true
- plr.Chatted:connect(function(msg)
- bbgTl.Text = msg
- wait(5)
- if bbgTl.Text == msg then
- bbgTl.Text = " "
- end
- end)
- touchCounter = 0
- while wait() do
- if plr.Character.Parent == workspace.Camera then
- local c = plr.Character:Clone()
- c:MakeJoints()
- for y,t in pairs(c:GetChildren()) do
- if t:IsA("Part") then
- t.CanCollide = false
- t.Anchored = true
- t.Transparency = .5
- t.TopSurface = "Smooth"
- t.BottomSurface = "Smooth"
- t.RightSurface = "Smooth"
- t.LeftSurface = "Smooth"
- t.FrontSurface = "Smooth"
- t.BackSurface = "Smooth"
- t.BrickColor = BrickColor.new("Really black")
- if t.Name == "Head" and t:FindFirstChild("face") then
- t.face:Remove()
- elseif t.Name == "Torso" and t:FindFirstChild("roblox") then
- t.roblox:Remove()
- elseif t.Name == "HumanoidRootPart" then
- t:Remove()
- end
- else
- t:Remove()
- end
- end
- c.Parent = workspace
- game.Debris:AddItem(c,.05)
- end
- end
- end
- end)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement