Skip to main content

Overview

The AssetManager class provides comprehensive functionality for enumerating, loading, and modifying game assets including EBX, resources, and chunks.
using FrostySdk.Managers;

AssetManager am = new AssetManager(fileSystem, resourceManager);
am.Initialize();

Constructor

AssetManager
constructor
Creates a new AssetManager instance
AssetManager am = new AssetManager(FileSystem fs, ResourceManager rm);
fs
FileSystem
required
Initialized FileSystem instance
rm
ResourceManager
required
Initialized ResourceManager instance

Initialization

Initialize
void
Initializes the asset manager and loads all asset metadata
am.Initialize(additionalStartup: true);
additionalStartup
bool
default:"true"
Perform additional initialization like EBX indexing
result
AssetManagerImportResult
default:"null"
Optional result object for tracking patch changes

Asset Retrieval

EBX Assets

GetEbxEntry
EbxAssetEntry
Gets an EBX asset entry by name or GUID
// By name
EbxAssetEntry entry = am.GetEbxEntry("content/characters/player");

// By GUID
EbxAssetEntry entry = am.GetEbxEntry(guid);
name
string
Asset path (case-insensitive)
ebxGuid
Guid
Asset GUID
GetEbx
EbxAsset
Loads and deserializes an EBX asset
EbxAsset asset = am.GetEbx(entry);
// Or
EbxAsset asset = am.GetEbx("content/characters/player");
entry
EbxAssetEntry
Asset entry to load
getUnmodifiedData
bool
default:"false"
If true, returns original data ignoring modifications
GetEbxAs<T>
T where T : EbxAsset
Loads an EBX asset as a specific type
MeshAsset mesh = am.GetEbxAs<MeshAsset>(entry);

Resource Assets

GetResEntry
ResAssetEntry
Gets a resource entry by name or resource ID
// By name
ResAssetEntry entry = am.GetResEntry("textures/character_diffuse");

// By resource ID
ResAssetEntry entry = am.GetResEntry(resRid);
name
string
Resource name
resRid
ulong
Resource runtime ID
GetRes
Stream
Gets the raw resource data stream
Stream resData = am.GetRes(resEntry);
GetResAs<T>
T where T : Resource
Loads and deserializes a resource as a specific type
Texture texture = am.GetResAs<Texture>(entry);
entry
ResAssetEntry
required
Resource entry to load
modifiedData
ModifiedResource
default:"null"
Optional modified resource data

Chunk Assets

GetChunkEntry
ChunkAssetEntry
Gets a chunk entry by its GUID
ChunkAssetEntry entry = am.GetChunkEntry(chunkId);
GetChunk
Stream
Gets the raw chunk data stream
Stream chunkData = am.GetChunk(chunkEntry);

Asset Enumeration

Enumerate EBX

EnumerateEbx
IEnumerable<EbxAssetEntry>
Enumerates EBX assets with optional filtering
// All EBX assets
foreach (EbxAssetEntry entry in am.EnumerateEbx())
{
    Console.WriteLine(entry.Name);
}

// Filter by type
foreach (EbxAssetEntry entry in am.EnumerateEbx("MeshAsset"))
{
    // Process mesh assets
}

// Modified assets only
foreach (EbxAssetEntry entry in am.EnumerateEbx("", modifiedOnly: true))
{
    // Process modified assets
}
type
string
default:""
Filter by asset type (supports inheritance)
modifiedOnly
bool
default:"false"
Only return modified assets
includeLinked
bool
default:"false"
Include indirectly modified linked assets
bundleSubPath
string
default:""
Filter by bundle path

Enumerate Resources

EnumerateRes
IEnumerable<ResAssetEntry>
Enumerates resource assets
// All resources
foreach (ResAssetEntry entry in am.EnumerateRes())
{
    Console.WriteLine($"{entry.Name} - {entry.Type}");
}

// Filter by resource type
foreach (ResAssetEntry entry in am.EnumerateRes((uint)ResourceType.Texture))
{
    // Process textures
}
resType
uint
default:"0"
Filter by ResourceType (0 = all types)
modifiedOnly
bool
default:"false"
Only return modified resources

Enumerate Chunks

EnumerateChunks
IEnumerable<ChunkAssetEntry>
Enumerates chunk assets
foreach (ChunkAssetEntry entry in am.EnumerateChunks())
{
    Console.WriteLine($"Chunk: {entry.Id}");
}
modifiedOnly
bool
default:"false"
Only return modified chunks

Enumerate Bundles

EnumerateBundles
IEnumerable<BundleEntry>
Enumerates bundle entries
foreach (BundleEntry bundle in am.EnumerateBundles())
{
    Console.WriteLine($"Bundle: {bundle.Name} ({bundle.Type})");
}

// Filter by type
foreach (BundleEntry bundle in am.EnumerateBundles(BundleType.BlueprintBundle))
{
    // Process blueprint bundles
}
type
BundleType
default:"BundleType.None"
Filter by bundle type
modifiedOnly
bool
default:"false"
Only return modified bundles

