FootballMedicalArea.cs

Part of the FootballWorldPanel partial class. Builds and updates the medical area during an injury: two pooled staff figures on 24-part rigs with uniforms, plus a nine-piece stretcher (canvas, rails, end bars, handles) that appears during the Load and CarryOff stages. Geometry is created lazily on the first serious injury and pose updates are capped at 30 fps.

Rough Code
using Sandbox;
using Socer;
using System;
using System.Collections.Generic;

public sealed partial class FootballWorldPanel
{
    // Created only after the first serious injury. Reuse two existing body
    // rigs and nine stretcher pieces; ordinary matches pay no geometry cost.
    readonly ModelRenderer[][] medicalActors=new ModelRenderer[2][];
    readonly PlayerDetailRenderer[] medicalUniforms=new PlayerDetailRenderer[2];
    readonly Footballer[] medicalFigures={new(){Id=100,Team=2},new(){Id=101,Team=2}};
    readonly ModelRenderer[] medicalStretcher=new ModelRenderer[9];
    readonly List<ReplayFigure.Part> medicalPose=new(24);
    bool medicalObjectsCreated,medicalWasVisible;
    int medicalVisiblePeople,medicalUpdates;
    float nextMedicalFrame;

    void EnsureMedicalActors()
    {
        if(medicalObjectsCreated)return;
        for(int person=0;person<2;person++)
        {
            var rig=new ModelRenderer[24];medicalActors[person]=rig;
            for(int slot=0;slot<rig.Length;slot++)
                rig[slot]=Create(slot==6?torso:slot is 0 or 1 or 3 or 4 or 7 or 8 or 10 or 11?limb:sphere,"Medical staff");
            medicalUniforms[person]=new PlayerDetailRenderer(RenderScene);
            medicalFigures[person].Profile.SkinTone=person==0?2:4;
            medicalFigures[person].Profile.HairTone=person==0?1:3;
        }
        for(int i=0;i<medicalStretcher.Length;i++)medicalStretcher[i]=Create(box,i==0?"Stretcher canvas":"Stretcher frame and handle");
        medicalObjectsCreated=true;
    }

    void UpdateMedicalArea()
    {
        var m=Game.Match;
        bool visible=m.MedicalActive && m.MedicalStage!=MedicalTreatmentStage.AwaitSubstitute &&
            !Game.Replay.Playing && !Game.MatchIntroActive && !Game.StrategyLabOpen;
        if(!visible)
        {
            if(!medicalWasVisible)return;
            for(int person=0;person<2;person++)
            {foreach(var part in medicalActors[person])part.Enabled=false;medicalUniforms[person].Hide();}
            foreach(var part in medicalStretcher)part.Enabled=false;
            medicalWasVisible=false;medicalVisiblePeople=0;return;
        }
        EnsureMedicalActors();medicalWasVisible=true;
        if(Time.Now<nextMedicalFrame)return;
        nextMedicalFrame=Time.Now+1f/30;medicalUpdates++;medicalVisiblePeople=2;
        for(int person=0;person<2;person++)
        {
            ReplayFigure.PoseMedicalMedic(medicalFigures[person],m,person,medicalPose);
            ReplayFigure.RepairArmAnatomy(medicalPose);
            var rig=medicalActors[person];
            for(int slot=0;slot<rig.Length;slot++)
            {
                var renderer=rig[slot];renderer.Enabled=slot<medicalPose.Count;
                if(!renderer.Enabled)continue;
                var part=medicalPose[slot];SetPart(renderer,part.A,part.ZA,part.B,part.ZB,part.Width,part.Color);
                FitPoseBody(renderer,slot,medicalPose);
            }
            medicalUniforms[person].UpdateUniform(rig,"#3cafac",staff:true);
        }
        bool stretcher=m.MedicalStage is MedicalTreatmentStage.Load or MedicalTreatmentStage.CarryOff;
        foreach(var part in medicalStretcher)part.Enabled=stretcher;
        if(!stretcher)return;
        var centre=ReplayFigure.MedicalStretcherCentre(m);var axis=ReplayFigure.MedicalCarryAxis(m);
        var side=new Point(-axis.Y,axis.X);
        float lift=m.MedicalStage==MedicalTreatmentStage.Load?Ease(m.MedicalStageProgress):1;
        float height=.12f+.76f*lift;
        var canvas=medicalStretcher[0];
        canvas.WorldTransform=new Transform(WorldPoint(centre,height),
            Rotation.LookAt(new Vector3(axis.X,-axis.Y,0),Vector3.Up),new Vector3(2.12f,.68f,.045f)*Units);
        canvas.Tint=Ink("#326e69");
        for(int rail=0;rail<2;rail++)
        {
            float s=rail==0?-1:1;var edge=centre+side*(s*.37f);
            SetPart(medicalStretcher[1+rail],edge-axis*1.05f,height+.025f,edge+axis*1.05f,height+.025f,.045f,"#b2c0bf");
        }
        for(int end=0;end<2;end++)
        {
            float s=end==0?-1:1;var edge=centre+axis*(s*1.05f);
            SetPart(medicalStretcher[3+end],edge-side*.37f,height+.025f,edge+side*.37f,height+.025f,.04f,"#b2c0bf");
            for(int handle=0;handle<2;handle++)
            {
                float hs=handle==0?-1:1;var grip=edge+side*(hs*.29f);
                SetPart(medicalStretcher[5+end*2+handle],grip,height+.02f,grip+axis*(s*.30f),height+.02f,.045f,"#273c40");
            }
        }
    }

    public object MedicalAreaReport()=>new{
        Created=medicalObjectsCreated,Visible=medicalWasVisible,People=medicalVisiblePeople,
        Updates=medicalUpdates,StretcherPieces=medicalObjectsCreated?medicalStretcher.Length:0,
        Stage=Game?.Match?.MedicalStage.ToString(),Patient=Game?.Match?.MedicalPatientId};
}