Difference between revisions of "Unreal Engine 4 UASSET UEXP"

From XentaxWiki
Jump to: navigation, search
(Games)
 
(29 intermediate revisions by the same user not shown)
Line 1: Line 1:
 +
{{GRAFPageHeader}}
 +
== UASSET, UEXP ==
  
{{CompactGRAFTOC}}
+
* ''' Format Type ''':    Archive <br>
 +
* ''' [http://en.wikipedia.org/wiki/Endianness Endian Order] ''': Little Endian <br>
 +
* ''' Signature ''':    C1 83 2A 9E <br>
 +
 
 +
 
 +
=== Format Specifications ===
  
<div style="border:solid 1px #AAAAAA; padding:4px; background-color:#F9F9F9;">
 
<i>Format Type:</i> Archive<br />
 
<i>Extensions:</i> uasset <br />
 
<i>Platforms:</i> PC (+all supported by Unreal Engine)<br />
 
<i>Endian Order:</i> Little Endian
 
</div>
 
[[Category:Format_Archive | Type: Archive]]
 
<br /><br />
 
== Format Specifications ==
 
 
<div style="border:solid 1px #AAAAAA; padding:4px; background-color:#F9F9F9; font-weight:bold;">
 
<div style="border:solid 1px #AAAAAA; padding:4px; background-color:#F9F9F9; font-weight:bold;">
 
<tt>
 
<tt>
Line 19: Line 17:
 
<font color="blue"><i>The last entry is ClassID = "Package" and NameID = the main package name (eg "/Script/Engine")</i></font><br />
 
<font color="blue"><i>The last entry is ClassID = "Package" and NameID = the main package name (eg "/Script/Engine")</i></font><br />
 
<font color="blue"><i>FILE HEADER</i></font><br />
 
<font color="blue"><i>FILE HEADER</i></font><br />
&nbsp;&nbsp;uint32 {4}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Unreal Header <font color="purple">(193,131,42,158)</font><br />
+
&nbsp;&nbsp;uint32 {4}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Unreal Signature <font color="purple">(193,131,42,158) // C1 83 2A 9E</font><br />
 
&nbsp;&nbsp;uint32 {4}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Version  <font color="purple">(6)</font> <font color="purple">(XOR with 255)</font><br />
 
&nbsp;&nbsp;uint32 {4}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Version  <font color="purple">(6)</font> <font color="purple">(XOR with 255)</font><br />
 
&nbsp;&nbsp;byte {16}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;null<br />
 
&nbsp;&nbsp;byte {16}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;null<br />
Line 344: Line 342:
 
<br />
 
<br />
 
<font color="blue"><i>FILE FOOTER</i></font><br />
 
<font color="blue"><i>FILE FOOTER</i></font><br />
&nbsp;&nbsp;uint32 {4}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Unreal Header <font color="purple">(193,131,42,158)</font><br />
+
&nbsp;&nbsp;uint32 {4}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Unreal Signature <font color="purple">(193,131,42,158) // C1 83 2A 9E</font><br />
 
<br />
 
<br />
 
</tt>
 
</tt>
 
</div>
 
</div>
<br /><br />
 
== MultiEx BMS Script ==
 
  
<tt>
+
=== MultiEx BMS Script ===
<i>No BMS script</i>
+
 
</tt>
+
Not written yet.
<br /><br />
+
 
[[Category:BMS_None | BMS: None]]
+
=== Notes and Comments ===
== Supported Programs ==
+
 
 +
*  Archives may be splitted to '''.uasset''' and '''.uexp''' files - the first one contains file header, second one - all the data.
 +
 
 +
=== Games ===
 +
List of games using this file format:
 +
* Marvel vs. Capcom: Infinite (*.uasset)
 +
* No More Heroes 3 (*.uasset / *.uexp)
 +
* Pumpkin Jack (PC) (*.uasset)
 +
* Remothered Tormented Fathers (PC) (*.uasset)
 +
* Shinobi Striker (*.uasset)
 +
* Soul Calibur VI (*.uasset)
 +
* Tekken 7 (PC) (*.uasset)
 +
* many more...
 +
 
 +
