- The why
In your guides, you have a bunch of loose controllers that have no parents. It seems that’s why those joints were getting an org group. That seems to have changed in 4.2.2 (or earlier). This doesn’t have anything to do with Maya 2024.
(If I build in Maya 2023 with 4.0.9 vs. 4.2.2 I have org groups and not, respectively. So it’s just something that seems to have changed sometime between 4.0.9 and 4.2.2)
- The WHY?
In your rig, you have a bunch of loose controllers and joints that don’t follow the rig. I guess you end up having to constrain them in post scripts or additional steps?
The Biped template has that too. But only for the UI nodes. Those nodes don’t have corresponding joints. And you can attach them to the rig by parenting the guides, or by giving them a single space switch to follow. I make mine follow my COG control.
And when I make something like a weapon joint, I still make sure it’s parented under the root, and all the other joints are under the root. Even if there is a root-motion control to be able to move the root independently. (More for Unreal, maybe?)
Anyway, none of that matters if your rig works!
- The what-to-do:
Again, I’ll just say I would personally clean up the rig and have a clean skeleton going forward. But I get it if that would be too costly to fix up all your existing game systems.
So here is a potential alternative. A Python post-script which should be general enough to be able to run on any rig, and commented enough for you to fix if it doesn’t suit all your rigs. But I made this with only one example rig. So ya know… test. 
- It looks through all the first-level children of your guide.
- If there is a matching joint, AND if that joint doesn’t already have a
jnt_org
group:
- It will add that org group at origin, and parent the joint under it.
- So on the guide you sent me, if you run this on the build 4.2.2 rig, it will add the extra
_jnt_org
groups for local, root, and gun.
import pymel.core as pm
guideRoot = pm.PyNode('guide')
for eachGuide in guideRoot.getChildren(type='transform'):
# After the rig is built, it will name clash, so find only the shortest name:
shortGuideName = eachGuide.name().split('|')[-1]
# Then grab the first part of the name. Example gun_C0_root -> gun_C0
nameToken = shortGuideName.replace('_root','')
# Then check if (example) gun_C0_*_jnt exists.
# This finds every joint that has a corresponding UNPARENTED guide root.
matchingJoints = pm.ls('{}_*_jnt'.format(nameToken), type='joint')
# If that joint is found, then add an npo and name it _jnt_org
if matchingJoints:
# Get the first one in the list since we were searching by wildcard.
# We searched by wildcard because the joints have an additional _0_jnt or _root_jnt name.
matchingJoint = pm.PyNode(matchingJoints[0])
# Also make sure it doesn't already have that group. If so, skip it.
if matchingJoint.getParent().name() == matchingJoint.name() + '_org':
continue
print("adding joint_org to {}".format(matchingJoint.name()))
# Add an empty group. In 4.0.9, the jnt_org group was at origin.
npo = pm.group(em=True, name=matchingJoint.name() + '_org')
pm.parent(npo, matchingJoint.getParent())
pm.parent(matchingJoint, npo)