I know you technically aren't supposed to request scripts here, but this seems very simple. I'm just really inexperienced at scripting when it comes to tools.

I am basically trying to redesign the old clone tool from 2006. I made multiple-part crates that are all grouped in separate models that are supposed to be unanchored and weld to other parts. This script only clones and moves one part at a time, not the entire crate. Is there a way to easily fix this script so it clones the entire model and not just one part in it?

debounce = false
local vPlayer = game.Players.LocalPlayer
local SBox = Instance.new("SelectionBox")
local Tool = script.Parent;

local Select
local Orig	
local Dragger

function onButton1Down(mouse)

	local Target = mouse.Target
	local Sound = Instance.new("Sound")-- The "ding" sound
	Sound.SoundId = "rbxasset://sounds\\electronicpingshort.wav"
	Sound.Name = "PewPew"
	Sound.Parent = Tool

	if Target and Target:IsA("BasePart") and not Target.Locked then
		if debounce == false then
		debounce = true
		Orig = Target
		Select = Orig:clone()

		Select.Parent = game.Workspace
		Select.Position = Orig.Position + Vector3.new(0, 0.4, 0)

		Dragger = Instance.new("Dragger")
		pcall(function() Dragger:MouseDown(Select, Vector3.new(0, 0, 0), {Select}) end)

		SBox.Adornee = Select
		Sound:Play()
		wait(1.5)
		mouse.Icon = "rbxasset://textures\\DragCursor.png"
		debounce = false
		end
	end
end

function onButton1Up(mouse)
	if Dragger then
		Orig = nil
		pcall(function() Dragger:MouseUp() end)
		Select = nil
		SBox.Adornee = nil
		Dragger = nil
		mouse.Icon = "rbxasset://textures\\CloneOverCursor.png"
	end
end

function onMouseMove(mouse)
	if Dragger then
		mouse.Icon = "rbxasset://textures\\GrabRotateCursor.png"
		pcall(function() Dragger:MouseMove(mouse.UnitRay) end)
	else
		local Target = mouse.Target
		if Target and Target:IsA("BasePart") and not Target.Locked then
			mouse.Icon = "rbxasset://textures\\CloneOverCursor.png"
		else
			mouse.Icon = "rbxasset://textures\\CloneCursor.png"
		end
	end
end

function onKeyDown(key)
	if Dragger then
		key = key:lower()
		if key == 'r' then
			Dragger:AxisRotate(Enum.Axis.Y)
		elseif key == 't' then
			Dragger:AxisRotate(Enum.Axis.Z)
		end
	end
end

function onEquippedLocal(mouse)
	SBox.Color = BrickColor.new("Cyan")
	SBox.Parent = vPlayer.PlayerGui

	mouse.Button1Down:connect(function() onButton1Down(mouse) end)
	mouse.Button1Up:connect(function() onButton1Up(mouse) end)
	mouse.Move:connect(function() onMouseMove(mouse) end)
	mouse.KeyDown:connect(onKeyDown)
end

function onUnequippedLocal(mouse)
	if Tool:findFirstChild("PewPew") then
		Tool.PewPew:remove()
	end
	if Dragger then
		Orig = nil
		pcall(function() Dragger:MouseUp() end)
		Select = nil
		SBox.Adornee = nil
		Dragger = nil
	end
end

Tool.Equipped:connect(onEquippedLocal)
Tool.Unequipped:connect(onUnequippedLocal)
		

I obviously didn't type most of this script, so some parts may seem outdated.