Easiest way to make a ragdoll script?

Hi! The topic is quite self explanatory. I want to know the easiest way to make a character ragdoll. I have searched several posts but most don’t work. I also tried using an external module but it gets complicated and interferes with other things.

3 Likes

Place in StarterCharacter

--> LOCAL VARIABLES
local Humanoid = script.Parent:WaitForChild("Humanoid")

--> CODE
Humanoid .BreakJointsOnDeath = false

--> FUNCTIONS
Humanoid.Died:Connect(function()
	for index,joint in pairs(script.Parent:GetDescendants()) do
		if joint:IsA("Motor6D") then
			local socket = Instance.new("BallSocketConstraint")
			local a1 = Instance.new("Attachment")
			local a2 = Instance.new("Attachment")
			a1.Parent = joint.Part0
			a2.Parent = joint.Part1
			socket.Parent = joint.Parent
			socket.Attachment0 = a1
			socket.Attachment1 = a2
			a1.CFrame = joint.C0
			a2.CFrame = joint.C1
			socket.LimitsEnabled = true
			socket.TwistLimitsEnabled = true
			joint:Destroy()
		end
	end
end)
27 Likes
local Character = script.Parent
local Humanoid = Character:WaitForChild("Humanoid")
Humanoid.BreakJointsOnDeath = false

local function OnHumanoidDied()
	for _, Part in ipairs(Character:GetChildren()) do
		if Part:IsA("BasePart") then
			local Motor6D = Part:FindFirstChildWhichIsA("Motor6D")
			if Motor6D then
				if Part.Name ~= "Head" then
					local BallSocket = Instance.new("BallSocketConstraint")
					local Attachment1 = Instance.new("Attachment")
					local Attachment2 = Instance.new("Attachment")
					Attachment1.CFrame = Motor6D.C0
					Attachment2.CFrame = Motor6D.C1
					Attachment1.Parent = Motor6D.Part0
					Attachment2.Parent = Motor6D.Part1
					BallSocket.Attachment0 = Attachment1
					BallSocket.Attachment1 = Attachment2
					BallSocket.Parent = Motor6D.Parent
					Motor6D:Destroy()
				elseif Part.Name == "Head" then
					local WeldConstraint = Instance.new("WeldConstraint")
					WeldConstraint.Part0 = Motor6D.Part0
					WeldConstraint.Part1 = Motor6D.Part1
					WeldConstraint.Parent = Motor6D.Parent
				end
			end
		end
	end
end

Humanoid.Died:Connect(OnHumanoidDied)

Just a slight improvement with the head fixed.

14 Likes

I’d recommend :Once() instead of :Connect() in this case.

7 Likes

I love bumping old threads

also, every time a player respawns, Player.Character will always have a different Humanoid than last time, so you cannot re-use the same Humanoid including the Connect function

7 Likes

its a different script each character bro

5 Likes

Doesn’t make a difference in this case since all signals of an Instance are disconnected auto when the Instance is destroyed

The Humanoid instance is not destroyed immedietly. There are rare cases when .Died can fire multiple times. There are several devforum posts about this issue.