From 9e166b34fe5c88c8f78262531d8ae7cda196ed21 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Sun, 13 Mar 2022 21:44:04 +0000 Subject: [PATCH] change some stuff aaaaa (extract out init code into QSBWorldSync) --- .../AirlockSync/AirlockManager.cs | 6 +++- .../VariableSync/AirlockVariableSyncer.cs | 13 ++++++++ .../WorldObjects/QSBGhostAirlock.cs | 11 ++++--- .../EclipseDoors/DoorManager.cs | 25 ++------------ .../EclipseElevatorManager.cs | 26 +-------------- .../VariableSync/VariableSyncStorage.cs | 12 +++++++ .../VariableSync/WorldObjectVariableSyncer.cs | 19 +++-------- QSB/WorldSync/QSBWorldSync.cs | 33 +++++++++++++++++++ QSB/WorldSync/VariableSyncedWorldObject.cs | 2 +- 9 files changed, 79 insertions(+), 68 deletions(-) create mode 100644 QSB/EchoesOfTheEye/AirlockSync/VariableSync/AirlockVariableSyncer.cs create mode 100644 QSB/Utility/VariableSync/VariableSyncStorage.cs diff --git a/QSB/EchoesOfTheEye/AirlockSync/AirlockManager.cs b/QSB/EchoesOfTheEye/AirlockSync/AirlockManager.cs index d1c5613d..1ce22464 100644 --- a/QSB/EchoesOfTheEye/AirlockSync/AirlockManager.cs +++ b/QSB/EchoesOfTheEye/AirlockSync/AirlockManager.cs @@ -1,4 +1,5 @@ using Cysharp.Threading.Tasks; +using QSB.EchoesOfTheEye.AirlockSync.VariableSync; using QSB.EchoesOfTheEye.AirlockSync.WorldObjects; using QSB.WorldSync; using System.Threading; @@ -10,5 +11,8 @@ internal class AirlockManager : WorldObjectManager public override WorldObjectScene WorldObjectScene => WorldObjectScene.SolarSystem; public override bool DlcOnly => true; - public override async UniTask BuildWorldObjects(OWScene scene, CancellationToken ct) => QSBWorldSync.Init(); + public override async UniTask BuildWorldObjects(OWScene scene, CancellationToken ct) + { + await QSBWorldSync.InitWithVariableSync(ct); + } } \ No newline at end of file diff --git a/QSB/EchoesOfTheEye/AirlockSync/VariableSync/AirlockVariableSyncer.cs b/QSB/EchoesOfTheEye/AirlockSync/VariableSync/AirlockVariableSyncer.cs new file mode 100644 index 00000000..251db40e --- /dev/null +++ b/QSB/EchoesOfTheEye/AirlockSync/VariableSync/AirlockVariableSyncer.cs @@ -0,0 +1,13 @@ +using QSB.Utility.VariableSync; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; + +namespace QSB.EchoesOfTheEye.AirlockSync.VariableSync; + +internal class AirlockVariableSyncer : WorldObjectVariableSyncer +{ +} diff --git a/QSB/EchoesOfTheEye/AirlockSync/WorldObjects/QSBGhostAirlock.cs b/QSB/EchoesOfTheEye/AirlockSync/WorldObjects/QSBGhostAirlock.cs index 600eb5e9..1e154763 100644 --- a/QSB/EchoesOfTheEye/AirlockSync/WorldObjects/QSBGhostAirlock.cs +++ b/QSB/EchoesOfTheEye/AirlockSync/WorldObjects/QSBGhostAirlock.cs @@ -1,9 +1,12 @@ -using QSB.WorldSync; +using QSB.EchoesOfTheEye.AirlockSync.VariableSync; +using QSB.WorldSync; namespace QSB.EchoesOfTheEye.AirlockSync.WorldObjects; -// will be implemented when eote -internal class QSBGhostAirlock : WorldObject +internal class QSBGhostAirlock : VariableSyncedWorldObject { - public override void SendInitialState(uint to) { } + public override void SendInitialState(uint to) + { + + } } \ No newline at end of file diff --git a/QSB/EchoesOfTheEye/EclipseDoors/DoorManager.cs b/QSB/EchoesOfTheEye/EclipseDoors/DoorManager.cs index 465a6eff..5a5a9b4c 100644 --- a/QSB/EchoesOfTheEye/EclipseDoors/DoorManager.cs +++ b/QSB/EchoesOfTheEye/EclipseDoors/DoorManager.cs @@ -3,6 +3,7 @@ using Mirror; using QSB.EchoesOfTheEye.EclipseDoors.VariableSync; using QSB.EchoesOfTheEye.EclipseDoors.WorldObjects; using QSB.Utility; +using QSB.Utility.VariableSync; using QSB.WorldSync; using System; using System.Collections.Generic; @@ -23,28 +24,6 @@ internal class DoorManager : WorldObjectManager public override async UniTask BuildWorldObjects(OWScene scene, CancellationToken ct) { - Doors.Clear(); - Doors.AddRange(QSBWorldSync.GetUnityObjects().SortDeterministic()); - QSBWorldSync.Init(); - - var allDoors = QSBWorldSync.GetWorldObjects().ToArray(); - - if (QSBCore.IsHost) - { - foreach (var item in allDoors) - { - var networkObject = Instantiate(QSBNetworkManager.singleton.DoorPrefab); - networkObject.SpawnWithServerAuthority(); - } - } - - await UniTask.WaitUntil(() => EclipseDoorVariableSyncer.GetSpecificSyncers().Count == Doors.Count, cancellationToken: ct); - - foreach (var item in allDoors) - { - var index = Doors.IndexOf(item.AttachedObject); - var syncer = EclipseDoorVariableSyncer.GetSpecificSyncers()[index]; - item.SetSyncer(syncer); - } + await QSBWorldSync.InitWithVariableSync(ct); } } diff --git a/QSB/EchoesOfTheEye/EclipseElevators/EclipseElevatorManager.cs b/QSB/EchoesOfTheEye/EclipseElevators/EclipseElevatorManager.cs index 5eacb2f6..d0f70846 100644 --- a/QSB/EchoesOfTheEye/EclipseElevators/EclipseElevatorManager.cs +++ b/QSB/EchoesOfTheEye/EclipseElevators/EclipseElevatorManager.cs @@ -21,32 +21,8 @@ internal class EclipseElevatorManager : WorldObjectManager public override WorldObjectScene WorldObjectScene => WorldObjectScene.SolarSystem; public override bool DlcOnly => true; - public static readonly List Elevators = new(); - public override async UniTask BuildWorldObjects(OWScene scene, CancellationToken ct) { - Elevators.Clear(); - Elevators.AddRange(QSBWorldSync.GetUnityObjects().SortDeterministic()); - QSBWorldSync.Init(); - - var allElevators = QSBWorldSync.GetWorldObjects().ToArray(); - - if (QSBCore.IsHost) - { - foreach (var item in allElevators) - { - var networkObject = Instantiate(QSBNetworkManager.singleton.ElevatorPrefab); - networkObject.SpawnWithServerAuthority(); - } - } - - await UniTask.WaitUntil(() => EclipseDoorVariableSyncer.GetSpecificSyncers().Count == Elevators.Count, cancellationToken: ct); - - foreach (var item in allElevators) - { - var index = Elevators.IndexOf(item.AttachedObject); - var syncer = EclipseDoorVariableSyncer.GetSpecificSyncers()[index]; - item.SetSyncer(syncer); - } + await QSBWorldSync.InitWithVariableSync(ct); } } diff --git a/QSB/Utility/VariableSync/VariableSyncStorage.cs b/QSB/Utility/VariableSync/VariableSyncStorage.cs new file mode 100644 index 00000000..a9b66bbc --- /dev/null +++ b/QSB/Utility/VariableSync/VariableSyncStorage.cs @@ -0,0 +1,12 @@ +using System.Collections.Generic; +using System.Linq; + +namespace QSB.Utility.VariableSync; + +public static class VariableSyncStorage +{ + public static List _instances = new(); + + public static List GetSpecificSyncers() + => _instances.OfType().ToList(); +} diff --git a/QSB/Utility/VariableSync/WorldObjectVariableSyncer.cs b/QSB/Utility/VariableSync/WorldObjectVariableSyncer.cs index 65285bc0..b3a8f0f0 100644 --- a/QSB/Utility/VariableSync/WorldObjectVariableSyncer.cs +++ b/QSB/Utility/VariableSync/WorldObjectVariableSyncer.cs @@ -1,36 +1,27 @@ using QSB.WorldSync; -using System.Collections.Generic; -using System.Linq; using UnityEngine.SceneManagement; namespace QSB.Utility.VariableSync; public class WorldObjectVariableSyncer : BaseVariableSyncer, IWorldObjectVariableSyncer { - private static List> _instances = new(); - public IWorldObject AttachedWorldObject { get; private set; } - public static List GetSpecificSyncers() - => _instances.OfType().ToList(); - public void Init(IWorldObject worldObject) - { - AttachedWorldObject = worldObject; - } + => AttachedWorldObject = worldObject; public override void OnStartClient() { - _instances.Add(this); + VariableSyncStorage._instances.Add(this); DontDestroyOnLoad(this); base.OnStartClient(); } public override void OnStopClient() { - _instances.Remove(this); - // DontDestroyOnLoad simply moves a GO to a scene called "DontDestroyOnLoad" - // so to undo it we can just move it back + VariableSyncStorage._instances.Remove(this); + // DontDestroyOnLoad moves GOs to the scene "DontDestroyOnLoad" + // so to undo it we can just move them back SceneManager.MoveGameObjectToScene(gameObject, SceneManager.GetActiveScene()); base.OnStopClient(); } diff --git a/QSB/WorldSync/QSBWorldSync.cs b/QSB/WorldSync/QSBWorldSync.cs index b3666baa..573eb74e 100644 --- a/QSB/WorldSync/QSBWorldSync.cs +++ b/QSB/WorldSync/QSBWorldSync.cs @@ -7,6 +7,7 @@ using QSB.Messaging; using QSB.Player.TransformSync; using QSB.TriggerSync.WorldObjects; using QSB.Utility; +using QSB.Utility.VariableSync; using System; using System.Collections.Generic; using System.Linq; @@ -306,6 +307,38 @@ public static class QSBWorldSync } } + public static async UniTask InitWithVariableSync(CancellationToken ct) + where TWorldObject : VariableSyncedWorldObject, new() + where TUnityObject : MonoBehaviour + where TVariableSyncer : IWorldObjectVariableSyncer + { + DebugLog.DebugWrite($"InitWithVariableSync TWorldObject:{typeof(TWorldObject).Name}, TUnityObject:{typeof(TUnityObject).Name}, TVariableSyncer:{typeof(TVariableSyncer).Name}"); + + var unityObjects = new List(); + unityObjects.AddRange(GetUnityObjects().SortDeterministic()); + Init(); + + var allWorldObjects = GetWorldObjects().ToArray(); + + if (QSBCore.IsHost) + { + foreach (var item in allWorldObjects) + { + var networkObject = UnityEngine.Object.Instantiate(QSBNetworkManager.singleton.ElevatorPrefab); + networkObject.SpawnWithServerAuthority(); + } + } + + await UniTask.WaitUntil(() => VariableSyncStorage.GetSpecificSyncers().Count == unityObjects.Count, cancellationToken: ct); + + foreach (var item in allWorldObjects) + { + var index = unityObjects.IndexOf(item.AttachedObject); + var syncer = VariableSyncStorage.GetSpecificSyncers()[index]; + item.SetSyncer(syncer); + } + } + private static void AddAndInit(TWorldObject worldObject, TUnityObject unityObject) where TWorldObject : WorldObject where TUnityObject : MonoBehaviour diff --git a/QSB/WorldSync/VariableSyncedWorldObject.cs b/QSB/WorldSync/VariableSyncedWorldObject.cs index 2ff4423e..3d4ac6db 100644 --- a/QSB/WorldSync/VariableSyncedWorldObject.cs +++ b/QSB/WorldSync/VariableSyncedWorldObject.cs @@ -3,7 +3,7 @@ using UnityEngine; namespace QSB.WorldSync; -internal abstract class VariableSyncedWorldObject : WorldObject +public abstract class VariableSyncedWorldObject : WorldObject where T : MonoBehaviour where U : IWorldObjectVariableSyncer {