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