From 0428ee9f13f44b1c856418dcee669b3b4cd54357 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Sat, 26 Feb 2022 00:02:14 -0800 Subject: [PATCH] Raft: get authority on sensor light-up --- QSB/AuthoritySync/AuthorityManager.cs | 9 +++++- .../Patches/LightSensorPatches.cs | 19 +++++++++++- .../WorldObjects/QSBSingleLightSensor.cs | 2 ++ .../TransformSync/RaftTransformSync.cs | 17 ++++------- .../RaftSync/WorldObjects/QSBRaft.cs | 30 ++++++++++++++++++- 5 files changed, 62 insertions(+), 15 deletions(-) diff --git a/QSB/AuthoritySync/AuthorityManager.cs b/QSB/AuthoritySync/AuthorityManager.cs index 6eb405e7..b508d931 100644 --- a/QSB/AuthoritySync/AuthorityManager.cs +++ b/QSB/AuthoritySync/AuthorityManager.cs @@ -82,8 +82,15 @@ public static class AuthorityManager #region any client - public static void UpdateAuthQueue(this NetworkIdentity identity, AuthQueueAction action) => + public static void UpdateAuthQueue(this NetworkIdentity identity, AuthQueueAction action) + { + if (action == AuthQueueAction.Force && identity.hasAuthority) + { + return; + } + new AuthQueueMessage(identity.netId, action).Send(); + } #endregion } \ No newline at end of file diff --git a/QSB/EchoesOfTheEye/LightSensorSync/Patches/LightSensorPatches.cs b/QSB/EchoesOfTheEye/LightSensorSync/Patches/LightSensorPatches.cs index 5754b892..e1871091 100644 --- a/QSB/EchoesOfTheEye/LightSensorSync/Patches/LightSensorPatches.cs +++ b/QSB/EchoesOfTheEye/LightSensorSync/Patches/LightSensorPatches.cs @@ -1,7 +1,9 @@ using HarmonyLib; +using QSB.EchoesOfTheEye.LightSensorSync.WorldObjects; using QSB.Patches; using QSB.Player; using QSB.Tools.FlashlightTool; +using QSB.WorldSync; using System.Linq; using UnityEngine; @@ -16,6 +18,14 @@ internal class LightSensorPatches : QSBPatch [HarmonyPatch(typeof(SingleLightSensor), nameof(SingleLightSensor.UpdateIllumination))] public static bool UpdateIlluminationReplacement(SingleLightSensor __instance) { + if (!QSBWorldSync.AllObjectsReady) + { + return true; + } + + var qsbSingleLightSensor = __instance.GetWorldObject(); + qsbSingleLightSensor.IlluminatedByLocalPlayer = false; + __instance._illuminated = false; if (__instance._illuminatingDreamLanternList != null) { @@ -68,11 +78,13 @@ internal class LightSensorPatches : QSBPatch && !__instance.CheckOcclusion(position, vector, sensorWorldDir)) { __instance._illuminated = true; + + qsbSingleLightSensor.IlluminatedByLocalPlayer = true; } } else { - var player = QSBPlayerManager.PlayerList.First(x => x.FlashLight == (QSBFlashlight)source /*bug ??? always invalid cast*/); + var player = QSBPlayerManager.PlayerList.First(x => x.FlashLight == source as QSBFlashlight); var position = player.Camera.transform.position; var to = __instance.transform.position - position; @@ -95,6 +107,7 @@ internal class LightSensorPatches : QSBPatch && !__instance.CheckOcclusion(probe.GetLightSourcePosition(), vector, sensorWorldDir)) { __instance._illuminated = true; + qsbSingleLightSensor.IlluminatedByLocalPlayer = true; } break; @@ -114,6 +127,8 @@ internal class LightSensorPatches : QSBPatch { __instance._illuminatingDreamLanternList.Add(dreamLanternController); __instance._illuminated = true; + + qsbSingleLightSensor.IlluminatedByLocalPlayer = true; } break; @@ -127,6 +142,8 @@ internal class LightSensorPatches : QSBPatch if (light.CheckIlluminationAtPoint(vector, __instance._sensorRadius, maxDistance) && !__instance.CheckOcclusion(light.transform.position, vector, sensorWorldDir, occludableLight)) { __instance._illuminated = true; + + qsbSingleLightSensor.IlluminatedByLocalPlayer = true; break; } } diff --git a/QSB/EchoesOfTheEye/LightSensorSync/WorldObjects/QSBSingleLightSensor.cs b/QSB/EchoesOfTheEye/LightSensorSync/WorldObjects/QSBSingleLightSensor.cs index f7489877..8b761b22 100644 --- a/QSB/EchoesOfTheEye/LightSensorSync/WorldObjects/QSBSingleLightSensor.cs +++ b/QSB/EchoesOfTheEye/LightSensorSync/WorldObjects/QSBSingleLightSensor.cs @@ -6,4 +6,6 @@ namespace QSB.EchoesOfTheEye.LightSensorSync.WorldObjects; internal class QSBSingleLightSensor : WorldObject { public override void SendInitialState(uint to) { } + + public bool IlluminatedByLocalPlayer; } \ No newline at end of file diff --git a/QSB/EchoesOfTheEye/RaftSync/TransformSync/RaftTransformSync.cs b/QSB/EchoesOfTheEye/RaftSync/TransformSync/RaftTransformSync.cs index 3ca284b5..38c1f4af 100644 --- a/QSB/EchoesOfTheEye/RaftSync/TransformSync/RaftTransformSync.cs +++ b/QSB/EchoesOfTheEye/RaftSync/TransformSync/RaftTransformSync.cs @@ -1,5 +1,4 @@ -using Mirror; -using QSB.AuthoritySync; +using QSB.AuthoritySync; using QSB.EchoesOfTheEye.RaftSync.WorldObjects; using QSB.Syncs.Unsectored.Rigidbodies; using QSB.Utility; @@ -63,14 +62,8 @@ public class RaftTransformSync : UnsectoredRigidbodySync private void OnUnsuspend(OWRigidbody suspendedBody) => netIdentity.UpdateAuthQueue(AuthQueueAction.Add); private void OnSuspend(OWRigidbody suspendedBody) => netIdentity.UpdateAuthQueue(AuthQueueAction.Remove); - public override void OnStartAuthority() => DebugLog.DebugWrite($"{this} - start authority"); - public override void OnStopAuthority() => DebugLog.DebugWrite($"{this} - stop authority"); - - protected override void Deserialize(NetworkReader reader) - { - DebugLog.DebugWrite($"{this} - deserialize"); - base.Deserialize(reader); - } + public override void OnStartAuthority() => DebugLog.DebugWrite($"{this} - authority = true"); + public override void OnStopAuthority() => DebugLog.DebugWrite($"{this} - authority = false"); /// /// replacement for base method @@ -78,8 +71,8 @@ public class RaftTransformSync : UnsectoredRigidbodySync /// protected override void ApplyToAttached() { - var targetPos = ReferenceTransform.FromRelPos(UseInterpolation ? SmoothPosition : transform.position); - var targetRot = ReferenceTransform.FromRelRot(UseInterpolation ? SmoothRotation : transform.rotation); + var targetPos = ReferenceTransform.FromRelPos(transform.position); + var targetRot = ReferenceTransform.FromRelRot(transform.rotation); AttachedRigidbody.SetPosition(targetPos); AttachedRigidbody.SetRotation(targetRot); diff --git a/QSB/EchoesOfTheEye/RaftSync/WorldObjects/QSBRaft.cs b/QSB/EchoesOfTheEye/RaftSync/WorldObjects/QSBRaft.cs index 385b7836..08a6a163 100644 --- a/QSB/EchoesOfTheEye/RaftSync/WorldObjects/QSBRaft.cs +++ b/QSB/EchoesOfTheEye/RaftSync/WorldObjects/QSBRaft.cs @@ -1,7 +1,10 @@ using Cysharp.Threading.Tasks; using Mirror; +using QSB.AuthoritySync; +using QSB.EchoesOfTheEye.LightSensorSync.WorldObjects; using QSB.EchoesOfTheEye.RaftSync.TransformSync; using QSB.WorldSync; +using System.Linq; using System.Threading; using UnityEngine; @@ -21,6 +24,11 @@ public class QSBRaft : WorldObject } await UniTask.WaitUntil(() => TransformSync, cancellationToken: ct); + + foreach (var lightSensor in AttachedObject._lightSensors) + { + lightSensor.OnDetectLight += OnDetectLight; + } } public override void OnRemoval() @@ -29,10 +37,30 @@ public class QSBRaft : WorldObject { NetworkServer.Destroy(TransformSync.gameObject); } + + foreach (var lightSensor in AttachedObject._lightSensors) + { + lightSensor.OnDetectLight -= OnDetectLight; + } + } + + private void OnDetectLight() + { + if (!AttachedObject._fluidDetector.InFluidType(FluidVolume.Type.WATER)) + { + return; + } + + if (!AttachedObject._lightSensors.Any(x => x.GetWorldObject().IlluminatedByLocalPlayer)) + { + return; + } + + TransformSync.netIdentity.UpdateAuthQueue(AuthQueueAction.Force); } public override void SendInitialState(uint to) { // todo?? SendInitialState } -} +} \ No newline at end of file