GibFader.cs

Component attached to a gib (gore fragment). Manages lifetime, fading tint, optional blood spray activation, delayed collider enabling, and applies wind force to the gib's rigidbody.

Native Interop
using System;
using Sandbox;

public sealed class GibFader : Component
{
	[Property] public ModelRenderer ModelRenderer { get; set; }
	[Property] public Rigidbody Rigidbody { get; set; }
	[Property] public bool AlwaysSprayBlood { get; set; }

	public Color Color { get; set; }

	private TimeSince _timeSinceSpawn;
	public float Lifetime { get; set; }

	public BloodSprayer BloodSprayer { get; set; }

	private Collider _collider;
	private float _enableColliderDelay;

	protected override void OnStart()
	{
		base.OnStart();

		_timeSinceSpawn = 0f;

		//ModelRenderer.Tint = Color;

		Manager.Instance.NumGibs++;

		_collider = GameObject.GetComponent<Collider>();
		if ( _collider.IsValid() )
		{
			_collider.Enabled = false;
		}

		_enableColliderDelay = Game.Random.Float( 0.015f, 0.075f );

		BloodSprayer = GetComponentInChildren<BloodSprayer>( includeDisabled: true );

		var bloodSprayChance = Utils.Map( Manager.Instance.NumDecals, 0, 150, 1f, 0f ) * Utils.Map(Manager.Instance.NumEnemies, 100, 200, 1f, 0.5f);
		if ( BloodSprayer.IsValid() && ( AlwaysSprayBlood || Game.Random.Float(0f, 1f) < bloodSprayChance ) )
		{
			BloodSprayer.GameObject.Enabled = true;
		}
	}

	protected override void OnUpdate()
	{
		base.OnUpdate();

		if( _collider.IsValid() && !_collider.Enabled && _timeSinceSpawn > _enableColliderDelay )
			_collider.Enabled = true;

		if ( Manager.Instance.IsWindActive )
			Rigidbody.Velocity += (Vector3)Manager.Instance.GlobalWindForce * Time.Delta;

		if ( _timeSinceSpawn > Lifetime )
		{
			if( BloodSprayer.IsValid() && BloodSprayer.Enabled )
			{
				BloodSprayer.GameObject.SetParent( null );
				BloodSprayer.StopSprayingBlood();
			}

			Manager.Instance.NumGibs--;
			GameObject.Destroy();
		}
		else
		{
			ModelRenderer.Tint = Color.WithAlpha( Utils.Map( _timeSinceSpawn, 0f, Lifetime, 1f, 0f, EasingType.QuadIn ) );
		}
	}
}