Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/CadeEvs/FrostyToolsuite/llms.txt

Use this file to discover all available pages before exploring further.

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