using QSB.OrbSync; using QSB.TransformSync; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using UnityEngine; using UnityEngine.Networking; namespace QSB.WorldSync { public static class WorldRegistry { private static readonly List WorldObjects = new List(); public static List OrbSyncList = new List(); public static List OldOrbList = new List(); public static List OldDialogueTrees = new List(); public static void InitOnSceneLoaded(GameObject orbPrefab) { OldOrbList = Resources.FindObjectsOfTypeAll().ToList(); if (NetworkServer.active) { OldOrbList.ForEach(x => NetworkServer.Spawn(UnityEngine.Object.Instantiate(orbPrefab))); } OldDialogueTrees = Resources.FindObjectsOfTypeAll().ToList(); } public static void AddObject(WorldObject worldObject) { if (WorldObjects.Contains(worldObject)) { return; } WorldObjects.Add(worldObject); } public static IEnumerable GetObjects() { return WorldObjects.OfType(); } public static T GetObject(int id) where T : WorldObject { return GetObjects().FirstOrDefault(x => x.ObjectId == id); } public static void RemoveObjects() where T : WorldObject { WorldObjects.RemoveAll(x => x.GetType() == typeof(T)); } public static void HandleSlotStateChange(NomaiInterfaceSlot slot, NomaiInterfaceOrb affectingOrb, bool state) { var qsbSlot = GetObjects().First(x => x.InterfaceSlot == slot); var orbSync = OrbSyncList.First(x => x.AttachedOrb == affectingOrb); if (orbSync.hasAuthority) { qsbSlot.HandleEvent(state); } } public static void RaiseEvent(object instance, string eventName) { if (!(instance.GetType() .GetField(eventName, BindingFlags.Instance | BindingFlags.NonPublic)? .GetValue(instance) is MulticastDelegate multiDelegate)) { return; } var delegateList = multiDelegate.GetInvocationList().ToList(); delegateList.ForEach(x => x.DynamicInvoke(instance)); } } }