enemyStatus/FrozenEnemyStatus.cs

Enemy status class that applies a frozen effect to an Enemy. It sets frozen VFX and flags, controls frozen lifetime and time scale adjustments, spawns shard bullets for the owning Player when the freeze ends, and restores timers and VFX on removal.

NetworkingFile Access
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Sandbox;
using static Sandbox.Connection;

public class FrozenEnemyStatus : EnemyStatus
{
	public float Lifetime { get; set; }

	public Player Player { get; set; }

	public override void Init( Enemy enemy )
	{
		base.Init( enemy );

		enemy.CreateFrozenVfx();
		enemy.IsFrozen = true;
	}

	public void SetLifetime( float lifetime )
	{
		if ( lifetime > Lifetime )
		{
			Lifetime = lifetime;
		}
	}

	public void SetTimeScale( float timeScale )
	{
		timeScale = MathF.Max( timeScale, 0.01f );

		if ( Enemy is Boss )
			timeScale = Utils.Map( timeScale, 1f, 0f, 1f, 0.4f );

		if ( timeScale < Enemy.TimeScale )
		{
			Enemy.AnimSpeedModifier = timeScale;
			Enemy.TimeScale = timeScale;
		}
	}

	public override void Update( float dt )
	{
		if ( Enemy == null || !Enemy.IsValid() )
			return;

		if ( ElapsedTime > Lifetime )
			Enemy.RemoveEnemyStatus( this );

		//Enemy.Velocity *= (1f - Utils.Map( TimeScale, 0.6f, 0f, 3f, 15f ) * dt);
	}

	public override void StartDying()
	{
		Enemy.AnimSpeedModifier = 1f;
		Enemy.TimeScale = 1f;
		Enemy.IsFrozen = false;

		if ( Player != null && Player.Stats[PlayerStat.FrozenShardsNum] > 0f )
		{
			int maxShardsNum = (int)Player.Stats[PlayerStat.FrozenShardsNum];
			int numShards = Game.Random.Int( 0, maxShardsNum );

			if ( numShards == 0 && Game.Random.Float( 0f, 1f ) < 0.15f )
				numShards = 1;
			
			//if(Game.Random.Float(0f, 1f) < 0.25f)
			//	numShards = Math.Max( numShards, Game.Random.Int( 1, maxShardsNum ));

			if(numShards > 0)
			{
				Vector2 aimDir = (new Vector2( Game.Random.Float( -1f, 1f ), Game.Random.Float( -1f, 1f ) )).Normal;
				Player.SpawnBulletRing( Enemy.Position2D, numShards, aimDir, damageMultMin: 0.1f, damageMultMax: 0.95f );
			}
		}
	}

	public override void Remove()
	{
		Enemy.AnimSpeedModifier = 1f;
		Enemy.TimeScale = 1f;
		Enemy.IsFrozen = false;

		Enemy.RemoveFrozenVfx();
	}

	public override void Refresh()
	{
		ElapsedTime = 0f;
	}
}