Ragdoll death script creating extra Dummy

I have this ragdoll death script, and it randomly started creating an extra Dummy with a Humanoid only. What is causing this?

Summary
repeat wait() until workspace.CurrentCamera ~= nil
wait(0.001)

local cleanUpTime = 180

local function NewHingePart()
	local B = Instance.new("Part")
	B.TopSurface = 0 B.BottomSurface = 0
	B.Shape = "Ball"
	B.Size = Vector3.new(1, 1, 1)
	B.Transparency = 1 B.CanCollide = true
	return B
end
local function CreateJoint(j_type, p0, p1, c0, c1)
	local nj = Instance.new(j_type)
	nj.Part0 = p0 nj.part1 = p1
	if c0 ~= nil then nj.C0 = c0 end
	if c1 ~= nil then nj.C1 = c1 end
	nj.Parent = p0
end

local AttactmentData = {

	["RA"] = {"Right Arm", CFrame.new(0, 0.5, 0), CFrame.new(1.5, 0.5, 0), CFrame.new(1.5, 0, 0)},
	["LA"] = {"Left Arm", CFrame.new(0, 0.5, 0), CFrame.new(-1.5, 0.5, 0), CFrame.new(-1.5, 0, 0)},
	["RL"] = {"Right Leg", CFrame.new(0, 0.5, 0), CFrame.new(0.5, -1.5, 0), CFrame.new(0.5, -2, 0)},
	["LL"] = {"Left Leg", CFrame.new(0, 0.5, 0), CFrame.new(-0.5, -1.5, 0), CFrame.new(-0.5, -2, 0)},
}

local collision_part = Instance.new("Part")
collision_part.Name = "CP"
collision_part.TopSurface = Enum.SurfaceType.Smooth
collision_part.BottomSurface = Enum.SurfaceType.Smooth
collision_part.Size = Vector3.new(1, 1.5, 1)
collision_part.Transparency = 1

local camera = workspace.CurrentCamera
local char = script.Parent

function Ragdoll()
	char.Archivable = true
	local ragdoll = char:clone()
	char.Archivable = false

	local hdv = ragdoll:FindFirstChild("Head")

	for _, obj in pairs(char:GetChildren()) do 
		if not obj:IsA("Humanoid") then
			obj:destroy()
		end
	end

	local function scan(ch)
		for i = 1, #ch do
			scan(ch[i]:GetChildren())
			if (ch[i]:IsA("ForceField") or ch[i].Name == "HumanoidRootPart") or ((ch[i]:IsA("Weld") or ch[i]:IsA("Motor6D")) and ch[i].Name ~= "HeadWeld" and ch[i].Name ~= "AttachementWeld") then
				ch[i]:destroy()
			end
		end
	end
	scan(ragdoll:GetChildren())
	local function scanc(ch)
		for _, obj in pairs(ch:GetChildren()) do
			scanc(obj)
			if obj:IsA("Script") or obj:IsA("LocalScript") or ((obj:IsA("Weld") or obj:IsA("Motor6D")) and obj.Name ~= "AttachementWeld") or obj:IsA("ForceField") or (obj:IsA("Snap") and obj.Parent.Name == "Torso")
				or obj:IsA("ParticleEmitter")then
				obj:destroy()
			elseif obj:IsA("BasePart") then
				obj.Velocity = Vector3.new(0, 0, 0)
				obj.RotVelocity = Vector3.new(0, 0, 0)
				if obj.Parent:IsA("Accessory") then
					obj.CanCollide = false
				end
			end
		end
	end
	scanc(ragdoll)

	local f_head

	local fhum = ragdoll:FindFirstChild("Humanoid")
	fhum.HealthDisplayType = Enum.HumanoidHealthDisplayType.AlwaysOff
	fhum.PlatformStand = true
	fhum.DisplayDistanceType = Enum.HumanoidDisplayDistanceType.None
	fhum.Name = "RagdollHumanoid"

	local Torso = ragdoll:FindFirstChild("Torso")
	if Torso then
		Torso.Velocity = Vector3.new(math.random(), 0.0000001, math.random()).unit * 5 + (Vector3.new(0, 0.15, 0))
		local Head = ragdoll:FindFirstChild("Head")
		if Head then
			camera.CameraSubject = Head
			CreateJoint("Weld", Torso, Head, CFrame.new(0, 1.5, 0))
		end

		for att_tag, att_data in pairs(AttactmentData) do
			local get_limb = ragdoll:FindFirstChild(att_data[1])
			if get_limb ~= nil then

				local att1 = Instance.new("Attachment")
				att1.Name = att_tag
				att1.CFrame = att_data[2]
				att1.Parent = get_limb

				local att2 = Instance.new("Attachment")
				att2.Name = att_tag
				att2.CFrame = att_data[3]
				att2.Parent = Torso

				local socket = Instance.new("BallSocketConstraint")
				socket.Name = att_tag .. "_SOCKET"
				socket.Attachment0 = att2
				socket.Attachment1 = att1
				socket.Radius = 0
				socket.Parent = Torso

				get_limb.CanCollide = false

				local cp = collision_part:Clone()
				local cp_weld = Instance.new("Weld")
				cp_weld.C0 = CFrame.new(0, -0.25, 0)
				cp_weld.Part0 = get_limb
				cp_weld.Part1 = cp
				cp_weld.Parent = cp
				cp.Parent = ragdoll
			end
		end
	end
	ragdoll.Parent = workspace
	game:GetService("Debris"):AddItem(ragdoll, cleanUpTime)
	fhum.MaxHealth = math.huge
	fhum.Health = fhum.MaxHealth
end

char.Humanoid.Died:connect(Ragdoll)

It looks like the Ragdoll() function is creating a duplicate character by cloning the original character and then removing some of its components. It appears that the scan() and scanc() functions are used to remove certain objects from the cloned character, but these functions may not be removing everything that they are intended to.

One possible cause of the issue is that the scan() function is not recursively scanning all of the children of the cloned character. The scan() function uses a for loop to iterate over the children of the character, but it does not call itself recursively on the children of each child. This means that the scan() function will only scan the immediate children of the character, and not any grandchildren or deeper descendants.

To fix this issue, you can change the scan() function to use a recursive approach.

1 Like

I should have clarified this but the script is creating a function ragdoll like its supposed to, but its also creating an extra dummy on top of that.

image

Might I add that it only does this with dummies, not actual players.

1 Like