/// <summary> /// Initialize UnityExplorer with the provided Loader implementation. /// </summary> public static void Init(IExplorerLoader loader) { if (Loader != null) { LogWarning("UnityExplorer is already loaded!"); return; } Loader = loader; Log($"{NAME} {VERSION} initializing..."); if (!Directory.Exists(Loader.ExplorerFolder)) { Directory.CreateDirectory(Loader.ExplorerFolder); } ConfigManager.Init(Loader.ConfigHandler); UERuntimeHelper.Init(); ExplorerBehaviour.Setup(); UnityCrashPrevention.Init(); UniverseLib.Universe.Init(ConfigManager.Startup_Delay_Time.Value, LateInit, Log, new() { Disable_EventSystem_Override = ConfigManager.Disable_EventSystem_Override.Value, Force_Unlock_Mouse = ConfigManager.Force_Unlock_Mouse.Value, Unhollowed_Modules_Folder = loader.UnhollowedModulesFolder }); }
// ~~~~~~~~~~~ Add Hooks window ~~~~~~~~~~~ public void OnClassSelectedForHooks(string typeFullName) { var type = ReflectionUtility.GetTypeByName(typeFullName); if (type == null) { ExplorerCore.LogWarning($"Could not find any type by name {typeFullName}!"); return; } Panel.SetAddHooksLabelType(SignatureHighlighter.Parse(type, true)); Panel.ResetMethodFilter(); filteredEligableMethods.Clear(); currentAddEligableMethods.Clear(); foreach (var method in type.GetMethods(ReflectionUtility.FLAGS)) { if (method.IsGenericMethod || UERuntimeHelper.IsBlacklisted(method)) { continue; } currentAddEligableMethods.Add(method); filteredEligableMethods.Add(method); } isAddingMethods = true; Panel.SetPage(HookManagerPanel.Pages.ClassMethodSelector); Panel.AddHooksScrollPool.Refresh(true, true); }
static void TryCacheMember( MemberInfo member, IList list, HashSet <string> cachedSigs, Type declaringType, ReflectionInspector inspector, bool ignorePropertyMethodInfos = true) { try { if (UERuntimeHelper.IsBlacklisted(member)) { return; } string sig = member switch { MethodBase mb => mb.FullDescription(), PropertyInfo or FieldInfo => $"{member.DeclaringType.FullDescription()}.{member.Name}", _ => throw new NotImplementedException(), }; if (cachedSigs.Contains(sig)) { return; } // ExplorerCore.Log($"Trying to cache member {sig}... ({member.MemberType})"); CacheMember cached; Type returnType; switch (member.MemberType) { case MemberTypes.Constructor: { var ci = member as ConstructorInfo; cached = new CacheConstructor(ci); returnType = ci.DeclaringType; } break; case MemberTypes.Method: { var mi = member as MethodInfo; if (ignorePropertyMethodInfos && (mi.Name.StartsWith("get_") || mi.Name.StartsWith("set_"))) { return; } cached = new CacheMethod(mi); returnType = mi.ReturnType; break; } case MemberTypes.Property: { var pi = member as PropertyInfo; if (!pi.CanRead && pi.CanWrite) { // write-only property, cache the set method instead. var setMethod = pi.GetSetMethod(true); if (setMethod != null) { TryCacheMember(setMethod, list, cachedSigs, declaringType, inspector, false); } return; } cached = new CacheProperty(pi); returnType = pi.PropertyType; break; } case MemberTypes.Field: { var fi = member as FieldInfo; cached = new CacheField(fi); returnType = fi.FieldType; break; } default: throw new NotImplementedException(); } cachedSigs.Add(sig); cached.SetFallbackType(returnType); cached.SetInspectorOwner(inspector, member); list.Add(cached); } catch (Exception e) { ExplorerCore.LogWarning($"Exception caching member {member.DeclaringType.FullName}.{member.Name}!"); ExplorerCore.Log(e.ToString()); } }