CharacterEquipment.cs
using Sandbox;

namespace PaintballBaddies;

/// <summary>Reusable skinned protective gear for Citizen-compatible player or AI bodies.</summary>
public sealed class CharacterEquipment : Component
{
    private readonly List<GameObject> pieces = new();
    public SkinnedModelRenderer Outfit { get; private set; }
    public SkinnedModelRenderer Gloves { get; private set; }
    public SkinnedModelRenderer Boots { get; private set; }
    public SkinnedModelRenderer Helmet { get; private set; }
    protected override void OnUpdate()
    {
        var body=Components.Get<SkinnedModelRenderer>();
        if(body.IsValid() && Components.Get<CharacterHitboxes>() is null)
            Components.Create<CharacterHitboxes>().Configure(body,body.GameObject.Parent);
    }

    public void Configure(SkinnedModelRenderer body, string outfit, string gloves, string boots, string helmet = "")
    {
        Clear();
        if (!body.IsValid()) return;
        Outfit = Attach(body, outfit, "Protective suit");
        Gloves = Attach(body, gloves, "Protective gloves");
        Boots = Attach(body, boots, "Protective boots");
        Helmet = Attach(body, helmet, "Protective helmet");
        if(Components.Get<CharacterHitboxes>() is null)
            Components.Create<CharacterHitboxes>().Configure(body,body.GameObject.Parent);
    }

    private SkinnedModelRenderer Attach(SkinnedModelRenderer body, string path, string name)
    {
        if (string.IsNullOrWhiteSpace(path)) return null;
        var piece = new GameObject(GameObject) { Name = name };
        pieces.Add(piece);
        var renderer = piece.Components.Create<SkinnedModelRenderer>();
        renderer.Model = Model.Load(path);
        renderer.BoneMergeTarget = body;
        renderer.UseAnimGraph = false;
        return renderer;
    }

    public void Clear()
    {
        foreach (var piece in pieces)
            if (piece.IsValid()) piece.Destroy();
        pieces.Clear();
        Outfit = null;
        Gloves = null;
        Boots = null;
        Helmet = null;
    }

    protected override void OnDestroy() => Clear();
}