GameMode/Rules/FreezeTime.cs

A component that freezes players for a configurable duration. It exposes a FreezeTime property synced from the host, tracks entry time with TimeSince, and clears an IsFrozen flag once the elapsed time exceeds FreezeTime (unless FreezeTime is -1).

Networking
using Sandbox.Events;

namespace KOTH;

/// <summary>
/// Keep players frozen while this state is active.
/// </summary>
public sealed class FreezePlayers : Component
{
	[Property][Sync(SyncFlags.FromHost)] public int FreezeTime { get; set; }

	/////////////////////////////////////////////////////////

	[Sync(SyncFlags.FromHost)] private bool IsFrozen { get; set; } = true;
	[Sync(SyncFlags.FromHost)] private TimeSince TimeSinceEnterState { get; set; } = new();

	protected override void OnUpdate()
	{
		base.OnUpdate();

		if (TimeSinceEnterState > FreezeTime && FreezeTime != -1)
		{
			// do i need this to be a host rpc?
			IsFrozen = false;
		}
	}
}