mirror of
https://github.com/sinai-dev/UnityExplorer.git
synced 2025-06-15 22:07:48 +08:00

- cleanup - fixed a mistake with FieldInfos on reflection window, causing all values to be null. - improved displaying of generic objects (now shows object Type after the name)
121 lines
4.1 KiB
C#
121 lines
4.1 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using MelonLoader;
|
|
using UnhollowerBaseLib;
|
|
|
|
namespace Explorer
|
|
{
|
|
public class FieldInfoHolder : MemberInfoHolder
|
|
{
|
|
public FieldInfo fieldInfo;
|
|
public object m_value;
|
|
|
|
public FieldInfoHolder(Type _type, FieldInfo _fieldInfo)
|
|
{
|
|
classType = _type;
|
|
fieldInfo = _fieldInfo;
|
|
}
|
|
|
|
public override void UpdateValue(object obj)
|
|
{
|
|
try
|
|
{
|
|
if (obj is Il2CppSystem.Object ilObject)
|
|
{
|
|
var declaringType = this.fieldInfo.DeclaringType;
|
|
|
|
var cast = CppExplorer.Il2CppCast(obj, declaringType);
|
|
m_value = this.fieldInfo.GetValue(fieldInfo.IsStatic ? null : cast);
|
|
}
|
|
else
|
|
{
|
|
m_value = this.fieldInfo.GetValue(fieldInfo.IsStatic ? null : obj);
|
|
}
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
MelonLogger.Log($"Error updating FieldInfoHolder | {e.GetType()}: {e.Message}\r\n{e.StackTrace}");
|
|
}
|
|
}
|
|
|
|
public override void Draw(ReflectionWindow window)
|
|
{
|
|
UIStyles.DrawMember(ref m_value, ref this.IsExpanded, ref this.arrayOffset, this.fieldInfo, window.m_rect, window.m_object, SetValue);
|
|
}
|
|
|
|
public override void SetValue(object obj)
|
|
{
|
|
try
|
|
{
|
|
if (fieldInfo.FieldType.IsEnum)
|
|
{
|
|
if (Enum.Parse(fieldInfo.FieldType, m_value.ToString()) is object enumValue && enumValue != null)
|
|
{
|
|
m_value = enumValue;
|
|
}
|
|
}
|
|
else if (fieldInfo.FieldType.IsPrimitive)
|
|
{
|
|
if (fieldInfo.FieldType == typeof(float))
|
|
{
|
|
if (float.TryParse(m_value.ToString(), out float f))
|
|
{
|
|
m_value = f;
|
|
}
|
|
else
|
|
{
|
|
MelonLogger.LogWarning("Cannot parse " + m_value.ToString() + " to a float!");
|
|
}
|
|
}
|
|
else if (fieldInfo.FieldType == typeof(double))
|
|
{
|
|
if (double.TryParse(m_value.ToString(), out double d))
|
|
{
|
|
m_value = d;
|
|
}
|
|
else
|
|
{
|
|
MelonLogger.LogWarning("Cannot parse " + m_value.ToString() + " to a double!");
|
|
}
|
|
}
|
|
else if (fieldInfo.FieldType != typeof(bool))
|
|
{
|
|
if (int.TryParse(m_value.ToString(), out int i))
|
|
{
|
|
m_value = i;
|
|
}
|
|
else
|
|
{
|
|
MelonLogger.LogWarning("Cannot parse " + m_value.ToString() + " to an integer! type: " + fieldInfo.FieldType);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
MelonLogger.Log("Unsupported primitive field type: " + fieldInfo.FieldType.FullName);
|
|
}
|
|
}
|
|
|
|
if (obj is Il2CppSystem.Object ilObject)
|
|
{
|
|
var declaringType = this.fieldInfo.DeclaringType;
|
|
|
|
var cast = CppExplorer.Il2CppCast(obj, declaringType);
|
|
fieldInfo.SetValue(fieldInfo.IsStatic ? null : cast, m_value);
|
|
}
|
|
else
|
|
{
|
|
fieldInfo.SetValue(fieldInfo.IsStatic ? null : obj, m_value);
|
|
}
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
MelonLogger.Log($"Error setting FieldInfoHolder | {e.GetType()}: {e.Message}\r\n{e.StackTrace}");
|
|
}
|
|
}
|
|
}
|
|
}
|