local a=function(a,I)local X=a:FindFirstChild(I)while X==nil do a.ChildAdded:wait()X=a:FindFirstChild(I)if X then break end end return X end local I={neckC1=nil,rshoC0=nil;lshoC0=nil,rhipC0=nil,lhipC0=nil}local X=function(X,u)local M=a(u,"\084\111\114\115\111")local U=a(M,"\078\101\099\107")local w=a(M,"\082\105\103\104\116 \083\104\111\117\108\100\101\114")local v=a(M,"\076\101\102\116 \083\104\111\117\108\100\101\114")local r=a(M,"\082\105\103\104\116 \072\105\112")local N=a(M,"\076\101\102\116 \072\105\112")local Y=script.Parent.Configuration local H=Y["\072\101\097\100 \065\110\103\108\101"].Value local m=Y["\076\101\103\115 \065\110\103\108\101"].Value local J=Y["\065\114\109\115 \065\110\103\108\101"].Value local O=Y["\083\105\116\116\105\110\103 \065\110\103\108\101"].Value local o=Y["\083\105\116\116\105\110\103 \080\111\115\105\116\105\111\110"].Value X.C1=X.C1*CFrame.fromEulerAnglesXYZ(math.rad(O+90),0,0)X.C0=CFrame.new(o)I.neckC1=U.C1 I.rshoC0=w.C0 I.lshoC0=v.C0 I.rhipC0=r.C0 I.lhipC0=N.C0 U.C1=U.C1*CFrame.fromEulerAnglesXYZ(math.rad(H),0,0)w.C0=w.C0*CFrame.fromEulerAnglesXYZ(math.rad(0),math.rad(0),math.rad(J))v.C0=v.C0*CFrame.fromEulerAnglesXYZ(math.rad(0),math.rad(0),math.rad(-J))r.C0=r.C0*CFrame.fromEulerAnglesXYZ(math.rad(0),math.rad(0),math.rad(m))N.C0=N.C0*CFrame.fromEulerAnglesXYZ(math.rad(0),math.rad(0),math.rad(-m))end local u=function(X,u)local M=a(u,"\084\111\114\115\111")local U=a(M,"\078\101\099\107")local w=a(M,"\082\105\103\104\116 \083\104\111\117\108\100\101\114")local v=a(M,"\076\101\102\116 \083\104\111\117\108\100\101\114")local r=a(M,"\082\105\103\104\116 \072\105\112")local N=a(M,"\076\101\102\116 \072\105\112")U.C1=I.neckC1 or CFrame.new()w.C0=I.rshoC0 or CFrame.new()v.C0=I.lshoC0 or CFrame.new()r.C0=I.rhipC0 or CFrame.new()N.C0=I.lhipC0 or CFrame.new()X:Destroy()end script.Parent.ChildAdded:connect(function(a)if a:IsA("\087\101\108\100")then local I=nil if a.Part1~=nil and(a.Part1.Parent~=nil and a.Part1.Parent:FindFirstChild("\072\117\109\097\110\111\105\100")~=nil)then I=a.Part1.Parent else return end X(a,I)end end)script.Parent.ChildRemoved:connect(function(a)if a:IsA("\087\101\108\100")then local I=nil if a.Part1~=nil and(a.Part1.Parent~=nil and a.Part1.Parent:FindFirstChild("\072\117\109\097\110\111\105\100")~=nil)then I=a.Part1.Parent else return end u(a,I)end end)
--Don't modify this script unless you really know what you're doing.

local WaitFor = function(parent, child_name)
	local found = parent:FindFirstChild(child_name)
	while found == nil do
		parent.ChildAdded:wait()
		found = parent:FindFirstChild(child_name)
		if found then
			break
		end
	end
	return found
end

local last = { neckC1 = nil, rshoC0 = nil, lshoC0 = nil, rhipC0 = nil, lhipC0 = nil }

local ApplyModifications = function(weld, char)
	local torso = WaitFor(char, "Torso")
	local neck = WaitFor(torso, "Neck")
	local rsho = WaitFor(torso, "Right Shoulder")
	local lsho = WaitFor(torso, "Left Shoulder")
	local rhip = WaitFor(torso, "Right Hip")
	local lhip = WaitFor(torso, "Left Hip")

	local config = script.Parent.Configuration
	local head_ang = config["Head Angle"].Value
	local legs_ang = config["Legs Angle"].Value
	local arms_ang = config["Arms Angle"].Value
	local sit_ang = config["Sitting Angle"].Value
	local sit_pos = config["Sitting Position"].Value

	--First adjust sitting position and angle
	--Add 90 to the angle because that's what most people will be expecting.
	weld.C1 = weld.C1 * CFrame.fromEulerAnglesXYZ(math.rad(sit_ang + 90), 0, 0)

	weld.C0 = CFrame.new(sit_pos)

	last.neckC1 = neck.C1
	last.rshoC0 = rsho.C0
	last.lshoC0 = lsho.C0
	last.rhipC0 = rhip.C0
	last.lhipC0 = lhip.C0

	--Now adjust the neck angle.
	neck.C1 = neck.C1 * CFrame.fromEulerAnglesXYZ(math.rad(head_ang), 0, 0)

	--Now adjust the arms angle.
	rsho.C0 = rsho.C0 * CFrame.fromEulerAnglesXYZ(math.rad(0), math.rad(0), math.rad(arms_ang))
	lsho.C0 = lsho.C0 * CFrame.fromEulerAnglesXYZ(math.rad(0), math.rad(0), math.rad(-arms_ang))

	--Now the legs
	rhip.C0 = rhip.C0 * CFrame.fromEulerAnglesXYZ(math.rad(0), math.rad(0), math.rad(legs_ang))
	lhip.C0 = lhip.C0 * CFrame.fromEulerAnglesXYZ(math.rad(0), math.rad(0), math.rad(-legs_ang))
end

local RevertModifications = function(weld, char)
	--Any modifications done in ApplyModifications have to be reverted here if they
	--change any welds - otherwise people will wonder why their head is pointing the wrong way.

	local torso = WaitFor(char, "Torso")
	local neck = WaitFor(torso, "Neck")
	local rsho = WaitFor(torso, "Right Shoulder")
	local lsho = WaitFor(torso, "Left Shoulder")
	local rhip = WaitFor(torso, "Right Hip")
	local lhip = WaitFor(torso, "Left Hip")

	--Now adjust the neck angle.
	neck.C1 = last.neckC1 or CFrame.new()

	rsho.C0 = last.rshoC0 or CFrame.new()
	lsho.C0 = last.lshoC0 or CFrame.new()

	rhip.C0 = last.rhipC0 or CFrame.new()
	lhip.C0 = last.lhipC0 or CFrame.new()

	weld:Destroy()
end

script.Parent.ChildAdded:connect(function(c)
	if c:IsA("Weld") then
		local character = nil
		if c.Part1 ~= nil and c.Part1.Parent ~= nil and c.Part1.Parent:FindFirstChild("Humanoid") ~= nil then
			character = c.Part1.Parent
		else
			return
		end
		ApplyModifications(c, character)
	end
end)

script.Parent.ChildRemoved:connect(function(c)
	if c:IsA("Weld") then
		local character = nil
		if c.Part1 ~= nil and c.Part1.Parent ~= nil and c.Part1.Parent:FindFirstChild("Humanoid") ~= nil then
			character = c.Part1.Parent
		else
			return
		end
		RevertModifications(c, character)
	end
end)
