diff --git a/QSB/ConversationSync/Events/ConversationEvent.cs b/QSB/ConversationSync/Events/ConversationEvent.cs index 1f3b98e1..322bd69a 100644 --- a/QSB/ConversationSync/Events/ConversationEvent.cs +++ b/QSB/ConversationSync/Events/ConversationEvent.cs @@ -32,7 +32,7 @@ namespace QSB.ConversationSync.Events { case ConversationType.Character: var translated = TextTranslation.Translate(message.Message).Trim(); - translated = Regex.Replace(translated, @"", ""); + translated = Regex.Replace(translated, @"<[Pp]ause=?\d*\.?\d*\s?\/?>", ""); ConversationManager.Instance.DisplayCharacterConversationBox(message.ObjectId, translated); break; diff --git a/QSB/ElevatorSync/ElevatorManager.cs b/QSB/ElevatorSync/ElevatorManager.cs index 05b7a399..d58b8f5a 100644 --- a/QSB/ElevatorSync/ElevatorManager.cs +++ b/QSB/ElevatorSync/ElevatorManager.cs @@ -1,22 +1,11 @@ using QSB.ElevatorSync.WorldObjects; using QSB.WorldSync; -using UnityEngine; namespace QSB.ElevatorSync { - public class ElevatorManager : MonoBehaviour + public class ElevatorManager : WorldObjectManager { - public static ElevatorManager Instance { get; private set; } - - public void Awake() - { - Instance = this; - QSBSceneManager.OnSceneLoaded += OnSceneLoaded; - } - - public void OnDestroy() => QSBSceneManager.OnSceneLoaded -= OnSceneLoaded; - - private void OnSceneLoaded(OWScene scene, bool isInUniverse) + protected override void RebuildWorldObjects(OWScene scene) => QSBWorldSync.Init(); } } \ No newline at end of file diff --git a/QSB/GeyserSync/GeyserManager.cs b/QSB/GeyserSync/GeyserManager.cs index 5db5a149..537b7c55 100644 --- a/QSB/GeyserSync/GeyserManager.cs +++ b/QSB/GeyserSync/GeyserManager.cs @@ -5,21 +5,21 @@ using UnityEngine; namespace QSB.GeyserSync { - public class GeyserManager : MonoBehaviour + public class GeyserManager : WorldObjectManager { - public void Awake() + public override void Awake() { - QSBSceneManager.OnSceneLoaded += OnSceneLoaded; + base.Awake(); QSBPatchManager.OnPatchType += OnPatchType; } - public void OnDestroy() + public override void OnDestroy() { - QSBSceneManager.OnSceneLoaded -= OnSceneLoaded; + base.OnDestroy(); QSBPatchManager.OnPatchType -= OnPatchType; } - private void OnSceneLoaded(OWScene scene, bool isInUniverse) + protected override void RebuildWorldObjects(OWScene scene) => QSBWorldSync.Init(); public void OnPatchType(QSBPatchTypes type) diff --git a/QSB/ItemSync/CustomNomaiRemoteCameraPlatform.cs b/QSB/ItemSync/CustomNomaiRemoteCameraPlatform.cs index 8895ba51..ddd81862 100644 --- a/QSB/ItemSync/CustomNomaiRemoteCameraPlatform.cs +++ b/QSB/ItemSync/CustomNomaiRemoteCameraPlatform.cs @@ -216,7 +216,9 @@ namespace QSB.ItemSync if (_platformActive) { var localInBounds = _connectionBounds.PointInside(_playerCamera.transform.position); - _anyoneStillOnPlatform = QSBPlayerManager.PlayerList.Any(x => _connectionBounds.PointInside(x.Camera.transform.position)); + _anyoneStillOnPlatform = QSBCore.IsInMultiplayer + ? QSBPlayerManager.PlayerList.Any(x => _connectionBounds.PointInside(x.Camera.transform.position)) + : localInBounds; if (!localInBounds && _wasLocalInBounds) { OnLeaveBounds(); diff --git a/QSB/ItemSync/Events/MoveToCarryEvent.cs b/QSB/ItemSync/Events/MoveToCarryEvent.cs index a59abba8..7f94a2d6 100644 --- a/QSB/ItemSync/Events/MoveToCarryEvent.cs +++ b/QSB/ItemSync/Events/MoveToCarryEvent.cs @@ -50,7 +50,7 @@ namespace QSB.ItemSync.Events break; } - itemObject.PickUpItem(itemSocket); + itemObject.PickUpItem(itemSocket, message.AboutId); } } } diff --git a/QSB/ItemSync/ItemManager.cs b/QSB/ItemSync/ItemManager.cs index df54cd01..ee49940f 100644 --- a/QSB/ItemSync/ItemManager.cs +++ b/QSB/ItemSync/ItemManager.cs @@ -6,29 +6,19 @@ using UnityEngine; namespace QSB.ItemSync { - internal class ItemManager : MonoBehaviour + internal class ItemManager : WorldObjectManager { - public static ItemManager Instance { get; private set; } - - public void Awake() - { - Instance = this; - QSBSceneManager.OnUniverseSceneLoaded += RebuildItems; - } - - public void OnDestroy() => QSBSceneManager.OnUniverseSceneLoaded -= RebuildItems; - - public void RebuildItems(OWScene scene) + protected override void RebuildWorldObjects(OWScene scene) { DebugLog.DebugWrite("Rebuilding OWItems...", MessageType.Warning); - QSBWorldSync.Init(); QSBWorldSync.Init(); - QSBWorldSync.Init(); + QSBWorldSync.Init(); QSBWorldSync.Init(); - QSBWorldSync.Init(); + QSBWorldSync.Init(); QSBWorldSync.Init(); - QSBWorldSync.Init(); + QSBWorldSync.Init(); QSBWorldSync.Init(); + QSBWorldSync.Init(); foreach (var streaming in Resources.FindObjectsOfTypeAll()) { streaming.gameObject.AddComponent(); diff --git a/QSB/ItemSync/WorldObjects/IQSBOWItem.cs b/QSB/ItemSync/WorldObjects/IQSBOWItem.cs index ed2eac9a..90651be4 100644 --- a/QSB/ItemSync/WorldObjects/IQSBOWItem.cs +++ b/QSB/ItemSync/WorldObjects/IQSBOWItem.cs @@ -8,7 +8,7 @@ namespace QSB.ItemSync.WorldObjects ItemType GetItemType(); void SetColliderActivation(bool active); void SocketItem(Transform socketTransform, Sector sector); - void PickUpItem(Transform holdTransform); + void PickUpItem(Transform holdTransform, uint playerId); void DropItem(Vector3 position, Vector3 normal, Sector sector); void PlaySocketAnimation(); void PlayUnsocketAnimation(); diff --git a/QSB/ItemSync/WorldObjects/QSBOWItem.cs b/QSB/ItemSync/WorldObjects/QSBOWItem.cs index 1e4e96b0..d012a8e6 100644 --- a/QSB/ItemSync/WorldObjects/QSBOWItem.cs +++ b/QSB/ItemSync/WorldObjects/QSBOWItem.cs @@ -1,4 +1,7 @@ using OWML.Utils; +using QSB.Player; +using QSB.SectorSync.WorldObjects; +using QSB.Utility; using QSB.WorldSync; using UnityEngine; @@ -7,7 +10,51 @@ namespace QSB.ItemSync.WorldObjects internal class QSBOWItem : WorldObject, IQSBOWItem where T : OWItem { - public override void Init(T attachedObject, int id) { } + public IQSBOWItemSocket InitialSocket { get; private set; } + public Transform InitialParent { get; private set; } + public Vector3 InitialPosition { get; private set; } + public Quaternion InitialRotation { get; private set; } + public QSBSector InitialSector { get; private set; } + public uint HoldingPlayer { get; private set; } + + public override void Init(T attachedObject, int id) + { + InitialParent = attachedObject.transform.parent; + InitialPosition = attachedObject.transform.localPosition; + InitialRotation = attachedObject.transform.localRotation; + InitialSector = QSBWorldSync.GetWorldFromUnity(attachedObject.GetSector()); + if (InitialParent.GetComponent() != null) + { + var qsbObj = ItemManager.GetObject(InitialParent.GetComponent()); + InitialSocket = qsbObj; + } + QSBPlayerManager.OnRemovePlayer += OnPlayerLeave; + } + + public override void OnRemoval() + { + QSBPlayerManager.OnRemovePlayer -= OnPlayerLeave; + } + + private void OnPlayerLeave(uint player) + { + if (HoldingPlayer != player) + { + return; + } + if (InitialSocket != null) + { + InitialSocket.PlaceIntoSocket(this); + return; + } + DebugLog.DebugWrite($"OnPlayerLeave {player} for item {AttachedObject.name}"); + AttachedObject.transform.parent = InitialParent; + AttachedObject.transform.localPosition = InitialPosition; + AttachedObject.transform.localRotation = InitialRotation; + AttachedObject.transform.localScale = Vector3.one; + AttachedObject.SetSector(InitialSector.AttachedObject); + AttachedObject.SetColliderActivation(true); + } public ItemType GetItemType() => AttachedObject.GetItemType(); @@ -16,10 +63,19 @@ namespace QSB.ItemSync.WorldObjects => AttachedObject.SetColliderActivation(active); public virtual void SocketItem(Transform socketTransform, Sector sector) - => AttachedObject.SocketItem(socketTransform, sector); + { + AttachedObject.SocketItem(socketTransform, sector); + DebugLog.DebugWrite($"{AttachedObject.name} set holding to 0"); + HoldingPlayer = 0; + } - public virtual void PickUpItem(Transform holdTransform) - => AttachedObject.PickUpItem(holdTransform); + + public virtual void PickUpItem(Transform holdTransform, uint playerId) + { + AttachedObject.PickUpItem(holdTransform); + DebugLog.DebugWrite($"{AttachedObject.name} set holding to {playerId}"); + HoldingPlayer = playerId; + } public virtual void DropItem(Vector3 position, Vector3 normal, Sector sector) { @@ -32,6 +88,8 @@ namespace QSB.ItemSync.WorldObjects AttachedObject.transform.position = sector.transform.TransformPoint(position) + AttachedObject.transform.TransformDirection(localDropOffset); AttachedObject.SetSector(sector); AttachedObject.SetColliderActivation(true); + DebugLog.DebugWrite($"{AttachedObject.name} set holding to 0"); + HoldingPlayer = 0; } public virtual void PlaySocketAnimation() { } diff --git a/QSB/OrbSync/Events/OrbUserEvent.cs b/QSB/OrbSync/Events/OrbUserEvent.cs index 0c73c726..540f8372 100644 --- a/QSB/OrbSync/Events/OrbUserEvent.cs +++ b/QSB/OrbSync/Events/OrbUserEvent.cs @@ -51,9 +51,14 @@ namespace QSB.OrbSync.Events private static void HandleServer(WorldObjectMessage message) { var fromPlayer = QNetworkServer.connections.First(x => x.GetPlayerId() == message.FromId); - if (QSBWorldSync.OrbSyncList.Count == 0) + if (QSBWorldSync.OrbSyncList == null || QSBWorldSync.OrbSyncList.Count == 0) { - DebugLog.ToConsole($"Error - OrbSyncList is empty. (ID {message.ObjectId})", MessageType.Error); + DebugLog.ToConsole($"Error - OrbSyncList is empty or null. (ID {message.ObjectId})", MessageType.Error); + return; + } + if (QSBWorldSync.OldOrbList == null || QSBWorldSync.OldOrbList.Count == 0) + { + DebugLog.ToConsole($"Error - OldOrbList is empty or null. (ID {message.ObjectId})", MessageType.Error); return; } if (fromPlayer == null) @@ -83,11 +88,14 @@ namespace QSB.OrbSync.Events private static void HandleClient(WorldObjectMessage message) { - if (QSBWorldSync.OrbSyncList.Count < message.ObjectId) + if (QSBWorldSync.OrbSyncList == null || QSBWorldSync.OrbSyncList.Count == 0) { - DebugLog.ToConsole( - $"Error - Orb id {message.ObjectId} out of range of orb sync list {QSBWorldSync.OrbSyncList.Count}.", - MessageType.Error); + DebugLog.ToConsole($"Error - OrbSyncList is empty or null. (ID {message.ObjectId})", MessageType.Error); + return; + } + if (QSBWorldSync.OldOrbList == null || QSBWorldSync.OldOrbList.Count == 0) + { + DebugLog.ToConsole($"Error - OldOrbList is empty or null. (ID {message.ObjectId})", MessageType.Error); return; } if (!QSBWorldSync.OrbSyncList.Any(x => x.AttachedOrb == QSBWorldSync.OldOrbList[message.ObjectId])) diff --git a/QSB/OrbSync/OrbManager.cs b/QSB/OrbSync/OrbManager.cs index 1d3b7f68..bb5b85ed 100644 --- a/QSB/OrbSync/OrbManager.cs +++ b/QSB/OrbSync/OrbManager.cs @@ -9,23 +9,20 @@ using UnityEngine; namespace QSB.OrbSync { - public class OrbManager : MonoBehaviour + public class OrbManager : WorldObjectManager { - public static OrbManager Instance { get; private set; } - - private void Awake() => Instance = this; - - private void BuildOrbSlots() + protected override void RebuildWorldObjects(OWScene scene) { QSBWorldSync.Init(); DebugLog.DebugWrite($"Finished slot build with {QSBWorldSync.GetWorldObjects().Count()} slots.", MessageType.Success); + BuildOrbs(); } - public void BuildOrbs() + private void BuildOrbs() { QSBWorldSync.OldOrbList.Clear(); QSBWorldSync.OldOrbList = Resources.FindObjectsOfTypeAll().ToList(); - if (QNetworkServer.active) + if (QSBCore.IsServer) { QSBWorldSync.OrbSyncList.ForEach(x => QNetworkServer.Destroy(x.gameObject)); QSBWorldSync.OrbSyncList.Clear(); @@ -33,35 +30,5 @@ namespace QSB.OrbSync } DebugLog.DebugWrite($"Finished orb build with {QSBWorldSync.OldOrbList.Count} orbs.", MessageType.Success); } - - public void OnRenderObject() - { - if (!QSBCore.HasWokenUp || !QSBCore.DebugMode || !QSBCore.ShowLinesInDebug) - { - return; - } - - foreach (var orb in QSBWorldSync.OldOrbList) - { - var rails = orb.GetValue("_safetyRails"); - if (rails.Length > 0) - { - foreach (var rail in rails) - { - var points = rail.GetValue("_railPoints"); - for (var i = 0; i < points.Length; i++) - { - if (i > 0) - { - Popcron.Gizmos.Line(rail.transform.TransformPoint(points[i - 1]), rail.transform.TransformPoint(points[i]), Color.white); - } - } - } - } - } - } - - public void QueueBuildSlots() => QSBCore.UnityEvents.RunWhen(() => QSBCore.HasWokenUp, BuildOrbSlots); - public void QueueBuildOrbs() => QSBCore.UnityEvents.RunWhen(() => QNetworkServer.active, BuildOrbs); } } \ No newline at end of file diff --git a/QSB/Player/QSBPlayerManager.cs b/QSB/Player/QSBPlayerManager.cs index b2fc70d8..838881ff 100644 --- a/QSB/Player/QSBPlayerManager.cs +++ b/QSB/Player/QSBPlayerManager.cs @@ -32,6 +32,8 @@ namespace QSB.Player } } + public static Action OnRemovePlayer; + public static PlayerInfo LocalPlayer => GetPlayer(LocalPlayerId); public static List PlayerList { get; } = new List(); diff --git a/QSB/QSB.csproj b/QSB/QSB.csproj index 96d9b383..4de20d64 100644 --- a/QSB/QSB.csproj +++ b/QSB/QSB.csproj @@ -303,6 +303,7 @@ + diff --git a/QSB/QSBNetworkManager.cs b/QSB/QSBNetworkManager.cs index 6c48cd4c..74d956ae 100644 --- a/QSB/QSBNetworkManager.cs +++ b/QSB/QSBNetworkManager.cs @@ -6,6 +6,8 @@ using QSB.ElevatorSync.WorldObjects; using QSB.Events; using QSB.GeyserSync.WorldObjects; using QSB.Instruments; +using QSB.ItemSync; +using QSB.ItemSync.WorldObjects; using QSB.OrbSync; using QSB.OrbSync.WorldObjects; using QSB.Patches; @@ -110,8 +112,6 @@ namespace QSB private void OnSceneLoaded(OWScene scene) { - OrbManager.Instance.BuildOrbs(); - OrbManager.Instance.QueueBuildSlots(); QSBWorldSync.OldDialogueTrees.Clear(); QSBWorldSync.OldDialogueTrees = Resources.FindObjectsOfTypeAll().ToList(); } @@ -134,10 +134,6 @@ namespace QSB public override void OnStartServer() { DebugLog.DebugWrite("OnStartServer", MessageType.Info); - if (QSBWorldSync.OrbSyncList.Count == 0 && QSBSceneManager.IsInUniverse) - { - OrbManager.Instance.QueueBuildOrbs(); - } if (QSBWorldSync.OldDialogueTrees.Count == 0 && QSBSceneManager.IsInUniverse) { QSBWorldSync.OldDialogueTrees = Resources.FindObjectsOfTypeAll().ToList(); @@ -178,9 +174,7 @@ namespace QSB if (QSBSceneManager.IsInUniverse) { - QSBSectorManager.Instance?.RebuildSectors(); - OrbManager.Instance?.QueueBuildSlots(); - QuantumManager.Instance?.RebuildQuantumObjects(QSBSceneManager.CurrentScene); + WorldObjectManager.Rebuild(QSBSceneManager.CurrentScene); } var specificType = QNetworkServer.active ? QSBPatchTypes.OnServerClientConnect : QSBPatchTypes.OnNonServerClientConnect; @@ -244,14 +238,8 @@ namespace QSB identity.RemoveClientAuthority(connection); } } - - // Server takes some time to process removal of player/deletion of networkidentity - Invoke(nameof(LateFinalizeDisconnect), 1f); } - private void LateFinalizeDisconnect() - => QuantumManager.Instance.CheckExistingPlayers(); - public override void OnStopServer() { DebugLog.DebugWrite("OnStopServer", MessageType.Info); @@ -269,11 +257,23 @@ namespace QSB private void RemoveWorldObjects() { - QSBWorldSync.RemoveWorldObjects(); - QSBWorldSync.RemoveWorldObjects(); - QSBWorldSync.RemoveWorldObjects(); - QSBWorldSync.RemoveWorldObjects(); - QSBWorldSync.RemoveWorldObjects(); + QSBWorldSync.RemoveWorldObjects(); + QSBWorldSync.RemoveWorldObjects(); + foreach (var streaming in Resources.FindObjectsOfTypeAll()) + { + streaming.GetComponent().enabled = true; + Destroy(streaming); + } + foreach (var camera in Resources.FindObjectsOfTypeAll()) + { + camera.GetComponent().enabled = true; + Destroy(camera); + } + foreach (var platform in Resources.FindObjectsOfTypeAll()) + { + platform.GetComponent().enabled = true; + Destroy(platform); + } } } } \ No newline at end of file diff --git a/QSB/QSBSceneManager.cs b/QSB/QSBSceneManager.cs index 764151ad..a47a8845 100644 --- a/QSB/QSBSceneManager.cs +++ b/QSB/QSBSceneManager.cs @@ -1,5 +1,6 @@ using OWML.Common; using QSB.Utility; +using QSB.WorldSync; using System; namespace QSB @@ -22,6 +23,10 @@ namespace QSB private static void OnCompleteSceneLoad(OWScene oldScene, OWScene newScene) { DebugLog.DebugWrite($"COMPLETE SCENE LOAD ({oldScene} -> {newScene})", MessageType.Info); + if (QSBCore.IsInMultiplayer) + { + WorldObjectManager.Rebuild(newScene); + } var universe = InUniverse(newScene); OnSceneLoaded?.SafeInvoke(newScene, universe); if (universe) diff --git a/QSB/QuantumSync/QuantumManager.cs b/QSB/QuantumSync/QuantumManager.cs index 7c86b747..5a8627da 100644 --- a/QSB/QuantumSync/QuantumManager.cs +++ b/QSB/QuantumSync/QuantumManager.cs @@ -11,21 +11,26 @@ using UnityEngine; namespace QSB.QuantumSync { - internal class QuantumManager : MonoBehaviour + internal class QuantumManager : WorldObjectManager { public static QuantumManager Instance { get; private set; } public QuantumShrine Shrine; public bool IsReady; - public void Awake() + public override void Awake() { + base.Awake(); Instance = this; - QSBSceneManager.OnUniverseSceneLoaded += RebuildQuantumObjects; + QSBPlayerManager.OnRemovePlayer += PlayerLeave; } - public void OnDestroy() => QSBSceneManager.OnUniverseSceneLoaded -= RebuildQuantumObjects; + public override void OnDestroy() + { + base.OnDestroy(); + QSBPlayerManager.OnRemovePlayer -= PlayerLeave; + } - public void RebuildQuantumObjects(OWScene scene) + protected override void RebuildWorldObjects(OWScene scene) { DebugLog.DebugWrite("Rebuilding quantum objects...", MessageType.Warning); QSBWorldSync.Init(); @@ -42,14 +47,17 @@ namespace QSB.QuantumSync IsReady = true; } - public void CheckExistingPlayers() + public void PlayerLeave(uint playerId) { - DebugLog.DebugWrite("Checking quantum objects for non-existent players...", MessageType.Info); + if (!QSBCore.IsServer) + { + return; + } var quantumObjects = QSBWorldSync.GetWorldObjects().ToList(); for (var i = 0; i < quantumObjects.Count; i++) { var obj = quantumObjects[i]; - if (!QSBPlayerManager.PlayerExists(obj.ControllingPlayer)) + if (obj.ControllingPlayer == playerId) { var idToSend = obj.IsEnabled ? QSBPlayerManager.LocalPlayerId : 0u; QSBEventManager.FireEvent(EventNames.QSBQuantumAuthority, i, idToSend); diff --git a/QSB/SectorSync/QSBSectorManager.cs b/QSB/SectorSync/QSBSectorManager.cs index 2ae827cb..d6345750 100644 --- a/QSB/SectorSync/QSBSectorManager.cs +++ b/QSB/SectorSync/QSBSectorManager.cs @@ -10,7 +10,7 @@ using UnityEngine; namespace QSB.SectorSync { - public class QSBSectorManager : MonoBehaviour, IRepeating + public class QSBSectorManager : WorldObjectManager, IRepeating { public static QSBSectorManager Instance { get; private set; } public bool IsReady { get; private set; } @@ -25,24 +25,14 @@ namespace QSB.SectorSync .Where(x => x.HasAuthority).ToList().ForEach(CheckTransformSyncSector); } - public void Awake() + public override void Awake() { - if (Instance != null) - { - DebugLog.ToConsole("Error - Cannot have multiple QSBSectorManagers!", MessageType.Error); - Destroy(this); - return; - } + base.Awake(); Instance = this; - QSBSceneManager.OnUniverseSceneLoaded += (OWScene scene) => RebuildSectors(); DebugLog.DebugWrite("Sector Manager ready.", MessageType.Success); } - public void OnDestroy() - => QSBSceneManager.OnUniverseSceneLoaded -= (OWScene scene) => RebuildSectors(); - - - public void RebuildSectors() + protected override void RebuildWorldObjects(OWScene scene) { DebugLog.DebugWrite("Rebuilding sectors...", MessageType.Warning); if (QSBSceneManager.CurrentScene == OWScene.SolarSystem) diff --git a/QSB/TimeSync/WakeUpSync.cs b/QSB/TimeSync/WakeUpSync.cs index 459b8837..729b972a 100644 --- a/QSB/TimeSync/WakeUpSync.cs +++ b/QSB/TimeSync/WakeUpSync.cs @@ -187,6 +187,7 @@ namespace QSB.TimeSync { if (OWInput.GetInputMode() != InputMode.None && _isInputEnabled) { + DebugLog.DebugWrite($"Change input to none - was {OWInput.GetInputMode()}"); OWInput.ChangeInputMode(InputMode.None); _isInputEnabled = false; } @@ -197,10 +198,12 @@ namespace QSB.TimeSync _isInputEnabled = true; if (OWInput.GetInputMode() != InputMode.None) { - DebugLog.ToConsole($"Warning - InputMode was changed to {OWInput.GetInputMode()} while pausing/fastforwarding!", MessageType.Warning); + DebugLog.ToConsole($"Warning - InputMode was changed to {OWInput.GetInputMode()} while pausing/fastforwarding, and wasn't accounted for!", MessageType.Warning); return; } + DebugLog.DebugWrite($"Enable Input - Restore previous inputs!"); OWInput.RestorePreviousInputs(); + DebugLog.DebugWrite($"input now {OWInput.GetInputMode()}"); } public void Update() diff --git a/QSB/Tools/PlayerToolsManager.cs b/QSB/Tools/PlayerToolsManager.cs index 8910d5dd..fb3bcb59 100644 --- a/QSB/Tools/PlayerToolsManager.cs +++ b/QSB/Tools/PlayerToolsManager.cs @@ -198,6 +198,7 @@ namespace QSB.Tools tool.Type = ToolType.ProbeLauncher; tool.ToolGameObject = model; + // TODO : investigate why probe is wack GetRenderer(launcherRoot, "Props_HEA_Probe_Prelaunch").materials[0] = _playerToolsMaterial; GetRenderer(launcherRoot, "Props_HEA_Probe_Prelaunch").materials[1] = _lightbulbMaterial; GetRenderer(launcherRoot, "PressureGauge_Arrow").material = _playerToolsMaterial; diff --git a/QSB/TransformSync/NomaiOrbTransformSync.cs b/QSB/TransformSync/NomaiOrbTransformSync.cs index 8b8668b9..ddf762e2 100644 --- a/QSB/TransformSync/NomaiOrbTransformSync.cs +++ b/QSB/TransformSync/NomaiOrbTransformSync.cs @@ -1,4 +1,5 @@ -using QSB.WorldSync; +using QSB.Utility; +using QSB.WorldSync; using QuantumUNET; using UnityEngine; @@ -25,6 +26,11 @@ namespace QSB.TransformSync private void OnReady() { + if (QSBWorldSync.OldOrbList == null || QSBWorldSync.OldOrbList.Count < Index) + { + DebugLog.ToConsole($"Error - OldOrbList is null or does not contain index {Index}.", OWML.Common.MessageType.Error); + return; + } AttachedOrb = QSBWorldSync.OldOrbList[Index]; _isReady = true; } diff --git a/QSB/TransformSync/PlayerTransformSync.cs b/QSB/TransformSync/PlayerTransformSync.cs index e5556ec8..e56cb79e 100644 --- a/QSB/TransformSync/PlayerTransformSync.cs +++ b/QSB/TransformSync/PlayerTransformSync.cs @@ -16,6 +16,7 @@ namespace QSB.TransformSync protected override void OnDestroy() { + QSBPlayerManager.OnRemovePlayer?.Invoke(PlayerId); base.OnDestroy(); if (QSBPlayerManager.PlayerExists(PlayerId)) { diff --git a/QSB/TranslationSync/SpiralManager.cs b/QSB/TranslationSync/SpiralManager.cs index 7aadba4d..9bf51bf9 100644 --- a/QSB/TranslationSync/SpiralManager.cs +++ b/QSB/TranslationSync/SpiralManager.cs @@ -1,22 +1,11 @@ using QSB.TranslationSync.WorldObjects; using QSB.WorldSync; -using UnityEngine; namespace QSB.TranslationSync { - internal class SpiralManager : MonoBehaviour + internal class SpiralManager : WorldObjectManager { - public static SpiralManager Instance { get; private set; } - - public void Awake() - { - Instance = this; - QSBSceneManager.OnUniverseSceneLoaded += OnSceneLoaded; - } - - public void OnDestroy() => QSBSceneManager.OnUniverseSceneLoaded -= OnSceneLoaded; - - private void OnSceneLoaded(OWScene scene) + protected override void RebuildWorldObjects(OWScene scene) { QSBWorldSync.Init(); QSBWorldSync.Init(); diff --git a/QSB/WorldSync/QSBWorldSync.cs b/QSB/WorldSync/QSBWorldSync.cs index 8820e0e9..538f2a4e 100644 --- a/QSB/WorldSync/QSBWorldSync.cs +++ b/QSB/WorldSync/QSBWorldSync.cs @@ -137,7 +137,12 @@ namespace QSB.WorldSync DebugLog.ToConsole($"Error - No QSBOrbSlot found for {slot.name}!", MessageType.Error); return; } - var orbSync = OrbSyncList.First(x => x.AttachedOrb == affectingOrb); + var orbSync = OrbSyncList.FirstOrDefault(x => x.AttachedOrb == affectingOrb); + if (orbSync == null) + { + DebugLog.ToConsole($"Error - No NomaiOrbTransformSync found for {affectingOrb.name} (For slot {slot.name})!", MessageType.Error); + return; + } if (orbSync.HasAuthority) { qsbSlot.HandleEvent(state, OldOrbList.IndexOf(affectingOrb)); diff --git a/QSB/WorldSync/WorldObjectManager.cs b/QSB/WorldSync/WorldObjectManager.cs new file mode 100644 index 00000000..f6a997ce --- /dev/null +++ b/QSB/WorldSync/WorldObjectManager.cs @@ -0,0 +1,27 @@ +using QSB.Utility; +using System.Collections.Generic; +using UnityEngine; + +namespace QSB.WorldSync +{ + public abstract class WorldObjectManager : MonoBehaviour + { + private static List _managers = new List(); + + public virtual void Awake() + => _managers.Add(this); + + public virtual void OnDestroy() + => _managers.Remove(this); + + public static void Rebuild(OWScene scene) + { + foreach (var manager in _managers) + { + manager.RebuildWorldObjects(scene); + } + } + + protected abstract void RebuildWorldObjects(OWScene scene); + } +}