One really jank way of doing it would be to put a part above the moving object so they can stand ontop of it but cannot push it? Just will have to get a way of tracking the moving object with the part.
What about casting a ray from the HumanoidRootPart to the floor? This method is precise enough for what you’re looking.
local function CollisionDetect()
local Result = workspace:Raycast(HumanoidRootPart.Position, Vector3.new(0, -1, 0) * 3, Params)
if Result then
Result.Instance.CanCollide = true
end
end
Actually, in your case I would use the AlignPosition and Angular velocity constraint instead. If you select Rigidity enabled the Parts will not move from their target.
(It will end up moving the player)
Also, I think there is a way to have a touched event fired with no collide parts.