Ragdolls and seats, how do you handle seats?

For those using temporary ragdolls that can be recovered/unragdolled, I’ve noticed odd behavior when a ragdolled character falls onto or touches a seat. Once this happens the unragdoll doesn’t work properly and the character isn’t able to recover properly.

I can prevent the player from ragdolling in the first place if they are seated, but this doesn’t help if they ragdoll and then fall due to gravity and land on a seat.

I don’t have any script to review here, I just wanted to know if anyone else had these issues and how you worked around it.

Thanks.

1 Like

You can’t really work around it. Sadly, you will have to disable the seats for the client.

1 Like

Yeah most of the times seats will cause a lot of issues due to the automatic onTouch seating behavior like NPCS sitting down and the current ragdoll problem.

To solve this you gotta disable the seats as @alexfinger21 said, however even though the seat is disabled you are still able to use the Seat:Sit(humanoid) command to make the player sit down so you can get the intended purpose of letting only the player sit work.

Moreover, because the seating is operated via script you can also prevent ragdoll players from sitting via a bool setting perhaps through a boolean Value Instance in the player.

Just use the provided proximityprompt script they gave out during the announcement and modify it to prevent players in ragdoll state from sitting.

Provided proximity prompt sit
local proximityPrompt = script.Parent
local seat = proximityPrompt.Parent.Seat
seat:GetPropertyChangedSignal("Occupant"):Connect(function()
    if seat.Occupant then
        proximityPrompt.Enabled = false
    else
        proximityPrompt.Enabled = true
    end
end)
proximityPrompt.Triggered:Connect(function(player)
    seat:Sit(player.Character.Humanoid)
end)
2 Likes

I was looking at the Seat API and wondering, maybe in the ragdoll script, I can connect to the humanoid seated event:
humanoid.Seated:Connect(onSeated)

and then use this to break the seat weld:
seat:FindFirstChild(“SeatWeld”):Destroy()

But then if the ragdoll is still touching it, I suppose it will just get stuck in a loop. If I disable the seat, I’d have to enable it again if the player un-ragdolls.

I’ll have to try that and see if it works.

Okay, I was hoping to not have to disable every seat in the game for this, but that is one option.

Thanks.

Hmm, another option is to disable every seat locally upon ragdoll which should be pretty easy to do if you use collection services mark a seat with a tag either manually through plugin or a script looping through workspace descendants in the command bar then using :GetTagged and disabling all those seats.

Hence you can still retain the touch behavior for others while avoiding the automatic on touch seat weld for the ragdolled player.

1 Like

This method didn’t work, destroying the seatweld gets you out of the seat, but it leaves the SeatPart so the character can’t sit again after doing this.

I tried humanoid.Sit = false which kind of worked, but a few times left the character stuck glitched in freefall state.

Maybe I should try the ‘disable all seats in the workspace’ method. But I don’t really want to introduce a glitch where the player gets stuck not being able to sit (use a vehicle).