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

Is there any efficient way to replicate a Motor6D lerp in the character for torso and head movement?

Asked by 5 years ago

have a script that makes the torso and head move based on camera position/mouse position. it lerps as well, but it doesn't replicate it to the server.

Anyone know a way to fix this, or efficiently send the information to the server?

local Ang   = CFrame.Angles
local aSin  = math.asin
local aTan  = math.atan

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)
local Trso  = (IsR6 and Body:WaitForChild("Torso")) or Body:WaitForChild("UpperTorso")
local Neck  = (IsR6 and Trso:WaitForChild("Neck")) or Head:WaitForChild("Neck")
local Waist = (not IsR6 and Trso:WaitForChild("Waist"))

local MseGuide = false

local HeadHorFactor = 1
local HeadVertFactor = 0.6
local BodyHorFactor = 0.5
local BodyVertFactor = 0.4
local UpdateSpeed = 0.5

local NeckOrgnC0 = Neck.C0
local WaistOrgnC0 = (not IsR6 and Waist.C0)

Neck.MaxVelocity = 1/3

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
            if Cam.CameraSubject:IsDescendantOf(Body) or Cam.CameraSubject:IsDescendantOf(Plr) then
                local Dist = nil;
                local Diff = nil;
                if not MseGuide then
                    Dist = (Head.CFrame.p-CamCF.p).magnitude
                    Diff = Head.CFrame.Y-CamCF.Y
                    if not IsR6 then
                        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)
                    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)
                    end
                end
            end
        end
    end
end)

Answer this question