public override void Process(string includePath) { // Read File var fileStr = ReadThisFile(includePath); // Replace Main stuff fileStr.BaseStr.Replace("/*!!INCLUDE!!*/", TargetLang.GetFileHeader(_pragmas, _include, true)); fileStr.BaseStr.Replace("/*!!FOOTER!!*/", TargetLang.GetFileFooter()); var jStruct = JsonReflector.GetStruct("FUObjectItem"); string fUObjectItemStr = string.Empty; // Replace foreach (var(_, var) in jStruct.Vars) { fUObjectItemStr += var.VarType.All(char.IsDigit) ? $"\tunsigned char {var.Name} [{var.VarType}];{Utils.NLine}" : $"\t{var.VarType} {var.Name};{Utils.NLine}"; } fileStr.BaseStr.Replace("/*!!DEFINE!!*/", Generator.IsGObjectsChunks ? "#define GOBJECTS_CHUNKS" : ""); fileStr.BaseStr.Replace("/*!!POINTER_SIZE!!*/", Utils.GamePointerSize().ToString()); fileStr.BaseStr.Replace("/*!!FUObjectItem_MEMBERS!!*/", fUObjectItemStr); // Write File CopyToSdk(fileStr); }
private static List <PredefinedMember> GetJsonStructPreMembers(string jStructName) { var jStruct = JsonReflector.GetStruct(jStructName); var varList = new List <PredefinedMember>(); foreach (var(_, jStructVar) in jStruct.Vars) { if (jStructVar.FromSuper) { continue; } string jVarType = jStructVar.VarType .Replace("int32", "int32_t") .Replace("int16", "int16_t") .Replace("int8", "int8_t") .Replace("uint32", "uint32_t") .Replace("uint16", "uint16_t") .Replace("uint8", "uint8_t"); PredefinedMember cur; if (Utils.IsNumber(jVarType)) { cur.Name = $"{jStructVar.Name}[{jVarType}]"; cur.Type = "unsigned char "; } else { cur.Name = jStructVar.Name; cur.Type = jStructVar.IsPointer && !jVarType.Contains("void*") ? $"class {jVarType}" : jVarType; } varList.Add(cur); } return(varList); }
public static bool IsValidGObjectsAddress(IntPtr chunksAddress) { if (JsonReflector.StructsList.Count == 0) { throw new NullReferenceException("You must init `JsonReflector` first."); } // => Get information var objectItem = JsonReflector.GetStruct("FUObjectItem"); var objectItemSize = objectItem.GetSize(); var objectInfo = JsonReflector.GetStruct("UObject"); var objOuter = objectInfo["Outer"].Offset; var objInternalIndex = objectInfo["InternalIndex"].Offset; var objNameIndex = objectInfo["Name"].Offset; // => Get information IntPtr addressHolder = chunksAddress; if (MemObj == null) { throw new NullReferenceException("`MemObj` is null !!"); } if (!IsValidRemoteAddress(addressHolder)) { return(false); } /* * NOTE: * Nested loops will be slow, split-ed best. */ const int objCount = 2; var objects = new IntPtr[objCount]; var vTables = new IntPtr[objCount]; // Check (UObject*) Is Valid Pointer for (int i = 0; i < objCount; i++) { int offset = objectItemSize * i; if (!IsValidRemotePointer(addressHolder + offset, out objects[i])) { return(false); } } // Check (VTable) Is Valid Pointer for (int i = 0; i < objCount; i++) { if (!IsValidRemotePointer(objects[i], out vTables[i])) { return(false); } } // Check (InternalIndex) Is Valid for (int i = 0; i < objCount; i++) { int internalIndex = MemObj.Read <int>(objects[i] + objInternalIndex); if (internalIndex != i) { return(false); } } // Check (Outer) Is Valid // first object must have Outer == nullptr(0x0000000000) int uOuter = MemObj.Read <int>(objects[0] + objOuter); if (uOuter != 0) { return(false); } // Check (FName_index) Is Valid // 2nd object must have FName_index == 100 int uFNameIndex = MemObj.Read <int>(objects[1] + objNameIndex); return(uFNameIndex == 100); }