API 参考 / spi 包:游戏模式、谱面扩展与内容
ChartRuntimeContext
谱面运行时上下文,由宿主桥接到谱面运行数据,模组不接触内核类。它在 ChartExtensionParser.apply 中传入,也用于游玩期读取扩展状态;底层键值存储就是该谱面的 extensionsData,游玩场景读取同一份数据。
方法速览
| 方法 | 用途 |
|---|---|
put(String, Object) | 写入运行时数据 |
get(String) | 读取运行时数据(不存在返回 null) |
extraContent() | 游玩上下文的演出原语通道(可能为 null) |
put(String key, Object value)
签名:
java
void put(String key, Object value);行为:向该谱面的运行时键值存储写入一项,同名键覆盖。key 为 null 时静默忽略;value 可以为 null。写入内容与宿主解析扩展段的结果共用同一张表,游玩期可经 ChartView.extensions() 读取。
示例:
java
ctx.put("mymod:state", new MyEffects());get(String key)
签名:
java
Object get(String key);行为:读取运行时数据;key 为 null 或不存在时返回 null。调用方自行做类型判别。
示例:
java
Object state = ctx.get("mymod:state");
if (state instanceof MyEffects fx) {
// 使用自定义状态
}extraContent()
签名:
java
default ExtraContentApi extraContent();行为:返回宿主游玩上下文注入的谱面表演原语通道(ExtraContentApi),仅在游玩场景的谱面加载/游玩期非 null;谱面列表扫描、编辑器等上下文返回 null,调用方必须判空。通道在运行时上下文构造时捕获,本局内保持不变;apply 阶段拿到的实例在宿主布局就绪前会缓冲调用、就绪后按序重放。默认实现返回 null。
示例:
java
ExtraContentApi api = ctx.extraContent();
if (api != null) {
api.setTrackTilt3D(10.0);
}完整签名
java
public interface ChartRuntimeContext {
void put(String key, Object value);
Object get(String key);
default ExtraContentApi extraContent();
}线程:源码未声明额外线程约束;宿主在谱面加载与游玩主线程访问同一份键值存储,未做同步,跨线程访问需自行加锁。
生命周期阶段:运行期谱面加载(apply 注入)与游玩期间读写。
稳定性:2.0 起冻结:2.x 内只增不破(禁止删签名/改签名/改语义)。