public static PropertyCollection getDefaultStructValue(string className, bool stripTransients)
        {
            bool isImmutable = UnrealObjectInfo.IsImmutable(className, Mod.MEGame.ME2);

            if (Structs.ContainsKey(className))
            {
                ClassInfo info = Structs[className];
                try
                {
                    PropertyCollection structProps = new PropertyCollection();
                    ClassInfo          tempInfo    = info;
                    while (tempInfo != null)
                    {
                        foreach ((string propName, PropertyInfo propInfo) in tempInfo.properties)
                        {
                            if (stripTransients && propInfo.Transient)
                            {
                                continue;
                            }
                            if (getDefaultProperty(propName, propInfo, stripTransients, isImmutable) is UProperty uProp)
                            {
                                structProps.Add(uProp);
                            }
                        }
                        if (!Structs.TryGetValue(tempInfo.baseClass, out tempInfo))
                        {
                            tempInfo = null;
                        }
                    }
                    structProps.Add(new NoneProperty());

                    string filepath = Path.Combine(ME2Directory.gamePath, "BioGame", info.pccPath);
                    if (File.Exists(info.pccPath))
                    {
                        filepath = info.pccPath; //Used for dynamic lookup
                    }
                    if (File.Exists(filepath))
                    {
                        IMEPackage importPCC = MEPackageHandler.OpenMEPackage(filepath);

                        var                exportToRead = importPCC.getUExport(info.exportIndex);
                        byte[]             buff         = exportToRead.Data.Skip(0x30).ToArray();
                        PropertyCollection defaults     = PropertyCollection.ReadProps(exportToRead, new MemoryStream(buff), className);
                        foreach (var prop in defaults)
                        {
                            structProps.TryReplaceProp(prop);
                        }
                    }
                    return(structProps);
                }
                catch
                {
                    return(null);
                }
            }
            return(null);
        }
        public static UProperty getDefaultProperty(string propName, PropertyInfo propInfo, bool stripTransients = true, bool isImmutable = false)
        {
            switch (propInfo.Type)
            {
            case PropertyType.IntProperty:
                return(new IntProperty(0, propName));

            case PropertyType.FloatProperty:
                return(new FloatProperty(0f, propName));

            case PropertyType.DelegateProperty:
                return(new DelegateProperty(0, "None"));

            case PropertyType.ObjectProperty:
                return(new ObjectProperty(0, propName));

            case PropertyType.NameProperty:
                return(new NameProperty("None", propName));

            case PropertyType.BoolProperty:
                return(new BoolProperty(false, propName));

            case PropertyType.ByteProperty when propInfo.IsEnumProp():
                return(new EnumProperty(propInfo.Reference, Mod.MEGame.ME2, propName));

            case PropertyType.ByteProperty:
                return(new ByteProperty(0, propName));

            case PropertyType.StrProperty:
                return(new StrProperty("", propName));

            case PropertyType.StringRefProperty:
                return(new StringRefProperty(propName));

            case PropertyType.BioMask4Property:
                return(new BioMask4Property(0, propName));

            case PropertyType.ArrayProperty:
                switch (getArrayType(propInfo))
                {
                case ArrayType.Object:
                    return(new ArrayProperty <ObjectProperty>(propName));

                case ArrayType.Name:
                    return(new ArrayProperty <NameProperty>(propName));

                case ArrayType.Enum:
                    return(new ArrayProperty <EnumProperty>(propName));

                case ArrayType.Struct:
                    return(new ArrayProperty <StructProperty>(propName));

                case ArrayType.Bool:
                    return(new ArrayProperty <BoolProperty>(propName));

                case ArrayType.String:
                    return(new ArrayProperty <StrProperty>(propName));

                case ArrayType.Float:
                    return(new ArrayProperty <FloatProperty>(propName));

                case ArrayType.Int:
                    return(new ArrayProperty <IntProperty>(propName));

                case ArrayType.Byte:
                    return(new ArrayProperty <ByteProperty>(propName));

                default:
                    return(null);
                }

            case PropertyType.StructProperty:
                isImmutable = isImmutable || UnrealObjectInfo.IsImmutable(propInfo.Reference, Mod.MEGame.ME2);
                return(new StructProperty(propInfo.Reference, getDefaultStructValue(propInfo.Reference, stripTransients), propName, isImmutable));

            case PropertyType.None:
            case PropertyType.Unknown:
            default:
                return(null);
            }
        }