From e6227196e473220788dba4af4bbbddc6d4f307fd Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Tue, 29 Mar 2022 18:53:19 +0100 Subject: [PATCH] add projector sync --- .../Messages/ProjectorStatusMessage.cs | 12 +++++++ .../Patches/ProjectorPatches.cs | 34 +++++++++++++++++++ .../DreamObjectProjectors/ProjectorManager.cs | 15 ++++++++ .../WorldObject/QSBDreamObjectProjector.cs | 11 ++++++ 4 files changed, 72 insertions(+) create mode 100644 QSB/EchoesOfTheEye/DreamObjectProjectors/Messages/ProjectorStatusMessage.cs create mode 100644 QSB/EchoesOfTheEye/DreamObjectProjectors/Patches/ProjectorPatches.cs create mode 100644 QSB/EchoesOfTheEye/DreamObjectProjectors/ProjectorManager.cs create mode 100644 QSB/EchoesOfTheEye/DreamObjectProjectors/WorldObject/QSBDreamObjectProjector.cs diff --git a/QSB/EchoesOfTheEye/DreamObjectProjectors/Messages/ProjectorStatusMessage.cs b/QSB/EchoesOfTheEye/DreamObjectProjectors/Messages/ProjectorStatusMessage.cs new file mode 100644 index 00000000..946a436a --- /dev/null +++ b/QSB/EchoesOfTheEye/DreamObjectProjectors/Messages/ProjectorStatusMessage.cs @@ -0,0 +1,12 @@ +using QSB.EchoesOfTheEye.DreamObjectProjectors.WorldObject; +using QSB.Messaging; + +namespace QSB.EchoesOfTheEye.DreamObjectProjectors.Messages; + +internal class ProjectorStatusMessage : QSBWorldObjectMessage +{ + public ProjectorStatusMessage(bool lit) : base(lit) { } + + public override void OnReceiveRemote() + => WorldObject.AttachedObject.SetLit(Data); +} diff --git a/QSB/EchoesOfTheEye/DreamObjectProjectors/Patches/ProjectorPatches.cs b/QSB/EchoesOfTheEye/DreamObjectProjectors/Patches/ProjectorPatches.cs new file mode 100644 index 00000000..42130949 --- /dev/null +++ b/QSB/EchoesOfTheEye/DreamObjectProjectors/Patches/ProjectorPatches.cs @@ -0,0 +1,34 @@ +using HarmonyLib; +using QSB.EchoesOfTheEye.DreamObjectProjectors.Messages; +using QSB.EchoesOfTheEye.DreamObjectProjectors.WorldObject; +using QSB.Messaging; +using QSB.Patches; +using QSB.WorldSync; + +namespace QSB.EchoesOfTheEye.DreamObjectProjectors.Patches; + +internal class ProjectorPatches : QSBPatch +{ + public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect; + + [HarmonyPostfix] + [HarmonyPatch(typeof(DreamObjectProjector), nameof(DreamObjectProjector.OnPressInteract))] + public static void OnPressInteract(DreamObjectProjector __instance) + => __instance.GetWorldObject().SendMessage(new ProjectorStatusMessage(false)); + + [HarmonyPrefix] + [HarmonyPatch(typeof(DreamObjectProjector), nameof(DreamObjectProjector.FixedUpdate))] + public static bool FixedUpdate(DreamObjectProjector __instance) + { + var flag = __instance._lightSensor.IsIlluminated(); + if (!__instance._lit && flag && !__instance._wasSensorIlluminated) + { + __instance.SetLit(true); + __instance.GetWorldObject().SendMessage(new ProjectorStatusMessage(true)); + } + + __instance._wasSensorIlluminated = flag; + + return false; + } +} diff --git a/QSB/EchoesOfTheEye/DreamObjectProjectors/ProjectorManager.cs b/QSB/EchoesOfTheEye/DreamObjectProjectors/ProjectorManager.cs new file mode 100644 index 00000000..31d18f49 --- /dev/null +++ b/QSB/EchoesOfTheEye/DreamObjectProjectors/ProjectorManager.cs @@ -0,0 +1,15 @@ +using Cysharp.Threading.Tasks; +using QSB.EchoesOfTheEye.DreamObjectProjectors.WorldObject; +using QSB.WorldSync; +using System.Threading; + +namespace QSB.EchoesOfTheEye.DreamObjectProjectors; + +internal class ProjectorManager : WorldObjectManager +{ + public override WorldObjectScene WorldObjectScene => WorldObjectScene.SolarSystem; + public override bool DlcOnly => true; + + public override async UniTask BuildWorldObjects(OWScene scene, CancellationToken ct) + => QSBWorldSync.Init(typeof(DreamRaftProjector)); +} diff --git a/QSB/EchoesOfTheEye/DreamObjectProjectors/WorldObject/QSBDreamObjectProjector.cs b/QSB/EchoesOfTheEye/DreamObjectProjectors/WorldObject/QSBDreamObjectProjector.cs new file mode 100644 index 00000000..60bc88f6 --- /dev/null +++ b/QSB/EchoesOfTheEye/DreamObjectProjectors/WorldObject/QSBDreamObjectProjector.cs @@ -0,0 +1,11 @@ +using QSB.EchoesOfTheEye.DreamObjectProjectors.Messages; +using QSB.Messaging; +using QSB.WorldSync; + +namespace QSB.EchoesOfTheEye.DreamObjectProjectors.WorldObject; + +public class QSBDreamObjectProjector : WorldObject +{ + public override void SendInitialState(uint to) + => this.SendMessage(new ProjectorStatusMessage(AttachedObject.isLit) { To = to }); +}