using System; using System.Collections.Generic; using UnityEngine; public static class KGFAccessor { public class KGFAccessorEventargs : EventArgs { private object itsObject; public KGFAccessorEventargs(object theObject) { itsObject = theObject; } public object GetObject() { return itsObject; } } private static Dictionary> itsListSorted = new Dictionary>(); private static Dictionary itsListEventsAdd = new Dictionary(); private static Dictionary itsListEventsAddOnce = new Dictionary(); private static Dictionary itsListEventsRemove = new Dictionary(); public static void AddKGFObject(KGFObject theObjectScript) { Type type = theObjectScript.GetType(); if (!itsListSorted.ContainsKey(type)) { itsListSorted[type] = new List(); } itsListSorted[type].Add(theObjectScript); foreach (Type key in itsListEventsAdd.Keys) { if (key.IsAssignableFrom(type)) { itsListEventsAdd[key].Trigger(null, new KGFAccessorEventargs(theObjectScript)); } } if (itsListEventsAddOnce.Count <= 0) { return; } List list = new List(); foreach (Type key2 in itsListEventsAddOnce.Keys) { if (key2.IsAssignableFrom(type)) { list.Add(key2); } } foreach (Type item in list) { itsListEventsAddOnce[item].Trigger(null, new KGFAccessorEventargs(theObjectScript)); itsListEventsAddOnce.Remove(item); } } public static void RemoveKGFObject(KGFObject theObjectScript) { Type type = theObjectScript.GetType(); try { itsListSorted[type].Remove(theObjectScript); } catch { } foreach (Type key in itsListEventsRemove.Keys) { if (key.IsAssignableFrom(type)) { itsListEventsRemove[key].Trigger(null, new KGFAccessorEventargs(theObjectScript)); } } } public static void GetExternal(Action theRegisterCallback) { T val = GetObject(); if (val != null) { theRegisterCallback(null, new KGFAccessorEventargs(val)); } else { RegisterAddOnceEvent(theRegisterCallback); } } public static void RegisterAddEvent(Action theCallback) { if (theCallback != null) { Type typeFromHandle = typeof(T); if (!itsListEventsAdd.ContainsKey(typeFromHandle)) { itsListEventsAdd[typeFromHandle] = new KGFDelegate(); } itsListEventsAdd[typeFromHandle] += theCallback; } } public static void RegisterAddOnceEvent(Action theCallback) { if (theCallback != null) { Type typeFromHandle = typeof(T); if (!itsListEventsAddOnce.ContainsKey(typeFromHandle)) { itsListEventsAddOnce[typeFromHandle] = new KGFDelegate(); } itsListEventsAddOnce[typeFromHandle] += theCallback; } } public static void UnregisterAddEvent(Action theCallback) { Type typeFromHandle = typeof(T); if (itsListEventsAdd.ContainsKey(typeFromHandle)) { itsListEventsAdd[typeFromHandle] -= theCallback; } } public static void RegisterRemoveEvent(Action theCallback) { if (theCallback != null) { Type typeFromHandle = typeof(T); if (!itsListEventsRemove.ContainsKey(typeFromHandle)) { itsListEventsRemove[typeFromHandle] = new KGFDelegate(); } itsListEventsRemove[typeFromHandle] += theCallback; } } public static void UnregisterRemoveEvent(Action theCallback) { Type typeFromHandle = typeof(T); if (itsListEventsRemove.ContainsKey(typeFromHandle)) { itsListEventsRemove[typeFromHandle] -= theCallback; } } public static IEnumerable GetObjectsEnumerable() { foreach (object anObject in GetObjectsEnumerable(typeof(T))) { yield return (T)anObject; } } public static IEnumerable GetObjectsEnumerable(Type theType) { foreach (Type aType in itsListSorted.Keys) { if (!theType.IsAssignableFrom(aType)) { continue; } List aListObjectScripts = itsListSorted[aType]; for (int i = aListObjectScripts.Count - 1; i >= 0; i--) { object anObject = aListObjectScripts[i]; MonoBehaviour aMonobehaviour = aListObjectScripts[i]; if (aMonobehaviour == null) { aListObjectScripts.RemoveAt(i); } else if (aMonobehaviour.gameObject == null) { aListObjectScripts.RemoveAt(i); } else { yield return anObject; } } } } public static List GetObjects() { return new List(GetObjectsEnumerable()); } public static List GetObjects(Type theType) { return new List(GetObjectsEnumerable(theType)); } public static IEnumerable GetObjectsNames() where T : KGFObject { foreach (T anObject in GetObjects()) { yield return anObject.name; } } public static T GetObject() { using (IEnumerator enumerator = GetObjectsEnumerable().GetEnumerator()) { if (enumerator.MoveNext()) { return enumerator.Current; } } return default(T); } public static object GetObject(Type theType) { using (IEnumerator enumerator = GetObjectsEnumerable(theType).GetEnumerator()) { if (enumerator.MoveNext()) { return enumerator.Current; } } return null; } public static int GetAddHandlerCount() { return itsListEventsAdd.Count; } public static int GetAddOnceHandlerCount() { return itsListEventsAddOnce.Count; } public static IEnumerable GetObjectCacheListTypes() { foreach (Type key in itsListSorted.Keys) { yield return key; } } public static int GetObjectCacheListCountByType(Type theType) { if (itsListSorted.ContainsKey(theType)) { return itsListSorted[theType].Count; } return 0; } }