unitStatus/UnitStatusMarked.cs

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.

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