Table of Contents

Class ModAssetCatalogs

Namespace
GrindFest
Assembly
GrindFest.dll

Runtime side of the mod asset pipeline: a mod's assets are a built content directory, scoped mod:<mod folder name>.

Mods/<Mod>/Content/content-directory/     ← GrindFest ▸ Mods ▸ Build Mod Assets

It is registered by RegisterAllAsync(CancellationToken) at boot, after the base game — which is what makes a mod's version of a key win, with no id remapping and no bundle rewriting. What is left here is the policy check that mechanism cannot express: every key a mod contributes has to live under mod/<folder name>/, because otherwise a mod can shadow a base-game asset by accident and the override looks like the game being broken rather than like a mod doing its job.

The Addressables catalogue path is gone (2026-09-20). It needed a catalogue to load, bundle internal ids to rewrite and an InternalIdTransformFunc to make paths machine-independent; a content directory is self-describing and addressed by path, so none of that exists any more. A mod that still ships only a catalogue is now a red error naming the command to run — not a silently empty mod, and not a second code path that has to keep working forever.

Failures are per-mod by design: a broken mod is a red error naming the mod, never a dead boot.

public static class ModAssetCatalogs
Inheritance
object
ModAssetCatalogs

Fields

AddressPrefix

Address namespace every mod's keys must use: mod/<mod folder name>/….

Properties

Loaded

Mods loaded this session (mod folder name → info).

Methods

LoadAsync(IReadOnlyList<ModDefinition>)

Records every mod whose content directory is registered (registration itself happens in RegisterAllAsync(CancellationToken), which owns the order that makes a mod override the base game). Returns how many were newly recorded this call.