Tupenter
Отправляй чат и команды по нажатию клавиши, а потом даже скриптуй их: цепочки через &&, встроенная математика, переменные, циклы, условия и свои собственные команды с настоящим автодополнением. Всё на стороне клиента, отправляются обычные ванильные команды.
- Загрузчики
- Fabric
- Скачиваний на Modrinth
- 466
- Подписчиков на Modrinth
- 8
- версий
- 29
- Обновлён
- 11 октября 202611 окт.
- Опубликован
- в 2026
Коротко о моде
Ставится только в игру; на сервер ставить не нужно
Tupenter
Tupenter — клиентский мод для Fabric, работающий как помощник команд. Он позволяет повторно отправлять команды или сообщения по нажатию клавиши, использовать встроенную математику и скриптинг, а также создавать собственные команды и скрипты с автодополнением!
Работает он так: весь кастомный скриптинг и синтаксис преобразуются в чистые ванильные команды, выстраиваются в цепочку и отправляются на сервер по порядку — если вообще отправляются. (Многие чисто вычислительные скрипты лишь выводят или показывают сообщение клиенту и больше ничего). Сервер видит только чистые команды /setblock, даже если мод выполняет настоящие вычисления, чтобы превратить это в радужную спираль.
Повторная отправка
Название мода пошло от того, что мне вечно приходилось жать T + вверх + enter, чтобы повторно отправить команды, но теперь Tupenter записывает то, что вы отправляете, и воспроизводит это по нажатию клавиши (по умолчанию R):
- Режим Нажать и держать для быстрой очереди или Переключатель для работы без рук.
- Пакетная отправка последних N сообщений в любом порядке, с задержками для каждого сообщения и для всего пакета, готовыми списками сообщений и подавлением обратной связи команд.
- Мод очень гибко настраивается в mod menu: переключатель и настройки почти для всех функций мода.
Скриптинг
Полный справочник (каждая директива, функция, тип параметра и переменная) смотрите в SCRIPTING.md в исходниках на GitHub или выполните /tupenter reference в игре, чтобы скопировать его в буфер обмена.*
В моде есть три основных типа синтаксиса:
| Синтаксис | Значение |
|---|---|
$...$ | Выражения: можно использовать прямо в строке с ванильным синтаксисом. Они вычисляются и подставляются перед отправкой. |
#word | Директивы: инструкции для Tupenter. Основа для условий, циклов и изменения истории. Никогда не отправляются на сервер. |
(...) | Группировка: после директивы в скобках заключается условие или группа операторов, как в #if (...) (...). Внутри выражений они работают как код — для вызовов функций вроде list(...) и blockset(...) и для математики вроде $(2 + 3) * 4$. В обычном тексте команды это просто символы. |
Цепочки команд
Простейший встроенный скриптинг и тот, которым я пользуюсь чаще всего, — это объединение команд через &&. Каждая команда получает своё автодополнение brigadier и подсветку синтаксиса. Поскольку всё разрешается до отправки на сервер, это совместимо с такими модами, как WorldEdit.
/time set day && /weather clear && /say ready
//undo 2 && //replacenear 30 oak_planks spruce_planks && //replacenear 30 oak_stairs ^spruce_stairsКомментирование
##, за которым идёт пробел, начинает заметку, которая никогда не выполняется. Она заканчивается на следующем && или в конце строки, так что даже однострочник может нести заметки между своими операторами:
## bottom left && /activate 1 2 3 && ## the other one && /activate 2 3 4Вычисления прямо в строке
Выражения позволяют как простой, так и сложной математике существовать прямо внутри обычных ванильных команд.
/give @s stick $32 + 5$
/give @s diamond $3s$ (s = стаки по 64)
/summon $pick("zombie", "skeleton")$
/tp @s ~ ~$client.pos.y > 60 ? 10 : 0$ ~Математика точная: 1/3 остаётся третью, без дрейфа с плавающей точкой.
Списки бывают двух видов: через запятую вычисляется каждый элемент, а через вертикальную черту элементы берутся точно как написаны, так что названия блоков и предметов не нуждаются в кавычках.
list(1, 2 + 3)
list(oak_log | birch_log | spruce_log)/calc <выражение> выводит любой результат локально, ничего не отправляя, — удобно проверить выражение перед использованием.
Чтение мира
Более девяноста живых переменных: позиция, здоровье, биом, уровень освещения, предмет в руке, то, на что наведён прицел, погода, сущность, на которую вы смотрите, её NBT.
/echo standing on $block(client.blockpos.x, client.blockpos.y - 1, client.blockpos.z)$
#if (client.target.hit == "block") (/tp @s $client.target.blockpos$)
А многие переменные, которых нет среди встроенных, всё равно доступны напрямую через NBT-пути:
/echo elytra damage: $entity("self", "nbt.equipment.chest.components.minecraft:damage", 0)$
/echo $client.target.nbt.Health$
Используй /tupenter dump, чтобы просмотреть дерево NBT и найти нужный путь.
### Переменные, циклы, условия
Tupenter позволяет создавать одноразовые локальные переменные (#local), переменные, живущие в течение сессии (#set), переменные, сохраняемые между сессиями, с помощью /tupenter var save \<var\>, и #setdefault, который создаёт переменную только если её ещё нет.
#set spawn = "100 64 -200" #local roll = rand(1, 10) && /give @s stick $roll$ && /say I got $roll$! #local c:blockpos = blockpos(-10, 20, 85) && /tp $c$ #repeat 5 (/say tick $i$) #for $x$ in 1..10 step 2 (/summon zombie ~$x$ ~ ~) #foreach $mob$ in list(zombie | skeleton | creeper) (/summon $mob$ ~ ~ ~) #foreach $b$ in blockset(#minecraft:wool) (/give @s $b$) #if (client.health < 6) (/effect give @s regeneration 5 1) #setdefault runs = 0 && #set runs += 1 && /say run number $runs$
Теги реестров разрешаются через активное подключение, а при вводе `#` внутри
`blockset(...)` автодополнение по Tab показывает теги, доступные на этом сервере.
### Ожидания
Используй #wait <время> в тиках, секундах, минутах или игровых днях, чтобы создавать задержки между действиями Tupenter. По умолчанию отсчитывается игровое время, поэтому ожидание ускоряется во время /tick sprint и останавливается, когда игра заморожена или на паузе. Скрипты вычисляются лениво: значение, прочитанное после #wait, видит мир таким, какой он сейчас, а не каким он был в момент нажатия Enter.
Ожидание не мешает будущим командам выполняться параллельно. По умолчанию Tupenter позволяет запускать 8 скриптов одновременно. /tupenter running показывает все активные команды и скрипты и их pid, а /tupenter abort <pid> позволяет их убить.
/say ready && #wait 3s && /say GO #wait 5m realtime && /echohud &ecows are ready to be fed! /echo you're at y=$client.pos.y$ && #wait 3s && /echo now you're at y=$client.pos.y$
### Тишина, приватность, локальный вывод
#silent /time set day && /weather clear (вся строка) #repeat 5 (#silent (/give @s stick) && /say hi) (только часть) #norecord /msg friend secret (не попадает в историю повторной отправки) /echo &amy y is &e$client.pos.y$ (видно только тебе, ничего не отправляется; &-коды задают цвет) #unstage 2 (убрать 2 последние записи из истории повторной отправки)
`#silent` скрывает вещи на *твоём* экране: отклик команды и уведомления, которые Tupenter печатает, когда `#set` создаёт или обновляет переменную. Команды всё равно выполняются как обычно, и всё, что увидели бы другие игроки, до них доходит — например, отклик от команды /setblock.
### Создавай свои команды
/customcommand, а также вкладка пользовательских команд, доступная через меню мода и /tupenter menu, позволяют создавать свои команды, использующие ванильные команды и синтаксис Tupenter. Их легко редактировать или удалять, и они автоматически обновляются в автодополнении Brigadier от Mojang, так что никогда не устаревают.
/customcommand add waves <count:int> <mob:entity> = #repeat $count$ (/summon $mob$ ~ ~ ~) /waves 5 zombie
Вот как определена предустановленная `/blink`. (`add` отказывается принимать уже существующее имя, так что дай своей версии новое имя или измени существующую через `/customcommand update`.)
/customcommand add blink <maxdistance:int=100> "teleport to where you're looking" = #silent #local hit = raycast(maxdistance) && #if (hit == "miss") (/tp @s ^ ^ ^$maxdistance$) #else (/tp @s $hit$)
`/blink` — настоящая команда с настоящим автодополнением, типизированными параметрами и
необязательными аргументами. Предустановленная `/portalcalc` — ещё одна:
/customcommand add portalcalc <p:blockpos=~ ~ ~> <dim:to_overworld,to_nether=$client.dimension == "minecraft:the_nether" ? "to_overworld" : "to_nether"$> = /echo $dim$: $floor(dim == "to_nether" ? p.x / 8 : p.x * 8)$ $p.y$ $floor(dim == "to_nether" ? p.z / 8 : p.z * 8)$/portalcalc без аргументов подскажет, куда ведёт твой парный портал в другом измерении, и сам определит направление пересчёта по тому, где ты стоишь. На сервер при этом не отправляется вообще ничего. /echo — это клиентский способ Tupenter отправить сообщение только отправителю и никому больше.
Есть ещё и кастомные функции — для значений, которые хочется переиспользовать внутри $...$. Функция вычисляет значение и ничего не отправляет — для этого и нужны кастомные команды:
/customfunction add midpoint <a:vec3> <b:vec3> = scale(vadd(a, b), 0.5)
/tp @s $midpoint(client.pos, spawn)$Скрипты, выполняющиеся каждый тик
Mod Menu → Tupenter → Scripts хранит однострочные скрипты, которые выполняются каждый тик, пока включён главный переключатель. Каждая включённая строка оборачивается в цикл, так что это один долгоиграющий скрипт, а не новый разбор каждый тик: значения #set сохраняются между тиками, а #wait работает естественно.
Скрипты включаются отдельно для каждого мира, так что скрипт, написанный для креатива, никогда не сработает на твоём выживательном сервере, а мир, который ты не настраивал, не запустит ничего. /tupenter scripts показывает, что включено там, где ты стоишь, а /tupenter abort all — это аварийная кнопка: она останавливает все скрипты и выключает главный переключатель.
Поскольку скрипт — это цикл, события — это флаги на один тик, которые ты проверяешь:
#if (client.just_died) (/echo died at $client.blockpos$)
#if (client.keypress.g) (/togglenightvision)Предупреждение об использовании скриптов: незащищённая команда в тик-скрипте будет срабатывать 20 раз в секунду, что на мультиплеерном сервере превратится в спам в чате. Защищай её через #if, как в примерах выше.
Предоставленные команды и скрипты
После скачивания мода в нём уже будет список кастомных команд и скриптов. Это те, что я считаю полезными или забавными, и они демонстрируют многие аспекты функциональности мода. Их легко удалить, а скрипты по умолчанию отключены.
Команды, готовые к использованию:
| Команда | Что делает |
|---|---|
/blink [maxdistance] | телепортирует туда, куда ты смотришь, останавливаясь у стен |
/ironkit | полный набор железной экипировки |
/portalcalc [pos] [dim] | пересчитывает координаты между Nether и Overworld |
/tickfreeze | переключает /tick freeze |
| `/launch [speed] [no_gravity]` | швыряет сущность туда, куда ты смотришь |
Скрипты, все отключены, пока ты их не включишь:
| Скрипт | Что делает |
|---|---|
rainbowTunnel | нажми ] и лети — за твоим движением последует спиральный туннель из шерсти, освещённый светокамнем |
itemDespawnTimer | отмечает место твоей смерти и отсчитывает пять минут до исчезновения предметов, приостанавливаясь, когда этот чанк не симулируется |
creeperAlert | один раз предупреждает с указанием расстояния, когда Creeper подбирается ближе 8 блоков |
elytraWarning | предупреждает о прочности, прежде чем твоя Elytra сломается |
restockReminder | жители пополняют товары на рассвете |
Удобства
- Подсветка синтаксиса в строке чата: каждый сегмент
&&окрашивается по своему типу; команды получают раскраску по аргументам из собственного разбора - Автодополнение с учётом цепочек:
/time set day && /weather cl⇥дополнит вторую команду - Выделяемый чат: выделяй сообщения кликом и перетаскиванием, Ctrl+C для копирования
/unroll: пробный прогон любой строки — покажет, что именно она отправит, ничего не отправляя/tupenter varsвыводит список твоих переменных, а `/tupenter var save|delete ` управляет сохранёнными/tupenter menuоткрывает экран настроек из чата; добавьcustomcommandsилиscripts, чтобы сразу попасть на нужную вкладку- У каждой функции есть переключатель вкл/выкл в Mod Menu
Документация
/tupenter help: каждая команда, директива, функция и переменная документируют себя прямо в игре, с примерами для запуска/tupenter reference: копирует всю справку в буфер обмена- SCRIPTING.md: та же справка на GitHub: модель, каждая директива, каждая функция, каждый тип параметра, каждая переменная и подводные камни
Документация генерируется из тех же реестров, что использует код, поэтому она не может устареть, пока я обновляю мод.
Лицензия
Лицензия MIT, подробности в исходниках на github.
Частые вопросы
Как установить Tupenter?
Установите Fabric под свою версию Minecraft, скачайте Tupenter под ту же версию и загрузчик, положите файл в папку mods и запустите игру с профилем загрузчика.
Для каких версий Minecraft есть Tupenter?
У Tupenter есть сборки для Minecraft 1.21.5–26.3.
Нужен ли Tupenter на сервере?
Ставится только в игру; на сервер ставить не нужно