slightly better light sensor

This commit is contained in:
JohnCorby 2022-02-26 00:26:31 -08:00
parent 0428ee9f13
commit 7cef229cd7
5 changed files with 66 additions and 36 deletions

View File

@ -10,5 +10,5 @@ internal class LightSensorManager : WorldObjectManager
// see AirlockManager question
public override WorldObjectScene WorldObjectScene => WorldObjectScene.SolarSystem;
public override async UniTask BuildWorldObjects(OWScene scene, CancellationToken ct) => QSBWorldSync.Init<QSBSingleLightSensor, SingleLightSensor>();
public override async UniTask BuildWorldObjects(OWScene scene, CancellationToken ct) => QSBWorldSync.Init<QSBLightSensor, SingleLightSensor>();
}

View File

@ -23,9 +23,8 @@ internal class LightSensorPatches : QSBPatch
return true;
}
var qsbSingleLightSensor = __instance.GetWorldObject<QSBSingleLightSensor>();
qsbSingleLightSensor.IlluminatedByLocalPlayer = false;
var qsbLightSensor = __instance.GetWorldObject<QSBLightSensor>();
qsbLightSensor._illuminatedByLocal = false;
__instance._illuminated = false;
if (__instance._illuminatingDreamLanternList != null)
{
@ -64,6 +63,7 @@ internal class LightSensorPatches : QSBPatch
&& !__instance.CheckOcclusion(light.transform.position, vector, sensorWorldDir, occludableLight))
{
__instance._illuminated = true;
qsbLightSensor._illuminatedByLocal = true;
}
break;
@ -78,8 +78,7 @@ internal class LightSensorPatches : QSBPatch
&& !__instance.CheckOcclusion(position, vector, sensorWorldDir))
{
__instance._illuminated = true;
qsbSingleLightSensor.IlluminatedByLocalPlayer = true;
qsbLightSensor._illuminatedByLocal = true;
}
}
else
@ -107,7 +106,7 @@ internal class LightSensorPatches : QSBPatch
&& !__instance.CheckOcclusion(probe.GetLightSourcePosition(), vector, sensorWorldDir))
{
__instance._illuminated = true;
qsbSingleLightSensor.IlluminatedByLocalPlayer = true;
qsbLightSensor._illuminatedByLocal = true;
}
break;
@ -127,8 +126,7 @@ internal class LightSensorPatches : QSBPatch
{
__instance._illuminatingDreamLanternList.Add(dreamLanternController);
__instance._illuminated = true;
qsbSingleLightSensor.IlluminatedByLocalPlayer = true;
qsbLightSensor._illuminatedByLocal = true;
}
break;
@ -142,8 +140,7 @@ internal class LightSensorPatches : QSBPatch
if (light.CheckIlluminationAtPoint(vector, __instance._sensorRadius, maxDistance) && !__instance.CheckOcclusion(light.transform.position, vector, sensorWorldDir, occludableLight))
{
__instance._illuminated = true;
qsbSingleLightSensor.IlluminatedByLocalPlayer = true;
qsbLightSensor._illuminatedByLocal = true;
break;
}
}
@ -153,6 +150,7 @@ internal class LightSensorPatches : QSBPatch
if (lightSourceType == LightSourceType.VOLUME_ONLY)
{
__instance._illuminated = true;
qsbLightSensor._illuminatedByLocal = true;
}
break;

View File

@ -0,0 +1,45 @@
using Cysharp.Threading.Tasks;
using QSB.WorldSync;
using System;
using System.Threading;
namespace QSB.EchoesOfTheEye.LightSensorSync.WorldObjects;
// will be implemented when eote
internal class QSBLightSensor : WorldObject<SingleLightSensor>
{
internal bool _illuminatedByLocal;
public event Action OnDetectLocalLight;
public event Action OnDetectLocalDarkness;
public override async UniTask Init(CancellationToken ct)
{
AttachedObject.OnDetectLight += OnDetectLight;
AttachedObject.OnDetectDarkness += OnDetectDarkness;
}
public override void OnRemoval()
{
AttachedObject.OnDetectLight -= OnDetectLight;
AttachedObject.OnDetectDarkness -= OnDetectDarkness;
}
private void OnDetectLight()
{
if (_illuminatedByLocal)
{
OnDetectLocalLight?.Invoke();
}
}
private void OnDetectDarkness()
{
if (_illuminatedByLocal)
{
OnDetectLocalDarkness?.Invoke();
}
}
public override void SendInitialState(uint to) { }
}

View File

@ -1,11 +0,0 @@
using QSB.WorldSync;
namespace QSB.EchoesOfTheEye.LightSensorSync.WorldObjects;
// will be implemented when eote
internal class QSBSingleLightSensor : WorldObject<SingleLightSensor>
{
public override void SendInitialState(uint to) { }
public bool IlluminatedByLocalPlayer;
}

View File

@ -16,6 +16,8 @@ public class QSBRaft : WorldObject<RaftController>
public RaftTransformSync TransformSync;
private QSBLightSensor[] _lightSensors;
public override async UniTask Init(CancellationToken ct)
{
if (QSBCore.IsHost)
@ -25,9 +27,12 @@ public class QSBRaft : WorldObject<RaftController>
await UniTask.WaitUntil(() => TransformSync, cancellationToken: ct);
foreach (var lightSensor in AttachedObject._lightSensors)
await UniTask.WaitUntil(() => QSBWorldSync.AllObjectsAdded, cancellationToken: ct);
_lightSensors = AttachedObject._lightSensors.Select(x => x.GetWorldObject<QSBLightSensor>()).ToArray();
foreach (var lightSensor in _lightSensors)
{
lightSensor.OnDetectLight += OnDetectLight;
lightSensor.OnDetectLocalLight += OnDetectLocalLight;
}
}
@ -38,25 +43,18 @@ public class QSBRaft : WorldObject<RaftController>
NetworkServer.Destroy(TransformSync.gameObject);
}
foreach (var lightSensor in AttachedObject._lightSensors)
foreach (var lightSensor in _lightSensors)
{
lightSensor.OnDetectLight -= OnDetectLight;
lightSensor.OnDetectLocalLight -= OnDetectLocalLight;
}
}
private void OnDetectLight()
private void OnDetectLocalLight()
{
if (!AttachedObject._fluidDetector.InFluidType(FluidVolume.Type.WATER))
if (AttachedObject._fluidDetector.InFluidType(FluidVolume.Type.WATER))
{
return;
TransformSync.netIdentity.UpdateAuthQueue(AuthQueueAction.Force);
}
if (!AttachedObject._lightSensors.Any(x => x.GetWorldObject<QSBSingleLightSensor>().IlluminatedByLocalPlayer))
{
return;
}
TransformSync.netIdentity.UpdateAuthQueue(AuthQueueAction.Force);
}
public override void SendInitialState(uint to)