Collisions for player limbs set to false when in PlatformStand

This problem started when I wanted to make a r6 ragdoll for my new fighting game, the simple problem was that the limbs of the player would simply not collide with the default collision group, resulting in something like this :

image

I would like to know if there is a way to make it so the arms don’t collide with the floor for example, since that looks extremely weird, any idea on what could I do?

Code :

local players = game.Players
local pService = game:GetService("PhysicsService")

pService:CreateCollisionGroup("BodyParts")
pService:CollisionGroupSetCollidable("BodyParts", "Default", true)
pService:CollisionGroupSetCollidable("BodyParts", "BodyParts", true)

function createGlue(part0, part1, name, char)
	local glue = Instance.new("Glue", char.Torso)
	glue.Part0 = part0
	glue.Part1 = part1
	glue.Name = name
	
	return glue
end

players.PlayerAdded:Connect(function(plr)
	plr.CharacterAdded:connect(function(char)
		local motorParts = {char.Torso["Right Hip"],char.Torso["Left Hip"], char.Torso["Right Shoulder"], char.Torso["Left Shoulder"]}
		local isTrip = char:WaitForChild("isTrip")
		
		for i,v in pairs(char:GetChildren()) do
			if v.Name == "Right Leg" or v.Name == "Right Arm" or v.Name == "Left Leg" or v.Name == "Left Arm" then
				local glue = createGlue(char.Torso, v, v.Name, char)
				
				pService:SetPartCollisionGroup(v, "BodyParts")
				
				if v.Name == "Right Leg" then
					glue.C0 = CFrame.new(0.5, -1, 0, 0, 0, 1, 0, 1, 0, -1, -0, -0)
					glue.C1 = CFrame.new(0, 1, 0, 0, 0, 1, 0, 1, 0, -1, -0, -0)
				end
				if v.Name == "Left Leg" then
					glue.C0 = CFrame.new(-0.5, -1, 0, -0, -0, -1, 0, 1, 0, 1, 0, 0)
					glue.C1 = CFrame.new(-0, 1, 0, -0, -0, -1, 0, 1, 0, 1, 0, 0)
				end 
				if v.Name == "Right Arm" then
					glue.C0 = CFrame.new(1.5, 0.5, 0, 0, 0, 1, 0, 1, 0, -1, 0, 0)
					glue.C1 = CFrame.new(0, 0.5, 0, 0, 0, 1, 0, 1, 0, -1, 0, 0)	
				end
				if v.Name == "Left Arm" then
					glue.C0 = CFrame.new(-1.5, 0.5, 0, 0, 0, -1, 0, 1, 0, 1, 0, 0)
					glue.C1 = CFrame.new(0, 0.5, 0, 0, 0, -1, 0, 1, 0, 1, 0, 0)	
				end
			end
		end
		
		
		isTrip:GetPropertyChangedSignal("Value"):connect(function()
			if isTrip.Value == true then
				for i,v in pairs(motorParts) do
					v.Part0 = nil
				end
				char.Humanoid.PlatformStand = true
			end
			if isTrip.Value == false then
				for i,v in pairs(motorParts) do
					v.Part0 = char.Torso
				end
				char.Humanoid.PlatformStand = false
			end
		end)
	end)
end)
3 Likes

The behaviour you’re seeing here is intentional. Limbs are not meant to collide with the world and never do. Even without PlatformStand, the limbs don’t have any actual collision which also explains why you can put your arms through walls. The Humanoid stays atop surfaces through raycasting.

While the Humanoid is in the PlatformStand state (might be better to use Physics so you can explicitly control when a player enters or exits ragdolling), you can enable the collision of the limbs. That’s at least what I think you can do, assuming you won’t run into any troubles with flinging.

Old topic, still relevant because there’s 0 clear answers for this issue, as PlatformStand and Physics both don’t allow for player limbs collision’ to be enabled.

Hold on… cause, then I did something wrong/weird. I used Physics State for my Ragdoll System, and Limbs and Everything Collides perfectly. I even added NO collision constraints cause, the collision was too extreme. I dont want a Upper Arm to collide with the Torso, but I still need it collides with the floor…
Check that again, cause Physics State enables collision for all parts of the character.

Is that all you did? For the humanoid being ragdolled you just set its state to Physics, and then collisions were all toggleable?

maybe make it so that when the player ragdolls it clones all of it limbs and welds it to them while hiding them and having their cancollide on then deleting them the moment the ragdoll ends, that would work
(for reference this is what I’m using, I also make sure it doesnt clone HumanoidRootPart)

for i, part : Part in pairs(char:GetChildren()) do
		if part:IsA("Part") and part.Name ~= "HumanoidRootPart" then
			local part2 = part:Clone()
			part2.Parent = part
			part2.Name = "FAKELIMB"
			part2.CanTouch = false
			part2.CanCollide = true
			part2.Transparency = 1
			part2.Massless = true
			local falseweld = Instance.new("WeldConstraint")
			falseweld.Parent = part2
			falseweld.Part0 = part2
			falseweld.Part1 = part
		end
	end
end

I am very sorry for bumping I am leaving this message for other developers

Physics state stops all other states and is similar to platform stand but it keeps collisions on
it should be what you are searching for

1 Like