diff --git a/QSB/EchoesOfTheEye/PictureFrameDoors/Messages/PictureFrameDoorMessage.cs b/QSB/EchoesOfTheEye/PictureFrameDoors/Messages/PictureFrameDoorMessage.cs new file mode 100644 index 00000000..857bd001 --- /dev/null +++ b/QSB/EchoesOfTheEye/PictureFrameDoors/Messages/PictureFrameDoorMessage.cs @@ -0,0 +1,12 @@ +using QSB.EchoesOfTheEye.PictureFrameDoors.WorldObjects; +using QSB.Messaging; + +namespace QSB.EchoesOfTheEye.PictureFrameDoors.Messages; + +internal class PictureFrameDoorMessage : QSBWorldObjectMessage +{ + public PictureFrameDoorMessage(bool open) : base(open) { } + + public override void OnReceiveRemote() + => WorldObject.SetOpenState(Data); +} 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())); +} 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(); + } +}