s&box/field-guide
the symptom, in your words

"Angles struct fields are lowercase"

✓ verified on engine 26.07lane: Tooling & environmentposted
▸ SYMPTOM
  • Camera or rotation math silently produces wrong values — compiles fine, no error, but the angle is off or zero.
  • You grep the codebase for .Pitch / .Yaw / .Roll and find hits, so you use that casing on your Angles variable — it compiles but gives garbage.
▸ CAUSE

The Angles struct's own fields are lowercase: .pitch, .yaw, .roll. Similarly, Vector3 fields are .x, .y, .z.

Grepping a project for capitalized .Pitch / .Yaw / .Roll returns hits — but those belong to unrelated component properties like CitizenAnimationHelper.Pitch (the animation rig's float properties), not the Angles struct itself. The casing looks plausible, the code compiles (different type, different property), but the value is wrong.

▸ FIX

Always use lowercase for struct fields:

snippet
Angles angle = new Angles();
angle.pitch = 45f;    // correct
angle.yaw   = 90f;    // correct
angle.roll  = 0f;     // correct

Vector3 pos = new Vector3();
pos.x = 100f;         // correct
pos.y = 200f;         // correct

Confirm casing against a usage of the SPECIFIC type you're touching, not the first case-matching hit in a repo grep. Engine install references:

  • Angles: see addons/menu/Code/AvatarEditor/AvatarEditManager.Camera.cs_angle.yaw, _angle.pitch, _angle.roll
  • Vector3: see any project's movement code — heading.x, heading.y
▸ WHY IT WORKS

This is a silent wrong-value bug, not a compile error — C# resolves the capitalized form against whatever property happens to match on the expression's type context. If you're lucky it fails to compile; if you're unlucky it resolves to a different member (an animation helper's .Pitch vs the struct's .pitch) and the math is just quietly wrong. Confirming against a same-type usage eliminates the ambiguity.

Verified on engine 26.07 — seen in a real project.
s&box moves fast; an undated fix is a liability. Spot a stale detail?