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);
+ }
+}