As in the question how would you make it so LookAt will only rotate through one axis instead of all of them? I tried just putting .Y at the end but errored and said "CFrame expected got number", I also tried to put the look at in part of a vector3 like this Vector3.new(0,LookAt,0) but since it was part of a loop it would just start spinning which is not what I wanted.
NPCCharacter.PrimaryPart.CFrame = CFrame.lookAt(NPCCharacter.HumanoidRootPart.Position, Character.HumanoidRootPart.Position).Y
You can change the Y component of the target position to be the same as the NPC's Y position to have it only take X and Z into account. Modifying your code would give the following:
local npcPosition = NPCCharacter.HumanoidRootPart.Position local targetPosition = Character.HumanoidRootPart.Position NPCCharacter.PrimaryPart.CFrame = CFrame.lookAt( npcPosition, Vector3.new(targetPosition.X, npcPosition.Y, targetPosition.Z) )