Thanks for the proposed solution, but this is basically what I’m doing right now (except that VehicleRiding blocks VehicleRiding and PlayerRiding blocks Player Riding).
The problem is that Vehicles and players should always block all other vehicles and players, regardless of whether they are on vehicles or not. The only time two entities should overlap is when a player is riding their own vehicle.
Right now when a ridden vehicle attempts to collide with a player on another vehicle, it has to do an overlap test and come up with a collision response. I also need to do this while a player is getting on or off the vehicle (so they don’t collide with their own vehicle trying to get on/off). That means collision is going to act differently the moment before a player begins getting on a vehicle and the moment after. Even if I manage to get the overlap response to behave just like the hit response, managing the two code paths is annoying and error prone.
With collision layers per-player, I can just respond to component hits and be confident that the physics calculations and collision responses are going to be done properly and consistently.