private static bool FindFieldInfo(IntPtr typeClass, IntPtr unrealStruct, string fieldName, out CachedFieldInfo fieldInfo) { if (typeClass == IntPtr.Zero || unrealStruct == IntPtr.Zero || string.IsNullOrEmpty(fieldName)) { fieldInfo = default(CachedFieldInfo); return(false); } if (unrealStruct == lastUnrealStruct) { return(lastUnrealStructChildren.TryGetValue(fieldName, out fieldInfo)); } else if (unrealStruct == lastUnrealFunction) { return(lastUnrealFunctionChildren.TryGetValue(fieldName, out fieldInfo)); } else { Dictionary <string, CachedFieldInfo> fields = null; if (Native_UObjectBaseUtility.IsA(unrealStruct, Classes.UFunction)) { fields = lastUnrealFunctionChildren; lastUnrealFunction = unrealStruct; } else { fields = lastUnrealStructChildren; lastUnrealStruct = unrealStruct; } fields.Clear(); foreach (IntPtr field in new NativeReflection.NativeFieldIterator(EClassCastFlags.UFunction | EClassCastFlags.UProperty, unrealStruct, false)) { Native_UObjectBaseUtility.GetNameOut(field, ref nameUnsafe.Array); string name = nameUnsafe.Value; fields[name] = new CachedFieldInfo() { Address = field, Offset = Native_UProperty.GetOffset_ForInternal(field) }; } return(fields.TryGetValue(fieldName, out fieldInfo)); } }
/// <summary> /// Return offset of property from container base. /// </summary> public int GetOffset_ForInternal() { return(Native_UProperty.GetOffset_ForInternal(Address)); }
private static bool FindFieldInfo(IntPtr typeClass, IntPtr unrealStruct, string fieldName, out CachedFieldInfo fieldInfo) { if (typeClass == IntPtr.Zero || unrealStruct == IntPtr.Zero || string.IsNullOrEmpty(fieldName)) { fieldInfo = default(CachedFieldInfo); return(false); } if (unrealStruct == lastUnrealStruct) { return(lastUnrealStructChildren.TryGetValue(fieldName, out fieldInfo)); } else if (unrealStruct == lastUnrealFunction) { return(lastUnrealFunctionChildren.TryGetValue(fieldName, out fieldInfo)); } else { Dictionary <string, CachedFieldInfo> fields = null; // For structs we want to get all fields in the hierarchy as we can't struct inheritance in C# // (C++ structs can have inheritance, if we skip checking the hierarchy we wont get all the fields we want) bool isScriptStruct = false; if (Native_UObjectBaseUtility.IsA(unrealStruct, Classes.UFunction)) { fields = lastUnrealFunctionChildren; lastUnrealFunction = unrealStruct; } else { isScriptStruct = Native_UObjectBaseUtility.IsA(unrealStruct, Classes.UScriptStruct); fields = lastUnrealStructChildren; lastUnrealStruct = unrealStruct; } fields.Clear(); foreach (IntPtr field in new NativeReflection.NativeFieldIterator( EClassCastFlags.UFunction | EClassCastFlags.UProperty, unrealStruct, false, isScriptStruct)) { Native_UObjectBaseUtility.GetNameOut(field, ref nameUnsafe.Array); string name = nameUnsafe.Value; // Temporary check for debugging purposes. There shouldn't be any duplicate fields as we aren't looking in the hierarchy. if (System.Diagnostics.Debugger.IsAttached) { System.Diagnostics.Debug.Assert(!fields.ContainsKey(name)); } fields[name] = new CachedFieldInfo() { Address = field, Offset = Native_UProperty.GetOffset_ForInternal(field) }; } return(fields.TryGetValue(fieldName, out fieldInfo)); } }