QSBLightSensor: use remote call

This commit is contained in:
JohnCorby 2022-03-29 13:46:44 -07:00
parent e9251498cc
commit caf952a3c2
3 changed files with 18 additions and 44 deletions

View File

@ -1,10 +1,12 @@
using QSB.EchoesOfTheEye.LightSensorSync.WorldObjects; using QSB.EchoesOfTheEye.LightSensorSync.WorldObjects;
using QSB.Messaging; using QSB.Messaging;
using QSB.Patches;
namespace QSB.EchoesOfTheEye.LightSensorSync.Messages; namespace QSB.EchoesOfTheEye.LightSensorSync.Messages;
internal class SetEnabledMessage : QSBWorldObjectMessage<QSBLightSensor, bool> internal class SetEnabledMessage : QSBWorldObjectMessage<QSBLightSensor, bool>
{ {
public SetEnabledMessage(bool data) : base(data) { } public SetEnabledMessage(bool data) : base(data) { }
public override void OnReceiveRemote() => WorldObject.SetEnabled(Data); public override void OnReceiveRemote() =>
QSBPatch.RemoteCall(WorldObject.AttachedObject.OnSectorOccupantsUpdated, Data);
} }

View File

@ -19,26 +19,31 @@ internal class LightSensorPatches : QSBPatch
[HarmonyPatch(nameof(SingleLightSensor.OnSectorOccupantsUpdated))] [HarmonyPatch(nameof(SingleLightSensor.OnSectorOccupantsUpdated))]
private static bool OnSectorOccupantsUpdated(SingleLightSensor __instance) private static bool OnSectorOccupantsUpdated(SingleLightSensor __instance)
{ {
if (!QSBWorldSync.AllObjectsReady) var enable = !Remote
{ ? __instance._sector.ContainsAnyOccupants(DynamicOccupant.Player | DynamicOccupant.Probe)
return true; : (bool)RemoteData;
} if (enable && !__instance.enabled)
var flag = __instance._sector.ContainsAnyOccupants(DynamicOccupant.Player | DynamicOccupant.Probe);
if (flag && !__instance.enabled)
{ {
__instance.enabled = true; __instance.enabled = true;
__instance.GetWorldObject<QSBLightSensor>().SendMessage(new SetEnabledMessage(true)); if (!Remote && QSBWorldSync.AllObjectsReady)
{
__instance.GetWorldObject<QSBLightSensor>().SendMessage(new SetEnabledMessage(true));
}
__instance._lightDetector.GetShape().enabled = true; __instance._lightDetector.GetShape().enabled = true;
if (__instance._preserveStateWhileDisabled) if (__instance._preserveStateWhileDisabled)
{ {
__instance._fixedUpdateFrameDelayCount = 10; __instance._fixedUpdateFrameDelayCount = 10;
} }
} }
else if (!flag && __instance.enabled) else if (!enable && __instance.enabled)
{ {
__instance.enabled = false; __instance.enabled = false;
__instance.GetWorldObject<QSBLightSensor>().SendMessage(new SetEnabledMessage(false)); if (!Remote && QSBWorldSync.AllObjectsReady)
{
__instance.GetWorldObject<QSBLightSensor>().SendMessage(new SetEnabledMessage(false));
}
__instance._lightDetector.GetShape().enabled = false; __instance._lightDetector.GetShape().enabled = false;
if (!__instance._preserveStateWhileDisabled) if (!__instance._preserveStateWhileDisabled)
{ {

View File

@ -14,37 +14,4 @@ internal class QSBLightSensor : WorldObject<SingleLightSensor>
public override void SendInitialState(uint to) => public override void SendInitialState(uint to) =>
this.SendMessage(new SetEnabledMessage(AttachedObject.enabled)); this.SendMessage(new SetEnabledMessage(AttachedObject.enabled));
public void SetEnabled(bool enabled)
{
if (AttachedObject._sector && AttachedObject._sector.ContainsAnyOccupants(DynamicOccupant.Player | DynamicOccupant.Probe))
{
// local player is in sector, do not disable lights
return;
}
if (enabled && !AttachedObject.enabled)
{
AttachedObject.enabled = true;
AttachedObject._lightDetector.GetShape().enabled = true;
if (AttachedObject._preserveStateWhileDisabled)
{
AttachedObject._fixedUpdateFrameDelayCount = 10;
}
}
else if (!enabled && AttachedObject.enabled)
{
AttachedObject.enabled = false;
AttachedObject._lightDetector.GetShape().enabled = false;
if (!AttachedObject._preserveStateWhileDisabled)
{
if (AttachedObject._illuminated)
{
AttachedObject.OnDetectDarkness.Invoke();
}
AttachedObject._illuminated = false;
}
}
}
} }