Four separate third-person defects, one shared root: the arms were posed at
art-directed ANGLES that merely approximated the gun, and a stuck one-shot
flag kept handing them back to the animation clip.
- The rifle hold was silently DEAD after the first reload or throw. The gate
trusted AnimationNodeOneShot's `active` parameter, which never clears, so
clip_owns_arms stayed true forever and the clip drove the arms while the
gun hung off the hand. `_upper_lock` (a timer we own) is now the
authority, and the one-shot is explicitly faded out when it expires.
This alone is why the gun was never held correctly.
- Arms are now solved with real two-bone IK (`_ik_arm`) onto points derived
from the WEAPON: the stock is anchored in the shoulder pocket, the grip
and foregrip fall out along the barrel, and the support hand is placed on
the actual handguard (sliding inboard if the model is too long to reach).
Verified numerically: the hand lands within 2mm of its target.
- `_measure_weapon` measures the model's AABB along its barrel and re-seats
it so the hand sits at a realistic pistol-grip point. Weapon models put
their origin anywhere — the M4's was 10cm from the muzzle end, so parking
its stock in the shoulder drove the hand INTO the shoulder and folded the
arm up behind the head.
- Recoil now shows for the OWNER in third person: server_play_fire_effects
only ever fired for remote shooters, so the local player saw nothing. The
ammo counter dropping now kicks the model. The kick rides in the gun's aim
direction so the IK carries BOTH hands up with it, instead of rotating the
arms and shoving the support hand off the gun.
- Reload no longer flips the gun. The library's pistol-reload rotates the
wrist the gun is parented to, which turned the rifle upside-down (mag to
the sky) while the hand reached down for it. The hold now keeps the right
arm through a reload and the support hand does the magazine work at the
real mag well, under the receiver.
anim_capture gains recoil shots and lets ADS settle before framing;
debug/dump_bones.gd prints a skin's bone hierarchy.
Co-Authored-By: Claude Opus 4.8 <[email protected]>
Two fidelity gaps closed:
- Reload/throw/shoot/hit used to REPLACE the whole-body clip, so reloading
mid-slide snapped the character upright on standing legs. The model now
runs a runtime AnimationTree (clips -> Transition -> TimeScale -> OneShot)
whose one-shot layer is FILTERED to upper-body bones: the arms play the
action while the legs keep sliding/running/falling. Land stays full-body.
The rifle hold releases exactly while the one-shot node reports active.
- Grapple no longer plays the library's horizontal-swim clip. The zip pose
is procedural: Fall as the airborne base, the spine pivots to fly along
the line to the actual anchor point (capped so overhead shots don't fold
the body), the head sights the anchor, legs trail behind, the FREE left
hand reaches up the rope — and the right hand keeps holding the rifle.
The anchor point feeds in from the controller for local and remote
players (synced_grapple_point).
- anim_capture: deterministic open-ground teleport + two new regression
shots (reload-while-sliding, grapple zip toward a real anchor).
Co-Authored-By: Claude Fable 5 <[email protected]>
The clips were playing all along, but every locomotion state used unarmed
jog arms while the gun floated at the hip, so nothing looked animated.
- ShooterPoseModifier now REPLACES the arm chain with a direction-based FK
rifle hold (low-ready at hip, shouldered on ADS) instead of nudging the
unarmed clip additively; the wrist is solved so the muzzle points exactly
along the aim line, gun kept upright (no-roll constraint).
- Per-arm release logic: reload/throw/hit one-shots, dance, death, the
slide ground-brace, wall-run reach and grapple free the authored clips.
- Third-person weapon: fixed re-hide on weapon swap while in third person,
scaled to character proportions, gripped along the hand.
- Armed idle uses Idle (arms owned by the hold) instead of arms-crossed
PistolIdle base.
- FP viewmodel arms: character-styled sleeve + teal cuff + skin hand
instead of the blue slabs.
- debug/anim_capture.gd: front+side screenshots of every movement state,
one-shot action and ADS for visual regression of the model pipeline.
Co-Authored-By: Claude Fable 5 <[email protected]>