public static Property getPropOrNull(PCCObject pcc, PCCObject.ExportEntry export, string propName)
        {
            List <Property> props = getPropList(pcc, export);

            foreach (Property prop in props)
            {
                if (pcc.getNameEntry(prop.Name) == propName)
                {
                    return(prop);
                }
            }
            return(null);
        }
        public static List <Property> getPropList(PCCObject pcc, PCCObject.ExportEntry export)
        {
            int start = detectStart(pcc, export.Data, export.ObjectFlags);

            return(ReadProp(pcc, export.Data, start));
        }
        private static PropertyInfo getProperty(PCCObject pcc, PCCObject.ExportEntry entry)
        {
            PropertyInfo p = new PropertyInfo();

            switch (entry.ClassName)
            {
            case "IntProperty":
                p.type = PropertyReader.Type.IntProperty;
                break;

            case "StringRefProperty":
                p.type = PropertyReader.Type.StringRefProperty;
                break;

            case "FloatProperty":
                p.type = PropertyReader.Type.FloatProperty;
                break;

            case "BoolProperty":
                p.type = PropertyReader.Type.BoolProperty;
                break;

            case "StrProperty":
                p.type = PropertyReader.Type.StrProperty;
                break;

            case "NameProperty":
                p.type = PropertyReader.Type.NameProperty;
                break;

            case "DelegateProperty":
                p.type = PropertyReader.Type.DelegateProperty;
                break;

            case "ObjectProperty":
            case "ClassProperty":
            case "ComponentProperty":
                p.type      = PropertyReader.Type.ObjectProperty;
                p.reference = pcc.getObjectName(BitConverter.ToInt32(entry.Data, entry.Data.Length - 4));
                break;

            case "StructProperty":
                p.type      = PropertyReader.Type.StructProperty;
                p.reference = pcc.getObjectName(BitConverter.ToInt32(entry.Data, entry.Data.Length - 4));
                break;

            case "BioMask4Property":
            case "ByteProperty":
                p.type      = PropertyReader.Type.ByteProperty;
                p.reference = pcc.getObjectName(BitConverter.ToInt32(entry.Data, entry.Data.Length - 4));
                break;

            case "ArrayProperty":
                p.type = PropertyReader.Type.ArrayProperty;
                PropertyInfo arrayTypeProp = getProperty(pcc, pcc.Exports[BitConverter.ToInt32(entry.Data, 44) - 1]);
                if (arrayTypeProp != null)
                {
                    switch (arrayTypeProp.type)
                    {
                    case PropertyReader.Type.ObjectProperty:
                    case PropertyReader.Type.StructProperty:
                    case PropertyReader.Type.ArrayProperty:
                        p.reference = arrayTypeProp.reference;
                        break;

                    case PropertyReader.Type.ByteProperty:
                        if (arrayTypeProp.reference == "")
                        {
                            p.reference = arrayTypeProp.type.ToString();
                        }
                        else
                        {
                            p.reference = arrayTypeProp.reference;
                        }
                        break;

                    case PropertyReader.Type.IntProperty:
                    case PropertyReader.Type.FloatProperty:
                    case PropertyReader.Type.NameProperty:
                    case PropertyReader.Type.BoolProperty:
                    case PropertyReader.Type.StrProperty:
                    case PropertyReader.Type.StringRefProperty:
                    case PropertyReader.Type.DelegateProperty:
                        p.reference = arrayTypeProp.type.ToString();
                        break;

                    case PropertyReader.Type.None:
                    case PropertyReader.Type.Unknown:
                    default:
                        System.Diagnostics.Debugger.Break();
                        p = null;
                        break;
                    }
                }
                else
                {
                    p = null;
                }
                break;

            case "InterfaceProperty":
            default:
                p = null;
                break;
            }

            return(p);
        }
 public static byte[] getDefaultClassValue(PCCObject pcc, string className, bool fullProps = false)
 {
     if (Structs.ContainsKey(className))
     {
         bool      isImmutable   = ImmutableStructs.Contains(className);
         ClassInfo info          = Structs[className];
         String    pccToLoadPath = Path.Combine(TransplanterLib.GamePath, @"BIOGame\" + info.pccPath);
         PCCObject importPCC     = null;
         pccMemoryCache.TryGetValue(pccToLoadPath, out importPCC);
         if (importPCC == null)
         {
             try
             {
                 importPCC = new PCCObject(pccToLoadPath);
                 pccMemoryCache[pccToLoadPath] = importPCC;
             }
             catch (Exception)
             {
                 return(null);
             }
         }
         byte[] buff;
         //Plane and CoverReference inherit from other structs, meaning they don't have default values (who knows why)
         //thus, I have hardcoded what those default values should be
         if (className == "Plane")
         {
             buff = PlaneDefault;
         }
         else if (className == "CoverReference")
         {
             buff = CoverReferenceDefault;
         }
         else
         {
             buff = importPCC.Exports[info.exportIndex].Data.Skip(0x24).ToArray();
         }
         List <PropertyReader.Property> Props = PropertyReader.ReadProp(importPCC, buff, 0);
         MemoryStream m = new MemoryStream();
         foreach (PropertyReader.Property p in Props)
         {
             string propName = importPCC.getNameEntry(p.Name);
             //check if property is transient, if so, skip (neither of the structs that inherit have transient props)
             if (info.properties.ContainsKey(propName) || propName == "None" || info.baseClass != "Class")
             {
                 if (isImmutable && !fullProps)
                 {
                     PropertyReader.ImportImmutableProperty(pcc, importPCC, p, className, m, true);
                 }
                 else
                 {
                     PropertyReader.ImportProperty(pcc, importPCC, p, className, m, true);
                 }
             }
         }
         return(m.ToArray());
     }
     else if (Classes.ContainsKey(className))
     {
         ClassInfo info          = Structs[className];
         String    pccToLoadPath = Path.Combine(TransplanterLib.GamePath, @"BIOGame\" + info.pccPath);
         PCCObject importPCC;
         if (pccMemoryCache[pccToLoadPath] != null)
         {
             importPCC = pccMemoryCache[pccToLoadPath];
         }
         else
         {
             try
             {
                 importPCC = new PCCObject(pccToLoadPath);
                 pccMemoryCache[pccToLoadPath] = importPCC;
             }
             catch (Exception)
             {
                 return(null);
             }
         }
         PCCObject.ExportEntry          entry = pcc.Exports[info.exportIndex + 1];
         List <PropertyReader.Property> Props = PropertyReader.getPropList(importPCC, entry);
         MemoryStream m = new MemoryStream(entry.DataSize - 4);
         foreach (PropertyReader.Property p in Props)
         {
             if (!info.properties.ContainsKey(importPCC.getNameEntry(p.Name)))
             {
                 //property is transient
                 continue;
             }
             PropertyReader.ImportProperty(pcc, importPCC, p, className, m);
         }
         return(m.ToArray());
     }
     return(null);
 }