unitStatus/UnitStatusMarked.cs

A status component for units that applies a periodic "marked" effect. It marks the unit on init, tracks time since last tick, and every second applies damage to the enemy via Enemy.DamageRpc using a PlayerSource, damage amount, and flags. It clears the marked state on removal.

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