激活实现
激活实现的主干现在是 ActivationService。事件和道具只负责构造上下文,真正的账本校验、运行态打开和短标记清理都放在服务层。
已验证的事件与方法
| 事件或方法 | 已验证的接口 | 用途 |
|---|---|---|
PlayerInteractEvent.RightClickBlock | getPos()、getHitVec()、getItemStack()、getHand() | 方块装置适配器 |
PlayerInteractEvent.RightClickItem | getItemStack()、getHand() | 道具适配器 |
PlayerEvent.PlayerChangedDimensionEvent | getFrom()、getTo() | 玩家离场时做收尾 |
LevelEvent.Unload | 事件本体已验证 | 维度卸载时清理 registry |
推荐对象骨架
java
public interface ActivationAdapter {
Optional<ActivationContext> buildContext(ServerPlayer player, ServerLevel level);
}
public final class ActivationService {
public ActivationResult activate(ActivationContext context) {
// 1. 读取 DiscoveredSiteRecord
// 2. 校验 source、triggerPos 和 lifecycle
// 3. 交给 SiteRuntimeBridge 打开 runtime
// 4. 清理 lc_pending_site_ref
return new ActivationResult(false, null, "not_implemented");
}
}
public final class SiteRuntimeBridge {
public Optional<ActiveSiteRuntime> open(
ActivationContext context,
DiscoveredSiteRecord record
) {
return Optional.empty();
}
}这里要分清三层:
- 适配器负责“从哪里来”。
- 服务层负责“能不能开”。
SiteRuntimeBridge负责“怎么把 runtime 打开”。
适配器映射
| 适配器 | 当前建议 |
|---|---|
BlockActivationAdapter | 由 RightClickBlock 构造上下文,适合遗址控制台、宿主装置、触发点 |
ItemActivationAdapter | 由 RightClickItem 构造上下文,适合激活器、探测器、密钥类道具 |
MachineActivationAdapter | 预留给后续机器或机器考古流程 |
当前 MVP 可以先实现前两类。机器适配器先保留接口位置,不提前写死事件来源。
激活的最小流程
- 适配器从玩家、当前
ServerLevel和待处理引用构造ActivationContext。 ActivationService读取lc_pending_site_ref对应的SiteRef。- 服务层在
SiteLedgerSavedData中查找DiscoveredSiteRecord。 - 服务层校验
ActivationRule、维度、触发点和生命周期状态。 - 通过后,
SiteRuntimeBridge创建ActiveSiteRuntime。 SiteRuntimeRegistry登记活状态。- 清理
lc_pending_site_ref。
陈旧引用处理
| 情况 | 处理 |
|---|---|
| 引用不存在 | 清短标记并拒绝 |
| 引用在别的维度 | 清短标记并拒绝 |
记录已处于 ACTIVE | 不重复创建 runtime |
| 记录已回收或已中止 | 清短标记并拒绝 |
维度切换和卸载
PlayerEvent.PlayerChangedDimensionEvent 和 LevelEvent.Unload 是收尾钩子,不是激活入口。
| 事件 | 处理建议 |
|---|---|
PlayerChangedDimensionEvent | 如果玩家绑定了 runtime,则关闭、解绑或转入安全收尾 |
LevelEvent.Unload | 删除该 level 下的活跃 runtime,并清掉不再有效的绑定 |
激活阶段的实现红线
- 不在交互事件里维护 runtime 主表。
- 不让
RightClickBlock代表整个激活架构。 - 不让服务层回头重做勘探判定。
- 不保留陈旧
lc_pending_site_ref。