swb_player/PlayerBase.Clothing.cs
using System.Collections.Generic;

namespace SWB.Player;

public partial class PlayerBase
{
	[Sync] public string clothingJSON { get; set; }
	bool clothesApplied = false;
	ClothingContainer clothingContainer;
	List<SkinnedModelRenderer> clothingRenderers = new();

	void ApplyClothes(Connection connection)
	{
		if (BodyRenderer == null)
			return;


		BodyRenderer.Model = Model.Load(
			"models/citizen_human/citizen_human_male.vmdl"
		);

		clothingJSON = connection.GetUserData("avatar");
		clothingContainer = ClothingContainer.CreateFromJson(clothingJSON);
		clothingContainer.Apply(BodyRenderer);

		BodyRenderer.GameObject.Children.ForEach(c =>
		{
			if (c.Name.StartsWith("Clothing"))
			{
				var renderer = c.Components.Get<SkinnedModelRenderer>();
				clothingRenderers.Add(renderer);
			}
		});
	}

    void InitClothingFromConnection()
    {
        if (BodyRenderer == null)
            return;

        BodyRenderer.Model = Model.Load(
            "models/citizen_human/citizen_human_male.vmdl"
        );

        clothingJSON = Network.Owner?.GetUserData("avatar");
    }

    void UpdateClothes()
	{
		// Can take a while to spawn on clients so we check here until they are spawned in
		if ( clothingRenderers.Count == 0 )
		{
			BodyRenderer.GameObject.Children.ForEach( c =>
			{
				if ( c.Name.StartsWith( "Clothing" ) )
				{
					var renderer = c.Components.Get<SkinnedModelRenderer>();
					clothingRenderers.Add( renderer );
				}
			} );
		}

		if ( !IsProxy && IsAlive && IsFirstPerson )
		{
			BodyRenderer.RenderType = ModelRenderer.ShadowRenderType.ShadowsOnly;
		}
		else
		{
			BodyRenderer.RenderType = ModelRenderer.ShadowRenderType.On;
		}

		clothingRenderers.ForEach( c =>
		{
			c.RenderType = BodyRenderer.RenderType;
		} );
	}

    void ApplyClothesJson(string json)
    {
        if (BodyRenderer == null)
            return;

        BodyRenderer.Model = Model.Load(
            "models/citizen_human/citizen_human_male.vmdl"
        );

        clothingContainer = ClothingContainer.CreateFromJson(json);
        clothingContainer.Apply(BodyRenderer);

        clothingRenderers.Clear();

        BodyRenderer.GameObject.Children.ForEach(c =>
        {
            if (c.Name.StartsWith("Clothing"))
            {
                var renderer = c.Components.Get<SkinnedModelRenderer>();
                clothingRenderers.Add(renderer);
            }
        });
    }
}