PaintballCombatant.PopRiot.cs
using Sandbox;
namespace PaintballBaddies;

public sealed partial class PaintballCombatant
{
    [Sync(SyncFlags.FromHost)] public int PopHits {get;internal set;}
    [Sync(SyncFlags.FromHost)] public int PopScore {get;internal set;}
    [Sync(SyncFlags.FromHost)] public int TargetsPopped {get;internal set;}
    [Sync(SyncFlags.FromHost)] public float HitSlowSeconds {get;private set;}
    [Sync(SyncFlags.FromHost)] public int HitSlowSerial {get;private set;}
    private void BeginHitSlowdown(){HitSlowSeconds=1.2f;HitSlowSerial=unchecked(HitSlowSerial+1);}
    public float HitReactionWeight
    {
        get
        {
            if(HitSlowSeconds<=.25f)return 0;
            float progress=((1.2f-HitSlowSeconds)/.95f).Clamp(0,1);
            return 1-progress*progress*(3-2*progress);
        }
    }
    public float HitMoveScale=>1-.55f*HitReactionWeight;
    internal void ReceiveRiotGlob(Vector3 origin)
    {
        var session=MultiplayerSession.Find(Scene);
        if(session?.IsOverdrive==true){ReceiveOverdriveDamage(24,origin);return;}
        if(!MultiplayerSession.Authority || !AcceptHits || session?.IsPopRiot!=true || !session.InRound || HitSlowSeconds>0)return;
        if(!session.LoseRiotLife(this))return;
        BeginHitSlowdown();
        LastHitSerial=unchecked(LastHitSerial+1);LastHitDirection=(origin-WorldPosition).WithZ(0).Normal;
        HitFeedbackRemaining=.45f;DirectionIndicatorRemaining=DirectionIndicatorDuration;
    }
    internal void ReceiveRiotCrash(Vector3 origin)
    {
        var session=MultiplayerSession.Find(Scene);
        if(session?.IsOverdrive==true){ReceiveOverdriveDamage(24,origin);return;}
        if(!MultiplayerSession.Authority || !AcceptHits || session?.IsPopRiot!=true || !session.InRound || HitSlowSeconds>0)return;
        BeginHitSlowdown();LastHitSerial=unchecked(LastHitSerial+1);
        LastHitDirection=(origin-WorldPosition).WithZ(0).Normal;
        HitFeedbackRemaining=.45f;DirectionIndicatorRemaining=DirectionIndicatorDuration;
    }
    private void ResetPopRiotScore(){PopHits=PopScore=TargetsPopped=0;HitSlowSeconds=0;}
}