I decided I'd like a ragdoll script for my game so I tried making my own and letting the common free model ragdoll script guide me. I didn't copy it exactly, but I'm curious what I'm missing here. I anchored the torso just so the character didn't fling, and I notice that the limbs rarely stay loosely connected to my torso (which is what I want) and they usually fling off, despite me having glued them to the torso. If anyone knows more about glues and welds than I do, I'd appreciate any feedback. I just really don't want to use a free model and I wanna figure out how to do this on my own. You can actually disregard the waitForChild function, it works fine.
function waitForChild(parent, childName)
local function round(n, dp)
local dp = dp or 2
return math.floor((n * (10 ^ dp)) + .5) / (10 ^ dp)
end
local child = parent:FindFirstChild(childName)
local expired = 0
while not child do
if expired < 3 then
expired = expired + wait(0)
elseif expired >= 3 and expired < 7 then
local t = tick()
parent.ChildAdded:wait()
expired = expired + (tick() - t)
else
print("waitForChild >> Failed to find " .. parent.Name .. "." .. childName .. " after 7 seconds :(")
return nil
end
child = parent:FindFirstChild(childName)
end
print("waitForChild >> Found " .. parent.Name .. "." .. childName .. (expired <= 0 and " immediately." or " after " .. round(expired, 3) .. "s."))
return child
end
local char = script.Parent
local hum = waitForChild(char, "Humanoid")
local torso = waitForChild(char, "Torso")
local mods = {}
hum.Died:connect(function()
print(script.Name .. " >> Attempting ragdoll for " .. char.Name .. "...")
hum.Parent = nil
torso.Anchored = true
local head = char:FindFirstChild("Head")
local rarm = char:FindFirstChild("Right Arm")
local larm = char:FindFirstChild("Left Arm")
local rleg = char:FindFirstChild("Right Leg")
local lleg = char:FindFirstChild("Left Leg")
if head then
local neck = Instance.new("Weld")
neck.Name = "Neck"
neck.Part0 = torso
neck.Part1 = head
neck.C0 = CFrame.new(0, 1.5, 0)
neck.C1 = CFrame.new()
neck.Parent = torso
end
if rarm then
rarm.CFrame = torso.CFrame * CFrame.new(1.5, 0, 0)
local j = Instance.new("Glue")
j.Name = "RightShoulder"
j.Part0 = torso
j.Part1 = rarm
j.C0 = CFrame.new(1, 0.5, 0, 0, 0, 1, 0, 1, 0, -1, -0, -0)
j.C1 = CFrame.new(-0.5, 0.5, 0, 0, 0, 1, 0, 1, 0, -1, -0, -0)
j.Parent = torso
end
if larm then
larm.CFrame = torso.CFrame * CFrame.new(1.5, 0, 0)
local j = Instance.new("Glue")
j.Name = "LeftShoulder"
j.Part0 = torso
j.Part1 = larm
j.C0 = CFrame.new(-1, 0.5, 0, -0, -0, -1, 0, 1, 0, 1, 0, 0)
j.C1 = CFrame.new(0.5, 0.5, 0, -0, -0, -1, 0, 1, 0, 1, 0, 0)
j.Parent = torso
end
if rleg then
rleg.CFrame = torso.CFrame * CFrame.new(.5, -2, 0)
local j = Instance.new("Glue")
j.Name = "RightHip"
j.Part0 = torso
j.Part1 = rleg
j.C0 = CFrame.new(1, -1, 0, 0, 0, 1, 0, 1, 0, -1, -0, -0)
j.C1 = CFrame.new(0.5, 1, 0, 0, 0, 1, 0, 1, 0, -1, -0, -0)
j.Parent = torso
end
if lleg then
lleg.CFrame = torso.CFrame * CFrame.new(-.5, -2, 0)
local j = Instance.new("Glue")
j.Name = "LeftHip"
j.Part0 = torso
j.Part1 = lleg
j.C0 = CFrame.new(-1, -1, 0, -0, -0, -1, 0, 1, 0, 1, 0, 0)
j.C1 = CFrame.new(-0.5, 1, 0, -0, -0, -1, 0, 1, 0, 1, 0, 0)
j.Parent = torso
end
print("delay? :D")
wait(5)
end)
