Here I've made a script stored in the ServerScriptService where the AI would turn around and face towards the targeted brick
local dude = workspace.Noob local faceTarget = function(target) local settings = { horizontalRange = math.rad(math.huge); verticalRange = math.rad(math.huge); maxHorizontalWaist = math.rad(math.huge); } local hrp = dude:WaitForChild("HumanoidRootPart"); local torsojoint = hrp:WaitForChild("Root Hip"); local tjC0 = torsojoint.C0; local springPart = dude:WaitForChild("Spring"); local BP = springPart:WaitForChild("BodyPosition"); BP.Position = Vector3.new(); springPart.CFrame = CFrame.new(); springPart.Anchored = false; local lookAt = function(thing) local eye = (hrp.CFrame * CFrame.new(0, 0, 0)):pointToObjectSpace(thing).Unit; local horizontal = -math.atan2(eye.x, -eye.z); local vertical = math.asin(eye.y); local goal = Vector3.new(); if not (math.abs(horizontal) > settings.horizontalRange or math.abs(vertical) > settings.verticalRange) then local hsign, habs = math.sign(horizontal), math.abs(horizontal); local hwaist = habs*1.1; if (hwaist > settings.maxHorizontalWaist) then local remainder = hwaist - settings.maxHorizontalWaist; hwaist = settings.maxHorizontalWaist; end goal = Vector3.new(hsign, hsign*hwaist, vertical); end return goal; end game:GetService("RunService").Heartbeat:Connect(function(dt) BP.Position = lookAt(target.Position); local set = springPart.Position; torsojoint.C0 = tjC0 * CFrame.fromEulerAnglesYXZ(0, 0, set.y); end); end faceTarget(workspace.Target)
Here's the issue: https://www.youtube.com/watch?v=zayt7CXnHT0&feature=youtu.be
The noob keeps unnecessarily turning a full 360 when the brick is the opposite of the Noob's original direction (The rotation before I started to go Run mode)