Created
January 15, 2024 22:51
-
-
Save glcoder/2dfeb3b96461c947518ce8879e1ed742 to your computer and use it in GitHub Desktop.
Unity Auto Splitter FindComponentByName helper method (asl-help is used).
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Func<IntPtr, string, IntPtr> GameObjectFindComponentByName = null; // for recursive call | |
GameObjectFindComponentByName = (ManagedGameObjectPtr, ComponentName) => | |
{ | |
if (ManagedGameObjectPtr == IntPtr.Zero) | |
return IntPtr.Zero; | |
var NativeGameObjectPtr = vars.Helper.Read<IntPtr>(ManagedGameObjectPtr + 0x10 /* ManagedGameObject.m_CachedPtr */); | |
if (NativeGameObjectPtr == IntPtr.Zero) | |
return IntPtr.Zero; | |
var NativeGameObjectName = vars.Helper.ReadString(256, ReadStringType.AutoDetect, NativeGameObjectPtr + 0x60 /* GameObject.m_Name */ + 0x0 /* ConstantString.m_Buffer */, 0x0 /* char* */); | |
if (string.IsNullOrEmpty(NativeGameObjectName)) | |
return IntPtr.Zero; | |
var NativeComponentsCount = vars.Helper.Read<int>(NativeGameObjectPtr + 0x30 /* GameObject.m_Component */ + 0x10 /* dynamic_array.m_size */); | |
if (NativeComponentsCount == 0) | |
return IntPtr.Zero; | |
var RootTransformPtr = vars.Helper.Read<IntPtr>(NativeGameObjectPtr + 0x30 /* GameObject.m_Component */, 0x8 /* ComponentPair.component */); // First component is GameObject's root Transform | |
var RootTransformChildCount = vars.Helper.Read<int>(RootTransformPtr + 0x70 /* Transform.m_Children */ + 0x10 /* dynamic_array.m_size */); | |
for (int i = 0; i < RootTransformChildCount; ++i) | |
{ | |
var NativeChildTransformPtr = vars.Helper.Read<IntPtr>(RootTransformPtr + 0x70 /* Transform.m_Children */, i * 0x8 /* ImmediatePtr */); | |
var NativeChildGameObjectPtr = vars.Helper.Read<IntPtr>(NativeChildTransformPtr + 0x30 /* Unity::Component.m_GameObject */); | |
var ManagedChildGameObjectPtr = vars.Helper.Read<IntPtr>(NativeChildGameObjectPtr + 0x18 /* Object.m_MonoReference */ + 0x10 /* ScriptingGCHandle.m_Object */); | |
var ManagedComponentPtr = GameObjectFindComponentByName(ManagedChildGameObjectPtr, ComponentName); | |
if (ManagedComponentPtr != IntPtr.Zero) | |
return ManagedComponentPtr; | |
} | |
for (int i = 0; i < NativeComponentsCount; ++i) | |
{ | |
var NativeComponentPtr = vars.Helper.Read<IntPtr>(NativeGameObjectPtr + 0x30 /* GameObject.m_Component */, i * 0x10 /* ComponentPair */ + 0x8 /* ComponentPair.component */); | |
var ManagedComponentPtr = vars.Helper.Read<IntPtr>(NativeComponentPtr + 0x18 /* Object.m_MonoReference */ + 0x10 /* ScriptingGCHandle.m_Object */); | |
var ManagedComponentName = vars.Helper.ReadString(256, ReadStringType.AutoDetect, ManagedComponentPtr /* MonoObject.vtable */, 0x0 /* MonoVTable.klass */, 0x48 /* MonoClass.name */, 0x0 /* char* */); | |
if (!string.IsNullOrEmpty(ManagedComponentName) && ManagedComponentName == ComponentName) | |
return ManagedComponentPtr; | |
} | |
return IntPtr.Zero; | |
}; | |
Func<IntPtr, string, IntPtr> SceneFindComponentByName = (ScenePtr, ComponentName) => | |
{ | |
if (ScenePtr == IntPtr.Zero) | |
return IntPtr.Zero; | |
var SceneObjectsPrevPtr = vars.Helper.Read<IntPtr>(ScenePtr + 0xB0 /* UnityScene.m_Roots */ + 0x0 /* List.m_Root */ + 0x0 /* ListElement.m_Prev */); | |
var SceneObjectsNextPtr = vars.Helper.Read<IntPtr>(ScenePtr + 0xB0 /* UnityScene.m_Roots */ + 0x0 /* List.m_Root */ + 0x8 /* ListElement.m_Next */); | |
for (var AddressIt = SceneObjectsNextPtr; AddressIt != SceneObjectsPrevPtr && AddressIt != IntPtr.Zero; AddressIt = vars.Helper.Read<IntPtr>(AddressIt + 0x8 /* ListElement.m_Prev */)) | |
{ | |
var NativeTransformPtr = vars.Helper.Read<IntPtr>(AddressIt + 0x10 /* ListNode.m_Data */); | |
var NativeGameObjectPtr = vars.Helper.Read<IntPtr>(NativeTransformPtr + 0x30 /* Unity::Component.m_GameObject */); | |
var ManagedGameObjectPtr = vars.Helper.Read<IntPtr>(NativeGameObjectPtr + 0x18 /* Object.m_MonoReference */ + 0x10 /* ScriptingGCHandle.m_Object */); | |
var ManagedComponentPtr = GameObjectFindComponentByName(ManagedGameObjectPtr, ComponentName); | |
if (ManagedComponentPtr != IntPtr.Zero) | |
return ManagedComponentPtr; | |
} | |
return IntPtr.Zero; | |
}; | |
Func<IntPtr, string, IntPtr> SceneManagerFindComponentByName = (SceneManagerPtr, ComponentName) => | |
{ | |
if (SceneManagerPtr == IntPtr.Zero) | |
return IntPtr.Zero; | |
var SceneCount = vars.Helper.Read<int>(SceneManagerPtr + 0x8 /* RuntimeSceneManager.m_Scenes */ + 0x10 /* dynamic_array.m_size */); | |
for (int i = 0; i < SceneCount; ++i) | |
{ | |
var ScenePtr = vars.Helper.Read<IntPtr>(SceneManagerPtr + 0x8 /* RuntimeSceneManager.m_Scenes */, i * IntPtr.Size /* UnityScene* */); | |
var ScenePath = vars.Helper.ReadString(256, ReadStringType.AutoDetect, ScenePtr + 0x10 /* UnityScene.m_ScenePath */, 0x0 /* char* */); | |
var SceneName = System.IO.Path.GetFileNameWithoutExtension(ScenePath); | |
var ManagedComponentPtr = SceneFindComponentByName(ScenePtr, ComponentName); | |
if (ManagedComponentPtr != IntPtr.Zero) | |
return ManagedComponentPtr; | |
} | |
return IntPtr.Zero; | |
}; | |
vars.FindComponentByName = (Func<string, IntPtr>)(ComponentName => | |
{ | |
var SceneManagerPtr = vars.SceneManagerAddress.GetValue(IntPtr.Zero); | |
return SceneManagerFindComponentByName(vars.Helper.Read<IntPtr>(SceneManagerPtr), ComponentName); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment