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.Messaging;
using QSB.Patches;
namespace QSB.EchoesOfTheEye.LightSensorSync.Messages;
internal class SetEnabledMessage : QSBWorldObjectMessage<QSBLightSensor, bool>
{
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))]
private static bool OnSectorOccupantsUpdated(SingleLightSensor __instance)
{
if (!QSBWorldSync.AllObjectsReady)
{
return true;
}
var flag = __instance._sector.ContainsAnyOccupants(DynamicOccupant.Player | DynamicOccupant.Probe);
if (flag && !__instance.enabled)
var enable = !Remote
? __instance._sector.ContainsAnyOccupants(DynamicOccupant.Player | DynamicOccupant.Probe)
: (bool)RemoteData;
if (enable && !__instance.enabled)
{
__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;
if (__instance._preserveStateWhileDisabled)
{
__instance._fixedUpdateFrameDelayCount = 10;
}
}
else if (!flag && __instance.enabled)
else if (!enable && __instance.enabled)
{
__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;
if (!__instance._preserveStateWhileDisabled)
{

View File

@ -14,37 +14,4 @@ internal class QSBLightSensor : WorldObject<SingleLightSensor>
public override void SendInitialState(uint to) =>
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;
}
}
}
}