├── README.md ├── parser.py ├── reader.py ├── structures.py └── ue_version.py /README.md: -------------------------------------------------------------------------------- 1 | # uasset-parser-py 2 | 3 | A Python library for parsing Unreal Engine 4/5 assets. 4 | 5 | ## Usage 6 | 7 | Refer to file `parser.py`. 8 | 9 | ## Supported UE Versions 10 | 11 | 4.x ~ 5.2.1 12 | 13 | ## Example 14 | 15 | ```shell 16 | $ python parser.py 17 | 18 | [Summary] 19 | FPackageFileSummary(Tag=2653586369, LegacyFileVersion=-8, LegacyUE3version=864, FileVersionUE4=522, FileVersionUE5=1009, FileVersionLicenseeUE4=0, CustomVersionContainer=FCustomVersionContainer(Versions=[FCustomVersion(key=FGuid(A=318278559, B=2289388284, C=2793199884, D=943373609), Version=45), FCustomVersion(key=FGuid(A=702903773, B=3768796711, C=2635125366, D=590142698), Version=17), FCustomVersion(key=FGuid(A=905529987, B=3797434476, C=2736261621, D=2517640316), Version=41), FCustomVersion(key=FGuid(A=1612519558, B=2892255108, C=2853622750, D=233490390), Version=83), FCustomVersion(key=FGuid(A=1769854337, B=3863953835, C=2856997356, D=3199710760), Version=104), FCustomVersion(key=FGuid(A=2622805282, B=2821083070, C=2485192518, D=1639219920), Version=44), FCustomVersion(key=FGuid(A=2650782934, B=1229914456, C=3793818242, D=1016244360), Version=10), FCustomVersion(key=FGuid(A=3489428543, B=1135625344, C=2475758815, D=387784819), Version=37), FCustomVersion(key=FGuid(A=3634060866, B=616385862, C=2215816360, D=3747878777), Version=41), FCustomVersion(key=FGuid(A=3836766445, B=4103357161, C=2721176075, D=776387393), Version=40), FCustomVersion(key=FGuid(A=3876086632, B=1797475416, C=2218335088, D=371613329), Version=6)]), bUnversioned=False, TotalHeaderSize=9780, PackageName=/Game/import_test/ground, PackageFlags=0, NameCount=137, NameOffset=550, SoftObjectPathsCount=0, SoftObjectPathsOffset=4186, LocalizationId=7F849078242E4111BA9A7A7DEEC23AC5, GatherableTextDataCount=0, GatherableTextDataOffset=4186, ExportCount=7, ExportOffset=4746, ImportCount=14, ImportOffset=4186, DependsOffset=5418, SoftPackageReferencesCount=0, SoftPackageReferencesOffset=5478, SearchableNamesOffset=5478, ThumbnailTableOffset=8869, Guid=FGuid(A=503216981, B=1598808271, C=488862099, D=3955789816), PersistentGuid=FGuid(A=2264672683, B=3863978626, C=2294971568, D=3633131402), GenerationCount=1, Generations=[FGenerationInfo(ExportCount=7, NameCount=137)], SavedByEngineVersion=FEngineVersion(Major=5, Minor=2, Patch=1, Changelist=26001984, Branch=++UE5+Release-5.2), CompatibleWithEngineVersion=FEngineVersion(Major=5, Minor=2, Patch=0, Changelist=25360045, Branch=++UE5+Release-5.2), CompressionFlags=0, CompressedChunks=[], PackageSource=2680386988, AdditionalPackagesToCook=[], AssetRegistryDataOffset=8903, BulkDataStartOffset=13793, WorldTileInfoDataOffset=0, ChunkIDs=[], PreloadDependencyCount=-1, PreloadDependencyOffset=9780, NamesReferencedFromExportDataCount=119, PayloadTocOffset=13797, DataResourceOffset=0) 20 | [NameMap] 21 | [FNameEntry(Path=ArrayProperty, NonCasePreservingHash=45129, CasePreservingHash=27107), FNameEntry(Path=AssetImportData, NonCasePreservingHash=44264, CasePreservingHash=21585), FNameEntry(Path=bAffectDistanceFieldLighting, NonCasePreservingHash=21238, CasePreservingHash=63416), FNameEntry(Path=BaseLODModel, NonCasePreservingHash=46844, CasePreservingHash=23529), FNameEntry(Path=bBuildReversedIndexBuffer, NonCasePreservingHash=17699, CasePreservingHash=22444), FNameEntry(Path=bCastShadow, NonCasePreservingHash=3466, CasePreservingHash=48133), FNameEntry(Path=bComputeWeightedNormals, NonCasePreservingHash=2454, CasePreservingHash=16634), FNameEntry(Path=bCullOccluded, NonCasePreservingHash=6762, CasePreservingHash=62060), FNameEntry(Path=bEnableCollision, NonCasePreservingHash=33722, CasePreservingHash=45820), FNameEntry(Path=bForceOpaque, NonCasePreservingHash=65286, CasePreservingHash=57277), FNameEntry(Path=bGenerateDistanceFieldAsIfTwoSided, NonCasePreservingHash=51868, CasePreservingHash=39280), FNameEntry(Path=bGenerateLightmapUVs, NonCasePreservingHash=54943, CasePreservingHash=64369), FNameEntry(Path=bGenerateUniqueLightmapUVs, NonCasePreservingHash=702, CasePreservingHash=16898), FNameEntry(Path=bImportWithBaseMesh, NonCasePreservingHash=207, CasePreservingHash=33548), FNameEntry(Path=bInitialized, NonCasePreservingHash=18151, CasePreservingHash=33468), FNameEntry(Path=bKeepSymmetry, NonCasePreservingHash=54183, CasePreservingHash=13404), FNameEntry(Path=BlockAll, NonCasePreservingHash=15352, CasePreservingHash=2395), FNameEntry(Path=BodyInstance, NonCasePreservingHash=58432, CasePreservingHash=52648), FNameEntry(Path=BoolProperty, NonCasePreservingHash=1040, CasePreservingHash=35504), FNameEntry(Path=bOverrideDensities, NonCasePreservingHash=1016, CasePreservingHash=19355), FNameEntry(Path=BoxExtent, NonCasePreservingHash=46778, CasePreservingHash=59552), FNameEntry(Path=BoxSphereBounds, NonCasePreservingHash=33550, CasePreservingHash=25114), FNameEntry(Path=bRecalculateNormals, NonCasePreservingHash=25418, CasePreservingHash=49153), FNameEntry(Path=bRecomputeNormals, NonCasePreservingHash=47140, CasePreservingHash=20833), FNameEntry(Path=bRecomputeTangents, NonCasePreservingHash=12775, CasePreservingHash=9074), FNameEntry(Path=bRemoveDegenerates, NonCasePreservingHash=3600, CasePreservingHash=25301), FNameEntry(Path=bSupportFaceRemap, NonCasePreservingHash=21325, CasePreservingHash=50735), FNameEntry(Path=BuildScale3D, NonCasePreservingHash=8867, CasePreservingHash=63197), FNameEntry(Path=BuildSettings, NonCasePreservingHash=23587, CasePreservingHash=27444), FNameEntry(Path=bUseBackwardsCompatibleF16TruncUVs, NonCasePreservingHash=13967, CasePreservingHash=54300), FNameEntry(Path=bUseFullPrecisionUVs, NonCasePreservingHash=61657, CasePreservingHash=22998), FNameEntry(Path=bUseHighPrecisionTangentBasis, NonCasePreservingHash=44363, CasePreservingHash=36609), FNameEntry(Path=bUseMikkTSpace, NonCasePreservingHash=11398, CasePreservingHash=29014), FNameEntry(Path=bVisibilityAided, NonCasePreservingHash=47424, CasePreservingHash=28144), FNameEntry(Path=bVisibleInRayTracing, NonCasePreservingHash=27282, CasePreservingHash=55811), FNameEntry(Path=ByteProperty, NonCasePreservingHash=20198, CasePreservingHash=49197), FNameEntry(Path=CacheMeshDescriptionTrianglesCount, NonCasePreservingHash=46701, CasePreservingHash=57531), FNameEntry(Path=CacheMeshDescriptionVerticesCount, NonCasePreservingHash=63263, CasePreservingHash=19049), FNameEntry(Path=CollisionProfileName, NonCasePreservingHash=2057, CasePreservingHash=40509), FNameEntry(Path=DefaultInstance, NonCasePreservingHash=18864, CasePreservingHash=47646), FNameEntry(Path=DistanceFieldReplacementMesh, NonCasePreservingHash=14687, CasePreservingHash=22317), FNameEntry(Path=DistanceFieldResolutionScale, NonCasePreservingHash=47007, CasePreservingHash=7505), FNameEntry(Path=DoubleProperty, NonCasePreservingHash=29742, CasePreservingHash=60504), FNameEntry(Path=DstLightmapIndex, NonCasePreservingHash=4877, CasePreservingHash=14384), FNameEntry(Path=ECC_WorldStatic, NonCasePreservingHash=42114, CasePreservingHash=38584), FNameEntry(Path=ECollisionChannel, NonCasePreservingHash=26700, CasePreservingHash=562), FNameEntry(Path=EMeshFeatureImportance, NonCasePreservingHash=43971, CasePreservingHash=34823), FNameEntry(Path=EMeshFeatureImportance::Lowest, NonCasePreservingHash=17129, CasePreservingHash=20887), FNameEntry(Path=EMeshFeatureImportance::Normal, NonCasePreservingHash=26995, CasePreservingHash=32598), FNameEntry(Path=EMeshFeatureImportance::Off, NonCasePreservingHash=14293, CasePreservingHash=21209), FNameEntry(Path=EnumProperty, NonCasePreservingHash=55121, CasePreservingHash=16541), FNameEntry(Path=EStaticMeshReductionTerimationCriterion, NonCasePreservingHash=43791, CasePreservingHash=53421), FNameEntry(Path=EStaticMeshReductionTerimationCriterion::Triangles, NonCasePreservingHash=26595, CasePreservingHash=36074), FNameEntry(Path=ExtendedBounds, NonCasePreservingHash=21156, CasePreservingHash=49121), FNameEntry(Path=FBX.MaxHandle, NonCasePreservingHash=30106, CasePreservingHash=42880), FNameEntry(Path=FloatProperty, NonCasePreservingHash=43003, CasePreservingHash=64990), FNameEntry(Path=HardAngleThreshold, NonCasePreservingHash=52904, CasePreservingHash=9941), FNameEntry(Path=HiResSourceModel, NonCasePreservingHash=62847, CasePreservingHash=19887), FNameEntry(Path=ImportedMaterialSlotName, NonCasePreservingHash=24920, CasePreservingHash=26786), FNameEntry(Path=ImportMaterialOriginalNameData, NonCasePreservingHash=4235, CasePreservingHash=13479), FNameEntry(Path=ImportMeshLodData, NonCasePreservingHash=42368, CasePreservingHash=58006), FNameEntry(Path=ImportMeshLodSectionsData, NonCasePreservingHash=46438, CasePreservingHash=26020), FNameEntry(Path=ImportVersion, NonCasePreservingHash=33166, CasePreservingHash=45767), FNameEntry(Path=IntProperty, NonCasePreservingHash=54181, CasePreservingHash=18998), FNameEntry(Path=LightMapCoordinateIndex, NonCasePreservingHash=49885, CasePreservingHash=21771), FNameEntry(Path=LightMapResolution, NonCasePreservingHash=59418, CasePreservingHash=29525), FNameEntry(Path=LightmapUVDensity, NonCasePreservingHash=40924, CasePreservingHash=43992), FNameEntry(Path=LightmapUVVersion, NonCasePreservingHash=51781, CasePreservingHash=21671), FNameEntry(Path=LocalUVDensities, NonCasePreservingHash=30962, CasePreservingHash=65438), FNameEntry(Path=Map, NonCasePreservingHash=37540, CasePreservingHash=28872), FNameEntry(Path=MapProperty, NonCasePreservingHash=37941, CasePreservingHash=33153), FNameEntry(Path=MaterialIndex, NonCasePreservingHash=62379, CasePreservingHash=16808), FNameEntry(Path=MaterialInterface, NonCasePreservingHash=34137, CasePreservingHash=7322), FNameEntry(Path=MaterialSlotName, NonCasePreservingHash=24283, CasePreservingHash=26702), FNameEntry(Path=MaxDeviation, NonCasePreservingHash=10060, CasePreservingHash=34108), FNameEntry(Path=MaxLumenMeshCards, NonCasePreservingHash=45827, CasePreservingHash=28387), FNameEntry(Path=MaxNumOfTriangles, NonCasePreservingHash=61429, CasePreservingHash=33438), FNameEntry(Path=MaxNumOfVerts, NonCasePreservingHash=32296, CasePreservingHash=55134), FNameEntry(Path=MeshBuildSettings, NonCasePreservingHash=64039, CasePreservingHash=17639), FNameEntry(Path=MeshReductionSettings, NonCasePreservingHash=3315, CasePreservingHash=50166), FNameEntry(Path=MeshSectionInfoMap, NonCasePreservingHash=28445, CasePreservingHash=36319), FNameEntry(Path=MeshUVChannelInfo, NonCasePreservingHash=16664, CasePreservingHash=14422), FNameEntry(Path=MinLightmapResolution, NonCasePreservingHash=36972, CasePreservingHash=13706), FNameEntry(Path=NameProperty, NonCasePreservingHash=62082, CasePreservingHash=18952), FNameEntry(Path=None, NonCasePreservingHash=1012, CasePreservingHash=3525), FNameEntry(Path=ObjectProperty, NonCasePreservingHash=56129, CasePreservingHash=60083), FNameEntry(Path=ObjectType, NonCasePreservingHash=35726, CasePreservingHash=41500), FNameEntry(Path=Origin, NonCasePreservingHash=61684, CasePreservingHash=11158), FNameEntry(Path=OriginalSectionInfoMap, NonCasePreservingHash=44479, CasePreservingHash=55996), FNameEntry(Path=PackageLocalizationNamespace, NonCasePreservingHash=29714, CasePreservingHash=34937), FNameEntry(Path=PercentTriangles, NonCasePreservingHash=61245, CasePreservingHash=55958), FNameEntry(Path=PercentVertices, NonCasePreservingHash=37196, CasePreservingHash=24394), FNameEntry(Path=PerPlatformFloat, NonCasePreservingHash=16527, CasePreservingHash=49542), FNameEntry(Path=PixelError, NonCasePreservingHash=35133, CasePreservingHash=19441), FNameEntry(Path=ReductionSettings, NonCasePreservingHash=41841, CasePreservingHash=20958), FNameEntry(Path=ScreenSize, NonCasePreservingHash=25223, CasePreservingHash=48608), FNameEntry(Path=SectionInfoMap, NonCasePreservingHash=17511, CasePreservingHash=64736), FNameEntry(Path=SectionOriginalMaterialName, NonCasePreservingHash=52228, CasePreservingHash=44918), FNameEntry(Path=ShadingImportance, NonCasePreservingHash=16423, CasePreservingHash=40699), FNameEntry(Path=SilhouetteImportance, NonCasePreservingHash=19471, CasePreservingHash=14036), FNameEntry(Path=SourceImportFilename, NonCasePreservingHash=6840, CasePreservingHash=45215), FNameEntry(Path=SourceModels, NonCasePreservingHash=44665, CasePreservingHash=3072), FNameEntry(Path=SphereRadius, NonCasePreservingHash=45030, CasePreservingHash=52577), FNameEntry(Path=SrcLightmapIndex, NonCasePreservingHash=17472, CasePreservingHash=52959), FNameEntry(Path=StaticMaterial, NonCasePreservingHash=14986, CasePreservingHash=51069), FNameEntry(Path=StaticMaterials, NonCasePreservingHash=56796, CasePreservingHash=4672), FNameEntry(Path=StaticMeshDescriptionBulkData, NonCasePreservingHash=4260, CasePreservingHash=60268), FNameEntry(Path=StaticMeshSourceModel, NonCasePreservingHash=13272, CasePreservingHash=34712), FNameEntry(Path=StrProperty, NonCasePreservingHash=49467, CasePreservingHash=9330), FNameEntry(Path=StructProperty, NonCasePreservingHash=48, CasePreservingHash=64668), FNameEntry(Path=TerminationCriterion, NonCasePreservingHash=38466, CasePreservingHash=44002), FNameEntry(Path=TextureImportance, NonCasePreservingHash=23395, CasePreservingHash=4509), FNameEntry(Path=UInt32Property, NonCasePreservingHash=11486, CasePreservingHash=19000), FNameEntry(Path=UVChannelData, NonCasePreservingHash=18018, CasePreservingHash=35784), FNameEntry(Path=Vector, NonCasePreservingHash=7334, CasePreservingHash=25604), FNameEntry(Path=VertexColorImportance, NonCasePreservingHash=44020, CasePreservingHash=15153), FNameEntry(Path=VisibilityAggressiveness, NonCasePreservingHash=43173, CasePreservingHash=19610), FNameEntry(Path=WeldingThreshold, NonCasePreservingHash=32000, CasePreservingHash=53990), FNameEntry(Path=WorldGridMaterial, NonCasePreservingHash=17435, CasePreservingHash=41218), FNameEntry(Path=/Engine/EngineMaterials/WorldGridMaterial, NonCasePreservingHash=51229, CasePreservingHash=6705), FNameEntry(Path=/Game/import_test/ground, NonCasePreservingHash=18517, CasePreservingHash=57488), FNameEntry(Path=/Script/CoreUObject, NonCasePreservingHash=18936, CasePreservingHash=15917), FNameEntry(Path=/Script/Engine, NonCasePreservingHash=16518, CasePreservingHash=18821), FNameEntry(Path=/Script/NavigationSystem, NonCasePreservingHash=47274, CasePreservingHash=12068), FNameEntry(Path=/Script/UnrealEd, NonCasePreservingHash=1068, CasePreservingHash=2199), FNameEntry(Path=BodySetup, NonCasePreservingHash=48137, CasePreservingHash=31119), FNameEntry(Path=Class, NonCasePreservingHash=30580, CasePreservingHash=37240), FNameEntry(Path=Default__StaticMesh, NonCasePreservingHash=62757, CasePreservingHash=30573), FNameEntry(Path=FbxStaticMeshImportData, NonCasePreservingHash=57899, CasePreservingHash=5564), FNameEntry(Path=ground, NonCasePreservingHash=9496, CasePreservingHash=6824), FNameEntry(Path=HiResMeshDescription, NonCasePreservingHash=61143, CasePreservingHash=24778), FNameEntry(Path=Material, NonCasePreservingHash=45293, CasePreservingHash=12786), FNameEntry(Path=MetaData, NonCasePreservingHash=32996, CasePreservingHash=37812), FNameEntry(Path=NavCollision, NonCasePreservingHash=35468, CasePreservingHash=23586), FNameEntry(Path=Package, NonCasePreservingHash=18291, CasePreservingHash=5512), FNameEntry(Path=PackageMetaData, NonCasePreservingHash=11421, CasePreservingHash=26020), FNameEntry(Path=StaticMesh, NonCasePreservingHash=22802, CasePreservingHash=21568)] 22 | [ImportMap] 23 | FObjectImport(ClassPackage=FNameEntry(Path=/Script/CoreUObject, NonCasePreservingHash=18936, CasePreservingHash=15917), ClassName=FNameEntry(Path=Class, NonCasePreservingHash=30580, CasePreservingHash=37240), OuterIndex=-9, ObjectName=FNameEntry(Path=MetaData, NonCasePreservingHash=32996, CasePreservingHash=37812), PackageName=FNameEntry(Path=None, NonCasePreservingHash=1012, CasePreservingHash=3525), bImportOptional=False) 24 | [ExportMap] 25 | [FObjectExport(ClassIndex=-2, SuperIndex=0, TemplateIndex=0, OuterIndex=5, ObjectName=FNameEntry(Path=BodySetup, NonCasePreservingHash=48137, CasePreservingHash=31119), ObjectFlags=8, SerialSize=163, SerialOffset=9780, bForcedExport=False, bNotForClient=False, bNotForServer=False, bIsInheritedInstance=False, PackageFlags=0, bNotAlwaysLoadedForEditorGame=True, bIsAsset=False, bGeneratePublicHash=False, FirstExportDependency=-1, SerializationBeforeSerializationDependencies=0, CreateBeforeSerializationDependencies=0, SerializationBeforeCreateDependencies=0, CreateBeforeCreateDependencies=0), FObjectExport(ClassIndex=-6, SuperIndex=0, TemplateIndex=0, OuterIndex=5, ObjectName=FNameEntry(Path=FbxStaticMeshImportData, NonCasePreservingHash=57899, CasePreservingHash=5564), ObjectFlags=0, SerialSize=379, SerialOffset=9943, bForcedExport=False, bNotForClient=False, bNotForServer=False, bIsInheritedInstance=False, PackageFlags=0, bNotAlwaysLoadedForEditorGame=True, bIsAsset=False, bGeneratePublicHash=False, FirstExportDependency=-1, SerializationBeforeSerializationDependencies=0, CreateBeforeSerializationDependencies=0, SerializationBeforeCreateDependencies=0, CreateBeforeCreateDependencies=0), FObjectExport(ClassIndex=-1, SuperIndex=0, TemplateIndex=0, OuterIndex=0, ObjectName=FNameEntry(Path=PackageMetaData, NonCasePreservingHash=11421, CasePreservingHash=26020), ObjectFlags=2, SerialSize=90, SerialOffset=10322, bForcedExport=False, bNotForClient=True, bNotForServer=True, bIsInheritedInstance=False, PackageFlags=0, bNotAlwaysLoadedForEditorGame=False, bIsAsset=False, bGeneratePublicHash=False, FirstExportDependency=-1, SerializationBeforeSerializationDependencies=0, CreateBeforeSerializationDependencies=0, SerializationBeforeCreateDependencies=0, CreateBeforeCreateDependencies=0), FObjectExport(ClassIndex=-5, SuperIndex=0, TemplateIndex=0, OuterIndex=5, ObjectName=FNameEntry(Path=NavCollision, NonCasePreservingHash=35468, CasePreservingHash=23586), ObjectFlags=8, SerialSize=44, SerialOffset=10412, bForcedExport=False, bNotForClient=False, bNotForServer=False, bIsInheritedInstance=False, PackageFlags=0, bNotAlwaysLoadedForEditorGame=True, bIsAsset=False, bGeneratePublicHash=False, FirstExportDependency=-1, SerializationBeforeSerializationDependencies=0, CreateBeforeSerializationDependencies=0, SerializationBeforeCreateDependencies=0, CreateBeforeCreateDependencies=0), FObjectExport(ClassIndex=-3, SuperIndex=0, TemplateIndex=0, OuterIndex=0, ObjectName=FNameEntry(Path=ground, NonCasePreservingHash=9496, CasePreservingHash=6824), ObjectFlags=11, SerialSize=3177, SerialOffset=10456, bForcedExport=False, bNotForClient=False, bNotForServer=False, bIsInheritedInstance=False, PackageFlags=0, bNotAlwaysLoadedForEditorGame=True, bIsAsset=True, bGeneratePublicHash=False, FirstExportDependency=-1, SerializationBeforeSerializationDependencies=0, CreateBeforeSerializationDependencies=0, SerializationBeforeCreateDependencies=0, CreateBeforeCreateDependencies=0), FObjectExport(ClassIndex=-4, SuperIndex=0, TemplateIndex=0, OuterIndex=5, ObjectName=FNameEntry(Path=HiResMeshDescription, NonCasePreservingHash=61143, CasePreservingHash=24778), ObjectFlags=262153, SerialSize=80, SerialOffset=13633, bForcedExport=False, bNotForClient=True, bNotForServer=True, bIsInheritedInstance=True, PackageFlags=0, bNotAlwaysLoadedForEditorGame=False, bIsAsset=False, bGeneratePublicHash=False, FirstExportDependency=-1, SerializationBeforeSerializationDependencies=0, CreateBeforeSerializationDependencies=0, SerializationBeforeCreateDependencies=0, CreateBeforeCreateDependencies=0), FObjectExport(ClassIndex=-4, SuperIndex=0, TemplateIndex=0, OuterIndex=5, ObjectName=FNameEntry(Path=StaticMeshDescriptionBulkData, NonCasePreservingHash=4260, CasePreservingHash=60268), ObjectFlags=8, SerialSize=80, SerialOffset=13713, bForcedExport=False, bNotForClient=True, bNotForServer=True, bIsInheritedInstance=False, PackageFlags=0, bNotAlwaysLoadedForEditorGame=False, bIsAsset=False, bGeneratePublicHash=False, FirstExportDependency=-1, SerializationBeforeSerializationDependencies=0, CreateBeforeSerializationDependencies=0, SerializationBeforeCreateDependencies=0, CreateBeforeCreateDependencies=0)] 26 | 27 | ``` 28 | -------------------------------------------------------------------------------- /parser.py: -------------------------------------------------------------------------------- 1 | from reader import BinaryReader 2 | from structures import * 3 | 4 | 5 | class UassetParser: 6 | def __init__(self, file_path): 7 | self.reader = BinaryReader(file_path) 8 | self.summary = FPackageFileSummary(self.reader) 9 | self.reader.setSummary(self.summary) 10 | self.nameMap = FNameMap(self.reader) 11 | self.reader.setNameMap(self.nameMap) 12 | self.importMap = FObjectImport(self.reader) 13 | self.reader.setImportMap(self.importMap) 14 | self.exportMap = FExportMap(self.reader) 15 | self.reader.setExportMap(self.exportMap) 16 | 17 | def __repr__(self): 18 | ret = f"[Summary]\n{self.summary}\n" 19 | ret += f"[NameMap]\n{self.nameMap}\n" 20 | ret += f"[ImportMap]\n{self.importMap}\n" 21 | ret += f"[ExportMap]\n{self.exportMap}\n" 22 | return ret 23 | 24 | 25 | if __name__ == '__main__': 26 | test_file = "/Users/ay27/Downloads/ground.uasset" 27 | parser = UassetParser(test_file) 28 | print(parser) 29 | -------------------------------------------------------------------------------- /reader.py: -------------------------------------------------------------------------------- 1 | import struct 2 | 3 | 4 | class BinaryReader(object): 5 | def __init__(self, filepath): 6 | self.f = open(filepath, 'rb') 7 | 8 | def read(self, size=1): 9 | return self.f.read(size) 10 | 11 | def seek(self, offset, whence=0): 12 | self.f.seek(offset, whence) 13 | 14 | def skip(self, offset): 15 | self.f.read(offset) 16 | 17 | def tell(self): 18 | return self.f.tell() 19 | 20 | def readBool(self): 21 | """Booleans in UE are serialized as int32""" 22 | val = self.readInt32() 23 | if val not in [0, 1]: 24 | raise ValueError("Invalid boolean value") 25 | return val != 0 26 | 27 | def readUInt16(self): 28 | v, = struct.unpack(' str: 48 | length = self.readInt32() 49 | if length < 0: 50 | raise ValueError(f"do not support wide char, length: {length}") 51 | byte = self.f.read(length)[:-1] 52 | return byte.decode("utf-8") 53 | 54 | def readTArray(self, item_cls): 55 | ret = [] 56 | SerializeNum = self.readInt32() 57 | for _ in range(SerializeNum): 58 | ret.append(item_cls(self)) 59 | return ret 60 | 61 | def readFName(self): 62 | NameMap = self.nameMap 63 | NameIndex = self.readInt32() 64 | Number = self.readInt32() 65 | 66 | if not 0 <= NameIndex < len(NameMap): 67 | raise ValueError(f"NameIndex out of range: {NameIndex}") 68 | 69 | return NameMap[NameIndex] 70 | 71 | def setSummary(self, summary): 72 | self.summary = summary 73 | 74 | def setNameMap(self, nameMap): 75 | self.nameMap = nameMap 76 | 77 | def setImportMap(self, importMap): 78 | self.importMap = importMap 79 | 80 | def setExportMap(self, exportMap): 81 | self.exportMap = exportMap 82 | -------------------------------------------------------------------------------- /structures.py: -------------------------------------------------------------------------------- 1 | import struct 2 | from typing import List 3 | 4 | from ue_version import UE5Versions, UE4Versions 5 | 6 | 7 | class PrintableBase: 8 | def __repr__(self): 9 | ret = f"{self.__class__.__name__}(" 10 | for k, v in self.__dict__.items(): 11 | if k.startswith('_'): 12 | continue 13 | ret += f"{k}={v}, " 14 | ret = ret[:-2] 15 | ret += ")" 16 | return ret 17 | 18 | 19 | class FGuid(PrintableBase): 20 | A: int 21 | B: int 22 | C: int 23 | D: int 24 | 25 | def __init__(self, f): 26 | self.A, self.B, self.C, self.D = struct.unpack('= 0: 175 | raise ValueError("Can not load UE3 packages.") 176 | if self.LegacyFileVersion != -4: 177 | self.LegacyUE3version = f.readInt32() 178 | self.FileVersionUE4 = f.readInt32() 179 | if self.LegacyFileVersion <= -8: 180 | self.FileVersionUE5 = f.readInt32() 181 | else: 182 | self.FileVersionUE5 = 0 183 | self.FileVersionLicenseeUE4 = f.readInt32() 184 | if self.LegacyFileVersion <= -2: 185 | self.CustomVersionContainer = FCustomVersionContainer(f, self.LegacyFileVersion) 186 | 187 | if (not self.FileVersionUE4) and (not self.FileVersionUE5) and (not self.FileVersionLicenseeUE4): 188 | self.bUnversioned = True 189 | else: 190 | self.bUnversioned = False 191 | 192 | self.TotalHeaderSize = f.readInt32() 193 | self.PackageName = f.readFString() 194 | self.PackageFlags = f.readUInt32() 195 | 196 | self.NameCount = f.readInt32() 197 | self.NameOffset = f.readInt32() 198 | 199 | if self.FileVersionUE5 >= UE5Versions.ADD_SOFTOBJECTPATH_LIST: 200 | self.SoftObjectPathsCount = f.readInt32() 201 | self.SoftObjectPathsOffset = f.readInt32() 202 | 203 | if self.FileVersionUE4 >= UE4Versions.VER_UE4_ADDED_PACKAGE_SUMMARY_LOCALIZATION_ID: 204 | self.LocalizationId = f.readFString() 205 | 206 | if self.FileVersionUE4 >= UE4Versions.VER_UE4_SERIALIZE_TEXT_IN_PACKAGES: 207 | self.GatherableTextDataCount = f.readInt32() 208 | self.GatherableTextDataOffset = f.readInt32() 209 | 210 | self.ExportCount = f.readInt32() 211 | self.ExportOffset = f.readInt32() 212 | self.ImportCount = f.readInt32() 213 | self.ImportOffset = f.readInt32() 214 | self.DependsOffset = f.readInt32() 215 | 216 | if self.FileVersionUE4 >= UE4Versions.VER_UE4_ADD_STRING_ASSET_REFERENCES_MAP: 217 | self.SoftPackageReferencesCount = f.readInt32() 218 | self.SoftPackageReferencesOffset = f.readInt32() 219 | 220 | if self.FileVersionUE4 >= UE4Versions.VER_UE4_ADDED_SEARCHABLE_NAMES: 221 | self.SearchableNamesOffset = f.readInt32() 222 | 223 | self.ThumbnailTableOffset = f.readInt32() 224 | self.Guid = FGuid(f) 225 | 226 | if self.FileVersionUE4 >= UE4Versions.VER_UE4_ADDED_PACKAGE_OWNER: 227 | self.PersistentGuid = FGuid(f) 228 | 229 | if self.FileVersionUE4 >= UE4Versions.VER_UE4_ADDED_PACKAGE_OWNER and \ 230 | self.FileVersionUE4 < UE4Versions.VER_UE4_NON_OUTER_PACKAGE_IMPORT: 231 | self.OwnerPersistentGuid = FGuid(f) 232 | 233 | self.GenerationCount = f.readInt32() 234 | self.Generations = [] 235 | if self.GenerationCount > 0: 236 | for _ in range(self.GenerationCount): 237 | self.Generations.append(FGenerationInfo(f)) 238 | 239 | if self.FileVersionUE4 >= UE4Versions.VER_UE4_ENGINE_VERSION_OBJECT: 240 | self.SavedByEngineVersion = FEngineVersion(f) 241 | else: 242 | self.EngineChangelist = f.readInt32() 243 | 244 | if self.FileVersionUE4 >= UE4Versions.VER_UE4_PACKAGE_SUMMARY_HAS_COMPATIBLE_ENGINE_VERSION: 245 | self.CompatibleWithEngineVersion = FEngineVersion(f) 246 | 247 | self.CompressionFlags = f.readUInt32() 248 | self.CompressedChunks = f.readTArray(FCompressedChunk) 249 | if len(self.CompressedChunks) > 0: 250 | raise ValueError("Package level compression is enabled") 251 | 252 | self.PackageSource = f.readUInt32() 253 | self.AdditionalPackagesToCook = f.readTArray(f.readFString) 254 | 255 | if self.LegacyFileVersion > -7: 256 | self.NumTextureAllocations = f.readInt32() 257 | 258 | self.AssetRegistryDataOffset = f.readInt32() 259 | self.BulkDataStartOffset = f.readInt64() 260 | 261 | if self.FileVersionUE4 >= UE4Versions.VER_UE4_WORLD_LEVEL_INFO: 262 | self.WorldTileInfoDataOffset = f.readInt32() 263 | 264 | if self.FileVersionUE4 >= UE4Versions.VER_UE4_CHANGED_CHUNKID_TO_BE_AN_ARRAY_OF_CHUNKIDS: 265 | self.ChunkIDs = f.readTArray(f.readInt32) 266 | 267 | self.PreloadDependencyCount = f.readInt32() 268 | self.PreloadDependencyOffset = f.readInt32() 269 | 270 | if self.FileVersionUE5 >= UE5Versions.NAMES_REFERENCED_FROM_EXPORT_DATA: 271 | self.NamesReferencedFromExportDataCount = f.readInt32() 272 | 273 | if self.FileVersionUE5 >= UE5Versions.PAYLOAD_TOC: 274 | self.PayloadTocOffset = f.readInt32() 275 | 276 | if self.FileVersionUE5 >= UE5Versions.DATA_RESOURCES: 277 | self.DataResourceOffset = f.readInt32() 278 | 279 | 280 | class FNameEntry(PrintableBase): 281 | Path: str 282 | NonCasePreservingHash: int 283 | CasePreservingHash: int 284 | 285 | def __init__(self, f): 286 | self.Path = f.readFString() 287 | self.NonCasePreservingHash = f.readUInt16() 288 | self.CasePreservingHash = f.readUInt16() 289 | 290 | 291 | class FNameMap(list, PrintableBase): 292 | def __init__(self, f): 293 | super().__init__() 294 | f.seek(f.summary.NameOffset, 0) 295 | if f.summary.NameCount == 0: 296 | return 297 | 298 | for _ in range(f.summary.NameCount): 299 | self.append(FNameEntry(f)) 300 | 301 | 302 | class FObjectImport(PrintableBase): 303 | ClassPackage: FNameEntry 304 | ClassName: FNameEntry 305 | OuterIndex: int 306 | ObjectName: FNameEntry 307 | PackageName: FNameEntry 308 | bImportOptional: bool 309 | 310 | def __init__(self, f): 311 | self.ClassPackage = f.readFName() 312 | self.ClassName = f.readFName() 313 | self.OuterIndex = f.readInt32() 314 | self.ObjectName = f.readFName() 315 | 316 | if f.summary.FileVersionUE4 >= UE4Versions.VER_UE4_NON_OUTER_PACKAGE_IMPORT: 317 | self.PackageName = f.readFName() 318 | 319 | if f.summary.FileVersionUE5 >= UE5Versions.OPTIONAL_RESOURCES: 320 | self.bImportOptional = f.readBool() 321 | 322 | 323 | class FImportMap(list, PrintableBase): 324 | def __init__(self, f): 325 | super().__init__() 326 | f.seek(f.summary.ImportOffset, 0) 327 | if f.summary.ImportCount == 0: 328 | return 329 | 330 | for _ in range(f.summary.ImportCount): 331 | self.append(FObjectImport(f)) 332 | 333 | 334 | class FObjectExport(PrintableBase): 335 | def __init__(self, f): 336 | self.ClassIndex = f.readInt32() 337 | self.SuperIndex = f.readInt32() 338 | if f.summary.FileVersionUE4 >= UE4Versions.VER_UE4_TemplateIndex_IN_COOKED_EXPORTS: 339 | self.TemplateIndex = f.readInt32() 340 | 341 | self.OuterIndex = f.readInt32() 342 | self.ObjectName = f.readFName() 343 | self.ObjectFlags = f.readUInt32() 344 | 345 | if f.summary.FileVersionUE4 < UE4Versions.VER_UE4_64BIT_EXPORTMAP_SERIALSIZES: 346 | self.SerialSize = f.readInt32() 347 | self.SerialOffset = f.readInt32() 348 | else: 349 | self.SerialSize = f.readInt64() 350 | self.SerialOffset = f.readInt64() 351 | 352 | self.bForcedExport = f.readBool() 353 | self.bNotForClient = f.readBool() 354 | self.bNotForServer = f.readBool() 355 | 356 | if f.summary.FileVersionUE5 < UE5Versions.REMOVE_OBJECT_EXPORT_PACKAGE_GUID: 357 | self.PackageGuid = FGuid(f) 358 | 359 | if f.summary.FileVersionUE5 >= UE5Versions.TRACK_OBJECT_EXPORT_IS_INHERITED: 360 | self.bIsInheritedInstance = f.readBool() 361 | self.PackageFlags = f.readUInt32() 362 | 363 | if f.summary.FileVersionUE4 >= UE4Versions.VER_UE4_LOAD_FOR_EDITOR_GAME: 364 | self.bNotAlwaysLoadedForEditorGame = f.readBool() 365 | 366 | if f.summary.FileVersionUE4 >= UE4Versions.VER_UE4_COOKED_ASSETS_IN_EDITOR_SUPPORT: 367 | self.bIsAsset = f.readBool() 368 | 369 | if f.summary.FileVersionUE5 >= UE5Versions.OPTIONAL_RESOURCES: 370 | self.bGeneratePublicHash = f.readBool() 371 | 372 | if f.summary.FileVersionUE4 >= UE4Versions.VER_UE4_PRELOAD_DEPENDENCIES_IN_COOKED_EXPORTS: 373 | self.FirstExportDependency = f.readInt32() 374 | self.SerializationBeforeSerializationDependencies = f.readInt32() 375 | self.CreateBeforeSerializationDependencies = f.readInt32() 376 | self.SerializationBeforeCreateDependencies = f.readInt32() 377 | self.CreateBeforeCreateDependencies = f.readInt32() 378 | 379 | 380 | class FExportMap(list, PrintableBase): 381 | def __init__(self, f): 382 | super().__init__() 383 | f.seek(f.summary.ExportOffset, 0) 384 | if f.summary.ExportCount == 0: 385 | return 386 | 387 | for _ in range(f.summary.ExportCount): 388 | self.append(FObjectExport(f)) 389 | -------------------------------------------------------------------------------- /ue_version.py: -------------------------------------------------------------------------------- 1 | from enum import IntEnum, auto 2 | 3 | 4 | # from Engine/Source/Core/Public/UObject/ObjectVersion.h 5 | 6 | class EUnrealEngineObjectUE4Version(IntEnum): 7 | VER_UE4_OLDEST_LOADABLE_PACKAGE = 214 8 | 9 | # Removed restriction on blueprint-exposed variables from being read-only 10 | VER_UE4_BLUEPRINT_VARS_NOT_READ_ONLY = auto() 11 | # Added manually serialized element to UStaticMesh (precalculated nav collision) 12 | VER_UE4_STATIC_MESH_STORE_NAV_COLLISION = auto() 13 | # Changed property name for atmospheric fog 14 | VER_UE4_ATMOSPHERIC_FOG_DECAY_NAME_CHANGE = auto() 15 | # Change many properties/functions from Translation to Location 16 | VER_UE4_SCENECOMP_TRANSLATION_TO_LOCATION = auto() 17 | # Material attributes reordering 18 | VER_UE4_MATERIAL_ATTRIBUTES_REORDERING = auto() 19 | # Collision Profile setting has been added, and all components that exists has to be properly upgraded 20 | VER_UE4_COLLISION_PROFILE_SETTING = auto() 21 | # Making the blueprint's skeleton class transient 22 | VER_UE4_BLUEPRINT_SKEL_TEMPORARY_TRANSIENT = auto() 23 | # Making the blueprint's skeleton class serialized again 24 | VER_UE4_BLUEPRINT_SKEL_SERIALIZED_AGAIN = auto() 25 | # Blueprint now controls replication settings again 26 | VER_UE4_BLUEPRINT_SETS_REPLICATION = auto() 27 | # Added level info used by World browser 28 | VER_UE4_WORLD_LEVEL_INFO = auto() 29 | # Changed capsule height to capsule half-height (afterwards) 30 | VER_UE4_AFTER_CAPSULE_HALF_HEIGHT_CHANGE = auto() 31 | # Added Namepace, GUID (Key) and Flags to FText 32 | VER_UE4_ADDED_NAMESPACE_AND_KEY_DATA_TO_FTEXT = auto() 33 | # Attenuation shapes 34 | VER_UE4_ATTENUATION_SHAPES = auto() 35 | # Use IES texture multiplier even when IES brightness is not being used 36 | VER_UE4_LIGHTCOMPONENT_USE_IES_TEXTURE_MULTIPLIER_ON_NON_IES_BRIGHTNESS = auto() 37 | # Removed InputComponent as a blueprint addable component 38 | VER_UE4_REMOVE_INPUT_COMPONENTS_FROM_BLUEPRINTS = auto() 39 | # Use an FMemberReference struct in UK2Node_Variable 40 | VER_UE4_VARK2NODE_USE_MEMBERREFSTRUCT = auto() 41 | # Refactored material expression inputs for UMaterialExpressionSceneColor and UMaterialExpressionSceneDepth 42 | VER_UE4_REFACTOR_MATERIAL_EXPRESSION_SCENECOLOR_AND_SCENEDEPTH_INPUTS = auto() 43 | # Spline meshes changed from Z forwards to configurable 44 | VER_UE4_SPLINE_MESH_ORIENTATION = auto() 45 | # Added ReverbEffect asset type 46 | VER_UE4_REVERB_EFFECT_ASSET_TYPE = auto() 47 | # changed max texcoords from 4 to 8 48 | VER_UE4_MAX_TEXCOORD_INCREASED = auto() 49 | # static meshes changed to support SpeedTrees 50 | VER_UE4_SPEEDTREE_STATICMESH = auto() 51 | # Landscape component reference between landscape component and collision component 52 | VER_UE4_LANDSCAPE_COMPONENT_LAZY_REFERENCES = auto() 53 | # Refactored UK2Node_CallFunction to use FMemberReference 54 | VER_UE4_SWITCH_CALL_NODE_TO_USE_MEMBER_REFERENCE = auto() 55 | # Added fixup step to remove skeleton class references from blueprint objects 56 | VER_UE4_ADDED_SKELETON_ARCHIVER_REMOVAL = auto() 57 | # See above, take 2. 58 | VER_UE4_ADDED_SKELETON_ARCHIVER_REMOVAL_SECOND_TIME = auto() 59 | # Making the skeleton class on blueprints transient 60 | VER_UE4_BLUEPRINT_SKEL_CLASS_TRANSIENT_AGAIN = auto() 61 | # UClass knows if it's been cooked 62 | VER_UE4_ADD_COOKED_TO_UCLASS = auto() 63 | # Deprecated static mesh thumbnail properties were removed 64 | VER_UE4_DEPRECATED_STATIC_MESH_THUMBNAIL_PROPERTIES_REMOVED = auto() 65 | # Added collections in material shader map ids 66 | VER_UE4_COLLECTIONS_IN_SHADERMAPID = auto() 67 | # Renamed some Movement Component properties, added PawnMovementComponent 68 | VER_UE4_REFACTOR_MOVEMENT_COMPONENT_HIERARCHY = auto() 69 | # Swap UMaterialExpressionTerrainLayerSwitch::LayerUsed/LayerNotUsed the correct way round 70 | VER_UE4_FIX_TERRAIN_LAYER_SWITCH_ORDER = auto() 71 | # Remove URB_ConstraintSetup 72 | VER_UE4_ALL_PROPS_TO_CONSTRAINTINSTANCE = auto() 73 | # Low quality directional lightmaps 74 | VER_UE4_LOW_QUALITY_DIRECTIONAL_LIGHTMAPS = auto() 75 | # Added NoiseEmitterComponent and removed related Pawn properties. 76 | VER_UE4_ADDED_NOISE_EMITTER_COMPONENT = auto() 77 | # Add text component vertical alignment 78 | VER_UE4_ADD_TEXT_COMPONENT_VERTICAL_ALIGNMENT = auto() 79 | # Added AssetImportData for FBX asset types, deprecating SourceFilePath and SourceFileTimestamp 80 | VER_UE4_ADDED_FBX_ASSET_IMPORT_DATA = auto() 81 | # Remove LevelBodySetup from ULevel 82 | VER_UE4_REMOVE_LEVELBODYSETUP = auto() 83 | # Refactor character crouching 84 | VER_UE4_REFACTOR_CHARACTER_CROUCH = auto() 85 | # Trimmed down material shader debug information. 86 | VER_UE4_SMALLER_DEBUG_MATERIALSHADER_UNIFORM_EXPRESSIONS = auto() 87 | # APEX Clothing 88 | VER_UE4_APEX_CLOTH = auto() 89 | # Change Collision Channel to save only modified ones than all of them 90 | # @note!!! once we pass this CL, we can rename FCollisionResponseContainer enum values 91 | # we should rename to match ECollisionChannel 92 | VER_UE4_SAVE_COLLISIONRESPONSE_PER_CHANNEL = auto() 93 | # Added Landscape Spline editor meshes 94 | VER_UE4_ADDED_LANDSCAPE_SPLINE_EDITOR_MESH = auto() 95 | # Fixup input expressions for reading from refraction material attributes. 96 | VER_UE4_CHANGED_MATERIAL_REFACTION_TYPE = auto() 97 | # Refactor projectile movement, along with some other movement component work. 98 | VER_UE4_REFACTOR_PROJECTILE_MOVEMENT = auto() 99 | # Remove PhysicalMaterialProperty and replace with user defined enum 100 | VER_UE4_REMOVE_PHYSICALMATERIALPROPERTY = auto() 101 | # Removed all compile outputs from FMaterial 102 | VER_UE4_PURGED_FMATERIAL_COMPILE_OUTPUTS = auto() 103 | # Ability to save cooked PhysX meshes to Landscape 104 | VER_UE4_ADD_COOKED_TO_LANDSCAPE = auto() 105 | # Change how input component consumption works 106 | VER_UE4_CONSUME_INPUT_PER_BIND = auto() 107 | # Added new Graph based SoundClass Editor 108 | VER_UE4_SOUND_CLASS_GRAPH_EDITOR = auto() 109 | # Fixed terrain layer node guids which was causing artifacts 110 | VER_UE4_FIXUP_TERRAIN_LAYER_NODES = auto() 111 | # Added clamp min/max swap check to catch older materials 112 | VER_UE4_RETROFIT_CLAMP_EXPRESSIONS_SWAP = auto() 113 | # Remove static/movable/stationary light classes 114 | VER_UE4_REMOVE_LIGHT_MOBILITY_CLASSES = auto() 115 | # Refactor the way physics blending works to allow partial blending 116 | VER_UE4_REFACTOR_PHYSICS_BLENDING = auto() 117 | # WorldLevelInfo: Added reference to parent level and streaming distance 118 | VER_UE4_WORLD_LEVEL_INFO_UPDATED = auto() 119 | # Fixed cooking of skeletal/static meshes due to bad serialization logic 120 | VER_UE4_STATIC_SKELETAL_MESH_SERIALIZATION_FIX = auto() 121 | # Removal of InterpActor and PhysicsActor 122 | VER_UE4_REMOVE_STATICMESH_MOBILITY_CLASSES = auto() 123 | # Refactor physics transforms 124 | VER_UE4_REFACTOR_PHYSICS_TRANSFORMS = auto() 125 | # Remove zero triangle sections from static meshes and compact material indices. 126 | VER_UE4_REMOVE_ZERO_TRIANGLE_SECTIONS = auto() 127 | # Add param for deceleration in character movement instead of using acceleration. 128 | VER_UE4_CHARACTER_MOVEMENT_DECELERATION = auto() 129 | # Made ACameraActor use a UCameraComponent for parameter storage, etc... 130 | VER_UE4_CAMERA_ACTOR_USING_CAMERA_COMPONENT = auto() 131 | # Deprecated some pitch/roll properties in CharacterMovementComponent 132 | VER_UE4_CHARACTER_MOVEMENT_DEPRECATE_PITCH_ROLL = auto() 133 | # Rebuild texture streaming data on load for uncooked builds 134 | VER_UE4_REBUILD_TEXTURE_STREAMING_DATA_ON_LOAD = auto() 135 | # Add support for 32 bit index buffers for static meshes. 136 | VER_UE4_SUPPORT_32BIT_STATIC_MESH_INDICES = auto() 137 | # Added streaming install ChunkID to AssetData and UPackage 138 | VER_UE4_ADDED_CHUNKID_TO_ASSETDATA_AND_UPACKAGE = auto() 139 | # Add flag to control whether Character blueprints receive default movement bindings. 140 | VER_UE4_CHARACTER_DEFAULT_MOVEMENT_BINDINGS = auto() 141 | # APEX Clothing LOD Info 142 | VER_UE4_APEX_CLOTH_LOD = auto() 143 | # Added atmospheric fog texture data to be general 144 | VER_UE4_ATMOSPHERIC_FOG_CACHE_DATA = auto() 145 | # Arrays serialize their inner's tags 146 | VAR_UE4_ARRAY_PROPERTY_INNER_TAGS = auto() 147 | # Skeletal mesh index data is kept in memory in game to support mesh merging. 148 | VER_UE4_KEEP_SKEL_MESH_INDEX_DATA = auto() 149 | # Added compatibility for the body instance collision change 150 | VER_UE4_BODYSETUP_COLLISION_CONVERSION = auto() 151 | # Reflection capture cooking 152 | VER_UE4_REFLECTION_CAPTURE_COOKING = auto() 153 | # Removal of DynamicTriggerVolume, DynamicBlockingVolume, DynamicPhysicsVolume 154 | VER_UE4_REMOVE_DYNAMIC_VOLUME_CLASSES = auto() 155 | # Store an additional flag in the BodySetup to indicate whether there is any cooked data to load 156 | VER_UE4_STORE_HASCOOKEDDATA_FOR_BODYSETUP = auto() 157 | # Changed name of RefractionBias to RefractionDepthBias. 158 | VER_UE4_REFRACTION_BIAS_TO_REFRACTION_DEPTH_BIAS = auto() 159 | # Removal of SkeletalPhysicsActor 160 | VER_UE4_REMOVE_SKELETALPHYSICSACTOR = auto() 161 | # PlayerController rotation input refactor 162 | VER_UE4_PC_ROTATION_INPUT_REFACTOR = auto() 163 | # Landscape Platform Data cooking 164 | VER_UE4_LANDSCAPE_PLATFORMDATA_COOKING = auto() 165 | # Added call for linking classes in CreateExport to ensure memory is initialized properly 166 | VER_UE4_CREATEEXPORTS_CLASS_LINKING_FOR_BLUEPRINTS = auto() 167 | # Remove native component nodes from the blueprint SimpleConstructionScript 168 | VER_UE4_REMOVE_NATIVE_COMPONENTS_FROM_BLUEPRINT_SCS = auto() 169 | # Removal of Single Node Instance 170 | VER_UE4_REMOVE_SINGLENODEINSTANCE = auto() 171 | # Character movement braking changes 172 | VER_UE4_CHARACTER_BRAKING_REFACTOR = auto() 173 | # Supported low quality lightmaps in volume samples 174 | VER_UE4_VOLUME_SAMPLE_LOW_QUALITY_SUPPORT = auto() 175 | # Split bEnableTouchEvents out from bEnableClickEvents 176 | VER_UE4_SPLIT_TOUCH_AND_CLICK_ENABLES = auto() 177 | # Health/Death refactor 178 | VER_UE4_HEALTH_DEATH_REFACTOR = auto() 179 | # Moving USoundNodeEnveloper from UDistributionFloatConstantCurve to FRichCurve 180 | VER_UE4_SOUND_NODE_ENVELOPER_CURVE_CHANGE = auto() 181 | # Moved SourceRadius to UPointLightComponent 182 | VER_UE4_POINT_LIGHT_SOURCE_RADIUS = auto() 183 | # Scene capture actors based on camera actors. 184 | VER_UE4_SCENE_CAPTURE_CAMERA_CHANGE = auto() 185 | # Moving SkeletalMesh shadow casting flag from LoD details to material 186 | VER_UE4_MOVE_SKELETALMESH_SHADOWCASTING = auto() 187 | # Changing bytecode operators for creating arrays 188 | VER_UE4_CHANGE_SETARRAY_BYTECODE = auto() 189 | # Material Instances overriding base material properties. 190 | VER_UE4_MATERIAL_INSTANCE_BASE_PROPERTY_OVERRIDES = auto() 191 | # Combined top/bottom lightmap textures 192 | VER_UE4_COMBINED_LIGHTMAP_TEXTURES = auto() 193 | # Forced material lightmass guids to be regenerated 194 | VER_UE4_BUMPED_MATERIAL_EXPORT_GUIDS = auto() 195 | # Allow overriding of parent class input bindings 196 | VER_UE4_BLUEPRINT_INPUT_BINDING_OVERRIDES = auto() 197 | # Fix up convex invalid transform 198 | VER_UE4_FIXUP_BODYSETUP_INVALID_CONVEX_TRANSFORM = auto() 199 | # Fix up scale of physics stiffness and damping value 200 | VER_UE4_FIXUP_STIFFNESS_AND_DAMPING_SCALE = auto() 201 | # Convert USkeleton and FBoneContrainer to using FReferenceSkeleton. 202 | VER_UE4_REFERENCE_SKELETON_REFACTOR = auto() 203 | # Adding references to variable, function, and macro nodes to be able to update to renamed values 204 | VER_UE4_K2NODE_REFERENCEGUIDS = auto() 205 | # Fix up the 0th bone's parent bone index. 206 | VER_UE4_FIXUP_ROOTBONE_PARENT = auto() 207 | # Allow setting of TextRenderComponents size in world space. 208 | VER_UE4_TEXT_RENDER_COMPONENTS_WORLD_SPACE_SIZING = auto() 209 | # Material Instances overriding base material properties #2. 210 | VER_UE4_MATERIAL_INSTANCE_BASE_PROPERTY_OVERRIDES_PHASE_2 = auto() 211 | # CLASS_Placeable becomes CLASS_NotPlaceable 212 | VER_UE4_CLASS_NOTPLACEABLE_ADDED = auto() 213 | # Added LOD info list to a world tile description 214 | VER_UE4_WORLD_LEVEL_INFO_LOD_LIST = auto() 215 | # CharacterMovement variable naming refactor 216 | VER_UE4_CHARACTER_MOVEMENT_VARIABLE_RENAMING_1 = auto() 217 | # FName properties containing sound names converted to FSlateSound properties 218 | VER_UE4_FSLATESOUND_CONVERSION = auto() 219 | # Added ZOrder to a world tile description 220 | VER_UE4_WORLD_LEVEL_INFO_ZORDER = auto() 221 | # Added flagging of localization gather requirement to packages 222 | VER_UE4_PACKAGE_REQUIRES_LOCALIZATION_GATHER_FLAGGING = auto() 223 | # Preventing Blueprint Actor variables from having default values 224 | VER_UE4_BP_ACTOR_VARIABLE_DEFAULT_PREVENTING = auto() 225 | # Preventing Blueprint Actor variables from having default values 226 | VER_UE4_TEST_ANIMCOMP_CHANGE = auto() 227 | # Class as primary asset, name convention changed 228 | VER_UE4_EDITORONLY_BLUEPRINTS = auto() 229 | # Custom serialization for FEdGraphPinType 230 | VER_UE4_EDGRAPHPINTYPE_SERIALIZATION = auto() 231 | # Stop generating 'mirrored' cooked mesh for Brush and Model components 232 | VER_UE4_NO_MIRROR_BRUSH_MODEL_COLLISION = auto() 233 | # Changed ChunkID to be an array of IDs. 234 | VER_UE4_CHANGED_CHUNKID_TO_BE_AN_ARRAY_OF_CHUNKIDS = auto() 235 | # Worlds have been renamed from "TheWorld" to be named after the package containing them 236 | VER_UE4_WORLD_NAMED_AFTER_PACKAGE = auto() 237 | # Added sky light component 238 | VER_UE4_SKY_LIGHT_COMPONENT = auto() 239 | # Added Enable distance streaming flag to FWorldTileLayer 240 | VER_UE4_WORLD_LAYER_ENABLE_DISTANCE_STREAMING = auto() 241 | # Remove visibility/zone information from UModel 242 | VER_UE4_REMOVE_ZONES_FROM_MODEL = auto() 243 | # Fix base pose serialization 244 | VER_UE4_FIX_ANIMATIONBASEPOSE_SERIALIZATION = auto() 245 | # Support for up to 8 skinning influences per vertex on skeletal meshes (on non-gpu vertices) 246 | VER_UE4_SUPPORT_8_BONE_INFLUENCES_SKELETAL_MESHES = auto() 247 | # Add explicit bOverrideGravity to world settings 248 | VER_UE4_ADD_OVERRIDE_GRAVITY_FLAG = auto() 249 | # Support for up to 8 skinning influences per vertex on skeletal meshes (on gpu vertices) 250 | VER_UE4_SUPPORT_GPUSKINNING_8_BONE_INFLUENCES = auto() 251 | # Supporting nonuniform scale animation 252 | VER_UE4_ANIM_SUPPORT_NONUNIFORM_SCALE_ANIMATION = auto() 253 | # Engine version is stored as a FEngineVersion object rather than changelist number 254 | VER_UE4_ENGINE_VERSION_OBJECT = auto() 255 | # World assets now have RF_Public 256 | VER_UE4_PUBLIC_WORLDS = auto() 257 | # Skeleton Guid 258 | VER_UE4_SKELETON_GUID_SERIALIZATION = auto() 259 | # Character movement WalkableFloor refactor 260 | VER_UE4_CHARACTER_MOVEMENT_WALKABLE_FLOOR_REFACTOR = auto() 261 | # Lights default to inverse squared 262 | VER_UE4_INVERSE_SQUARED_LIGHTS_DEFAULT = auto() 263 | # Disabled SCRIPT_LIMIT_BYTECODE_TO_64KB 264 | VER_UE4_DISABLED_SCRIPT_LIMIT_BYTECODE = auto() 265 | # Made remote role private, exposed bReplicates 266 | VER_UE4_PRIVATE_REMOTE_ROLE = auto() 267 | # Fix up old foliage components to have static mobility (superseded by VER_UE4_FOLIAGE_MOVABLE_MOBILITY) 268 | VER_UE4_FOLIAGE_STATIC_MOBILITY = auto() 269 | # Change BuildScale from a float to a vector 270 | VER_UE4_BUILD_SCALE_VECTOR = auto() 271 | # After implementing foliage collision, need to disable collision on old foliage instances 272 | VER_UE4_FOLIAGE_COLLISION = auto() 273 | # Added sky bent normal to indirect lighting cache 274 | VER_UE4_SKY_BENT_NORMAL = auto() 275 | # Added cooking for landscape collision data 276 | VER_UE4_LANDSCAPE_COLLISION_DATA_COOKING = auto() 277 | # Convert CPU tangent Z delta to vector from PackedNormal since we don't get any benefit other than memory 278 | # we still convert all to FVector in CPU time whenever any calculation 279 | VER_UE4_MORPHTARGET_CPU_TANGENTZDELTA_FORMATCHANGE = auto() 280 | # Soft constraint limits will implicitly use the mass of the bodies 281 | VER_UE4_SOFT_CONSTRAINTS_USE_MASS = auto() 282 | # Reflection capture data saved in packages 283 | VER_UE4_REFLECTION_DATA_IN_PACKAGES = auto() 284 | # Fix up old foliage components to have movable mobility (superseded by VER_UE4_FOLIAGE_STATIC_LIGHTING_SUPPORT) 285 | VER_UE4_FOLIAGE_MOVABLE_MOBILITY = auto() 286 | # Undo BreakMaterialAttributes changes as it broke old content 287 | VER_UE4_UNDO_BREAK_MATERIALATTRIBUTES_CHANGE = auto() 288 | # Now Default custom profile name isn't NONE anymore due to copy/paste not working properly with it 289 | VER_UE4_ADD_CUSTOMPROFILENAME_CHANGE = auto() 290 | # Permanently flip and scale material expression coordinates 291 | VER_UE4_FLIP_MATERIAL_COORDS = auto() 292 | # PinSubCategoryMemberReference added to FEdGraphPinType 293 | VER_UE4_MEMBERREFERENCE_IN_PINTYPE = auto() 294 | # Vehicles use Nm for Torque instead of cm and RPM instead of rad/s 295 | VER_UE4_VEHICLES_UNIT_CHANGE = auto() 296 | # removes NANs from all animations when loaded 297 | # now importing should detect NaNs, so we should not have NaNs in source data 298 | VER_UE4_ANIMATION_REMOVE_NANS = auto() 299 | # Change skeleton preview attached assets property type 300 | VER_UE4_SKELETON_ASSET_PROPERTY_TYPE_CHANGE = auto() 301 | # Fix some blueprint variables that have the CPF_DisableEditOnTemplate flag set 302 | # when they shouldn't 303 | VER_UE4_FIX_BLUEPRINT_VARIABLE_FLAGS = auto() 304 | # Vehicles use Nm for Torque instead of cm and RPM instead of rad/s part two (missed conversion for some variables 305 | VER_UE4_VEHICLES_UNIT_CHANGE2 = auto() 306 | # Changed order of interface class serialization 307 | VER_UE4_UCLASS_SERIALIZE_INTERFACES_AFTER_LINKING = auto() 308 | # Change from LOD distances to display factors 309 | VER_UE4_STATIC_MESH_SCREEN_SIZE_LODS = auto() 310 | # Requires test of material coords to ensure they're saved correctly 311 | VER_UE4_FIX_MATERIAL_COORDS = auto() 312 | # Changed SpeedTree wind presets to v7 313 | VER_UE4_SPEEDTREE_WIND_V7 = auto() 314 | # NeedsLoadForEditorGame added 315 | VER_UE4_LOAD_FOR_EDITOR_GAME = auto() 316 | # Manual serialization of FRichCurveKey to save space 317 | VER_UE4_SERIALIZE_RICH_CURVE_KEY = auto() 318 | # Change the outer of ULandscapeMaterialInstanceConstants and Landscape-related textures to the level in which they reside 319 | VER_UE4_MOVE_LANDSCAPE_MICS_AND_TEXTURES_WITHIN_LEVEL = auto() 320 | # FTexts have creation history data, removed Key, Namespaces, and SourceString 321 | VER_UE4_FTEXT_HISTORY = auto() 322 | # Shift comments to the left to contain expressions properly 323 | VER_UE4_FIX_MATERIAL_COMMENTS = auto() 324 | # Bone names stored as FName means that we can't guarantee the correct case on export, now we store a separate string for export purposes only 325 | VER_UE4_STORE_BONE_EXPORT_NAMES = auto() 326 | # changed mesh emitter initial orientation to distribution 327 | VER_UE4_MESH_EMITTER_INITIAL_ORIENTATION_DISTRIBUTION = auto() 328 | # Foliage on blueprints causes crashes 329 | VER_UE4_DISALLOW_FOLIAGE_ON_BLUEPRINTS = auto() 330 | # change motors to use revolutions per second instead of rads/second 331 | VER_UE4_FIXUP_MOTOR_UNITS = auto() 332 | # deprecated MovementComponent functions including "ModifiedMaxSpeed" et al 333 | VER_UE4_DEPRECATED_MOVEMENTCOMPONENT_MODIFIED_SPEEDS = auto() 334 | # rename CanBeCharacterBase 335 | VER_UE4_RENAME_CANBECHARACTERBASE = auto() 336 | # Change GameplayTagContainers to have FGameplayTags instead of FNames; Required to fix-up native serialization 337 | VER_UE4_GAMEPLAY_TAG_CONTAINER_TAG_TYPE_CHANGE = auto() 338 | # Change from UInstancedFoliageSettings to UFoliageType, and change the api from being keyed on UStaticMesh* to UFoliageType* 339 | VER_UE4_FOLIAGE_SETTINGS_TYPE = auto() 340 | # Lights serialize static shadow depth maps 341 | VER_UE4_STATIC_SHADOW_DEPTH_MAPS = auto() 342 | # Add RF_Transactional to data assets, fixing undo problems when editing them 343 | VER_UE4_ADD_TRANSACTIONAL_TO_DATA_ASSETS = auto() 344 | # Change LB_AlphaBlend to LB_WeightBlend in ELandscapeLayerBlendType 345 | VER_UE4_ADD_LB_WEIGHTBLEND = auto() 346 | # Add root component to an foliage actor, all foliage cluster components will be attached to a root 347 | VER_UE4_ADD_ROOTCOMPONENT_TO_FOLIAGEACTOR = auto() 348 | # FMaterialInstanceBasePropertyOverrides didn't use proper UObject serialize 349 | VER_UE4_FIX_MATERIAL_PROPERTY_OVERRIDE_SERIALIZE = auto() 350 | # Addition of linear color sampler. color sample type is changed to linear sampler if source texture !sRGB 351 | VER_UE4_ADD_LINEAR_COLOR_SAMPLER = auto() 352 | # Added StringAssetReferencesMap to support renames of FStringAssetReference properties. 353 | VER_UE4_ADD_STRING_ASSET_REFERENCES_MAP = auto() 354 | # Apply scale from SCS RootComponent details in the Blueprint Editor to new actor instances at construction time 355 | VER_UE4_BLUEPRINT_USE_SCS_ROOTCOMPONENT_SCALE = auto() 356 | # Changed level streaming to have a linear color since the visualization doesn't gamma correct. 357 | VER_UE4_LEVEL_STREAMING_DRAW_COLOR_TYPE_CHANGE = auto() 358 | # Cleared end triggers from non-state anim notifies 359 | VER_UE4_CLEAR_NOTIFY_TRIGGERS = auto() 360 | # Convert old curve names stored in anim assets into skeleton smartnames 361 | VER_UE4_SKELETON_ADD_SMARTNAMES = auto() 362 | # Added the currency code field to FTextHistory_AsCurrency 363 | VER_UE4_ADDED_CURRENCY_CODE_TO_FTEXT = auto() 364 | # Added support for C++11 enum classes 365 | VER_UE4_ENUM_CLASS_SUPPORT = auto() 366 | # Fixup widget animation class 367 | VER_UE4_FIXUP_WIDGET_ANIMATION_CLASS = auto() 368 | # USoundWave objects now contain details about compression scheme used. 369 | VER_UE4_SOUND_COMPRESSION_TYPE_ADDED = auto() 370 | # Bodies will automatically weld when attached 371 | VER_UE4_AUTO_WELDING = auto() 372 | # Rename UCharacterMovementComponent::bCrouchMovesCharacterDown 373 | VER_UE4_RENAME_CROUCHMOVESCHARACTERDOWN = auto() 374 | # Lightmap parameters in FMeshBuildSettings 375 | VER_UE4_LIGHTMAP_MESH_BUILD_SETTINGS = auto() 376 | # Rename SM3 to ES3_1 and updates featurelevel material node selector 377 | VER_UE4_RENAME_SM3_TO_ES3_1 = auto() 378 | # Deprecated separate style assets for use in UMG 379 | VER_UE4_DEPRECATE_UMG_STYLE_ASSETS = auto() 380 | # Duplicating Blueprints will regenerate NodeGuids after this version 381 | VER_UE4_POST_DUPLICATE_NODE_GUID = auto() 382 | # Rename USpringArmComponent::bUseControllerViewRotation to bUsePawnViewRotation = auto() 383 | # Rename UCameraComponent::bUseControllerViewRotation to bUsePawnViewRotation (and change the default value) 384 | VER_UE4_RENAME_CAMERA_COMPONENT_VIEW_ROTATION = auto() 385 | # Changed FName to be case preserving 386 | VER_UE4_CASE_PRESERVING_FNAME = auto() 387 | # Rename USpringArmComponent::bUsePawnViewRotation to bUsePawnControlRotation 388 | # Rename UCameraComponent::bUsePawnViewRotation to bUsePawnControlRotation 389 | VER_UE4_RENAME_CAMERA_COMPONENT_CONTROL_ROTATION = auto() 390 | # Fix bad refraction material attribute masks 391 | VER_UE4_FIX_REFRACTION_INPUT_MASKING = auto() 392 | # A global spawn rate for emitters. 393 | VER_UE4_GLOBAL_EMITTER_SPAWN_RATE_SCALE = auto() 394 | # Cleanup destructible mesh settings 395 | VER_UE4_CLEAN_DESTRUCTIBLE_SETTINGS = auto() 396 | # CharacterMovementComponent refactor of AdjustUpperHemisphereImpact and deprecation of some associated vars. 397 | VER_UE4_CHARACTER_MOVEMENT_UPPER_IMPACT_BEHAVIOR = auto() 398 | # Changed Blueprint math equality functions for vectors and rotators to operate as a "nearly" equals rather than "exact" 399 | VER_UE4_BP_MATH_VECTOR_EQUALITY_USES_EPSILON = auto() 400 | # Static lighting support was re-added to foliage, and mobility was returned to static 401 | VER_UE4_FOLIAGE_STATIC_LIGHTING_SUPPORT = auto() 402 | # Added composite fonts to Slate font info 403 | VER_UE4_SLATE_COMPOSITE_FONTS = auto() 404 | # Remove UDEPRECATED_SaveGameSummary, required for UWorld::Serialize 405 | VER_UE4_REMOVE_SAVEGAMESUMMARY = auto() 406 | 407 | # Remove bodyseutp serialization from skeletal mesh component 408 | VER_UE4_REMOVE_SKELETALMESH_COMPONENT_BODYSETUP_SERIALIZATION = auto() 409 | # Made Slate font data use bulk data to store the embedded font data 410 | VER_UE4_SLATE_BULK_FONT_DATA = auto() 411 | # Add new friction behavior in ProjectileMovementComponent. 412 | VER_UE4_ADD_PROJECTILE_FRICTION_BEHAVIOR = auto() 413 | # Add axis settings enum to MovementComponent. 414 | VER_UE4_MOVEMENTCOMPONENT_AXIS_SETTINGS = auto() 415 | # Switch to new interactive comments, requires boundry conversion to preserve previous states 416 | VER_UE4_GRAPH_INTERACTIVE_COMMENTBUBBLES = auto() 417 | # Landscape serializes physical materials for collision objects 418 | VER_UE4_LANDSCAPE_SERIALIZE_PHYSICS_MATERIALS = auto() 419 | # Rename Visiblity on widgets to Visibility 420 | VER_UE4_RENAME_WIDGET_VISIBILITY = auto() 421 | # add track curves for animation 422 | VER_UE4_ANIMATION_ADD_TRACKCURVES = auto() 423 | # Removed BranchingPoints from AnimMontages and converted them to regular AnimNotifies. 424 | VER_UE4_MONTAGE_BRANCHING_POINT_REMOVAL = auto() 425 | # Enforce const-correctness in Blueprint implementations of native C++ const class methods 426 | VER_UE4_BLUEPRINT_ENFORCE_CONST_IN_FUNCTION_OVERRIDES = auto() 427 | # Added pivot to widget components, need to load old versions as a 0,0 pivot, new default is 0.5,0.5 428 | VER_UE4_ADD_PIVOT_TO_WIDGET_COMPONENT = auto() 429 | # Added finer control over when AI Pawns are automatically possessed. Also renamed Pawn.AutoPossess to Pawn.AutoPossessPlayer indicate this was a setting for players and not AI. 430 | VER_UE4_PAWN_AUTO_POSSESS_AI = auto() 431 | # Added serialization of timezone to FTextHistory for AsDate operations. 432 | VER_UE4_FTEXT_HISTORY_DATE_TIMEZONE = auto() 433 | # Sort ActiveBoneIndices on lods so that we can avoid doing it at run time 434 | VER_UE4_SORT_ACTIVE_BONE_INDICES = auto() 435 | # Added per-frame material uniform expressions 436 | VER_UE4_PERFRAME_MATERIAL_UNIFORM_EXPRESSIONS = auto() 437 | # Make MikkTSpace the default tangent space calculation method for static meshes. 438 | VER_UE4_MIKKTSPACE_IS_DEFAULT = auto() 439 | # Only applies to cooked files, grass cooking support. 440 | VER_UE4_LANDSCAPE_GRASS_COOKING = auto() 441 | # Fixed code for using the bOrientMeshEmitters property. 442 | VER_UE4_FIX_SKEL_VERT_ORIENT_MESH_PARTICLES = auto() 443 | # Do not change landscape section offset on load under world composition 444 | VER_UE4_LANDSCAPE_STATIC_SECTION_OFFSET = auto() 445 | # New options for navigation data runtime generation (static, modifiers only, dynamic) 446 | VER_UE4_ADD_MODIFIERS_RUNTIME_GENERATION = auto() 447 | # Tidied up material's handling of masked blend mode. 448 | VER_UE4_MATERIAL_MASKED_BLENDMODE_TIDY = auto() 449 | # Original version of VER_UE4_MERGED_ADD_MODIFIERS_RUNTIME_GENERATION_TO_4_7; renumbered to prevent blocking promotion in main. 450 | VER_UE4_MERGED_ADD_MODIFIERS_RUNTIME_GENERATION_TO_4_7_DEPRECATED = auto() 451 | # Original version of VER_UE4_AFTER_MERGED_ADD_MODIFIERS_RUNTIME_GENERATION_TO_4_7; renumbered to prevent blocking promotion in main. 452 | VER_UE4_AFTER_MERGED_ADD_MODIFIERS_RUNTIME_GENERATION_TO_4_7_DEPRECATED = auto() 453 | # After merging VER_UE4_ADD_MODIFIERS_RUNTIME_GENERATION into 4.7 branch 454 | VER_UE4_MERGED_ADD_MODIFIERS_RUNTIME_GENERATION_TO_4_7 = auto() 455 | # After merging VER_UE4_ADD_MODIFIERS_RUNTIME_GENERATION into 4.7 branch 456 | VER_UE4_AFTER_MERGING_ADD_MODIFIERS_RUNTIME_GENERATION_TO_4_7 = auto() 457 | # Landscape grass weightmap data is now generated in the editor and serialized. 458 | VER_UE4_SERIALIZE_LANDSCAPE_GRASS_DATA = auto() 459 | # New property to optionally prevent gpu emitters clearing existing particles on Init(). 460 | VER_UE4_OPTIONALLY_CLEAR_GPU_EMITTERS_ON_INIT = auto() 461 | # Also store the Material guid with the landscape grass data 462 | VER_UE4_SERIALIZE_LANDSCAPE_GRASS_DATA_MATERIAL_GUID = auto() 463 | # Make sure that all template components from blueprint generated classes are flagged as public 464 | VER_UE4_BLUEPRINT_GENERATED_CLASS_COMPONENT_TEMPLATES_PUBLIC = auto() 465 | # Split out creation method on ActorComponents to distinguish between native, instance, and simple or user construction script 466 | VER_UE4_ACTOR_COMPONENT_CREATION_METHOD = auto() 467 | # K2Node_Event now uses FMemberReference for handling references 468 | VER_UE4_K2NODE_EVENT_MEMBER_REFERENCE = auto() 469 | # FPropertyTag stores GUID of struct 470 | VER_UE4_STRUCT_GUID_IN_PROPERTY_TAG = auto() 471 | # Remove unused UPolys from UModel cooked content 472 | VER_UE4_REMOVE_UNUSED_UPOLYS_FROM_UMODEL = auto() 473 | # This doesn't do anything except trigger a rebuild on HISMC cluster trees, in this case to get a good "occlusion query" level 474 | VER_UE4_REBUILD_HIERARCHICAL_INSTANCE_TREES = auto() 475 | # Package summary includes an CompatibleWithEngineVersion field, separately to the version it's saved with 476 | VER_UE4_PACKAGE_SUMMARY_HAS_COMPATIBLE_ENGINE_VERSION = auto() 477 | # Track UCS modified properties on Actor Components 478 | VER_UE4_TRACK_UCS_MODIFIED_PROPERTIES = auto() 479 | # Allowed landscape spline meshes to be stored into landscape streaming levels rather than the spline's level 480 | VER_UE4_LANDSCAPE_SPLINE_CROSS_LEVEL_MESHES = auto() 481 | # Deprecate the variables used for sizing in the designer on UUserWidget 482 | VER_UE4_DEPRECATE_USER_WIDGET_DESIGN_SIZE = auto() 483 | # Make the editor views array dynamically sized 484 | VER_UE4_ADD_EDITOR_VIEWS = auto() 485 | # Updated foliage to work with either FoliageType assets or blueprint classes 486 | VER_UE4_FOLIAGE_WITH_ASSET_OR_CLASS = auto() 487 | # Allows PhysicsSerializer to serialize shapes and actors for faster load times 488 | VER_UE4_BODYINSTANCE_BINARY_SERIALIZATION = auto() 489 | # Added fastcall data serialization directly in UFunction 490 | VER_UE4_SERIALIZE_BLUEPRINT_EVENTGRAPH_FASTCALLS_IN_UFUNCTION = auto() 491 | # Changes to USplineComponent and FInterpCurve 492 | VER_UE4_INTERPCURVE_SUPPORTS_LOOPING = auto() 493 | # Material Instances overriding base material LOD transitions 494 | VER_UE4_MATERIAL_INSTANCE_BASE_PROPERTY_OVERRIDES_DITHERED_LOD_TRANSITION = auto() 495 | # Serialize ES2 textures separately rather than overwriting the properties used on other platforms 496 | VER_UE4_SERIALIZE_LANDSCAPE_ES2_TEXTURES = auto() 497 | # Constraint motor velocity is broken into per-component 498 | VER_UE4_CONSTRAINT_INSTANCE_MOTOR_FLAGS = auto() 499 | # Serialize bIsConst in FEdGraphPinType 500 | VER_UE4_SERIALIZE_PINTYPE_CONST = auto() 501 | # Change UMaterialFunction::LibraryCategories to LibraryCategoriesText (old assets were saved before auto-conversion of FArrayProperty was possible) 502 | VER_UE4_LIBRARY_CATEGORIES_AS_FTEXT = auto() 503 | # Check for duplicate exports while saving packages. 504 | VER_UE4_SKIP_DUPLICATE_EXPORTS_ON_SAVE_PACKAGE = auto() 505 | # Pre-gathering of gatherable, localizable text in packages to optimize text gathering operation times 506 | VER_UE4_SERIALIZE_TEXT_IN_PACKAGES = auto() 507 | # Added pivot to widget components, need to load old versions as a 0,0 pivot, new default is 0.5,0.5 508 | VER_UE4_ADD_BLEND_MODE_TO_WIDGET_COMPONENT = auto() 509 | # Added lightmass primitive setting 510 | VER_UE4_NEW_LIGHTMASS_PRIMITIVE_SETTING = auto() 511 | # Deprecate NoZSpring property on spring nodes to be replaced with TranslateZ property 512 | VER_UE4_REPLACE_SPRING_NOZ_PROPERTY = auto() 513 | # Keep enums tight and serialize their values as pairs of FName and value. Don't insert dummy values. 514 | VER_UE4_TIGHTLY_PACKED_ENUMS = auto() 515 | # Changed Asset import data to serialize file meta data as JSON 516 | VER_UE4_ASSET_IMPORT_DATA_AS_JSON = auto() 517 | # Legacy gamma support for textures. 518 | VER_UE4_TEXTURE_LEGACY_GAMMA = auto() 519 | # Added WithSerializer for basic native structures like FVector, FColor etc to improve serialization performance 520 | VER_UE4_ADDED_NATIVE_SERIALIZATION_FOR_IMMUTABLE_STRUCTURES = auto() 521 | # Deprecated attributes that override the style on UMG widgets 522 | VER_UE4_DEPRECATE_UMG_STYLE_OVERRIDES = auto() 523 | # Shadowmap penumbra size stored 524 | VER_UE4_STATIC_SHADOWMAP_PENUMBRA_SIZE = auto() 525 | # Fix BC on Niagara effects from the data object and dev UI changes. 526 | VER_UE4_NIAGARA_DATA_OBJECT_DEV_UI_FIX = auto() 527 | # Fixed the default orientation of widget component so it faces down +x 528 | VER_UE4_FIXED_DEFAULT_ORIENTATION_OF_WIDGET_COMPONENT = auto() 529 | # Removed bUsedWithUI flag from UMaterial and replaced it with a new material domain for UI 530 | VER_UE4_REMOVED_MATERIAL_USED_WITH_UI_FLAG = auto() 531 | # Added braking friction separate from turning friction. 532 | VER_UE4_CHARACTER_MOVEMENT_ADD_BRAKING_FRICTION = auto() 533 | # Removed TTransArrays from UModel 534 | VER_UE4_BSP_UNDO_FIX = auto() 535 | # Added default value to dynamic parameter. 536 | VER_UE4_DYNAMIC_PARAMETER_DEFAULT_VALUE = auto() 537 | # Added ExtendedBounds to StaticMesh 538 | VER_UE4_STATIC_MESH_EXTENDED_BOUNDS = auto() 539 | # Added non-linear blending to anim transitions, deprecating old types 540 | VER_UE4_ADDED_NON_LINEAR_TRANSITION_BLENDS = auto() 541 | # AO Material Mask texture 542 | VER_UE4_AO_MATERIAL_MASK = auto() 543 | # Replaced navigation agents selection with single structure 544 | VER_UE4_NAVIGATION_AGENT_SELECTOR = auto() 545 | # Mesh particle collisions consider particle size. 546 | VER_UE4_MESH_PARTICLE_COLLISIONS_CONSIDER_PARTICLE_SIZE = auto() 547 | # Adjacency buffer building no longer automatically handled based on triangle count, user-controlled 548 | VER_UE4_BUILD_MESH_ADJ_BUFFER_FLAG_EXPOSED = auto() 549 | # Change the default max angular velocity 550 | VER_UE4_MAX_ANGULAR_VELOCITY_DEFAULT = auto() 551 | # Build Adjacency index buffer for clothing tessellation 552 | VER_UE4_APEX_CLOTH_TESSELLATION = auto() 553 | # Added DecalSize member, solved backward compatibility 554 | VER_UE4_DECAL_SIZE = auto() 555 | # Keep only package names in StringAssetReferencesMap 556 | VER_UE4_KEEP_ONLY_PACKAGE_NAMES_IN_STRING_ASSET_REFERENCES_MAP = auto() 557 | # Support sound cue not saving out editor only data 558 | VER_UE4_COOKED_ASSETS_IN_EDITOR_SUPPORT = auto() 559 | # Updated dialogue wave localization gathering logic. 560 | VER_UE4_DIALOGUE_WAVE_NAMESPACE_AND_CONTEXT_CHANGES = auto() 561 | # Renamed MakeRot MakeRotator and rearranged parameters. 562 | VER_UE4_MAKE_ROT_RENAME_AND_REORDER = auto() 563 | # K2Node_Variable will properly have the VariableReference Guid set if available 564 | VER_UE4_K2NODE_VAR_REFERENCEGUIDS = auto() 565 | # Added support for sound concurrency settings structure and overrides 566 | VER_UE4_SOUND_CONCURRENCY_PACKAGE = auto() 567 | # Changing the default value for focusable user widgets to false 568 | VER_UE4_USERWIDGET_DEFAULT_FOCUSABLE_FALSE = auto() 569 | # Custom event nodes implicitly set 'const' on array and non-array pass-by-reference input params 570 | VER_UE4_BLUEPRINT_CUSTOM_EVENT_CONST_INPUT = auto() 571 | # Renamed HighFrequencyGain to LowPassFilterFrequency 572 | VER_UE4_USE_LOW_PASS_FILTER_FREQ = auto() 573 | # UAnimBlueprintGeneratedClass can be replaced by a dynamic class. Use TSubclassOf instead. 574 | VER_UE4_NO_ANIM_BP_CLASS_IN_GAMEPLAY_CODE = auto() 575 | # The SCS keeps a list of all nodes in its hierarchy rather than recursively building it each time it is requested 576 | VER_UE4_SCS_STORES_ALLNODES_ARRAY = auto() 577 | # Moved StartRange and EndRange in UFbxAnimSequenceImportData to use FInt32Interval 578 | VER_UE4_FBX_IMPORT_DATA_RANGE_ENCAPSULATION = auto() 579 | # Adding a new root scene component to camera component 580 | VER_UE4_CAMERA_COMPONENT_ATTACH_TO_ROOT = auto() 581 | # Updating custom material expression nodes for instanced stereo implementation 582 | VER_UE4_INSTANCED_STEREO_UNIFORM_UPDATE = auto() 583 | # Texture streaming min and max distance to handle HLOD 584 | VER_UE4_STREAMABLE_TEXTURE_MIN_MAX_DISTANCE = auto() 585 | # Fixing up invalid struct-to-struct pin connections by injecting available conversion nodes 586 | VER_UE4_INJECT_BLUEPRINT_STRUCT_PIN_CONVERSION_NODES = auto() 587 | # Saving tag data for Array Property's inner property 588 | VER_UE4_INNER_ARRAY_TAG_INFO = auto() 589 | # Fixed duplicating slot node names in skeleton due to skeleton preload on compile 590 | VER_UE4_FIX_SLOT_NAME_DUPLICATION = auto() 591 | # Texture streaming using AABBs instead of Spheres 592 | VER_UE4_STREAMABLE_TEXTURE_AABB = auto() 593 | # FPropertyTag stores GUID of property 594 | VER_UE4_PROPERTY_GUID_IN_PROPERTY_TAG = auto() 595 | # Name table hashes are calculated and saved out rather than at load time 596 | VER_UE4_NAME_HASHES_SERIALIZED = auto() 597 | # Updating custom material expression nodes for instanced stereo implementation refactor 598 | VER_UE4_INSTANCED_STEREO_UNIFORM_REFACTOR = auto() 599 | # Added compression to the shader resource for memory savings 600 | VER_UE4_COMPRESSED_SHADER_RESOURCES = auto() 601 | # Cooked files contain the dependency graph for the event driven loader (the serialization is largely independent of the use of the new loader) 602 | VER_UE4_PRELOAD_DEPENDENCIES_IN_COOKED_EXPORTS = auto() 603 | # Cooked files contain the TemplateIndex used by the event driven loader (the serialization is largely independent of the use of the new loader, i.e. this will be null if cooking for the old loader) 604 | VER_UE4_TemplateIndex_IN_COOKED_EXPORTS = auto() 605 | # FPropertyTag includes contained type(s) for Set and Map properties: 606 | VER_UE4_PROPERTY_TAG_SET_MAP_SUPPORT = auto() 607 | # Added SearchableNames to the package summary and asset registry 608 | VER_UE4_ADDED_SEARCHABLE_NAMES = auto() 609 | # Increased size of SerialSize and SerialOffset in export map entries to 64 bit, allow support for bigger files 610 | VER_UE4_64BIT_EXPORTMAP_SERIALSIZES = auto() 611 | # Sky light stores IrradianceMap for mobile renderer. 612 | VER_UE4_SKYLIGHT_MOBILE_IRRADIANCE_MAP = auto() 613 | # Added flag to control sweep behavior while walking in UCharacterMovementComponent. 614 | VER_UE4_ADDED_SWEEP_WHILE_WALKING_FLAG = auto() 615 | # StringAssetReference changed to SoftObjectPath and swapped to serialize as a name+string instead of a string 616 | VER_UE4_ADDED_SOFT_OBJECT_PATH = auto() 617 | # Changed the source orientation of point lights to match spot lights (z axis) 618 | VER_UE4_POINTLIGHT_SOURCE_ORIENTATION = auto() 619 | # LocalizationId has been added to the package summary (editor-only) 620 | VER_UE4_ADDED_PACKAGE_SUMMARY_LOCALIZATION_ID = auto() 621 | # Fixed case insensitive hashes of wide strings containing character values from 128-255 622 | VER_UE4_FIX_WIDE_STRING_CRC = auto() 623 | # Added package owner to allow private references 624 | VER_UE4_ADDED_PACKAGE_OWNER = auto() 625 | # Changed the data layout for skin weight profile data 626 | VER_UE4_SKINWEIGHT_PROFILE_DATA_LAYOUT_CHANGES = auto() 627 | # Added import that can have package different than their outer 628 | VER_UE4_NON_OUTER_PACKAGE_IMPORT = auto() 629 | # Added DependencyFlags to AssetRegistry 630 | VER_UE4_ASSETREGISTRY_DEPENDENCYFLAGS = auto() 631 | # Fixed corrupt licensee flag in 4.26 assets 632 | VER_UE4_CORRECT_LICENSEE_FLAG = auto() 633 | 634 | # ------------------------------------------------------ 635 | # - this needs to be the last line (see note below) 636 | VER_UE4_AUTOMATIC_VERSION_PLUS_ONE = auto() 637 | VER_UE4_AUTOMATIC_VERSION = VER_UE4_AUTOMATIC_VERSION_PLUS_ONE - 1 638 | 639 | 640 | UE4Versions = EUnrealEngineObjectUE4Version 641 | 642 | 643 | class EUnrealEngineObjectUE5Version(IntEnum): 644 | # The original UE5 version, at the time this was added the UE4 version was 522, so UE5 will start from 1000 to show a clear difference 645 | INITIAL_VERSION = 1000 646 | 647 | # Support stripping names that are not referenced from export data 648 | NAMES_REFERENCED_FROM_EXPORT_DATA = auto() 649 | 650 | # Added a payload table of contents to the package summary 651 | PAYLOAD_TOC = auto() 652 | 653 | # Added data to identify references from and to optional package 654 | OPTIONAL_RESOURCES = auto() 655 | 656 | # Large world coordinates converts a number of core types to double components by default. 657 | LARGE_WORLD_COORDINATES = auto() 658 | 659 | # Remove package GUID from FObjectExport 660 | REMOVE_OBJECT_EXPORT_PACKAGE_GUID = auto() 661 | 662 | # Add IsInherited to the FObjectExport entry 663 | TRACK_OBJECT_EXPORT_IS_INHERITED = auto() 664 | 665 | # Replace FName asset path in FSoftObjectPath with (package name, asset name) pair FTopLevelAssetPath 666 | FSOFTOBJECTPATH_REMOVE_ASSET_PATH_FNAMES = auto() 667 | 668 | # Add a soft object path list to the package summary for fast remap 669 | ADD_SOFTOBJECTPATH_LIST = auto() 670 | 671 | # Added bulk/data resource table 672 | DATA_RESOURCES = auto() 673 | 674 | # ------------------------------------------------------ 675 | # - this needs to be the last line (see note below) 676 | AUTOMATIC_VERSION_PLUS_ONE = auto() 677 | AUTOMATIC_VERSION = AUTOMATIC_VERSION_PLUS_ONE - 1 678 | 679 | 680 | UE5Versions = EUnrealEngineObjectUE5Version 681 | --------------------------------------------------------------------------------