BBSMC Logo
模组
资源包
数据包
整合包
光影
插件
软件
汉化
论坛
登录
模组插件数据包光影资源包整合包软件汉化
登录
设置
灵活按键绑定

灵活按键绑定

灵活的可用按键提示功能,以及衍生的便捷按键修改。

0
0
实用工具

基本信息

我的世界Java版本

1.20.1–1.20.6

平台

\n \n \n Forge

运行环境

客户端

创作者

真冬
真冬 Member

详情信息

许可证 GPL-3.0-only
发布于 12 days ago
更新于 12 days ago
简介更新日志版本百科反馈讨论

灵活按键提示

本模组提供了灵活的可用按键提示功能,以及衍生的便捷按键修改,可在一定程度上改善玩家的游玩体验,并优化按键管理。

如何使用

对于普通玩家,只需正常下载使用即可。

对于开发者,若希望在游戏中新增一组按键提示,有四种方法:

  • 由目标模组主动与本模组联动,从而添加按键支持。
  • 使用KubeJS调用本模组提供的方法,从而添加按键支持。
  • 使用数据包添加按键支持,但存在一定的局限性,详见数据包扩展指南。
  • 由本模组主动适配后添加。

主要功能

本模组用于在合适的时机选择性地展示相关按键,为此,提供了灵活展示按键提示的接口供模组或整合包开发者使用。

// 展示已注册按键绑定中的某个按键。
show(String group, String desc);
// 展示自定义按键提示。
custom(String group, String key, String desc);
// 将已注册按键绑定中的某个按键,使用另外的别名展示。
alias(String group, String desc, String alias);

只需在客户端Tick事件中按条件约束执行这三个方法,就能添加简单的按键提示。详细的开发实例请看后文。

此外也支持使用数据包添加按键提示支持,但条件判断上存在一定的限制,部分复杂语法也无法使用,仅适用于简单适配的场景。

如需使用,请查阅数据包扩展指南。

效果如下:

img

三个方法中的group均代表按键组标识号,例如,本模组在为JEI提供按键提示支持时,使用了"jei_skp"的标识号,并默认禁用此按键组。

你可以随时在配置文件中使用标识号来禁用对应的按键组,或者使用。

此外,当屏幕上存在按键提示时,按下控制热键(默认为K)+鼠标左键,即可打开相应的按键绑定设置界面,而不需要在所有按键绑定中寻找。

效果如下:

img

注意,只有在对已注册的按键绑定添加提示时(show, alias)适用此功能,对于自定义按键提示(custom)不会有任何效果。

此外,这个功能也可以主动触发,用于打开自定义按键绑定设置界面,并只显示给定的按键绑定:

ConfigAction.modifyKey(List<String> keyDescList);

按住控制热键时,按键提示会被锁定,无需顾虑抓时机的问题。

最后,按下控制热键+鼠标右键,即可切换按键提示HUD的显示与否和显示位置。按住控制热键时还可以通过鼠标滚轮调整HUD大小。

灵活提示

创建按键提示所使用的"key"和"desc"字段均为语言文件中的对应字段。 例如在Minecraft的语言文件\assets\minecraft\lang\en_us.json中查找"key"字段:

{
  "key.keyboard.f11": "F11",
  "key.keyboard.left.shift": "Left Shift",
  "key.mouse.left": "Left Button"
}

在TaCZ的语言文件\assets\tacz\lang\zh_cn.json中查找"desc"字段:

{
  "key.tacz.fire_select.desc": "开火模式",
  "key.tacz.inspect.desc": "检视",
  "key.tacz.interact.desc": "持械时互动"
}

在模组中使用:

@SubscribeEvent
public static void tick(TickEvent.ClientTickEvent event) {
    if (!ModList.get().isLoaded("immersive_aircraft")) return;
    Player player = Minecraft.getInstance().player;
    if (player == null || Minecraft.getInstance().screen != null) return;
    String vehicle = PlayerUtils.getVehicleType(player);
    if (vehicle != null && vehicle.startsWith("immersive_aircraft:")) {
        PromptUtils.custom(modid, KeyUtils.getKeyByDesc("key.inventory"), "immersive_aircraft.slot.upgrade");
        PromptUtils.show(modid, "key.immersive_aircraft.dismount");
        String keyUse = KeyUtils.getKeyByDesc("key.immersive_aircraft.fallback_use");
        PromptUtils.custom(modid, Objects.equals(keyUse, "key.keyboard.unknown") ? "key.mouse.right" : keyUse, "item.immersive_aircraft.item.weapon");
        if (vehicle.equals("immersive_aircraft:biplane")) {
            PromptUtils.custom(modid, KeyUtils.getKeyByDesc("key.jump"), "item.immersive_aircraft.engine");
        }
    }
}

在KubeJS中使用:

