▶️ ЗАБЕРИ СВОИ 8 ПОДАРКОВ 🎁 ПРИ СОЗДАНИИ СВОЕГО МАЙНКРАФТ СЕРВЕРА
Моды/Smart Key Prompts
Smart Key Prompts

Smart Key Prompts

Мод Smart Key Prompts для Minecraft добавляет гибкую систему контекстных подсказок клавиш на экране и удобное переназначение управления. Упрощает игровой процесс с большим количеством модов - никаких гаданий, что зажимать.

Оцените первым
68.3K
28

Smart Key Prompts

Smart Key Prompts - это модификация для Майнкрафт, которая решает вечную проблему: когда у тебя десяток модов, управление превращается в кашу. Вместо того чтобы помнить сотню клавиш, ты видишь подсказки прямо на экране, причём только те, что актуальны в текущей ситуации. И да, это работает и для создания кастомных сборок.

Требования

Нужен OneEngoughLib версии 1.1.2 или новее.


Как это работает

Для обычного игрока всё просто - поставил мод и играешь, никаких настроек не требуется. Подсказки появляются автоматически, если мод, который ты используешь, поддерживает Smart Key Prompts.

Для разработчиков (или сборщиков) есть целых четыре способа донастроить систему:

  • Сам мод активно поддерживает интеграцию с Smart Key Prompts.
  • Через KubeJS - дёргаешь API прямо скриптами.
  • Через датапаки - с ограничениями, но для простых случаев хватает.
  • Встроенные адаптации - мод сам умеет подхватывать некоторые популярные проекты.

Основные фишки

Мод показывает только релевантные подсказки в нужный момент. Для разработчиков доступен простой API:

// Показать уже зарегистрированную привязку клавиш.
show(String group, String desc);

// Показать полностью свою кастомную подсказку.
custom(String group, String key, String desc);

// Показать зарегистрированную привязку под другим именем.
alias(String group, String desc, String alias);

Вызываешь эти методы, например, в клиентском тике - и подсказки появляются в нужный момент.

Параметр group - это ID группы подсказок. К примеру, при интеграции с JEI мод использует группу "jei_skp", которая по умолчанию отключена. В конфиге можно включать или выключать любую группу по её ID.

Когда подсказки видны на экране, нажми Control (по умолчанию K) + ЛКМ - откроется меню именно этой привязки клавиш. Не надо лазить по длинному списку управления. Работает только для подсказок, привязанных к реальным клавишам (show, alias), для кастомных (custom) не сработает.

Есть и программный вызов конфига для конкретной клавиши:

ConfigAction.modifyKey(List<String> keyDescList);

Зажми Control - текущие подсказки зафиксируются и не пропадут.

А ещё Control + ПКМ переключает видимость и позицию HUD. При зажатом Control колёсиком мыши можно менять размер подсказок.


Гибкая система промптов

Поля "key" и "desc" - это ссылки на записи в языковых файлах. Например, в assets/minecraft/lang/en_us.json:

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

Или в файлах других модов.

Пример кода для интеграции в мод:

@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 = Utils.getVehicleType(player);
    if (vehicle != null && vehicle.startsWith("immersive_aircraft:")) {
        SmartKeyPrompts.custom(modid, Utils.getKeyByDesc("key.inventory"), "immersive_aircraft.slot.upgrade");
        SmartKeyPrompts.show(modid, "key.immersive_aircraft.dismount");
        String keyUse = Utils.getKeyByDesc("key.immersive_aircraft.fallback_use");
        SmartKeyPrompts.custom(modid, Objects.equals(keyUse, "key.keyboard.unknown") ? "key.mouse.right" : keyUse, "item.immersive_aircraft.item.weapon");
        if (vehicle.equals("immersive_aircraft:biplane")) {
            SmartKeyPrompts.custom(modid, Utils.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", "Transfer items in bulk");

Поддержка через датапаки (синтаксис ограничен):

{
  "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')"
      ]
    }
  ]
}

Можно даже показывать подсказку у прицела (crosshair) при наведении на сущность:

@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" кастомизируются. custom определяет, появится ли промпт в меню фильтрации привязок, а position - позицию на экране (фиксированную, не меняется при перетаскивания HUD).


Гибкое отключение

Зажми Control (по умолчанию 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") - игрок не сможет прыгать. Пригодится, если надо ограничить действия в определённых моментах.


Планы

Автор планирует:

  • Больше позиций подсказок (например, возле мыши).
  • Поддержку двойного нажатия и долгого зажатия клавиш.
  • Улучшение визуала HUD.
  • Возможный порт на другие версии Майнкрафт.

Если вы собираете большую сборку или сервер - Smart Key Prompts реально выручает. Игроки не будут путаться, а разработчики смогут настраивать подсказки под себя. Качайте, в общем.

Часто задаваемые вопросы

Совместимость

Minecraft: Java Edition

1.21.x1.20.x

Платформы

Поддерживаемые окружения

Клиент

Зависимости

Ссылки

Детали

Лицензия:
Опубликован:1 год назад
Обновлён:3 месяца назад
Главная