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