Asset Modification

Modify EBX

ModifyEbx
void
Marks an EBX asset as modified with new data
EbxAsset asset = am.GetEbx(entry);
// Modify asset properties...
asset.RootObject.SetValue("SomeProperty", newValue);

// Save modification
am.ModifyEbx(entry.Name, asset);
name
string
required
Asset name
asset
EbxAsset
required
Modified asset object

Modify Resource

ModifyRes
void
Marks a resource as modified
// Modify by resource ID
am.ModifyRes(resRid, modifiedData, metaData);

// Modify by name
am.ModifyRes("textures/player_diffuse", modifiedData, metaData);

// Modify with Resource object
Texture texture = am.GetResAs<Texture>(entry);
// Modify texture...
am.ModifyRes(entry.ResRid, texture);
resRid
ulong
Resource runtime ID
resName
string
Resource name
buffer
byte[]
Raw resource data
meta
byte[]
default:"null"
Resource metadata
resource
Resource
Resource object

Modify Chunk

ModifyChunk
bool
Modifies a chunk’s data
byte[] newChunkData = GetModifiedChunkData();
bool success = am.ModifyChunk(chunkId, newChunkData);

// For texture chunks
Texture texture = GetTexture();
am.ModifyChunk(chunkId, textureData, texture);
chunkId
Guid
required
Chunk GUID
buffer
byte[]
required
New chunk data
texture
Texture
default:"null"
Texture metadata for texture chunks

Adding Assets

Add EBX

AddEbx
EbxAssetEntry
Adds a new EBX asset to the manager
EbxAsset newAsset = CreateNewAsset();
EbxAssetEntry entry = am.AddEbx(
    "content/custom/myasset",
    newAsset,
    bundleId1, bundleId2
);
name
string
required
Asset name/path
asset
EbxAsset
required
Asset object
bundles
params int[]
Bundle IDs to add asset to

Add Resource

AddRes
ResAssetEntry
Adds a new resource to the manager
byte[] textureData = LoadTextureData();
byte[] metadata = CreateMetadata();

ResAssetEntry entry = am.AddRes(
    "textures/custom_texture",
    ResourceType.Texture,
    metadata,
    textureData,
    bundleId
);
name
string
required
Resource name
resType
ResourceType
required
Resource type
resMeta
byte[]
required
Resource metadata
buffer
byte[]
required
Resource data
bundles
params int[]
Bundle IDs

Add Chunk

AddChunk
Guid
Adds a new chunk and returns its GUID
byte[] chunkData = GetChunkData();
Guid chunkId = am.AddChunk(chunkData, bundles: bundleId);

// For textures
Texture texture = CreateTexture();
Guid texChunkId = am.AddChunk(textureData, texture: texture, bundles: bundleId);
buffer
byte[]
required
Chunk data
overrideGuid
Guid?
default:"null"
Optional specific GUID to use
texture
Texture
default:"null"
Texture metadata for texture chunks
bundles
params int[]
Bundle IDs

Asset Management

Revert Asset

RevertAsset
void
Reverts modifications to an asset
am.RevertAsset(entry);

// Revert data only (keep bundle assignments)
am.RevertAsset(entry, dataOnly: true);
entry
AssetEntry
required
Asset entry to revert
dataOnly
bool
default:"false"
Only revert data, not bundle assignments
suppressOnModify
bool
default:"true"
Suppress modification event

Reset All

Reset
void
Reverts all modifications across all assets
am.Reset();

Get Counts

GetModifiedCount
uint
Gets the total number of modified assets
uint modCount = am.GetModifiedCount();
Console.WriteLine($"{modCount} assets modified");
GetEbxCount
uint
Gets count of EBX assets
// All EBX
uint total = am.GetEbxCount();

// Specific type
uint meshCount = am.GetEbxCount("MeshAsset");

Usage Example

using FrostySdk;
using FrostySdk.Managers;
using FrostySdk.IO;

// Initialize
FileSystem fs = new FileSystem(@"C:\Games\FIFA20");
fs.Initialize();

ResourceManager rm = new ResourceManager(fs);
rm.Initialize();

AssetManager am = new AssetManager(fs, rm);
am.Initialize();

// Find and modify an asset
EbxAssetEntry entry = am.GetEbxEntry("content/characters/player");
if (entry != null)
{
    EbxAsset asset = am.GetEbx(entry);
    
    // Modify asset
    dynamic obj = asset.RootObject;
    obj.Health = 100;
    
    // Save modification
    am.ModifyEbx(entry.Name, asset);
    
    Console.WriteLine($"Modified: {entry.Name}");
}

// Enumerate all modified assets
foreach (EbxAssetEntry modified in am.EnumerateEbx("", modifiedOnly: true))
{
    Console.WriteLine($"Modified: {modified.Name}");
}

Console.WriteLine($"Total modifications: {am.GetModifiedCount()}");

See Also

Build docs developers (and LLMs) love