A UnitStatus subclass that applies a periodic "marked" effect to a unit. It tracks a damage interval and, when active and the unit is an enemy, applies damage via Enemy.DamageRpc at set intervals and toggles the unit's marked state on init and remove.
using System;
using Sandbox;
public class UnitStatusMarked : UnitStatus
{
private TimeSince _timeSinceDamage;
private const float DAMAGE_INTERVAL = 1f;
public Player PlayerSource { get; set; }
public float Damage { get; set; }
public UnitStatusMarked()
{
}
public override void Init( Unit unit )
{
base.Init( unit );
Unit.SetStateMarked( true );
_timeSinceDamage = 0f;
}
public override void Update( float dt )
{
base.Update( dt );
if ( !Unit.IsValid() || Manager.Instance.IsGameOver )
return;
if ( _timeSinceDamage > DAMAGE_INTERVAL )
{
if ( IsOnEnemy && Enemy.IsValid() )
Enemy.DamageRpc( Damage, PlayerSource, DamageType.Mark, Enemy.WorldPosition.WithZ( 30f ), Vector2.Zero, isCrit: false, shouldFlinch: false, damageFlags: DamageResultFlags.Mark );
_timeSinceDamage = 0f;
}
}
public override void OnRemove( bool playEffects = true )
{
Unit.SetStateMarked( false );
}
public override void Refresh()
{
base.Refresh();
}
}