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.
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 ) );
}
}
}