Ekra8154
加入于 2026年9月27日
资源 1
服务器 0
皮肤 0
发布的资源
Tupenter
## Tupenter
Tupenter 是一个客户端 Fabric 模组,可充当命令助手。它允许你通过按键绑定重新发送命令或消息、使用内联数学和脚本语法,并创建支持自动补全的自定义命令和脚本!
它会将所有自定义脚本和语法转换为纯原版命令,展开后按顺序发送到服务器(如果确实需要发送到服务器的话)。许多纯计算脚本只会在客户端回显或显示消息,不会执行其他操作。服务器看到的始终只是纯 `/setblock` 命令,即使模组正在进行实际计算,将其变成彩虹螺旋。
## 重新发送
Tupenter 会记录你发送的内容,并通过按键绑定(默认为 `R`)重放:
- **按住**模式适合快速连续发送,或使用**切换**模式实现免手操作。
- 按任意顺序批量发送最近的 N 条消息,并为单条消息和整个批次设置延迟;支持预设消息列表和抑制命令反馈。
- 模组菜单中提供高度可自定义的设置,可切换模组功能,并为几乎所有功能进行设置。
## 脚本
完整参考(包括所有指令、函数、参数类型和变量)请查看 GitHub 源码中的 SCRIPTING.md,或在游戏中运行
`/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 = stacks of 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 ` 会在本地打印任意计算结果,不会发送任何内容,适合在使用表达式前进行检查。
### 读取世界信息
提供超过 90 个实时变量,例如位置、生命值、生物群系、光照等级、手持物品、准星指向的目标、天气、你正在看的实体及其 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 ` 跨会话保存的变量,以及仅在变量尚不存在时创建变量的 `#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 `,并以游戏刻、秒、分钟或 Minecraft 天为单位,在 Tupenter 操作之间创建延迟。默认情况下,它计算的是游戏时间,因此在 `/tick sprint` 期间会加速,并会在游戏冻结或暂停时停止。脚本采用惰性求值,这意味着 `#wait` 之后读取的值反映的是当时的世界状态,而不是按下 Enter 时的状态。
等待不会阻止后续命令并发运行。默认情况下,Tupenter 允许同时运行 8 个脚本。`/tupenter running` 会显示当前处于活动状态的所有命令和脚本及其 pid,`/tupenter abort ` 可终止它们。
```
/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 (whole line)
#repeat 5 (#silent (/give @s stick) && /say hi) (just part of it)
#norecord /msg friend secret (kept out of resend history)
/echo &amy y is &e$client.pos.y$ (shown only to you, sends nothing; &-codes color it)
#unstage 2 (drop the newest 2 resend-history entries)
```
`#silent` 会隐藏你自己屏幕上的内容:命令反馈,以及 Tupenter 在 `#set` 创建或更新变量时显示的提示。命令仍会正常执行,其他玩家能够看到的内容也仍会发送给他们,例如 `/setblock` 命令的反馈。
### 创建自己的命令
`/customcommand`,以及可从模组菜单和 `/tupenter menu` 访问的自定义命令选项卡,允许你使用原版命令和 Tupenter 语法创建自己的命令。它们可以轻松编辑或删除,并会自动加入 Mojang 的 Brigadier 自动补全,因此不会过时。
```
/customcommand add waves = #repeat $count$ (/summon $mob$ ~ ~ ~)
/waves 5 zombie
```
下面是预装的 `/blink` 的定义方式。(`add` 拒绝已经存在的名称,因此请为自己的版本使用新名称,或者使用 `/customcommand update` 修改现有命令。)
```
/customcommand add blink "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 = /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 = scale(vadd(a, b), 0.5)
/tp @s $midpoint(client.pos, spawn)$
```
### 每刻运行的脚本
模组菜单 → Tupenter → **脚本**中包含一些每刻运行一次的单行脚本,只要主开关处于开启状态就会运行。每一行已启用的脚本都会被包装在循环中,因此它是一个持续运行的脚本,而不是每刻重新解析一次:`#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]` | 在下界和主世界之间换算坐标 |
| `/tickfreeze` | 切换 `/tick freeze` |
| `/launch [speed] [no_gravity]` | 将实体朝你正在看的方向掷出 |
**脚本:启用前全部处于禁用状态:**
| 脚本 | 功能 |
| --- | --- |
| `rainbowTunnel` | 按下 `]` 并飞行,一条由荧石照亮、随你的移动形成螺旋的羊毛隧道会跟随你 |
| `itemDespawnTimer` | 标记你死亡的位置,并倒计时物品的五分钟消失时间;在对应区块未被模拟时暂停计时 |
| `creeperAlert` | 当苦力怕进入 8 个方块以内时,显示一次带距离的警告 |
| `elytraWarning` | 在鞘翅损坏之前提醒耐久度 |
| `restockReminder` | 村民在黎明时补货 |
## 生活质量
- **聊天栏语法高亮**:每个 `&&` 片段会根据其类型着色;命令会根据自身解析结果为各参数分别着色
- **感知链式命令的自动补全**:`/time set day && /weather cl⇥` 会补全*第二条*命令
- **可选择的聊天消息**:点击并拖动即可选中消息,按 Ctrl+C 复制
- **`/unroll`**:以试运行方式处理任意一行,并准确查看它将发送的内容,而不会真正发送
- **`/tupenter vars`**:列出你的变量;`/tupenter var save|delete `:管理已保存的变量
- **`/tupenter menu`**:从聊天栏打开设置界面;添加 `customcommands` 或 `scripts` 可直接进入对应选项卡
- 模组菜单中每项功能都有独立的开关
## 文档
- `/tupenter help`:游戏内会为每条命令、指令、函数和变量提供文档,并附带可运行的示例
- `/tupenter reference`:将**完整**参考文档复制到剪贴板
- [SCRIPTING.md](https://github.com/ekra8154/Tupenter/blob/master/SCRIPTING.md):GitHub 上的相同参考文档,包括模型、所有指令、所有函数、所有参数类型、所有变量以及容易踩坑的地方
文档由代码所使用的同一组注册表生成,因此随着我更新模组,文档不会逐渐过时。
## 许可证
许可证为 MIT,详情请参阅 GitHub 源码。
作者:Ekra8154
0
0
2026-09-27