Skip to content

Assets loader

Craftable consumables may declare $QuestScroll to accept an existing RuneSchema quest through the pre-consumption native item-use route. The expected item PersistenceID is verified; this is not a quest/reward script field or an identity override.

Folder: RuneSchema/mods/<ModName>/assets/

Items, icons, stats, unlock links, DataAssets, and reflected object patches.

← Loader reference

Use /assets to patch a loaded item or clone a compatible item into a stable RuneSchema runtime asset. A JSON clone is not a newly cooked Unreal package.

{
  "/Game/MyMod/Items/ITEM_Test.ITEM_Test": {
    "$Clone": "/Game/Gameplay/Items/ITEM_Source.ITEM_Source",
    "PersistenceID": "RS7Test12345678901234A",
    "InternalName": "mymod_test",
    "Name": "Test Item",
    "PowerLevel": 20
  }
}

Walkthrough:

  1. Choose a source with the same native item type and behavior you need.
  2. Assign a unique destination path, PersistenceID, and InternalName.
  3. Override only reflected fields that exist on the source type.
  4. Add /raw rows when the item points to row handles such as wearable data.
  5. Add /recipes, /journal, or /vendors references after the item path is stable.

$DominionSpheres patches validated named sphere subobjects. $VisualEffect can attach a supported equip effect. RecipesToUnlock and BuildingPieceToUnlock are inherited by a clone unless explicitly replaced.

Reference: examples/RSv16/ExampleMods/RuneSchema2VendorTest/assets.

Wearables without a PAK

Schema-created WearableEquipmentData items enter the same native wearable enumeration/cache bridge after successful identity and network registration. No additional PAK registry declaration is needed for ordinary /assets clones. Existing cooked, vanilla or schema-created wearables can request enrollment after their field patch:

{
  "/Game/RuneSchema/MyClones/Items/MyCape.MyCape": {
    "$WearableBridge": true
    // MaleMeshData/FemaleMeshData may reference compatible existing mesh data.
  }
}

$WearableBridge is a Boolean directive, not a native item property. false means no additional request; it does not disable automatic wearable support. The target must be wearable equipment. Late patches require the existing persistence and two-way network identities to resolve to that exact item; the bridge does not allocate an identity to make an invalid patch appear valid. Startup requests can wait for normal settled registration. Presentation failures do not revoke otherwise valid item registration.

The native equipment system still owns mesh-cache construction. JSON cannot invent a missing skeletal mesh, skeleton, texture or material; use compatible existing assets or ship new assets in a PAK. This directive does not promise immediate repainting of an already equipped actor after arbitrary edits to shared mesh/material data. Re-equip the item when testing a changed appearance. Helpy's transmog card follows the donor's resolved inventory icon unless an explicit icon override is supplied; this is not a generated 3D thumbnail.

Direct DA_ fields

For an existing DataAsset or generated-class default, put the complete DA_ path first and native field paths below it. RuneSchema infers a class default object from _C; the mod directory supplies ownership.

{
  "/Game/UI/MainMenu/CharacterCreate/Data/DA_CharacterOptionData.DA_CharacterOptionData_C": {
    "CharacterOptions[FacialHairPreset].OptionData": {
      "$MergeWhere": {
        "Field": "DataHandle.RowName",
        "Values": ["F_A_PresetNone", "M_A_PresetNone"],
        "Value": {
          "BodyTypeCompatability": "both",
          "FaceTypeCompatibility": "all"
        }
      }
    }
  }
}

Direct scalar values perform Set; direct objects perform Merge. $Set and $Merge make that choice explicit. $Append adds typed array members. $AppendUnique adds only when $Identity does not already exist; character options infer DataHandle.RowName and their native template. $MergeWhere updates existing struct-array entries selected by Field and Values. It requires every selector to match exactly one entry and validates every changed field before committing the group. A missing or duplicate beard row therefore rejects that grouped edit instead of changing an arbitrary option.

The active MoreHair menu file motivated this form: its former registry envelope repeated target, transaction, profile, and mod identity for every option. In the current form, the target is written once, each field is written once, and only the values that differ remain. Legacy envelope documents are still translated internally so installed mods are not forced to migrate immediately.

Simple rules

  • Use /assets for loaded items, DataAssets, reflected object edits, or compatible item clones.
  • A new clone needs a stable destination path, PersistenceID, and InternalName.
  • Change only fields that exist on the reflected source type. Put referenced DataTable-row work in /raw.

FAQ

FAQ-ASSETS-001 — Can I clone an item and change only a few fields?

Yes. Start from a compatible source with $Clone; inherited fields remain unless you explicitly replace them. Give the clone its own stable path, PersistenceID, and InternalName.

FAQ-ASSETS-002 — Do direct character-menu DataAsset edits need the old registry metadata envelope?

No. For the verified direct DA_ authoring form, put the complete target path first and the native field path below it. The mod directory supplies ownership; the legacy registry-patch envelope remains readable for compatibility.

Working examples


← All loaders · Authoring guide