设置 搜索( 所有模组兼容 )

设置 搜索( 所有模组兼容 )

每个选项屏幕的右上角都会出现一个放大镜按钮,在每一个标签页上都有,可以从主菜单和游戏世界中访问。

现代 Minecraft 意味着原版就有十几个选项界面和上百项设置。再加上三十个模组,每个都带来自己的菜单、自己的开关,有时还藏在三级菜单之下。要找到"模拟距离"或"那个关掉某个模组粒子的选项",简直成了一场寻宝。

Settings Search(设置搜索)用输入框替代了这场寻宝。

使用方法

打开搜索

  • 任意选项界面右上角的放大镜按钮。
  • 在任意选项界面按 Ctrl + F。
  • 专用快捷键(默认未绑定),可在控制 → 杂项中设置,从游戏中直接打开搜索。

搜索

输入文字,列表会实时过滤。每个结果都会显示设置名称及其所在界面,并带有所属模组前缀。使用 ↑ ↓ 方向键移动选择,按 Enter 确认,或者直接点击。

跳转

点击结果会打开对应的界面,将列表滚动到该设置处,并用闪烁的黄色轮廓框选几秒钟。"完成"按钮会带你回到搜索前所在的位置。

搜索本身

  • 不区分大小写和重音。 "luminosite" 能匹配到 "Luminosité"。
  • 模糊匹配。 "rd" 能匹配到 "Render Distance"(渲染距离),"part dens" 能匹配到 "Particle Density"(粒子密度)。
  • 多词匹配,顺序不限。 "mouse sensitivity"(鼠标灵敏度)和反过来写效果一样。
  • 天生支持双语。 翻译键与显示的标签同时建立索引:搜索 "gamma" 能找到 "亮度",同样地,在法语版游戏中用英文查询也能生效。
  • 延伸到描述文本。 提示文本也会被搜索,但其权重较低,不会盖过名称的匹配结果。
  • 包含按键绑定。 按键绑定会连同其当前分配一起被索引:搜索 "jump"(跳跃)会显示 "跳跃 – 空格"。

如何实现与其他模组的兼容性

这是实现的核心,而且其中没有任何硬编码——即便是原版选项也不例外。

1. 真实的界面探索。 首次打开搜索时,模组会在屏幕外实例化每一个选项界面并运行其初始化过程。这个初始化过程恰好会触发其他模组挂接的 Forge 事件来注入它们自己的按钮,因此它们的控件会自然地出现在被探索的控件树中。绝不会点击任何按钮,也绝不会更改任何值。

2. 未知的界面。 模组不知道从未见过的其他模组的界面是如何构建的。因此,它会根据自身能够提供的参数来选择构造函数——或静态工厂方法。这使它能够打开那些它一无所知的界面。

3. Forge 配置界面。 每个注册了配置界面(模组列表中的"配置"按钮)的模组都会被自动索引。

4. 自主学习。 有些模组有完全定制的选项菜单,任何通用发现逻辑都无法猜出。因此,模组会记住你打开过的每个选项界面,并从此将其索引。规则刻意严格:只有当界面持有指向你之前所在选项界面的引用时,该界面才会被保留——这正是区分真正的子菜单与加载界面或标题界面的方法。这个列表可以在 config/settingssearch-known-screens.txt 中查看和编辑。

控件树的遍历是通用进行的:滚动列表、行、嵌套控件。行标题和提示信息是通过类型而非字段名读取的,这是模组在开发环境之外保持正常工作的必要条件。

性能

索引只构建一次,在首次打开搜索时进行,之后会复用。纯原版环境下:12 个界面中的 150 项设置,索引耗时约五十毫秒。如果你更改了游戏语言或发现了新的选项界面,它会自动重建索引,并且有一个"重建索引"按钮可以让你手动强制重建。

配置

在 config/settingssearch-client.toml 中:

选项 默认值 效果
showSearchButton true 在选项界面上显示放大镜按钮
maxResults 300 显示的最大结果数
highlightSeconds 6 跳转后高亮持续的时长;0 表示禁用
indexModConfigScreens true 索引其他模组的 Forge 配置界面
indexKeyBinds true 索引按键绑定
learnOpenedScreens true 记住你打开过的选项界面
searchTooltips true 也搜索描述文本,而不仅仅是名称

如果某个行为异常的模组在索引过程中导致问题,上述四个来源中的每一个都可以独立关闭。

已知限制

  • 语言选择界面无法逐行搜索。 其条目不包含控件,只有绘制的文本,因此没有可导航的目标。但界面本身仍然可以被搜索到。
  • 探索无法触达既不能从选项界面进入,也不能通过 Forge 配置到达的选项菜单,除非你至少手动打开过它一次。