I can think of two options:
- Create a new trace channel in edit global settings; call it “placement”
- Put a new blocker volume in the world, set it to block “placement” and ignore all other tests
- Use this trace channel in the test of position-under-cursor
or:
- Do what you do now
- Normalize the vector you get (from camera to whatever position you hit) to length 1
- Project the vector to the plane where you want to get the location (divide by dot between vector and plane normal; multiply by distance-to-plane from camera center)