local function G(G)if not mobileShouldTrack then return end if player.Character.Humanoid:GetState()~=Enum.HumanoidStateType.Swimming then local w=player.Character.Torso local E=player.Character.Head local a=(G-E.Position).unit local A=math.acos(a:Dot(Vector3.new(0,1,0)))local L=A if math.deg(L)>110 then L=math.rad(110)end neck.C0=CFrame.new(0,1,0)*CFrame.Angles(math.pi-L,math.pi,0)local H=player.Character:FindFirstChild("\082\105\103\104\116 \065\114\109")local T=w.Position+w.CFrame:vectorToWorldSpace(Vector3.new(w.Size.X/2+H.Size.X/2,w.Size.Y/2-H.Size.Z/2,0))local m=((G-T)*Vector3.new(1,0,1)).unit local v=(w.CFrame.lookVector*Vector3.new(1,0,1)).unit local W=math.acos(m:Dot(v))if tostring(W)=="-\049\046\035\073\078\068"then W=0 end if player.Character.Humanoid:GetState()==Enum.HumanoidStateType.Seated then local G=w.CFrame.lookVector:Cross(m)if W>math.pi/2 then W=math.pi/2 end if G.Y<0 then W=-W end end shoulder.C0=CFrame.new(1,.5,0)*CFrame.Angles(math.pi/2-A,math.pi/2+W,0)if not amISitting(player.Character)then w.CFrame=CFrame.new(w.Position,w.Position+(Vector3.new(G.X,w.Position.Y,G.Z)-w.Position).unit)end end end
-- Function to call on renderstepped. Orients the character so it is facing towards
-- the player mouse's position in world space. If character is sitting then the torso
-- should not track
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

	-- 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.Torso
		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 = player.Character:FindFirstChild("Right Arm")
		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
