From 85b7a0d5cf6c54d996d2e16f0db6e1fb48236bb0 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Thu, 10 Mar 2022 23:26:09 +0000 Subject: [PATCH 1/3] Add picture frame door sync --- .../Messages/PictureFrameDoorMessage.cs | 13 ++++++++++ .../PictureFrameDoorsManager.cs | 17 ++++++++++++ .../WorldObjects/IQSBPictureFrameDoor.cs | 8 ++++++ .../QSBGlitchedCodeDoorInterface.cs | 26 +++++++++++++++++++ .../WorldObjects/QSBPictureFrameDoor.cs | 15 +++++++++++ .../QSBPictureFrameDoorInterface.cs | 24 +++++++++++++++++ 6 files changed, 103 insertions(+) create mode 100644 QSB/EchoesOfTheEye/PictureFrameDoors/Messages/PictureFrameDoorMessage.cs create mode 100644 QSB/EchoesOfTheEye/PictureFrameDoors/PictureFrameDoorsManager.cs create mode 100644 QSB/EchoesOfTheEye/PictureFrameDoors/WorldObjects/IQSBPictureFrameDoor.cs create mode 100644 QSB/EchoesOfTheEye/PictureFrameDoors/WorldObjects/QSBGlitchedCodeDoorInterface.cs create mode 100644 QSB/EchoesOfTheEye/PictureFrameDoors/WorldObjects/QSBPictureFrameDoor.cs create mode 100644 QSB/EchoesOfTheEye/PictureFrameDoors/WorldObjects/QSBPictureFrameDoorInterface.cs diff --git a/QSB/EchoesOfTheEye/PictureFrameDoors/Messages/PictureFrameDoorMessage.cs b/QSB/EchoesOfTheEye/PictureFrameDoors/Messages/PictureFrameDoorMessage.cs new file mode 100644 index 00000000..d16322dc --- /dev/null +++ b/QSB/EchoesOfTheEye/PictureFrameDoors/Messages/PictureFrameDoorMessage.cs @@ -0,0 +1,13 @@ +using QSB.EchoesOfTheEye.PictureFrameDoors.WorldObjects; +using QSB.Messaging; + +namespace QSB.EchoesOfTheEye.PictureFrameDoors.Messages; + +internal class PictureFrameDoorMessage : QSBWorldObjectMessage +{ + public PictureFrameDoorMessage(bool open) + => Data = open; + + public override void OnReceiveRemote() + => WorldObject.SetOpenState(Data); +} diff --git a/QSB/EchoesOfTheEye/PictureFrameDoors/PictureFrameDoorsManager.cs b/QSB/EchoesOfTheEye/PictureFrameDoors/PictureFrameDoorsManager.cs new file mode 100644 index 00000000..a4781de1 --- /dev/null +++ b/QSB/EchoesOfTheEye/PictureFrameDoors/PictureFrameDoorsManager.cs @@ -0,0 +1,17 @@ +using Cysharp.Threading.Tasks; +using QSB.EchoesOfTheEye.PictureFrameDoors.WorldObjects; +using QSB.WorldSync; +using System.Threading; + +namespace QSB.EchoesOfTheEye.PictureFrameDoors; + +internal class PictureFrameDoorsManager : WorldObjectManager +{ + public override WorldObjectScene WorldObjectScene => WorldObjectScene.SolarSystem; + + public override async UniTask BuildWorldObjects(OWScene scene, CancellationToken ct) + { + QSBWorldSync.Init(typeof(GlitchedCodeDoorInterface)); + QSBWorldSync.Init(); + } +} diff --git a/QSB/EchoesOfTheEye/PictureFrameDoors/WorldObjects/IQSBPictureFrameDoor.cs b/QSB/EchoesOfTheEye/PictureFrameDoors/WorldObjects/IQSBPictureFrameDoor.cs new file mode 100644 index 00000000..009769f1 --- /dev/null +++ b/QSB/EchoesOfTheEye/PictureFrameDoors/WorldObjects/IQSBPictureFrameDoor.cs @@ -0,0 +1,8 @@ +using QSB.WorldSync; + +namespace QSB.EchoesOfTheEye.PictureFrameDoors.WorldObjects; + +internal interface IQSBPictureFrameDoor : IWorldObject +{ + public void SetOpenState(bool open); +} diff --git a/QSB/EchoesOfTheEye/PictureFrameDoors/WorldObjects/QSBGlitchedCodeDoorInterface.cs b/QSB/EchoesOfTheEye/PictureFrameDoors/WorldObjects/QSBGlitchedCodeDoorInterface.cs new file mode 100644 index 00000000..101750b6 --- /dev/null +++ b/QSB/EchoesOfTheEye/PictureFrameDoors/WorldObjects/QSBGlitchedCodeDoorInterface.cs @@ -0,0 +1,26 @@ +namespace QSB.EchoesOfTheEye.PictureFrameDoors.WorldObjects; + +internal class QSBGlitchedCodeDoorInterface : QSBPictureFrameDoor +{ + public override void SetOpenState(bool open) + { + if (AttachedObject._door.IsOpen() == open) + { + AttachedObject.UpdatePrompt(); + AttachedObject.CheckPlayGlitchAudio(); + return; + } + + if (open) + { + AttachedObject._door.Open(); + } + else + { + AttachedObject._door.Close(); + } + + AttachedObject.UpdatePrompt(); + AttachedObject.CheckPlayGlitchAudio(); + } +} diff --git a/QSB/EchoesOfTheEye/PictureFrameDoors/WorldObjects/QSBPictureFrameDoor.cs b/QSB/EchoesOfTheEye/PictureFrameDoors/WorldObjects/QSBPictureFrameDoor.cs new file mode 100644 index 00000000..07025072 --- /dev/null +++ b/QSB/EchoesOfTheEye/PictureFrameDoors/WorldObjects/QSBPictureFrameDoor.cs @@ -0,0 +1,15 @@ +using QSB.EchoesOfTheEye.PictureFrameDoors.Messages; +using QSB.Messaging; +using QSB.WorldSync; +using UnityEngine; + +namespace QSB.EchoesOfTheEye.PictureFrameDoors.WorldObjects; + +public abstract class QSBPictureFrameDoor : WorldObject, IQSBPictureFrameDoor + where T : MonoBehaviour +{ + public override void SendInitialState(uint to) + => (this as IQSBPictureFrameDoor).SendMessage(new PictureFrameDoorMessage((AttachedObject as PictureFrameDoorInterface)._door.IsOpen())); + + public abstract void SetOpenState(bool open); +} \ No newline at end of file diff --git a/QSB/EchoesOfTheEye/PictureFrameDoors/WorldObjects/QSBPictureFrameDoorInterface.cs b/QSB/EchoesOfTheEye/PictureFrameDoors/WorldObjects/QSBPictureFrameDoorInterface.cs new file mode 100644 index 00000000..f1a550a3 --- /dev/null +++ b/QSB/EchoesOfTheEye/PictureFrameDoors/WorldObjects/QSBPictureFrameDoorInterface.cs @@ -0,0 +1,24 @@ +namespace QSB.EchoesOfTheEye.PictureFrameDoors.WorldObjects; + +internal class QSBPictureFrameDoorInterface : QSBPictureFrameDoor +{ + public override void SetOpenState(bool open) + { + if (AttachedObject._door.IsOpen() == open) + { + AttachedObject.UpdatePrompt(); + return; + } + + if (open) + { + AttachedObject._door.Open(); + } + else + { + AttachedObject._door.Close(); + } + + AttachedObject.UpdatePrompt(); + } +} From f944dcf46e9b9f56aa1819e95f8b1e3cbe3b37f2 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Fri, 11 Mar 2022 01:11:49 -0800 Subject: [PATCH 2/3] PictureFrameDoorMessage: call base ctor --- .../PictureFrameDoors/Messages/PictureFrameDoorMessage.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/QSB/EchoesOfTheEye/PictureFrameDoors/Messages/PictureFrameDoorMessage.cs b/QSB/EchoesOfTheEye/PictureFrameDoors/Messages/PictureFrameDoorMessage.cs index d16322dc..857bd001 100644 --- a/QSB/EchoesOfTheEye/PictureFrameDoors/Messages/PictureFrameDoorMessage.cs +++ b/QSB/EchoesOfTheEye/PictureFrameDoors/Messages/PictureFrameDoorMessage.cs @@ -5,8 +5,7 @@ namespace QSB.EchoesOfTheEye.PictureFrameDoors.Messages; internal class PictureFrameDoorMessage : QSBWorldObjectMessage { - public PictureFrameDoorMessage(bool open) - => Data = open; + public PictureFrameDoorMessage(bool open) : base(open) { } public override void OnReceiveRemote() => WorldObject.SetOpenState(Data); From 33f9cdbf0a956a0534078c7b06d2461e6ee8d3ba Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Fri, 11 Mar 2022 16:14:26 +0000 Subject: [PATCH 3/3] Add patch to call the event lol --- .../PictureFrameDoorInterfacePatches.cs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 QSB/EchoesOfTheEye/PictureFrameDoors/Patches/PictureFrameDoorInterfacePatches.cs diff --git a/QSB/EchoesOfTheEye/PictureFrameDoors/Patches/PictureFrameDoorInterfacePatches.cs b/QSB/EchoesOfTheEye/PictureFrameDoors/Patches/PictureFrameDoorInterfacePatches.cs new file mode 100644 index 00000000..7023da4b --- /dev/null +++ b/QSB/EchoesOfTheEye/PictureFrameDoors/Patches/PictureFrameDoorInterfacePatches.cs @@ -0,0 +1,18 @@ +using HarmonyLib; +using QSB.EchoesOfTheEye.PictureFrameDoors.Messages; +using QSB.EchoesOfTheEye.PictureFrameDoors.WorldObjects; +using QSB.Messaging; +using QSB.Patches; +using QSB.WorldSync; + +namespace QSB.EchoesOfTheEye.PictureFrameDoors.Patches; + +internal class PictureFrameDoorInterfacePatches : QSBPatch +{ + public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect; + + [HarmonyPostfix] + [HarmonyPatch(typeof(PictureFrameDoorInterface), nameof(PictureFrameDoorInterface.ToggleOpenState))] + public static void ToggleOpenState(PictureFrameDoorInterface __instance) + => __instance.GetWorldObject().SendMessage(new PictureFrameDoorMessage(__instance._door.IsOpen())); +}