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