예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
        }