ArenaBrightness.cs
using Sandbox;
namespace PaintballBaddies;
/// <summary>Brightens every arena once at load: more ambient fill, a higher
/// auto-exposure ceiling and brighter restaurant fill lights. Local only.</summary>
public sealed class ArenaBrightness : Component
{
public bool Applied {get;private set;}
private float wait;
protected override void OnUpdate()
{
if(Applied)return;
wait+=Time.Delta;
var camera=Scene.Camera;
if(!camera.IsValid() || wait<1 || Scene.GetAllComponents<MapInstance>().Any(m=>m.Active && !m.IsLoaded))return;
Applied=true;
bool restaurant=ArenaSelection.Current(Scene)==ArenaSelection.Restaurant;
// Auto exposure: let darker rooms open up further, and lift overall exposure.
var tone=camera.Components.Get<Tonemapping>() ?? camera.Components.Create<Tonemapping>();
if(!tone.AutoExposureEnabled){tone.AutoExposureEnabled=true;tone.MinimumExposure=.5f;tone.MaximumExposure=1.5f;tone.ExposureCompensation=0;}
tone.ExposureCompensation+=.6f;
tone.MaximumExposure=System.MathF.Max(tone.MaximumExposure,2.5f);
tone.MinimumExposure=System.MathF.Max(tone.MinimumExposure,.8f);
// Ambient fill so shadowed corners and faces stay readable.
var ambient=Scene.GetAllComponents<AmbientLight>().FirstOrDefault();
if(ambient.IsValid())ambient.Color=ambient.Color*1.8f;
else
{
var go=new GameObject(true,"Arena ambient fill"){NetworkMode=NetworkMode.Never};
go.Components.Create<AmbientLight>().Color=restaurant ? new Color(.34f,.3f,.26f) : new Color(.28f,.3f,.33f);
}
if(restaurant)
foreach(var light in Scene.GetAllComponents<PointLight>().Where(l=>l.GameObject.Name.StartsWith("Restaurant warm fill")))
{light.LightColor=light.LightColor*1.45f;light.Radius=System.MathF.Max(light.Radius,540);}
Log.Info($"ARENA_BRIGHTNESS arena={ArenaMap.DisplayTitle(Scene)} exposure={tone.ExposureCompensation:0.00} max={tone.MaximumExposure:0.0}");
}
}