Thanks for the Ragdoll Module! It took a bit of work to figure it out how you do Ragdolls with it, but I eventually got it.
For those of you struggling like I did here is some code that works for me.
Script (Server side)
game.Players.PlayerAdded:Connect(function(Player)
Player.CharacterAdded:Connect(function(Character)
task.wait(0.1)
local RagdollModule = require(game.ServerScriptService.RagdollModule)
RagdollModule:RigPlayer(Character)
end)
end)
LocalScript (Client Side) at (game.StarterPlayer.StarterCharacterScripts.LocalScript)
local function ChangeRagdoll(ragdoll : boolean)
local Character = script.Parent
local Humanoid : Humanoid = Character:WaitForChild("Humanoid")
for _,v in pairs(Enum.HumanoidStateType:GetEnumItems()) do
if v ~= Enum.HumanoidStateType.Ragdoll and v ~= Enum.HumanoidStateType.None then
Humanoid:SetStateEnabled(v, (not ragdoll))
end
end
task.wait(0.1)
if ragdoll then
Humanoid:ChangeState(Enum.HumanoidStateType.Ragdoll)
else
Humanoid:ChangeState(Enum.HumanoidStateType.GettingUp)
end
end
Do Note: you are going to have to trigger the ChangeRagdoll function yourself. I triggered the function with a RemoteEvent because I wanted the server can control when the player enters Ragdoll (I did not show this here).
Nice, but it doesn’t seem to work for me @kalabgs. I’m rigging each player’s characters upon join, and I know that’s not the problem because the RiggedUser attribute is appearing on the humanoid. Whenever a player dies, their body just falls flat and their head falls off and goes through the baseplate.
local function PlayerAdded(Player: Player)
Player.CharacterAdded:Connect(function(character)
RagdollModule:RigPlayer(character)
end)
end
Players.PlayerAdded:Connect(PlayerAdded)
for _, v in ipairs(Players:GetPlayers()) do
task.spawn(function()
PlayerAdded(v)
end)
end
Getting some weird issues. I rig when a character is added, although for certain characters, it says v.Part0 of the weld is nil. When I go into the explorer and look at the weld, it’s not nil.
Edit: I fixed it by waiting to rig the character until the first time I ragdoll them, although this does not seem efficient.
Not sure if he changed the state change value but it works now after changing the HumanoidStateType to Enum.HumanoidStateType.Physics instead of .Ragdoll
I Decided to change some stuff back-end meaning visually it all should be the same.
What I changed:
No more collision groups or extra parts.
Different way to track character died.
Took the connections out of the for loop.
Added GettingUp state to recover the character from being in ragdoll.
Ragdoll on Humanoids death.
Update! (2023-05-28):
Removed connections completely out of module.
Added 3 ragdoll states instead (Ragdoll, Recover and Death) trigger them in server script that checks if humanoid state changed or if the player has died.
Usage is pretty much the same, except that you will now have to change humanoid state into gettingup for the character to stand back up to normal.
Usage is the same except now you handle connection functions outside the module and tell the module to perform its task from the script instead.
Example Localscript
local plr = game:GetService("Players").LocalPlayer
local char = script.Parent
local input = game:GetService("UserInputService")
local db = false
input.InputBegan:Connect(function(key)
if key.KeyCode == Enum.KeyCode.P then
if db == false then
db = true
--Ragdoll character!
plr.Character.Humanoid:ChangeState(Enum.HumanoidStateType.Physics)
else
db = false
--Recover character from ragdoll!
plr.Character.Humanoid:ChangeState(Enum.HumanoidStateType.GettingUp)
end
end
end)
(also remember that in this module you have to use physics state to trigger ragdoll)
My update on this module:
Module(Updated)
local mod = {}
function mod:RigPlayer(Character : Model)
local hum : Humanoid? = Character:WaitForChild("Humanoid")
local hrp : BasePart? = Character:WaitForChild("HumanoidRootPart")
assert(hum,Character.Name.." isnt a humanoid")
hum.BreakJointsOnDeath = false
local WeldConstranint = Instance.new("WeldConstraint",hrp)
for _,v in pairs(Character:GetDescendants()) do
if v:IsA("Motor6D") then
local BallSocket = Instance.new("BallSocketConstraint",v.Part0)
BallSocket.Name = "BC"
if v.Part1 ~= Character.PrimaryPart and v.Part0 ~= Character.PrimaryPart then
v.Part1.CanCollide = false
v.Part0.CanCollide = false
end
local att1 = Instance.new("Attachment",v.Part0) att1.Name = "AttRag"
local att2 = Instance.new("Attachment",v.Part1) att1.Name = "AttRag"
att2.Position = v.C1.Position
att1.WorldPosition= att2.WorldPosition
BallSocket.LimitsEnabled = true
BallSocket.TwistLimitsEnabled = true
BallSocket.Attachment0 = att1
BallSocket.Attachment1 = att2
if v.Part0 == Character.PrimaryPart and v.Part1 ~= Character.PrimaryPart then
WeldConstranint.Part0 = Character.PrimaryPart
WeldConstranint.Part1 = v.Part1
WeldConstranint.Enabled = false
end
end
end
end
function mod:Ragdoll(Character : Model)
local humanoid : Humanoid = Character:WaitForChild("Humanoid")
for _, v in ipairs(Character:GetDescendants()) do
if v:IsA("Motor6D") then
if v.Part1 ~= Character.PrimaryPart and v.Part0 ~= Character.PrimaryPart then
v.Part1.CanCollide = true
v.Enabled = false
else
Character.PrimaryPart:FindFirstChild("WeldConstraint").Enabled = true
Character.PrimaryPart.CanCollide = false
end
end
end
end
function mod:Recover(Character : Model)
local humanoid : Humanoid = Character:WaitForChild("Humanoid")
for _, v in ipairs(Character:GetDescendants()) do
if v:IsA("Motor6D") then
if v.Part1 ~= Character.PrimaryPart and v.Part0 ~= Character.PrimaryPart then
v.Part1.CanCollide = false
v.Enabled = true
else
Character.PrimaryPart:FindFirstChild("WeldConstraint").Enabled = false
Character.PrimaryPart.CanCollide = true
end
end
end
end
function mod:Deathphysics(Character : Model)
for _, v in ipairs(Character:GetDescendants()) do
if v:IsA("Motor6D") then
if v.Part1 ~= Character.PrimaryPart and v.Part0 ~= Character.PrimaryPart then
v.Part1.CanCollide = true
v:Destroy()
else
Character.PrimaryPart:FindFirstChild("WeldConstraint").Enabled = true
Character.PrimaryPart.CanCollide = false
end
end
end
end
return mod
The original can be found at the top of the page! This is not the original, this is a community updated version.