Skip to content
On this page

SearchingSafeBox 保险箱附属

SearchingSafeBox 是 Searching 的附属插件,用于给指定 nodeTypeId 的搜刮箱增加“密码保险箱 / 破译开锁”流程。它的机制是监听 Searching 的 SearchingPreOpenEvent,在玩家进入原始搜刮 UI 前接管打开流程。

项目仓库:ewsk233/SearchingSafeBox

工作流程

  1. 玩家右键 Searching 搜刮点。
  2. Searching 触发 SearchingPreOpenEvent
  3. SearchingSafeBox 读取 event.node.typeId
  4. 如果 typeId 命中 config.ymlsafeboxes 规则,并且规则启用,则继续判断是否需要破译。
  5. 默认 Bridge 只在节点状态为 Unsearched 时要求破译。
  6. 插件取消原 Searching 打开流程,创建 UnlockSession
  7. 打开配置指定的 UnlockUIProvider
  8. 玩家破译成功,或自动破译完成后,继续经过 Searching 打开前检查,再打开原搜刮箱。
  9. 会话被清理。

这意味着:已经打开过、但尚未被 Searching 刷新的节点,不会再次进入破译界面。节点刷新回 Unsearched 后,下次打开会重新要求破译。

默认破译 UI

默认 UI Provider ID:

text
default

默认 UI 是一个三位数字密码界面:

  • 发光数字表示本轮密码会出现的数字。
  • 密码由两个相同数字和一个不同数字组成,并随机打乱顺序。
  • 点击数字后,上方 3 个输入槽会显示正确或错误。
  • 退格 会把上一位输入槽恢复为灰色“待输入”。
  • 输入正确后关闭界面,并调用 context.success()
  • 输入错误时,如果 consume-on-fail: true,本次破译失败;否则短暂显示错误后重置输入槽。
  • 关闭破译界面会取消当前会话。

默认 UI 是可替换实现,正式项目可以注册自己的 UnlockUIProvider

自动破译

如果规则启用了 auto-unlock,插件会在破译界面底部 9 格显示自动破译进度:

  • 灰色:等待中
  • 绿色:已完成进度
  • 总槽位固定为 9
  • auto-unlock-seconds: 9 时,大约每秒点亮 1 格
  • 读条完成后触发自动破译完成,并打开原 Searching 搜刮箱

进度计算逻辑:

kotlin
val totalTicks = autoUnlockSeconds * 20
val slotIntervalTicks = max(1, totalTicks / 9)
val progressSlots = min(9, elapsedTicks / slotIntervalTicks)

手动成功行为

当前实现中,UI 调用 context.success() 后会进入原 Searching 搜刮箱打开流程,并清理会话。与房卡、权限门禁等附属联动时,破译完成后仍会经过打开前检查。

open-immediately-on-success 字段已被配置系统解析,但当前 Manager 没有基于该字段做延迟打开分支。因此现版本应按“手动破译成功后立即打开”理解。

会话生命周期

同一玩家同时只能存在一个破译会话。以下情况会清理会话:

  • 玩家破译成功
  • 自动破译完成
  • 玩家破译失败
  • 玩家关闭破译界面
  • 玩家退出服务器
  • 解锁超时
  • 插件重载配置
  • 插件关闭
  • 管理员执行 session clear 命令

会话状态:

状态含义
CREATED已创建
OPENING_UI正在打开 UI
UNLOCKING破译中
SUCCESS手动破译成功
FAILED破译失败
CANCELLED被取消
EXPIRED超时
AUTO_UNLOCKED自动破译完成
OPENED已打开原搜刮箱

命令

主命令:

text
/searchingsafebox

别名:

text
/ssafebox
/safebox

命令列表:

命令说明权限
/searchingsafebox reload重载配置并清理当前破译会话searchingsafebox.command.reload
/searchingsafebox debug <nodeTypeId>查看指定保险箱规则解析结果searchingsafebox.command.debug
/searchingsafebox ui list查看已注册 UI Providersearchingsafebox.command.ui
/searchingsafebox session list查看当前活跃破译会话searchingsafebox.command.session
/searchingsafebox session clear <player>清理指定玩家的破译会话searchingsafebox.command.session

主命令权限:

text
searchingsafebox.command

该权限默认 OP 拥有。

文档导航