diff --git a/QSB/EchoesOfTheEye/LightSensorSync/QSBPlayerLightSensor.cs b/QSB/EchoesOfTheEye/LightSensorSync/QSBPlayerLightSensor.cs index 41611d45..c97e818e 100644 --- a/QSB/EchoesOfTheEye/LightSensorSync/QSBPlayerLightSensor.cs +++ b/QSB/EchoesOfTheEye/LightSensorSync/QSBPlayerLightSensor.cs @@ -1,19 +1,63 @@ -using System; +using QSB.Player; +using QSB.WorldSync; using System.Collections.Generic; using UnityEngine; namespace QSB.EchoesOfTheEye.LightSensorSync; -[RequireComponent(typeof(LightSensor))] +/// +/// stores a bit of extra data needed for player light sensor sync +/// +[RequireComponent(typeof(SingleLightSensor))] public class QSBPlayerLightSensor : MonoBehaviour { - private LightSensor _lightSensor; - private void Awake() => _lightSensor = GetComponent(); + private SingleLightSensor _lightSensor; internal bool _locallyIlluminated; - - public Action OnDetectLocalLight; - public Action OnDetectLocalDarkness; - internal readonly List _illuminatedBy = new(); + + private void Awake() + { + _lightSensor = GetComponent(); + + RequestInitialStatesMessage.SendInitialState += SendInitialState; + QSBPlayerManager.OnRemovePlayer += OnPlayerLeave; + } + + private void OnDestroy() + { + RequestInitialStatesMessage.SendInitialState -= SendInitialState; + QSBPlayerManager.OnRemovePlayer -= OnPlayerLeave; + } + + private void SendInitialState(uint to) + { + // todo send the messages + } + + private void OnPlayerLeave(PlayerInfo player) => SetIlluminated(player.PlayerId, false); + + public void SetIlluminated(uint playerId, bool locallyIlluminated) + { + var illuminated = _illuminatedBy.Count > 0; + if (locallyIlluminated) + { + _illuminatedBy.SafeAdd(playerId); + } + else + { + _illuminatedBy.QuickRemove(playerId); + } + + if (!illuminated && _illuminatedBy.Count > 0) + { + _lightSensor._illuminated = true; + _lightSensor.OnDetectLight.Invoke(); + } + else if (illuminated && _illuminatedBy.Count == 0) + { + _lightSensor._illuminated = false; + _lightSensor.OnDetectDarkness.Invoke(); + } + } } diff --git a/QSB/WorldSync/RequestInitialStatesMessage.cs b/QSB/WorldSync/RequestInitialStatesMessage.cs index 16a3ba76..85d2ed2a 100644 --- a/QSB/WorldSync/RequestInitialStatesMessage.cs +++ b/QSB/WorldSync/RequestInitialStatesMessage.cs @@ -23,5 +23,9 @@ public class RequestInitialStatesMessage : QSBMessage DebugLog.DebugWrite($"sent initial states to {to}"); } + /// + /// called on the host. + /// use this to send initial states to whoever is asking for it. + /// public static event Action SendInitialState; }