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