AttribSys Vault
AttribSysVault | |
---|---|
Resource names | BurnoutGlobalData CameraVault Engine name, e.g. C5_EN postfxvault surfacelist *_AttribSys *Vehicle ID, e.g. PUSMC01 WorldVault |
Type ID | 0x1C |
Category | Generic |
Memory distribution |
Main Memory only |
Editor available? |
Vehicles only Use Bundle Manager |
AttribSys vault resources act as a database which holds attributes for vehicles, engines, surfaces and more. They are split into the vault, which holds information needed to access the data, and the bin, which holds the actual attribute data. Vaults work with the AttribSys schema found in the executable.
Structures[edit | edit source]
CgsResource::AttribSysVaultResource[edit | edit source]
32-bit[edit | edit source]
Offset | Length | Type | Name | Description | Comments |
---|---|---|---|---|---|
0x0 | 0x4 | uint8_t* | mpau8VltData | ||
0x4 | 0x4 | uint32_t | muVltSizeInBytes | ||
0x8 | 0x4 | uint8_t* | mpau8BinData | ||
0xC | 0x4 | uint32_t | muBinSizeInBytes |
64-bit[edit | edit source]
Offset | Length | Type | Name | Description | Comments |
---|---|---|---|---|---|
0x0 | 0x8 | uint8_t* | mpau8VltData | ||
0x8 | 0x4 | uint32_t | muVltSizeInBytes | ||
0xC | 0x4 | Padding | |||
0x10 | 0x8 | uint8_t* | mpau8BinData | ||
0x18 | 0x4 | uint32_t | muBinSizeInBytes |
Common substructures[edit | edit source]
Attrib::Array[edit | edit source]
Offset | Length | Type | Name | Description | Comments |
---|---|---|---|---|---|
0x0 | 0x2 | uint16_t | mAlloc | Number of entries allocated | |
0x2 | 0x2 | uint16_t | mCount | Number of entries used | |
0x4 | 0x2 | uint16_t | mSize | The length of each entry | |
0x6 | 0x2 | uint16_t | mEncodedTypePad | Padding |
Attrib::RefSpec[edit | edit source]
Offset | Length | Type | Name | Description | Comments |
---|---|---|---|---|---|
0x0 | 0x8 | Key | mClassKey | ||
0x8 | 0x8 | Key | mCollectionKey | ||
0x10 | 0x4 | Collection* | mCollectionPtr | Always nullptr in resource | |
0x14 | 0x4 | Padding |
Vault[edit | edit source]
The vault is a set of structures with ChunkBlocks which are read sequentially. In Burnout Paradise, these are:
- Vers: The version
- DepN: The dependency node
- StrN: The start node
- DatN: The data node
- ExpN: The export node
- PtrN: The pointer node
Attrib::Vault::ChunkBlock[edit | edit source]
Offset | Length | Type | Name | Description | Comments |
---|---|---|---|---|---|
0x0 | 0x4 | uint32_t | mType | A type ID similar in form to a magic number | |
0x4 | 0x4 | uint32_t | mSize | The total size of the chunk |
Version[edit | edit source]
Attrib::Vault::VersionNode[edit | edit source]
Offset | Length | Type | Name | Description | Comments |
---|---|---|---|---|---|
0x0 | 0x8 | ChunkBlock | super_ChunkBlock | ||
0x8 | 0x8 | uint64_t | mVersion | Version hash |
Dependency node[edit | edit source]
Attrib::Vault::DependencyNode[edit | edit source]
Offset | Length | Type | Name | Description | Comments |
---|---|---|---|---|---|
0x0 | 0x8 | ChunkBlock | super_ChunkBlock | ||
0x8 | 0x8 | HashInt | mCount | Number of dependencies |
This structure is immediately followed by the hashes of the dependency strings, then the offsets of the strings relative to the start of the first string, then the strings themselves.
Start node[edit | edit source]
Offset | Length | Type | Name | Description | Comments |
---|---|---|---|---|---|
0x0 | 0x8 | ChunkBlock | super_ChunkBlock | ||
??? |
Size is 16 bytes, but the final 8 bytes is always null. This node appears to not be read by the game.
Data node[edit | edit source]
Offset | Length | Type | Name | Description | Comments |
---|---|---|---|---|---|
0x0 | 0x8 | ChunkBlock | super_ChunkBlock |
This is followed by several collections.
This node is not read directly. Pointers in other nodes read the data that lies in this node.
Attrib::CollectionLoadData[edit | edit source]
Offset | Length | Type | Name | Description | Comments |
---|---|---|---|---|---|
0x0 | 0x8 | Key | mKey | ||
0x8 | 0x8 | Key | mClass | ||
0x10 | 0x8 | Key | mParent | ||
0x18 | 0x4 | uint32_t | mTableReserve | Amount allocated for entries | |
0x1C | 0x4 | uint32_t | mTableKeyShift | ||
0x20 | 0x4 | uint32_t | mNumEntries | Number of entries | |
0x24 | 0x2 | uint16_t | mNumTypes | Number of types | |
0x26 | 0x2 | uint16_t | mTypesLen | Amount allocated for types | |
0x28 | 0x4 | void* | mLayout | Always nullptr in resource | |
0x2C | 0x4 | Padding |
This is always followed by the types, then the entries (which are nodes).
Attrib::Node[edit | edit source]
Offset | Length | Type | Name | Description | Comments |
---|---|---|---|---|---|
0x0 | 0x8 | Key | mKey | ||
0x8 | 0x4 | anon_union_0 | field_1 | Just a pointer | |
0xC | 0x2 | uint16_t | mTypeIndex | ||
0xE | 0x1 | uint8_t | mMax | ||
0xF | 0x1 | uint8_t | mFlags |
Attrib::Node::anon_union_0[edit | edit source]
Length | Type | Name | Description | Comments |
---|---|---|---|---|
0x4 | void* | mPtr | ||
0x4 | Array* | mArray | ||
0x4 | uintptr_t | mValue | ||
0x4 | uintptr_t | mOffset |
Export node[edit | edit source]
Attrib::Vault::ExportNode[edit | edit source]
Offset | Length | Type | Name | Description | Comments |
---|---|---|---|---|---|
0x0 | 0x8 | ChunkBlock | super_ChunkBlock | ||
0x8 | 0x8 | HashInt | mCount | Number of dependencies |
Followed by export entries of an amount defined by mCount.
Attrib::Vault::ExportEntry[edit | edit source]
Offset | Length | Type | Name | Description | Comments |
---|---|---|---|---|---|
0x0 | 0x8 | ExportID | mID | ||
0x8 | 0x8 | TypeID | mType | ||
0x10 | 0x4 | uint32_t | mDataBytes | Size of the data node entry | |
0x14 | 0x4 | uint32_t | mDataOffset | Offset of the entry in the data node | Relative to vlt start |
Pointer node[edit | edit source]
Attrib::Vault::PointerNode[edit | edit source]
Offset | Length | Type | Name | Description | Comments |
---|---|---|---|---|---|
0x0 | 0x8 | ChunkBlock | super_ChunkBlock |
Followed by several PtrRefs.
Attrib::PtrRef[edit | edit source]
Offset | Length | Type | Name | Description | Comments |
---|---|---|---|---|---|
0x0 | 0x4 | uint32_t | mFixupOffset | The offset at which to write the offset | Relative to the beginning of the dependency. The area pointed to is normally null and allocated specifically for this |
0x4 | 0x2 | uint16_t | mPtrType | Pointer type | See type. |
0x6 | 0x2 | uint16_t | mIndex | Which dependency the value is relative to | 0 is normally the vault 1 is normally the bin |
0x8 | 0x8 | anon_union_0 | field_3 | Value |
Attrib::PtrRef::anon_union_0[edit | edit source]
Length | Type | Name | Description | Comments |
---|---|---|---|---|
0x8 | ExportID | mExportID | ||
0x8 | HashInt | mOffset |
EPtrRefType[edit | edit source]
Information from VaultLib.
Name | Value | Comments |
---|---|---|
PtrEnd | 0 | End of the pointer node |
PtrNull | 1 | |
PtrSetFixupTarget | 2 | Via its index, marks which dependency the fixup pointers after this pointer are relative to |
PtrDepRelative | 3 | Relative to the beginning of the dependency |
PtrExport | 4 |
Bin[edit | edit source]
The bin is primarily data but has one ChunkBlock in Burnout Paradise:
- StrE: The string exports
The rest of the data in the bin is not associated to a chunk and is instead pointed to by the vault.
String exports[edit | edit source]
Offset | Length | Type | Name | Description | Comments |
---|---|---|---|---|---|
0x0 | 0x8 | ChunkBlock | super_ChunkBlock |
This is followed by null-terminated strings.
Attributes[edit | edit source]
The fields and order are defined by the AttribSys schema.