diff --git a/QSB/ElevatorSync/ElevatorManager.cs b/QSB/ElevatorSync/ElevatorManager.cs index 31c352e0..f319101a 100644 --- a/QSB/ElevatorSync/ElevatorManager.cs +++ b/QSB/ElevatorSync/ElevatorManager.cs @@ -21,13 +21,7 @@ namespace QSB.ElevatorSync private void OnSceneLoaded(OWScene scene, bool isInUniverse) { - _elevators = Resources.FindObjectsOfTypeAll().ToList(); - for (var id = 0; id < _elevators.Count; id++) - { - var qsbElevator = QSBWorldSync.GetWorldObject(id) ?? new QSBElevator(); - qsbElevator.Init(_elevators[id], id); - QSBWorldSync.AddWorldObject(qsbElevator); - } + QSBWorldSync.Init(ref _elevators); } public int GetId(Elevator elevator) => _elevators.IndexOf(elevator); diff --git a/QSB/ElevatorSync/Events/ElevatorEvent.cs b/QSB/ElevatorSync/Events/ElevatorEvent.cs index ccb96c0d..b5f3cf2a 100644 --- a/QSB/ElevatorSync/Events/ElevatorEvent.cs +++ b/QSB/ElevatorSync/Events/ElevatorEvent.cs @@ -21,7 +21,7 @@ namespace QSB.ElevatorSync.Events public override void OnReceiveRemote(bool server, BoolWorldObjectMessage message) { - var elevator = QSBWorldSync.GetWorldObject(message.ObjectId); + var elevator = QSBWorldSync.GetWorldObject(message.ObjectId); elevator?.RemoteCall(message.State); } } diff --git a/QSB/ElevatorSync/QSBElevator.cs b/QSB/ElevatorSync/QSBElevator.cs index 29f4e6d4..1f51dc02 100644 --- a/QSB/ElevatorSync/QSBElevator.cs +++ b/QSB/ElevatorSync/QSBElevator.cs @@ -4,7 +4,7 @@ using UnityEngine; namespace QSB.ElevatorSync { - public class QSBElevator : WorldObject + public class QSBElevator : WorldObject { private Elevator _elevator; private Vector3 _startLocalPos; @@ -14,7 +14,7 @@ namespace QSB.ElevatorSync private OWAudioSource _owAudioSourceOneShot; private OWAudioSource _owAudioSourceLP; - public void Init(Elevator elevator, int id) + public override void Init(Elevator elevator, int id) { _elevator = elevator; ObjectId = id; diff --git a/QSB/GeyserSync/Events/GeyserEvent.cs b/QSB/GeyserSync/Events/GeyserEvent.cs index 5eb10a80..7cbc6184 100644 --- a/QSB/GeyserSync/Events/GeyserEvent.cs +++ b/QSB/GeyserSync/Events/GeyserEvent.cs @@ -22,7 +22,7 @@ namespace QSB.GeyserSync.Events public override void OnReceiveRemote(bool server, BoolWorldObjectMessage message) { - var geyser = QSBWorldSync.GetWorldObject(message.ObjectId); + var geyser = QSBWorldSync.GetWorldObject(message.ObjectId); geyser?.SetState(message.State); } } diff --git a/QSB/GeyserSync/GeyserManager.cs b/QSB/GeyserSync/GeyserManager.cs index ceb4d1db..78d76f8a 100644 --- a/QSB/GeyserSync/GeyserManager.cs +++ b/QSB/GeyserSync/GeyserManager.cs @@ -18,16 +18,8 @@ namespace QSB.GeyserSync QSBPatchManager.OnPatchType -= OnPatchType; } - private void OnSceneLoaded(OWScene scene, bool isInUniverse) - { - var geyserControllers = Resources.FindObjectsOfTypeAll(); - for (var id = 0; id < geyserControllers.Length; id++) - { - var qsbGeyser = QSBWorldSync.GetWorldObject(id) ?? new QSBGeyser(); - qsbGeyser.Init(geyserControllers[id], id); - QSBWorldSync.AddWorldObject(qsbGeyser); - } - } + private void OnSceneLoaded(OWScene scene, bool isInUniverse) + => QSBWorldSync.Init(); public void OnPatchType(QSBPatchTypes type) { diff --git a/QSB/GeyserSync/QSBGeyser.cs b/QSB/GeyserSync/QSBGeyser.cs index 5963b21b..f4f89c2a 100644 --- a/QSB/GeyserSync/QSBGeyser.cs +++ b/QSB/GeyserSync/QSBGeyser.cs @@ -1,20 +1,20 @@ using QSB.Events; using QSB.WorldSync; using QuantumUNET; +using UnityEngine; namespace QSB.GeyserSync { - public class QSBGeyser : WorldObject + public class QSBGeyser : WorldObject { private GeyserController _geyserController; - public void Init(GeyserController geyserController, int id) + public override void Init(GeyserController geyserController, int id) { ObjectId = id; _geyserController = geyserController; - - geyserController.OnGeyserActivateEvent += () => HandleEvent(true); - geyserController.OnGeyserDeactivateEvent += () => HandleEvent(false); + _geyserController.OnGeyserActivateEvent += () => HandleEvent(true); + _geyserController.OnGeyserDeactivateEvent += () => HandleEvent(false); } private void HandleEvent(bool state) diff --git a/QSB/OrbSync/Events/OrbSlotEvent.cs b/QSB/OrbSync/Events/OrbSlotEvent.cs index d8b0e036..643710fb 100644 --- a/QSB/OrbSync/Events/OrbSlotEvent.cs +++ b/QSB/OrbSync/Events/OrbSlotEvent.cs @@ -22,7 +22,7 @@ namespace QSB.OrbSync.Events public override void OnReceiveRemote(bool server, OrbSlotMessage message) { - var orbSlot = QSBWorldSync.GetWorldObject(message.SlotId); + var orbSlot = QSBWorldSync.GetWorldObject(message.SlotId); orbSlot?.SetState(message.SlotState, message.OrbId); } } diff --git a/QSB/OrbSync/OrbManager.cs b/QSB/OrbSync/OrbManager.cs index 7da6f60c..7c839ec8 100644 --- a/QSB/OrbSync/OrbManager.cs +++ b/QSB/OrbSync/OrbManager.cs @@ -15,15 +15,8 @@ namespace QSB.OrbSync private void BuildOrbSlots() { - QSBWorldSync.RemoveWorldObjects(); - var orbSlots = Resources.FindObjectsOfTypeAll(); - for (var id = 0; id < orbSlots.Length; id++) - { - var qsbOrbSlot = QSBWorldSync.GetWorldObject(id) ?? new QSBOrbSlot(); - qsbOrbSlot.Init(orbSlots[id], id); - } - - DebugLog.DebugWrite($"Finished orb slot build with {orbSlots.Length} slots.", MessageType.Success); + QSBWorldSync.RemoveWorldObjects(); + QSBWorldSync.Init(); } public void BuildOrbs() diff --git a/QSB/OrbSync/QSBOrbSlot.cs b/QSB/OrbSync/QSBOrbSlot.cs index 31bd860d..a5c20e38 100644 --- a/QSB/OrbSync/QSBOrbSlot.cs +++ b/QSB/OrbSync/QSBOrbSlot.cs @@ -4,17 +4,16 @@ using QSB.WorldSync; namespace QSB.OrbSync { - public class QSBOrbSlot : WorldObject + public class QSBOrbSlot : WorldObject { - public NomaiInterfaceSlot InterfaceSlot { get; private set; } public bool Activated { get; private set; } private bool _initialized; - public void Init(NomaiInterfaceSlot slot, int id) + public override void Init(NomaiInterfaceSlot slot, int id) { ObjectId = id; - InterfaceSlot = slot; + AttachedObject = slot; _initialized = true; QSBWorldSync.AddWorldObject(this); } @@ -34,9 +33,9 @@ namespace QSB.OrbSync return; } var occOrb = state ? QSBWorldSync.OldOrbList[orbId] : null; - InterfaceSlot.SetValue("_occupyingOrb", occOrb); + AttachedObject.SetValue("_occupyingOrb", occOrb); var ev = state ? "OnSlotActivated" : "OnSlotDeactivated"; - QSBWorldSync.RaiseEvent(InterfaceSlot, ev); + QSBWorldSync.RaiseEvent(AttachedObject, ev); Activated = state; } } diff --git a/QSB/Player/Events/PlayerSectorEvent.cs b/QSB/Player/Events/PlayerSectorEvent.cs index eec4de9e..aa8bc60f 100644 --- a/QSB/Player/Events/PlayerSectorEvent.cs +++ b/QSB/Player/Events/PlayerSectorEvent.cs @@ -28,7 +28,7 @@ namespace QSB.Player.Events { return; } - var sector = QSBWorldSync.GetWorldObject(message.ObjectId); + var sector = QSBWorldSync.GetWorldObject(message.ObjectId); if (sector == null) { diff --git a/QSB/QSBNetworkManager.cs b/QSB/QSBNetworkManager.cs index a2441b06..b540e0f9 100644 --- a/QSB/QSBNetworkManager.cs +++ b/QSB/QSBNetworkManager.cs @@ -206,10 +206,10 @@ namespace QSB QSBPlayerManager.RemoveAllPlayers(); - QSBWorldSync.RemoveWorldObjects(); - QSBWorldSync.RemoveWorldObjects(); - QSBWorldSync.RemoveWorldObjects(); - QSBWorldSync.RemoveWorldObjects(); + QSBWorldSync.RemoveWorldObjects(); + QSBWorldSync.RemoveWorldObjects(); + QSBWorldSync.RemoveWorldObjects(); + QSBWorldSync.RemoveWorldObjects(); QSBWorldSync.OrbSyncList.Clear(); QSBWorldSync.OldDialogueTrees.Clear(); @@ -241,10 +241,10 @@ namespace QSB DebugLog.ToConsole("Server stopped!", MessageType.Info); QSBPlayerManager.PlayerList.ForEach(player => player.HudMarker?.Remove()); - QSBWorldSync.RemoveWorldObjects(); - QSBWorldSync.RemoveWorldObjects(); - QSBWorldSync.RemoveWorldObjects(); - QSBWorldSync.RemoveWorldObjects(); + QSBWorldSync.RemoveWorldObjects(); + QSBWorldSync.RemoveWorldObjects(); + QSBWorldSync.RemoveWorldObjects(); + QSBWorldSync.RemoveWorldObjects(); base.OnStopServer(); } diff --git a/QSB/QuantumSync/Events/SocketStateChangeEvent.cs b/QSB/QuantumSync/Events/SocketStateChangeEvent.cs index 862ddb07..609ef8d1 100644 --- a/QSB/QuantumSync/Events/SocketStateChangeEvent.cs +++ b/QSB/QuantumSync/Events/SocketStateChangeEvent.cs @@ -28,8 +28,8 @@ namespace QSB.QuantumSync.Events { return; } - var obj = QSBWorldSync.GetWorldObject(message.ObjectId).AttachedObject; - var socket = QSBWorldSync.GetWorldObject(message.SocketId).AttachedSocket; + var obj = QSBWorldSync.GetWorldObject(message.ObjectId).AttachedObject; + var socket = QSBWorldSync.GetWorldObject(message.SocketId).AttachedSocket; obj.GetType().GetMethod("MoveToSocket", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(obj, new object[] { socket }); obj.transform.localRotation = message.LocalRotation; } diff --git a/QSB/QuantumSync/QSBMultiStateQuantumObject.cs b/QSB/QuantumSync/QSBMultiStateQuantumObject.cs index aa421f51..db82a3a9 100644 --- a/QSB/QuantumSync/QSBMultiStateQuantumObject.cs +++ b/QSB/QuantumSync/QSBMultiStateQuantumObject.cs @@ -1,6 +1,14 @@ -namespace QSB.QuantumSync +using QSB.WorldSync; +using UnityEngine; + +namespace QSB.QuantumSync { - internal class QSBMultiStateQuantumObject + public class QSBMultiStateQuantumObject : WorldObject { + public override void Init(MultiStateQuantumObject attachedObject, int id) + { + ObjectId = id; + AttachedObject = attachedObject; + } } } diff --git a/QSB/QuantumSync/QSBQuantumSocket.cs b/QSB/QuantumSync/QSBQuantumSocket.cs index 566f565b..fb27b617 100644 --- a/QSB/QuantumSync/QSBQuantumSocket.cs +++ b/QSB/QuantumSync/QSBQuantumSocket.cs @@ -3,11 +3,11 @@ using QSB.WorldSync; namespace QSB.QuantumSync { - internal class QSBQuantumSocket : WorldObject + internal class QSBQuantumSocket : WorldObject { public QuantumSocket AttachedSocket { get; private set; } - public void Init(QuantumSocket quantumSocket, int id) + public override void Init(QuantumSocket quantumSocket, int id) { ObjectId = id; AttachedSocket = quantumSocket; diff --git a/QSB/QuantumSync/QSBSocketedQuantumObject.cs b/QSB/QuantumSync/QSBSocketedQuantumObject.cs index fd5aada3..cc498841 100644 --- a/QSB/QuantumSync/QSBSocketedQuantumObject.cs +++ b/QSB/QuantumSync/QSBSocketedQuantumObject.cs @@ -2,11 +2,9 @@ namespace QSB.QuantumSync { - internal class QSBSocketedQuantumObject : WorldObject + internal class QSBSocketedQuantumObject : WorldObject { - public SocketedQuantumObject AttachedObject { get; private set; } - - public void Init(SocketedQuantumObject quantumObject, int id) + public override void Init(SocketedQuantumObject quantumObject, int id) { ObjectId = id; AttachedObject = quantumObject; diff --git a/QSB/QuantumSync/QuantumManager.cs b/QSB/QuantumSync/QuantumManager.cs index beb3f092..26a13a85 100644 --- a/QSB/QuantumSync/QuantumManager.cs +++ b/QSB/QuantumSync/QuantumManager.cs @@ -1,4 +1,5 @@ using QSB.WorldSync; +using System; using System.Collections.Generic; using System.Linq; using UnityEngine; @@ -10,6 +11,7 @@ namespace QSB.QuantumSync public static QuantumManager Instance { get; private set; } private List _socketedQuantumObjects; + private List _multiStateQuantumObjects; private List _quantumSockets; public void Awake() @@ -18,26 +20,17 @@ namespace QSB.QuantumSync QSBSceneManager.OnSceneLoaded += OnSceneLoaded; } + public void OnDestroy() => QSBSceneManager.OnSceneLoaded -= OnSceneLoaded; + private void OnSceneLoaded(OWScene scene, bool isInUniverse) { - _socketedQuantumObjects = Resources.FindObjectsOfTypeAll().ToList(); - for (var id = 0; id < _socketedQuantumObjects.Count; id++) - { - var qsbSocketQuantumObj = QSBWorldSync.GetWorldObject(id) ?? new QSBSocketedQuantumObject(); - qsbSocketQuantumObj.Init(_socketedQuantumObjects[id], id); - QSBWorldSync.AddWorldObject(qsbSocketQuantumObj); - } - - _quantumSockets = Resources.FindObjectsOfTypeAll().ToList(); - for (var id = 0; id < _quantumSockets.Count; id++) - { - var qsbQuantumSocket = QSBWorldSync.GetWorldObject(id) ?? new QSBQuantumSocket(); - qsbQuantumSocket.Init(_quantumSockets[id], id); - QSBWorldSync.AddWorldObject(qsbQuantumSocket); - } + QSBWorldSync.Init(ref _socketedQuantumObjects); + QSBWorldSync.Init(ref _quantumSockets); + QSBWorldSync.Init(ref _multiStateQuantumObjects); } public int GetId(SocketedQuantumObject obj) => _socketedQuantumObjects.IndexOf(obj); + public int GetId(MultiStateQuantumObject obj) => _multiStateQuantumObjects.IndexOf(obj); public int GetId(QuantumSocket obj) => _quantumSockets.IndexOf(obj); } } \ No newline at end of file diff --git a/QSB/SectorSync/QSBSector.cs b/QSB/SectorSync/QSBSector.cs index 232cec20..f0053f38 100644 --- a/QSB/SectorSync/QSBSector.cs +++ b/QSB/SectorSync/QSBSector.cs @@ -3,18 +3,17 @@ using UnityEngine; namespace QSB.SectorSync { - public class QSBSector : WorldObject + public class QSBSector : WorldObject { - public Sector Sector { get; private set; } - public Sector.Name Type => Sector.GetName(); - public string Name => Sector.name; - public Transform Transform => Sector.transform; + public Sector.Name Type => AttachedObject.GetName(); + public string Name => AttachedObject.name; + public Transform Transform => AttachedObject.transform; public Vector3 Position => Transform.position; - public void Init(Sector sector, int id) + public override void Init(Sector sector, int id) { - Sector = sector; ObjectId = id; + AttachedObject = sector; } } } \ No newline at end of file diff --git a/QSB/SectorSync/QSBSectorManager.cs b/QSB/SectorSync/QSBSectorManager.cs index 3e1e7161..345130e0 100644 --- a/QSB/SectorSync/QSBSectorManager.cs +++ b/QSB/SectorSync/QSBSectorManager.cs @@ -29,11 +29,11 @@ namespace QSB.SectorSync public void RebuildSectors() { DebugLog.DebugWrite("Rebuilding sectors...", MessageType.Warning); - QSBWorldSync.RemoveWorldObjects(); + QSBWorldSync.RemoveWorldObjects(); var sectors = Resources.FindObjectsOfTypeAll().ToList(); for (var id = 0; id < sectors.Count; id++) { - var qsbSector = QSBWorldSync.GetWorldObject(id) ?? new QSBSector(); + var qsbSector = QSBWorldSync.GetWorldObject(id) ?? new QSBSector(); qsbSector.Init(sectors[id], id); QSBWorldSync.AddWorldObject(qsbSector); } @@ -43,7 +43,7 @@ namespace QSB.SectorSync public QSBSector GetClosestSector(Transform trans) // trans rights \o/ { return QSBWorldSync.GetWorldObjects() - .Where(sector => sector.Sector != null + .Where(sector => sector.AttachedObject != null && !_sectorBlacklist.Contains(sector.Type) && sector.Transform.gameObject.activeInHierarchy) .OrderBy(sector => Vector3.Distance(sector.Position, trans.position)) diff --git a/QSB/TransformSync/PlayerProbeSync.cs b/QSB/TransformSync/PlayerProbeSync.cs index dff970cb..0cdc42ff 100644 --- a/QSB/TransformSync/PlayerProbeSync.cs +++ b/QSB/TransformSync/PlayerProbeSync.cs @@ -63,7 +63,7 @@ namespace QSB.TransformSync DebugLog.ToConsole($"DisabledSocket is null for {AttachedNetId}! (ProbeLauncher null? : {Player.ProbeLauncher == null})", MessageType.Error); return; } - if (Player.GetState(State.ProbeActive) || ReferenceSector?.Sector == null) + if (Player.GetState(State.ProbeActive) || ReferenceSector?.AttachedObject == null) { return; } diff --git a/QSB/TransformSync/TransformSync.cs b/QSB/TransformSync/TransformSync.cs index 28880edf..060d0f9c 100644 --- a/QSB/TransformSync/TransformSync.cs +++ b/QSB/TransformSync/TransformSync.cs @@ -86,7 +86,7 @@ namespace QSB.TransformSync { if (HasAuthority) // If this script is attached to the client's own body on the client's side. { - if (ReferenceSector == null || ReferenceSector.Sector == null) + if (ReferenceSector == null || ReferenceSector.AttachedObject == null) { DebugLog.ToConsole($"Error - ReferenceSector has null value for {Player.PlayerId}.{GetType().Name}", MessageType.Error); return; diff --git a/QSB/WorldSync/QSBWorldSync.cs b/QSB/WorldSync/QSBWorldSync.cs index e95e08b5..d83f3eb4 100644 --- a/QSB/WorldSync/QSBWorldSync.cs +++ b/QSB/WorldSync/QSBWorldSync.cs @@ -3,9 +3,11 @@ using QSB.OrbSync; using QSB.TransformSync; using QSB.Utility; using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using System.Reflection; +using UnityEngine; namespace QSB.WorldSync { @@ -17,36 +19,43 @@ namespace QSB.WorldSync public static Dictionary DialogueConditions { get; } = new Dictionary(); public static List ShipLogFacts { get; } = new List(); - private static readonly List WorldObjects = new List(); + private static readonly List WorldObjects = new List(); - public static void AddWorldObject(WorldObject worldObject) + public static void AddWorldObject(object worldObject) { if (WorldObjects.Contains(worldObject)) { return; } + DebugLog.DebugWrite($"adding {worldObject.GetType().Name}"); WorldObjects.Add(worldObject); } public static IEnumerable GetWorldObjects() => WorldObjects.OfType(); - public static T GetWorldObject(int id) where T : WorldObject => GetWorldObjects().FirstOrDefault(x => x.ObjectId == id); + public static T GetWorldObject(int id) where T : WorldObject where U : UnityEngine.Object + => GetWorldObjects().FirstOrDefault(x => x.ObjectId == id); - public static void RemoveWorldObjects() where T : WorldObject => WorldObjects.RemoveAll(x => x.GetType() == typeof(T)); + public static void RemoveWorldObjects() where T : WorldObject where U : UnityEngine.Object + => WorldObjects.RemoveAll(x => x.GetType() == typeof(T)); - public static void HandleSlotStateChange(NomaiInterfaceSlot slot, NomaiInterfaceOrb affectingOrb, bool state) + public static void Init(ref List list) + where QSBType : WorldObject + where BaseType : UnityEngine.Object + => list = Init(); + + public static List Init() + where QSBType : WorldObject + where BaseType : UnityEngine.Object { - var slotList = GetWorldObjects().ToList(); - if (!slotList.Any()) + var list = Resources.FindObjectsOfTypeAll().ToList(); + for (var id = 0; id < list.Count; id++) { - return; - } - var qsbSlot = slotList.First(x => x.InterfaceSlot == slot); - var orbSync = OrbSyncList.First(x => x.AttachedOrb == affectingOrb); - if (orbSync.HasAuthority) - { - qsbSlot.HandleEvent(state, OldOrbList.IndexOf(affectingOrb)); + var obj = GetWorldObject(id) ?? (QSBType)Activator.CreateInstance(typeof(QSBType)); + obj.Init(list[id], id); + AddWorldObject(obj); } + return list; } public static void RaiseEvent(object instance, string eventName) @@ -64,6 +73,21 @@ namespace QSB.WorldSync } } + public static void HandleSlotStateChange(NomaiInterfaceSlot slot, NomaiInterfaceOrb affectingOrb, bool state) + { + var slotList = GetWorldObjects().ToList(); + if (!slotList.Any()) + { + return; + } + var qsbSlot = slotList.First(x => x.AttachedObject == slot); + var orbSync = OrbSyncList.First(x => x.AttachedOrb == affectingOrb); + if (orbSync.HasAuthority) + { + qsbSlot.HandleEvent(state, OldOrbList.IndexOf(affectingOrb)); + } + } + public static void SetDialogueCondition(string name, bool state) { if (!QSBCore.IsServer) diff --git a/QSB/WorldSync/WorldObject.cs b/QSB/WorldSync/WorldObject.cs index 8fa1b0af..c2fa0624 100644 --- a/QSB/WorldSync/WorldObject.cs +++ b/QSB/WorldSync/WorldObject.cs @@ -1,7 +1,10 @@ namespace QSB.WorldSync { - public class WorldObject + public abstract class WorldObject where T : UnityEngine.Object { public int ObjectId { get; protected set; } + public T AttachedObject { get; protected set; } + + public abstract void Init(T attachedObject, int id); } } \ No newline at end of file