OverdriveFragment.cs
using Sandbox;
using System;
namespace PaintballBaddies;

public sealed class OverdriveFragment : Component
{
    private SkinnedModelRenderer renderer;
    private readonly Dictionary<string,Transform> bones=new();
    private float age;
    private Vector3 launchVelocity;
    protected override void OnStart()
    {
        var physics=Components.Get<Rigidbody>();physics.MotionEnabled=true;
        physics.Velocity=launchVelocity;physics.AngularVelocity=new Vector3(3,6,4);
    }
    public static void Spawn(SkinnedModelRenderer source,int part,Vector3 impulse)
    {
        if(!source.IsValid())return;
        foreach(var old in source.Scene.GetAllComponents<OverdriveFragment>().OrderBy(x=>x.age).Skip(11).ToArray())old.GameObject.Destroy();
        string joint=part switch {1=>"head",2=>"arm_upper_L",4=>"arm_upper_R",8=>"leg_upper_L",_=>"leg_upper_R"};
        var rig=source.GameObject.Parent.Components.Get<OverdriveRobotRig>();
        var pivot=rig.IsValid() ? rig.IntactPose(joint) : source.WorldTransform;
        var go=new GameObject(false,"Tumbling sausage part"){NetworkMode=NetworkMode.Never,WorldPosition=pivot.Position};go.Tags.Add("paintball_debris");
        var piece=go.Components.Create<OverdriveFragment>();piece.renderer=go.Components.Create<SkinnedModelRenderer>();
        piece.renderer.Model=source.Model;piece.renderer.Tint=source.Tint;piece.renderer.UseAnimGraph=false;
        OverdriveRobotRig.ApplyParts(piece.renderer,0,part);
        foreach(var bone in source.Model.Bones.AllBones)
        {
            var pose=rig.IsValid() ? rig.IntactPose(bone.Name) : source.WorldTransform;pose=go.WorldTransform.ToLocal(pose);
            piece.bones[bone.Name]=pose;
        }
        var collider=go.Components.Create<SphereCollider>();collider.Radius=part==1 ? 6 : 4;collider.Static=false;
        var physics=go.Components.Create<Rigidbody>();physics.MassOverride=2;
        piece.launchVelocity=impulse.Normal*220+Vector3.Up*155;go.Enabled=true;
    }
    protected override void OnPreRender()
    {foreach(var bone in renderer.Model.Bones.AllBones)renderer.SetBoneTransform(bone,bones[bone.Name]);}
    protected override void OnUpdate(){age+=Time.Delta;if(age>3)GameObject.Destroy();}
}