From b93ece8bd84f42684e522cc678b191046130d746 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Thu, 30 Dec 2021 23:34:02 +0000 Subject: [PATCH 01/47] bump version --- .../Patches/InflationPatches.cs | 24 +++++++++++++++++++ QSB/manifest.json | 2 +- 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 QSB/EyeOfTheUniverse/CosmicInflation/Patches/InflationPatches.cs diff --git a/QSB/EyeOfTheUniverse/CosmicInflation/Patches/InflationPatches.cs b/QSB/EyeOfTheUniverse/CosmicInflation/Patches/InflationPatches.cs new file mode 100644 index 00000000..9b16ca16 --- /dev/null +++ b/QSB/EyeOfTheUniverse/CosmicInflation/Patches/InflationPatches.cs @@ -0,0 +1,24 @@ +using HarmonyLib; +using QSB.Patches; +using QSB.Utility; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace QSB.EyeOfTheUniverse.CosmicInflation.Patches +{ + internal class InflationPatches : QSBPatch + { + public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect; + + [HarmonyPrefix] + [HarmonyPatch(typeof(CosmicInflationController), nameof(CosmicInflationController.StartCollapse))] + public static bool StartCollapse(CosmicInflationController __instance) + { + DebugLog.DebugWrite($"Start Collapse"); + return true; + } + } +} diff --git a/QSB/manifest.json b/QSB/manifest.json index fcd76a32..b1d99183 100644 --- a/QSB/manifest.json +++ b/QSB/manifest.json @@ -7,7 +7,7 @@ "body": "- Disable *all* other mods. (Can heavily affect performance)\n- Make sure you are not running any other network-intensive applications.\n- Make sure you have forwarded/opened the correct ports. (See the GitHub readme.)" }, "uniqueName": "Raicuparta.QuantumSpaceBuddies", - "version": "0.14.0", + "version": "0.15.0", "owmlVersion": "2.2.0", "dependencies": [ "_nebula.MenuFramework" ] } From f4e9cd9b0a30b33d090878e9933e047ab1048b68 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Thu, 30 Dec 2021 15:33:49 -0800 Subject: [PATCH 02/47] add to debugsettings.json, just in case --- QSB/Utility/DebugSettings.cs | 14 +++++++------- QSB/debugsettings.json | 3 ++- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/QSB/Utility/DebugSettings.cs b/QSB/Utility/DebugSettings.cs index ffbe8a43..b71805cc 100644 --- a/QSB/Utility/DebugSettings.cs +++ b/QSB/Utility/DebugSettings.cs @@ -5,24 +5,24 @@ namespace QSB.Utility public class DebugSettings { [JsonProperty("debugMode")] - public bool DebugMode { get; set; } = false; + public bool DebugMode { get; set; } [JsonProperty("drawLines")] - public bool DrawLines { get; set; } = false; + public bool DrawLines { get; set; } [JsonProperty("showQuantumVisibilityObjects")] - public bool ShowQuantumVisibilityObjects { get; set; } = false; + public bool ShowQuantumVisibilityObjects { get; set; } [JsonProperty("showDebugLabels")] - public bool ShowDebugLabels { get; set; } = false; + public bool ShowDebugLabels { get; set; } [JsonProperty("avoidTimeSync")] - public bool AvoidTimeSync { get; set; } = false; + public bool AvoidTimeSync { get; set; } [JsonProperty("skipTitleScreen")] - public bool SkipTitleScreen { get; set; } = false; + public bool SkipTitleScreen { get; set; } [JsonProperty("greySkybox")] - public bool GreySkybox { get; set; } = false; + public bool GreySkybox { get; set; } } } diff --git a/QSB/debugsettings.json b/QSB/debugsettings.json index b6ff6311..0f80bf2e 100644 --- a/QSB/debugsettings.json +++ b/QSB/debugsettings.json @@ -4,5 +4,6 @@ "showQuantumVisibilityObjects": false, "showDebugLabels": true, "avoidTimeSync": false, - "skipTitleScreen": true + "skipTitleScreen": true, + "greySkybox": false } \ No newline at end of file From 17b798d7c139ceb8620b4765d1aad1d3f0d8da4b Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Thu, 30 Dec 2021 15:38:28 -0800 Subject: [PATCH 03/47] using >= is more clear to me, idk --- QSB/Player/Messages/PlayerJoinMessage.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/QSB/Player/Messages/PlayerJoinMessage.cs b/QSB/Player/Messages/PlayerJoinMessage.cs index 02c344e0..e58b375b 100644 --- a/QSB/Player/Messages/PlayerJoinMessage.cs +++ b/QSB/Player/Messages/PlayerJoinMessage.cs @@ -75,7 +75,7 @@ namespace QSB.Player.Messages return; } - if (QSBPlayerManager.PlayerList.Any(x => x.EyeState > EyeState.WarpedToSurface)) + if (QSBPlayerManager.PlayerList.Any(x => x.EyeState >= EyeState.IntoTheVortex)) { DebugLog.ToConsole($"Error - Client {PlayerName} connecting too late into eye scene.", MessageType.Error); new PlayerKickMessage(From, KickReason.InEye).Send(); From 2ecc3a45292c335b774d6f97cffce611ab8fb599 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Thu, 30 Dec 2021 15:40:06 -0800 Subject: [PATCH 04/47] use list capacity --- .../ForestOfGalaxies/Messages/KillGalaxiesMessage.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/QSB/EyeOfTheUniverse/ForestOfGalaxies/Messages/KillGalaxiesMessage.cs b/QSB/EyeOfTheUniverse/ForestOfGalaxies/Messages/KillGalaxiesMessage.cs index 42be5ff6..65e36857 100644 --- a/QSB/EyeOfTheUniverse/ForestOfGalaxies/Messages/KillGalaxiesMessage.cs +++ b/QSB/EyeOfTheUniverse/ForestOfGalaxies/Messages/KillGalaxiesMessage.cs @@ -9,7 +9,7 @@ namespace QSB.EyeOfTheUniverse.ForestOfGalaxies.Messages { internal class KillGalaxiesMessage : QSBMessage { - private List _deathDelays = new(); + private List _deathDelays; public KillGalaxiesMessage(List deathDelays) => _deathDelays = deathDelays; @@ -29,7 +29,7 @@ namespace QSB.EyeOfTheUniverse.ForestOfGalaxies.Messages { base.Deserialize(reader); var length = reader.ReadInt32(); - _deathDelays = new List(); + _deathDelays = new List(length); for (var i = 0; i < length; i++) { _deathDelays.Add(reader.ReadSingle()); From a3f9f1391e26a566b10aeee24baa482a806fb551 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Thu, 30 Dec 2021 15:53:10 -0800 Subject: [PATCH 05/47] disable host button when we progress far enough in the eye --- .../EyeStateSync/Messages/EyeStateMessage.cs | 5 ++++- QSB/Menus/MenuManager.cs | 8 ++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/QSB/EyeOfTheUniverse/EyeStateSync/Messages/EyeStateMessage.cs b/QSB/EyeOfTheUniverse/EyeStateSync/Messages/EyeStateMessage.cs index 90406d4d..4e762859 100644 --- a/QSB/EyeOfTheUniverse/EyeStateSync/Messages/EyeStateMessage.cs +++ b/QSB/EyeOfTheUniverse/EyeStateSync/Messages/EyeStateMessage.cs @@ -1,4 +1,5 @@ -using QSB.Messaging; +using QSB.Menus; +using QSB.Messaging; using QSB.Player; using QSB.Player.TransformSync; using QSB.WorldSync; @@ -25,12 +26,14 @@ namespace QSB.EyeOfTheUniverse.EyeStateSync.Messages public override void OnReceiveLocal() { QSBPlayerManager.LocalPlayer.EyeState = Value; + MenuManager.Instance.OnEyeStateChange(Value); } public override void OnReceiveRemote() { var player = QSBPlayerManager.GetPlayer(From); player.EyeState = Value; + MenuManager.Instance.OnEyeStateChange(Value); } } } \ No newline at end of file diff --git a/QSB/Menus/MenuManager.cs b/QSB/Menus/MenuManager.cs index e977f0a7..76039dc7 100644 --- a/QSB/Menus/MenuManager.cs +++ b/QSB/Menus/MenuManager.cs @@ -199,6 +199,14 @@ namespace QSB.Menus DisconnectPopup._labelText.text = popupText; } + public void OnEyeStateChange(EyeState state) + { + if (state >= EyeState.IntoTheVortex) + { + SetButtonActive(HostButton, false); + } + } + private void MakeTitleMenus() { CreateCommonPopups(); From 0ee1222d3e9f9e47c29573faafa9aec50b5327e5 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Thu, 30 Dec 2021 15:55:22 -0800 Subject: [PATCH 06/47] wait im dumb --- QSB/EyeOfTheUniverse/EyeStateSync/Messages/EyeStateMessage.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/QSB/EyeOfTheUniverse/EyeStateSync/Messages/EyeStateMessage.cs b/QSB/EyeOfTheUniverse/EyeStateSync/Messages/EyeStateMessage.cs index 4e762859..8d93253f 100644 --- a/QSB/EyeOfTheUniverse/EyeStateSync/Messages/EyeStateMessage.cs +++ b/QSB/EyeOfTheUniverse/EyeStateSync/Messages/EyeStateMessage.cs @@ -12,6 +12,8 @@ namespace QSB.EyeOfTheUniverse.EyeStateSync.Messages private static void Handler(EyeState state) { + MenuManager.Instance.OnEyeStateChange(state); + if (PlayerTransformSync.LocalInstance) { new EyeStateMessage(state).Send(); @@ -26,14 +28,12 @@ namespace QSB.EyeOfTheUniverse.EyeStateSync.Messages public override void OnReceiveLocal() { QSBPlayerManager.LocalPlayer.EyeState = Value; - MenuManager.Instance.OnEyeStateChange(Value); } public override void OnReceiveRemote() { var player = QSBPlayerManager.GetPlayer(From); player.EyeState = Value; - MenuManager.Instance.OnEyeStateChange(Value); } } } \ No newline at end of file From 61ff7b71e054513ee0085241c82aa878386832b1 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Thu, 30 Dec 2021 18:00:05 -0800 Subject: [PATCH 07/47] move host button eye check --- .../EyeStateSync/Messages/EyeStateMessage.cs | 2 -- QSB/Menus/MenuManager.cs | 11 ++++++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/QSB/EyeOfTheUniverse/EyeStateSync/Messages/EyeStateMessage.cs b/QSB/EyeOfTheUniverse/EyeStateSync/Messages/EyeStateMessage.cs index 8d93253f..fd3506c8 100644 --- a/QSB/EyeOfTheUniverse/EyeStateSync/Messages/EyeStateMessage.cs +++ b/QSB/EyeOfTheUniverse/EyeStateSync/Messages/EyeStateMessage.cs @@ -12,8 +12,6 @@ namespace QSB.EyeOfTheUniverse.EyeStateSync.Messages private static void Handler(EyeState state) { - MenuManager.Instance.OnEyeStateChange(state); - if (PlayerTransformSync.LocalInstance) { new EyeStateMessage(state).Send(); diff --git a/QSB/Menus/MenuManager.cs b/QSB/Menus/MenuManager.cs index 76039dc7..9de73da8 100644 --- a/QSB/Menus/MenuManager.cs +++ b/QSB/Menus/MenuManager.cs @@ -49,6 +49,15 @@ namespace QSB.Menus private void OnSceneLoaded(OWScene oldScene, OWScene newScene, bool isUniverse) { + if (newScene == OWScene.EyeOfTheUniverse) + { + GlobalMessenger.AddListener(OWEvents.EyeStateChanged, OnEyeStateChanged); + } + else + { + GlobalMessenger.RemoveListener(OWEvents.EyeStateChanged, OnEyeStateChanged); + } + if (isUniverse) { InitPauseMenus(); @@ -199,7 +208,7 @@ namespace QSB.Menus DisconnectPopup._labelText.text = popupText; } - public void OnEyeStateChange(EyeState state) + private void OnEyeStateChanged(EyeState state) { if (state >= EyeState.IntoTheVortex) { From 38fbdedd3cea03cd2821dc7637db9c9baf90e7a2 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Thu, 30 Dec 2021 18:28:24 -0800 Subject: [PATCH 08/47] slight cleanup --- .../ForestOfGalaxies/Messages/KillGalaxiesMessage.cs | 9 ++++----- .../ForestOfGalaxies/Patches/ForestPatches.cs | 11 +++++------ 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/QSB/EyeOfTheUniverse/ForestOfGalaxies/Messages/KillGalaxiesMessage.cs b/QSB/EyeOfTheUniverse/ForestOfGalaxies/Messages/KillGalaxiesMessage.cs index 65e36857..2115f64d 100644 --- a/QSB/EyeOfTheUniverse/ForestOfGalaxies/Messages/KillGalaxiesMessage.cs +++ b/QSB/EyeOfTheUniverse/ForestOfGalaxies/Messages/KillGalaxiesMessage.cs @@ -13,8 +13,6 @@ namespace QSB.EyeOfTheUniverse.ForestOfGalaxies.Messages public KillGalaxiesMessage(List deathDelays) => _deathDelays = deathDelays; - public override bool ShouldReceive => WorldObjectManager.AllObjectsReady; - public override void Serialize(QNetworkWriter writer) { base.Serialize(writer); @@ -36,23 +34,24 @@ namespace QSB.EyeOfTheUniverse.ForestOfGalaxies.Messages } } + public override bool ShouldReceive => WorldObjectManager.AllObjectsReady; + public override void OnReceiveRemote() { var galaxyController = QSBWorldSync.GetUnityObjects().First(); galaxyController._killTrigger.OnEntry -= galaxyController.OnEnterKillTrigger; - galaxyController._galaxies = galaxyController.GetComponentsInChildren(true); + galaxyController._galaxies = galaxyController.GetComponentsInChildren(true); for (var i = 0; i < galaxyController._galaxies.Length; i++) { galaxyController._galaxies[i].DieAfterSeconds(_deathDelays[i], true, AudioType.EyeGalaxyBlowAway); } - galaxyController._forestIsDarkTime = Time.time + 65f; galaxyController.enabled = true; galaxyController._musicSource.SetLocalVolume(0f); - galaxyController._musicSource.FadeIn(5f, false, false, 1f); + galaxyController._musicSource.FadeIn(5f); } } } diff --git a/QSB/EyeOfTheUniverse/ForestOfGalaxies/Patches/ForestPatches.cs b/QSB/EyeOfTheUniverse/ForestOfGalaxies/Patches/ForestPatches.cs index 7519b0a1..febabff2 100644 --- a/QSB/EyeOfTheUniverse/ForestOfGalaxies/Patches/ForestPatches.cs +++ b/QSB/EyeOfTheUniverse/ForestOfGalaxies/Patches/ForestPatches.cs @@ -69,18 +69,17 @@ namespace QSB.EyeOfTheUniverse.ForestOfGalaxies.Patches [HarmonyPatch(typeof(MiniGalaxyController), nameof(MiniGalaxyController.KillGalaxies))] public static bool KillGalaxiesReplacement(MiniGalaxyController __instance) { - var num = 60f; + const float delay = 60f; __instance._galaxies = __instance.GetComponentsInChildren(true); var delayList = new List(); - for (var i = 0; i < __instance._galaxies.Length; i++) + foreach (var galaxy in __instance._galaxies) { - var rnd = Random.Range(30f, num); + var rnd = Random.Range(30f, delay); delayList.Add(rnd); - __instance._galaxies[i].DieAfterSeconds(rnd, true, AudioType.EyeGalaxyBlowAway); + galaxy.DieAfterSeconds(rnd, true, AudioType.EyeGalaxyBlowAway); } new KillGalaxiesMessage(delayList).Send(); - - __instance._forestIsDarkTime = Time.time + num + 5f; + __instance._forestIsDarkTime = Time.time + delay + 5f; __instance.enabled = true; return false; From c7032eb97c69b2b52e43dc888de564e0f04057c1 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Thu, 30 Dec 2021 19:19:30 -0800 Subject: [PATCH 09/47] simple remote collapse --- .../Messages/EnterFogSphereMessage.cs | 27 +++++++++++++++++++ .../Patches/InflationPatches.cs | 24 ++++++++++------- 2 files changed, 41 insertions(+), 10 deletions(-) create mode 100644 QSB/EyeOfTheUniverse/CosmicInflation/Messages/EnterFogSphereMessage.cs diff --git a/QSB/EyeOfTheUniverse/CosmicInflation/Messages/EnterFogSphereMessage.cs b/QSB/EyeOfTheUniverse/CosmicInflation/Messages/EnterFogSphereMessage.cs new file mode 100644 index 00000000..587b714a --- /dev/null +++ b/QSB/EyeOfTheUniverse/CosmicInflation/Messages/EnterFogSphereMessage.cs @@ -0,0 +1,27 @@ +using QSB.Messaging; +using QSB.Utility; +using QSB.WorldSync; +using System.Linq; + +namespace QSB.EyeOfTheUniverse.CosmicInflation.Messages +{ + public class EnterFogSphereMessage : QSBMessage + { + public EnterFogSphereMessage() + { + DebugLog.DebugWrite("LOCAL enter fog sphere"); + } + + public override bool ShouldReceive => WorldObjectManager.AllObjectsReady; + + public override void OnReceiveRemote() + { + DebugLog.DebugWrite($"REMOTE enter fog sphere from {From}"); + var controller = QSBWorldSync.GetUnityObjects().First(); + + controller._smokeSphereTrigger.SetTriggerActivation(false); + controller._probeDestroyTrigger.SetTriggerActivation(false); + controller.StartCollapse(); + } + } +} diff --git a/QSB/EyeOfTheUniverse/CosmicInflation/Patches/InflationPatches.cs b/QSB/EyeOfTheUniverse/CosmicInflation/Patches/InflationPatches.cs index 9b16ca16..defae678 100644 --- a/QSB/EyeOfTheUniverse/CosmicInflation/Patches/InflationPatches.cs +++ b/QSB/EyeOfTheUniverse/CosmicInflation/Patches/InflationPatches.cs @@ -1,11 +1,8 @@ using HarmonyLib; +using QSB.EyeOfTheUniverse.CosmicInflation.Messages; +using QSB.Messaging; using QSB.Patches; -using QSB.Utility; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using UnityEngine; namespace QSB.EyeOfTheUniverse.CosmicInflation.Patches { @@ -14,11 +11,18 @@ namespace QSB.EyeOfTheUniverse.CosmicInflation.Patches public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect; [HarmonyPrefix] - [HarmonyPatch(typeof(CosmicInflationController), nameof(CosmicInflationController.StartCollapse))] - public static bool StartCollapse(CosmicInflationController __instance) + [HarmonyPatch(typeof(CosmicInflationController), nameof(CosmicInflationController.OnEnterFogSphere))] + public static bool OnEnterFogSphere(CosmicInflationController __instance, GameObject obj) { - DebugLog.DebugWrite($"Start Collapse"); - return true; + if (obj.CompareTag("PlayerCameraDetector") && __instance._state == CosmicInflationController.State.ReadyToCollapse) + { + __instance._smokeSphereTrigger.SetTriggerActivation(false); + __instance._probeDestroyTrigger.SetTriggerActivation(false); + __instance.StartCollapse(); + new EnterFogSphereMessage().Send(); + } + + return false; } } } From 37f104354456448320178431463fe83e135f6336 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Thu, 30 Dec 2021 19:55:32 -0800 Subject: [PATCH 10/47] account for death loop with no necro messages --- QSB/DeathSync/Messages/PlayerDeathMessage.cs | 2 +- QSB/DeathSync/Necronomicon.cs | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/QSB/DeathSync/Messages/PlayerDeathMessage.cs b/QSB/DeathSync/Messages/PlayerDeathMessage.cs index f6b97b9b..9ac8c673 100644 --- a/QSB/DeathSync/Messages/PlayerDeathMessage.cs +++ b/QSB/DeathSync/Messages/PlayerDeathMessage.cs @@ -37,7 +37,7 @@ namespace QSB.DeathSync.Messages var player = QSBPlayerManager.GetPlayer(From); var playerName = player.Name; var deathMessage = Necronomicon.GetPhrase(Value, NecronomiconIndex); - if (deathMessage != string.Empty) + if (deathMessage != null) { DebugLog.ToAll(string.Format(deathMessage, playerName)); } diff --git a/QSB/DeathSync/Necronomicon.cs b/QSB/DeathSync/Necronomicon.cs index ee66ac9f..4b3e7fe4 100644 --- a/QSB/DeathSync/Necronomicon.cs +++ b/QSB/DeathSync/Necronomicon.cs @@ -144,11 +144,13 @@ namespace QSB.DeathSync }; public static string GetPhrase(DeathType deathType, int index) - => !Darkhold.ContainsKey(deathType) - ? string.Empty - : Darkhold[deathType][index]; + => Darkhold.ContainsKey(deathType) + ? Darkhold[deathType][index] + : null; public static int GetRandomIndex(DeathType deathType) - => new Random().Next(0, Darkhold[deathType].Length); + => Darkhold.ContainsKey(deathType) + ? new Random().Next(0, Darkhold[deathType].Length) + : -1; } } \ No newline at end of file From 74ff2a33417aba29f806f727f202fa0366e54756 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Thu, 30 Dec 2021 20:45:46 -0800 Subject: [PATCH 11/47] player clone flicker --- .../Messages/WarpFlickerActivateMessage.cs | 28 +++++++++++++++++++ .../ForestOfGalaxies/Patches/ForestPatches.cs | 28 +++++++++++++++++++ QSB/Messaging/OWEvents.cs | 1 + 3 files changed, 57 insertions(+) create mode 100644 QSB/EyeOfTheUniverse/ForestOfGalaxies/Messages/WarpFlickerActivateMessage.cs diff --git a/QSB/EyeOfTheUniverse/ForestOfGalaxies/Messages/WarpFlickerActivateMessage.cs b/QSB/EyeOfTheUniverse/ForestOfGalaxies/Messages/WarpFlickerActivateMessage.cs new file mode 100644 index 00000000..32eedc37 --- /dev/null +++ b/QSB/EyeOfTheUniverse/ForestOfGalaxies/Messages/WarpFlickerActivateMessage.cs @@ -0,0 +1,28 @@ +using QSB.Messaging; +using QSB.Utility; +using QSB.WorldSync; +using System.Linq; +using UnityEngine; + +namespace QSB.EyeOfTheUniverse.ForestOfGalaxies.Messages +{ + internal class WarpFlickerActivateMessage : QSBMessage + { + public WarpFlickerActivateMessage() + { + DebugLog.DebugWrite("LOCAL player clone flicker"); + } + + public override bool ShouldReceive => WorldObjectManager.AllObjectsReady; + + public override void OnReceiveRemote() + { + DebugLog.DebugWrite("REMOTE player clone flicker from {From"); + var controller = QSBWorldSync.GetUnityObjects().First(); + + controller._warpFlickerActivated = true; + controller._warpTime = Time.time + 0.5f; + GlobalMessenger.FireEvent(OWEvents.FlickerOffAndOn, 0.5f, 0.5f); + } + } +} diff --git a/QSB/EyeOfTheUniverse/ForestOfGalaxies/Patches/ForestPatches.cs b/QSB/EyeOfTheUniverse/ForestOfGalaxies/Patches/ForestPatches.cs index febabff2..fa2e63fd 100644 --- a/QSB/EyeOfTheUniverse/ForestOfGalaxies/Patches/ForestPatches.cs +++ b/QSB/EyeOfTheUniverse/ForestOfGalaxies/Patches/ForestPatches.cs @@ -84,5 +84,33 @@ namespace QSB.EyeOfTheUniverse.ForestOfGalaxies.Patches return false; } + [HarmonyPrefix] + [HarmonyPatch(typeof(PlayerCloneController), nameof(PlayerCloneController.FixedUpdate))] + public static bool CloneFixedUpdate(PlayerCloneController __instance) + { + var playerTransform = Locator.GetPlayerTransform(); + var vector = __instance.transform.parent.InverseTransformPoint(playerTransform.position); + var b = __instance._localMirrorPos - vector; + var position = __instance._localMirrorPos + b; + position.y = vector.y; + __instance.transform.position = __instance.transform.parent.TransformPoint(position); + var normalized = (__instance.transform.position - playerTransform.position).normalized; + var forward = Vector3.Reflect(playerTransform.forward, normalized); + var upwards = Vector3.Reflect(playerTransform.up, normalized); + __instance.transform.rotation = Quaternion.LookRotation(forward, upwards); + var num = Vector3.Distance(__instance.transform.position, playerTransform.position); + if (!__instance._warpFlickerActivated && num < 10f) + { + __instance._warpFlickerActivated = true; + __instance._warpTime = Time.time + 0.5f; + GlobalMessenger.FireEvent(OWEvents.FlickerOffAndOn, 0.5f, 0.5f); + new WarpFlickerActivateMessage().Send(); + } + if (__instance._warpPlayerNextFrame) + { + __instance.WarpPlayerToCampfire(); + } + return false; + } } } diff --git a/QSB/Messaging/OWEvents.cs b/QSB/Messaging/OWEvents.cs index 10885c86..f398be38 100644 --- a/QSB/Messaging/OWEvents.cs +++ b/QSB/Messaging/OWEvents.cs @@ -29,5 +29,6 @@ public const string EnterShip = nameof(EnterShip); public const string ExitShip = nameof(ExitShip); public const string EyeStateChanged = nameof(EyeStateChanged); + public const string FlickerOffAndOn = nameof(FlickerOffAndOn); } } From 16ab6f01bf820538f15925bd7bc31f7a789c0f46 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Thu, 30 Dec 2021 21:12:10 -0800 Subject: [PATCH 12/47] flicker message --- .../EyeStateSync/Messages/FlickerMessage.cs | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 QSB/EyeOfTheUniverse/EyeStateSync/Messages/FlickerMessage.cs diff --git a/QSB/EyeOfTheUniverse/EyeStateSync/Messages/FlickerMessage.cs b/QSB/EyeOfTheUniverse/EyeStateSync/Messages/FlickerMessage.cs new file mode 100644 index 00000000..666a7c6f --- /dev/null +++ b/QSB/EyeOfTheUniverse/EyeStateSync/Messages/FlickerMessage.cs @@ -0,0 +1,84 @@ +using QSB.Messaging; +using QSB.Player.TransformSync; +using QSB.WorldSync; +using QuantumUNET.Transport; +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace QSB.EyeOfTheUniverse.EyeStateSync.Messages +{ + internal class FlickerMessage : QSBMessage + { + static FlickerMessage() => GlobalMessenger.AddListener(OWEvents.FlickerOffAndOn, Handler); + + private static void Handler(float offDuration, float onDuration) + { + if (PlayerTransformSync.LocalInstance) + { + new FlickerMessage(offDuration, onDuration).Send(); + } + } + + + private float _offDuration; + private float _onDuration; + + private FlickerMessage(float offDuration, float onDuration) + { + _offDuration = offDuration; + _onDuration = onDuration; + } + + public override void Serialize(QNetworkWriter writer) + { + base.Serialize(writer); + writer.Write(_offDuration); + writer.Write(_onDuration); + } + + public override void Deserialize(QNetworkReader reader) + { + base.Deserialize(reader); + _offDuration = reader.ReadSingle(); + _onDuration = reader.ReadSingle(); + } + + public override bool ShouldReceive => WorldObjectManager.AllObjectsReady; + + public override void OnReceiveRemote() + { + // manually fire callbacks + var eventTable = GlobalMessenger.eventTable; + lock (eventTable) + { + var eventData = eventTable[OWEvents.FlickerOffAndOn]; + if (eventData.isInvoking) + { + throw new InvalidOperationException("GlobalMessenger does not support recursive FireEvent calls to the same eventType."); + } + eventData.isInvoking = true; + eventData.temp.AddRange(eventData.callbacks); + foreach (var callback in eventData.temp) + { + // ignore callback for this message to prevent infinite loop + if (callback == Handler) + { + continue; + } + + try + { + callback(_offDuration, _onDuration); + } + catch (Exception exception) + { + Debug.LogException(exception); + } + } + eventData.temp.Clear(); + eventData.isInvoking = false; + } + } + } +} From 6791e3109d009bb868a993f53d4f7f6947e74ba3 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Thu, 30 Dec 2021 21:13:29 -0800 Subject: [PATCH 13/47] no need to do flicker on remote receive here anymore --- .../ForestOfGalaxies/Messages/WarpFlickerActivateMessage.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/QSB/EyeOfTheUniverse/ForestOfGalaxies/Messages/WarpFlickerActivateMessage.cs b/QSB/EyeOfTheUniverse/ForestOfGalaxies/Messages/WarpFlickerActivateMessage.cs index 32eedc37..59bc975a 100644 --- a/QSB/EyeOfTheUniverse/ForestOfGalaxies/Messages/WarpFlickerActivateMessage.cs +++ b/QSB/EyeOfTheUniverse/ForestOfGalaxies/Messages/WarpFlickerActivateMessage.cs @@ -22,7 +22,6 @@ namespace QSB.EyeOfTheUniverse.ForestOfGalaxies.Messages controller._warpFlickerActivated = true; controller._warpTime = Time.time + 0.5f; - GlobalMessenger.FireEvent(OWEvents.FlickerOffAndOn, 0.5f, 0.5f); } } } From 0e20b2115cd8dca15377d485a924570c896ea8cd Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Thu, 30 Dec 2021 21:14:22 -0800 Subject: [PATCH 14/47] debuglog --- QSB/EyeOfTheUniverse/EyeStateSync/Messages/FlickerMessage.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/QSB/EyeOfTheUniverse/EyeStateSync/Messages/FlickerMessage.cs b/QSB/EyeOfTheUniverse/EyeStateSync/Messages/FlickerMessage.cs index 666a7c6f..c98a0955 100644 --- a/QSB/EyeOfTheUniverse/EyeStateSync/Messages/FlickerMessage.cs +++ b/QSB/EyeOfTheUniverse/EyeStateSync/Messages/FlickerMessage.cs @@ -1,5 +1,6 @@ using QSB.Messaging; using QSB.Player.TransformSync; +using QSB.Utility; using QSB.WorldSync; using QuantumUNET.Transport; using System; @@ -28,6 +29,8 @@ namespace QSB.EyeOfTheUniverse.EyeStateSync.Messages { _offDuration = offDuration; _onDuration = onDuration; + + DebugLog.DebugWrite($"LOCAL flicker {offDuration} {onDuration}"); } public override void Serialize(QNetworkWriter writer) @@ -48,6 +51,8 @@ namespace QSB.EyeOfTheUniverse.EyeStateSync.Messages public override void OnReceiveRemote() { + DebugLog.DebugWrite($"REMOTE flicker from {From} {_offDuration} {_onDuration}"); + // manually fire callbacks var eventTable = GlobalMessenger.eventTable; lock (eventTable) From e8803ac6c8f7a6c5314cfbe87bf4d23400e36400 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Thu, 30 Dec 2021 21:17:59 -0800 Subject: [PATCH 15/47] bruh --- QSB/EyeOfTheUniverse/EyeStateSync/Messages/FlickerMessage.cs | 1 - .../ForestOfGalaxies/Messages/WarpFlickerActivateMessage.cs | 2 +- QSB/EyeOfTheUniverse/ForestOfGalaxies/Patches/ForestPatches.cs | 1 + 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/QSB/EyeOfTheUniverse/EyeStateSync/Messages/FlickerMessage.cs b/QSB/EyeOfTheUniverse/EyeStateSync/Messages/FlickerMessage.cs index c98a0955..f5db7418 100644 --- a/QSB/EyeOfTheUniverse/EyeStateSync/Messages/FlickerMessage.cs +++ b/QSB/EyeOfTheUniverse/EyeStateSync/Messages/FlickerMessage.cs @@ -4,7 +4,6 @@ using QSB.Utility; using QSB.WorldSync; using QuantumUNET.Transport; using System; -using System.Collections.Generic; using UnityEngine; namespace QSB.EyeOfTheUniverse.EyeStateSync.Messages diff --git a/QSB/EyeOfTheUniverse/ForestOfGalaxies/Messages/WarpFlickerActivateMessage.cs b/QSB/EyeOfTheUniverse/ForestOfGalaxies/Messages/WarpFlickerActivateMessage.cs index 59bc975a..73c4ff06 100644 --- a/QSB/EyeOfTheUniverse/ForestOfGalaxies/Messages/WarpFlickerActivateMessage.cs +++ b/QSB/EyeOfTheUniverse/ForestOfGalaxies/Messages/WarpFlickerActivateMessage.cs @@ -17,7 +17,7 @@ namespace QSB.EyeOfTheUniverse.ForestOfGalaxies.Messages public override void OnReceiveRemote() { - DebugLog.DebugWrite("REMOTE player clone flicker from {From"); + DebugLog.DebugWrite($"REMOTE player clone flicker from {From}"); var controller = QSBWorldSync.GetUnityObjects().First(); controller._warpFlickerActivated = true; diff --git a/QSB/EyeOfTheUniverse/ForestOfGalaxies/Patches/ForestPatches.cs b/QSB/EyeOfTheUniverse/ForestOfGalaxies/Patches/ForestPatches.cs index fa2e63fd..94a4e0f4 100644 --- a/QSB/EyeOfTheUniverse/ForestOfGalaxies/Patches/ForestPatches.cs +++ b/QSB/EyeOfTheUniverse/ForestOfGalaxies/Patches/ForestPatches.cs @@ -84,6 +84,7 @@ namespace QSB.EyeOfTheUniverse.ForestOfGalaxies.Patches return false; } + [HarmonyPrefix] [HarmonyPatch(typeof(PlayerCloneController), nameof(PlayerCloneController.FixedUpdate))] public static bool CloneFixedUpdate(PlayerCloneController __instance) From 2eda59044dd389cc13b2959e40f25ddea50e9277 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Fri, 31 Dec 2021 02:38:37 -0800 Subject: [PATCH 16/47] disable time sync when past certain eye state --- .../EyeStateSync/Messages/EyeStateMessage.cs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/QSB/EyeOfTheUniverse/EyeStateSync/Messages/EyeStateMessage.cs b/QSB/EyeOfTheUniverse/EyeStateSync/Messages/EyeStateMessage.cs index fd3506c8..d5179bba 100644 --- a/QSB/EyeOfTheUniverse/EyeStateSync/Messages/EyeStateMessage.cs +++ b/QSB/EyeOfTheUniverse/EyeStateSync/Messages/EyeStateMessage.cs @@ -1,7 +1,7 @@ -using QSB.Menus; -using QSB.Messaging; +using QSB.Messaging; using QSB.Player; using QSB.Player.TransformSync; +using QSB.TimeSync; using QSB.WorldSync; namespace QSB.EyeOfTheUniverse.EyeStateSync.Messages @@ -26,12 +26,22 @@ namespace QSB.EyeOfTheUniverse.EyeStateSync.Messages public override void OnReceiveLocal() { QSBPlayerManager.LocalPlayer.EyeState = Value; + + if (Value >= EyeState.ForestIsDark) + { + WakeUpSync.LocalInstance.enabled = false; + } } public override void OnReceiveRemote() { var player = QSBPlayerManager.GetPlayer(From); player.EyeState = Value; + + if (Value >= EyeState.ForestIsDark) + { + WakeUpSync.LocalInstance.enabled = false; + } } } } \ No newline at end of file From 4265b4a58f95824cbf067395b80a92c9977f9188 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Fri, 31 Dec 2021 02:52:31 -0800 Subject: [PATCH 17/47] set up stuff but dont actually implement it yet lol --- .../CosmicInflation/InflationManager.cs | 80 +++++++++++++++++++ .../Patches/InflationPatches.cs | 2 + .../VesselSync/VesselManager.cs | 2 + QSB/Player/EnterLeaveType.cs | 3 +- QSB/Player/Messages/EnterLeaveMessage.cs | 4 + 5 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs diff --git a/QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs b/QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs new file mode 100644 index 00000000..f7c591fb --- /dev/null +++ b/QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs @@ -0,0 +1,80 @@ +using QSB.Messaging; +using QSB.Player; +using QSB.Player.Messages; +using QSB.WorldSync; +using System.Collections.Generic; +using UnityEngine; + +namespace QSB.EyeOfTheUniverse.CosmicInflation +{ + internal class InflationManager : WorldObjectManager + { + public static InflationManager Instance { get; private set; } + + private readonly List _playersInFog = new(); + private CosmicInflationController _controller; + + public override WorldObjectType WorldObjectType => WorldObjectType.Eye; + + public override void Awake() + { + base.Awake(); + Instance = this; + + QSBPlayerManager.OnRemovePlayer += OnPlayerLeave; + } + + private void OnPlayerLeave(uint id) + { + _playersInFog.Remove(QSBPlayerManager.GetPlayer(id)); + + if (_playersInFog.Count == QSBPlayerManager.PlayerList.Count) + { + StartCollapse(); + } + } + + protected override void RebuildWorldObjects(OWScene scene) + { + _playersInFog.Clear(); + + if (_controller != null) + { + _controller._smokeSphereTrigger.OnEntry -= OnEntry; + } + + _controller = FindObjectOfType(); + _controller._smokeSphereTrigger.OnEntry += _controller.OnEnterFogSphere; + + _controller._smokeSphereTrigger.OnEntry += OnEntry; + } + + private void OnEntry(GameObject hitObj) + { + if (hitObj.CompareTag("PlayerCameraDetector") && _controller._state == CosmicInflationController.State.ReadyToCollapse) + { + _controller._smokeSphereTrigger.SetTriggerActivation(false); + _controller._probeDestroyTrigger.SetTriggerActivation(false); + new EnterLeaveMessage(EnterLeaveType.EnterCosmicFog).Send(); + + // the pausing and stuff happens here + } + } + + + public void Enter(PlayerInfo player) + { + _playersInFog.Add(player); + + if (_playersInFog.Count == QSBPlayerManager.PlayerList.Count) + { + StartCollapse(); + } + } + + private void StartCollapse() + { + // the actual collapsing happens here + } + } +} diff --git a/QSB/EyeOfTheUniverse/CosmicInflation/Patches/InflationPatches.cs b/QSB/EyeOfTheUniverse/CosmicInflation/Patches/InflationPatches.cs index defae678..6ff6e86f 100644 --- a/QSB/EyeOfTheUniverse/CosmicInflation/Patches/InflationPatches.cs +++ b/QSB/EyeOfTheUniverse/CosmicInflation/Patches/InflationPatches.cs @@ -14,6 +14,8 @@ namespace QSB.EyeOfTheUniverse.CosmicInflation.Patches [HarmonyPatch(typeof(CosmicInflationController), nameof(CosmicInflationController.OnEnterFogSphere))] public static bool OnEnterFogSphere(CosmicInflationController __instance, GameObject obj) { + return true; // remove this patch later lol + if (obj.CompareTag("PlayerCameraDetector") && __instance._state == CosmicInflationController.State.ReadyToCollapse) { __instance._smokeSphereTrigger.SetTriggerActivation(false); diff --git a/QSB/EyeOfTheUniverse/VesselSync/VesselManager.cs b/QSB/EyeOfTheUniverse/VesselSync/VesselManager.cs index 867a4990..5744d488 100644 --- a/QSB/EyeOfTheUniverse/VesselSync/VesselManager.cs +++ b/QSB/EyeOfTheUniverse/VesselSync/VesselManager.cs @@ -24,6 +24,8 @@ namespace QSB.EyeOfTheUniverse.VesselSync protected override void RebuildWorldObjects(OWScene scene) { + _playersInCage.Clear(); + if (_warpController != null) { _warpController._cageTrigger.OnEntry -= OnEntry; diff --git a/QSB/Player/EnterLeaveType.cs b/QSB/Player/EnterLeaveType.cs index eef74267..672dc875 100644 --- a/QSB/Player/EnterLeaveType.cs +++ b/QSB/Player/EnterLeaveType.cs @@ -15,6 +15,7 @@ EnterNomaiHeadZone = 10, ExitNomaiHeadZone = 11, EnterVesselCage = 12, - ExitVesselCage = 13 + ExitVesselCage = 13, + EnterCosmicFog = 14, } } diff --git a/QSB/Player/Messages/EnterLeaveMessage.cs b/QSB/Player/Messages/EnterLeaveMessage.cs index 4e7be642..827616cd 100644 --- a/QSB/Player/Messages/EnterLeaveMessage.cs +++ b/QSB/Player/Messages/EnterLeaveMessage.cs @@ -1,5 +1,6 @@ using OWML.Common; using QSB.Animation.NPC.WorldObjects; +using QSB.EyeOfTheUniverse.CosmicInflation; using QSB.EyeOfTheUniverse.VesselSync; using QSB.Messaging; using QSB.Player.TransformSync; @@ -103,6 +104,9 @@ namespace QSB.Player.Messages case EnterLeaveType.ExitVesselCage: VesselManager.Instance.Exit(player); break; + case EnterLeaveType.EnterCosmicFog: + InflationManager.Instance.Enter(player); + break; default: DebugLog.ToConsole($"Warning - Unknown EnterLeaveType : {Value}", MessageType.Warning); break; From 2a339daf544b7bb309cc6e54730de75aa71bc405 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Fri, 31 Dec 2021 02:52:31 -0800 Subject: [PATCH 18/47] oops --- .../CosmicInflation/InflationManager.cs | 84 +++++++++++++++++++ .../Patches/InflationPatches.cs | 2 + .../VesselSync/VesselManager.cs | 2 + QSB/Player/EnterLeaveType.cs | 3 +- QSB/Player/Messages/EnterLeaveMessage.cs | 4 + 5 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs diff --git a/QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs b/QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs new file mode 100644 index 00000000..4c687d4e --- /dev/null +++ b/QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs @@ -0,0 +1,84 @@ +using QSB.Messaging; +using QSB.Player; +using QSB.Player.Messages; +using QSB.WorldSync; +using System.Collections.Generic; +using UnityEngine; + +namespace QSB.EyeOfTheUniverse.CosmicInflation +{ + internal class InflationManager : WorldObjectManager + { + public static InflationManager Instance { get; private set; } + + private readonly List _playersInFog = new(); + private CosmicInflationController _controller; + + public override WorldObjectType WorldObjectType => WorldObjectType.Eye; + + public override void Awake() + { + base.Awake(); + Instance = this; + + QSBPlayerManager.OnRemovePlayer += OnPlayerLeave; + } + + private void OnPlayerLeave(uint id) + { + _playersInFog.Remove(QSBPlayerManager.GetPlayer(id)); + + // wait 1 frame since that's when player list will actually be updated + QSBCore.UnityEvents.FireOnNextUpdate(() => + { + if (_playersInFog.Count == QSBPlayerManager.PlayerList.Count) + { + StartCollapse(); + } + }); + } + + protected override void RebuildWorldObjects(OWScene scene) + { + _playersInFog.Clear(); + + if (_controller != null) + { + _controller._smokeSphereTrigger.OnEntry -= OnEntry; + } + + _controller = FindObjectOfType(); + _controller._smokeSphereTrigger.OnEntry += _controller.OnEnterFogSphere; + + _controller._smokeSphereTrigger.OnEntry += OnEntry; + } + + private void OnEntry(GameObject hitObj) + { + if (hitObj.CompareTag("PlayerCameraDetector") && _controller._state == CosmicInflationController.State.ReadyToCollapse) + { + _controller._smokeSphereTrigger.SetTriggerActivation(false); + _controller._probeDestroyTrigger.SetTriggerActivation(false); + new EnterLeaveMessage(EnterLeaveType.EnterCosmicFog).Send(); + + // the pausing and stuff happens here + } + } + + + public void Enter(PlayerInfo player) + { + _playersInFog.Add(player); + + if (_playersInFog.Count == QSBPlayerManager.PlayerList.Count) + { + StartCollapse(); + } + } + + private void StartCollapse() + { + // the actual collapsing happens here + } + } +} diff --git a/QSB/EyeOfTheUniverse/CosmicInflation/Patches/InflationPatches.cs b/QSB/EyeOfTheUniverse/CosmicInflation/Patches/InflationPatches.cs index defae678..6ff6e86f 100644 --- a/QSB/EyeOfTheUniverse/CosmicInflation/Patches/InflationPatches.cs +++ b/QSB/EyeOfTheUniverse/CosmicInflation/Patches/InflationPatches.cs @@ -14,6 +14,8 @@ namespace QSB.EyeOfTheUniverse.CosmicInflation.Patches [HarmonyPatch(typeof(CosmicInflationController), nameof(CosmicInflationController.OnEnterFogSphere))] public static bool OnEnterFogSphere(CosmicInflationController __instance, GameObject obj) { + return true; // remove this patch later lol + if (obj.CompareTag("PlayerCameraDetector") && __instance._state == CosmicInflationController.State.ReadyToCollapse) { __instance._smokeSphereTrigger.SetTriggerActivation(false); diff --git a/QSB/EyeOfTheUniverse/VesselSync/VesselManager.cs b/QSB/EyeOfTheUniverse/VesselSync/VesselManager.cs index 867a4990..5744d488 100644 --- a/QSB/EyeOfTheUniverse/VesselSync/VesselManager.cs +++ b/QSB/EyeOfTheUniverse/VesselSync/VesselManager.cs @@ -24,6 +24,8 @@ namespace QSB.EyeOfTheUniverse.VesselSync protected override void RebuildWorldObjects(OWScene scene) { + _playersInCage.Clear(); + if (_warpController != null) { _warpController._cageTrigger.OnEntry -= OnEntry; diff --git a/QSB/Player/EnterLeaveType.cs b/QSB/Player/EnterLeaveType.cs index eef74267..672dc875 100644 --- a/QSB/Player/EnterLeaveType.cs +++ b/QSB/Player/EnterLeaveType.cs @@ -15,6 +15,7 @@ EnterNomaiHeadZone = 10, ExitNomaiHeadZone = 11, EnterVesselCage = 12, - ExitVesselCage = 13 + ExitVesselCage = 13, + EnterCosmicFog = 14, } } diff --git a/QSB/Player/Messages/EnterLeaveMessage.cs b/QSB/Player/Messages/EnterLeaveMessage.cs index 4e7be642..827616cd 100644 --- a/QSB/Player/Messages/EnterLeaveMessage.cs +++ b/QSB/Player/Messages/EnterLeaveMessage.cs @@ -1,5 +1,6 @@ using OWML.Common; using QSB.Animation.NPC.WorldObjects; +using QSB.EyeOfTheUniverse.CosmicInflation; using QSB.EyeOfTheUniverse.VesselSync; using QSB.Messaging; using QSB.Player.TransformSync; @@ -103,6 +104,9 @@ namespace QSB.Player.Messages case EnterLeaveType.ExitVesselCage: VesselManager.Instance.Exit(player); break; + case EnterLeaveType.EnterCosmicFog: + InflationManager.Instance.Enter(player); + break; default: DebugLog.ToConsole($"Warning - Unknown EnterLeaveType : {Value}", MessageType.Warning); break; From ed2d1f1683eed9135b2abebe8026d7e890cf7dde Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Fri, 31 Dec 2021 11:06:16 +0000 Subject: [PATCH 19/47] Update PlayerDeathMessage.cs --- QSB/DeathSync/Messages/PlayerDeathMessage.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/QSB/DeathSync/Messages/PlayerDeathMessage.cs b/QSB/DeathSync/Messages/PlayerDeathMessage.cs index 9ac8c673..61b5d765 100644 --- a/QSB/DeathSync/Messages/PlayerDeathMessage.cs +++ b/QSB/DeathSync/Messages/PlayerDeathMessage.cs @@ -11,7 +11,11 @@ namespace QSB.DeathSync.Messages { private int NecronomiconIndex; - public PlayerDeathMessage(DeathType type) => NecronomiconIndex = Necronomicon.GetRandomIndex(type); + public PlayerDeathMessage(DeathType type) + { + Value = type; + NecronomiconIndex = Necronomicon.GetRandomIndex(type); + } public override void Serialize(QNetworkWriter writer) { From 1e4867379f6df574cacdcfbf82ee81d8db1e4156 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Fri, 31 Dec 2021 21:26:06 +0000 Subject: [PATCH 20/47] yes --- QSB/Player/PlayerInfo.cs | 1 + QSB/Player/QSBPlayerManager.cs | 21 ++----------------- .../TransformSync/PlayerTransformSync.cs | 7 +++---- QSB/RespawnSync/RespawnManager.cs | 4 ++-- 4 files changed, 8 insertions(+), 25 deletions(-) diff --git a/QSB/Player/PlayerInfo.cs b/QSB/Player/PlayerInfo.cs index 571cd1c4..ad9e902c 100644 --- a/QSB/Player/PlayerInfo.cs +++ b/QSB/Player/PlayerInfo.cs @@ -35,6 +35,7 @@ namespace QSB.Player public bool IsInShrine { get; set; } public IQSBQuantumObject EntangledObject { get; set; } public QSBPlayerAudioController AudioController { get; set; } + public DitheringAnimator DitheringAnimator { get; set; } // Body Objects public OWCamera Camera diff --git a/QSB/Player/QSBPlayerManager.cs b/QSB/Player/QSBPlayerManager.cs index e9c637d1..964202cd 100644 --- a/QSB/Player/QSBPlayerManager.cs +++ b/QSB/Player/QSBPlayerManager.cs @@ -114,27 +114,10 @@ namespace QSB.Player => new(Locator.GetFlashlight(), PlayerList.Where(x => x.FlashLight != null).Select(x => x.FlashLight)); public static void ShowAllPlayers() - => PlayerList.Where(x => x != LocalPlayer).ToList().ForEach(x => ChangePlayerVisibility(x.PlayerId, true)); + => PlayerList.Where(x => x != LocalPlayer).ToList().ForEach(x => x.DitheringAnimator.SetVisible(true, 0.5f)); public static void HideAllPlayers() - => PlayerList.Where(x => x != LocalPlayer).ToList().ForEach(x => ChangePlayerVisibility(x.PlayerId, false)); - - public static void ChangePlayerVisibility(uint playerId, bool visible) - { - var player = GetPlayer(playerId); - player.Visible = visible; - - if (player.Body == null) - { - DebugLog.ToConsole($"Warning - Player {playerId} has a null player model!", MessageType.Warning); - return; - } - - foreach (var renderer in player.Body.GetComponentsInChildren()) - { - renderer.enabled = visible; - } - } + => PlayerList.Where(x => x != LocalPlayer).ToList().ForEach(x => x.DitheringAnimator.SetVisible(true, 0.5f)); public static PlayerInfo GetClosestPlayerToWorldPoint(Vector3 worldPoint, bool includeLocalPlayer) => includeLocalPlayer ? GetClosestPlayerToWorldPoint(PlayerList, worldPoint) diff --git a/QSB/Player/TransformSync/PlayerTransformSync.cs b/QSB/Player/TransformSync/PlayerTransformSync.cs index ce7b0389..e7e8981b 100644 --- a/QSB/Player/TransformSync/PlayerTransformSync.cs +++ b/QSB/Player/TransformSync/PlayerTransformSync.cs @@ -11,6 +11,7 @@ using QSB.Utility; using QSB.WorldSync; using System.Linq; using UnityEngine; +using UnityEngine.PostProcessing; namespace QSB.Player.TransformSync { @@ -167,11 +168,9 @@ namespace QSB.Player.TransformSync GetComponent().InitRemote(REMOTE_Traveller_HEA_Player_v2); GetComponent().InitRemote(REMOTE_Player_Body.transform); - var marker = REMOTE_Player_Body.AddComponent(); - marker.Init(Player); - + REMOTE_Player_Body.AddComponent().Init(Player); REMOTE_Player_Body.AddComponent().PlayerName = Player.Name; - + Player.DitheringAnimator = REMOTE_Player_Body.AddComponent(); Player.AudioController = PlayerAudioManager.InitRemote(REMOTE_Player_Body.transform); /* diff --git a/QSB/RespawnSync/RespawnManager.cs b/QSB/RespawnSync/RespawnManager.cs index c3aa0177..43bfc644 100644 --- a/QSB/RespawnSync/RespawnManager.cs +++ b/QSB/RespawnSync/RespawnManager.cs @@ -153,7 +153,7 @@ namespace QSB.RespawnSync return; } - QSBPlayerManager.ChangePlayerVisibility(player.PlayerId, false); + player.DitheringAnimator.SetVisible(false, 0.5f); } public void OnPlayerRespawn(PlayerInfo player) @@ -169,7 +169,7 @@ namespace QSB.RespawnSync _playersPendingRespawn.Remove(player); UpdateRespawnNotification(); - QSBPlayerManager.ChangePlayerVisibility(player.PlayerId, true); + player.DitheringAnimator.SetVisible(true, 0.5f); } public void RespawnSomePlayer() From a0fc1ee1a82b7ff91dc8cdc5ec685e7ed1bc0f05 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Fri, 31 Dec 2021 22:07:14 +0000 Subject: [PATCH 21/47] adjust timings --- QSB/RespawnSync/RespawnManager.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/QSB/RespawnSync/RespawnManager.cs b/QSB/RespawnSync/RespawnManager.cs index 43bfc644..babef7cb 100644 --- a/QSB/RespawnSync/RespawnManager.cs +++ b/QSB/RespawnSync/RespawnManager.cs @@ -153,7 +153,7 @@ namespace QSB.RespawnSync return; } - player.DitheringAnimator.SetVisible(false, 0.5f); + player.DitheringAnimator.SetVisible(false, 1); } public void OnPlayerRespawn(PlayerInfo player) @@ -169,7 +169,7 @@ namespace QSB.RespawnSync _playersPendingRespawn.Remove(player); UpdateRespawnNotification(); - player.DitheringAnimator.SetVisible(true, 0.5f); + player.DitheringAnimator.SetVisible(true, 1); } public void RespawnSomePlayer() From 4330f75583c5e641622bf9fa7018d2a0afe7827e Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Sat, 1 Jan 2022 00:38:17 +0000 Subject: [PATCH 22/47] tools --- QSB/Player/QSBPlayerManager.cs | 4 +- QSB/RespawnSync/RespawnManager.cs | 18 ++++++- QSB/Tools/QSBTool.cs | 54 ++++++++++++++++++- .../TranslatorTool/QSBNomaiTranslator.cs | 13 ++++- 4 files changed, 82 insertions(+), 7 deletions(-) diff --git a/QSB/Player/QSBPlayerManager.cs b/QSB/Player/QSBPlayerManager.cs index 964202cd..a5c7cb03 100644 --- a/QSB/Player/QSBPlayerManager.cs +++ b/QSB/Player/QSBPlayerManager.cs @@ -114,10 +114,10 @@ namespace QSB.Player => new(Locator.GetFlashlight(), PlayerList.Where(x => x.FlashLight != null).Select(x => x.FlashLight)); public static void ShowAllPlayers() - => PlayerList.Where(x => x != LocalPlayer).ToList().ForEach(x => x.DitheringAnimator.SetVisible(true, 0.5f)); + => PlayerList.Where(x => x != LocalPlayer && x.DitheringAnimator != null).ToList().ForEach(x => x.DitheringAnimator.SetVisible(true, 0.5f)); public static void HideAllPlayers() - => PlayerList.Where(x => x != LocalPlayer).ToList().ForEach(x => x.DitheringAnimator.SetVisible(true, 0.5f)); + => PlayerList.Where(x => x != LocalPlayer && x.DitheringAnimator != null).ToList().ForEach(x => x.DitheringAnimator.SetVisible(true, 0.5f)); public static PlayerInfo GetClosestPlayerToWorldPoint(Vector3 worldPoint, bool includeLocalPlayer) => includeLocalPlayer ? GetClosestPlayerToWorldPoint(PlayerList, worldPoint) diff --git a/QSB/RespawnSync/RespawnManager.cs b/QSB/RespawnSync/RespawnManager.cs index babef7cb..8e81eb38 100644 --- a/QSB/RespawnSync/RespawnManager.cs +++ b/QSB/RespawnSync/RespawnManager.cs @@ -153,7 +153,14 @@ namespace QSB.RespawnSync return; } - player.DitheringAnimator.SetVisible(false, 1); + if (player.DitheringAnimator != null) + { + player.DitheringAnimator.SetVisible(false, 1); + } + else + { + DebugLog.ToConsole($"Warning - {player.PlayerId}.DitheringAnimator is null!", OWML.Common.MessageType.Warning); + } } public void OnPlayerRespawn(PlayerInfo player) @@ -169,7 +176,14 @@ namespace QSB.RespawnSync _playersPendingRespawn.Remove(player); UpdateRespawnNotification(); - player.DitheringAnimator.SetVisible(true, 1); + if (player.DitheringAnimator != null) + { + player.DitheringAnimator.SetVisible(true, 1); + } + else + { + DebugLog.ToConsole($"Warning - {player.PlayerId}.DitheringAnimator is null!", OWML.Common.MessageType.Warning); + } } public void RespawnSomePlayer() diff --git a/QSB/Tools/QSBTool.cs b/QSB/Tools/QSBTool.cs index c9ae35fc..74ee270a 100644 --- a/QSB/Tools/QSBTool.cs +++ b/QSB/Tools/QSBTool.cs @@ -1,4 +1,5 @@ using QSB.Player; +using QSB.Utility; using UnityEngine; namespace QSB.Tools @@ -7,7 +8,20 @@ namespace QSB.Tools { public PlayerInfo Player { get; set; } public ToolType Type { get; set; } - public GameObject ToolGameObject { get; set; } + public GameObject ToolGameObject + { + get => _toolGameObject; + + set + { + _toolGameObject = value; + QSBCore.UnityEvents.FireInNUpdates( + () => DitheringAnimator = _toolGameObject.AddComponent(), + 5); + } + } + private GameObject _toolGameObject; + public DitheringAnimator DitheringAnimator { get; set; } public DampedSpringQuat MoveSpring { @@ -33,8 +47,23 @@ namespace QSB.Tools set => _arrivalDegrees = value; } + protected bool _isDitheringOut; + + public override void Start() + { + base.Start(); + ToolGameObject?.SetActive(false); + } + public virtual void OnEnable() => ToolGameObject?.SetActive(true); - public virtual void OnDisable() => ToolGameObject?.SetActive(false); + + public virtual void OnDisable() + { + if (!_isDitheringOut) + { + ToolGameObject?.SetActive(false); + } + } public void ChangeEquipState(bool equipState) { @@ -50,13 +79,34 @@ namespace QSB.Tools public override void EquipTool() { base.EquipTool(); + + if (DitheringAnimator != null && DitheringAnimator._renderers != null) + { + ToolGameObject?.SetActive(true); + DitheringAnimator.SetVisible(true, 5f); + } + Player.AudioController.PlayEquipTool(); } public override void UnequipTool() { base.UnequipTool(); + + if (DitheringAnimator != null && DitheringAnimator._renderers != null) + { + _isDitheringOut = true; + DitheringAnimator.SetVisible(false, 5f); + QSBCore.UnityEvents.RunWhen(() => DitheringAnimator._visibleFraction == 0, FinishDitherOut); + } + Player.AudioController.PlayUnequipTool(); } + + public virtual void FinishDitherOut() + { + ToolGameObject?.SetActive(false); + _isDitheringOut = false; + } } } \ No newline at end of file diff --git a/QSB/Tools/TranslatorTool/QSBNomaiTranslator.cs b/QSB/Tools/TranslatorTool/QSBNomaiTranslator.cs index 1578e485..dd0b6506 100644 --- a/QSB/Tools/TranslatorTool/QSBNomaiTranslator.cs +++ b/QSB/Tools/TranslatorTool/QSBNomaiTranslator.cs @@ -25,7 +25,12 @@ namespace QSB.Tools.TranslatorTool } public override void OnDisable() - => _translatorProp.OnFinishUnequipAnimation(); + { + if (!_isDitheringOut) + { + _translatorProp.OnFinishUnequipAnimation(); + } + } public override void EquipTool() { @@ -39,6 +44,12 @@ namespace QSB.Tools.TranslatorTool _translatorProp.OnUnequipTool(); } + public override void FinishDitherOut() + { + base.FinishDitherOut(); + _translatorProp.OnFinishUnequipAnimation(); + } + public override void Update() { base.Update(); From 21a7bd4d978b9bc930d134a2155aa924991bb3d9 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Sat, 1 Jan 2022 00:40:31 +0000 Subject: [PATCH 23/47] cleanup --- QSB/Player/TransformSync/PlayerTransformSync.cs | 1 - QSB/Tools/QSBTool.cs | 1 - 2 files changed, 2 deletions(-) diff --git a/QSB/Player/TransformSync/PlayerTransformSync.cs b/QSB/Player/TransformSync/PlayerTransformSync.cs index e7e8981b..777df03a 100644 --- a/QSB/Player/TransformSync/PlayerTransformSync.cs +++ b/QSB/Player/TransformSync/PlayerTransformSync.cs @@ -11,7 +11,6 @@ using QSB.Utility; using QSB.WorldSync; using System.Linq; using UnityEngine; -using UnityEngine.PostProcessing; namespace QSB.Player.TransformSync { diff --git a/QSB/Tools/QSBTool.cs b/QSB/Tools/QSBTool.cs index 74ee270a..59d97a21 100644 --- a/QSB/Tools/QSBTool.cs +++ b/QSB/Tools/QSBTool.cs @@ -1,5 +1,4 @@ using QSB.Player; -using QSB.Utility; using UnityEngine; namespace QSB.Tools From 21836522ba02f47760f5b37fb8339d28c4b6689a Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Fri, 31 Dec 2021 17:10:41 -0800 Subject: [PATCH 24/47] message test --- QSBTests/MessageTests.cs | 85 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 QSBTests/MessageTests.cs diff --git a/QSBTests/MessageTests.cs b/QSBTests/MessageTests.cs new file mode 100644 index 00000000..eed28a71 --- /dev/null +++ b/QSBTests/MessageTests.cs @@ -0,0 +1,85 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Mono.Cecil; +using Mono.Cecil.Cil; +using Mono.Cecil.Rocks; +using QSB.Messaging; +using QSB.Utility; +using System.Linq; +using System.Reflection; + +namespace QSBTests +{ + [TestClass] + public class MessageTests + { + [TestMethod] + public void TestMessages() + { + var module = ModuleDefinition.ReadModule("QSB.dll"); + var messageTypes = typeof(QSBMessage).GetDerivedTypes(); + + var fromField = module.ImportReference(typeof(QSBMessage).GetField("From", Util.Flags)); + var toField = module.ImportReference(typeof(QSBMessage).GetField("To", Util.Flags)); + var objectIdField = module.ImportReference(typeof(QSBWorldObjectMessage<>).GetField("ObjectId", Util.Flags)); + + foreach (var type in messageTypes) + { + var fields = type.GetFields(Util.Flags) + .Select(x => module.ImportReference(x)); + + var constructor = module.ImportReference(type.GetConstructors(Util.Flags).Single()).Resolve(); + var serialize = module.ImportReference(type.GetMethod("Serialize", Util.Flags)).Resolve(); + var deserialize = module.ImportReference(type.GetMethod("Deserialize", Util.Flags)).Resolve(); + + foreach (var field in fields) + { + if (!field.Eq(fromField) && !field.Eq(toField) && !field.Eq(objectIdField)) + constructor.CheckUses(field, Util.UseType.Store); + serialize.CheckUses(field, Util.UseType.Load); + deserialize.CheckUses(field, Util.UseType.Store); + } + } + } + } + + internal static class Util + { + public const BindingFlags Flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; + + public static bool Eq(this MemberReference a, MemberReference b) => + a.DeclaringType.Namespace == b.DeclaringType.Namespace && + a.DeclaringType.Name == b.DeclaringType.Name && + a.Name == b.Name; + + public enum UseType { Store, Load } + + public static void CheckUses(this MethodDefinition method, FieldReference field, UseType useType) + { + var opCode = useType switch + { + UseType.Store => OpCodes.Stfld, + UseType.Load => OpCodes.Ldfld, + }; + + while (true) + { + var stored = method.Body.Instructions.Any(x => + x.OpCode == opCode && + field.Eq((FieldReference)x.Operand) + ); + if (stored) return; + + var baseMethod = method.GetBaseMethod(); + if (baseMethod.Eq(method)) break; + var callsBase = method.Body.Instructions.Any(x => + x.OpCode == OpCodes.Call && + baseMethod.Eq((MethodReference)x.Operand) + ); + if (!callsBase) break; + method = baseMethod; + } + + Assert.Fail($"{method} does not {useType} {field}"); + } + } +} From 65503c1a46a78acb641a4fff09cb6432367c4a63 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Fri, 31 Dec 2021 18:54:32 -0800 Subject: [PATCH 25/47] braces --- QSBTests/MessageTests.cs | 44 +++++++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/QSBTests/MessageTests.cs b/QSBTests/MessageTests.cs index eed28a71..f7c36a49 100644 --- a/QSBTests/MessageTests.cs +++ b/QSBTests/MessageTests.cs @@ -34,7 +34,9 @@ namespace QSBTests foreach (var field in fields) { if (!field.Eq(fromField) && !field.Eq(toField) && !field.Eq(objectIdField)) + { constructor.CheckUses(field, Util.UseType.Store); + } serialize.CheckUses(field, Util.UseType.Load); deserialize.CheckUses(field, Util.UseType.Store); } @@ -51,7 +53,19 @@ namespace QSBTests a.DeclaringType.Name == b.DeclaringType.Name && a.Name == b.Name; - public enum UseType { Store, Load } + public static bool IsOp(this Instruction instruction, OpCode opCode, out T operand) + { + if (instruction.OpCode == opCode) + { + operand = (T)instruction.Operand; + return true; + } + + operand = default; + return false; + } + + public enum UseType { Store, Load }; public static void CheckUses(this MethodDefinition method, FieldReference field, UseType useType) { @@ -63,19 +77,29 @@ namespace QSBTests while (true) { - var stored = method.Body.Instructions.Any(x => - x.OpCode == opCode && - field.Eq((FieldReference)x.Operand) + var il = method.Body.Instructions; + var uses = il.Any(x => + x.IsOp(opCode, out FieldReference f) && + f.Eq(field) ); - if (stored) return; + if (uses) + { + return; + } var baseMethod = method.GetBaseMethod(); - if (baseMethod.Eq(method)) break; - var callsBase = method.Body.Instructions.Any(x => - x.OpCode == OpCodes.Call && - baseMethod.Eq((MethodReference)x.Operand) + if (baseMethod.Eq(method)) + { + break; + } + var callBase = il.Any(x => + x.IsOp(OpCodes.Call, out MethodReference m) && + m.Eq(baseMethod) ); - if (!callsBase) break; + if (!callBase) + { + break; + } method = baseMethod; } From 8eea5167076deab8d27558ccf47f2b783ec25d87 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Fri, 31 Dec 2021 23:54:36 -0800 Subject: [PATCH 26/47] le bug, and cleanup --- .../CosmicInflation/InflationManager.cs | 16 ++++++++-------- QSB/Player/QSBPlayerManager.cs | 6 ++++++ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs b/QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs index 4c687d4e..4d4b3c9f 100644 --- a/QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs +++ b/QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs @@ -1,6 +1,7 @@ using QSB.Messaging; using QSB.Player; using QSB.Player.Messages; +using QSB.Utility; using QSB.WorldSync; using System.Collections.Generic; using UnityEngine; @@ -28,14 +29,11 @@ namespace QSB.EyeOfTheUniverse.CosmicInflation { _playersInFog.Remove(QSBPlayerManager.GetPlayer(id)); - // wait 1 frame since that's when player list will actually be updated - QSBCore.UnityEvents.FireOnNextUpdate(() => + // count - 1 because this happens right before player is actually removed + if (_playersInFog.Count == QSBPlayerManager.PlayerList.Count - 1) { - if (_playersInFog.Count == QSBPlayerManager.PlayerList.Count) - { - StartCollapse(); - } - }); + StartCollapse(); + } } protected override void RebuildWorldObjects(OWScene scene) @@ -48,7 +46,7 @@ namespace QSB.EyeOfTheUniverse.CosmicInflation } _controller = FindObjectOfType(); - _controller._smokeSphereTrigger.OnEntry += _controller.OnEnterFogSphere; + _controller._smokeSphereTrigger.OnEntry -= _controller.OnEnterFogSphere; _controller._smokeSphereTrigger.OnEntry += OnEntry; } @@ -62,6 +60,7 @@ namespace QSB.EyeOfTheUniverse.CosmicInflation new EnterLeaveMessage(EnterLeaveType.EnterCosmicFog).Send(); // the pausing and stuff happens here + DebugLog.DebugWrite("TODO: pause and wait for other players to enter"); } } @@ -79,6 +78,7 @@ namespace QSB.EyeOfTheUniverse.CosmicInflation private void StartCollapse() { // the actual collapsing happens here + DebugLog.DebugWrite("TODO: fog sphere collapse"); } } } diff --git a/QSB/Player/QSBPlayerManager.cs b/QSB/Player/QSBPlayerManager.cs index a5c7cb03..7d64a539 100644 --- a/QSB/Player/QSBPlayerManager.cs +++ b/QSB/Player/QSBPlayerManager.cs @@ -34,7 +34,13 @@ namespace QSB.Player } } + /// + /// called right before player is removed + /// public static Action OnRemovePlayer; + /// + /// called right after player is added + /// public static Action OnAddPlayer; public static PlayerInfo LocalPlayer => GetPlayer(LocalPlayerId); From 1886961b83859ff8b410284b0525b4f4fe5ad0c1 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Fri, 31 Dec 2021 23:59:27 -0800 Subject: [PATCH 27/47] remove debug logs --- .../Messages/EnterFogSphereMessage.cs | 27 ------------------- .../Patches/InflationPatches.cs | 23 +--------------- .../EyeStateSync/Messages/FlickerMessage.cs | 4 --- ...ivateMessage.cs => EyeCloneSeenMessage.cs} | 7 +---- .../ForestOfGalaxies/Patches/ForestPatches.cs | 2 +- .../EyeProxyMoonStateChangeMessage.cs | 1 - 6 files changed, 3 insertions(+), 61 deletions(-) delete mode 100644 QSB/EyeOfTheUniverse/CosmicInflation/Messages/EnterFogSphereMessage.cs rename QSB/EyeOfTheUniverse/ForestOfGalaxies/Messages/{WarpFlickerActivateMessage.cs => EyeCloneSeenMessage.cs} (67%) diff --git a/QSB/EyeOfTheUniverse/CosmicInflation/Messages/EnterFogSphereMessage.cs b/QSB/EyeOfTheUniverse/CosmicInflation/Messages/EnterFogSphereMessage.cs deleted file mode 100644 index 587b714a..00000000 --- a/QSB/EyeOfTheUniverse/CosmicInflation/Messages/EnterFogSphereMessage.cs +++ /dev/null @@ -1,27 +0,0 @@ -using QSB.Messaging; -using QSB.Utility; -using QSB.WorldSync; -using System.Linq; - -namespace QSB.EyeOfTheUniverse.CosmicInflation.Messages -{ - public class EnterFogSphereMessage : QSBMessage - { - public EnterFogSphereMessage() - { - DebugLog.DebugWrite("LOCAL enter fog sphere"); - } - - public override bool ShouldReceive => WorldObjectManager.AllObjectsReady; - - public override void OnReceiveRemote() - { - DebugLog.DebugWrite($"REMOTE enter fog sphere from {From}"); - var controller = QSBWorldSync.GetUnityObjects().First(); - - controller._smokeSphereTrigger.SetTriggerActivation(false); - controller._probeDestroyTrigger.SetTriggerActivation(false); - controller.StartCollapse(); - } - } -} diff --git a/QSB/EyeOfTheUniverse/CosmicInflation/Patches/InflationPatches.cs b/QSB/EyeOfTheUniverse/CosmicInflation/Patches/InflationPatches.cs index 6ff6e86f..1d561d09 100644 --- a/QSB/EyeOfTheUniverse/CosmicInflation/Patches/InflationPatches.cs +++ b/QSB/EyeOfTheUniverse/CosmicInflation/Patches/InflationPatches.cs @@ -1,30 +1,9 @@ -using HarmonyLib; -using QSB.EyeOfTheUniverse.CosmicInflation.Messages; -using QSB.Messaging; -using QSB.Patches; -using UnityEngine; +using QSB.Patches; namespace QSB.EyeOfTheUniverse.CosmicInflation.Patches { internal class InflationPatches : QSBPatch { public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect; - - [HarmonyPrefix] - [HarmonyPatch(typeof(CosmicInflationController), nameof(CosmicInflationController.OnEnterFogSphere))] - public static bool OnEnterFogSphere(CosmicInflationController __instance, GameObject obj) - { - return true; // remove this patch later lol - - if (obj.CompareTag("PlayerCameraDetector") && __instance._state == CosmicInflationController.State.ReadyToCollapse) - { - __instance._smokeSphereTrigger.SetTriggerActivation(false); - __instance._probeDestroyTrigger.SetTriggerActivation(false); - __instance.StartCollapse(); - new EnterFogSphereMessage().Send(); - } - - return false; - } } } diff --git a/QSB/EyeOfTheUniverse/EyeStateSync/Messages/FlickerMessage.cs b/QSB/EyeOfTheUniverse/EyeStateSync/Messages/FlickerMessage.cs index f5db7418..e217a5b5 100644 --- a/QSB/EyeOfTheUniverse/EyeStateSync/Messages/FlickerMessage.cs +++ b/QSB/EyeOfTheUniverse/EyeStateSync/Messages/FlickerMessage.cs @@ -28,8 +28,6 @@ namespace QSB.EyeOfTheUniverse.EyeStateSync.Messages { _offDuration = offDuration; _onDuration = onDuration; - - DebugLog.DebugWrite($"LOCAL flicker {offDuration} {onDuration}"); } public override void Serialize(QNetworkWriter writer) @@ -50,8 +48,6 @@ namespace QSB.EyeOfTheUniverse.EyeStateSync.Messages public override void OnReceiveRemote() { - DebugLog.DebugWrite($"REMOTE flicker from {From} {_offDuration} {_onDuration}"); - // manually fire callbacks var eventTable = GlobalMessenger.eventTable; lock (eventTable) diff --git a/QSB/EyeOfTheUniverse/ForestOfGalaxies/Messages/WarpFlickerActivateMessage.cs b/QSB/EyeOfTheUniverse/ForestOfGalaxies/Messages/EyeCloneSeenMessage.cs similarity index 67% rename from QSB/EyeOfTheUniverse/ForestOfGalaxies/Messages/WarpFlickerActivateMessage.cs rename to QSB/EyeOfTheUniverse/ForestOfGalaxies/Messages/EyeCloneSeenMessage.cs index 73c4ff06..53125d83 100644 --- a/QSB/EyeOfTheUniverse/ForestOfGalaxies/Messages/WarpFlickerActivateMessage.cs +++ b/QSB/EyeOfTheUniverse/ForestOfGalaxies/Messages/EyeCloneSeenMessage.cs @@ -6,18 +6,13 @@ using UnityEngine; namespace QSB.EyeOfTheUniverse.ForestOfGalaxies.Messages { - internal class WarpFlickerActivateMessage : QSBMessage + internal class EyeCloneSeenMessage : QSBMessage { - public WarpFlickerActivateMessage() - { - DebugLog.DebugWrite("LOCAL player clone flicker"); - } public override bool ShouldReceive => WorldObjectManager.AllObjectsReady; public override void OnReceiveRemote() { - DebugLog.DebugWrite($"REMOTE player clone flicker from {From}"); var controller = QSBWorldSync.GetUnityObjects().First(); controller._warpFlickerActivated = true; diff --git a/QSB/EyeOfTheUniverse/ForestOfGalaxies/Patches/ForestPatches.cs b/QSB/EyeOfTheUniverse/ForestOfGalaxies/Patches/ForestPatches.cs index 94a4e0f4..37a1c177 100644 --- a/QSB/EyeOfTheUniverse/ForestOfGalaxies/Patches/ForestPatches.cs +++ b/QSB/EyeOfTheUniverse/ForestOfGalaxies/Patches/ForestPatches.cs @@ -105,7 +105,7 @@ namespace QSB.EyeOfTheUniverse.ForestOfGalaxies.Patches __instance._warpFlickerActivated = true; __instance._warpTime = Time.time + 0.5f; GlobalMessenger.FireEvent(OWEvents.FlickerOffAndOn, 0.5f, 0.5f); - new WarpFlickerActivateMessage().Send(); + new EyeCloneSeenMessage().Send(); } if (__instance._warpPlayerNextFrame) { diff --git a/QSB/QuantumSync/Messages/EyeProxyMoonStateChangeMessage.cs b/QSB/QuantumSync/Messages/EyeProxyMoonStateChangeMessage.cs index 033c1c38..6f29c7db 100644 --- a/QSB/QuantumSync/Messages/EyeProxyMoonStateChangeMessage.cs +++ b/QSB/QuantumSync/Messages/EyeProxyMoonStateChangeMessage.cs @@ -33,7 +33,6 @@ namespace QSB.QuantumSync.Messages public override void OnReceiveRemote() { - DebugLog.DebugWrite($"Get moon state active:{Active} angle:{Angle}"); WorldObject.AttachedObject._moonStateRoot.SetActive(Active); if (Angle != -1f) { From 91e16a2c6849cf029aa5f54e09c2aad3c47f2a9d Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Sat, 1 Jan 2022 00:02:09 -0800 Subject: [PATCH 28/47] use GetUnityObjects --- QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs | 3 ++- QSB/EyeOfTheUniverse/VesselSync/VesselManager.cs | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs b/QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs index 4d4b3c9f..c463c951 100644 --- a/QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs +++ b/QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs @@ -4,6 +4,7 @@ using QSB.Player.Messages; using QSB.Utility; using QSB.WorldSync; using System.Collections.Generic; +using System.Linq; using UnityEngine; namespace QSB.EyeOfTheUniverse.CosmicInflation @@ -45,7 +46,7 @@ namespace QSB.EyeOfTheUniverse.CosmicInflation _controller._smokeSphereTrigger.OnEntry -= OnEntry; } - _controller = FindObjectOfType(); + _controller = QSBWorldSync.GetUnityObjects().First(); _controller._smokeSphereTrigger.OnEntry -= _controller.OnEnterFogSphere; _controller._smokeSphereTrigger.OnEntry += OnEntry; diff --git a/QSB/EyeOfTheUniverse/VesselSync/VesselManager.cs b/QSB/EyeOfTheUniverse/VesselSync/VesselManager.cs index 5744d488..a94283c5 100644 --- a/QSB/EyeOfTheUniverse/VesselSync/VesselManager.cs +++ b/QSB/EyeOfTheUniverse/VesselSync/VesselManager.cs @@ -3,6 +3,7 @@ using QSB.Player; using QSB.Player.Messages; using QSB.WorldSync; using System.Collections.Generic; +using System.Linq; using UnityEngine; namespace QSB.EyeOfTheUniverse.VesselSync @@ -32,7 +33,7 @@ namespace QSB.EyeOfTheUniverse.VesselSync _warpController._cageTrigger.OnExit -= OnExit; } - _warpController = FindObjectOfType(); + _warpController = QSBWorldSync.GetUnityObjects().First(); _warpController._cageTrigger.OnExit -= _warpController.OnExitCageTrigger; _warpController._cageTrigger.OnEntry += OnEntry; From f02294c3bd4aa61f890b7456bf2d57cc9016a4c7 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Sat, 1 Jan 2022 00:07:03 -0800 Subject: [PATCH 29/47] actually use default ip if none given --- QSB/Menus/MenuManager.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/QSB/Menus/MenuManager.cs b/QSB/Menus/MenuManager.cs index 9de73da8..d3b7c1dc 100644 --- a/QSB/Menus/MenuManager.cs +++ b/QSB/Menus/MenuManager.cs @@ -311,7 +311,12 @@ namespace QSB.Menus private void Connect() { - QSBNetworkManager.Instance.networkAddress = string.Concat((IPPopup as PopupInputMenu).GetInputText().Where(c => !char.IsWhiteSpace(c))); + var address = string.Concat(((PopupInputMenu)IPPopup).GetInputText().Where(c => !char.IsWhiteSpace(c))); + if (address.Length == 0) + { + address = QSBCore.DefaultServerIP; + } + QSBNetworkManager.Instance.networkAddress = address; QSBNetworkManager.Instance.StartClient(); if (QSBSceneManager.CurrentScene == OWScene.TitleScreen) From 3b3ea16257aae7243a7f9dfda44080072605f029 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Sat, 1 Jan 2022 00:17:06 -0800 Subject: [PATCH 30/47] reset time scale before disabling time sync lol --- QSB/EyeOfTheUniverse/EyeStateSync/Messages/EyeStateMessage.cs | 2 ++ QSB/TimeSync/WakeUpSync.cs | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/QSB/EyeOfTheUniverse/EyeStateSync/Messages/EyeStateMessage.cs b/QSB/EyeOfTheUniverse/EyeStateSync/Messages/EyeStateMessage.cs index d5179bba..b2bac439 100644 --- a/QSB/EyeOfTheUniverse/EyeStateSync/Messages/EyeStateMessage.cs +++ b/QSB/EyeOfTheUniverse/EyeStateSync/Messages/EyeStateMessage.cs @@ -29,6 +29,7 @@ namespace QSB.EyeOfTheUniverse.EyeStateSync.Messages if (Value >= EyeState.ForestIsDark) { + WakeUpSync.LocalInstance.ResetTimeScale(); WakeUpSync.LocalInstance.enabled = false; } } @@ -40,6 +41,7 @@ namespace QSB.EyeOfTheUniverse.EyeStateSync.Messages if (Value >= EyeState.ForestIsDark) { + WakeUpSync.LocalInstance.ResetTimeScale(); WakeUpSync.LocalInstance.enabled = false; } } diff --git a/QSB/TimeSync/WakeUpSync.cs b/QSB/TimeSync/WakeUpSync.cs index 31b27ff9..88a47488 100644 --- a/QSB/TimeSync/WakeUpSync.cs +++ b/QSB/TimeSync/WakeUpSync.cs @@ -215,7 +215,7 @@ namespace QSB.TimeSync TimeSyncUI.Start(TimeSyncType.Pausing, reason); } - private void ResetTimeScale() + public void ResetTimeScale() { OWTime.SetTimeScale(1f); OWTime.SetMaxDeltaTime(0.06666667f); From a703463394163e2761d4d9f75f6e687281024258 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Sat, 1 Jan 2022 00:22:18 -0800 Subject: [PATCH 31/47] defer time sync disable --- .../EyeStateSync/Messages/EyeStateMessage.cs | 6 ++---- QSB/TimeSync/WakeUpSync.cs | 10 +++++++++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/QSB/EyeOfTheUniverse/EyeStateSync/Messages/EyeStateMessage.cs b/QSB/EyeOfTheUniverse/EyeStateSync/Messages/EyeStateMessage.cs index b2bac439..9f7aa432 100644 --- a/QSB/EyeOfTheUniverse/EyeStateSync/Messages/EyeStateMessage.cs +++ b/QSB/EyeOfTheUniverse/EyeStateSync/Messages/EyeStateMessage.cs @@ -29,8 +29,7 @@ namespace QSB.EyeOfTheUniverse.EyeStateSync.Messages if (Value >= EyeState.ForestIsDark) { - WakeUpSync.LocalInstance.ResetTimeScale(); - WakeUpSync.LocalInstance.enabled = false; + WakeUpSync.LocalInstance.EyeDisable = true; } } @@ -41,8 +40,7 @@ namespace QSB.EyeOfTheUniverse.EyeStateSync.Messages if (Value >= EyeState.ForestIsDark) { - WakeUpSync.LocalInstance.ResetTimeScale(); - WakeUpSync.LocalInstance.enabled = false; + WakeUpSync.LocalInstance.EyeDisable = true; } } } diff --git a/QSB/TimeSync/WakeUpSync.cs b/QSB/TimeSync/WakeUpSync.cs index 88a47488..d0207e85 100644 --- a/QSB/TimeSync/WakeUpSync.cs +++ b/QSB/TimeSync/WakeUpSync.cs @@ -34,6 +34,8 @@ namespace QSB.TimeSync private int _serverLoopCount; private bool _hasWokenUp; + public bool EyeDisable; + public override void OnStartLocalPlayer() => LocalInstance = this; public void OnDisconnect() @@ -215,7 +217,7 @@ namespace QSB.TimeSync TimeSyncUI.Start(TimeSyncType.Pausing, reason); } - public void ResetTimeScale() + private void ResetTimeScale() { OWTime.SetTimeScale(1f); OWTime.SetMaxDeltaTime(0.06666667f); @@ -252,6 +254,12 @@ namespace QSB.TimeSync { UpdateClient(); } + + if (EyeDisable) + { + ResetTimeScale(); + enabled = false; + } } private void UpdateServer() From a01eb6ad031c0e9786ee0167de923ba4d29a18b5 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Sat, 1 Jan 2022 00:37:19 -0800 Subject: [PATCH 32/47] no need for ToList here --- QSB/Player/QSBPlayerManager.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/QSB/Player/QSBPlayerManager.cs b/QSB/Player/QSBPlayerManager.cs index 7d64a539..7601078c 100644 --- a/QSB/Player/QSBPlayerManager.cs +++ b/QSB/Player/QSBPlayerManager.cs @@ -120,10 +120,10 @@ namespace QSB.Player => new(Locator.GetFlashlight(), PlayerList.Where(x => x.FlashLight != null).Select(x => x.FlashLight)); public static void ShowAllPlayers() - => PlayerList.Where(x => x != LocalPlayer && x.DitheringAnimator != null).ToList().ForEach(x => x.DitheringAnimator.SetVisible(true, 0.5f)); + => PlayerList.Where(x => x != LocalPlayer && x.DitheringAnimator != null).ForEach(x => x.DitheringAnimator.SetVisible(true, 0.5f)); public static void HideAllPlayers() - => PlayerList.Where(x => x != LocalPlayer && x.DitheringAnimator != null).ToList().ForEach(x => x.DitheringAnimator.SetVisible(true, 0.5f)); + => PlayerList.Where(x => x != LocalPlayer && x.DitheringAnimator != null).ForEach(x => x.DitheringAnimator.SetVisible(true, 0.5f)); public static PlayerInfo GetClosestPlayerToWorldPoint(Vector3 worldPoint, bool includeLocalPlayer) => includeLocalPlayer ? GetClosestPlayerToWorldPoint(PlayerList, worldPoint) From a6f820d556b006643f0a7dd5b1853c8d486a3cc1 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Sat, 1 Jan 2022 01:21:12 -0800 Subject: [PATCH 33/47] use OnDisconnect to reset timescale instead since it doesnt do a bunch of other stuff --- QSB/TimeSync/WakeUpSync.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/QSB/TimeSync/WakeUpSync.cs b/QSB/TimeSync/WakeUpSync.cs index d0207e85..c8d95164 100644 --- a/QSB/TimeSync/WakeUpSync.cs +++ b/QSB/TimeSync/WakeUpSync.cs @@ -257,7 +257,7 @@ namespace QSB.TimeSync if (EyeDisable) { - ResetTimeScale(); + OnDisconnect(); enabled = false; } } From b09d8c51f68c6d680f300087d48d9d78520e8854 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Sat, 1 Jan 2022 01:45:52 -0800 Subject: [PATCH 34/47] hide all players fix --- QSB/Player/QSBPlayerManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/QSB/Player/QSBPlayerManager.cs b/QSB/Player/QSBPlayerManager.cs index 7601078c..bb18dcd0 100644 --- a/QSB/Player/QSBPlayerManager.cs +++ b/QSB/Player/QSBPlayerManager.cs @@ -123,7 +123,7 @@ namespace QSB.Player => PlayerList.Where(x => x != LocalPlayer && x.DitheringAnimator != null).ForEach(x => x.DitheringAnimator.SetVisible(true, 0.5f)); public static void HideAllPlayers() - => PlayerList.Where(x => x != LocalPlayer && x.DitheringAnimator != null).ForEach(x => x.DitheringAnimator.SetVisible(true, 0.5f)); + => PlayerList.Where(x => x != LocalPlayer && x.DitheringAnimator != null).ForEach(x => x.DitheringAnimator.SetVisible(false, 0.5f)); public static PlayerInfo GetClosestPlayerToWorldPoint(Vector3 worldPoint, bool includeLocalPlayer) => includeLocalPlayer ? GetClosestPlayerToWorldPoint(PlayerList, worldPoint) From 3e478ceda4fbf35b65b336a7f5c6baa0b6506389 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Sat, 1 Jan 2022 01:50:37 -0800 Subject: [PATCH 35/47] make PlayerInfo.Visible actually accurate --- QSB/Player/PlayerInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/QSB/Player/PlayerInfo.cs b/QSB/Player/PlayerInfo.cs index ad9e902c..856563a9 100644 --- a/QSB/Player/PlayerInfo.cs +++ b/QSB/Player/PlayerInfo.cs @@ -29,7 +29,7 @@ namespace QSB.Player public ClientState State { get; set; } public EyeState EyeState { get; set; } public bool IsDead { get; set; } - public bool Visible { get; set; } = true; + public bool Visible => DitheringAnimator._visible; public bool IsReady { get; set; } public bool IsInMoon { get; set; } public bool IsInShrine { get; set; } From d7649f1ebb4fdb3ce4230a2dae8151178a888995 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Sat, 1 Jan 2022 01:53:23 -0800 Subject: [PATCH 36/47] null check for dithering oops --- QSB/Player/PlayerInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/QSB/Player/PlayerInfo.cs b/QSB/Player/PlayerInfo.cs index 856563a9..7c695242 100644 --- a/QSB/Player/PlayerInfo.cs +++ b/QSB/Player/PlayerInfo.cs @@ -29,7 +29,7 @@ namespace QSB.Player public ClientState State { get; set; } public EyeState EyeState { get; set; } public bool IsDead { get; set; } - public bool Visible => DitheringAnimator._visible; + public bool Visible => DitheringAnimator != null && DitheringAnimator._visible; public bool IsReady { get; set; } public bool IsInMoon { get; set; } public bool IsInShrine { get; set; } From 5497b6f851858c16582622d8be2c8a14ac6cc9be Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Sat, 1 Jan 2022 02:04:11 -0800 Subject: [PATCH 37/47] pause local and fade remote --- .../CosmicInflation/InflationManager.cs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs b/QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs index c463c951..f3b26647 100644 --- a/QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs +++ b/QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs @@ -60,16 +60,25 @@ namespace QSB.EyeOfTheUniverse.CosmicInflation _controller._probeDestroyTrigger.SetTriggerActivation(false); new EnterLeaveMessage(EnterLeaveType.EnterCosmicFog).Send(); - // the pausing and stuff happens here - DebugLog.DebugWrite("TODO: pause and wait for other players to enter"); + DebugLog.DebugWrite("pause and wait for other players to enter"); + ReticleController.Hide(); + Locator.GetFlashlight().TurnOff(false); + Locator.GetPromptManager().SetPromptsVisible(false); + OWInput.ChangeInputMode(InputMode.None); + OWTime.SetTimeScale(0); } } - public void Enter(PlayerInfo player) { _playersInFog.Add(player); + if (player != QSBPlayerManager.LocalPlayer) + { + DebugLog.DebugWrite($"fade player {player}"); + player.DitheringAnimator.SetVisible(false, 3); + } + if (_playersInFog.Count == QSBPlayerManager.PlayerList.Count) { StartCollapse(); @@ -79,7 +88,7 @@ namespace QSB.EyeOfTheUniverse.CosmicInflation private void StartCollapse() { // the actual collapsing happens here - DebugLog.DebugWrite("TODO: fog sphere collapse"); + DebugLog.DebugWrite("fog sphere collapse"); } } } From c61fffbf056ef440adc9ddc670c70677819143b1 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Sat, 1 Jan 2022 02:08:30 -0800 Subject: [PATCH 38/47] rudimentary collapse --- .../CosmicInflation/InflationManager.cs | 32 ++++++++++++++++--- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs b/QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs index f3b26647..c449973c 100644 --- a/QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs +++ b/QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs @@ -60,11 +60,13 @@ namespace QSB.EyeOfTheUniverse.CosmicInflation _controller._probeDestroyTrigger.SetTriggerActivation(false); new EnterLeaveMessage(EnterLeaveType.EnterCosmicFog).Send(); - DebugLog.DebugWrite("pause and wait for other players to enter"); + DebugLog.DebugWrite("pause, disable input, wait for other players to enter"); + ReticleController.Hide(); Locator.GetFlashlight().TurnOff(false); Locator.GetPromptManager().SetPromptsVisible(false); OWInput.ChangeInputMode(InputMode.None); + OWTime.SetTimeScale(0); } } @@ -75,7 +77,7 @@ namespace QSB.EyeOfTheUniverse.CosmicInflation if (player != QSBPlayerManager.LocalPlayer) { - DebugLog.DebugWrite($"fade player {player}"); + DebugLog.DebugWrite($"fade out player {player}"); player.DitheringAnimator.SetVisible(false, 3); } @@ -87,8 +89,30 @@ namespace QSB.EyeOfTheUniverse.CosmicInflation private void StartCollapse() { - // the actual collapsing happens here - DebugLog.DebugWrite("fog sphere collapse"); + DebugLog.DebugWrite("unpause, fade in everyone, fog sphere collapse"); + + OWTime.SetTimeScale(1); + _playersInFog.ForEach(x => x.DitheringAnimator.SetVisible(true, 3)); + + _controller._state = CosmicInflationController.State.Collapsing; + _controller._stateChangeTime = Time.time; + _controller._collapseStartPos = _controller._possibilitySphereRoot.localPosition; + _controller._smokeSphereTrigger.SetTriggerActivation(false); + _controller._inflationLight.FadeTo(1f, 1f); + _controller._possibilitySphereController.OnCollapse(); + if (_controller._campsiteController.GetUseAltPostCollapseSocket()) + { + _controller._playerPostCollapseSocket = _controller._altPlayerPostCollapseSocket; + _controller._altTravelerToHidePostCollapse.SetActive(false); + } + Locator.GetPlayerBody().SetPosition(_controller._playerPostCollapseSocket.position); + Locator.GetPlayerBody().SetRotation(_controller._playerPostCollapseSocket.rotation); + Locator.GetPlayerBody().SetVelocity(-_controller._playerPostCollapseSocket.forward); + Locator.GetPlayerTransform().GetRequiredComponent().LockOn(_controller._possibilitySphereRoot, 2f); + foreach (var particles in _controller._smokeSphereParticles) + { + particles.Stop(); + } } } } From 7b9c55489548c1634d68fcdab6beaf9a6ccbee30 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Sat, 1 Jan 2022 02:15:36 -0800 Subject: [PATCH 39/47] bruh --- QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs b/QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs index c449973c..e2395d20 100644 --- a/QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs +++ b/QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs @@ -77,7 +77,7 @@ namespace QSB.EyeOfTheUniverse.CosmicInflation if (player != QSBPlayerManager.LocalPlayer) { - DebugLog.DebugWrite($"fade out player {player}"); + DebugLog.DebugWrite($"fade out player {player.PlayerId}"); player.DitheringAnimator.SetVisible(false, 3); } @@ -92,7 +92,7 @@ namespace QSB.EyeOfTheUniverse.CosmicInflation DebugLog.DebugWrite("unpause, fade in everyone, fog sphere collapse"); OWTime.SetTimeScale(1); - _playersInFog.ForEach(x => x.DitheringAnimator.SetVisible(true, 3)); + QSBPlayerManager.ShowAllPlayers(); _controller._state = CosmicInflationController.State.Collapsing; _controller._stateChangeTime = Time.time; From 4bd3d97db743306e4cbe3600233b98f4936ba6b1 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Sat, 1 Jan 2022 22:12:10 +0000 Subject: [PATCH 40/47] Update PlayerToolsManager.cs --- QSB/Tools/PlayerToolsManager.cs | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/QSB/Tools/PlayerToolsManager.cs b/QSB/Tools/PlayerToolsManager.cs index c29b6c06..21fbab3e 100644 --- a/QSB/Tools/PlayerToolsManager.cs +++ b/QSB/Tools/PlayerToolsManager.cs @@ -26,23 +26,14 @@ namespace QSB.Tools { CreateStowTransforms(player.CameraBody.transform); - Props_HEA_PlayerTool_mat = GameObject.Find("Props_HEA_ProbeLauncher_ProbeCamera/ProbeLauncherChassis").GetComponent().materials[0]; - Props_HEA_Lightbulb_OFF_mat = GameObject.Find("Props_HEA_Probe_Prelaunch").GetComponent().materials[1]; + var surfaceData = Locator.GetSurfaceManager()._surfaceLookupAsset; + var metal = surfaceData.surfaceTypeGroups[15].materials; + var glass = surfaceData.surfaceTypeGroups[19].materials; - if (QSBSceneManager.CurrentScene == OWScene.SolarSystem) - { - Structure_HEA_PlayerShip_Screens_mat = GameObject.Find("ProbeScreen (1)/ProbeScreenPivot/ProbeScreen").GetComponent().materials[2]; - Props_HEA_Lightbulb_mat = GameObject.Find("Props_HEA_Lantern (10)/Lantern_Lamp").GetComponent().materials[0]; - Props_HEA_Lightbulb_OFF_mat = GameObject.Find("NomaiResearchExhibit/Props_HEA_Probe_STATIC").GetComponent().materials[1]; - } - else if (QSBSceneManager.CurrentScene == OWScene.EyeOfTheUniverse) - { - Props_HEA_Lightbulb_mat = GameObject.Find("lantern_lamp").GetComponent().materials[0]; - - // BUG : uhhhhh fuckin' uhhhhhhhh (find a material) - Props_HEA_Lightbulb_OFF_mat = null; - Structure_HEA_PlayerShip_Screens_mat = null; - } + Props_HEA_PlayerTool_mat = metal[27]; + Props_HEA_Lightbulb_mat = glass[47]; + Props_HEA_Lightbulb_OFF_mat = glass[48]; + Structure_HEA_PlayerShip_Screens_mat = glass[41]; } catch (Exception ex) { From ef4a83e12df6a44a0719f60cd92536b1741f1fb3 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Sat, 1 Jan 2022 22:19:10 +0000 Subject: [PATCH 41/47] cleanup --- QSB/Anglerfish/Patches/AnglerPatches.cs | 21 +++++++++++++++++++ .../TransformSync/AnglerTransformSync.cs | 2 ++ .../NPC/Patches/CharacterAnimationPatches.cs | 1 + QSB/Animation/NPC/Patches/SolanumPatches.cs | 1 + .../NPC/Patches/TravelerControllerPatches.cs | 5 ++++- .../ClientStateManager.cs | 1 + .../CosmicInflation/InflationManager.cs | 1 + .../EyeStateSync/Messages/EyeStateMessage.cs | 1 - .../EyeStateSync/Messages/FlickerMessage.cs | 3 ++- .../Messages/KillGalaxiesMessage.cs | 1 + .../ForestOfGalaxies/Patches/ForestPatches.cs | 3 +++ .../GalaxyMap/QSBCharacterDialogueTree.cs | 5 ++--- .../VesselSync/VesselManager.cs | 1 - QSB/JellyfishSync/Patches/JellyfishPatches.cs | 1 + .../TransformSync/JellyfishTransformSync.cs | 3 ++- .../WorldObjects/QSBJellyfish.cs | 1 - QSB/Menus/MenuManager.cs | 2 ++ QSB/Messaging/QSBMessage.cs | 1 - QSB/Messaging/QSBMessageManager.cs | 2 +- QSB/Messaging/QSBWorldObjectMessage.cs | 1 - QSB/MeteorSync/Patches/MeteorPatches.cs | 3 +-- QSB/OrbSync/Patches/OrbPatches.cs | 9 ++++++++ .../TransformSync/NomaiOrbTransformSync.cs | 3 +++ QSB/OrbSync/WorldObjects/QSBOrb.cs | 1 + QSB/Patches/QSBPatchManager.cs | 1 + QSB/Player/Messages/EnterLeaveMessage.cs | 1 - QSB/StatueSync/Messages/StartStatueMessage.cs | 1 - .../TranslationSync/Patches/SpiralPatches.cs | 1 + QSB/TornadoSync/Patches/TornadoPatches.cs | 2 +- QSB/TornadoSync/TornadoManager.cs | 1 + .../TransformSync/OccasionalTransformSync.cs | 5 ++++- QSBTests/MessageTests.cs | 4 ++++ QuantumUNET/Transport/QNetworkHash128.cs | 3 +++ 33 files changed, 74 insertions(+), 18 deletions(-) diff --git a/QSB/Anglerfish/Patches/AnglerPatches.cs b/QSB/Anglerfish/Patches/AnglerPatches.cs index 5cdfda1d..56f2f349 100644 --- a/QSB/Anglerfish/Patches/AnglerPatches.cs +++ b/QSB/Anglerfish/Patches/AnglerPatches.cs @@ -53,6 +53,7 @@ namespace QSB.Anglerfish.Patches { return true; } + var qsbAngler = __instance.GetWorldObject(); switch (__instance._currentState) @@ -64,6 +65,7 @@ namespace QSB.Anglerfish.Patches qsbAngler.SendMessage(new AnglerChangeStateMessage(qsbAngler)); return false; } + break; case AnglerfishController.AnglerState.Chasing: if (qsbAngler.TargetTransform == null) @@ -72,6 +74,7 @@ namespace QSB.Anglerfish.Patches qsbAngler.SendMessage(new AnglerChangeStateMessage(qsbAngler)); return false; } + if ((qsbAngler.TargetTransform.position - __instance._anglerBody.GetPosition()).sqrMagnitude > __instance._escapeDistance * __instance._escapeDistance) { qsbAngler.TargetTransform = null; @@ -79,6 +82,7 @@ namespace QSB.Anglerfish.Patches qsbAngler.SendMessage(new AnglerChangeStateMessage(qsbAngler)); return false; } + break; case AnglerfishController.AnglerState.Consuming: if (!__instance._consumeComplete) @@ -89,6 +93,7 @@ namespace QSB.Anglerfish.Patches qsbAngler.SendMessage(new AnglerChangeStateMessage(qsbAngler)); return false; } + var num = Time.time - __instance._consumeStartTime; if (qsbAngler.TargetTransform.CompareTag("Player") && num > __instance._consumeDeathDelay) { @@ -96,18 +101,21 @@ namespace QSB.Anglerfish.Patches __instance._consumeComplete = true; return false; } + if (qsbAngler.TargetTransform.CompareTag("Ship")) { if (num > __instance._consumeShipCrushDelay) { qsbAngler.TargetTransform.GetComponentInChildren().TriggerSystemFailure(); } + if (num > __instance._consumeDeathDelay) { if (PlayerState.IsInsideShip()) { Locator.GetDeathManager().KillPlayer(DeathType.Digestion); } + __instance._consumeComplete = true; return false; } @@ -118,6 +126,7 @@ namespace QSB.Anglerfish.Patches qsbAngler.TargetTransform = null; qsbAngler.SendMessage(new AnglerChangeStateMessage(qsbAngler)); } + break; case AnglerfishController.AnglerState.Stunned: __instance._stunTimer -= Time.deltaTime; @@ -129,9 +138,11 @@ namespace QSB.Anglerfish.Patches qsbAngler.SendMessage(new AnglerChangeStateMessage(qsbAngler)); return false; } + __instance.ChangeState(AnglerfishController.AnglerState.Lurking); qsbAngler.SendMessage(new AnglerChangeStateMessage(qsbAngler)); } + break; default: return false; @@ -148,6 +159,7 @@ namespace QSB.Anglerfish.Patches { return true; } + var qsbAngler = __instance.GetWorldObject(); qsbAngler.UpdateTargetVelocity(); @@ -155,6 +167,7 @@ namespace QSB.Anglerfish.Patches { __instance.ApplyDrag(10f); } + switch (__instance._currentState) { case AnglerfishController.AnglerState.Lurking: @@ -169,6 +182,7 @@ namespace QSB.Anglerfish.Patches __instance.MoveTowardsTarget(targetPos, __instance._investigateSpeed, __instance._acceleration); return false; } + break; } case AnglerfishController.AnglerState.Chasing: @@ -200,6 +214,7 @@ namespace QSB.Anglerfish.Patches d = Mathf.Lerp(num4, 0f, num8 * num8); } } + __instance._targetPos = qsbAngler.TargetTransform.position + normalized * d; __instance.RotateTowardsTarget(__instance._targetPos, __instance._turnSpeed, __instance._quickTurnSpeed); if (!__instance._turningInPlace) @@ -207,6 +222,7 @@ namespace QSB.Anglerfish.Patches __instance.MoveTowardsTarget(__instance._targetPos, __instance._chaseSpeed, __instance._acceleration); return false; } + break; } case AnglerfishController.AnglerState.Consuming: @@ -254,6 +270,7 @@ namespace QSB.Anglerfish.Patches { return false; } + if ((noiseMaker.GetNoiseOrigin() - __instance.transform.position).sqrMagnitude < __instance._pursueDistance * __instance._pursueDistance) { if (qsbAngler.TargetTransform != noiseMaker.GetAttachedBody().transform) @@ -263,6 +280,7 @@ namespace QSB.Anglerfish.Patches { __instance.ChangeState(AnglerfishController.AnglerState.Chasing); } + qsbAngler.SendMessage(new AnglerChangeStateMessage(qsbAngler)); return false; } @@ -274,6 +292,7 @@ namespace QSB.Anglerfish.Patches { __instance.ChangeState(AnglerfishController.AnglerState.Investigating); } + qsbAngler.SendMessage(new AnglerChangeStateMessage(qsbAngler)); } @@ -293,8 +312,10 @@ namespace QSB.Anglerfish.Patches { Locator.GetDeathManager().KillPlayer(DeathType.Digestion); } + return false; } + if (caughtBody.CompareTag("Player") || caughtBody.CompareTag("Ship")) { qsbAngler.TargetTransform = caughtBody.transform; diff --git a/QSB/Anglerfish/TransformSync/AnglerTransformSync.cs b/QSB/Anglerfish/TransformSync/AnglerTransformSync.cs index 7bbecba3..29cbbb95 100644 --- a/QSB/Anglerfish/TransformSync/AnglerTransformSync.cs +++ b/QSB/Anglerfish/TransformSync/AnglerTransformSync.cs @@ -35,6 +35,7 @@ namespace QSB.Anglerfish.TransformSync { NetIdentity.UnregisterAuthQueue(); } + AttachedObject.OnUnsuspendOWRigidbody -= OnUnsuspend; AttachedObject.OnSuspendOWRigidbody -= OnSuspend; } @@ -53,6 +54,7 @@ namespace QSB.Anglerfish.TransformSync { NetIdentity.RegisterAuthQueue(); } + AttachedObject.OnUnsuspendOWRigidbody += OnUnsuspend; AttachedObject.OnSuspendOWRigidbody += OnSuspend; NetIdentity.SendAuthQueueMessage(AttachedObject.IsSuspended() ? AuthQueueAction.Remove : AuthQueueAction.Add); diff --git a/QSB/Animation/NPC/Patches/CharacterAnimationPatches.cs b/QSB/Animation/NPC/Patches/CharacterAnimationPatches.cs index 2337ea54..1c9f6caa 100644 --- a/QSB/Animation/NPC/Patches/CharacterAnimationPatches.cs +++ b/QSB/Animation/NPC/Patches/CharacterAnimationPatches.cs @@ -110,6 +110,7 @@ namespace QSB.Animation.NPC.Patches var qsbObj = __instance.GetWorldObject(); new EnterLeaveMessage(EnterLeaveType.EnterNonNomaiHeadZone, qsbObj.ObjectId).Send(); } + return false; } diff --git a/QSB/Animation/NPC/Patches/SolanumPatches.cs b/QSB/Animation/NPC/Patches/SolanumPatches.cs index 3bd3cc54..08f43fa4 100644 --- a/QSB/Animation/NPC/Patches/SolanumPatches.cs +++ b/QSB/Animation/NPC/Patches/SolanumPatches.cs @@ -63,6 +63,7 @@ namespace QSB.Animation.NPC.Patches var qsbObj = __instance._solanumAnimController.GetWorldObject(); new EnterLeaveMessage(EnterLeaveType.ExitNomaiHeadZone, qsbObj.ObjectId).Send(); } + return false; } diff --git a/QSB/Animation/NPC/Patches/TravelerControllerPatches.cs b/QSB/Animation/NPC/Patches/TravelerControllerPatches.cs index 7f448135..516604e6 100644 --- a/QSB/Animation/NPC/Patches/TravelerControllerPatches.cs +++ b/QSB/Animation/NPC/Patches/TravelerControllerPatches.cs @@ -32,7 +32,6 @@ namespace QSB.Animation.NPC.Patches return false; } - [HarmonyPrefix] [HarmonyPatch(typeof(TravelerController), nameof(TravelerController.StartConversation))] public static bool StartConversation(TravelerController __instance) @@ -44,6 +43,7 @@ namespace QSB.Animation.NPC.Patches : __instance._animator.GetCurrentAnimatorStateInfo(0).fullPathHash; __instance._animator.SetTrigger("Talking"); } + Locator.GetTravelerAudioManager().StopTravelerAudio(__instance); return false; @@ -58,6 +58,7 @@ namespace QSB.Animation.NPC.Patches __instance._animator.CrossFadeInFixedTime("Gabbro_Talking", 1.8f); __instance._hammockAnimator.CrossFadeInFixedTime("GabbroHammock_Talking", 1.8f); } + Locator.GetTravelerAudioManager().StopTravelerAudio(__instance); return false; @@ -78,6 +79,7 @@ namespace QSB.Animation.NPC.Patches __instance._animator.SetTrigger("Playing"); } } + Locator.GetTravelerAudioManager().PlayTravelerAudio(__instance, audioDelay); return false; @@ -92,6 +94,7 @@ namespace QSB.Animation.NPC.Patches __instance._animator.CrossFadeInFixedTime("Gabbro_Playing", audioDelay, -1, -audioDelay); __instance._hammockAnimator.CrossFadeInFixedTime("GabbroHammock_Playing", audioDelay, -1, -audioDelay); } + Locator.GetTravelerAudioManager().PlayTravelerAudio(__instance, audioDelay); if (DialogueConditionManager.SharedInstance.GetConditionState("MAP_PROMPT_REMINDER") || DialogueConditionManager.SharedInstance.GetConditionState("MAP_PROMPT_ATTENTION")) { diff --git a/QSB/ClientServerStateSync/ClientStateManager.cs b/QSB/ClientServerStateSync/ClientStateManager.cs index e7f7f32d..34195bf4 100644 --- a/QSB/ClientServerStateSync/ClientStateManager.cs +++ b/QSB/ClientServerStateSync/ClientStateManager.cs @@ -135,6 +135,7 @@ namespace QSB.ClientServerStateSync { newState = ClientState.AliveInEye; } + break; default: newState = ClientState.NotLoaded; diff --git a/QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs b/QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs index e2395d20..e66b70c7 100644 --- a/QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs +++ b/QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs @@ -105,6 +105,7 @@ namespace QSB.EyeOfTheUniverse.CosmicInflation _controller._playerPostCollapseSocket = _controller._altPlayerPostCollapseSocket; _controller._altTravelerToHidePostCollapse.SetActive(false); } + Locator.GetPlayerBody().SetPosition(_controller._playerPostCollapseSocket.position); Locator.GetPlayerBody().SetRotation(_controller._playerPostCollapseSocket.rotation); Locator.GetPlayerBody().SetVelocity(-_controller._playerPostCollapseSocket.forward); diff --git a/QSB/EyeOfTheUniverse/EyeStateSync/Messages/EyeStateMessage.cs b/QSB/EyeOfTheUniverse/EyeStateSync/Messages/EyeStateMessage.cs index 9f7aa432..17e3d059 100644 --- a/QSB/EyeOfTheUniverse/EyeStateSync/Messages/EyeStateMessage.cs +++ b/QSB/EyeOfTheUniverse/EyeStateSync/Messages/EyeStateMessage.cs @@ -18,7 +18,6 @@ namespace QSB.EyeOfTheUniverse.EyeStateSync.Messages } } - private EyeStateMessage(EyeState state) => Value = state; public override bool ShouldReceive => WorldObjectManager.AllObjectsReady; diff --git a/QSB/EyeOfTheUniverse/EyeStateSync/Messages/FlickerMessage.cs b/QSB/EyeOfTheUniverse/EyeStateSync/Messages/FlickerMessage.cs index e217a5b5..8fe4543c 100644 --- a/QSB/EyeOfTheUniverse/EyeStateSync/Messages/FlickerMessage.cs +++ b/QSB/EyeOfTheUniverse/EyeStateSync/Messages/FlickerMessage.cs @@ -20,7 +20,6 @@ namespace QSB.EyeOfTheUniverse.EyeStateSync.Messages } } - private float _offDuration; private float _onDuration; @@ -57,6 +56,7 @@ namespace QSB.EyeOfTheUniverse.EyeStateSync.Messages { throw new InvalidOperationException("GlobalMessenger does not support recursive FireEvent calls to the same eventType."); } + eventData.isInvoking = true; eventData.temp.AddRange(eventData.callbacks); foreach (var callback in eventData.temp) @@ -76,6 +76,7 @@ namespace QSB.EyeOfTheUniverse.EyeStateSync.Messages Debug.LogException(exception); } } + eventData.temp.Clear(); eventData.isInvoking = false; } diff --git a/QSB/EyeOfTheUniverse/ForestOfGalaxies/Messages/KillGalaxiesMessage.cs b/QSB/EyeOfTheUniverse/ForestOfGalaxies/Messages/KillGalaxiesMessage.cs index 2115f64d..9be60d1b 100644 --- a/QSB/EyeOfTheUniverse/ForestOfGalaxies/Messages/KillGalaxiesMessage.cs +++ b/QSB/EyeOfTheUniverse/ForestOfGalaxies/Messages/KillGalaxiesMessage.cs @@ -47,6 +47,7 @@ namespace QSB.EyeOfTheUniverse.ForestOfGalaxies.Messages { galaxyController._galaxies[i].DieAfterSeconds(_deathDelays[i], true, AudioType.EyeGalaxyBlowAway); } + galaxyController._forestIsDarkTime = Time.time + 65f; galaxyController.enabled = true; diff --git a/QSB/EyeOfTheUniverse/ForestOfGalaxies/Patches/ForestPatches.cs b/QSB/EyeOfTheUniverse/ForestOfGalaxies/Patches/ForestPatches.cs index 37a1c177..7d9edfc0 100644 --- a/QSB/EyeOfTheUniverse/ForestOfGalaxies/Patches/ForestPatches.cs +++ b/QSB/EyeOfTheUniverse/ForestOfGalaxies/Patches/ForestPatches.cs @@ -78,6 +78,7 @@ namespace QSB.EyeOfTheUniverse.ForestOfGalaxies.Patches delayList.Add(rnd); galaxy.DieAfterSeconds(rnd, true, AudioType.EyeGalaxyBlowAway); } + new KillGalaxiesMessage(delayList).Send(); __instance._forestIsDarkTime = Time.time + delay + 5f; __instance.enabled = true; @@ -107,10 +108,12 @@ namespace QSB.EyeOfTheUniverse.ForestOfGalaxies.Patches GlobalMessenger.FireEvent(OWEvents.FlickerOffAndOn, 0.5f, 0.5f); new EyeCloneSeenMessage().Send(); } + if (__instance._warpPlayerNextFrame) { __instance.WarpPlayerToCampfire(); } + return false; } } diff --git a/QSB/EyeOfTheUniverse/GalaxyMap/QSBCharacterDialogueTree.cs b/QSB/EyeOfTheUniverse/GalaxyMap/QSBCharacterDialogueTree.cs index 388f1d3c..9dd6ebfb 100644 --- a/QSB/EyeOfTheUniverse/GalaxyMap/QSBCharacterDialogueTree.cs +++ b/QSB/EyeOfTheUniverse/GalaxyMap/QSBCharacterDialogueTree.cs @@ -22,7 +22,6 @@ namespace QSB.EyeOfTheUniverse.GalaxyMap private DialogueBoxVer2 _currentDialogueBox; private bool _wasFlashlightOn; private bool _timeFrozen; - private bool _isRecording; private const string SIGN_NAME = "SIGN"; private const string RECORDING_NAME = "RECORDING"; @@ -356,7 +355,7 @@ namespace QSB.EyeOfTheUniverse.GalaxyMap Locator.GetToolModeSwapper().UnequipTool(); GlobalMessenger.FireEvent("EnterConversation"); - Locator.GetPlayerAudioController().PlayDialogueEnter(_isRecording); + Locator.GetPlayerAudioController().PlayDialogueEnter(); _wasFlashlightOn = Locator.GetFlashlight().IsFlashlightOn(); if (_wasFlashlightOn && _turnOffFlashlight) { @@ -394,7 +393,7 @@ namespace QSB.EyeOfTheUniverse.GalaxyMap _interactVolume.ResetInteraction(); Locator.GetPlayerTransform().GetRequiredComponent().BreakLock(); GlobalMessenger.FireEvent("ExitConversation"); - Locator.GetPlayerAudioController().PlayDialogueExit(_isRecording); + Locator.GetPlayerAudioController().PlayDialogueExit(); if (_wasFlashlightOn && _turnOffFlashlight && _turnOnFlashlight) { Locator.GetFlashlight().TurnOn(false); diff --git a/QSB/EyeOfTheUniverse/VesselSync/VesselManager.cs b/QSB/EyeOfTheUniverse/VesselSync/VesselManager.cs index a94283c5..df1313cc 100644 --- a/QSB/EyeOfTheUniverse/VesselSync/VesselManager.cs +++ b/QSB/EyeOfTheUniverse/VesselSync/VesselManager.cs @@ -56,7 +56,6 @@ namespace QSB.EyeOfTheUniverse.VesselSync } } - public void Enter(PlayerInfo player) { _playersInCage.Add(player); diff --git a/QSB/JellyfishSync/Patches/JellyfishPatches.cs b/QSB/JellyfishSync/Patches/JellyfishPatches.cs index f84f1bb0..17edbacd 100644 --- a/QSB/JellyfishSync/Patches/JellyfishPatches.cs +++ b/QSB/JellyfishSync/Patches/JellyfishPatches.cs @@ -19,6 +19,7 @@ namespace QSB.JellyfishSync.Patches { return true; } + var qsbJellyfish = __instance.GetWorldObject(); var sqrMagnitude = (__instance._jellyfishBody.GetPosition() - __instance._planetBody.GetPosition()).sqrMagnitude; diff --git a/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs b/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs index c0c2fe1f..1535a264 100644 --- a/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs +++ b/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs @@ -36,6 +36,7 @@ namespace QSB.JellyfishSync.TransformSync { NetIdentity.UnregisterAuthQueue(); } + AttachedObject.OnUnsuspendOWRigidbody -= OnUnsuspend; AttachedObject.OnSuspendOWRigidbody -= OnSuspend; } @@ -54,6 +55,7 @@ namespace QSB.JellyfishSync.TransformSync { NetIdentity.RegisterAuthQueue(); } + AttachedObject.OnUnsuspendOWRigidbody += OnUnsuspend; AttachedObject.OnSuspendOWRigidbody += OnSuspend; NetIdentity.SendAuthQueueMessage(AttachedObject.IsSuspended() ? AuthQueueAction.Remove : AuthQueueAction.Add); @@ -138,7 +140,6 @@ namespace QSB.JellyfishSync.TransformSync return true; } - protected override void OnRenderObject() { if (!QSBCore.ShowLinesInDebug diff --git a/QSB/JellyfishSync/WorldObjects/QSBJellyfish.cs b/QSB/JellyfishSync/WorldObjects/QSBJellyfish.cs index 3ca72758..4e6ea16f 100644 --- a/QSB/JellyfishSync/WorldObjects/QSBJellyfish.cs +++ b/QSB/JellyfishSync/WorldObjects/QSBJellyfish.cs @@ -32,7 +32,6 @@ namespace QSB.JellyfishSync.WorldObjects } } - public bool IsRising { get => AttachedObject._isRising; diff --git a/QSB/Menus/MenuManager.cs b/QSB/Menus/MenuManager.cs index d3b7c1dc..05d1512d 100644 --- a/QSB/Menus/MenuManager.cs +++ b/QSB/Menus/MenuManager.cs @@ -77,6 +77,7 @@ namespace QSB.Menus _nowLoadingSB = new StringBuilder(); return; } + _nowLoadingSB.Length = 0; } @@ -316,6 +317,7 @@ namespace QSB.Menus { address = QSBCore.DefaultServerIP; } + QSBNetworkManager.Instance.networkAddress = address; QSBNetworkManager.Instance.StartClient(); diff --git a/QSB/Messaging/QSBMessage.cs b/QSB/Messaging/QSBMessage.cs index 989cc0c0..39a7609b 100644 --- a/QSB/Messaging/QSBMessage.cs +++ b/QSB/Messaging/QSBMessage.cs @@ -47,7 +47,6 @@ namespace QSB.Messaging public override string ToString() => GetType().Name; } - public abstract class QSBBoolMessage : QSBMessage { protected bool Value; diff --git a/QSB/Messaging/QSBMessageManager.cs b/QSB/Messaging/QSBMessageManager.cs index 07383042..75c8650f 100644 --- a/QSB/Messaging/QSBMessageManager.cs +++ b/QSB/Messaging/QSBMessageManager.cs @@ -104,6 +104,7 @@ namespace QSB.Messaging DebugLog.ToConsole($"SendTo unknown player! id: {msg.To}, message: {msg}", MessageType.Error); return; } + conn.Send(msgType, msg); } } @@ -158,7 +159,6 @@ namespace QSB.Messaging #endregion - public static void SendRaw(this M msg) where M : QSBMessageRaw { diff --git a/QSB/Messaging/QSBWorldObjectMessage.cs b/QSB/Messaging/QSBWorldObjectMessage.cs index ccea9e7b..e35b631c 100644 --- a/QSB/Messaging/QSBWorldObjectMessage.cs +++ b/QSB/Messaging/QSBWorldObjectMessage.cs @@ -42,7 +42,6 @@ namespace QSB.Messaging } } - public abstract class QSBBoolWorldObjectMessage : QSBWorldObjectMessage where T : IWorldObject { protected bool Value; diff --git a/QSB/MeteorSync/Patches/MeteorPatches.cs b/QSB/MeteorSync/Patches/MeteorPatches.cs index d67881a8..4110675b 100644 --- a/QSB/MeteorSync/Patches/MeteorPatches.cs +++ b/QSB/MeteorSync/Patches/MeteorPatches.cs @@ -168,7 +168,6 @@ namespace QSB.MeteorSync.Patches } } - /// /// client only /// @@ -271,7 +270,6 @@ namespace QSB.MeteorSync.Patches } } - /// /// both server and client /// @@ -320,6 +318,7 @@ namespace QSB.MeteorSync.Patches { return true; } + if (!WorldObjectManager.AllObjectsReady) { return true; diff --git a/QSB/OrbSync/Patches/OrbPatches.cs b/QSB/OrbSync/Patches/OrbPatches.cs index a6aa22bd..6cac6466 100644 --- a/QSB/OrbSync/Patches/OrbPatches.cs +++ b/QSB/OrbSync/Patches/OrbPatches.cs @@ -21,10 +21,12 @@ namespace QSB.OrbSync.Patches { return; } + if (!__instance._isBeingDragged) { return; } + var qsbOrb = __instance.GetWorldObject(); qsbOrb.SendMessage(new OrbDragMessage(true)); } @@ -37,15 +39,18 @@ namespace QSB.OrbSync.Patches { return true; } + if (!__instance._isBeingDragged) { return false; } + var qsbOrb = __instance.GetWorldObject(); if (!qsbOrb.TransformSync.HasAuthority) { return false; } + qsbOrb.SendMessage(new OrbDragMessage(false)); return true; } @@ -58,6 +63,7 @@ namespace QSB.OrbSync.Patches { return true; } + var qsbOrb = __instance.GetWorldObject(); if (!qsbOrb.TransformSync.HasAuthority) { @@ -77,10 +83,12 @@ namespace QSB.OrbSync.Patches { __instance.CancelDrag(); } + if (__instance._orbAudio != null && slot.GetPlayActivationAudio()) { __instance._orbAudio.PlaySlotActivatedClip(); } + qsbOrb.SendMessage(new OrbSlotMessage(slotIndex)); break; } @@ -91,6 +99,7 @@ namespace QSB.OrbSync.Patches __instance._occupiedSlot = null; qsbOrb.SendMessage(new OrbSlotMessage(-1)); } + __instance._owCollider.SetActivation(__instance._occupiedSlot == null || !__instance._occupiedSlot.IsAttractive() || __instance._isBeingDragged); return false; diff --git a/QSB/OrbSync/TransformSync/NomaiOrbTransformSync.cs b/QSB/OrbSync/TransformSync/NomaiOrbTransformSync.cs index 155dc21f..3e737119 100644 --- a/QSB/OrbSync/TransformSync/NomaiOrbTransformSync.cs +++ b/QSB/OrbSync/TransformSync/NomaiOrbTransformSync.cs @@ -38,6 +38,7 @@ namespace QSB.OrbSync.TransformSync { NetIdentity.UnregisterAuthQueue(); } + _attachedBody.OnUnsuspendOWRigidbody -= OnUnsuspend; _attachedBody.OnSuspendOWRigidbody -= OnSuspend; } @@ -50,6 +51,7 @@ namespace QSB.OrbSync.TransformSync DebugLog.ToConsole($"Error - No orb at index {index}.", MessageType.Error); return; } + _qsbOrb = orb.GetWorldObject(); _qsbOrb.TransformSync = this; @@ -68,6 +70,7 @@ namespace QSB.OrbSync.TransformSync { NetIdentity.RegisterAuthQueue(); } + _attachedBody.OnUnsuspendOWRigidbody += OnUnsuspend; _attachedBody.OnSuspendOWRigidbody += OnSuspend; NetIdentity.SendAuthQueueMessage(_attachedBody.IsSuspended() ? AuthQueueAction.Remove : AuthQueueAction.Add); diff --git a/QSB/OrbSync/WorldObjects/QSBOrb.cs b/QSB/OrbSync/WorldObjects/QSBOrb.cs index 5def3f59..20565b18 100644 --- a/QSB/OrbSync/WorldObjects/QSBOrb.cs +++ b/QSB/OrbSync/WorldObjects/QSBOrb.cs @@ -83,6 +83,7 @@ namespace QSB.OrbSync.WorldObjects { AttachedObject.CancelDrag(); } + if (AttachedObject._orbAudio != null && newSlot.GetPlayActivationAudio()) { AttachedObject._orbAudio.PlaySlotActivatedClip(); diff --git a/QSB/Patches/QSBPatchManager.cs b/QSB/Patches/QSBPatchManager.cs index b4423ce1..a9e47dda 100644 --- a/QSB/Patches/QSBPatchManager.cs +++ b/QSB/Patches/QSBPatchManager.cs @@ -65,6 +65,7 @@ namespace QSB.Patches DebugLog.ToConsole($"Error while patching {patch.GetType().Name} :\r\n{ex}", MessageType.Error); } } + _patchedTypes.Add(type); } diff --git a/QSB/Player/Messages/EnterLeaveMessage.cs b/QSB/Player/Messages/EnterLeaveMessage.cs index 827616cd..3c133d99 100644 --- a/QSB/Player/Messages/EnterLeaveMessage.cs +++ b/QSB/Player/Messages/EnterLeaveMessage.cs @@ -30,7 +30,6 @@ namespace QSB.Player.Messages } } - private int ObjectId; public EnterLeaveMessage(EnterLeaveType type, int objectId = -1) diff --git a/QSB/StatueSync/Messages/StartStatueMessage.cs b/QSB/StatueSync/Messages/StartStatueMessage.cs index 5b1e1727..d373c088 100644 --- a/QSB/StatueSync/Messages/StartStatueMessage.cs +++ b/QSB/StatueSync/Messages/StartStatueMessage.cs @@ -35,7 +35,6 @@ namespace QSB.StatueSync.Messages CameraDegrees = reader.ReadSingle(); } - public override bool ShouldReceive => WorldObjectManager.AllObjectsReady; public override void OnReceiveLocal() diff --git a/QSB/Tools/TranslatorTool/TranslationSync/Patches/SpiralPatches.cs b/QSB/Tools/TranslatorTool/TranslationSync/Patches/SpiralPatches.cs index 122d4cb2..2bb0d0d3 100644 --- a/QSB/Tools/TranslatorTool/TranslationSync/Patches/SpiralPatches.cs +++ b/QSB/Tools/TranslatorTool/TranslationSync/Patches/SpiralPatches.cs @@ -19,6 +19,7 @@ namespace QSB.Tools.TranslatorTool.TranslationSync.Patches { return; } + if (__instance.IsTranslated(id)) { return; diff --git a/QSB/TornadoSync/Patches/TornadoPatches.cs b/QSB/TornadoSync/Patches/TornadoPatches.cs index 01335064..0aef1e11 100644 --- a/QSB/TornadoSync/Patches/TornadoPatches.cs +++ b/QSB/TornadoSync/Patches/TornadoPatches.cs @@ -37,6 +37,7 @@ namespace QSB.TornadoSync.Patches { __instance.UpdateFormation(); } + if (__instance._isSectorOccupied) { __instance.UpdateAnimation(); @@ -53,7 +54,6 @@ namespace QSB.TornadoSync.Patches return false; } - [HarmonyPrefix] [HarmonyPatch(typeof(TornadoController), nameof(TornadoController.OnEnterCollapseTrigger))] public static bool OnEnterCollapseTrigger(TornadoController __instance, diff --git a/QSB/TornadoSync/TornadoManager.cs b/QSB/TornadoSync/TornadoManager.cs index 85b865c8..f44bcee9 100644 --- a/QSB/TornadoSync/TornadoManager.cs +++ b/QSB/TornadoSync/TornadoManager.cs @@ -32,6 +32,7 @@ namespace QSB.TornadoSync { SpawnOccasional(proxy.transform.root.GetAttachedOWRigidbody(), gdBody); } + SpawnOccasional(cannon._probeBody, gdBody); // islands diff --git a/QSB/TornadoSync/TransformSync/OccasionalTransformSync.cs b/QSB/TornadoSync/TransformSync/OccasionalTransformSync.cs index 7fc16920..fac8a1f3 100644 --- a/QSB/TornadoSync/TransformSync/OccasionalTransformSync.cs +++ b/QSB/TornadoSync/TransformSync/OccasionalTransformSync.cs @@ -116,14 +116,17 @@ namespace QSB.TornadoSync.TransformSync { QueueMove(Locator._playerBody); } + if (_sectors.Contains(ShipTransformSync.LocalInstance?.ReferenceSector?.AttachedObject)) { QueueMove(Locator._shipBody); } + if (_sectors.Contains(PlayerProbeSync.LocalInstance?.ReferenceSector?.AttachedObject)) { QueueMove(Locator._probe._owRigidbody); } + foreach (var child in _childBodies) { QueueMove(child); @@ -140,7 +143,6 @@ namespace QSB.TornadoSync.TransformSync return true; } - private readonly List _toMove = new(); private struct MoveData @@ -186,6 +188,7 @@ namespace QSB.TornadoSync.TransformSync data.Child.SetVelocity(AttachedObject.FromRelVel(data.RelVel, pos)); data.Child.SetAngularVelocity(AttachedObject.FromRelAngVel(data.RelAngVel)); } + _toMove.Clear(); } } diff --git a/QSBTests/MessageTests.cs b/QSBTests/MessageTests.cs index f7c36a49..59e1df4c 100644 --- a/QSBTests/MessageTests.cs +++ b/QSBTests/MessageTests.cs @@ -37,6 +37,7 @@ namespace QSBTests { constructor.CheckUses(field, Util.UseType.Store); } + serialize.CheckUses(field, Util.UseType.Load); deserialize.CheckUses(field, Util.UseType.Store); } @@ -73,6 +74,7 @@ namespace QSBTests { UseType.Store => OpCodes.Stfld, UseType.Load => OpCodes.Ldfld, + _ => throw new System.NotImplementedException(), }; while (true) @@ -92,6 +94,7 @@ namespace QSBTests { break; } + var callBase = il.Any(x => x.IsOp(OpCodes.Call, out MethodReference m) && m.Eq(baseMethod) @@ -100,6 +103,7 @@ namespace QSBTests { break; } + method = baseMethod; } diff --git a/QuantumUNET/Transport/QNetworkHash128.cs b/QuantumUNET/Transport/QNetworkHash128.cs index d6329169..b3919298 100644 --- a/QuantumUNET/Transport/QNetworkHash128.cs +++ b/QuantumUNET/Transport/QNetworkHash128.cs @@ -66,6 +66,7 @@ namespace QuantumUNET.Transport { result = 0; } + return result; } @@ -79,8 +80,10 @@ namespace QuantumUNET.Transport { str += "0"; } + text = str + text; } + QNetworkHash128 result; result.i0 = (byte)(HexToNumber(text[0]) * 16 + HexToNumber(text[1])); result.i1 = (byte)(HexToNumber(text[2]) * 16 + HexToNumber(text[3])); From e0cf9a9d2d9393bdb39d26d5b91287353f4f6791 Mon Sep 17 00:00:00 2001 From: Will Corby Date: Sun, 2 Jan 2022 18:10:28 -0800 Subject: [PATCH 42/47] baba booey --- QSBTests/MessageTests.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/QSBTests/MessageTests.cs b/QSBTests/MessageTests.cs index 59e1df4c..4eefe65f 100644 --- a/QSBTests/MessageTests.cs +++ b/QSBTests/MessageTests.cs @@ -4,6 +4,7 @@ using Mono.Cecil.Cil; using Mono.Cecil.Rocks; using QSB.Messaging; using QSB.Utility; +using System; using System.Linq; using System.Reflection; @@ -74,7 +75,7 @@ namespace QSBTests { UseType.Store => OpCodes.Stfld, UseType.Load => OpCodes.Ldfld, - _ => throw new System.NotImplementedException(), + _ => throw new ArgumentOutOfRangeException(nameof(useType), useType, null) }; while (true) @@ -95,11 +96,11 @@ namespace QSBTests break; } - var callBase = il.Any(x => + var callsBase = il.Any(x => x.IsOp(OpCodes.Call, out MethodReference m) && m.Eq(baseMethod) ); - if (!callBase) + if (!callsBase) { break; } From b6e60fbbab981450c06167e73d42d4edfea68a49 Mon Sep 17 00:00:00 2001 From: Will Corby Date: Sun, 2 Jan 2022 18:45:46 -0800 Subject: [PATCH 43/47] use repel volume instead of game pause --- .../CosmicInflation/InflationManager.cs | 30 ++++++++++++------- .../EyeStateSync/Messages/EyeStateMessage.cs | 11 ------- QSB/TimeSync/WakeUpSync.cs | 8 ----- 3 files changed, 19 insertions(+), 30 deletions(-) diff --git a/QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs b/QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs index e66b70c7..fb259a67 100644 --- a/QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs +++ b/QSB/EyeOfTheUniverse/CosmicInflation/InflationManager.cs @@ -30,11 +30,14 @@ namespace QSB.EyeOfTheUniverse.CosmicInflation { _playersInFog.Remove(QSBPlayerManager.GetPlayer(id)); - // count - 1 because this happens right before player is actually removed - if (_playersInFog.Count == QSBPlayerManager.PlayerList.Count - 1) + // wait 1 frame for player to be removed + QSBCore.UnityEvents.FireOnNextUpdate(() => { - StartCollapse(); - } + if (QSBCore.IsInMultiplayer && _playersInFog.Count == QSBPlayerManager.PlayerList.Count) + { + StartCollapse(); + } + }); } protected override void RebuildWorldObjects(OWScene scene) @@ -60,14 +63,18 @@ namespace QSB.EyeOfTheUniverse.CosmicInflation _controller._probeDestroyTrigger.SetTriggerActivation(false); new EnterLeaveMessage(EnterLeaveType.EnterCosmicFog).Send(); - DebugLog.DebugWrite("pause, disable input, wait for other players to enter"); - + DebugLog.DebugWrite("disable input, wait for other players to enter"); + + var repelVolume = (WhiteHoleFluidVolume)_controller._repelVolume; + repelVolume._flowSpeed = -repelVolume._flowSpeed; + repelVolume._massiveFlowSpeed = -repelVolume._massiveFlowSpeed; + repelVolume.SetVolumeActivation(true); + QSBPlayerManager.HideAllPlayers(); + ReticleController.Hide(); Locator.GetFlashlight().TurnOff(false); Locator.GetPromptManager().SetPromptsVisible(false); OWInput.ChangeInputMode(InputMode.None); - - OWTime.SetTimeScale(0); } } @@ -89,9 +96,10 @@ namespace QSB.EyeOfTheUniverse.CosmicInflation private void StartCollapse() { - DebugLog.DebugWrite("unpause, fade in everyone, fog sphere collapse"); - - OWTime.SetTimeScale(1); + DebugLog.DebugWrite("fade in everyone, fog sphere collapse"); + + var repelVolume = (WhiteHoleFluidVolume)_controller._repelVolume; + repelVolume.SetVolumeActivation(false); QSBPlayerManager.ShowAllPlayers(); _controller._state = CosmicInflationController.State.Collapsing; diff --git a/QSB/EyeOfTheUniverse/EyeStateSync/Messages/EyeStateMessage.cs b/QSB/EyeOfTheUniverse/EyeStateSync/Messages/EyeStateMessage.cs index 17e3d059..7f93814b 100644 --- a/QSB/EyeOfTheUniverse/EyeStateSync/Messages/EyeStateMessage.cs +++ b/QSB/EyeOfTheUniverse/EyeStateSync/Messages/EyeStateMessage.cs @@ -1,7 +1,6 @@ using QSB.Messaging; using QSB.Player; using QSB.Player.TransformSync; -using QSB.TimeSync; using QSB.WorldSync; namespace QSB.EyeOfTheUniverse.EyeStateSync.Messages @@ -25,22 +24,12 @@ namespace QSB.EyeOfTheUniverse.EyeStateSync.Messages public override void OnReceiveLocal() { QSBPlayerManager.LocalPlayer.EyeState = Value; - - if (Value >= EyeState.ForestIsDark) - { - WakeUpSync.LocalInstance.EyeDisable = true; - } } public override void OnReceiveRemote() { var player = QSBPlayerManager.GetPlayer(From); player.EyeState = Value; - - if (Value >= EyeState.ForestIsDark) - { - WakeUpSync.LocalInstance.EyeDisable = true; - } } } } \ No newline at end of file diff --git a/QSB/TimeSync/WakeUpSync.cs b/QSB/TimeSync/WakeUpSync.cs index c8d95164..31b27ff9 100644 --- a/QSB/TimeSync/WakeUpSync.cs +++ b/QSB/TimeSync/WakeUpSync.cs @@ -34,8 +34,6 @@ namespace QSB.TimeSync private int _serverLoopCount; private bool _hasWokenUp; - public bool EyeDisable; - public override void OnStartLocalPlayer() => LocalInstance = this; public void OnDisconnect() @@ -254,12 +252,6 @@ namespace QSB.TimeSync { UpdateClient(); } - - if (EyeDisable) - { - OnDisconnect(); - enabled = false; - } } private void UpdateServer() From 306b3013c7057cf9d4046d9c5c30e799b5159607 Mon Sep 17 00:00:00 2001 From: Will Corby Date: Sun, 2 Jan 2022 21:10:12 -0800 Subject: [PATCH 44/47] cleanup quantum authority --- .../Messages/RequestStateResyncMessage.cs | 2 +- .../Messages/QuantumAuthorityMessage.cs | 52 ++++++++++++------ QSB/QuantumSync/Patches/QuantumPatches.cs | 53 ++++++++++--------- QSB/QuantumSync/QuantumManager.cs | 16 ++---- .../WorldObjects/QSBQuantumObject.cs | 42 +++++---------- QSB/Utility/DebugGUI.cs | 2 +- 6 files changed, 84 insertions(+), 83 deletions(-) diff --git a/QSB/Player/Messages/RequestStateResyncMessage.cs b/QSB/Player/Messages/RequestStateResyncMessage.cs index 8c927f12..e05578af 100644 --- a/QSB/Player/Messages/RequestStateResyncMessage.cs +++ b/QSB/Player/Messages/RequestStateResyncMessage.cs @@ -99,7 +99,7 @@ namespace QSB.Player.Messages QSBWorldSync.GetWorldObjects().ForEach(x => { - x.SendMessage(new QuantumAuthorityMessage(x.ControllingPlayer) { To = From }); + x.SendMessage(new QuantumAuthorityMessage(x.ControllingPlayer, true) { To = From }); if (x is QSBQuantumMoon qsbQuantumMoon) { diff --git a/QSB/QuantumSync/Messages/QuantumAuthorityMessage.cs b/QSB/QuantumSync/Messages/QuantumAuthorityMessage.cs index cf75e73d..ae6f8779 100644 --- a/QSB/QuantumSync/Messages/QuantumAuthorityMessage.cs +++ b/QSB/QuantumSync/Messages/QuantumAuthorityMessage.cs @@ -7,20 +7,32 @@ namespace QSB.QuantumSync.Messages { public class QuantumAuthorityMessage : QSBWorldObjectMessage { - private uint AuthorityOwner; + private uint ControllingPlayer; + /// + /// if true, force sets controlling player, + /// without checking current controlling player + /// or checking for other potential controllers + /// + private bool Force; - public QuantumAuthorityMessage(uint authorityOwner) => AuthorityOwner = authorityOwner; + public QuantumAuthorityMessage(uint controllingPlayer, bool force) + { + ControllingPlayer = controllingPlayer; + Force = force; + } public override void Serialize(QNetworkWriter writer) { base.Serialize(writer); - writer.Write(AuthorityOwner); + writer.Write(ControllingPlayer); + writer.Write(Force); } public override void Deserialize(QNetworkReader reader) { base.Deserialize(reader); - AuthorityOwner = reader.ReadUInt32(); + ControllingPlayer = reader.ReadUInt32(); + Force = reader.ReadBoolean(); } public override bool ShouldReceive @@ -32,28 +44,34 @@ namespace QSB.QuantumSync.Messages return false; } - // Deciding if to change the object's owner - // Message - // | = 0 | > 0 | - // = 0 | No | Yes | - // > 0 | Yes | No | - // if Obj==Message then No - // Obj + if (WorldObject.ControllingPlayer == ControllingPlayer) + { + return false; + } - return (WorldObject.ControllingPlayer == 0 || AuthorityOwner == 0) - && WorldObject.ControllingPlayer != AuthorityOwner; + if (Force) + { + return true; + } + + if (ControllingPlayer == uint.MaxValue) + { + return true; + } + + return WorldObject.ControllingPlayer == uint.MaxValue; } } - public override void OnReceiveLocal() => WorldObject.ControllingPlayer = AuthorityOwner; + public override void OnReceiveLocal() => WorldObject.ControllingPlayer = ControllingPlayer; public override void OnReceiveRemote() { - WorldObject.ControllingPlayer = AuthorityOwner; - if (WorldObject.ControllingPlayer == 00 && WorldObject.IsEnabled) + WorldObject.ControllingPlayer = ControllingPlayer; + if (!Force && ControllingPlayer == uint.MaxValue && WorldObject.IsEnabled) { // object has no owner, but is still active for this player. request ownership - WorldObject.SendMessage(new QuantumAuthorityMessage(QSBPlayerManager.LocalPlayerId)); + WorldObject.SendMessage(new QuantumAuthorityMessage(QSBPlayerManager.LocalPlayerId, false)); } } } diff --git a/QSB/QuantumSync/Patches/QuantumPatches.cs b/QSB/QuantumSync/Patches/QuantumPatches.cs index f1b99f60..70b8387d 100644 --- a/QSB/QuantumSync/Patches/QuantumPatches.cs +++ b/QSB/QuantumSync/Patches/QuantumPatches.cs @@ -23,7 +23,12 @@ namespace QSB.QuantumSync.Patches [HarmonyPatch(typeof(QuantumObject), nameof(QuantumObject.IsLockedByPlayerContact))] public static bool QuantumObject_IsLockedByPlayerContact(ref bool __result, QuantumObject __instance) { - var playersEntangled = QuantumManager.GetEntangledPlayers(__instance); + if (!WorldObjectManager.AllObjectsReady) + { + return true; + } + + var playersEntangled = QuantumManager.GetEntangledPlayers(__instance.GetWorldObject()); __result = playersEntangled.Count() != 0 && __instance.IsIlluminated(); return false; } @@ -35,13 +40,15 @@ namespace QSB.QuantumSync.Patches ref bool __result, bool skipInstantVisibilityCheck) { - if (WorldObjectManager.AllObjectsReady) + if (!WorldObjectManager.AllObjectsReady) { - var socketedWorldObject = __instance.GetWorldObject(); - if (socketedWorldObject.ControllingPlayer != QSBPlayerManager.LocalPlayerId) - { - return false; - } + return true; + } + + var socketedQuantumObject = __instance.GetWorldObject(); + if (socketedQuantumObject.ControllingPlayer != QSBPlayerManager.LocalPlayerId) + { + return false; } foreach (var socket in __instance._childSockets) @@ -97,7 +104,7 @@ namespace QSB.QuantumSync.Patches bool socketNotSuitable; var isSocketIlluminated = __instance.CheckIllumination(); - var playersEntangled = QuantumManager.GetEntangledPlayers(__instance); + var playersEntangled = QuantumManager.GetEntangledPlayers(socketedQuantumObject); if (playersEntangled.Count() != 0) { // socket not suitable if illuminated @@ -176,14 +183,15 @@ namespace QSB.QuantumSync.Patches QuantumShuffleObject __instance, ref bool __result) { - QSBQuantumShuffleObject shuffleWorldObject = default; - if (WorldObjectManager.AllObjectsReady) + if (!WorldObjectManager.AllObjectsReady) { - shuffleWorldObject = __instance.GetWorldObject(); - if (shuffleWorldObject.ControllingPlayer != QSBPlayerManager.LocalPlayerId) - { - return false; - } + return true; + } + + var shuffleWorldObject = __instance.GetWorldObject(); + if (shuffleWorldObject.ControllingPlayer != QSBPlayerManager.LocalPlayerId) + { + return false; } __instance._indexList.Clear(); @@ -201,11 +209,8 @@ namespace QSB.QuantumSync.Patches __instance._shuffledObjects[j].localPosition = __instance._localPositions[__instance._indexList[j]]; } - if (WorldObjectManager.AllObjectsReady) - { - shuffleWorldObject.SendMessage(new QuantumShuffleMessage(__instance._indexList.ToArray())); - __result = true; - } + shuffleWorldObject.SendMessage(new QuantumShuffleMessage(__instance._indexList.ToArray())); + __result = true; return false; } @@ -220,7 +225,7 @@ namespace QSB.QuantumSync.Patches } var qsbObj = __instance.GetWorldObject(); - if (qsbObj.ControllingPlayer == 0) + if (qsbObj.ControllingPlayer == uint.MaxValue) { return true; } @@ -256,7 +261,7 @@ namespace QSB.QuantumSync.Patches } var qsbObj = __instance.GetWorldObject(); - if (qsbObj.ControllingPlayer == 0 && qsbObj.CurrentState == -1) + if (qsbObj.ControllingPlayer == uint.MaxValue && qsbObj.CurrentState == -1) { return true; } @@ -331,8 +336,8 @@ namespace QSB.QuantumSync.Patches } if (QSBPlayerManager.LocalPlayer != null - && QSBPlayerManager.LocalPlayer.IsInShrine - && PlayerState.IsFlashlightOn()) + && QSBPlayerManager.LocalPlayer.IsInShrine + && PlayerState.IsFlashlightOn()) { __result = false; return false; diff --git a/QSB/QuantumSync/QuantumManager.cs b/QSB/QuantumSync/QuantumManager.cs index 30501ae4..78de4134 100644 --- a/QSB/QuantumSync/QuantumManager.cs +++ b/QSB/QuantumSync/QuantumManager.cs @@ -57,7 +57,7 @@ namespace QSB.QuantumSync { if (obj.ControllingPlayer == playerId) { - obj.SendMessage(new QuantumAuthorityMessage(obj.IsEnabled ? QSBPlayerManager.LocalPlayerId : 0u)); + obj.SendMessage(new QuantumAuthorityMessage(obj.IsEnabled ? QSBPlayerManager.LocalPlayerId : uint.MaxValue, false)); } } } @@ -76,7 +76,7 @@ namespace QSB.QuantumSync foreach (var quantumObject in QSBWorldSync.GetWorldObjects()) { - if (quantumObject.ControllingPlayer == 0) + if (quantumObject.ControllingPlayer == uint.MaxValue) { if (quantumObject.IsEnabled) { @@ -139,15 +139,7 @@ namespace QSB.QuantumSync && QSBPlayerManager.GetPlayersWithCameras(!ignoreLocalCamera) .Any(x => VisibilityOccluder.CanYouSee(tracker, x.Camera.mainCamera.transform.position)); - public static IEnumerable GetEntangledPlayers(QuantumObject obj) - { - if (!AllObjectsReady) - { - return Enumerable.Empty(); - } - - var worldObj = obj.GetWorldObject(); - return QSBPlayerManager.PlayerList.Where(x => x.EntangledObject == worldObj); - } + public static IEnumerable GetEntangledPlayers(IQSBQuantumObject obj) => + QSBPlayerManager.PlayerList.Where(x => x.EntangledObject == obj); } } \ No newline at end of file diff --git a/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs b/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs index f13c2bf1..fdb1f31a 100644 --- a/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs +++ b/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs @@ -13,7 +13,7 @@ namespace QSB.QuantumSync.WorldObjects internal abstract class QSBQuantumObject : WorldObject, IQSBQuantumObject where T : QuantumObject { - public uint ControllingPlayer { get; set; } + public uint ControllingPlayer { get; set; } = uint.MaxValue; public bool IsEnabled { get; set; } public override void OnRemoval() @@ -25,7 +25,7 @@ namespace QSB.QuantumSync.WorldObjects } } - public override bool ShouldDisplayLabel() => ControllingPlayer != 0; + public override bool ShouldDisplayLabel() => ControllingPlayer != uint.MaxValue; public override void Init() { @@ -60,7 +60,7 @@ namespace QSB.QuantumSync.WorldObjects { if (shape is BoxShape boxShape) { - var newCube = UnityEngine.Object.Instantiate(cube); + var newCube = Object.Instantiate(cube); newCube.transform.parent = shape.transform; newCube.transform.localPosition = Vector3.zero; newCube.transform.localRotation = Quaternion.Euler(0, 0, 0); @@ -68,7 +68,7 @@ namespace QSB.QuantumSync.WorldObjects } else if (shape is SphereShape sphereShape) { - var newSphere = UnityEngine.Object.Instantiate(sphere); + var newSphere = Object.Instantiate(sphere); newSphere.transform.parent = shape.transform; newSphere.transform.localPosition = Vector3.zero; newSphere.transform.localRotation = Quaternion.Euler(0, 0, 0); @@ -92,28 +92,23 @@ namespace QSB.QuantumSync.WorldObjects private void LateInit() { FinishDelayedReady(); - foreach (var shape in GetAttachedShapes()) + var attachedShapes = GetAttachedShapes(); + foreach (var shape in attachedShapes) { shape.OnShapeActivated += OnEnable; shape.OnShapeDeactivated += OnDisable; } - var attachedShapes = GetAttachedShapes(); + var enable = attachedShapes.Count != 0 && + attachedShapes.All(x => x.enabled && x.gameObject.activeInHierarchy && x.active); - if (attachedShapes.Count == 0) + if (enable) { - IsEnabled = false; - return; - } - - if (attachedShapes.All(x => x.enabled && x.gameObject.activeInHierarchy && x.active)) - { - IsEnabled = true; + OnEnable(null); } else { - ControllingPlayer = 0u; - IsEnabled = false; + OnDisable(null); } } @@ -165,19 +160,15 @@ namespace QSB.QuantumSync.WorldObjects } IsEnabled = true; - if (!WorldObjectManager.AllObjectsReady && !QSBCore.IsHost) - { - return; - } - if (ControllingPlayer != 0) + if (ControllingPlayer != uint.MaxValue) { // controlled by another player, dont care that we activate it return; } // no one is controlling this object right now, request authority - ((IQSBQuantumObject)this).SendMessage(new QuantumAuthorityMessage(QSBPlayerManager.LocalPlayerId)); + ((IQSBQuantumObject)this).SendMessage(new QuantumAuthorityMessage(QSBPlayerManager.LocalPlayerId, false)); } private void OnDisable(Shape s) @@ -193,10 +184,6 @@ namespace QSB.QuantumSync.WorldObjects } IsEnabled = false; - if (!WorldObjectManager.AllObjectsReady && !QSBCore.IsHost) - { - return; - } if (ControllingPlayer != QSBPlayerManager.LocalPlayerId) { @@ -204,9 +191,8 @@ namespace QSB.QuantumSync.WorldObjects return; } - var id = ObjectId; // send event to other players that we're releasing authority - ((IQSBQuantumObject)this).SendMessage(new QuantumAuthorityMessage(0u)); + ((IQSBQuantumObject)this).SendMessage(new QuantumAuthorityMessage(uint.MaxValue, false)); } } } diff --git a/QSB/Utility/DebugGUI.cs b/QSB/Utility/DebugGUI.cs index 60e34f24..8a3a46f5 100644 --- a/QSB/Utility/DebugGUI.cs +++ b/QSB/Utility/DebugGUI.cs @@ -247,7 +247,7 @@ namespace QSB.Utility WriteLine(4, $"Enabled QuantumObjects :"); foreach (var qo in QSBWorldSync.GetWorldObjects()) { - if (qo.ControllingPlayer != 0) + if (qo.ControllingPlayer != uint.MaxValue) { continue; } From 3a6a3240e6b76d1f923af6cea9d0bbc6da9d6648 Mon Sep 17 00:00:00 2001 From: Will Corby Date: Sun, 2 Jan 2022 21:26:52 -0800 Subject: [PATCH 45/47] Revert "cleanup quantum authority" This reverts commit 306b3013c7057cf9d4046d9c5c30e799b5159607. --- .../Messages/RequestStateResyncMessage.cs | 2 +- .../Messages/QuantumAuthorityMessage.cs | 52 ++++++------------ QSB/QuantumSync/Patches/QuantumPatches.cs | 53 +++++++++---------- QSB/QuantumSync/QuantumManager.cs | 16 ++++-- .../WorldObjects/QSBQuantumObject.cs | 42 ++++++++++----- QSB/Utility/DebugGUI.cs | 2 +- 6 files changed, 83 insertions(+), 84 deletions(-) diff --git a/QSB/Player/Messages/RequestStateResyncMessage.cs b/QSB/Player/Messages/RequestStateResyncMessage.cs index e05578af..8c927f12 100644 --- a/QSB/Player/Messages/RequestStateResyncMessage.cs +++ b/QSB/Player/Messages/RequestStateResyncMessage.cs @@ -99,7 +99,7 @@ namespace QSB.Player.Messages QSBWorldSync.GetWorldObjects().ForEach(x => { - x.SendMessage(new QuantumAuthorityMessage(x.ControllingPlayer, true) { To = From }); + x.SendMessage(new QuantumAuthorityMessage(x.ControllingPlayer) { To = From }); if (x is QSBQuantumMoon qsbQuantumMoon) { diff --git a/QSB/QuantumSync/Messages/QuantumAuthorityMessage.cs b/QSB/QuantumSync/Messages/QuantumAuthorityMessage.cs index ae6f8779..cf75e73d 100644 --- a/QSB/QuantumSync/Messages/QuantumAuthorityMessage.cs +++ b/QSB/QuantumSync/Messages/QuantumAuthorityMessage.cs @@ -7,32 +7,20 @@ namespace QSB.QuantumSync.Messages { public class QuantumAuthorityMessage : QSBWorldObjectMessage { - private uint ControllingPlayer; - /// - /// if true, force sets controlling player, - /// without checking current controlling player - /// or checking for other potential controllers - /// - private bool Force; + private uint AuthorityOwner; - public QuantumAuthorityMessage(uint controllingPlayer, bool force) - { - ControllingPlayer = controllingPlayer; - Force = force; - } + public QuantumAuthorityMessage(uint authorityOwner) => AuthorityOwner = authorityOwner; public override void Serialize(QNetworkWriter writer) { base.Serialize(writer); - writer.Write(ControllingPlayer); - writer.Write(Force); + writer.Write(AuthorityOwner); } public override void Deserialize(QNetworkReader reader) { base.Deserialize(reader); - ControllingPlayer = reader.ReadUInt32(); - Force = reader.ReadBoolean(); + AuthorityOwner = reader.ReadUInt32(); } public override bool ShouldReceive @@ -44,34 +32,28 @@ namespace QSB.QuantumSync.Messages return false; } - if (WorldObject.ControllingPlayer == ControllingPlayer) - { - return false; - } + // Deciding if to change the object's owner + // Message + // | = 0 | > 0 | + // = 0 | No | Yes | + // > 0 | Yes | No | + // if Obj==Message then No + // Obj - if (Force) - { - return true; - } - - if (ControllingPlayer == uint.MaxValue) - { - return true; - } - - return WorldObject.ControllingPlayer == uint.MaxValue; + return (WorldObject.ControllingPlayer == 0 || AuthorityOwner == 0) + && WorldObject.ControllingPlayer != AuthorityOwner; } } - public override void OnReceiveLocal() => WorldObject.ControllingPlayer = ControllingPlayer; + public override void OnReceiveLocal() => WorldObject.ControllingPlayer = AuthorityOwner; public override void OnReceiveRemote() { - WorldObject.ControllingPlayer = ControllingPlayer; - if (!Force && ControllingPlayer == uint.MaxValue && WorldObject.IsEnabled) + WorldObject.ControllingPlayer = AuthorityOwner; + if (WorldObject.ControllingPlayer == 00 && WorldObject.IsEnabled) { // object has no owner, but is still active for this player. request ownership - WorldObject.SendMessage(new QuantumAuthorityMessage(QSBPlayerManager.LocalPlayerId, false)); + WorldObject.SendMessage(new QuantumAuthorityMessage(QSBPlayerManager.LocalPlayerId)); } } } diff --git a/QSB/QuantumSync/Patches/QuantumPatches.cs b/QSB/QuantumSync/Patches/QuantumPatches.cs index 70b8387d..f1b99f60 100644 --- a/QSB/QuantumSync/Patches/QuantumPatches.cs +++ b/QSB/QuantumSync/Patches/QuantumPatches.cs @@ -23,12 +23,7 @@ namespace QSB.QuantumSync.Patches [HarmonyPatch(typeof(QuantumObject), nameof(QuantumObject.IsLockedByPlayerContact))] public static bool QuantumObject_IsLockedByPlayerContact(ref bool __result, QuantumObject __instance) { - if (!WorldObjectManager.AllObjectsReady) - { - return true; - } - - var playersEntangled = QuantumManager.GetEntangledPlayers(__instance.GetWorldObject()); + var playersEntangled = QuantumManager.GetEntangledPlayers(__instance); __result = playersEntangled.Count() != 0 && __instance.IsIlluminated(); return false; } @@ -40,15 +35,13 @@ namespace QSB.QuantumSync.Patches ref bool __result, bool skipInstantVisibilityCheck) { - if (!WorldObjectManager.AllObjectsReady) + if (WorldObjectManager.AllObjectsReady) { - return true; - } - - var socketedQuantumObject = __instance.GetWorldObject(); - if (socketedQuantumObject.ControllingPlayer != QSBPlayerManager.LocalPlayerId) - { - return false; + var socketedWorldObject = __instance.GetWorldObject(); + if (socketedWorldObject.ControllingPlayer != QSBPlayerManager.LocalPlayerId) + { + return false; + } } foreach (var socket in __instance._childSockets) @@ -104,7 +97,7 @@ namespace QSB.QuantumSync.Patches bool socketNotSuitable; var isSocketIlluminated = __instance.CheckIllumination(); - var playersEntangled = QuantumManager.GetEntangledPlayers(socketedQuantumObject); + var playersEntangled = QuantumManager.GetEntangledPlayers(__instance); if (playersEntangled.Count() != 0) { // socket not suitable if illuminated @@ -183,15 +176,14 @@ namespace QSB.QuantumSync.Patches QuantumShuffleObject __instance, ref bool __result) { - if (!WorldObjectManager.AllObjectsReady) + QSBQuantumShuffleObject shuffleWorldObject = default; + if (WorldObjectManager.AllObjectsReady) { - return true; - } - - var shuffleWorldObject = __instance.GetWorldObject(); - if (shuffleWorldObject.ControllingPlayer != QSBPlayerManager.LocalPlayerId) - { - return false; + shuffleWorldObject = __instance.GetWorldObject(); + if (shuffleWorldObject.ControllingPlayer != QSBPlayerManager.LocalPlayerId) + { + return false; + } } __instance._indexList.Clear(); @@ -209,8 +201,11 @@ namespace QSB.QuantumSync.Patches __instance._shuffledObjects[j].localPosition = __instance._localPositions[__instance._indexList[j]]; } - shuffleWorldObject.SendMessage(new QuantumShuffleMessage(__instance._indexList.ToArray())); - __result = true; + if (WorldObjectManager.AllObjectsReady) + { + shuffleWorldObject.SendMessage(new QuantumShuffleMessage(__instance._indexList.ToArray())); + __result = true; + } return false; } @@ -225,7 +220,7 @@ namespace QSB.QuantumSync.Patches } var qsbObj = __instance.GetWorldObject(); - if (qsbObj.ControllingPlayer == uint.MaxValue) + if (qsbObj.ControllingPlayer == 0) { return true; } @@ -261,7 +256,7 @@ namespace QSB.QuantumSync.Patches } var qsbObj = __instance.GetWorldObject(); - if (qsbObj.ControllingPlayer == uint.MaxValue && qsbObj.CurrentState == -1) + if (qsbObj.ControllingPlayer == 0 && qsbObj.CurrentState == -1) { return true; } @@ -336,8 +331,8 @@ namespace QSB.QuantumSync.Patches } if (QSBPlayerManager.LocalPlayer != null - && QSBPlayerManager.LocalPlayer.IsInShrine - && PlayerState.IsFlashlightOn()) + && QSBPlayerManager.LocalPlayer.IsInShrine + && PlayerState.IsFlashlightOn()) { __result = false; return false; diff --git a/QSB/QuantumSync/QuantumManager.cs b/QSB/QuantumSync/QuantumManager.cs index 78de4134..30501ae4 100644 --- a/QSB/QuantumSync/QuantumManager.cs +++ b/QSB/QuantumSync/QuantumManager.cs @@ -57,7 +57,7 @@ namespace QSB.QuantumSync { if (obj.ControllingPlayer == playerId) { - obj.SendMessage(new QuantumAuthorityMessage(obj.IsEnabled ? QSBPlayerManager.LocalPlayerId : uint.MaxValue, false)); + obj.SendMessage(new QuantumAuthorityMessage(obj.IsEnabled ? QSBPlayerManager.LocalPlayerId : 0u)); } } } @@ -76,7 +76,7 @@ namespace QSB.QuantumSync foreach (var quantumObject in QSBWorldSync.GetWorldObjects()) { - if (quantumObject.ControllingPlayer == uint.MaxValue) + if (quantumObject.ControllingPlayer == 0) { if (quantumObject.IsEnabled) { @@ -139,7 +139,15 @@ namespace QSB.QuantumSync && QSBPlayerManager.GetPlayersWithCameras(!ignoreLocalCamera) .Any(x => VisibilityOccluder.CanYouSee(tracker, x.Camera.mainCamera.transform.position)); - public static IEnumerable GetEntangledPlayers(IQSBQuantumObject obj) => - QSBPlayerManager.PlayerList.Where(x => x.EntangledObject == obj); + public static IEnumerable GetEntangledPlayers(QuantumObject obj) + { + if (!AllObjectsReady) + { + return Enumerable.Empty(); + } + + var worldObj = obj.GetWorldObject(); + return QSBPlayerManager.PlayerList.Where(x => x.EntangledObject == worldObj); + } } } \ No newline at end of file diff --git a/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs b/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs index fdb1f31a..f13c2bf1 100644 --- a/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs +++ b/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs @@ -13,7 +13,7 @@ namespace QSB.QuantumSync.WorldObjects internal abstract class QSBQuantumObject : WorldObject, IQSBQuantumObject where T : QuantumObject { - public uint ControllingPlayer { get; set; } = uint.MaxValue; + public uint ControllingPlayer { get; set; } public bool IsEnabled { get; set; } public override void OnRemoval() @@ -25,7 +25,7 @@ namespace QSB.QuantumSync.WorldObjects } } - public override bool ShouldDisplayLabel() => ControllingPlayer != uint.MaxValue; + public override bool ShouldDisplayLabel() => ControllingPlayer != 0; public override void Init() { @@ -60,7 +60,7 @@ namespace QSB.QuantumSync.WorldObjects { if (shape is BoxShape boxShape) { - var newCube = Object.Instantiate(cube); + var newCube = UnityEngine.Object.Instantiate(cube); newCube.transform.parent = shape.transform; newCube.transform.localPosition = Vector3.zero; newCube.transform.localRotation = Quaternion.Euler(0, 0, 0); @@ -68,7 +68,7 @@ namespace QSB.QuantumSync.WorldObjects } else if (shape is SphereShape sphereShape) { - var newSphere = Object.Instantiate(sphere); + var newSphere = UnityEngine.Object.Instantiate(sphere); newSphere.transform.parent = shape.transform; newSphere.transform.localPosition = Vector3.zero; newSphere.transform.localRotation = Quaternion.Euler(0, 0, 0); @@ -92,23 +92,28 @@ namespace QSB.QuantumSync.WorldObjects private void LateInit() { FinishDelayedReady(); - var attachedShapes = GetAttachedShapes(); - foreach (var shape in attachedShapes) + foreach (var shape in GetAttachedShapes()) { shape.OnShapeActivated += OnEnable; shape.OnShapeDeactivated += OnDisable; } - var enable = attachedShapes.Count != 0 && - attachedShapes.All(x => x.enabled && x.gameObject.activeInHierarchy && x.active); + var attachedShapes = GetAttachedShapes(); - if (enable) + if (attachedShapes.Count == 0) { - OnEnable(null); + IsEnabled = false; + return; + } + + if (attachedShapes.All(x => x.enabled && x.gameObject.activeInHierarchy && x.active)) + { + IsEnabled = true; } else { - OnDisable(null); + ControllingPlayer = 0u; + IsEnabled = false; } } @@ -160,15 +165,19 @@ namespace QSB.QuantumSync.WorldObjects } IsEnabled = true; + if (!WorldObjectManager.AllObjectsReady && !QSBCore.IsHost) + { + return; + } - if (ControllingPlayer != uint.MaxValue) + if (ControllingPlayer != 0) { // controlled by another player, dont care that we activate it return; } // no one is controlling this object right now, request authority - ((IQSBQuantumObject)this).SendMessage(new QuantumAuthorityMessage(QSBPlayerManager.LocalPlayerId, false)); + ((IQSBQuantumObject)this).SendMessage(new QuantumAuthorityMessage(QSBPlayerManager.LocalPlayerId)); } private void OnDisable(Shape s) @@ -184,6 +193,10 @@ namespace QSB.QuantumSync.WorldObjects } IsEnabled = false; + if (!WorldObjectManager.AllObjectsReady && !QSBCore.IsHost) + { + return; + } if (ControllingPlayer != QSBPlayerManager.LocalPlayerId) { @@ -191,8 +204,9 @@ namespace QSB.QuantumSync.WorldObjects return; } + var id = ObjectId; // send event to other players that we're releasing authority - ((IQSBQuantumObject)this).SendMessage(new QuantumAuthorityMessage(uint.MaxValue, false)); + ((IQSBQuantumObject)this).SendMessage(new QuantumAuthorityMessage(0u)); } } } diff --git a/QSB/Utility/DebugGUI.cs b/QSB/Utility/DebugGUI.cs index 8a3a46f5..60e34f24 100644 --- a/QSB/Utility/DebugGUI.cs +++ b/QSB/Utility/DebugGUI.cs @@ -247,7 +247,7 @@ namespace QSB.Utility WriteLine(4, $"Enabled QuantumObjects :"); foreach (var qo in QSBWorldSync.GetWorldObjects()) { - if (qo.ControllingPlayer != uint.MaxValue) + if (qo.ControllingPlayer != 0) { continue; } From 58e1c70c3352ca36055561833dc20049da9d8508 Mon Sep 17 00:00:00 2001 From: Will Corby Date: Sun, 2 Jan 2022 23:53:38 -0800 Subject: [PATCH 46/47] slight slight cleanup --- QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs b/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs index f13c2bf1..3368f771 100644 --- a/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs +++ b/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs @@ -60,7 +60,7 @@ namespace QSB.QuantumSync.WorldObjects { if (shape is BoxShape boxShape) { - var newCube = UnityEngine.Object.Instantiate(cube); + var newCube = Object.Instantiate(cube); newCube.transform.parent = shape.transform; newCube.transform.localPosition = Vector3.zero; newCube.transform.localRotation = Quaternion.Euler(0, 0, 0); @@ -68,7 +68,7 @@ namespace QSB.QuantumSync.WorldObjects } else if (shape is SphereShape sphereShape) { - var newSphere = UnityEngine.Object.Instantiate(sphere); + var newSphere = Object.Instantiate(sphere); newSphere.transform.parent = shape.transform; newSphere.transform.localPosition = Vector3.zero; newSphere.transform.localRotation = Quaternion.Euler(0, 0, 0); @@ -204,7 +204,6 @@ namespace QSB.QuantumSync.WorldObjects return; } - var id = ObjectId; // send event to other players that we're releasing authority ((IQSBQuantumObject)this).SendMessage(new QuantumAuthorityMessage(0u)); } From b1a4b357d5153a0ba57e176bbb4d667c7b32e24f Mon Sep 17 00:00:00 2001 From: Will Corby Date: Mon, 3 Jan 2022 00:15:57 -0800 Subject: [PATCH 47/47] wait a frame --- .../WorldObjects/QSBQuantumObject.cs | 46 ++++++++++--------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs b/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs index 3368f771..a1826a0b 100644 --- a/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs +++ b/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs @@ -180,32 +180,34 @@ namespace QSB.QuantumSync.WorldObjects ((IQSBQuantumObject)this).SendMessage(new QuantumAuthorityMessage(QSBPlayerManager.LocalPlayerId)); } - private void OnDisable(Shape s) - { - if (!IsEnabled) + private void OnDisable(Shape s) => + // we wait a frame here in case the shapes get disabled as we switch from 1 visibility tracker to another + QSBCore.UnityEvents.FireOnNextUpdate(() => { - return; - } + if (!IsEnabled) + { + return; + } - if (GetAttachedShapes().Any(x => x.isActiveAndEnabled)) - { - return; - } + if (GetAttachedShapes().Any(x => x.isActiveAndEnabled)) + { + return; + } - IsEnabled = false; - if (!WorldObjectManager.AllObjectsReady && !QSBCore.IsHost) - { - return; - } + IsEnabled = false; + if (!WorldObjectManager.AllObjectsReady && !QSBCore.IsHost) + { + return; + } - if (ControllingPlayer != QSBPlayerManager.LocalPlayerId) - { - // not being controlled by us, don't care if we leave area - return; - } + if (ControllingPlayer != QSBPlayerManager.LocalPlayerId) + { + // not being controlled by us, don't care if we leave area + return; + } - // send event to other players that we're releasing authority - ((IQSBQuantumObject)this).SendMessage(new QuantumAuthorityMessage(0u)); - } + // send event to other players that we're releasing authority + ((IQSBQuantumObject)this).SendMessage(new QuantumAuthorityMessage(0u)); + }); } }