local function f(f)if not mobileShouldTrack then return end if player.Character.Humanoid.RigType==Enum.HumanoidRigType.R15 then return end if player.Character.Humanoid:GetState()~=Enum.HumanoidStateType.Swimming then local C=player.Character.HumanoidRootPart local c=player.Character.Head local O=(f-c.Position).unit local Z=math.acos(O:Dot(Vector3.new(0,1,0)))local T=Z if math.deg(T)>110 then T=math.rad(110)end neck.C0=CFrame.new(0,1,0)*CFrame.Angles(math.pi-T,math.pi,0)local X do X=player.Character:FindFirstChild("\082\105\103\104\116 \065\114\109")or player.Character:FindFirstChild("\082\105\103\104\116\085\112\112\101\114\065\114\109")end local D=C.Position+C.CFrame:vectorToWorldSpace(Vector3.new(C.Size.X/2+X.Size.X/2,C.Size.Y/2-X.Size.Z/2,0))local V=((f-D)*Vector3.new(1,0,1)).unit local Y=(C.CFrame.lookVector*Vector3.new(1,0,1)).unit local W=math.acos(V:Dot(Y))if tostring(W)=="-\049\046\035\073\078\068"then W=0 end if player.Character.Humanoid:GetState()==Enum.HumanoidStateType.Seated then local f=C.CFrame.lookVector:Cross(V)if W>math.pi/2 then W=math.pi/2 end if f.Y<0 then W=-W end end shoulder.C0=CFrame.new(1,.5,0)*CFrame.Angles(math.pi/2-Z,math.pi/2+W,0)if not amISitting(player.Character)then C.CFrame=CFrame.new(C.Position,C.Position+(Vector3.new(f.X,C.Position.Y,f.Z)-C.Position).unit)end end end

local function frame(mousePosition)
	-- Special mobile consideration. We don't want to track if the user was touching a ui
	-- element such as the movement controls. Just return out of function if so to make sure
	-- character doesn't track
	if not mobileShouldTrack then return end
	
	--This math is completely wrong with R15. We're better off just not doing it at all
	if player.Character.Humanoid.RigType == Enum.HumanoidRigType.R15 then
		return
	end
	
	-- Make sure character isn't swiming. If the character is swimming the following code will
	-- not work well; the character will not swim correctly. Besides, who shoots underwater?
	if player.Character.Humanoid:GetState() ~= Enum.HumanoidStateType.Swimming then
		local torso = player.Character.HumanoidRootPart
		local head = player.Character.Head
		
		local toMouse = (mousePosition - head.Position).unit
		local angle = math.acos(toMouse:Dot(Vector3.new(0,1,0)))
		
		local neckAngle = angle
	
		-- Limit how much the head can tilt down. Too far and the head looks unnatural
		if math.deg(neckAngle) > 110 then
			neckAngle = math.rad(110)
		end
		neck.C0 = CFrame.new(0,1,0) * CFrame.Angles(math.pi - neckAngle,math.pi,0)
		
		-- Calculate horizontal rotation
		local arm do
			arm = player.Character:FindFirstChild("Right Arm") or
				  player.Character:FindFirstChild("RightUpperArm")
		end
		local fromArmPos = torso.Position + torso.CFrame:vectorToWorldSpace(Vector3.new(
			torso.Size.X/2 + arm.Size.X/2, torso.Size.Y/2 - arm.Size.Z/2, 0))
		local toMouseArm = ((mousePosition - fromArmPos) * Vector3.new(1,0,1)).unit
		local look = (torso.CFrame.lookVector * Vector3.new(1,0,1)).unit
		local lateralAngle = math.acos(toMouseArm:Dot(look))		
		
		-- Check for rogue math
		if tostring(lateralAngle) == "-1.#IND" then
			lateralAngle = 0
		end		
		
		-- Handle case where character is sitting down
		if player.Character.Humanoid:GetState() == Enum.HumanoidStateType.Seated then			
			
			local cross = torso.CFrame.lookVector:Cross(toMouseArm)
			if lateralAngle > math.pi/2 then
				lateralAngle = math.pi/2
			end
			if cross.Y < 0 then
				lateralAngle = -lateralAngle
			end
		end	
		
		-- Turn shoulder to point to mouse
		shoulder.C0 = CFrame.new(1,0.5,0) * CFrame.Angles(math.pi/2 - angle,math.pi/2 + lateralAngle,0)	
		
		-- If not sitting then aim torso laterally towards mouse
		if not amISitting(player.Character) then
			torso.CFrame = CFrame.new(torso.Position, torso.Position + (Vector3.new(
				mousePosition.X, torso.Position.Y, mousePosition.Z)-torso.Position).unit)
		end	
	end
end
