diff --git a/QSB/Events/EventList.cs b/QSB/Events/EventList.cs index 74d32673..22ba4103 100644 --- a/QSB/Events/EventList.cs +++ b/QSB/Events/EventList.cs @@ -1,4 +1,5 @@ using QSB.ElevatorSync; +using QSB.GeyserSync; namespace QSB.Events { @@ -24,6 +25,7 @@ namespace QSB.Events new PlayerDeathEvent(); new PlayerStatesRequestEvent(); new ElevatorEvent(); + new GeyserEvent(); Ready = true; } diff --git a/QSB/Events/EventNames.cs b/QSB/Events/EventNames.cs index c4909cdc..e0ff8a1a 100644 --- a/QSB/Events/EventNames.cs +++ b/QSB/Events/EventNames.cs @@ -28,5 +28,6 @@ public static string QSBOnProbeAnchor = "QSBOnProbeAnchor"; public static string QSBOnProbeWarp = "QSBOnProbeWarp"; public static string QSBStartLift = "QSBStartLift"; + public static string QSBGeyserState = "QSBGeyserState"; } } diff --git a/QSB/GeyserSync/GeyserEvent.cs b/QSB/GeyserSync/GeyserEvent.cs new file mode 100644 index 00000000..552634d7 --- /dev/null +++ b/QSB/GeyserSync/GeyserEvent.cs @@ -0,0 +1,44 @@ +using QSB.Events; +using QSB.Messaging; +using QSB.Utility; +using QSB.WorldSync; + +namespace QSB.GeyserSync +{ + public class GeyserEvent : QSBEvent + { + public override MessageType Type => MessageType.Geyser; + + public static SyncObjects ObjectType => SyncObjects.Geysers; + + public override void SetupListener() + { + GlobalMessenger.AddListener(EventNames.QSBGeyserState, (controller, state) => SendEvent(CreateMessage(controller, state))); + } + + private GeyserMessage CreateMessage(GeyserController controller, bool state) => new GeyserMessage + { + SenderId = PlayerRegistry.LocalPlayer.NetId, + ObjectID = WorldRegistry.GetObjectID(ObjectType, controller), + ObjectType = ObjectType, + State = state + }; + + public override void OnReceiveRemote(GeyserMessage message) + { + if (!IsInUniverse || message.SenderId == PlayerRegistry.LocalPlayer.NetId) + { + return; + } + DebugLog.ToConsole($"Recieved geyser event for {message.ObjectID} to {message.State}"); + if (message.State) + { + WorldRegistry.GeyserControllers[message.ObjectID].ActivateGeyser(); + } + else + { + WorldRegistry.GeyserControllers[message.ObjectID].DeactivateGeyser(); + } + } + } +} diff --git a/QSB/GeyserSync/GeyserMessage.cs b/QSB/GeyserSync/GeyserMessage.cs new file mode 100644 index 00000000..dceac840 --- /dev/null +++ b/QSB/GeyserSync/GeyserMessage.cs @@ -0,0 +1,22 @@ +using QSB.Messaging; +using UnityEngine.Networking; + +namespace QSB.GeyserSync +{ + public class GeyserMessage : WorldObjectMessage + { + public bool State { get; set; } + + public override void Deserialize(NetworkReader reader) + { + base.Deserialize(reader); + State = reader.ReadBoolean(); + } + + public override void Serialize(NetworkWriter writer) + { + base.Serialize(writer); + writer.Write(State); + } + } +} diff --git a/QSB/Messaging/MessageType.cs b/QSB/Messaging/MessageType.cs index 5ec13ec3..ede1be66 100644 --- a/QSB/Messaging/MessageType.cs +++ b/QSB/Messaging/MessageType.cs @@ -18,6 +18,7 @@ PlayerSectorChange, PlayerReady, ProbeActiveChange, - Elevator + Elevator, + Geyser } } diff --git a/QSB/Messaging/WorldObjectMessage.cs b/QSB/Messaging/WorldObjectMessage.cs new file mode 100644 index 00000000..5bd56e73 --- /dev/null +++ b/QSB/Messaging/WorldObjectMessage.cs @@ -0,0 +1,25 @@ +using QSB.WorldSync; +using UnityEngine.Networking; + +namespace QSB.Messaging +{ + public class WorldObjectMessage : PlayerMessage + { + public SyncObjects ObjectType { get; set; } + public int ObjectID { get; set; } + + public override void Deserialize(NetworkReader reader) + { + base.Deserialize(reader); + ObjectType = (SyncObjects)reader.ReadInt32(); + ObjectID = reader.ReadInt32(); + } + + public override void Serialize(NetworkWriter writer) + { + base.Serialize(writer); + writer.Write((int)ObjectType); + writer.Write(ObjectID); + } + } +} diff --git a/QSB/QSB.cs b/QSB/QSB.cs index 4913705e..0944259c 100644 --- a/QSB/QSB.cs +++ b/QSB/QSB.cs @@ -2,9 +2,11 @@ using OWML.ModHelper; using QSB.ElevatorSync; using QSB.Events; +using QSB.GeyserSync; using QSB.Utility; using UnityEngine; using UnityEngine.Networking; +using UnityEngine.SceneManagement; namespace QSB { @@ -33,17 +35,14 @@ namespace QSB GlobalMessenger.AddListener(EventNames.RestartTimeLoop, OnLoopStart); GlobalMessenger.AddListener(EventNames.WakeUp, OnWakeUp); + + SceneManager.sceneLoaded += OnSceneLoad; } private void OnWakeUp() { WokenUp = true; GlobalMessenger.FireEvent(EventNames.QSBPlayerStatesRequest); - - foreach (var geyser in GameObject.FindObjectsOfType()) - { - DebugLog.ToConsole(geyser.name + " : " + geyser.GetInstanceID()); - } } private void OnLoopStart() @@ -51,6 +50,11 @@ namespace QSB WokenUp = false; } + private void OnSceneLoad(Scene scene, LoadSceneMode mode) + { + WorldRegistry.GenerateComponentList(); + } + public override void Configure(IModConfig config) { DefaultServerIP = config.GetSettingsValue("defaultServerIP"); diff --git a/QSB/QSB.csproj b/QSB/QSB.csproj index 8f202b7c..35109cce 100644 --- a/QSB/QSB.csproj +++ b/QSB/QSB.csproj @@ -134,7 +134,8 @@ - + + @@ -144,6 +145,7 @@ + @@ -183,6 +185,7 @@ + diff --git a/QSB/QSBNetworkManager.cs b/QSB/QSBNetworkManager.cs index ea153d21..0a18f77b 100644 --- a/QSB/QSBNetworkManager.cs +++ b/QSB/QSBNetworkManager.cs @@ -121,9 +121,10 @@ namespace QSB gameObject.AddComponent(); gameObject.AddComponent(); - if (!Network.isServer) + if (NetworkClient.active && !NetworkServer.active) { gameObject.AddComponent(); + QSB.Helper.HarmonyHelper.EmptyMethod("Update"); } _canEditName = false; diff --git a/QSB/WorldRegistry.cs b/QSB/WorldRegistry.cs index 41581f8d..ec296e9d 100644 --- a/QSB/WorldRegistry.cs +++ b/QSB/WorldRegistry.cs @@ -1,31 +1,39 @@ -using System; +using QSB.Events; +using QSB.Utility; +using QSB.WorldSync; using System.Collections.Generic; using System.Linq; -using System.Text; using UnityEngine; +using UnityEngine.Networking; namespace QSB { public static class WorldRegistry { - private static List ComponentList = new List(); + public static List GeyserControllers = new List(); - public static Dictionary GetInstanceIds(Type typeToFind) + public static void GenerateComponentList() { - var components = GameObject.FindObjectsOfType(typeToFind); - var dict = new Dictionary(); - foreach (var component in components) + GeyserControllers = Resources.FindObjectsOfTypeAll().ToList(); + + foreach (var component in GeyserControllers) { - dict.Add(component.GetInstanceID(), component); + if (NetworkServer.active) + { + component.OnGeyserActivateEvent += () => GlobalMessenger.FireEvent(EventNames.QSBGeyserState, component, true); + component.OnGeyserDeactivateEvent += () => GlobalMessenger.FireEvent(EventNames.QSBGeyserState, component, false); + } } - return dict; + } + + public static int GetObjectID(SyncObjects type, object component) + { + switch (type) + { + case SyncObjects.Geysers: + return GeyserControllers.FindIndex(x => x == component); + } + return 0; } } - - class QSBWorldComponent - { - public int InstanceID; - public string Hierarchy; - public object Instance; - } } diff --git a/QSB/GeyserSync/GeyserPatches.cs b/QSB/WorldSync/SyncObjects.cs similarity index 60% rename from QSB/GeyserSync/GeyserPatches.cs rename to QSB/WorldSync/SyncObjects.cs index 16c2cbca..3d4b8e0e 100644 --- a/QSB/GeyserSync/GeyserPatches.cs +++ b/QSB/WorldSync/SyncObjects.cs @@ -3,9 +3,10 @@ using System.Collections.Generic; using System.Linq; using System.Text; -namespace QSB.GeyserSync +namespace QSB.WorldSync { - class GeyserPatches + public enum SyncObjects { + Geysers } }