OMRSceneReferences.cs
using Sandbox;
using System.Collections.Generic;

/// <summary>
/// Instance-owned presentation roster. Membership is sampled at 5 Hz; health,
/// ammo, ownership and team values remain live. No static scene references survive
/// a reload, and an invalid local player triggers immediate reacquisition.
/// </summary>
public sealed class OMRSceneReferences
{
	private Scene _scene;
	private float _nextRefreshAt;
	private readonly List<PlayerState> _players = new();
	public PlayerState LocalPlayer { get; private set; }
	public RoundManager Rounds { get; private set; }
	public OMRBotController Bot { get; private set; }
	private BaseInventoryComponent _inventory;
	private PlayerCombatFeedback _feedback;

	public void Refresh( Scene scene )
	{
		bool sceneChanged = _scene != scene;
		bool localLost = LocalPlayer is not null &&
			( !LocalPlayer.IsValid || LocalPlayer.IsProxy || LocalPlayer.IsBot );
		if ( !sceneChanged && !localLost && RealTime.Now < _nextRefreshAt )
			return;

		_scene = scene;
		_nextRefreshAt = RealTime.Now + 0.20f;
		PlayerState previousLocal = LocalPlayer;
		LocalPlayer = null;
		_players.Clear();
		if ( sceneChanged ) { Rounds = null; Bot = null; }
		if ( scene is not null )
		{
			foreach ( PlayerState player in scene.GetAllComponents<PlayerState>() )
			{
				if ( player?.IsValid != true ) continue;
				_players.Add( player );
				if ( !player.IsProxy && !player.IsBot ) LocalPlayer = player;
			}
			if ( Rounds?.IsValid != true )
				foreach ( RoundManager rounds in scene.GetAllComponents<RoundManager>() )
					if ( rounds?.IsValid == true ) { Rounds = rounds; break; }
			if ( Bot?.IsValid != true )
			{
				Bot = null;
				foreach ( OMRBotController bot in scene.GetAllComponents<OMRBotController>() )
					if ( bot?.IsValid == true ) { Bot = bot; break; }
			}
		}
		if ( previousLocal != LocalPlayer ) { _inventory = null; _feedback = null; }
	}

	public BaseInventoryComponent LocalInventory
	{
		get
		{
			if ( _inventory?.IsValid != true ) _inventory = LocalPlayer?.IsValid == true ? LocalPlayer.Components.Get<BaseInventoryComponent>() : null;
			return _inventory;
		}
	}

	public PlayerCombatFeedback LocalFeedback
	{
		get
		{
			if ( _feedback?.IsValid != true ) _feedback = LocalPlayer?.IsValid == true ? LocalPlayer.Components.Get<PlayerCombatFeedback>() : null;
			return _feedback;
		}
	}

	public PlayerState PlayerForTeam( int team )
	{
		foreach ( PlayerState player in _players )
			if ( player.IsValid && player.TeamId == team ) return player;
		return null;
	}

	public int ReadyCount
	{
		get
		{
			int count = 0;
			foreach ( PlayerState player in _players )
				if ( player.IsValid && player.IsReady ) count++;
			return count;
		}
	}
}