Model Size Changer Script [HELP]

I have Hair Givers that Gives Custom Model Hairs NOT Accessory or Hat but a “Model”

https://gyazo.com/e153db0b5be45897c9a652935c4b10b3

They work fine but when I want to change the Size of the Entire Model two things will always happen

  1. It will break the Welds but I fix this by Re-Welding the Model to the Character’s Head
  2. The Model’s CFrame Changes and it’s Position is weird

Before Size Change
https://gyazo.com/0b187f44ef51d75cc8e9dbb549c639ca

After Size Change
https://gyazo.com/bfb7b7507beb57849beaf2e903802cc2


Here’s the Place File (72.8 KB)

Code
-- SERVICES --

local Players = game:GetService('Players')

-- VARS --

local SizeChanger = workspace:WaitForChild('SizeChanger')
	local SizeChangerClickDetector = SizeChanger:WaitForChild('ClickDetector')
	local SizeChangerButton = SizeChanger:WaitForChild('Button')
	
local DB

local Colors3 = {Red = Color3.new(1,0,0),Green = Color3.new(0,1,0)}

local SizeControlProp = {'BodyDepthScale','BodyHeightScale','BodyWidthScale','HeadScale'}

-- FUNCTIONS --

local function GetModel(Part)
	local Model = Part:FindFirstAncestorOfClass('Model')
	local Humanoid = Model and Model:FindFirstChildOfClass('Humanoid')
	local Player = Humanoid and Players:GetPlayerFromCharacter(Model)
	return Player,Model,Humanoid
end

local function Resize(Cha,Model,Scale) -- This is probably where it's broken
	for _,v in pairs(Model:GetDescendants()) do
		if v:IsA('BasePart') then
			local VCFrame = v.CFrame
			local _,_,_,C0,C1,C2,C3,C4,C5,C6,C7,C8 = VCFrame:components()
			v.Size = v.Size * Scale
			v.CFrame = CFrame.new(VCFrame.p * Scale) * CFrame.new(0,0,0,C0,C1,C2,C3,C4,C5,C6,C7,C8)
			
			local Weld1 = Instance.new("Weld")
			Weld1.Part0 = Model.Middle
			Weld1.Part1 = v
			local CF = CFrame.new(Model.Middle.Position)
			local C0 = Model.Middle.CFrame:inverse()*CF
			local C1 = v.CFrame:inverse()*CF
			Weld1.C0 = C0
			Weld1.C1 = C1
			Weld1.Parent = Model.Middle
			
			local Weld2 = Instance.new("Weld")
			Weld2.Part0 = Cha.Head
			Weld2.Part1 = Model.Middle
			Weld2.C0 = CFrame.new(0, 0, 0)
			Weld2.Parent = Weld2.Part0
		end
	end
end
	
local function ChangeSize(Par)
	if not DB then
		DB = true
		SizeChangerButton.Color = Colors3.Red
		if Par:IsA('Player') then
			local plr,Cha,Hum = Par, Par.Character, Par.Character.Humanoid
			if plr and Cha and Hum then
				for i = 1 , #SizeControlProp do
					local v = SizeControlProp[i]
					Hum[v].Value = .8
				end
			end
			Resize(plr.Character,plr.Character:FindFirstChild('Headz'),Vector3.new(.8,.8,.8))
		elseif Par:IsA('BasePart') then
			local plr,Cha,Hum = GetModel(Par)
			if plr and Cha and Hum then
				for i = 1 , #SizeControlProp do
					local v = SizeControlProp[i]
					Hum[v].Value = .8
				end
			end
			Resize(plr.Character,plr.Character:FindFirstChild('Headz'),Vector3.new(.8,.8,.8))
		end
		wait(5)
		DB = false
		SizeChangerButton.Color = Colors3.Green
	end	
end

-- SCRIPTS --

SizeChangerClickDetector.MouseClick:Connect(ChangeSize)

SizeChangerButton.Touched:Connect(ChangeSize)
1 Like