RosterHelmet.cs
using Sandbox;
namespace PaintballBaddies;

/// <summary>Shared fitted equipment for player and opponent roster bodies.</summary>
public sealed class RosterHelmet : Component
{
    public static bool HasFit(int index) => index >= 0 && index < RosterSelection.Names.Length;
    private GameObject helmet, seal;
    private int equippedIndex=-1;
    private SkinnedModelRenderer sealRenderer;
    public bool Equipped => helmet.IsValid() && seal.IsValid();

    protected override void OnUpdate()
    {
        var roster=Components.Get<RosterSelection>();
        var player=Components.Get<PlayerController>();
        var opponent=Components.Get<ArenaOpponent>();
        var index=opponent.IsValid() ? opponent.CharacterIndex : roster?.Selected ?? -1;
        var body=opponent.IsValid() ? opponent.Body : player?.Renderer;
        if ( body.IsValid() && CoveredRosterAssets.CharacterIndex( body.Model?.Name ) >= 0 )
        {
            Clear();
            return;
        }
        if (!HasFit(index) || Components.Get<PaintballCombatant>()?.Eliminated == true ||
            (!opponent.IsValid() && Scene.GetAllComponents<HelmetFitPreview>().Any()))
        {
            Clear();
            return;
        }
        if (!body.IsValid() || !body.TryGetBoneTransform("Head",out var head)) return;
        if (!Equipped || equippedIndex!=index)
        {
            Clear();
            equippedIndex=index;
            var name=RosterSelection.Names[equippedIndex];
            var slug=name.ToLowerInvariant();
            helmet=new GameObject(GameObject,true,$"{name} fitted helmet");
            helmet.Components.Create<ModelRenderer>().Model=Model.Load($"models/gear/helmet_{slug}_hq/helmet_{slug}_hq.vmdl");
            seal=new GameObject(GameObject,true,$"{name} fitted neck seal");
            sealRenderer=seal.Components.Create<SkinnedModelRenderer>();
            var sealAsset=equippedIndex==4 ? "helmet_neck_seal" : equippedIndex==2 ? "helmet_neck_seal_imani_contained" : $"helmet_neck_seal_{slug}";
            sealRenderer.Model=Model.Load($"models/gear/{sealAsset}/{sealAsset}.vmdl");
        }
        var rotation=head.Rotation*body.Model.GetBoneTransform("Head").Rotation.Inverse;
        helmet.WorldRotation=rotation;
        helmet.WorldScale=Vector3.One*1.12f;
        helmet.WorldPosition=head.Position+rotation*new Vector3(1.3f,0,equippedIndex==2 ? -2.5f : -3.4f);
        seal.WorldTransform=body.WorldTransform;
        sealRenderer.BoneMergeTarget=body;
    }

    private void Clear()
    {
        if (helmet.IsValid()) helmet.Destroy();
        if (seal.IsValid()) seal.Destroy();
        helmet=null;seal=null;sealRenderer=null;equippedIndex=-1;
    }
    protected override void OnDisabled() => Clear();
    protected override void OnDestroy() => Clear();
}