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