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