A component that listens for physics collisions and drives a skinned model parameter and a rigidbody impulse. On collision start it sets a material/skin parameter named "springparam" to 1 and applies a large upward impulse to the Rigidbody; on collision stop it resets the parameter to 0.
using Sandbox;
public sealed class SpringCollision : Component, Component.ICollisionListener
{
[Property] public SkinnedModelRenderer Spring { get; set; }
[Property] public Rigidbody rb { get; set; }
void ICollisionListener.OnCollisionStart( Collision collision )
{
Spring.Set( "springparam", 1 );
rb.ApplyImpulse( Vector3.Up * 50000f );
}
void ICollisionListener.OnCollisionStop( CollisionStop collision )
{
Spring.Set( "springparam", 0 );
}
void ICollisionListener.OnCollisionUpdate( Collision collision )
{
}
}