diff --git a/QSB/ElevatorSync/ElevatorEvent.cs b/QSB/ElevatorSync/ElevatorEvent.cs index b26a018b..c6df7375 100644 --- a/QSB/ElevatorSync/ElevatorEvent.cs +++ b/QSB/ElevatorSync/ElevatorEvent.cs @@ -10,14 +10,14 @@ namespace QSB.ElevatorSync public override void SetupListener() { - GlobalMessenger.AddListener(EventNames.QSBStartLift, (direction, elevatorName) => SendEvent(CreateMessage(direction, elevatorName))); + GlobalMessenger.AddListener(EventNames.QSBStartLift, (id, direction) => SendEvent(CreateMessage(id, direction))); } - private ElevatorMessage CreateMessage(ElevatorDirection direction, string elevatorName) => new ElevatorMessage + private ElevatorMessage CreateMessage(int id, ElevatorDirection direction) => new ElevatorMessage { SenderId = PlayerRegistry.LocalPlayer.NetId, Direction = direction, - UniqueName = elevatorName + Id = id }; public override void OnReceiveRemote(ElevatorMessage message) @@ -26,7 +26,7 @@ namespace QSB.ElevatorSync { return; } - WorldRegistry.GetObject(message.UniqueName).RemoteCall(message.Direction); + WorldRegistry.GetObject(message.Id).RemoteCall(message.Direction); } } } diff --git a/QSB/ElevatorSync/ElevatorManager.cs b/QSB/ElevatorSync/ElevatorManager.cs index bf217c1e..c9de99b2 100644 --- a/QSB/ElevatorSync/ElevatorManager.cs +++ b/QSB/ElevatorSync/ElevatorManager.cs @@ -1,24 +1,34 @@ -using UnityEngine; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; namespace QSB.ElevatorSync { public class ElevatorManager : MonoBehaviour { + public static ElevatorManager Instance { get; private set; } + + private List _elevators; + private void Awake() { - QSB.Helper.Events.Subscribe(OWML.Common.Events.AfterAwake); - QSB.Helper.Events.Event += OnEvent; + Instance = this; + + LoadManager.OnCompleteSceneLoad += OnCompleteSceneLoad; QSB.Helper.HarmonyHelper.AddPostfix("StartLift", typeof(ElevatorPatches), nameof(ElevatorPatches.StartLift)); } - private void OnEvent(MonoBehaviour behaviour, OWML.Common.Events ev) + private void OnCompleteSceneLoad(OWScene oldScene, OWScene newScene) { - if (behaviour is Elevator elevator && ev == OWML.Common.Events.AfterAwake) + _elevators = Resources.FindObjectsOfTypeAll().ToList(); + for (var id = 0; id < _elevators.Count; id++) { var elevatorController = new QSBElevator(); - elevatorController.Init(elevator); + elevatorController.Init(_elevators[id], id); } } + + public int GetId(Elevator elevator) => _elevators.IndexOf(elevator); } } diff --git a/QSB/ElevatorSync/ElevatorPatches.cs b/QSB/ElevatorSync/ElevatorPatches.cs index 6eba7bd6..206892c5 100644 --- a/QSB/ElevatorSync/ElevatorPatches.cs +++ b/QSB/ElevatorSync/ElevatorPatches.cs @@ -9,7 +9,8 @@ namespace QSB.ElevatorSync { var isGoingUp = __instance.GetValue("_goingToTheEnd"); var direction = isGoingUp ? ElevatorDirection.Up : ElevatorDirection.Down; - GlobalMessenger.FireEvent(EventNames.QSBStartLift, direction, __instance.name); + var id = ElevatorManager.Instance.GetId(__instance); + GlobalMessenger.FireEvent(EventNames.QSBStartLift, id, direction); } } } diff --git a/QSB/ElevatorSync/QSBElevator.cs b/QSB/ElevatorSync/QSBElevator.cs index 0dcb5b48..a6ab30b2 100644 --- a/QSB/ElevatorSync/QSBElevator.cs +++ b/QSB/ElevatorSync/QSBElevator.cs @@ -1,4 +1,5 @@ using OWML.ModHelper.Events; +using QSB.Utility; using QSB.WorldSync; using UnityEngine; @@ -6,8 +7,6 @@ namespace QSB.ElevatorSync { public class QSBElevator : WorldObject { - public override string UniqueName => _elevator.name; - private Elevator _elevator; private Vector3 _startLocalPos; private Vector3 _endLocalPos; @@ -16,10 +15,16 @@ namespace QSB.ElevatorSync private OWAudioSource _owAudioSourceOneShot; private OWAudioSource _owAudioSourceLP; - public void Init(Elevator elevator) + public void Init(Elevator elevator, int id) { - WorldRegistry.WorldObjects.Add(this); _elevator = elevator; + Id = id; + WorldRegistry.WorldObjects.Add(this); + UnityHelper.Instance.RunWhen(() => _elevator.GetValue("_interactVolume") != null, InitValues); + } + + private void InitValues() + { _startLocalPos = _elevator.GetValue("_startLocalPos"); _endLocalPos = _elevator.GetValue("_endLocalPos"); _interactVolume = _elevator.GetValue("_interactVolume"); diff --git a/QSB/GeyserSync/GeyserEvent.cs b/QSB/GeyserSync/GeyserEvent.cs index 3bbbb41b..96b38023 100644 --- a/QSB/GeyserSync/GeyserEvent.cs +++ b/QSB/GeyserSync/GeyserEvent.cs @@ -10,13 +10,13 @@ namespace QSB.GeyserSync public override void SetupListener() { - GlobalMessenger.AddListener(EventNames.QSBGeyserState, (name, state) => SendEvent(CreateMessage(name, state))); + GlobalMessenger.AddListener(EventNames.QSBGeyserState, (id, state) => SendEvent(CreateMessage(id, state))); } - private GeyserMessage CreateMessage(string name, bool state) => new GeyserMessage + private GeyserMessage CreateMessage(int id, bool state) => new GeyserMessage { SenderId = PlayerRegistry.LocalPlayer.NetId, - UniqueName = name, + Id = id, State = state }; @@ -26,7 +26,7 @@ namespace QSB.GeyserSync { return; } - var geyser = WorldRegistry.GetObject(message.UniqueName); + var geyser = WorldRegistry.GetObject(message.Id); geyser.SetState(message.State); } } diff --git a/QSB/GeyserSync/GeyserManager.cs b/QSB/GeyserSync/GeyserManager.cs index 514a7012..22494118 100644 --- a/QSB/GeyserSync/GeyserManager.cs +++ b/QSB/GeyserSync/GeyserManager.cs @@ -10,19 +10,19 @@ namespace QSB.GeyserSync { Instance = this; - QSB.Helper.Events.Subscribe(OWML.Common.Events.AfterAwake); - QSB.Helper.Events.Event += OnEvent; + LoadManager.OnCompleteSceneLoad += OnCompleteSceneLoad; } - private void OnEvent(MonoBehaviour behaviour, OWML.Common.Events ev) + private void OnCompleteSceneLoad(OWScene oldScene, OWScene newScene) { - if (behaviour is GeyserController geyserController && ev == OWML.Common.Events.AfterAwake) + var geyserControllers = Resources.FindObjectsOfTypeAll(); + for (var id = 0; id < geyserControllers.Length; id++) { var geyser = new QSBGeyser(); - geyser.Init(geyserController); + geyser.Init(geyserControllers[id], id); } } - + public void EmptyUpdate() { QSB.Helper.HarmonyHelper.EmptyMethod("Update"); diff --git a/QSB/GeyserSync/QSBGeyser.cs b/QSB/GeyserSync/QSBGeyser.cs index d85b40e2..378ad433 100644 --- a/QSB/GeyserSync/QSBGeyser.cs +++ b/QSB/GeyserSync/QSBGeyser.cs @@ -6,12 +6,11 @@ namespace QSB.GeyserSync { public class QSBGeyser : WorldObject { - public override string UniqueName => _geyserController.name; - private GeyserController _geyserController; - public void Init(GeyserController geyserController) + public void Init(GeyserController geyserController, int id) { + Id = id; WorldRegistry.WorldObjects.Add(this); _geyserController = geyserController; @@ -23,7 +22,7 @@ namespace QSB.GeyserSync { if (NetworkServer.active) { - GlobalMessenger.FireEvent(EventNames.QSBGeyserState, UniqueName, state); + GlobalMessenger.FireEvent(EventNames.QSBGeyserState, Id, state); } } diff --git a/QSB/QSB.csproj b/QSB/QSB.csproj index 376ab3a3..01e175ec 100644 --- a/QSB/QSB.csproj +++ b/QSB/QSB.csproj @@ -83,7 +83,9 @@ False $(GameDir)\OuterWilds_Data\Managed\UnityEngine.AnimationModule.dll - + + $(GameDir)\OuterWilds_Data\Managed\UnityEngine.AudioModule.dll + False $(GameDir)\OuterWilds_Data\Managed\UnityEngine.CoreModule.dll diff --git a/QSB/WorldSync/WorldObject.cs b/QSB/WorldSync/WorldObject.cs index 4425cc27..4d20e336 100644 --- a/QSB/WorldSync/WorldObject.cs +++ b/QSB/WorldSync/WorldObject.cs @@ -1,7 +1,7 @@ namespace QSB.WorldSync { - public abstract class WorldObject + public class WorldObject { - public abstract string UniqueName { get; } + public int Id { get; protected set; } } } diff --git a/QSB/WorldSync/WorldObjectMessage.cs b/QSB/WorldSync/WorldObjectMessage.cs index e71662dd..ce97b38b 100644 --- a/QSB/WorldSync/WorldObjectMessage.cs +++ b/QSB/WorldSync/WorldObjectMessage.cs @@ -5,18 +5,18 @@ namespace QSB.WorldSync { public class WorldObjectMessage : PlayerMessage { - public string UniqueName { get; set; } + public int Id { get; set; } public override void Deserialize(NetworkReader reader) { base.Deserialize(reader); - UniqueName = reader.ReadString(); + Id = reader.ReadInt32(); } public override void Serialize(NetworkWriter writer) { base.Serialize(writer); - writer.Write(UniqueName); + writer.Write(Id); } } } diff --git a/QSB/WorldSync/WorldRegistry.cs b/QSB/WorldSync/WorldRegistry.cs index 90749ccf..ac131b69 100644 --- a/QSB/WorldSync/WorldRegistry.cs +++ b/QSB/WorldSync/WorldRegistry.cs @@ -7,9 +7,9 @@ namespace QSB.WorldSync { public static List WorldObjects { get; } = new List(); - public static T GetObject(string uniqueName) where T : WorldObject + public static T GetObject(int id) where T : WorldObject { - return WorldObjects.OfType().FirstOrDefault(x => x.UniqueName == uniqueName); + return WorldObjects.OfType().FirstOrDefault(x => x.Id == id); } } }