mirror of
https://github.com/misternebula/quantum-space-buddies.git
synced 2025-03-30 22:20:54 +00:00
slightly better light sensor
This commit is contained in:
parent
0428ee9f13
commit
7cef229cd7
@ -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>();
|
||||
}
|
@ -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;
|
||||
|
@ -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) { }
|
||||
}
|
@ -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;
|
||||
}
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user