local function l(l)if not mobileShouldTrack then return end if player.Character.Humanoid:GetState()~=Enum.HumanoidStateType.Swimming then local V=player.Character.Torso local C=player.Character.Head local x=(l-C.Position).unit local G=math.acos(x:Dot(Vector3.new(0,1,0)))local Y=G if math.deg(Y)>110 then Y=math.rad(110)end neck.C0=CFrame.new(0,1,0)*CFrame.Angles(math.pi-Y,math.pi,0)local r=player.Character:FindFirstChild("\082\105\103\104\116 \065\114\109")local N=V.Position+V.CFrame:vectorToWorldSpace(Vector3.new(V.Size.X/2+r.Size.X/2,V.Size.Y/2-r.Size.Z/2,0))local i=((l-N)*Vector3.new(1,0,1)).unit local T=(V.CFrame.lookVector*Vector3.new(1,0,1)).unit local d=math.acos(i:Dot(T))if tostring(d)=="-\049\046\035\073\078\068"then d=0 end if player.Character.Humanoid:GetState()==Enum.HumanoidStateType.Seated then local l=V.CFrame.lookVector:Cross(i)if d>math.pi/2 then d=math.pi/2 end if l.Y<0 then d=-d end end shoulder.C0=CFrame.new(1,.5,0)*CFrame.Angles(math.pi/2-G,math.pi/2+d,0)if not amISitting(player.Character)then V.CFrame=CFrame.new(V.Position,V.Position+(Vector3.new(l.X,V.Position.Y,l.Z)-V.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
	
	-- 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
