Player/ShipSkinComponent.cs
/// <summary>
/// Applies material skin overrides to the player's ship model.
/// </summary>
[Title( "Ship Skin" ), Icon( "palette" )]
public sealed class ShipSkinComponent : Component
{
	private PlayerPawn _pawn;

	[Sync, Change( nameof( OnSkinChanged ) )]
	public int Skin { get; set; } = -1;

	protected override void OnStart()
	{
		_pawn = Components.Get<PlayerPawn>( FindMode.InAncestors );
	}

	private void OnSkinChanged( int before, int after )
	{
		UpdateSkin();
	}

	public void UpdateSkin()
	{
		if ( _pawn == null ) _pawn = Components.Get<PlayerPawn>( FindMode.InAncestors );
		if ( _pawn == null ) return;

		var renderer = _pawn.ModelRenderer;
		if ( renderer == null ) return;

		if ( Skin < 0 )
		{
			renderer.MaterialOverride = null;
			return;
		}

		var skinPath = _pawn.Data.skinList
			.FirstOrDefault( s => s.skinIdent == Skin )
			.Skin;

		renderer.MaterialOverride = string.IsNullOrEmpty( skinPath )
			? null
			: Material.Load( skinPath );
	}
}