Ive changed up the code a tiny bit but I don't know whats wrong.
Script:
local ReplicatedStorage = game:GetService("ReplicatedStorage") local HeadRotation = Instance.new("RemoteEvent") HeadRotation.Parent = ReplicatedStorage HeadRotation.Name = ("HeadRotation") local function HeadRotationFired(player) local CFNew, CFAng, CFtoObjectSpace = CFrame.new, CFrame.Angles, CFrame.new( ).toObjectSpace local asin, pi, hpi = math.asin, math.pi, math.pi / 2 local Plr= game.Players.LocalPlayer if Plr.Character then local Root, Neck, Humanoid, Camera = Plr.Character:FindFirstChild("HumanoidRootPart"), Plr.Character:FindFirstChild("Neck", true), Plr.Character:FindFirstChild("Humanoid"), workspace.CurrentCamera if Root and Neck and Humanoid and Camera.CameraSubject then local R6 = Humanoid.RigType == Enum.HumanoidRigType.R6 if Camera.CameraSubject.Parent == Plr.Character then local CameraDirection = CFtoObjectSpace(Root.CFrame, Camera.CFrame).lookVector.unit Neck.C0 = CFNew(Neck.C0.p) * CFAng(0, -asin(CameraDirection.x), 0) * (R6 and CFAng(-hpi + asin(CameraDirection.y), 0, pi) or CFAng(asin(CameraDirection.y), 0, 0)) else Neck.C0 = R6 and CFNew(Neck.C0.p) * CFAng(-hpi, 0, pi) or CFNew(Neck.C0.p) end end end end HeadRotation.OnServerEvent:Connect(HeadRotationFired)
Local script:
local ReplicatedStorage = game:GetService("ReplicatedStorage") local HeadRotation = ReplicatedStorage:WaitForChild("HeadRotation") HeadRotation:FireServer()
The server can't use LocalPlayer
because the server isn't client-oriented.
In your server script, remove line 10 and replace lines 12 and 13 with this:
if player.Character then local Root, Neck, Humanoid, Camera = player.Character:FindFirstChild("HumanoidRootPart"), player.Character:FindFirstChild("Neck", true), player.Character:FindFirstChild("Humanoid"), workspace.CurrentCamera
You may then replace line 16 with:
if Camera.CameraSubject.Parent == player.Character then
player
is the name of the parameter used in your function to receive the player object argument passed by OnServerEvent
.