diff --git a/src/Core/CSharp/ScriptInteraction.cs b/src/Core/CSharp/ScriptInteraction.cs
index 541da4d4..034b3c98 100644
--- a/src/Core/CSharp/ScriptInteraction.cs
+++ b/src/Core/CSharp/ScriptInteraction.cs
@@ -7,6 +7,7 @@
using UnityExplorer.Core.Runtime;
using UnityExplorer.UI.Main.CSConsole;
using UnityExplorer.UI.Main.Home;
+using UnityExplorer.UI.Inspectors;
namespace UnityExplorer.Core.CSharp
{
diff --git a/src/Core/ReflectionUtility.cs b/src/Core/ReflectionUtility.cs
index 06a534ae..916d5364 100644
--- a/src/Core/ReflectionUtility.cs
+++ b/src/Core/ReflectionUtility.cs
@@ -7,7 +7,7 @@
using BF = System.Reflection.BindingFlags;
using UnityExplorer.Core.Runtime;
-namespace UnityExplorer.Core
+namespace UnityExplorer
{
public static class ReflectionUtility
{
@@ -18,7 +18,7 @@ public static class ReflectionUtility
///
/// The object to get the true Type for.
/// The most accurate Type of the object which could be identified.
- public static Type GetType(this object obj)
+ public static Type GetActualType(this object obj)
{
if (obj == null)
return null;
@@ -32,7 +32,7 @@ public static Type GetType(this object obj)
/// The object to cast
/// The object, cast to the underlying Type if possible, otherwise the original object.
public static object Cast(this object obj)
- => ReflectionProvider.Instance.Cast(obj, GetType(obj));
+ => ReflectionProvider.Instance.Cast(obj, GetActualType(obj));
///
/// Cast an object to a Type, if possible.
@@ -105,7 +105,7 @@ from type in asm.TryGetTypes()
///
/// Get all base types of the provided Type, including itself.
///
- public static Type[] GetAllBaseTypes(this object obj) => GetAllBaseTypes(GetType(obj));
+ public static Type[] GetAllBaseTypes(this object obj) => GetAllBaseTypes(GetActualType(obj));
///
/// Get all base types of the provided Type, including itself.
diff --git a/src/Core/Runtime/Il2Cpp/Il2CppReflection.cs b/src/Core/Runtime/Il2Cpp/Il2CppReflection.cs
index dd7143fd..1816c17e 100644
--- a/src/Core/Runtime/Il2Cpp/Il2CppReflection.cs
+++ b/src/Core/Runtime/Il2Cpp/Il2CppReflection.cs
@@ -163,7 +163,7 @@ public static object Il2CppCast(object obj, Type castTo)
IntPtr castFromPtr = il2cpp_object_get_class(ilObj.Pointer);
if (!il2cpp_class_is_assignable_from(castToPtr, castFromPtr))
- return obj;
+ return null;
if (RuntimeSpecificsStore.IsInjected(castToPtr))
return UnhollowerBaseLib.Runtime.ClassInjectorBase.GetMonoObjectFromIl2CppPointer(ilObj.Pointer);
diff --git a/src/Core/TestClass.cs b/src/Core/TestClass.cs
new file mode 100644
index 00000000..eebe35ad
--- /dev/null
+++ b/src/Core/TestClass.cs
@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace UnityExplorer
+{
+#if CPP
+ public static class TestClass
+ {
+ public static Il2CppSystem.Collections.Hashtable testHashset;
+
+ static TestClass()
+ {
+ testHashset = new Il2CppSystem.Collections.Hashtable();
+ testHashset.Add("key1", "itemOne");
+ testHashset.Add("key2", "itemTwo");
+ testHashset.Add("key3", "itemThree");
+ }
+ }
+#endif
+}
diff --git a/src/ExplorerCore.cs b/src/ExplorerCore.cs
index 76e4d192..cf658940 100644
--- a/src/ExplorerCore.cs
+++ b/src/ExplorerCore.cs
@@ -12,7 +12,7 @@ namespace UnityExplorer
public class ExplorerCore
{
public const string NAME = "UnityExplorer";
- public const string VERSION = "3.3.4";
+ public const string VERSION = "3.3.5";
public const string AUTHOR = "Sinai";
public const string GUID = "com.sinai.unityexplorer";
@@ -46,6 +46,8 @@ public static void Init(IExplorerLoader loader)
UIManager.Init();
Log($"{NAME} {VERSION} initialized.");
+
+ // InspectorManager.Instance.Inspect(typeof(TestClass));
}
public static void Update()
diff --git a/src/Loader/ML/MelonLoaderConfigHandler.cs b/src/Loader/ML/MelonLoaderConfigHandler.cs
index 5dcc6541..d900fedd 100644
--- a/src/Loader/ML/MelonLoaderConfigHandler.cs
+++ b/src/Loader/ML/MelonLoaderConfigHandler.cs
@@ -21,7 +21,11 @@ public override void Init()
{
prefCategory = MelonPreferences.CreateCategory(CTG_NAME, $"{CTG_NAME} Settings");
- MelonPreferences.Mapper.RegisterMapper(KeycodeReader, KeycodeWriter);
+ try
+ {
+ MelonPreferences.Mapper.RegisterMapper(KeycodeReader, KeycodeWriter);
+ }
+ catch { }
}
public override void LoadConfig()
diff --git a/src/UI/CacheObject/CacheMember.cs b/src/UI/CacheObject/CacheMember.cs
index b7e28237..a2eaa754 100644
--- a/src/UI/CacheObject/CacheMember.cs
+++ b/src/UI/CacheObject/CacheMember.cs
@@ -10,7 +10,7 @@
using UnityExplorer.Core;
using UnityExplorer.UI.Utility;
using UnityExplorer.UI.InteractiveValues;
-using UnityExplorer.UI.Main.Home.Inspectors.Reflection;
+using UnityExplorer.UI.Inspectors.Reflection;
namespace UnityExplorer.UI.CacheObject
{
@@ -86,7 +86,7 @@ public override void UpdateValue()
{
try
{
- Type baseType = ReflectionUtility.GetType(IValue.Value) ?? FallbackType;
+ Type baseType = ReflectionUtility.GetActualType(IValue.Value) ?? FallbackType;
if (!ReflectionProvider.Instance.IsReflectionSupported(baseType))
throw new Exception("Type not supported with reflection");
@@ -94,7 +94,7 @@ public override void UpdateValue()
UpdateReflection();
if (IValue.Value != null)
- IValue.Value = IValue.Value.Cast(ReflectionUtility.GetType(IValue.Value));
+ IValue.Value = IValue.Value.Cast(ReflectionUtility.GetActualType(IValue.Value));
}
catch (Exception e)
{
diff --git a/src/UI/CacheObject/CacheObjectBase.cs b/src/UI/CacheObject/CacheObjectBase.cs
index 82db4a6c..b9516c7f 100644
--- a/src/UI/CacheObject/CacheObjectBase.cs
+++ b/src/UI/CacheObject/CacheObjectBase.cs
@@ -55,7 +55,7 @@ public virtual void UpdateValue()
// if the type has changed fundamentally, make a new interactivevalue for it
var type = value == null
? FallbackType
- : ReflectionUtility.GetType(value);
+ : ReflectionUtility.GetActualType(value);
var ivalueType = InteractiveValue.GetIValueForType(type);
diff --git a/src/UI/Main/Home/Inspectors/GameObjects/ChildList.cs b/src/UI/Inspectors/GameObjects/ChildList.cs
similarity index 99%
rename from src/UI/Main/Home/Inspectors/GameObjects/ChildList.cs
rename to src/UI/Inspectors/GameObjects/ChildList.cs
index 28c60bb2..6372674a 100644
--- a/src/UI/Main/Home/Inspectors/GameObjects/ChildList.cs
+++ b/src/UI/Inspectors/GameObjects/ChildList.cs
@@ -7,7 +7,7 @@
using UnityExplorer.Core.Runtime;
using UnityExplorer.UI.Utility;
-namespace UnityExplorer.UI.Main.Home.Inspectors.GameObjects
+namespace UnityExplorer.UI.Inspectors.GameObjects
{
public class ChildList
{
diff --git a/src/UI/Main/Home/Inspectors/GameObjects/ComponentList.cs b/src/UI/Inspectors/GameObjects/ComponentList.cs
similarity index 98%
rename from src/UI/Main/Home/Inspectors/GameObjects/ComponentList.cs
rename to src/UI/Inspectors/GameObjects/ComponentList.cs
index 51610a61..1b9e8342 100644
--- a/src/UI/Main/Home/Inspectors/GameObjects/ComponentList.cs
+++ b/src/UI/Inspectors/GameObjects/ComponentList.cs
@@ -8,7 +8,7 @@
using UnityExplorer.Core.Runtime;
using UnityExplorer.UI.Utility;
-namespace UnityExplorer.UI.Main.Home.Inspectors.GameObjects
+namespace UnityExplorer.UI.Inspectors.GameObjects
{
public class ComponentList
{
@@ -75,7 +75,7 @@ internal void RefreshComponentList()
var text = s_compListTexts[i];
- text.text = SignatureHighlighter.ParseFullSyntax(ReflectionUtility.GetType(comp), true);
+ text.text = SignatureHighlighter.ParseFullSyntax(ReflectionUtility.GetActualType(comp), true);
var toggle = s_compToggles[i];
#if CPP
diff --git a/src/UI/Main/Home/Inspectors/GameObjects/GameObjectControls.cs b/src/UI/Inspectors/GameObjects/GameObjectControls.cs
similarity index 99%
rename from src/UI/Main/Home/Inspectors/GameObjects/GameObjectControls.cs
rename to src/UI/Inspectors/GameObjects/GameObjectControls.cs
index f8140fba..6dcc577a 100644
--- a/src/UI/Main/Home/Inspectors/GameObjects/GameObjectControls.cs
+++ b/src/UI/Inspectors/GameObjects/GameObjectControls.cs
@@ -8,7 +8,7 @@
using UnityExplorer.Core.Runtime;
using UnityExplorer.Core.Unity;
-namespace UnityExplorer.UI.Main.Home.Inspectors.GameObjects
+namespace UnityExplorer.UI.Inspectors.GameObjects
{
public class GameObjectControls
{
diff --git a/src/UI/Main/Home/Inspectors/GameObjects/GameObjectInspector.cs b/src/UI/Inspectors/GameObjects/GameObjectInspector.cs
similarity index 99%
rename from src/UI/Main/Home/Inspectors/GameObjects/GameObjectInspector.cs
rename to src/UI/Inspectors/GameObjects/GameObjectInspector.cs
index d6f54fe9..df01178a 100644
--- a/src/UI/Main/Home/Inspectors/GameObjects/GameObjectInspector.cs
+++ b/src/UI/Inspectors/GameObjects/GameObjectInspector.cs
@@ -7,7 +7,7 @@
using UnityExplorer.Core.Runtime;
using UnityExplorer.Core.Unity;
-namespace UnityExplorer.UI.Main.Home.Inspectors.GameObjects
+namespace UnityExplorer.UI.Inspectors.GameObjects
{
public class GameObjectInspector : InspectorBase
{
diff --git a/src/UI/Main/Home/InspectUnderMouse.cs b/src/UI/Inspectors/InspectUnderMouse.cs
similarity index 99%
rename from src/UI/Main/Home/InspectUnderMouse.cs
rename to src/UI/Inspectors/InspectUnderMouse.cs
index 8aa41101..feb4528a 100644
--- a/src/UI/Main/Home/InspectUnderMouse.cs
+++ b/src/UI/Inspectors/InspectUnderMouse.cs
@@ -11,6 +11,7 @@
using UnityExplorer.Core.Runtime;
using UnityExplorer.UI;
using UnityExplorer.UI.Main;
+using UnityExplorer.UI.Inspectors;
namespace UnityExplorer.UI.Main.Home
{
diff --git a/src/UI/Main/Home/Inspectors/InspectorBase.cs b/src/UI/Inspectors/InspectorBase.cs
similarity index 98%
rename from src/UI/Main/Home/Inspectors/InspectorBase.cs
rename to src/UI/Inspectors/InspectorBase.cs
index eb295f4e..2e167c07 100644
--- a/src/UI/Main/Home/Inspectors/InspectorBase.cs
+++ b/src/UI/Inspectors/InspectorBase.cs
@@ -3,7 +3,7 @@
using UnityEngine.UI;
using UnityExplorer.Core.Unity;
-namespace UnityExplorer.UI.Main.Home.Inspectors
+namespace UnityExplorer.UI.Inspectors
{
public abstract class InspectorBase
{
diff --git a/src/UI/Main/Home/InspectorManager.cs b/src/UI/Inspectors/InspectorManager.cs
similarity index 97%
rename from src/UI/Main/Home/InspectorManager.cs
rename to src/UI/Inspectors/InspectorManager.cs
index 15801d1b..4c85427b 100644
--- a/src/UI/Main/Home/InspectorManager.cs
+++ b/src/UI/Inspectors/InspectorManager.cs
@@ -9,12 +9,11 @@
using UnityEngine.UI;
using UnityExplorer.Core.Runtime;
using UnityExplorer.UI.Main.Home;
-using UnityExplorer.UI.Main.Home.Inspectors;
using UnityExplorer.UI.CacheObject;
-using UnityExplorer.UI.Main.Home.Inspectors.GameObjects;
-using UnityExplorer.UI.Main.Home.Inspectors.Reflection;
+using UnityExplorer.UI.Inspectors.GameObjects;
+using UnityExplorer.UI.Inspectors.Reflection;
-namespace UnityExplorer.UI.Main.Home
+namespace UnityExplorer.UI.Inspectors
{
public class InspectorManager
{
diff --git a/src/UI/Main/Home/Inspectors/Reflection/InstanceInspector.cs b/src/UI/Inspectors/Reflection/InstanceInspector.cs
similarity index 99%
rename from src/UI/Main/Home/Inspectors/Reflection/InstanceInspector.cs
rename to src/UI/Inspectors/Reflection/InstanceInspector.cs
index a0e95d6f..d2de92e8 100644
--- a/src/UI/Main/Home/Inspectors/Reflection/InstanceInspector.cs
+++ b/src/UI/Inspectors/Reflection/InstanceInspector.cs
@@ -9,7 +9,7 @@
using UnityExplorer.Core.Config;
using UnityExplorer.Core.Runtime;
-namespace UnityExplorer.UI.Main.Home.Inspectors.Reflection
+namespace UnityExplorer.UI.Inspectors.Reflection
{
public enum MemberScopes
{
diff --git a/src/UI/Main/Home/Inspectors/Reflection/ReflectionInspector.cs b/src/UI/Inspectors/Reflection/ReflectionInspector.cs
similarity index 99%
rename from src/UI/Main/Home/Inspectors/Reflection/ReflectionInspector.cs
rename to src/UI/Inspectors/Reflection/ReflectionInspector.cs
index d2326a7e..a48e58b9 100644
--- a/src/UI/Main/Home/Inspectors/Reflection/ReflectionInspector.cs
+++ b/src/UI/Inspectors/Reflection/ReflectionInspector.cs
@@ -9,9 +9,11 @@
using UnityExplorer.Core.Config;
using UnityExplorer.Core.Runtime;
using UnityExplorer.UI.CacheObject;
+using UnityExplorer.UI.Main;
+using UnityExplorer.UI.Main.Home;
using UnityExplorer.UI.Utility;
-namespace UnityExplorer.UI.Main.Home.Inspectors.Reflection
+namespace UnityExplorer.UI.Inspectors.Reflection
{
public class ReflectionInspector : InspectorBase
{
@@ -78,7 +80,7 @@ public ReflectionInspector(object target) : base(target)
if (this is StaticInspector)
m_targetType = target as Type;
else
- m_targetType = ReflectionUtility.GetType(target);
+ m_targetType = ReflectionUtility.GetActualType(target);
m_targetTypeShortName = SignatureHighlighter.ParseFullSyntax(m_targetType, false);
diff --git a/src/UI/Main/Home/Inspectors/Reflection/StaticInspector.cs b/src/UI/Inspectors/Reflection/StaticInspector.cs
similarity index 83%
rename from src/UI/Main/Home/Inspectors/Reflection/StaticInspector.cs
rename to src/UI/Inspectors/Reflection/StaticInspector.cs
index 694c1b09..eeeb5377 100644
--- a/src/UI/Main/Home/Inspectors/Reflection/StaticInspector.cs
+++ b/src/UI/Inspectors/Reflection/StaticInspector.cs
@@ -3,7 +3,7 @@
using System.Linq;
using System.Text;
-namespace UnityExplorer.UI.Main.Home.Inspectors.Reflection
+namespace UnityExplorer.UI.Inspectors.Reflection
{
public class StaticInspector : ReflectionInspector
{
diff --git a/src/UI/InteractiveValues/InteractiveDictionary.cs b/src/UI/InteractiveValues/InteractiveDictionary.cs
index a9ffa66c..10de4893 100644
--- a/src/UI/InteractiveValues/InteractiveDictionary.cs
+++ b/src/UI/InteractiveValues/InteractiveDictionary.cs
@@ -218,32 +218,37 @@ internal override void OnToggleSubcontent(bool active)
private IDictionary EnumerateWithReflection()
{
- var valueType = ReflectionUtility.GetType(Value);
+ var valueType = ReflectionUtility.GetActualType(Value);
- // get keys and values
- var keys = valueType.GetProperty("Keys").GetValue(Value, null);
- var values = valueType.GetProperty("Values").GetValue(Value, null);
-
- // create lists to hold them
var keyList = new List