ContentLoader——FIX——PACK
For mod developers. Includes new Pack flow + legacy compatibility.
可以取消订阅旧的“[Utility] ContentLoader”
The subscription for the old "[Utility] ContentLoader" can be cancelled.
1) 快速开始(推荐)
var ContentLoader = get_node("/root/ModLoader/Darkly77-ContentLoader/ContentLoader")
var ok = ContentLoader.load_pack_from_content_data(
"res://mods-unpacked/MyMod/content_data/my_content.tres",
"pack_my_mod_main",
"MyName-MyMod",
true
)
if not ok:
push_error("Content pack load failed")
2) Pack 三种加载方式
- load_pack_from_content_data(path, pack_id, mod_name, auto_activate)
从现有 ContentData 直接桥接到 Pack(最推荐)。 - load_pack(pack_data_path, mod_name, auto_activate)
直接加载 ContentPackData 资源文件。 - load_pack_data(pack_resource, mod_name, auto_activate)
运行时构造 ContentPackData 后直接注册。
3) 运行时控制 API
- activate_pack(pack_id):激活已注册 pack。
- deactivate_pack(pack_id):移除该 pack 注入内容。
- reset_packs_to_active():按激活顺序重建,保证覆盖顺序稳定。
- get_pack_ids() / get_active_pack_ids():查询 pack 列表。
4) 规则事项(重点)
- pack_id 必须全局唯一且长期稳定。
- mod_name 固定且规范(建议 AuthorName-ModName)。
- weapons_characters 与 weapons 必须一一对应。
- auto_activate=false 时,必须手动 activate_pack(pack_id)。
- 同一批内容不要同时走 Pack 与 load_data,避免重复注入。
- 所有 my_id 必须全局唯一(角色/道具/武器/挑战)。
- 不要手动调用内部方法(如 _install_data)。
5) 兼容旧方法(老 Mod 可继续用)
- 仍兼容:load_data()、load_data_by_dictionary()、load_data_by_content_data()。
- 老 Mod 无需立刻迁移。
- 新 Mod 建议优先 Pack;迁移期可“先 Pack,失败回退旧方法”。
6) 新旧双通道模板
var ContentLoader = get_node("/root/ModLoader/Darkly77-ContentLoader/ContentLoader")
var path = "res://mods-unpacked/MyMod/content_data/my_content.tres"
var pack_id = "pack_my_mod_main"var ok = false
if ContentLoader.has_method("load_pack_from_content_data"):
ok = ContentLoader.load_pack_from_content_data(path, pack_id, "MyName-MyMod", true)if not ok:
ContentLoader.load_data(path, "MyName-MyMod")
1) Quick Start (Recommended)
var ContentLoader = get_node("/root/ModLoader/Darkly77-ContentLoader/ContentLoader")
var ok = ContentLoader.load_pack_from_content_data(
"res://mods-unpacked/MyMod/content_data/my_content.tres",
"pack_my_mod_main",
"MyName-MyMod",
true
)
if not ok:
push_error("Content pack load failed")
2) Three Pack Loading Methods
- load_pack_from_content_data(path, pack_id, mod_name, auto_activate)
Bridge existing ContentData into Pack flow (preferred). - load_pack(pack_data_path, mod_name, auto_activate)
Load a ContentPackData resource file directly. - load_pack_data(pack_resource, mod_name, auto_activate)
Register a runtime-created ContentPackData resource.
3) Runtime Control API
- activate_pack(pack_id): activate a registered pack.
- deactivate_pack(pack_id): remove resources injected by that pack.
- reset_packs_to_active(): rebuild active packs in deterministic order.
- get_pack_ids() / get_active_pack_ids(): inspect pack lists.
4) Rules (Important)
- pack_id must be globally unique and stable.
- Keep mod_name stable and explicit (recommended: AuthorName-ModName).
- weapons_characters must map 1:1 with weapons.
- If auto_activate=false, call activate_pack(pack_id) manually.
- Do not load the same content through both Pack and load_data flows.
- All my_id values must be globally unique.
- Do not call internal methods directly (such as _install_data).
5) Legacy Compatibility (Old Mods Still Work)
- Still supported: load_data(), load_data_by_dictionary(), load_data_by_content_data().
- Legacy mods do not need immediate migration.
- New mods should prefer Pack; migration path: "Pack first, fallback to legacy."
6) Dual-Path Template (Pack + Legacy Fallback)
var ContentLoader = get_node("/root/ModLoader/Darkly77-ContentLoader/ContentLoader")
var path = "res://mods-unpacked/MyMod/content_data/my_content.tres"
var pack_id = "pack_my_mod_main"var ok = false
if ContentLoader.has_method("load_pack_from_content_data"):
ok = ContentLoader.load_pack_from_content_data(path, pack_id, "MyName-MyMod", true)if not ok:
ContentLoader.load_data(path, "MyName-MyMod")