ClientEvents.tick(event => {
    let player = event.player;
    if (["key.left", "key.right", "key.forward", "key.back"].map(desc => SKP$KeyUtils.isKeyPressedOfDesc(desc)).includes(true)) {
        SKP$PromptUtils.show("parcool", "key.parcool.Dodge");
    }
    if (!player.onGround() && !player.isInWater()) {
        SKP$PromptUtils.show("parcool", "key.parcool.Breakfall");
        SKP$PromptUtils.show("parcool", "key.parcool.ClingToCliff");
    }
    if (player.isSprinting()) {
        SKP$PromptUtils.show("parcool", "key.parcool.FastRun");
    }
    if (SKP$KeyUtils.isKeyPressedOfDesc("key.parcool.FastRun")) {
        SKP$PromptUtils.show("parcool", SKP$KeyUtils.getKeyByDesc("key.parcool.Dodge"));
        SKP$PromptUtils.custom("parcool", SKP$KeyUtils.getKeyByDesc("key.sneak"), "parcool.action.CatLeap");
    }
});

对于组合键,可以像这样:

SmartKeyPrompts.custom(modid, "key.keyboard.left.shift+key.mouse.left", "批量转移物品");

通过查阅数据包扩展指南,也可以使用数据包简单添加按键支持:

{
  "modid": "tacz_skp",
  "vars": {
    "modLoaded": "isModLoaded('tacz')",
    "hasTaczGun": "mainHandItem == 'tacz:modern_kinetic_gun'",
    "isNotInVehicle": "!isInVehicle()"
  },
  "entries": [
    {
      "when": {
        "modLoaded": "true",
        "hasTaczGun": "true",
        "isNotInVehicle": "true"
      },
      "then": [
        "show('tacz_skp', 'key.tacz.shoot.desc')",
        "show('tacz_skp', 'key.tacz.zoom.desc')",
        "show('tacz_skp', 'key.tacz.reload.desc')"
      ]
    }
  ]
}

拓展用法示例:当准星指向目标实体时,将实体互动信息的按键提示展示在准星下方:

@SubscribeEvent
public static void tick(TickEvent.ClientTickEvent event) {
    if (!ModList.get().isLoaded(modid)) return;
    if (PlayerUtils.getTargetedEntityType() == "minecraft:pig") {
        PromptUtils.addDesc("key.pig.feed").forKey("key.mouse.right").withCustom(true).atPosition("crosshair").toGroup(modid);
    }
}

拓展方法中,"custom"和"position"字段都可以自定义,前者决定这个按键提示能否出现在筛选后的按键绑定设置界面中,后者则决定显示的位置,这是一个固定值,不再受调整HUD位置的功能影响。

在案例中可看到,本模组还提供了诸多关于按键操作的便捷方法,用于简化开发流程。除此之外,还有诸如获取视线所指实体等更为通用的条件判断工具。

灵活禁用

前文说到,按住控制热键(默认为K)时,按键提示会被锁定,无需顾虑抓时机的问题,此时按键提示对应的标识名也会以"group:desc"的方式标注在按键提示后。

对于KubeJS,可以用这样的方式管理某一个或某一类按键提示:

SKP$PromptUtils.disablePromptByGroup(String group)
SKP$PromptUtils.enablePromptByGroup(String group)
SKP$PromptUtils.disablePromptByDesc(String desc)
SKP$PromptUtils.enablePromptByDesc(String desc)
SKP$PromptUtils.disablePrompt(String group, String desc)
SKP$PromptUtils.enablePrompt(String group, String desc)

该功能常用于禁用已有的按键提示。

此外,本模组也提供了禁用某一个按键绑定的快捷方法:

SKP$KeyUtils.isKeyDisabled(String desc)
SKP$KeyUtils.getDisabledKeyMappingList()
SKP$KeyUtils.disableKeyMapping(String desc)
SKP$KeyUtils.disableKeyMapping(List<String> list)
SKP$KeyUtils.disableAllKeyMapping()
SKP$KeyUtils.enableKeyMapping(String desc)
SKP$KeyUtils.enableKeyMapping(List<String> list)
SKP$KeyUtils.enableAllKeyMapping()

使用这些方法,可以灵活地禁用和启用某一按键绑定,如disableKeyMapping("key.jump")可以让玩家无法跳跃。

其它

如果有希望适配的模组,欢迎告知。

如果有新的按键组希望添加到本模组中,请告知或直接推送到仓库。

对于整合包开发者,推荐搭配KeyBindJS使用。

未来计划:

  • 更多可供选择的按键提示位置,如跟随鼠标。
  • 双击和长按按键的显示支持。
  • HUD美化。
  • 可能往更多版本移植。

已适配模组列表详见官方文档。

设置
"Minecraft"以及"我的世界"为美国微软公司的商标 本站与微软公司没有从属关系

本站与Modrinth无从属关系,网站遵循Modrinth网站程序的LGPL协议开源 开源地址

版权所有 © 2019-2024 青岛柒兮网络科技有限公司 | ICP经营许可证: 鲁B2-20210590 | ICP备案: 鲁ICP备2021009459号-12