=== Compatible Programs ===  
  
* [[Game Extractor|Game Extractor]]<br />
+
* [https://github.com/FabianFG/CUE4Parse CUE4Parse]
 +
* [https://github.com/DarthPointer/DAUM/wiki/Tool-Usage DAUM]
 +
* [[Game Extractor|Game Extractor]]
 +
* [https://www.gildor.org/downloads Gildor's Tools]
 +
* [https://github.com/iAmAsval/FModel FModel]
 +
* [https://github.com/MinshuG/pyUE4Parse pyUE4Parse]
 +
* [https://github.com/antoshre/uasset-dt-to-json uasset-dt-to-json]
 +
* [http://www.fluffyquack.com/tools/uexptool.rar uexptool] + [http://www.fluffyquack.com/tools/source/uexptool.rar source code] (only for  Soul Calibur VI?)
 
* [https://github.com/kaiheilos/Utilities Unreal Engine Uasset Viewer/Editor]
 
* [https://github.com/kaiheilos/Utilities Unreal Engine Uasset Viewer/Editor]
* [https://www.gildor.org/downloads Gildor's Tools]
+
* Unreal Engine (Since Unreal 4.22 you can load cooked asset(.uasset .uexp) in the engine itself. But that requiere that you use the same engine version as the file was cook with.)
<br /><br />
+
 
[[Category:Program_Game_Extractor | Program: Game Extractor]]
+
=== See Also ===
 +
 
 +
* [[Unreal Engine 4 PAK|Unreal Engine 4 PAK (xentax wiki)]]
  
== Notes ==
+
=== Gallery ===
 +
<gallery bordercolor="transparent" spacing="small" orientation="landscape">
 +
fmodel.png|FModel
 +
asset_editor.png|Asset Editor
 +
</gallery>
  
<i>No additional notes</i>
 
<br /><br />
 
[[Category:CE_None | Compression: None]]
 
== Games ==
 
  
* Shinobi Striker (.uasset)
 
* Marvel vs. Capcom: Infinite (.uasset)
 
* Tekken 7 (.uasset)
 
 
<br><br>
 
<br><br>
  
[[Category:Complete_Complete | Status: Complete]]
+
 
 +
 
 +
[[Category:Complete Almost Done|Unreal Engine 4 UASSET UEXP]]
 +
[[Category:Platform PC|Unreal Engine 4 UASSET UEXP]]
 +
[[Category:CE None|Unreal Engine 4 UASSET UEXP]]
 +
[[Category:Format_Archive | Type: Archive]]
 
[[Category:Extension_uasset | Extension: uasset]]
 
[[Category:Extension_uasset | Extension: uasset]]
[[Category:Platform_Texture Files | Platform: Texture Files]]
+
[[Category:Extension_uexp | Extension: uexp]]
 
[[Category:XOR encryption]]
 
[[Category:XOR encryption]]
 
[[Category:File Format]]
 
[[Category:File Format]]

Latest revision as of 22:28, 24 January 2022

Back to index | Edit this page

UASSET, UEXP

  • Format Type : Archive
  • Endian Order : Little Endian
  • Signature : C1 83 2A 9E


Format Specifications

Unreal Engine 4 uasset file
DETAILS OF THE IMPORT DIRECTORY...
The ParentDirectoryNameID is the name
The first few entries in the Import directory is ClassID = "Class" and NameID = the main data type (eg "Texture2D", "Material")
The last entry is ClassID = "Package" and NameID = the main package name (eg "/Script/Engine")
FILE HEADER
  uint32 {4}       - Unreal Signature (193,131,42,158) // C1 83 2A 9E
  uint32 {4}       - Version (6) (XOR with 255)
  byte {16}        - null
  uint32 {4}       - File Directory Offset?
  uint32 {4}       - Unknown (5)
  uint32 {4}       - Package Name (None)
  uint32 {4}       - null
  byte {1}         - Unknown (128)
  uint32 {4}       - Number of Names
  uint32 {4}       - Name Directory Offset
  uint64 {8}       - null
  uint32 {4}       - Number Of Exports
  uint32 {4}       - Exports Directory Offset
  uint32 {4}       - Number Of Imports
  uint32 {4}       - Import Directory Offset
  byte {20}        - null
  byte {16}        - GUID Hash
  uint32 {4}       - Unknown (1)
  uint32 {4}       - Unknown (1/2)
  uint32 {4}       - Unknown (Number of Names - again?)
  byte {36}        - null
  uint32 {4}       - Unknown
  uint32 {4}       - null
  uint32 {4}       - Padding Offset
  uint32 {4}       - File Length [+4] (not always - sometimes an unknown length/offset)
  byte {12}        - null
  uint32 {4}       - Unknown (-1)
  uint32 {4}       - Files Data Offset

NAMES DIRECTORY
  for each name
    uint32 {4}       - Name Length (including null)
    byte {X}         - Name
    byte {1}         - null Name Terminator
    uint32 {4}       - Flags

IMPORT DIRECTORY
  for each import (28 bytes per entry)
    uint64 {8}       - Parent Directory Name ID
    uint64 {8}       - Class ID (ID to "Package", "Class", etc)
    uint32 {4}       - Parent Import Object ID (-1 for no parent) (XOR with 255)
    uint32 {4}       - Name ID
    uint32 {4}       - Unknown ID

EXPORTS DIRECTORY
  for each export (100 bytes per entry)
    byte {100}       - Unknown

PADDING
  uint32 {4}       - null

FILE DATA
  for each file ???
    for each property (continue until NameID == "None")
      uint64 {8}       - Name ID
      if (NameID != None){
        uint64 {8}       - Class ID
        uint64 {8}       - Length Property
        if (classID == StructProperty){
          uint64 {8}       - Class ID
          uint64 {8}       - null
          uint64 {8}       - null
          if (classID == IntPoint){
            byte {1}         - null
            uint32 {4}       - Point X
            uint32 {4}       - Point Y
            }

          else if (classID == Guid){
            byte {1}         - null
            byte {16}        - GUID
            }

          else if (classID == ColorMaterialInput){
            byte {1}         - null
            byte {X}         - Color Material Input Data (the length of X = LengthProperty from above)
            }

          else if (classID == ScalarMaterialInput){
            byte {1}         - null
            byte {X}         - Scalar Material Input Data (the length of X = LengthProperty from above)
            }

          else if (classID == TextureStreamingData){
            byte {1}         - null
            uint64 {8}       - null
            uint64 {8}       - null
            }

          else if (classID == MaterialTextureInfo){
            byte {1}         - null
            Now keep reading properties until a "None" is reached - all these properties form the MaterialTextureInfo class
            }

          else if (classID == FontCharacter){
            byte {1}         - null
            uint32 {4}       - Unknown
            uint32 {4}       - Unknown
            uint32 {4}       - Unknown
            uint64 {8}       - Unknown
            }

          else if (classID == FontImportOptionsData){
            byte {1}         - null
            Now keep reading properties until a "None" is reached - all these properties form the FontImportOptionsData class
            These fields come after the property reading above
            uint64 {8}       - Class ID (points to None)
            uint32 {4}       - null
            uint32 {4}       - Extra Data Length [*4]
            byte {X}         - Extra Data
            }

          else {
            use the structure of one of the other properties (eg BoolProperty, ByteProperty, etc)
            }

          }

        else if (classID == BoolProperty){
          uint16 {2}       - Boolean Value (0/1)
          }

        else if (classID == FloatProperty){
          byte {1}         - null
          uint32 {4}       - Float Value
          }

        else if (classID == NameProperty){
          byte {1}         - null
          uint32 {4}       - Name ID
          uint32 {4}       - Unknown
          }

        else if (classID == IntProperty){
          byte {1}         - null
          uint32 {4}       - Integer Value
          }

        else if (classID == StrProperty){
          byte {1}         - null
          uint32 {4}       - String Length (including null terminator)
          byte {X}         - String
          byte {1}         - null String Terminator
          }

        else if (classID == ObjectProperty){
          uint32 {4}       - Property
          }

        else if (classID == ByteProperty){
          byte {X}         - Bytes (the length of X = LengthProperty from above)
          byte {1}         - null
          byte {X}         - Bytes (the length of X = LengthProperty from above)
          }

        else if (classID == ArrayProperty){
          uint64 {8}       - Class ID
          byte {1}         - null
          NOTE: LengthProperty from above gives the length of the next 4-byte field and the full contents of the array "for" loop
          uint32 {4}       - Number of Values in the Array
          if (classID == StructProperty){
            first comes the normal 4-field handler
            uint64 {8}       - Name ID
            uint64 {8}       - Class ID
            uint64 {8}       - Length Property
            then comes the normal StructProperty handler
            uint64 {8}       - Class ID <-- this is the Class for each item in the array
            uint64 {8}       - null
            uint64 {8}       - null
            }

          for each value in the array {
            use the structure of one of the other properties (eg BoolProperty, ByteProperty, etc)
            Either use the ClassID from the ArrayProperty definition, or if that is a StructProperty, use the ClassID in the StructProperty handler (details above)
            }

          if (classID == StructProperty && numberOfValuesInArray > 1){
            byte {1}         - null
            }

          }

        }

      uint32 {4}       - null
      uint16 {2}       - Flags (1/3)
      uint16 {2}       - Flags (1/0)
      uint32 {4}       - Unknown (1)
      uint64 {8}       - Type ID (points to "PF_DXT5", "PF_B8G8R8A8", etc for a Texture2D Image)

    if (typeID == PF_DXT5 || PF_DXT3 || PF_DXT1){
      uint32 {4}       - Offset to Largest Mipmap [+8]
      uint32 {4}       - Original Image Width
      uint32 {4}       - Original Image Height
      uint32 {4}       - Unknown (1)
      uint32 {4}       - Type Name Length (including null) (8)
      byte {7}         - Type Name (PF_DXT5/3/1)
      byte {1}         - null Type Name Terminator
      uint32 {4}       - null
      uint32 {4}       - Mipmap Count
      for each large mipmap (where width/height >= 128), starting with largest mipmap and decreasing each time by /2
        uint32 {4}       - Entry Indicator (1)
        uint32 {4}       - Flags (1025)
        uint32 {4}       - Length of Mipmap Data
        uint32 {4}       - Length of Mipmap Data
        uint64 {8}       - Relative Offset to this mipmap (relative to the start of the largest mipmap data)
        uint32 {4}       - This Mipmap Width
        uint32 {4}       - This Mipmap Height

      for each Small Mipmap...
        uint32 {4}       - Entry Indicator (1)
        uint32 {4}       - Flags (72)
        uint32 {4}       - Length of Mipmap Data
        uint32 {4}       - Length of Mipmap Data
        uint64 {8}       - Offset to start of Mipmap Data
        byte {X}         - DXT5/3/1 Pixel Data
        uint32 {4}       - This Mipmap Width
        uint32 {4}       - This Mipmap Height

      uint32 {4}       - Mipmap Count
      uint32 {4}       - null
      for each large mipmap (where width/height >= 128), starting with largest mipmap and decreasing each time by /2
        byte {X}         - DXT5/3/1 Pixel Data

      }

    else if (typeID == PF_B8G8R8A8){
      uint32 {4}       - Offset to Largest Mipmap [+8]
      uint32 {4}       - Original Image Width
      uint32 {4}       - Original Image Height
      uint32 {4}       - Unknown (1)
      uint32 {4}       - Type Name Length (including null) (12)
      byte {11}        - Type Name (PF_B8G8R8A8)
      byte {1}         - null Type Name Terminator
      uint32 {4}       - null
      uint32 {4}       - Mipmap Count
      for each large mipmap (where width/height >= 128), starting with largest mipmap and decreasing each time by /2
        uint32 {4}       - Entry Indicator (1)
        uint32 {4}       - Flags (1025)
        uint32 {4}       - Length of Mipmap Data
        uint32 {4}       - Length of Mipmap Data
        uint64 {8}       - Relative Offset to this mipmap (relative to the start of the largest mipmap data)
        uint32 {4}       - This Mipmap Width
        uint32 {4}       - This Mipmap Height

      for each Small Mipmap...
        uint32 {4}       - Entry Indicator (1)
        uint32 {4}       - Flags (72)
        uint32 {4}       - Length of Mipmap Data
        uint32 {4}       - Length of Mipmap Data
        uint64 {8}       - Offset to start of Mipmap Data
        byte {X}         - BGRA Pixel Data
        uint32 {4}       - This Mipmap Width
        uint32 {4}       - This Mipmap Height

      uint32 {4}       - Mipmap Count
      uint32 {4}       - null
      for each large mipmap (where width/height >= 128), starting with largest mipmap and decreasing each time by /2
        byte {X}         - BGRA Pixel Data

      }

    else if (typeID == PF_BC5){
      uint32 {4}       - Offset to Largest Mipmap [+8]
      uint32 {4}       - Original Image Width
      uint32 {4}       - Original Image Height
      uint32 {4}       - Unknown (1)
      uint32 {4}       - Type Name Length (including null) (7)
      byte {6}         - Type Name (PF_BC5)
      byte {1}         - null Type Name Terminator
      uint32 {4}       - Unknown (1)
      uint32 {4}       - Mipmap Count
      for each large mipmap (where width/height >= 128), starting with largest mipmap and decreasing each time by /2
        uint32 {4}       - Entry Indicator (1)
        uint32 {4}       - Flags (1025)
        uint32 {4}       - Length of Mipmap Data
        uint32 {4}       - Length of Mipmap Data
        uint64 {8}       - Relative Offset to this mipmap (relative to the start of the largest mipmap data)
        uint32 {4}       - This Mipmap Width
        uint32 {4}       - This Mipmap Height

      for each small mipmap (where width/height < 128), decreasing each time by /2..
        uint32 {4}       - Entry Indicator (1)
        uint32 {4}       - Flags (72)
        uint32 {4}       - Length of Mipmap Data
        uint32 {4}       - Length of Mipmap Data
        uint64 {8}       - Offset to start of Mipmap Data
        byte {X}         - BC5 Pixel Data
        uint32 {4}       - This Mipmap Width
        uint32 {4}       - This Mipmap Height

      uint32 {4}       - Mipmap Count
      uint32 {4}       - null
      for each large mipmap (where width/height >= 128), starting with largest mipmap and decreasing each time by /2
        byte {X}         - BC5 Pixel Data

      }

    else if (typeID == PF_G8){
      uint32 {4}       - Length of Image Data?
      uint32 {4}       - Image Width
      uint32 {4}       - Image Height
      uint32 {4}       - Unknown (1)
      uint32 {4}       - Type Name Length (including null) (6)
      byte {5}         - Type Name (PF_G8)
      byte {1}         - null Type Name Terminator
      uint32 {4}       - null
      uint32 {4}       - Mipmap Count (1)
      uint32 {4}       - Unknown (1)
      uint32 {4}       - Flags? (72)
      uint32 {4}       - Length of Mipmap Data
      uint32 {4}       - Length of Mipmap Data
      uint64 {8}       - Offset to start of Mipmap Data (absolute offset)
      byte {X}         - Greyscale Pixel Data
      uint32 {4}       - Image Width
      uint32 {4}       - ImageHeight
      uint64 {8}       - Unknown (28)
      }

    else {
      NOT A TEXTURE IMAGE (or an unknown Texture format)
      byte {X}         - File Data
      }

FILE FOOTER
  uint32 {4}       - Unreal Signature (193,131,42,158) // C1 83 2A 9E

MultiEx BMS Script

Not written yet.

Notes and Comments

  • Archives may be splitted to .uasset and .uexp files - the first one contains file header, second one - all the data.

Games

List of games using this file format:

  • Marvel vs. Capcom: Infinite (*.uasset)
  • No More Heroes 3 (*.uasset / *.uexp)
  • Pumpkin Jack (PC) (*.uasset)
  • Remothered Tormented Fathers (PC) (*.uasset)
  • Shinobi Striker (*.uasset)
  • Soul Calibur VI (*.uasset)
  • Tekken 7 (PC) (*.uasset)
  • many more...

Compatible Programs

See Also

Gallery