add projector sync

This commit is contained in:
Mister_Nebula 2022-03-29 18:53:19 +01:00
parent cbc84950aa
commit e6227196e4
4 changed files with 72 additions and 0 deletions

View File

@ -0,0 +1,12 @@
using QSB.EchoesOfTheEye.DreamObjectProjectors.WorldObject;
using QSB.Messaging;
namespace QSB.EchoesOfTheEye.DreamObjectProjectors.Messages;
internal class ProjectorStatusMessage : QSBWorldObjectMessage<QSBDreamObjectProjector, bool>
{
public ProjectorStatusMessage(bool lit) : base(lit) { }
public override void OnReceiveRemote()
=> WorldObject.AttachedObject.SetLit(Data);
}

View File

@ -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<QSBDreamObjectProjector>().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<QSBDreamObjectProjector>().SendMessage(new ProjectorStatusMessage(true));
}
__instance._wasSensorIlluminated = flag;
return false;
}
}

View File

@ -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<QSBDreamObjectProjector, DreamObjectProjector>(typeof(DreamRaftProjector));
}

View File

@ -0,0 +1,11 @@
using QSB.EchoesOfTheEye.DreamObjectProjectors.Messages;
using QSB.Messaging;
using QSB.WorldSync;
namespace QSB.EchoesOfTheEye.DreamObjectProjectors.WorldObject;
public class QSBDreamObjectProjector : WorldObject<DreamObjectProjector>
{
public override void SendInitialState(uint to)
=> this.SendMessage(new ProjectorStatusMessage(AttachedObject.isLit) { To = to });
}