意图

意图

意图将你的按键绑定转换为上下文感知动作,使单个按键能够根据不同条件执行不同功能。

Intent

Minecraft的上下文感知按键绑定

Intent 将你的按键绑定转变为智能、上下文感知的操作。你无需为不同模组记住繁多的按键,而是可以将多个功能分配给同一个按键,这些功能会根据你的生命值、装备或移动状态等特定条件自动触发。

特性

  • 上下文绑定: 将单个物理按键(例如 R)绑定为根据当前情况执行不同的操作。
    • 示例: 手持末影珍珠时按 R 会将其投掷出去,但若手上什么都没有,则会打开你的物品栏。
  • 放射菜单系统: 若按下一个键时有多个有效操作,长按该键会打开一个放射菜单供你选择要执行的操作。轻按该键则会立即触发优先级最高的操作。
  • 游戏内编辑器: 无需手动编辑 JSON 文件。按 I(默认)打开 Intent 编辑器,即可直观地配置你的规则。
  • 默认条件库:
    • 玩家状态: 潜行、疾跑、空中、骑乘。
    • 物品栏: 持有特定物品或物品标签。
    • 世界: 看向特定的方块或实体。
    • 属性: 生命值或物品耐久的阈值(例如,“当生命值低于50%时自动进食”)。
    • 战斗: 检测你是否正在战斗。
    • GUI: 检测特定界面(如物品栏)是否打开。

如何使用

编辑器

按下 I 打开 Intent 编辑器。

  1. 选择一个按键: 在左侧选择一个物理按键(例如 Key R)。
  2. 添加规则: 向规则堆栈中添加“Intent 条目”。
  3. 定义上下文: 为每个条目定义它应该何时触发(例如 is_sneaking)。
  4. 设置优先级: 规则会从上到下依次检查。使用上/下箭头键调整特定操作的优先级。

虚拟化

Intent 允许你“虚拟化”一个按键绑定。此操作会将该动作从原版的按键控制选项中解绑,从而避免与你自定义的 Intent 规则产生冲突。


开发者 API

Intent 导出了一个专门的 API jar 文件,允许其他模组添加自定义的上下文类型(条件)和编辑器。

使用方式 (Gradle)

Intent 可通过 JitPack 获取。将以下内容添加到你的 build.gradle 文件中:

repositories {
    maven { url 'https://jitpack.io' }
}

dependencies {
    // 编译时仅引用 API(推荐)
    implementation "com.github.kjmaster1:Intent:v1.0.0:api"

    // 或者,在运行时测试时包含完整模组
    // implementation "com.github.kjmaster1:Intent:v1.0.0"
}

注册自定义上下文

要添加新的条件(例如,检测当前是否在下雨),需要实现 IIntentContext 并注册一个 ContextType。

  1. 创建上下文:

    public record RainingContext() implements IIntentContext {
        public static final MapCodec<RainingContext> CODEC = MapCodec.unit(new RainingContext());
    
        @Override
        public boolean test(LocalPlayer player) {
            return player.level().isRaining();
        }
    
        @Override
        public ContextType<?> getType() {
            return MyRegistries.IS_RAINING.get();
        }
    }
    
  2. 注册类型: 使用 IntentAPI.CONTEXT_TYPE_REGISTRY_KEY 将你的类型注册到 Intent 注册表中。

    public static final DeferredRegister<IIntentContext.ContextType<?>> CONTEXT_TYPES =
            DeferredRegister.create(IntentAPI.CONTEXT_TYPE_REGISTRY_KEY, "my_mod_id");
    
    public static final DeferredHolder<IIntentContext.ContextType<?>, IIntentContext.ContextType<RainingContext>> IS_RAINING =
            CONTEXT_TYPES.register("is_raining", () -> () -> RainingContext.CODEC);
    

添加 GUI 编辑器

如果你想让你定义的自定义上下文能在 Intent 的 GUI 中进行编辑,请注册一个 IContextEditor。

// 在你的客户端设置中
ContextEditorRegistry.register(MyRegistries.IS_RAINING.get(), () -> new SimpleStateEditor<>(RainingContext::new));

许可证

本项目基于 MIT License 许可。