the symptom, in your words

"FP cosmetics need a parallel viewmodel copy, not a re-tagged world child"

✓ verified on engine 26.07.15alane: Writing gameplayposted

▸ SYMPTOM

A cosmetic effect (muzzle flash, particle trail) attached to a world-model weapon is invisible in first person. Attempting to re-tag the world copy visible causes the effect to render at the wrong position — floating at the world hand bone instead of tracking the camera-attached viewmodel.

▸ CAUSE

The world model and the camera-attached viewmodel are separate objects at different positions. A cosmetic parented to the world model renders at the world model's bone positions, which are disconnected from the camera-attached viewmodel's position. Re-tagging the world copy visible doesn't fix the spatial mismatch — it just makes a wrongly-positioned effect visible.

▸ FIX

Create a separate copy of the cosmetic effect parented into the viewmodel, driven off the same replicated edge as the world copy (e.g. a networked fire-sequence counter). Reuse the model-local offsets unchanged by parenting the copy under the node whose origin is the model origin (the bounds-centered model child in the viewmodel). The per-frame parent scale keeps it proportional automatically, and live tuning dials stay WYSIWYG in both views.

Keep audio on the every-peer world path so the shot never sounds twice — the viewmodel copy is visual only.

▸ WHY IT WORKS

The viewmodel copy tracks the camera-attached position exactly, since it's parented into the viewmodel hierarchy. The replicated state edge (e.g. a sequence counter) ensures both copies fire on the same frame without duplicating the trigger logic. Model-local offsets are coordinate-system-relative, so they work identically in both the world model and the viewmodel without adjustment.

Verified on engine 26.07.15a: seen in a real project.
s&box moves fast; an undated fix is a liability. Spot a stale detail?
changelog
  • Published

Want to know when new guides or fixes drop? Join the community to help build this out. Report gotchas, flag outdated fixes, or just lurk.

Join the Discord