Fuji 中文教程 - SJMC-Dev/SMP3-modpack GitHub Wiki
Fuji(全名 Fuji (Essentials))是一个面向 Fabric / Quilt 的 Minecraft 服务端模组,把 Bukkit 生态中 EssentialsX / CMI 的能力移植到 Fabric 平台,提供经济系统、传送、聊天管理、世界管理、命令工具等一整套开服常用功能。
本文档是官方文档站 https://fuji-fabric.github.io/ 的完整中文翻译与整理,覆盖 README 与全部 152 个模块页面,共 153 篇。
| 项目 | 内容 |
|---|---|
| 原文站点 | https://fuji-fabric.github.io/ |
| 文档源仓库 |
https://github.com/fuji-fabric/fuji-fabric.github.io(docs/ 目录) |
| 模组仓库 | https://github.com/fuji-fabric/fuji |
| 翻译基准 |
main 分支提交 2d549433228bfeea2f157dbf0ff8657e0a445ab0(2026-09-17) |
| 整理日期 | 2026-10-01 |
| 覆盖范围 | README + core + 152 个模块页,共 153 篇,无删减 |
| 许可证 | 原文与模组均为 GPL-3.0 |
原文使用 Docusaurus 专有容器语法,本文已统一改写为通用 Markdown 结构,各板块含义如下:
| 板块 | 含义 |
|---|---|
| 模块说明 | 该模块提供的功能概述(原文 :::module) |
| 提示 / 常见问题 | 使用技巧、注意事项、常见疑问(原文 :::colorbox-tip / :::colorbox-note) |
| 示例 | 用法示例(原文 :::colorbox-example) |
| 警告 / 危险 | 风险提示(原文 :::colorbox-warning / :::colorbox-danger) |
| 配置 | 该模块的配置文件路径与默认内容(原文 :::config) |
| 任务 | 后台调度任务(原文 :::job) |
| 命令 | 命令语法、说明、控制台可执行性与所需权限等级(原文 :::command) |
| 占位符 | 可用的占位符(原文 :::placeholder) |
| 参数类型 | 命令参数类型(原文 :::argument-type) |
原文中的 :::colorbox-* 容器带有 ◉ 问题 / ➜ 解答 式排版,本文保留为引用块与加粗小标题。
-
保持英文原文:命令与子命令(
/fuji inspect fuji-commands)、配置文件与路径(config/fuji/config.json)、配置键名与取值、模块名(command_toolbox.warp)、占位符(%fuji:balance <currency-id>%)、权限节点、命令参数类型(<PlayerCollection>)、代码块结构。 - 译为中文:正文说明、板块标签、表格中的解释列、JSON 配置块内的英文注释。
- 配置块仅翻译注释,不改动任何键名、取值与 JSON 结构。配置中的
document(描述字符串)等纯说明性字段译为中文;正则、命令数组、消息字符串保持原文。 - 命令表格中的「说明」列来自原文
Document字段,均为中文译文。 - 原文中的代码/命令示例一律保留原样,便于直接复制使用。
- 术语以「术语表」为准,同一术语全文统一。
| 英文 | 中文 | 说明 |
|---|---|---|
| module | 模块 | Fuji 的功能单元,默认全部关闭 |
| core | 核心 | 作用于所有模块的全局配置 |
| permission level | 权限等级 | 原版权限等级,0 = 普通玩家,4 = 管理员/OP |
| meta (LuckPerms meta) | 元数据 | 由 LuckPerms 提供的键值对,例如 fuji.multiplier.damage...
|
| placeholder | 占位符 | 形如 %player:name% 的动态文本 |
| job | 任务 | 由调度器周期性执行的后台作业 |
| argument type | 参数类型 | 命令可接受的参数种类,如 [players]
|
| command syntax | 命令语法 | 命令的完整写法 |
| requirement | 使用要求 | 使用某功能/命令的前置条件 |
| backup | 备份 | 启动时对 config/fuji 目录的自动备份 |
| cron expression | cron 表达式 | Quartz 风格的定时表达式 |
| warmup | 预热 | 命令生效前的等待时间 |
| cooldown | 冷却 | 两次使用之间的强制间隔 |
| checker | 检查器 | 周期性判定状态的组件 |
| broadcast | 广播 | 向全服玩家发送消息 |
| actionbar | 动作栏 | 屏幕物品栏上方的文字区域 |
| bossbar | Boss 血条 | 屏幕顶部的进度条 |
| toast | 提示浮窗 | 屏幕右上角的成就式弹窗 |
| display name | 显示名称 | 玩家/实体的展示名 |
| nickname | 昵称 | 玩家自定义名字 |
| warp | 传送点 | 服务端预设的公共传送位置 |
| home | 家 | 玩家私人传送点 |
| jail | 监狱 | 囚禁玩家的区域 |
| kit | 礼包 | 可领取的物品套装 |
| economy | 经济 | 货币与账户系统 |
| AFK | 暂离 | Away From Keyboard,玩家离开状态 |
| RTP | 随机传送 | Random Teleport |
| TPA | 传送请求 | Teleport Ask,玩家间请求传送 |
| maintenance | 维护模式 | 仅允许管理员进入的状态 |
| whitelist | 白名单 | 仅允许名单内玩家进入 |
- 1. README(总览)
- 2. core — 核心
- 3. afk — 暂离检测
- 4. afk.effect — 暂离状态效果
- 5. anti_build — 破坏行为限制
- 6. back — 返回上一位置
- 7. chat — 聊天系统
- 8. chat.display — 展示物品 / 背包 / 末影箱
- 9. chat.history — 聊天记录
- 10. chat.mention — 聊天提及
- 11. chat.replace — 聊天文本替换
- 12. chat.spy — 聊天监听
- 13. chat.style — 聊天样式
- 14. chat.trigger — 聊天触发命令
- 15. cleaner — 实体清理
- 16. color — 样式标签
- 17. color.anvil — 铁砧中的样式标签
- 18. color.sign — 告示牌中的样式标签
- 19. command_advice — 命令装饰(advice)
- 20. command_alias — 命令别名
- 21. command_attachment — 命令附着
- 22. command_bundle — 自定义命令(bundle / 模板命令)
- 23. command_cooldown — 命令冷却
- 24. command_debug — 命令调试
- 25. command_event — 事件触发命令
- 26. command_interactive — 交互式告示牌
- 27. command_menu — 菜单 GUI
- 28. command_meta — 命令元指令(系列入口)
- 29. command_meta.AND — 逻辑与
- 30. command_meta.IF — 条件判断
- 31. command_meta.NOT — 逻辑非
- 32. command_meta.OR — 逻辑或
- 33. command_meta.attachment — 通用数据附着
- 34. command_meta.chain — 命令串联
- 35. command_meta.delay — 延迟执行
- 36. command_meta.for_each — 遍历在线玩家
- 37. command_meta.json — JSON 文件编辑
- 38. command_meta.nop — 空操作
- 39. command_meta.one_of — 随机选择一条命令
- 40. command_meta.run — 切换命令上下文执行
- 41. command_meta.shell — 执行宿主机命令(危险)
- 42. command_meta.when_online — 玩家上线时执行
- 43. command_permission — 命令权限(LuckPerms)
- 44. command_rewrite — 命令重写
- 45. command_scheduler — 定时执行命令
- 46. command_spy — 命令监听
- 47. command_state — 状态
- 48. command_toolbox — 工具命令集
- 49. command_toolbox.bed — 回到床
- 50. command_toolbox.burn — 点燃实体
- 51. command_toolbox.compass — 指南针追踪
- 52. command_toolbox.delete — 删除实体
- 53. command_toolbox.disconnect — 踢出玩家
- 54. command_toolbox.down — 传送到最低点
- 55. command_toolbox.extinguish — 灭火
- 56. command_toolbox.feed — 喂饱
- 57. command_toolbox.fly — 飞行
- 58. command_toolbox.freeze — 冻结实体
- 59. command_toolbox.glow — 发光
- 60. command_toolbox.god — 无敌
- 61. command_toolbox.hat — 把物品戴在头上
- 62. command_toolbox.heal — 治疗
- 63. command_toolbox.help_op — 向 OP 求助
- 64. command_toolbox.itemname — 物品名
- 65. command_toolbox.jump — 跳跃传送
- 66. command_toolbox.lore — 物品 lore
- 67. command_toolbox.more — 补满数量
- 68. command_toolbox.near — 附近的玩家
- 69. command_toolbox.nickname — 昵称
- 70. command_toolbox.ping — 查询延迟
- 71. command_toolbox.realname — 查询真实名
- 72. command_toolbox.repair — 修复物品
- 73. command_toolbox.reply — 回复私聊
- 74. command_toolbox.rules — 服务器规则
- 75. command_toolbox.seen — 最后在线时间
- 76. command_toolbox.speed — 移动速度
- 77. command_toolbox.suicide — 自杀
- 78. command_toolbox.top — 传送到最高点
- 79. command_toolbox.tphere — 把他人传送到自己身边
- 80. command_toolbox.tppos — 统一传送命令
- 81. command_toolbox.trashcan — 垃圾桶
- 82. command_toolbox.warp — 传送点
- 83. command_warmup — 命令预热
- 84. deathlog — 死亡记录
- 85. disabler — 检测禁用器(系列入口)
- 86. disabler.chat_speed_disabler — 禁用刷屏检测
- 87. disabler.max_player_disabler — 禁用人数上限
- 88. disabler.move_speed_disabler — 禁用移动过快检测
- 89. disabler.move_wrongly_disabler — 禁用错误移动检测
- 90. doctor — 崩溃分析
- 91. document — 文档生成
- 92. echo — 消息发送(系列入口)
- 93. echo.send_actionbar — 发送动作栏消息
- 94. echo.send_bossbar — 发送 Boss 血条
- 95. echo.send_broadcast — 发送广播
- 96. echo.send_chat — 以玩家身份发送聊天消息
- 97. echo.send_console — 发送到控制台
- 98. echo.send_custom — 发送自定义文本
- 99. echo.send_dialog — 发送对话框
- 100. echo.send_message — 发送消息
- 101. echo.send_title — 发送标题
- 102. echo.send_toast — 发送提示浮窗
- 103. economy — 经济系统
- 104. evaluator — Lisp 求值器
- 105. fuji — 模组管理命令
- 106. functional — 功能方块 GUI(系列入口)
- 107. functional.anvil — 打开铁砧界面
- 108. functional.cartography — 打开制图台界面
- 109. functional.enchantment — 打开附魔台界面
- 110. functional.enderchest — 打开末影箱界面
- 111. functional.grindstone — 打开砂轮界面
- 112. functional.loom — 打开织布机界面
- 113. functional.smithing — 打开锻造台界面
- 114. functional.stonecutter — 打开切石机界面
- 115. functional.workbench — 打开工作台界面
- 116. gameplay — 玩法调整(系列入口)
- 117. gameplay.multi_obsidian_platform — 多个黑曜石平台
- 118. head — 头颅商店
- 119. home — 家
- 120. jail — 监狱
- 121. kit — 礼包
- 122. language — 多语言
- 123. launcher — 弹射实体
- 124. leaderboard — 排行榜
- 125. maintenance — 维护模式
- 126. motd — 服务器列表信息
- 127. multiplier — 数值倍率
- 128. nametag — 头顶名牌
- 129. placeholder — 额外占位符
- 130. predicate — 判定命令
- 131. profiler — 服务器健康状态
- 132. pvp — PvP 管理
- 133. queue — 排队
- 134. rank — 等级系统
- 135. rtp — 随机传送
- 136. sign_editor — 告示牌编辑器
- 137. sit — 坐下
- 138. skin — 皮肤管理
- 139. system_message — 系统消息
- 140. tab — TAB 列表
- 141. teleport_warmup — 传送预热
- 142. temp_ban — 临时封禁
- 143. tester — 开发测试
- 144. title — 称号
- 145. top_chunks — 卡顿区块分析
- 146. tpa — 传送请求
- 147. view — 查看玩家背包
- 148. warning — 警告记录
- 149. whitelist — 白名单
- 150. works — 作品展示板
- 151. world — 世界管理
- 152. world.border — 按维度世界边界
- 153. world_downloader — 世界区域文件下载
本手册分为两部分:
-
core(核心) 核心部分请参考:
-
modules(模块) 模块部分请参考本文档中各模块对应的章节。
本文档还提供交互式版本:在服务器中执行 /fuji 命令即可阅读。
◉ 如何使用本模组?
功能由各个模块提供。所有模块默认全部关闭,你需要手动启用想用的模块。
◉ 如何启用一个模块?
- 编辑
<你的服务器目录>/config/fuji/config.json文件。 - 在
modules小节中,把各个模块的值设为true或false。 - 重启服务器使改动生效。
◉ 服务器运行期间可以重载配置文件吗?
可以,但只能针对已启用的模块。对这些模块,使用 /fuji reload 重载该模块专属的配置文件。
你不能在服务器运行期间启用或禁用某个模块——模块只在服务器启动阶段加载。
这是设计上的取舍,原因有两点:
- 性能:被禁用的模块不会带来任何开销。
- 兼容性:如果与其他模组冲突,可以禁用相关模块来解决冲突。
◉ lore 文本太大看不清怎么办?
➜ lore 文本过大时调整字体大小
如果 lore 文本太大:
- 打开
Esc→Options(选项)→Video Settings(视频设置)→GUI Scale(GUI 缩放)。
➜ 必要时改善 lore 文本渲染
如果调节 GUI 缩放 仍然不够,请安装客户端模组 ToolTipFix:
◉ 怎么让配置文件更容易编辑?
请使用现代的文本编辑器。
大多数配置文件采用 JSON 格式,体积可能很大。现代文本编辑器可以高亮显示结构并检查错误,让配置工作轻松很多。
推荐的文本编辑器:
- Visual Studio Code:https://code.visualstudio.com/
- Vim:https://neovim.io/
- Emacs:https://www.gnu.org/software/emacs/
◉ 我如何知道这个模组都提供了什么?
➜ 打开交互式文档界面
执行:/fuji
➜ 列出全部命令
执行:/fuji inspect fuji-commands
➜ 列出全部权限与元数据
执行:/fuji inspect permissions-and-metas
➜ 列出全部占位符
执行:/fuji inspect placeholders
➜ 列出全部配置
执行:/fuji inspect configurations
➜ 列出全部任务
执行:/fuji inspect jobs
➜ 列出全部语言
执行:/fuji inspect languages
➜ 列出全部参数类型
执行:/fuji inspect argument-types
➜ 列出全部事件
执行:/fuji inspect events
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
该文件名为 主控制文件,用途是:
- 控制
core的行为,从而影响所有模块。 - 启用或禁用某个
模块。
你不能在服务器运行期间启用或禁用某个模块,必须重启服务器才能切换模块。
默认内容(config/fuji/config.json):
{
/* 本模组由 `core`(核心)和 `module`(模块)两部分组成。
`core` 部分选项作用于「所有」模块。
`module` 部分选项只作用于「该模块」自身。 */
"core": {
"debug": {
/* 强制禁用「全部」模块。
如果你想测试「本模组」与「其他模组」之间的「兼容性」,请把此项设为 `true`。 */
"disable_all_modules": false
/* 把 `DEBUG` 级别的消息输出到 `控制台`。
服务器运行期间可以用 `/fuji debug` 命令切换此项。 */,
"print_debug_messages_in_console": false
/* 服务器启动时在 `控制台` 打印 `首次使用引导`。 */,
"print_user_guide_in_console": true
}
/* 备份选项。
本模组会在服务器启动、加载任何模块之前,备份 `config/fuji` 目录。 */,
"backup": {
/* `config/fuji/backup/` 目录中保留的最大备份文件数量。 */
"max_slots": 15
/* 定义创建 `备份文件` 时需要忽略的 `路径`。
`路径` 相对于 `config/fuji/` 目录解析。 */,
"skip": [
"modules/head/head-data"
]
},
"language": {
/* 定义本模组使用的 `默认语言`。
语言文件位于 `config/fuji/languages/` 目录。 */
"default_language": "en_US"
/* 定义所有 `语言值` 的 `公共前缀`。
该前缀 `只` 在文本以 `聊天消息` 形式显示时插入。 */,
"language_value_common_prefix": "<orange>➜</orange> ",
"validator": {
/* 如果为 true,则在加载 `语言文件` 时 `校验` 每个 `语言值` 中 `参数` 的 `数量`。
如果为 false,则不进行任何校验。 */
"validate_arguments": true
}
},
"command": {
/* `命令助手` 功能为来自本模组的所有命令提供 `自动 /help 功能`。
它会动态探测可能的命令路径,并为用户提供实时的命令提示。
<green>注意:要不在重启服务器的情况下热切换该功能,请:
1. 执行 `/fuji reload` 命令,重载 `主控制文件`。
2. 执行 `/reload` 命令,重载 `所有命令`。 */
"assistant": {
"enable": true
/* 定义使用 `命令助手` 功能的要求。 */,
"requirement": {
"level_permission": 0
}
}
},
"permission": {
/* ◉ 本模组的权限系统是怎样的?
➜ 所有命令都使用原版 `权限等级`。
你可以在没有 `第三方权限模组` 的情况下使用本模组。
默认情况下,本模组的所有命令都以 `权限等级` 作为使用要求。
这让本模组在 `单人游戏` 世界中使用起来更方便。
➜ 命令分为两组。
本模组把命令分为 2 组,面向不同用户。
一组的用户是 `普通玩家`,这些命令需要 `0 级权限`。
一组的用户是 `管理员`,这些命令需要 `4 级权限`。
➜ 与 `LuckPerms` 模组集成。
一个典型用法是:
1. 把此项设为 `true`
2. 使用 `command_permission` 模块,为每条命令分配一个 `字符串权限`。 */
"all_commands_require_level_4_permission_to_use_by_default": false
},
"scheduler": {
/* `quartz` 库的日志级别。
建议把级别调到 `WARN` 以上,以免刷屏控制台。
可用级别:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF */
"logger_level": "WARN"
},
"formatter": {
"date_formatter": "yyyy-MM-dd HH:mm:ss"
},
"document": {
/* 如果为 true,则总是使用 `.jar` 文件中的 `内置文档字符串`。(以 `英文` 书写)
这样你总能看到 `最新版本` 的 `文档字符串`。
如果为 false,则使用 `config/fuji/languages/<默认语言>.json` 文件中的 `外部文档字符串`。 */
"always_use_built_in_doc_strings": true
}
},
"modules": {
"fuji": {
"enable": true
},
"language": {
"enable": true
},
"chat": {
"enable": false,
"style": {
"enable": true
},
"display": {
"enable": true
},
"history": {
"enable": true
},
"trigger": {
"enable": true
},
"replace": {
"enable": true
},
"mention": {
"enable": true
},
"spy": {
"enable": false
}
},
"placeholder": {
"enable": false
},
"predicate": {
"enable": false
},
"motd": {
"enable": false
},
"nametag": {
"enable": false
},
"tab": {
"enable": false
},
"tpa": {
"enable": false
},
"back": {
"enable": false
},
"home": {
"enable": false
},
"pvp": {
"enable": false
},
"afk": {
"enable": false,
"effect": {
"enable": true
}
},
"rtp": {
"enable": false
},
"works": {
"enable": false
},
"deathlog": {
"enable": false
},
"view": {
"enable": false
},
"echo": {
"enable": true,
"send_message": {
"enable": true
},
"send_broadcast": {
"enable": true
},
"send_actionbar": {
"enable": true
},
"send_title": {
"enable": true
},
"send_toast": {
"enable": true
},
"send_chat": {
"enable": true
},
"send_bossbar": {
"enable": true
},
"send_custom": {
"enable": true
},
"send_console": {
"enable": true
},
"send_dialog": {
"enable": true
}
},
"functional": {
"enable": false,
"workbench": {
"enable": false
},
"enchantment": {
"enable": false
},
"grindstone": {
"enable": false
},
"stonecutter": {
"enable": false
},
"anvil": {
"enable": false
},
"cartography": {
"enable": false
},
"enderchest": {
"enable": false
},
"smithing": {
"enable": false
},
"loom": {
"enable": false
}
},
"economy": {
"enable": false
},
"system_message": {
"enable": false
},
"cleaner": {
"enable": false
},
"world": {
"enable": false,
"border": {
"enable": true
}
},
"skin": {
"enable": false
},
"title": {
"enable": false
},
"leaderboard": {
"enable": false
},
"jail": {
"enable": false
},
"kit": {
"enable": false
},
"rank": {
"enable": false
},
"head": {
"enable": false
},
"color": {
"enable": false,
"sign": {
"enable": true
},
"anvil": {
"enable": true
}
},
"sit": {
"enable": false
},
"sign_editor": {
"enable": false
},
"teleport_warmup": {
"enable": false
},
"temp_ban": {
"enable": false
},
"anti_build": {
"enable": false
},
"warning": {
"enable": false
},
"maintenance": {
"enable": false
},
"command_scheduler": {
"enable": false
},
"command_permission": {
"enable": false
},
"command_rewrite": {
"enable": false
},
"command_alias": {
"enable": false
},
"command_bundle": {
"enable": false
},
"command_attachment": {
"enable": false
},
"command_interactive": {
"enable": false
},
"command_warmup": {
"enable": false
},
"command_cooldown": {
"enable": false
},
"command_toolbox": {
"enable": false,
"bed": {
"enable": false
},
"extinguish": {
"enable": false
},
"feed": {
"enable": false
},
"fly": {
"enable": false
},
"god": {
"enable": false
},
"hat": {
"enable": false
},
"heal": {
"enable": false
},
"itemname": {
"enable": false
},
"lore": {
"enable": false
},
"more": {
"enable": false
},
"ping": {
"enable": false
},
"realname": {
"enable": false
},
"nickname": {
"enable": false
},
"repair": {
"enable": false
},
"reply": {
"enable": false
},
"seen": {
"enable": false
},
"suicide": {
"enable": false
},
"top": {
"enable": false
},
"down": {
"enable": false
},
"trashcan": {
"enable": false
},
"tppos": {
"enable": false
},
"tphere": {
"enable": false
},
"warp": {
"enable": false
},
"burn": {
"enable": false
},
"help_op": {
"enable": false
},
"near": {
"enable": false
},
"jump": {
"enable": false
},
"compass": {
"enable": false
},
"glow": {
"enable": false
},
"freeze": {
"enable": false
},
"rules": {
"enable": false
},
"speed": {
"enable": false
},
"disconnect": {
"enable": false
},
"delete": {
"enable": false
}
},
"command_spy": {
"enable": false
},
"command_event": {
"enable": false
},
"command_debug": {
"enable": false
},
"command_advice": {
"enable": false
},
"command_state": {
"enable": false
},
"command_menu": {
"enable": false
},
"command_meta": {
"enable": false,
"run": {
"enable": false
},
"for_each": {
"enable": false
},
"one_of": {
"enable": false
},
"chain": {
"enable": false
},
"IF": {
"enable": false
},
"NOT": {
"enable": false
},
"AND": {
"enable": false
},
"OR": {
"enable": false
},
"nop": {
"enable": false
},
"delay": {
"enable": false
},
"json": {
"enable": false
},
"attachment": {
"enable": false
},
"shell": {
"enable": false
},
"when_online": {
"enable": false
}
},
"top_chunks": {
"enable": false
},
"world_downloader": {
"enable": false
},
"whitelist": {
"enable": false
},
"profiler": {
"enable": false
},
"launcher": {
"enable": false
},
"multiplier": {
"enable": false
},
"disabler": {
"enable": false,
"chat_speed_disabler": {
"enable": false
},
"move_speed_disabler": {
"enable": false
},
"move_wrongly_disabler": {
"enable": false
},
"max_player_disabler": {
"enable": false
}
},
"queue": {
"enable": false
},
"gameplay": {
"enable": false,
"multi_obsidian_platform": {
"enable": false
}
},
"doctor": {
"enable": true
},
"tester": {
"enable": false
},
"document": {
"enable": false
},
"evaluator": {
"enable": false
}
}
}◉ 本模组的命令权限是如何确定的?
- 每条命令在注册时都带有一个默认的
权限等级。 1.a. 检查config/fuji/config.json文件中all_commands_require_level_4_permission_to_use_by_default选项的值。 1.a.i. 如果为true,则本模组所有命令都以4 级权限等级注册。 1.a.ii. 如果为false,则本模组每条命令都以config/fuji/permission.json文件中定义的N 级权限等级注册。
◉ permission.json 文件是什么?
该文件用于定义本模组每条命令的 默认所需权限等级。
修改该文件后,执行 /reload 命令来重载所有命令。
该配置通常用于未安装 LuckPerms 模组的 单人游戏 世界。
如果你开的是专用 Minecraft 服务器,可能更想使用 command_permission 模块。
◉ 如果我想使用 LuckPerms 模组的 字符串权限 怎么办?
你可以使用 command_permission 模块。
该模块会为每条命令分配 字符串权限,并覆盖原本的(默认权限等级)要求。
换句话说,permission.json 中定义的 默认所需权限等级 会被 command_permission 模块覆盖。
默认内容(config/fuji/permission.json):
{
"default_level_permission": {
"commands": {}
}
}| 任务名 | 说明 |
|---|---|
FlushCacheJob |
把 缓存数据 从 内存 刷入 存储。缓存文件 位于 config/fuji/cache/ 目录。 |
CleanTTLMapJob |
清理 TTL Map 数据结构,移除 已过期的条目。TTL Map 用于 /command-callback 命令,存储 回调条目。注意:/command-callback 命令通常用于文本中的 点击事件。玩家需要有权限使用 /command-callback 命令,否则客户端会收到 Unknown Command Error(未知命令错误)。 |
| 参数类型 | 对应类 |
|---|---|
[biome] |
[BiomeId] |
[blockpos, block-pos] |
[BlockPos] |
[blockstate, block-state] |
[BlockState] |
[bool, boolean] |
[boolean, Boolean] |
[bossbar-color] |
[BossBarColor] |
[bossbar-style] |
[BossBarOverlay] |
[column-pos] |
[ColumnPos] |
| (无名称) | [CommandActor] |
| (无名称) | [CommandContext] |
[command-function] |
[CommandFunction] |
[dimension, world] |
[Dimension] |
[dimension-type, world-type] |
[DimensionType] |
[double] |
[double, Double] |
[dye-color] |
[DyeColor] |
[entity-anchor] |
[Anchor] |
[entity] |
[Entity] |
[entities] |
[EntityCollection] |
[entity-type] |
[NotSupportedType] |
[float] |
[float, Float] |
[float-range] |
[NotSupportedType] |
[fuji-identifier] |
[FujiIdentifier] |
[game-profile, profile] |
[GameProfileCollection] |
[gamemode] |
[GameType] |
[greedy-string, greedy] |
[GreedyString] |
[greedy-command-string] |
[GreedyCommandString] |
[greedy-string-list, greedy-list] |
[GreedyStringList] |
[id, identifier] |
[IdentifierIR] |
[int-range] |
[NotSupportedType] |
[int, integer] |
[int, Integer] |
[item-predicate] |
[Result] |
[item-slot] |
[SlotArgument] |
[item, itemstack] |
[ItemStackWrapper] |
[long] |
[long, Long] |
[nbt-compound] |
[CompoundTag] |
[nbt-element] |
[Tag] |
[nbt-path] |
[NbtPath] |
[offline-game-profile] |
[OfflineGameProfile] |
[offline-player] |
[OfflinePlayerName] |
[operation] |
[Operation] |
[particle-effect] |
[ParticleOptions] |
[player] |
[ServerPlayer] |
[players, player-list] |
[PlayerCollection] |
[rotation] |
[Coordinates] |
[scoreboard-criterion] |
[ObjectiveCriteria] |
[scoreboard-objective] |
[Objective] |
[scoreboard-slot] |
[DisplaySlot] |
| (无名称) | [CommandSourceStack] |
[slot-range] |
[SlotRange] |
[str, string] |
[String] |
[string-list] |
[StringList] |
[style] |
[Style] |
[team] |
[PlayerTeam] |
[color, team-color] |
[ChatFormatting] |
[text] |
[Component] |
[vec2f, vec2] |
[Vec2] |
[vec3d] |
[Vec3] |
[word] |
[Word] |
[step-type] |
[StepType] |
[duration] |
[Duration] |
本模块添加一个 检查器,用于判定玩家是否处于 Away From Keyboard(离开键盘,即暂离)状态。
在 afk 状态下:
- 你可以定义玩家
进入或离开该状态时执行的命令。 - 你可以定义该状态下的
显示名称。
➜ 跟踪最后操作时间
为每个玩家定义一个 数字,用于跟踪 最后操作时间。
操作 可以是:挖掘方块、移动、执行命令 等。
当收到来自某个玩家的 操作 时,更新该玩家的这个数字。
➜ 进入暂离状态
定义一个 任务,比较该 数字 的两个连续取值。
如果两次取值完全相同,就让该玩家 进入 afk 状态。
除此之外,玩家也可以用 /afk 命令手动进入该状态。
➜ 离开暂离状态
当收到来自某个玩家的 操作 时,会让该玩家 离开 afk 状态。
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/afk/config.json
{
/* 定义玩家处于 afk 状态时的 `显示名称`。 */
"afk_display_name_format": "<gray>[AFK] %player:displayname_visual%"
/* afk 检查器用于比较并标记玩家是否处于 afk 状态。 */,
"afk_checker": {
"cron": "0 0/5 * ? * *"
}
/* 定义玩家进入或离开 afk 状态时执行的命令。 */,
"afk_event": {
"on_enter_afk_commands": [
"send-broadcast <gold>Player %player:name% is now afk"
],
"on_leave_afk_commands": [
"send-broadcast <gold>Player %player:name% is no longer afk"
]
}
}| 任务名 | 说明 |
|---|---|
AfkCheckerJob |
该 任务 用于比较并标记玩家是否处于 afk 状态。 |
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/afk |
进入暂离状态。 | 否 | 0 |
/afk others <PlayerCollection others> |
进入暂离状态。 | 是 | 4 |
/is-afk? <ServerPlayer player> |
检测某玩家是否处于暂离状态。 | 是 | 4 |
本模块为处于 afk 状态的玩家施加 效果。
支持的效果有:
-
Invulnerable(无敌):处于 afk 状态的玩家不会被伤害。 -
Targetable(可被选为目标):处于 afk 状态的玩家不会被敌对实体选为目标。 -
Moveable(可被移动):处于 afk 状态的玩家不会被外力推动。(活塞、重力等)
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/afk/effect/config.json
{
"invulnerable": true,
"targetable": false,
"moveable": false
}本模块用于 禁止 玩家的特定 行为。
可禁止的 行为 包括:
- 破坏指定的方块。
- 放置指定的方块。
- 对指定物品进行交互。
- 对指定方块进行交互。
- 对指定实体进行交互。
- 攻击指定的实体。
◉ 禁止放置 TNT 方块
在配置文件的 place_block 列表中加入 minecraft:tnt。
◉ 禁止放置 TNT 方块,但允许玩家 Alice 使用它
为该玩家分配一个 绕过权限。
执行:/lp user Alice permission set fuji.anti_build.place_block.bypass.minecraft:tnt
◉ 显式地 禁止 或 允许 玩家 Alice 执行某个行为
为该玩家分配一个 覆盖权限。
执行:/lp user Alice permission set fuji.anti_build.break_block.override.minecraft:grass_block false
这将 禁止 玩家 Alice 破坏 minecraft:grass_block 方块。
执行:/lp user Alice permission set fuji.anti_build.break_block.override.minecraft:grass_block true
这将 允许 玩家 Alice 破坏 minecraft:grass_block 方块。
◉ 禁止放置 任何 方块
在配置文件的 place_block 列表中加入 *。
◉ 禁止在 minecraft:the_end(末地)维度放置 蘑菇 类方块
执行:
/lp group default permission set fuji.anti_build.place_block.override.minecraft:red_mushroom false world=the_end/lp group default permission set fuji.anti_build.place_block.override.minecraft:brown_mushroom false world=the_end
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/anti_build/config.json
{
"anti_action_types": {
"break_block": {
"enable": false,
"id": [
"minecraft:gold_block"
]
},
"place_block": {
"enable": false,
"id": [
"minecraft:tnt"
]
},
"interact_item": {
"enable": false,
"id": [
"minecraft:lava_bucket"
]
},
"interact_block": {
"enable": false,
"id": [
"minecraft:lever"
]
},
"interact_entity": {
"enable": false,
"id": [
"minecraft:villager"
]
},
"attack_entity": {
"enable": false,
"id": [
"minecraft:villager"
]
}
}
}本模块允许玩家 传送 到自己的 上一个位置。
上一个位置 可以是:
- 上次传送的位置。
- 上次死亡的位置。
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/back/config.json
{
/* 如果当前位置与最近压入的 `位置` 距离过 `近`,则不压入当前位置。 */
"do_not_push_back_location_if_closer_than_n_blocks": 32.0,
"push_back_location_on_player_death": true,
"push_back_location_on_player_teleport": true,
"max_number_of_back_locations_to_save": 3
}文件:config/fuji/modules/back/location-history.json
{
"player2history": {}
}| 任务名 | 说明 |
|---|---|
ConfigurationHandlerWriteStorageJob |
该 任务 用于把 数据 从 内存 写入 存储。注意:如果你在 磁盘 上修改了该 文件,需要尽快执行 /fuji reload。注意:触发 该任务时,磁盘 上的文件会被 覆盖。 |
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/back |
传送到位置历史记录中的上 一个 位置。 |
否 | 0 |
/back 1 <Dimension targetDimension> |
传送到位置历史记录中指定 维度 的上 一个 位置。 |
否 | 0 |
/back <int lastNLocation> |
传送到位置历史记录中上 N 个位置。 |
否 | 0 |
/back <int lastNLocation> <Dimension targetDimension> |
传送到位置历史记录中指定 维度 的上 N 个位置。 |
否 | 0 |
/back clear <ServerPlayer player> |
清空位置历史记录。 | 是 | 4 |
/back clear others <PlayerCollection others> |
清空位置历史记录。 | 是 | 4 |
/back list |
列出位置历史记录中的位置。 | 否 | 0 |
/back list <ServerPlayer player> |
列出位置历史记录中的位置。 | 是 | 4 |
/back push |
把当前位置压入位置历史记录。 | 否 | 4 |
/back push others <PlayerCollection others> |
把当前位置压入位置历史记录。 | 是 | 4 |
本模块为原版 Minecraft 的 聊天 系统提供相关功能。
◉ 与其他 聊天相关 模组的兼容性问题
原版 Minecraft 的聊天系统没有标准 API 可供交互,这让 聊天相关模组 之间的兼容问题更难解决。
我已尽力以最兼容的方式编写代码。如果任何 chat 子模块无法工作,欢迎提交 issue。
本模块允许玩家向 他人 展示 自己的东西。
可以展示的 东西 包括:
- 主手物品。
- 自己的背包。
- 自己的末影箱。
◉ 更高级的 服务端 展示类模组
新模组 https://modrinth.com/mod/showcase 已发布,可以看看。
◉ 把本模块与其他 聊天相关 模组集成
➜ 通过 占位符 方式集成
你可以使用 chat.replace 模块。
该模块可用于定义 聊天文本 替换:
- 把聊天文本中的
item替换为%fuji:item%占位符。 - 把聊天文本中的
inv替换为%fuji:inv%占位符。 - 把聊天文本中的
ender替换为%fuji:ender%占位符。
➜ 通过 命令 方式集成
你可以使用 chat.trigger 模块。
该模块可用于定义 聊天字符串 触发器:
- 当
触发器被触发时,执行/run as fake-op %player:name% chat display item命令。 - 当
触发器被触发时,执行/run as fake-op %player:name% chat display inv命令。 - 当
触发器被触发时,执行/run as fake-op %player:name% chat display ender命令。
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/chat/display/config.json
{
/* 已创建的 `展示` 的过期时长。 */
"expiration_duration_seconds": 3600
}| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/chat display ender |
向他人展示你的末影箱。 | 否 | 0 |
/chat display inv |
向他人展示你的背包。 | 否 | 0 |
/chat display item |
向他人展示你的主手物品。 | 否 | 0 |
| 占位符 | 说明 |
|---|---|
fuji:item |
创建一个 物品展示,并返回用于打开该展示的 可点击 文本。 |
fuji:inv |
创建一个 背包展示,并返回用于打开该展示的 可点击 文本。 |
fuji:ender |
创建一个 末影箱展示,并返回用于打开该展示的 可点击 文本。 |
本模块为原版 Minecraft 的 聊天 系统提供 历史记录 功能。
➜ 存储玩家发送的 聊天文本
当玩家发送一条聊天文本时,把它存储起来。
➜ 把 聊天文本 还原给新加入的玩家
当玩家加入服务器时,把所有已存储的聊天文本发送给该玩家。
一条 聊天消息 = 聊天类型 + 聊天内容 + 聊天参数。
在原版 Minecraft 中,所有 聊天消息 都在同一个共享频道中发送。
acceptors(接受器)与 rejectors(拒绝器)用于 筛选 我们关心的 聊天消息。
引入它们是为了改善与其他聊天相关模组的兼容性。
-
聊天类型接受器依据聊天类型过滤聊天消息。 -
聊天内容拒绝器依据聊天内容过滤聊天消息。 -
聊天参数拒绝器依据聊天参数过滤聊天消息。
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/chat/history/config.json
{
/* 聊天历史记录中存储的聊天文本最大数量。 */
"max_chat_history_size": 50
/* 如果玩家发送的 `聊天文本` 的 `消息类型` 属于已定义的类型之一,则它会被 `存储`。 */,
"message_type_acceptors": [
"minecraft:chat",
"minecraft:say_command",
"minecraft:emote_command",
"fuji:chat_server",
"fuji:chat_client",
"styled_chat:generic_hack"
]
/* 如果玩家发送的 `聊天文本` 满足已定义的任一拒绝器,则它会被 `忽略`。 */,
"message_rejectors": {
/* 如果玩家发送的 `聊天文本` 的 `内容` 匹配任一已定义的拒绝器,则它会被 `忽略`。 */
"content_rejector": {
"matches": []
}
/* 如果玩家发送的 `聊天文本` 的 `参数` 匹配任一已定义的拒绝器,则它会被 `忽略`。 */,
"parameter_rejector": {
"matches": [
".*literal\\{PM\\}.*"
]
}
}
}| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/chat history forget |
忘记聊天历史记录。 | 是 | 4 |
本模块允许玩家在聊天中 提及 其他在线玩家:
- 名称高亮:被提及玩家的名字会被醒目地高亮显示。
- 声音提醒:被提及的玩家会收到声音提醒。
◉ 本模块与 Styled Chat 模组只能部分兼容
你可以在装有该模组的情况下使用本模块。
它能工作,但聊天中不会渲染出 被提及的玩家。
其他功能如 声音提醒 仍然有效。
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/chat/mention/config.json
{
"mention_player": {
/* `声音` 的标识符。 */
"sound": "entity.experience_orb.pickup",
"volume": 100.0,
"pitch": 1.0
/* 播放该声音的次数。 */,
"repeat_count": 3
/* 每次播放声音之间的间隔。 */,
"interval_ms": 1000
}
/* 玩家被 `提及` 时在 `聊天消息` 中使用的格式。 */,
"mention_format": "<aqua>@%s</aqua>"
}本模块允许你把 聊天字符串 替换为给定的 聊天文本(包含占位符解析)。
也就是说,本模块可以用 指定的文本 替换 聊天字符串,并支持 占位符 解析。
◉ 本模块无法与 Styled Chat 模组一起工作
chat.replace 模块可以与 chat.style 模块配合使用。
但如果你在使用 Styled Chat 模组,它就不会生效。
不过,Styled Chat 模组允许你自定义 表情(emotions)。
所以如果你在用该模组,可以 禁用 本模块。
◉ 定义一个聊天快捷方式,用于求值占位符
- 正则:
(?<=^|\s)uuid(?=\s|$) - 替换为:
my uuid is %player:uuid%
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/chat/replace/config.json
{
/* 定义用于替换 `聊天字符串` 的 `正则` 表达式。 */
"replace": {
"rules": [
{
/* 用于匹配 `目标字符串` 的 `模式字符串`。 */
"regex": "(?<=^|\\s)item(?=\\s|$)"
/* 用于替换 `匹配到的目标字符串` 的 `替换字符串`。 */,
"replacement": "%fuji:item%"
},
{
/* 用于匹配 `目标字符串` 的 `模式字符串`。 */
"regex": "(?<=^|\\s)inv(?=\\s|$)"
/* 用于替换 `匹配到的目标字符串` 的 `替换字符串`。 */,
"replacement": "%fuji:inv%"
},
{
/* 用于匹配 `目标字符串` 的 `模式字符串`。 */
"regex": "(?<=^|\\s)ender(?=\\s|$)"
/* 用于替换 `匹配到的目标字符串` 的 `替换字符串`。 */,
"replacement": "%fuji:ender%"
},
{
/* 用于匹配 `目标字符串` 的 `模式字符串`。 */
"regex": "(?<=^|\\s)pos(?=\\s|$)"
/* 用于替换 `匹配到的目标字符串` 的 `替换字符串`。 */,
"replacement": "%fuji:pos%"
},
{
/* 用于匹配 `目标字符串` 的 `模式字符串`。 */
"regex": "(?<=^|\\s)uuid(?=\\s|$)"
/* 用于替换 `匹配到的目标字符串` 的 `替换字符串`。 */,
"replacement": "<green>My uuid is %player:uuid%</green>"
}
]
}
}本模块允许监听指定的 聊天消息类型(主要是私聊消息类型)。
在 Fabric 平台上,想找一个好的 聊天监听(chat spy)实现并不容易。
在原版 Minecraft 中,每条聊天消息都带有自己的 消息类型。
你可以依据 消息类型 识别出 私聊。
不过并非所有其他聊天模组都遵守这一点。
你可以执行 /fuji debug 开启 调试模式,观察 chat.spy 模块的实际工作方式。
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/chat/spy/config.json
{
/* 只接受并监听 `消息类型` 符合以下 `白名单` 的 `消息`。 */
"message_type": {
"acceptors": [
"minecraft:msg_command_incoming"
]
}
/* 不应监听 `连续相同的文本`。 */,
"ignore_consecutive_same_text": true
/* 是否也把监听到的内容记录到 `控制台`? */,
"log_console": false
}文件:config/fuji/modules/chat/spy/data.json
{
/* 按玩家保存的选项。 */
"options": {}
}| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/chat spy toggle |
为你自己启用/禁用聊天监听模式。 | 否 | 4 |
本模块允许自定义 全局聊天样式。
此外,玩家可以使用 /chat style 命令配置自己的 个人聊天样式。
如果你在使用 Styled Chat 模组,可以 禁用 本模块,因为二者 目的 相同。
fuji 提供的 chat.style 模块比较简单。
如果你想要高级的聊天功能,可以使用 Styled Chat 模组。
如果你想要 /mute、/tempmute 命令,可以使用 BanHammer 模组。
提示:即使你在使用 Styled Chat 模组,仍然可以使用 fuji 的 chat.* 系列模块。
大多数 chat.* 模块在设计上都能与其他 聊天相关模组 配合,尤其是 Styled Chat 模组。
- 你可以使用
样式标签定义复杂的格式。 - 你可以为所有玩家定义
全局格式。 - 玩家可以用
/chat style命令设置自己的个人格式。 - 本模块在设计上可与其他
聊天相关模组配合。 - 你可以用权限控制玩家能使用哪些样式标签。
语言语法参见:
你需要安装 luckperms 模组来提供 前缀 和 后缀 功能。
安装后,执行 /lp group default meta setprefix <yellow>[awesome] 来设置 前缀。
要使用该 前缀,请使用占位符 %fuji:player_prefix%。
参见:https://luckperms.net/wiki/Prefixes,-Suffixes-&-Meta
执行:/chat style set prefix + %message% + suffix
执行:/lp group default permission set fuji.style.chat.blue
执行:/lp group default permission set fuji.style.chat.b
全部标签也包括 <click> 这类危险标签——点击后会执行命令!
执行:/lp group default permission set fuji.style.chat.*
你可能想启用 placeholder 模块,以获得更多有用的占位符。
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/chat/style/chat.json
{
/* 每个玩家的聊天内容格式。 */
"format": {
"player2format": {
"Steve": "<#FFC7EA>%message%"
}
}
}文件:config/fuji/modules/chat/style/config.json
{
/* 自定义 `聊天样式`。 */
"style": {
/* `发送者` 组件使用的 `格式`。 */
"sender": "<#B1B2FF>[%fuji:player_playtime%🔥 %fuji:player_mined%⛏ %fuji:player_placed%🔳 %fuji:player_killed%🗡 %fuji:player_moved%🌍]<reset> <<dark_green><click:suggest_command:'/msg %player:name% '><hover:show_text:'Time: %fuji:date%<newline><italic>Click to Message'>%player:displayname_visual%</hover></click></dark_green>> "
/* `内容` 组件使用的 `格式`。 */,
"content": "%s"
}
}| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/chat style reset |
重置你的个人聊天内容格式。 | 否 | 0 |
/chat style reset others <PlayerCollection others> |
重置你的个人聊天内容格式。 | 是 | 4 |
/chat style set <GreedyString format> |
设置你的个人聊天内容格式。例如:/chat style set prefix + %message% + suffix
|
否 | 0 |
/chat style set others <PlayerCollection others> <GreedyString format> |
设置你的个人聊天内容格式。例如:/chat style set prefix + %message% + suffix
|
是 | 4 |
本模块允许在聊天中定义能够 执行命令 的 魔法咒语。
chat.replace 中的 正则 用于在 给定字符串 中 查找 目标模式。
chat.trigger 中的 正则 用于把目标模式与 给定字符串 进行 匹配。
你可以像其他游戏里的 !report、!noclip 那样定义 聊天命令。
◉ 在聊天字符串中定义一个简单的魔法咒语
- 正则:
magic - 命令:
say magic!
◉ 在聊天字符串中定义带参数的复杂魔法咒语
- 正则:
i am (.+) - 命令:
say You just said: $0say Hello $1
◉ 配合 Styled Chat 模组,为聊天展示模块定义快捷方式
- 正则:
(?<=^|\s)item(?=\s|$) - 命令:
run as fake-op %player:name% chat display item
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/chat/trigger/config.json
{
/* 使用 `正则` 表达式定义 `触发器`。 */
"triggers": [
{
"chat_string_regex": "magic",
"commands": [
"say magic!"
]
},
{
"chat_string_regex": "i am (.+)",
"commands": [
"say You just said: $0",
"say Hello $1"
]
},
{
"chat_string_regex": "(?<=^|\\s)item(?=\\s|$)",
"commands": [
"run as fake-op %player:name% chat display item"
]
},
{
"chat_string_regex": "(?<=^|\\s)inv(?=\\s|$)",
"commands": [
"run as fake-op %player:name% chat display inv"
]
},
{
"chat_string_regex": "(?<=^|\\s)ender(?=\\s|$)",
"commands": [
"run as fake-op %player:name% chat display ender"
]
}
]
}本模块提供一个 实体清理器。
它监控指定的条件,并 清理 那些 符合已定义规则 的实体。
◉ 原版 Minecraft 的 物品实体 消失机制
在 原版 Minecraft 中,所有 物品实体 会在 6000 tick(5 分钟)后自动消失。
大多数情况下,原版的 物品消失机制 已足够满足需求。
强烈建议只在处理 特殊情况 时才使用 cleaner 模块。
例如,你的玩家建了一个 大型刷怪塔,产生了过量的 末影珍珠。
你可以定义一个 清理匹配器 来匹配 末影珍珠 实体。
◉ cleaner 模块的清理范围
本模块只针对 实体。
它不能用于清理 方块 或 方块实体。
注意:在 Minecraft 内部,方块实体 并不是真正的 实体。
◉ 支持的 清理方式
-
KILL:像死亡一样移除实体,会触发实体死亡事件。(会掉落战利品。) -
DELETE:通过删除来移除实体,不触发任何事件。(不会掉落战利品。)
注意:对于 物品实体,两种可用清理方式没有明显区别。
◉ 什么是 可翻译键(translatable key)?
可翻译键 是 Minecraft 内部用于引用 物品、方块类物品 以及其他 实体 的标识符。
它对应 Minecraft 语言文件 中定义的键。
一个语言文件示例见:https://github.com/fuji-fabric/fuji/blob/dev/.github/files/en_us.json
常见的键格式包括:
item.minecraft.*block.minecraft.*entity.minecraft.*
◉ 定义 匹配器 来清理 物品实体
匹配器 通过 可翻译键 来标识实体。
- 对
minecraft:gold_ingot物品实体,键为item.minecraft.gold_ingot - 对
minecraft:gold_block物品实体,键为block.minecraft.gold_block
尽管方块类物品的键以 block. 开头,它指的仍是物品堆为 minecraft:gold_block 的 物品实体。
◉ 定义 匹配器 来清理 生物实体
要启用对生物实体的清理:
- 把
ignore_living_entity设为false。 - 为目标实体定义
匹配器,例如:entity.minecraft.skeleton。
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/cleaner/config.json
{
/* 触发实体 `清理器` 的 `cron` 表达式。 */
"cron": "0 * * ? * * *"
/* 忽略且永不移除符合该条件的实体。 */,
"ignore": {
"ignore_item_entity": false,
"ignore_living_entity": true,
"ignore_named_entity": true,
"ignore_entity_with_vehicle": true,
"ignore_entity_with_passengers": true,
"ignore_glowing_entity": true,
"ignore_leashed_entity": true
}
/* `可翻译键` 到 `年龄` 的映射。
`可翻译键` 定义了应该移除哪个 `实体`。
`存活 ticks` 表示我们 `只` 移除 `年龄` 大于该值的实体。
`年龄` 的单位是 `游戏刻`(20 刻 = 1 秒)。 */,
"matchers": [
{
"enable": false,
"translatable_key": "block.minecraft.sand",
"lives_longer_than_age": 1200,
"cleanup_method": "DELETE"
},
{
"enable": false,
"translatable_key": "item.minecraft.ender_pearl",
"lives_longer_than_age": 1200,
"cleanup_method": "DELETE"
},
{
"enable": false,
"translatable_key": "block.minecraft.white_carpet",
"lives_longer_than_age": 1200,
"cleanup_method": "DELETE"
},
{
"enable": false,
"translatable_key": "block.minecraft.cobblestone",
"lives_longer_than_age": 1200,
"cleanup_method": "DELETE"
},
{
"enable": false,
"translatable_key": "entity.minecraft.skeleton",
"lives_longer_than_age": 1200,
"cleanup_method": "KILL"
}
]
}| 任务名 | 说明 |
|---|---|
CleanerJob |
该 任务 用于自动执行 /cleaner clean 命令。 |
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/cleaner clean |
执行实体清理;如果有实体被移除,会生成一份清理报告。 | 是 | 4 |
本模块在一些 地方 引入 样式标签。
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/color/config.json
{
"rewrite": {
"rules": [
{
/* 用于匹配 `目标字符串` 的 `模式字符串`。 */
"regex": "&0"
/* 用于替换 `匹配到的目标字符串` 的 `替换字符串`。 */,
"replacement": "<black>"
},
{
/* 用于匹配 `目标字符串` 的 `模式字符串`。 */
"regex": "&1"
/* 用于替换 `匹配到的目标字符串` 的 `替换字符串`。 */,
"replacement": "<dark_blue>"
},
{
/* 用于匹配 `目标字符串` 的 `模式字符串`。 */
"regex": "&2"
/* 用于替换 `匹配到的目标字符串` 的 `替换字符串`。 */,
"replacement": "<dark_green>"
},
{
/* 用于匹配 `目标字符串` 的 `模式字符串`。 */
"regex": "&3"
/* 用于替换 `匹配到的目标字符串` 的 `替换字符串`。 */,
"replacement": "<dark_aqua>"
},
{
/* 用于匹配 `目标字符串` 的 `模式字符串`。 */
"regex": "&4"
/* 用于替换 `匹配到的目标字符串` 的 `替换字符串`。 */,
"replacement": "<dark_red>"
},
{
/* 用于匹配 `目标字符串` 的 `模式字符串`。 */
"regex": "&5"
/* 用于替换 `匹配到的目标字符串` 的 `替换字符串`。 */,
"replacement": "<dark_purple>"
},
{
/* 用于匹配 `目标字符串` 的 `模式字符串`。 */
"regex": "&6"
/* 用于替换 `匹配到的目标字符串` 的 `替换字符串`。 */,
"replacement": "<gold>"
},
{
/* 用于匹配 `目标字符串` 的 `模式字符串`。 */
"regex": "&7"
/* 用于替换 `匹配到的目标字符串` 的 `替换字符串`。 */,
"replacement": "<gray>"
},
{
/* 用于匹配 `目标字符串` 的 `模式字符串`。 */
"regex": "&8"
/* 用于替换 `匹配到的目标字符串` 的 `替换字符串`。 */,
"replacement": "<dark_gray>"
},
{
/* 用于匹配 `目标字符串` 的 `模式字符串`。 */
"regex": "&9"
/* 用于替换 `匹配到的目标字符串` 的 `替换字符串`。 */,
"replacement": "<blue>"
},
{
/* 用于匹配 `目标字符串` 的 `模式字符串`。 */
"regex": "&a"
/* 用于替换 `匹配到的目标字符串` 的 `替换字符串`。 */,
"replacement": "<green>"
},
{
/* 用于匹配 `目标字符串` 的 `模式字符串`。 */
"regex": "&b"
/* 用于替换 `匹配到的目标字符串` 的 `替换字符串`。 */,
"replacement": "<aqua>"
},
{
/* 用于匹配 `目标字符串` 的 `模式字符串`。 */
"regex": "&c"
/* 用于替换 `匹配到的目标字符串` 的 `替换字符串`。 */,
"replacement": "<red>"
},
{
/* 用于匹配 `目标字符串` 的 `模式字符串`。 */
"regex": "&d"
/* 用于替换 `匹配到的目标字符串` 的 `替换字符串`。 */,
"replacement": "<light_purple>"
},
{
/* 用于匹配 `目标字符串` 的 `模式字符串`。 */
"regex": "&e"
/* 用于替换 `匹配到的目标字符串` 的 `替换字符串`。 */,
"replacement": "<yellow>"
},
{
/* 用于匹配 `目标字符串` 的 `模式字符串`。 */
"regex": "&f"
/* 用于替换 `匹配到的目标字符串` 的 `替换字符串`。 */,
"replacement": "<white>"
},
{
/* 用于匹配 `目标字符串` 的 `模式字符串`。 */
"regex": "&k"
/* 用于替换 `匹配到的目标字符串` 的 `替换字符串`。 */,
"replacement": "<obf>"
},
{
/* 用于匹配 `目标字符串` 的 `模式字符串`。 */
"regex": "&l"
/* 用于替换 `匹配到的目标字符串` 的 `替换字符串`。 */,
"replacement": "<b>"
},
{
/* 用于匹配 `目标字符串` 的 `模式字符串`。 */
"regex": "&m"
/* 用于替换 `匹配到的目标字符串` 的 `替换字符串`。 */,
"replacement": "<st>"
},
{
/* 用于匹配 `目标字符串` 的 `模式字符串`。 */
"regex": "&n"
/* 用于替换 `匹配到的目标字符串` 的 `替换字符串`。 */,
"replacement": "<u>"
},
{
/* 用于匹配 `目标字符串` 的 `模式字符串`。 */
"regex": "&o"
/* 用于替换 `匹配到的目标字符串` 的 `替换字符串`。 */,
"replacement": "<i>"
},
{
/* 用于匹配 `目标字符串` 的 `模式字符串`。 */
"regex": "&r"
/* 用于替换 `匹配到的目标字符串` 的 `替换字符串`。 */,
"replacement": "<r>"
}
]
}
}本模块在 铁砧方块 中引入 样式标签。
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/color/anvil/config.json
{
/* 默认情况下,任何玩家都可以使用 `所有样式标签`。
启用该选项后,玩家需要拥有 `对应权限` 才能使用该 `样式标签`。
例如,使用 `<red>` 标签需要 `fuji.style.anvil.red` 权限。 */
"requires_corresponding_permission_to_use_style_tag": false
}本模块在 告示牌方块 中引入 样式标签。
◉ 你可以在告示牌上书写 样式标签
例如:<red>、<rb>、<bold> 和 <i>。
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/color/sign/config.json
{
/* 默认情况下,任何玩家都可以使用 `所有样式标签`。
启用该选项后,玩家需要拥有 `对应权限` 才能使用该 `样式标签`。
例如,使用 `<red>` 标签需要 `fuji.style.sign.red` 权限。 */
"requires_corresponding_permission_to_use_style_tag": false
}本模块允许你用指定的 命令 来 装饰 一个已存在的 目标命令。
命令装饰(command advice)是 目标命令 的 修饰器。
它可以借助 命令 来 修改 已存在 目标命令 的 效果,而无需改动目标命令原本的 定义。
-
BEFORE_EXECUTION:在目标命令执行之前执行指定命令。(前提是该次执行没有被其他 advice取消。) -
AFTER_EXECUTION:在目标命令执行之后执行指定命令(无论执行结果是SUCCESS(成功)还是FAILURE(失败))。 -
ON_EXECUTION_SUCCESS:如果目标命令的执行结果为SUCCESS(返回值 > 0),则执行指定命令。 -
ON_EXECUTION_FAILURE:如果目标命令的执行结果为FAILURE(返回值 = 0),则执行指定命令。 -
ON_EXECUTION_CANCELLED:如果目标命令的执行被其他 advice取消,则执行指定命令。 -
CANCEL_AS_SUCCESS:取消目标命令的执行,并把它视为SUCCESS(返回值 = 1)。 -
CANCEL_AS_FAILURE:取消目标命令的执行,并把它视为FAILURE(返回值 = 0)。 -
CANCEL_IF_ANY_SUCCESS:如果任意一条指定命令为 SUCCESS,则取消目标命令的执行,并把它视为FAILURE(返回值 = 0)。 -
CANCEL_IF_ALL_SUCCESS:如果所有指定命令都为 SUCCESS,则取消目标命令的执行,并把它视为FAILURE(返回值 = 0)。
◉ 装饰 一个已存在的目标命令
参见默认配置中 /heal 命令的示例。
◉ 取消 目标命令的执行,改为执行指定命令
参见默认配置中 /say 命令的示例。
◉ 确保目标命令只在满足指定 条件 时执行,并在执行成功时扣除 代价
参见默认配置中 /repair 命令的示例:
- 使用
CANCEL_IF_ANY_SUCCESSadvice 类型来检查条件。 - 使用
ON_EXECUTION_CANCELLEDadvice 类型,在条件不满足时给用户发送反馈。 - 使用
ON_EXECUTION_SUCCESSadvice 类型,为目标命令的执行扣除代价。
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/command_advice/config.json
{
/* 为 `目标命令` 定义 `advice`。 */
"advices": [
{
"enable": true,
"document": "在 `/heal` 命令执行后生成一个爱心粒子。",
"matcher": {
/* 用于匹配 `目标命令` 的 `正则` 表达式。 */
"command_string_regex": "heal",
"accept_player_command_source": true,
"accept_console_command_source": false
}
/* 该 advice 的类型。 */,
"advice_type": "AFTER_EXECUTION"
/* `执行` 该 `advice` 时要运行的命令。 */,
"commands": [
"say Display the heard particle for player %player:name%",
"run as fake-op %player:name% --silent true particle minecraft:heart ~ ~1 ~ 0.6 0.6 0.6 0 20 force %player:name%"
]
},
{
"enable": true,
"document": "把 `/say` 命令的执行替换为 `/send-broadcast` 命令。",
"matcher": {
/* 用于匹配 `目标命令` 的 `正则` 表达式。 */
"command_string_regex": "say (.+)",
"accept_player_command_source": true,
"accept_console_command_source": true
}
/* 该 advice 的类型。 */,
"advice_type": "CANCEL_AS_SUCCESS"
/* `执行` 该 `advice` 时要运行的命令。 */,
"commands": [
"send-broadcast <rb>[My Server]</rb> $1"
]
},
{
"enable": false,
"document": "把 `/msg` 命令的执行替换为自己 DIY 的 `/send-message` 命令。",
"matcher": {
/* 用于匹配 `目标命令` 的 `正则` 表达式。 */
"command_string_regex": "(?:msg|tell) (\\S+?) (.+)",
"accept_player_command_source": true,
"accept_console_command_source": false
}
/* 该 advice 的类型。 */,
"advice_type": "CANCEL_AS_SUCCESS"
/* `执行` 该 `advice` 时要运行的命令。 */,
"commands": [
"send-message %player:name% <green>[PM] You -> $1: $2",
"send-message $1 <green>[PM] %player:name% -> you: $2"
]
},
{
"enable": true,
"document": "在 `/repair` 命令执行前打印一条消息。",
"matcher": {
/* 用于匹配 `目标命令` 的 `正则` 表达式。 */
"command_string_regex": "repair",
"accept_player_command_source": true,
"accept_console_command_source": false
}
/* 该 advice 的类型。 */,
"advice_type": "BEFORE_EXECUTION"
/* `执行` 该 `advice` 时要运行的命令。 */,
"commands": [
"send-message %player:name% <pink>Before the execution of `/repair` command for %player:name%"
]
},
{
"enable": true,
"document": "在 `/repair` 命令执行后打印一条消息。",
"matcher": {
/* 用于匹配 `目标命令` 的 `正则` 表达式。 */
"command_string_regex": "repair",
"accept_player_command_source": true,
"accept_console_command_source": false
}
/* 该 advice 的类型。 */,
"advice_type": "AFTER_EXECUTION"
/* `执行` 该 `advice` 时要运行的命令。 */,
"commands": [
"send-message %player:name% <pink>After the execution of `/repair` command for %player:name%"
]
},
{
"enable": true,
"document": "如果玩家背包中没有所需物品,则取消 `/repair` 命令的执行。",
"matcher": {
/* 用于匹配 `目标命令` 的 `正则` 表达式。 */
"command_string_regex": "repair",
"accept_player_command_source": true,
"accept_console_command_source": false
}
/* 该 advice 的类型。 */,
"advice_type": "CANCEL_IF_ANY_SUCCESS"
/* `执行` 该 `advice` 时要运行的命令。 */,
"commands": [
"NOT has-item? %player:name% minecraft:iron_ingot 16",
"NOT has-item? %player:name% minecraft:gold_ingot 16"
]
},
{
"enable": true,
"document": "当 `/repair` 命令的执行被取消时,发送一条反馈消息。",
"matcher": {
/* 用于匹配 `目标命令` 的 `正则` 表达式。 */
"command_string_regex": "repair",
"accept_player_command_source": true,
"accept_console_command_source": false
}
/* 该 advice 的类型。 */,
"advice_type": "ON_EXECUTION_CANCELLED"
/* `执行` 该 `advice` 时要运行的命令。 */,
"commands": [
"send-message %player:name% <red>You need `iron_ingot x 16` and `gold_ingot x 16` to use the `/repair` command."
]
},
{
"enable": true,
"document": "当 `/repair` 命令执行成功时,从玩家背包中扣除所需物品。",
"matcher": {
/* 用于匹配 `目标命令` 的 `正则` 表达式。 */
"command_string_regex": "repair",
"accept_player_command_source": true,
"accept_console_command_source": false
}
/* 该 advice 的类型。 */,
"advice_type": "ON_EXECUTION_SUCCESS"
/* `执行` 该 `advice` 时要运行的命令。 */,
"commands": [
"send-message %player:name% The `/repair` command execution result is `SUCCESS`, I will take `iron_ingot x 16` and `gold_ingot x 16` from your inventory.",
"clear %player:name% minecraft:iron_ingot 16",
"clear %player:name% minecraft:gold_ingot 16"
]
},
{
"enable": true,
"document": "当 `/repair` 命令的执行结果为 FAILURE 时,打印一条消息。",
"matcher": {
/* 用于匹配 `目标命令` 的 `正则` 表达式。 */
"command_string_regex": "repair",
"accept_player_command_source": true,
"accept_console_command_source": false
}
/* 该 advice 的类型。 */,
"advice_type": "ON_EXECUTION_FAILURE"
/* `执行` 该 `advice` 时要运行的命令。 */,
"commands": [
"send-message %player:name% The `/repair` command execution result is `FAILURE`, I will do nothing."
]
},
{
"enable": true,
"document": "取消危险的 `/kill @e` 命令。",
"matcher": {
/* 用于匹配 `目标命令` 的 `正则` 表达式。 */
"command_string_regex": "kill @e",
"accept_player_command_source": true,
"accept_console_command_source": true
}
/* 该 advice 的类型。 */,
"advice_type": "CANCEL_AS_FAILURE"
/* `执行` 该 `advice` 时要运行的命令。 */,
"commands": [
"send-message %player:name% <red>The `/kill @e` command should be used with a filter."
]
},
{
"enable": true,
"document": "为 `/view inv <player>` 命令添加 `豁免` 功能。",
"matcher": {
/* 用于匹配 `目标命令` 的 `正则` 表达式。 */
"command_string_regex": "view inv (.+)",
"accept_player_command_source": true,
"accept_console_command_source": false
}
/* 该 advice 的类型。 */,
"advice_type": "CANCEL_IF_ANY_SUCCESS"
/* `执行` 该 `advice` 时要运行的命令。 */,
"commands": [
"has-perm? $1 your.custom.permission"
]
},
{
"enable": true,
"document": "为 `/view inv <player>` 命令添加 `豁免` 功能。",
"matcher": {
/* 用于匹配 `目标命令` 的 `正则` 表达式。 */
"command_string_regex": "view inv (.+)",
"accept_player_command_source": true,
"accept_console_command_source": false
}
/* 该 advice 的类型。 */,
"advice_type": "ON_EXECUTION_CANCELLED"
/* `执行` 该 `advice` 时要运行的命令。 */,
"commands": [
"send-message %player:name% <red>You can't view the inventory of $1 player, it's exempted."
]
},
{
"enable": false,
"document": "禁止在 minecraft:the_end 维度使用 `/home set` 命令。",
"matcher": {
/* 用于匹配 `目标命令` 的 `正则` 表达式。 */
"command_string_regex": "home set (.+)",
"accept_player_command_source": true,
"accept_console_command_source": false
}
/* 该 advice 的类型。 */,
"advice_type": "CANCEL_IF_ANY_SUCCESS"
/* `执行` 该 `advice` 时要运行的命令。 */,
"commands": [
"is-in-world? %player:name% minecraft:the_end"
]
},
{
"enable": false,
"document": "禁止在 minecraft:the_end 维度使用 `/home set` 命令。",
"matcher": {
/* 用于匹配 `目标命令` 的 `正则` 表达式。 */
"command_string_regex": "home set (.+)",
"accept_player_command_source": true,
"accept_console_command_source": false
}
/* 该 advice 的类型。 */,
"advice_type": "ON_EXECUTION_CANCELLED"
/* `执行` 该 `advice` 时要运行的命令。 */,
"commands": [
"send-message %player:name% <red>You can't set a home in %world:id% dimension."
]
}
]
}本模块允许为 一个已存在的目标命令 定义 别名。
定义出的 别名命令 会重定向到对应的已存在命令节点。
command_alias 命令只能定义 一条新命令 作为 已有命令 的别名。
它通过 命令重定向 实现。
你无法用 command_alias 模块真正定义 一条带参数的新命令,这是它的短板。
如果你想定义 带参数的新命令,请参考 command_bundle 模块。
简而言之:
- 想定义
不带参数的简单命令,用command_alias模块。 - 想定义
带参数的复杂命令,用command_bundle模块。
◉ 定义 新的快捷命令 作为 已有命令 的别名
例如:
- 定义一条新
/r命令,作为/reply命令的别名。 - 定义一条新
/sudo命令,作为/run as fake-op命令的别名。
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/command_alias/config.json
{
/* 为 `已有命令` 定义的 `别名`。 */
"alias_commands": [
{
"enable": true,
"document": "创建一条从 `/r` 指向 `/reply` 命令的别名命令。",
"requirement": {
"level": 0,
"string": null
}
/* `源命令` 的 `路径`。 */,
"from": [
"r"
]
/* `目标命令` 的 `路径`。 */,
"to": [
"reply"
]
},
{
"enable": true,
"document": "创建一条从 `/display` 指向 `/chat display` 命令的别名命令。",
"requirement": {
"level": 0,
"string": null
}
/* `源命令` 的 `路径`。 */,
"from": [
"display"
]
/* `目标命令` 的 `路径`。 */,
"to": [
"chat",
"display"
]
},
{
"enable": true,
"document": "创建一条从 `/sudo` 指向 `/run as fake-op` 命令的别名命令。",
"requirement": {
"level": 4,
"string": null
}
/* `源命令` 的 `路径`。 */,
"from": [
"sudo"
]
/* `目标命令` 的 `路径`。 */,
"to": [
"run",
"as",
"fake-op"
]
},
{
"enable": true,
"document": "创建一条从 `/wb` 指向 `/workbench` 命令的别名命令。",
"requirement": {
"level": 4,
"string": null
}
/* `源命令` 的 `路径`。 */,
"from": [
"wb"
]
/* `目标命令` 的 `路径`。 */,
"to": [
"workbench"
]
},
{
"enable": true,
"document": "创建一条从 `/ec` 指向 `/enderchest` 命令的别名命令。",
"requirement": {
"level": 4,
"string": null
}
/* `源命令` 的 `路径`。 */,
"from": [
"ec"
]
/* `目标命令` 的 `路径`。 */,
"to": [
"enderchest"
]
},
{
"enable": true,
"document": "创建一条从 `/invsee` 指向 `/view inv` 命令的别名命令。",
"requirement": {
"level": 4,
"string": null
}
/* `源命令` 的 `路径`。 */,
"from": [
"invsee"
]
/* `目标命令` 的 `路径`。 */,
"to": [
"view",
"inv"
]
},
{
"enable": true,
"document": "创建一条从 `/endersee` 指向 `/view ender` 命令的别名命令。",
"requirement": {
"level": 4,
"string": null
}
/* `源命令` 的 `路径`。 */,
"from": [
"endersee"
]
/* `目标命令` 的 `路径`。 */,
"to": [
"view",
"ender"
]
}
]
}| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/command-alias list |
列出服务器中所有已注册的别名命令。 | 是 | 4 |
/display |
创建一条从 /display 指向 /chat display 命令的别名命令。 |
是 | 0 |
/ec |
创建一条从 /ec 指向 /enderchest 命令的别名命令。 |
是 | 4 |
/endersee |
创建一条从 /endersee 指向 /view ender 命令的别名命令。 |
是 | 4 |
/invsee |
创建一条从 /invsee 指向 /view inv 命令的别名命令。 |
是 | 4 |
/r |
创建一条从 /r 指向 /reply 命令的别名命令。 |
是 | 0 |
/sudo |
创建一条从 /sudo 指向 /run as fake-op 命令的别名命令。 |
是 | 4 |
/wb |
创建一条从 /wb 指向 /workbench 命令的别名命令。 |
是 | 4 |
本模块允许把命令 附着 到各种 对象 上:
- 物品堆
- 方块
- 实体
- ...
当你把命令附着到一个物品上时,我们会在该物品的 NBT 中保存一个 绑定 ID。
NBT 数据中带有相同 绑定 ID 的所有物品,共享同一个 绑定命令实例。
-
item:LEFT_CLICK、RIGHT_CLICK、ANY_CLICK、SWAP_HAND -
block:LEFT_CLICK、RIGHT_CLICK、ANY_CLICK、STEP_ON -
entity:RIGHT_CLICK、ANY_CLICK
你可以使用 kit 模块。
kit 模块会保存物品 NBT。
所以如果你定义一个 kit,把 附着了命令的物品 放进去,然后把该 kit 发给玩家,玩家就会得到这个魔法物品。
你可以用 command_cooldown 模块创建一个 命名冷却。
命名冷却 可以限制指定命令的 使用间隔 与 使用次数。
然后用 command_attachment 模块把 命名冷却测试命令 附着到 物品 上。
◉ 制作一根魔法棒,点击时治疗玩家
执行 /command-attachment attach-item-one heal
◉ 制作一根魔法棒,效果为:
- 左键点击时给予钻石 × 1。(限制使用 3 次)
- 右键点击时给予金锭 × 1。(限制使用 5 次)
执行以下命令:
/command-attachment attach-item-one --maxUseTimes 3 --interactType LEFT_CLICK give %player:name% minecraft:diamond 1/command-attachment attach-item-one --maxUseTimes 5 --interactType RIGHT_CLICK give %player:name% minecraft:gold_ingot 1
◉ 制作一根魔法棒,给予苹果 × 1,限制使用 3 次,并且不消耗该物品
执行:/command-attachment attach-item-one --maxUseTimes 3 --destroyItem false give %player:name% minecraft:apple 1。
◉ 查询某个物品上附着的命令
执行 /command-attachment query-item。
◉ 让一个实体被右键点击时打招呼
执行:/command-attachment attach-entity-one <entity-id> say hello %player:name%
◉ 制作一个传送门方块
执行:/command-attachment attach-block-one 0 0 0 --interactType STEP_ON tppos --targetPlayer %player:name% --dimension minecraft:the_end --x 0 --y 66 --z 0 %player:name%。
◉ 查看并编辑附着的对象
执行:/command-attachment editor
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/command_attachment/command-attachment-data.json
{
"nodes": []
}文件:config/fuji/modules/command_attachment/config.json
{
"test_stepping_on_block_interval_in_mill_seconds": 100
}| 任务名 | 说明 |
|---|---|
ConfigurationHandlerWriteStorageJob |
该 任务 用于把 数据 从 内存 写入 存储。注意:如果你在 磁盘 上修改了该 文件,需要尽快执行 /fuji reload。注意:触发 该任务时,磁盘 上的文件会被 覆盖。 |
TestSteppingOnBlockJob |
该 任务 用于检测玩家是否正踩在带有 附着了命令 的 方块 上。 |
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/command-attachment attach-block-one <BlockPos blockPos> [InteractType interactType] [Integer maxUseTimes] [ExecuteAsType executeAsType] <GreedyCommandString command> |
把一条命令附着到指定方块上。 | 否 | 4 |
/command-attachment attach-entity-one <Entity entity> [InteractType interactType] [Integer maxUseTimes] [ExecuteAsType executeAsType] <GreedyCommandString command> |
把一条命令附着到实体上。 | 否 | 4 |
/command-attachment attach-item-one [InteractType interactType] [Integer maxUseTimes] [ExecuteAsType executeAsType] [Boolean destroyItem] <GreedyCommandString command> |
把一条命令附着到物品上。 | 否 | 4 |
/command-attachment detach-block-all <BlockPos blockPos> [Boolean confirm] |
移除该方块上附着的所有命令。 | 否 | 4 |
/command-attachment detach-entity-all <Entity entity> [Boolean confirm] |
移除该实体上附着的所有命令。 | 否 | 4 |
/command-attachment detach-item-all [Boolean confirm] |
移除该物品上附着的所有命令。 | 否 | 4 |
/command-attachment editor |
打开命令附着编辑器。 | 否 | 4 |
/command-attachment query-block <BlockPos blockPos> |
查询该方块上附着的所有命令。 | 是 | 4 |
/command-attachment query-entity <Entity entity> |
查询该实体上附着的所有命令。 | 是 | 4 |
/command-attachment query-item |
查询该物品上附着的所有命令。 | 否 | 4 |
| 参数类型 | 对应类 |
|---|---|
[execute-as-type] |
[ExecuteAsType] |
[interact-type] |
[InteractType] |
本模块允许 创建 一条新命令(称为 bundle 命令 或 模板命令)。
这条新命令由已存在的命令组合而成。
它可以接受 用户自定义参数 与 占位符。
本模块可以当作一套通用的 命令模板 系统来使用。
- 提供用户友好的 DSL,便于轻松创建
新的自定义命令。 - 支持
用户自定义变量、占位符以及原版目标选择器。 - 支持复杂的
参数类型:必填参数、字面量参数,甚至带指定默认值的可选参数。 - 强大的
类型系统,可使用内置的参数类型。 - 无需重启服务器即可动态注册与注销
自定义命令。
要创建一条新命令,你需要指定以下内容:
- 命令的
head(头部):描述你的新命令长什么样。 - 命令的
body(主体):描述你的新命令被执行时应该执行哪些命令。
head 由 命令节点 组成。
例如,head 实例 first second third 描述了一条命令 /first second third。
它由三个 命令节点 组成,全部都是 字面量参数。
参数 有 3 种类型:
-
字面量参数(Literal Argument):可以直接写出来。例如first、second、third和claim-kit都是字面量参数。 -
必填参数(Required Argument):语法为<参数类型 参数名>。例如<int age>描述一个必填参数,其参数类型为 int、参数名为 age。 -
可选参数(Optional Argument):语法为[参数类型 参数名 默认值]。它类似必填参数,但当命令来源未指定该参数时,你可以提供一个默认值。
你可以在 body 组件中 引用 必填参数 或 可选参数 的值。
例如,写下 $age 即可引用 head 组件中名为 age 的 变量。
◉ head 组件使用的是什么 类型系统?
本模组会为特定的 参数类型 注册一个 参数类型适配器。
你可以执行 /fuji inspect argument-types 列出所有已注册的 适配器。
该界面中列出的任何 参数类型 你都可以使用。
body 组件简单得多。
它只是一个已有命令的列表。
你可以在 body 组件中直接写任何已有的 Minecraft 命令。
除此之外,你也可以在 body 组件中写入 占位符。
◉ body 组件中的命令如何执行?
当一条 bundle 命令 被执行时,body 组件中写下的命令会自上而下依次执行。
所有命令都以控制台身份执行。
如有需要,你可以使用 /run as player 或 /run as fake-op 切换命令执行上下文。
无论上一条命令执行成功与否,下一条命令都会 照常 执行。
如有需要,你可以使用 /chain 或 /IF 实现顺序执行的模型。
你可以使用命令生成器来获得强大的命令:
https://www.gamergeeks.net/apps/minecraft/particle-command-generator
◉ 用 bundle 命令 装饰一个已存在的目标命令
在本例中,我们要注册一条新命令 /composite-heal,用来 装饰 已有的 /heal 命令。
装饰内容为:
- 在
/heal命令执行前say。 - 在
/heal命令执行前生成爱心粒子。 - 在
/heal命令执行后say。
Head:composite-heal
Body:
say before heal %player:name%run as fake-op %player:name% particle minecraft:heart ~ ~2 ~run as player %player:name% healsay after heal %player:name%
◉ 把 bundle 命令 当作模板命令使用
在本例中,我们要注册一条新命令 /warn,作为某个具体命令实例的 模板。
Head:warn <player player-arg> <greedy greedy-arg>
Body:
send-message $player-arg <red>You are warned: $greedy-arg
◉ 用 bundle 命令 包装一个具体的命令实例
在本例中,假设你想允许玩家使用 /give @s minecraft:apple。
你只想允许玩家获得免费的 苹果,而不希望让玩家随意使用 /give 命令。
那么,你可以定义一条类似 /free-apple 的 bundle 命令,来 包装 /give 命令的某个具体实例。
Head:free-apple
Body:
run as fake-op %player:name% give @s minecraft:apple
◉ 查看更高级的示例
默认配置文件中包含一组 高级示例。
你会看到其中预定义了许多 bundle 命令,尤其是 /my-command 系列示例。
此外,还预定义了一组方便使用的 bundle 命令,例如:/gmc、/gms、/day、/sun 等。
◉ 变换命令形式
-
/blocknbt->/data get block -
/entitynbt->/data get entity -
/gm、/gms和/gmc->/gamemode -
/findbiome->/locate biome -
/flyspeed->/attribute Alice minecraft:generic.flying_speed -
/walkspeed->/attribute Alice minecraft:movement_speed -
/maxhealth->/attribute Alice minecraft:generic.max_health -
/groundclean->/kill @e[type=...] -
/spawnmob->/summon -
/shoot-> 带初速度的/summon -
/smite和/thunder->/summon minecraft:lighting_bolt
◉ 定义一条 /tpw 命令,把玩家传送到指定维度
Head:my-tp resource-world
Body:
run as fake-op %player:name% tppos --centerX 0 --centerZ 0 --maxRange 128 --dimension fuji:overworld
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/command_bundle/config.json
{
"bundle_commands": [
{
"enable": true,
"document": "该命令用于测试 `可选参数`。",
"requirement": {
"level": 4,
"string": null
},
"head": "my-command a-command-with-optional-arg <int int-arg-name> [str str-arg-name this is the default value]",
"body": [
"say hello %player:name%",
"say int is $int-arg-name",
"say str is $str-arg-name"
]
},
{
"enable": true,
"document": "该命令用于测试 `字面量参数` 和 `必填参数`。",
"requirement": {
"level": 4,
"string": null
},
"head": "my-command a-command-with-required-arg first-literal second-literal <str str-arg-name>",
"body": [
"say hello %player:name%",
"say str is $str-arg-name"
]
},
{
"enable": true,
"document": "该命令用于测试 `贪心字符串` 参数类型。",
"requirement": {
"level": 4,
"string": null
},
"head": "my-command a-command-with-a-greedy-string <int int-arg-name> first-literal [greedy-string greedy-string-arg-name this is the default value]",
"body": [
"say hello %player:name%",
"say int is $int-arg-name",
"say str is $greedy-string-arg-name"
]
},
{
"enable": true,
"document": "该命令用于测试 `字面量参数`、`必填参数` 和 `可选参数`。",
"requirement": {
"level": 4,
"string": null
},
"head": "my-command a-command-with-all-types-of-args <int int-arg-name> first-literal [str str-arg-name the default value can contains placeholder %player:name% in %world:name%]",
"body": [
"say hello %player:name%",
"say int is $int-arg-name",
"say str is $str-arg-name"
]
},
{
"enable": true,
"document": "该命令是 `/gamemode` 的别名",
"requirement": {
"level": 4,
"string": null
},
"head": "gm <gamemode gamemode-arg>",
"body": [
"run as player %player:name% gamemode $gamemode-arg"
]
},
{
"enable": true,
"document": "该命令是 `/gamemode creative` 的别名",
"requirement": {
"level": 4,
"string": null
},
"head": "gmc",
"body": [
"run as player %player:name% gamemode creative"
]
},
{
"enable": true,
"document": "该命令是 `/gamemode survival` 的别名",
"requirement": {
"level": 4,
"string": null
},
"head": "gms",
"body": [
"run as player %player:name% gamemode survival"
]
},
{
"enable": true,
"document": "该命令是 `/gamemode spectator` 的别名",
"requirement": {
"level": 4,
"string": null
},
"head": "gmsp",
"body": [
"run as player %player:name% gamemode spectator"
]
},
{
"enable": true,
"document": "该命令是 `/weather clear` 的别名",
"requirement": {
"level": 4,
"string": null
},
"head": "sun",
"body": [
"run as player %player:name% weather clear"
]
},
{
"enable": true,
"document": "该命令是 `/weather rain` 的别名",
"requirement": {
"level": 4,
"string": null
},
"head": "rain",
"body": [
"run as player %player:name% weather rain"
]
},
{
"enable": true,
"document": "该命令是 `/weather thunder` 的别名",
"requirement": {
"level": 4,
"string": null
},
"head": "thunder",
"body": [
"run as player %player:name% weather thunder"
]
},
{
"enable": true,
"document": "该命令是 `/time set day` 的别名",
"requirement": {
"level": 4,
"string": null
},
"head": "day",
"body": [
"run as player %player:name% time set day"
]
},
{
"enable": true,
"document": "该命令是 `/time set night` 的别名",
"requirement": {
"level": 4,
"string": null
},
"head": "night",
"body": [
"run as player %player:name% time set night"
]
},
{
"enable": true,
"document": "该命令是 `/time set midnight` 的别名",
"requirement": {
"level": 4,
"string": null
},
"head": "midnight",
"body": [
"run as player %player:name% time set midnight"
]
},
{
"enable": true,
"document": "该命令是 `/time set noon` 的别名",
"requirement": {
"level": 4,
"string": null
},
"head": "noon",
"body": [
"run as player %player:name% time set noon"
]
},
{
"enable": true,
"document": "该命令是 `/data get entity` 的别名",
"requirement": {
"level": 4,
"string": null
},
"head": "nbt entity <entity target>",
"body": [
"run as fake-op %player:name% data get entity $target"
]
},
{
"enable": true,
"document": "该命令是 `/data get block` 的别名",
"requirement": {
"level": 4,
"string": null
},
"head": "nbt block <block-pos target>",
"body": [
"run as fake-op %player:name% data get block $target"
]
},
{
"enable": true,
"document": "该命令是 `/data get entity @s SelectedItem` 的别名",
"requirement": {
"level": 4,
"string": null
},
"head": "nbt item",
"body": [
"run as fake-op %player:name% data get entity %player:name% SelectedItem"
]
},
{
"enable": true,
"document": "该命令是致敬 Bukkit 中 `/plugins` 的彩蛋。",
"requirement": {
"level": 0,
"string": null
},
"head": "plugins",
"body": [
"send-message %player:name% Server Plugins (0): "
]
},
{
"enable": true,
"document": "该命令是致敬 Bukkit 中 `/icanhasbukkit` 的彩蛋。",
"requirement": {
"level": 0,
"string": null
},
"head": "icanhasbukkit",
"body": [
"send-message %player:name% <i>Checking version, please wait...",
"delay 2 send-message %player:name% This server is running Bukkit version (MC: %server:version%)",
"delay 3 send-message %player:name% <green>You are running the latest version"
]
},
{
"enable": true,
"document": "该命令召唤一个指定实体类型的实体,并带有初始速度。",
"requirement": {
"level": 4,
"string": null
},
"head": "shoot <entity-type entity-type-arg-name>",
"body": [
"execute as %player:name% run summon $entity-type-arg-name ~ ~1 ~ {ExplosionPower:4,Motion:[3.0,0.0,0.0]}"
]
},
{
"enable": true,
"document": "该命令召唤一个 lightning_bolt 实体。",
"requirement": {
"level": 4,
"string": null
},
"head": "strike",
"body": [
"execute as %player:name% at @s run summon lightning_bolt ^ ^ ^32"
]
},
{
"enable": true,
"document": "该命令为手上的物品施加 `unbreakable`(无法破坏)附魔。",
"requirement": {
"level": 4,
"string": null
},
"head": "unbreakable",
"body": [
"run as player %player:name% enchant %player:name% minecraft:unbreaking"
]
},
{
"enable": true,
"document": "该命令修改你的 movement_speed 属性。",
"requirement": {
"level": 4,
"string": null
},
"head": "move-speed set <double double-arg>",
"body": [
"run as player %player:name% attribute %player:name% minecraft:generic.movement_speed base set $double-arg"
]
},
{
"enable": true,
"document": "该命令修改你的 movement_speed 属性。",
"requirement": {
"level": 4,
"string": null
},
"head": "move-speed reset",
"body": [
"run as player %player:name% attribute %player:name% minecraft:generic.movement_speed base set 0.10000000149011612"
]
},
{
"enable": true,
"document": "该命令会向他人自我介绍。",
"requirement": {
"level": 4,
"string": null
},
"head": "introduce-me",
"body": [
"run as fake-op %player:name% me i am %player:name%"
]
},
{
"enable": true,
"document": "该命令会掷一个随机骰子。",
"requirement": {
"level": 4,
"string": null
},
"head": "dice",
"body": [
"say %player:name% just roll out %fuji:random 1 7% points."
]
},
{
"enable": true,
"document": "该命令会把 `所有` 配方给予玩家。",
"requirement": {
"level": 4,
"string": null
},
"head": "obtain-all-recipes",
"body": [
"run as fake-op %player:name% recipe give %player:name% *"
]
},
{
"enable": true,
"document": "该命令会给予指定玩家的头颅。",
"requirement": {
"level": 4,
"string": null
},
"head": "skull <offline-player offline-player-arg>",
"body": [
"give %player:name% minecraft:player_head[minecraft:profile=$offline-player-arg]"
]
},
{
"enable": true,
"document": "该命令会打印指定玩家的 UUID。",
"requirement": {
"level": 4,
"string": null
},
"head": "uuid <player target>",
"body": [
"run as fake-op $target send-message %player:name% <yellow>The UUID of player $target is %fuji:escape player:uuid 2%"
]
},
{
"enable": true,
"document": "该命令什么都不做,并把 `SUCCESS` 作为返回值。",
"requirement": {
"level": 4,
"string": null
},
"head": "success",
"body": [
"nop"
]
},
{
"enable": true,
"document": "该命令什么都不做,并把 `FAILURE` 作为返回值。",
"requirement": {
"level": 4,
"string": null
},
"head": "failure",
"body": [
"NOT nop"
]
},
{
"enable": true,
"document": "这是一条自定义判定命令。",
"requirement": {
"level": 4,
"string": null
},
"head": "is-rich? <player target>",
"body": [
"say The commands are executed one by one from up to down.",
"say The last command's return value is the final return value of the entire bundle command.",
"has-item? $target minecraft:gold_ingot 2048"
]
}
]
}| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/command-bundle list |
列出服务器中所有已注册的 bundle 命令。 | 是 | 4 |
/command-bundle register |
注册 bundle 命令配置文件中定义的所有命令。 | 是 | 4 |
/command-bundle un-register |
注销服务器中所有已注册的 bundle 命令。 | 是 | 4 |
/day |
该命令是 /time set day 的别名 |
是 | 4 |
/dice |
该命令会掷一个随机骰子。 | 是 | 4 |
/failure |
该命令什么都不做,并把 FAILURE 作为返回值。 |
是 | 4 |
/gm <GameType gamemode-arg> |
该命令是 /gamemode 的别名 |
是 | 4 |
/gmc |
该命令是 /gamemode creative 的别名 |
是 | 4 |
/gms |
该命令是 /gamemode survival 的别名 |
是 | 4 |
/gmsp |
该命令是 /gamemode spectator 的别名 |
是 | 4 |
/icanhasbukkit |
该命令是致敬 Bukkit 中 /icanhasbukkit 的彩蛋。 |
是 | 0 |
/introduce-me |
该命令会向他人自我介绍。 | 是 | 4 |
/is-rich? <ServerPlayer target> |
这是一条自定义判定命令。 | 是 | 4 |
/midnight |
该命令是 /time set midnight 的别名 |
是 | 4 |
/move-speed reset |
该命令修改你的 movement_speed 属性。 | 是 | 4 |
/move-speed set <double double-arg> |
该命令修改你的 movement_speed 属性。 | 是 | 4 |
/my-command a-command-with-a-greedy-string <int int-arg-name> first-literal [GreedyString greedy-string-arg-name] |
该命令用于测试 贪心字符串 参数类型。 |
是 | 4 |
/my-command a-command-with-all-types-of-args <int int-arg-name> first-literal [String str-arg-name] |
该命令用于测试 字面量参数、必填参数 和 可选参数。 |
是 | 4 |
/my-command a-command-with-optional-arg <int int-arg-name> [String str-arg-name] |
该命令用于测试 可选参数。 |
是 | 4 |
/my-command a-command-with-required-arg first-literal second-literal <String str-arg-name> |
该命令用于测试 字面量参数 和 必填参数。 |
是 | 4 |
/nbt block <BlockPos target> |
该命令是 /data get block 的别名 |
是 | 4 |
/nbt entity <Entity target> |
该命令是 /data get entity 的别名 |
是 | 4 |
/nbt item |
该命令是 /data get entity @s SelectedItem 的别名 |
是 | 4 |
/night |
该命令是 /time set night 的别名 |
是 | 4 |
/noon |
该命令是 /time set noon 的别名 |
是 | 4 |
/obtain-all-recipes |
该命令会把 所有 配方给予玩家。 |
是 | 4 |
/plugins |
该命令是致敬 Bukkit 中 /plugins 的彩蛋。 |
是 | 0 |
/rain |
该命令是 /weather rain 的别名 |
是 | 4 |
/shoot <NotSupportedType entity-type-arg-name> |
该命令召唤一个指定实体类型的实体,并带有初始速度。 | 是 | 4 |
/skull <OfflinePlayerName offline-player-arg> |
该命令会给予指定玩家的头颅。 | 是 | 4 |
/strike |
该命令召唤一个 lightning_bolt 实体。 | 是 | 4 |
/success |
该命令什么都不做,并把 SUCCESS 作为返回值。 |
是 | 4 |
/sun |
该命令是 /weather clear 的别名 |
是 | 4 |
/thunder |
该命令是 /weather thunder 的别名 |
是 | 4 |
/unbreakable |
该命令为手上的物品施加 unbreakable(无法破坏)附魔。 |
是 | 4 |
/uuid <ServerPlayer target> |
该命令会打印指定玩家的 UUID。 | 是 | 4 |
本模块允许为命令执行定义 冷却。
1. 未命名冷却(Unnamed Cooldown)
你可以用它为指定命令定义 冷却时长。(它会自动被 检测 与管理)
未命名冷却 在服务器关闭时 不会 被 持久化。
它的典型用途是为指定命令定义 冷却时长。
当玩家执行命令时,未命名冷却 会被自动 检测。
例如:为 /back 命令定义 3 秒 的冷却时长。
要定义 未命名冷却,你需要修改配置文件,并执行 /fuji reload 命令使其生效。
2. 命名冷却(Named Cooldown)
你必须用命令来创建 命名冷却,并用命令来 检测 它。
命名冷却 在服务器关闭时 会 被 持久化。
它的典型用途是定义一个 命名冷却,并把它 关联 到 任意命令实例。
例如,你需要用 /command-cooldown create 来 创建 一个 命名冷却。
然后,你需要用 /command-cooldown test 来手动 检测 一个 命名冷却。
检测 一个 命名冷却 时,你必须指定 失败时的命令 与 成功时的命令。
如果满足 命名冷却 定义的 条件,则属于 成功情形,否则属于 失败情形。
对于 成功情形,我们会执行 成功时的命令。
对于 失败情形,我们会执行 失败时的命令。
一句话总结:如果你只是想为某个命令定义简单的 冷却时长,直接使用 未命名冷却 即可。
◉ 创建一个 命名冷却(冷却时长 3 秒)
执行:/command-cooldown create kitfood 3000
◉ 用 任意命令实例 检测一个 命名冷却
执行:/command-cooldown test kitfood Alice say Used successfully once。
该命令会 检测 指定的 命名冷却:
- 如果结果是
成功情形,它会执行/say Used successfully once。 - 如果结果是
失败情形,它什么都不做。
执行:/command-cooldown test kitfood Alice --onFailed "say false" say true
该命令会 检测 指定的 命名冷却:
- 如果结果是
成功情形,它会执行/say true。 - 如果结果是
失败情形,它会执行/say false。
提示:你可以插入 %fuji:command_cooldown_left_time kitfood% 占位符来显示剩余时长。
提示:要在 成功时的命令 或 失败时的命令 位置指定 多条命令,可以使用 chain 模块。
◉ 用 预定义命令实例 检测一个 命名冷却
你可以在配置文件中 预先定义 成功情形命令 与 失败情形命令。
然后使用 /command-cooldown try-use kitfood Alice 来 检测 它。
这种方式简捷得多。
◉ 为某个玩家重置 命名冷却
执行:/command-cooldown reset kitfood Alice
◉ 创建一个 命名冷却(冷却时长 15 秒,使用次数上限 为 3)
执行:/command-cooldown create kitfood 15000 --maxUses 3
◉ 创建一个全局 命名冷却
默认情况下,命名冷却 按 每个玩家 独立计算。
全局 命名冷却则按 每台服务器 计算。
执行:/command-cooldown create kitfood 3000 --global true
◉ 创建一个 非持久化的命名冷却
默认情况下,命名冷却 会被 持久化 到 存储 中。
不过,你可以创建一个 非持久化命名冷却。
执行:/command-cooldown create kitfood 999999999999 --persistent false
这个冷却意味着:每次服务器重启后它只能被使用一次。
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/command_cooldown/config.json
{
"admin_players_can_bypass": false
/* `未命名冷却` 按 `每个玩家` 独立生效。
定义用于匹配 `目标命令` 的 `正则` 表达式,
以及该 `目标命令` 的 `冷却毫秒数`。 */,
"unnamed_cooldown": {
"chunks.*": 60000,
"rtp.*": 60000,
"download.*": 120000,
"heal.*": 10000
}
/* `命名冷却` 由 `/command-cooldown create` 命令创建。 */,
"named_cooldown": {
"list": {}
}
}文件:config/fuji/modules/command_cooldown/named-cooldown-data.json
{
"nodes": []
}| 任务名 | 说明 |
|---|---|
ConfigurationHandlerWriteStorageJob |
该 任务 用于把 数据 从 内存 写入 存储。注意:如果你在 磁盘 上修改了该 文件,需要尽快执行 /fuji reload。注意:触发 该任务时,磁盘 上的文件会被 覆盖。 |
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/command-cooldown create <String name> <long cooldownDuration> [Integer maxUses] [Boolean persistent] [Boolean global] |
创建一个命名冷却。 | 是 | 4 |
/command-cooldown delete <NamedCooldownDescriptor namedCooldown> [Boolean confirm] |
删除一个命名冷却。 | 是 | 4 |
/command-cooldown list |
列出所有 未命名冷却 与 命名冷却。 |
是 | 4 |
/command-cooldown reset <NamedCooldownDescriptor namedCooldown> <ServerPlayer player> |
重置某个玩家某个命名冷却的 上次使用时间。 |
是 | 4 |
/command-cooldown test <NamedCooldownDescriptor namedCooldown> <ServerPlayer player> [StringList onFailed] <GreedyCommandString onSuccess> |
用 任意命令实例 检测一个命名冷却,并执行 成功情形命令 或 失败情形命令。 |
是 | 4 |
/command-cooldown try-use <NamedCooldownDescriptor namedCooldown> <ServerPlayer player> |
用 预定义命令实例 检测一个命名冷却,并执行 成功情形命令 或 失败情形命令。 |
是 | 4 |
| 占位符 | 说明 |
|---|---|
fuji:command_cooldown_left_time |
以 1d2h3m4s 格式返回 指定命名冷却 的 剩余冷却时长。例如你有一个名为 kitfood 的 命名冷却,可以使用:%fuji:command_cooldown_left_time kitfood%
|
fuji:command_cooldown_left_time_date |
返回 指定命名冷却 的 下次可用日期。例如你有一个名为 kitfood 的 命名冷却,可以使用:%fuji:command_cooldown_left_time_date kitfood%
|
fuji:command_cooldown_left_usage |
以整数返回 指定命名冷却 的 剩余可用次数。例如你有一个名为 kitfood 的 命名冷却,可以使用:%fuji:command_cooldown_left_usage kitfood%
|
| 参数类型 | 对应类 |
|---|---|
[named-command-cooldown] |
[NamedCooldownDescriptor] |
本模块为命令执行提供调试工具。
◉ 执行指定命令并查看调试信息
执行 /command-debug has-exp? Alice 100
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/command-debug <GreedyCommandString command> |
(原文未提供说明) | 是 | 4 |
本模块允许定义 命令 来响应目标 事件。
当关心的事件发生时,指定命令会作为响应被执行。
当关心的事件发生时,本模块会以控制台身份为该事件执行指定命令。
该 事件 中的 上下文玩家 会被用作 占位符上下文,用于解析 命令字符串 中的 占位符。
◉ 玩家加入时发送消息
你可以用 /send-custom 或 /send-message 在玩家加入时发送消息。
◉ 执行命令欢迎新玩家
你可以使用玩家首次加入事件。
例如:
send-broadcast <light_purple>Welcome new player %player:name% to join us!kit give %player:name% <kit-name>send-custom as-message %player:name% new-player-guiderun as fake-op %player:name% rtpdelay 10 spawnpoint %player:name%
◉ 把死亡的玩家传送到指定位置
你可以使用玩家死亡事件。
run as fake-op %player:name% tppos --dimension minecraft:overworld --x 32 --y 64 --z 128
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/command_event/config.json
{
/* 定义在 `特定事件` 发生时执行的 `命令`。 */
"event": {
"on_player_death": {
"enable": true,
"commands": [
"send-actionbar %player:name% <pink>You just died."
]
},
"after_player_break_block": {
"enable": true,
"commands": [
"send-actionbar %player:name% <pink>You just broke a block."
]
},
"after_player_place_block": {
"enable": true,
"commands": [
"send-actionbar %player:name% <pink>You just placed a block."
]
},
"after_player_respawn": {
"enable": true,
"commands": [
"give %player:name% minecraft:apple 1"
]
},
"after_player_change_world": {
"enable": true,
"commands": [
"send-actionbar %player:name% <pink>You are in %world:id% dimension now!"
]
},
"on_player_first_joined": {
"enable": true,
"commands": [
"send-broadcast <yellow>Welcome new player %player:name% to join us!"
]
},
"on_player_joined": {
"enable": true,
"commands": [
"send-title %player:name% --mainTitle \"<yellow>Welcome to the server.\""
]
},
"on_player_left": {
"enable": true,
"commands": [
"send-broadcast <dark_grey>%player:name% left the server."
]
},
"on_server_started": {
"enable": false,
"commands": [
"send-broadcast <pink>The server is started."
]
},
"on_server_stopping": {
"enable": false,
"commands": [
"send-broadcast <pink>The server is stopping."
]
}
}
}原文:https://fuji-fabric.github.io/Modules/command_interactive
本模块允许在 告示牌方块 上 书写 命令,之后通过 点击 告示牌来执行。
如果玩家 右键点击 一个 告示牌方块。
我们会检查 正面文本 中是否包含 / 字符。
如果包含,我们就视为该玩家发出了该命令。
包含 / 字符的 告示牌方块 被称为 交互式告示牌方块。
你可以用 右键点击 来执行交互式告示牌上写下的命令。
你可以用 Shift + 右键点击 来编辑 交互式告示牌方块。
你可以在第一个 / 字符之前写一些注释文本。
4 行内容会被拼接起来,当作一整行长文本处理。
所以要小心 空格字符,并忽略 换行符。
本模块允许定义可执行命令的 菜单 GUI。
菜单 是一个虚拟的 容器 GUI。
虚拟 GUI 由 槽位 组成。
槽位 用于放置一个 物品堆。
GUI 的 最小尺寸 为 9 x 1 = 9 个槽位。
GUI 的 最大尺寸 为 9 x 6 = 54 个槽位。
简而言之,你可以定义一个 菜单 来容纳 槽位,并把 命令 绑定到这些 槽位 上。
command_menu 模块提供一个名为 onSneakingAndSwapHandsEvent 的事件。
当玩家按下 SHIFT + F 键时它会触发。
你可以在配置文件中配置该事件。
/command-menu open 命令是 管理员级 命令。
你需要用 command_bundle 模块来创建一条 用户级 命令。
绑定到 槽位 的所有命令都以 控制台身份 执行。
你可能需要 command_meta.run 模块来修改 命令上下文:
/run as console <cmd>/run as player %player:name% <cmd>/run as fake-op %player:name% <cmd>
你可以使用 /run as fake-op %player:name% command-menu close %player:name% 命令,为某个 玩家 关闭 已 打开的 GUI。
感谢 Hitnam,我们有了 command_menu 模块的 在线编辑器。
工具地址:https://fuji-command-menu-editor-k4k4.vercel.app/
你可以直接修改该槽位的 item 属性。
item 的语法与 /give <item> 命令相同。
注意:不同 MC 版本的数据格式可能不同。
/give @s minecraft:player_head[minecraft:profile=Steve]/give @s minecraft:player_head{SkullOwner:"Steve"}
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/command_menu/config.json
{
"onSneakingAndSwapHandsEvent": {
"enable": true,
"commands": [
"command-menu open %player:name% example-menu"
]
}
}文件:config/fuji/modules/command_menu/menus.json
{
/* 已定义的 `菜单`。 */
"menus": {
"another-menu": {
/* 该 GUI 的 `标题`。 */
"title": "<blue>Another menu."
/* 取值范围 [1, 6] */,
"lines": 2
/* 当任意 `槽位` 被 `点击` 时,是否自动 `关闭` 该 GUI?
或者你需要执行 `/command-menu close <player>` 命令来手动关闭 GUI。 */,
"close_menu_on_clicked": false,
"commands": {
"on_open_commands": [],
"on_closed_commands": []
}
/* 为该 GUI 定义的 `槽位`。 */,
"slots": [
{
/* 把该物品放在 GUI 的哪个位置? */
"index": 0
/* 同时把这些物品放在指定的这些位置。 */,
"other_indexes": []
/* 是否把所有空白槽位都放上该物品。 */,
"fill_blank_indexes": false
/* 物品是什么? */,
"item": "minecraft:golden_apple"
/* 该物品的数量。 */,
"count": 2
/* 该物品的显示名称。 */,
"display_name": "This is another menu.",
"hide_tooltip": false
/* 该物品是否要发光? */,
"glow": false
/* 该物品的 lore。 */,
"lore": []
/* 在 GUI 中 `看到` 该物品所需的 `要求`。 */,
"view_requirement": {
"level": 0,
"string": null
},
"commands": {
"on_left_click_commands": [
"send-message %player:name% You just clicked me.",
"chain has-level? %player:name% 4 chain send-message %player:name% <yellow>You are op player.",
"command-menu close %player:name%"
],
"on_left_shift_click_commands": [],
"on_right_click_commands": [],
"on_right_shift_click_commands": [],
"on_middle_click_commands": []
}
},
{
/* 把该物品放在 GUI 的哪个位置? */
"index": 1
/* 同时把这些物品放在指定的这些位置。 */,
"other_indexes": []
/* 是否把所有空白槽位都放上该物品。 */,
"fill_blank_indexes": false
/* 物品是什么? */,
"item": "minecraft:clock"
/* 该物品的数量。 */,
"count": 1
/* 该物品的显示名称。 */,
"display_name": "Click me to refresh: %server:uptime%",
"hide_tooltip": false
/* 该物品是否要发光? */,
"glow": false
/* 该物品的 lore。 */,
"lore": []
/* 在 GUI 中 `看到` 该物品所需的 `要求`。 */,
"view_requirement": {
"level": 0,
"string": null
},
"commands": {
"on_left_click_commands": [
"command-menu open %player:name% another-menu"
],
"on_left_shift_click_commands": [],
"on_right_click_commands": [],
"on_right_shift_click_commands": [],
"on_middle_click_commands": []
}
}
]
},
"example-menu": {
/* 该 GUI 的 `标题`。 */
"title": "<blue>My Example Menu"
/* 取值范围 [1, 6] */,
"lines": 6
/* 当任意 `槽位` 被 `点击` 时,是否自动 `关闭` 该 GUI?
或者你需要执行 `/command-menu close <player>` 命令来手动关闭 GUI。 */,
"close_menu_on_clicked": false,
"commands": {
"on_open_commands": [],
"on_closed_commands": []
}
/* 为该 GUI 定义的 `槽位`。 */,
"slots": [
{
/* 把该物品放在 GUI 的哪个位置? */
"index": 0
/* 同时把这些物品放在指定的这些位置。 */,
"other_indexes": []
/* 是否把所有空白槽位都放上该物品。 */,
"fill_blank_indexes": false
/* 物品是什么? */,
"item": "minecraft:stone"
/* 该物品的数量。 */,
"count": 42
/* 该物品的显示名称。 */,
"display_name": "<blue>My Nice Item Name",
"hide_tooltip": false
/* 该物品是否要发光? */,
"glow": false
/* 该物品的 lore。 */,
"lore": [
"<green>Hello %player:name%",
"<yellow>You are in %world:id%"
]
/* 在 GUI 中 `看到` 该物品所需的 `要求`。 */,
"view_requirement": {
"level": 0,
"string": null
},
"commands": {
"on_left_click_commands": [
"send-message %player:name% You just clicked me.",
"chain has-level? %player:name% 4 chain send-message %player:name% <yellow>You are op player.",
"command-menu close %player:name%"
],
"on_left_shift_click_commands": [],
"on_right_click_commands": [],
"on_right_shift_click_commands": [],
"on_middle_click_commands": []
}
},
{
/* 把该物品放在 GUI 的哪个位置? */
"index": 1
/* 同时把这些物品放在指定的这些位置。 */,
"other_indexes": []
/* 是否把所有空白槽位都放上该物品。 */,
"fill_blank_indexes": false
/* 物品是什么? */,
"item": "minecraft:apple"
/* 该物品的数量。 */,
"count": 42
/* 该物品的显示名称。 */,
"display_name": "<green>Click to to open another menu.",
"hide_tooltip": false
/* 该物品是否要发光? */,
"glow": true
/* 该物品的 lore。 */,
"lore": []
/* 在 GUI 中 `看到` 该物品所需的 `要求`。 */,
"view_requirement": {
"level": 0,
"string": null
},
"commands": {
"on_left_click_commands": [
"command-menu open %player:name% another-menu"
],
"on_left_shift_click_commands": [],
"on_right_click_commands": [],
"on_right_shift_click_commands": [],
"on_middle_click_commands": []
}
}
]
}
}
}| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/command-menu close <ServerPlayer player> |
为玩家关闭当前已 打开的 GUI。 |
是 | 4 |
/command-menu open <ServerPlayer player> <MenuName menuName> |
为玩家打开指定的 菜单。 |
是 | 4 |
| 参数类型 | 对应类 |
|---|---|
[menu-name] |
[MenuName] |
该页是 command_meta 系列的入口,原文未提供额外内容。其子模块(run、for_each、one_of、chain、IF、NOT、AND、OR、nop、delay、json、attachment、shell、when_online)各自有独立章节,见下方各节。
配置中的开关位于 config/fuji/config.json 的 modules.command_meta 下,每个子模块都有独立的 enable 项。
提供 /AND 命令,用于组合多条命令的返回值。
◉ 组合多条命令的返回值
执行:/AND <命令-1> AND <命令-2> AND <命令-3> AND ...
◉ 如果玩家同时拥有 iron_ingot x 8 和 gold_ingot x 4,则返回 SUCCESS
执行:/AND has-item? Steve minecraft:iron_ingot 8 AND has-item? Steve minecraft:gold_ingot 4
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/AND <AndGreedyCommandString rest> |
当且仅当 所有 命令都返回 SUCCESS 时,返回 SUCCESS。 |
是 | 4 |
| 参数类型 | 对应类 |
|---|---|
[and-greedy-command-string] |
[AndGreedyCommandString] |
本模块提供一个简单的 /IF 命令。
它可以用来表达 条件逻辑,例如 IF ... THEN ... ELSE ...。
/IF 命令的语法为:/IF <条件命令> THEN <then 命令> ELSE <else 命令>
IF、THEN、ELSE 这三个字面量必须 首字母大写。
该命令的执行流程如下:
- 开始执行给定的
/IF命令实例。 - 检查给定
/IF命令实例是否存在可能的歧义。 2.a. 如果没有歧义,进入步骤3.。 2.b. 如果存在歧义,则中止整个/IF命令的执行。 - 执行
条件命令,并获取其返回值: 3.a. 如果返回值为 true,则执行then 命令。 3.b. 如果返回值为 false,则执行else 命令。
◉ 任何 失败 都会导致执行 else 命令
如果 条件命令 的 执行 期间发生任何 错误,else 命令 都会被执行。
例如,/IF bad command THEN say true ELSE say false 命令会做以下事情:
- 首先执行
/bad command。 - 由于
/bad command执行期间出现错误,/say false命令会被执行。
◉ 不支持 递归 IF
/IF 命令是一个足够 简单 的命令,只提供非常基础的 条件表达式。
不支持 嵌套 IF。
一旦在 /IF 命令中发现 歧义,整个 /IF 命令的执行就会被中止。
/execute if 命令是一个强大的命令:
- 可以使用
递归 if。例如:/execute if <第一个条件> if <第二个条件> - 可以使用大量
原版 Minecraft 判定器。例如:/execute if {block|biome|loaded|dimension|score|blocks|entity|predicate|function|items|data} - 可以结合
/execute if与/execute unless命令来模拟else 子句。
◉ /IF 命令的 目的 是什么?
- 它允许你把
任意命令用作条件,依据该命令的返回值来判定。 - 它避免了
条件子句与then 命令产生副作用。(无需借助/tag或/scoreboard) - 它提供了一种简单、内联的方式来表达
IF ... THEN ... ELSE ...逻辑。 - 它支持
占位符。 - 你仍然可以把
/execute if命令用作/IF命令的条件命令。
返回值 不会在游戏内显式显示。
不过,你可以用 /command-debug 命令查看指定命令的 返回值。
执行:
/command-debug execute if block ~ ~-1 ~ minecraft:diamond_block/command-debug execute if block ~ ~-1 ~ minecraft:diamond_block if entity @s[nbt={Inventory:[{id:"minecraft:diamond"}]}]
◉ /execute if 命令的行为
- 当
没有任何条件为 true时,它会抛出Test failed异常。 - 当
指定条件之一为 true时,它返回0,表示部分成功。 - 当
所有指定条件都为 true时,它返回正整数,表示成功。
注意:如果 /execute if 命令发生 分支,该 正整数 等于 成功分支的数量。
例如,如果服务器有 3 名玩家在线,但只有 2 名玩家站在 minecraft:diamond_block 方块上。
执行:/command-debug execute at @a if block ~ ~-1 ~ minecraft:diamond_block
作为该 /execute ... 命令实例的 返回值,你会得到整数 2。
- https://minecraft.fandom.com/wiki/Commands/execute
- https://minecraft.wiki/w/Commands/return
- https://minecraft.fandom.com/wiki/Commands/scoreboard
- https://minecraft.fandom.com/wiki/Commands/tag
- https://minecraft.fandom.com/wiki/Commands/data
你可以使用 command_bundle 模块创建 模板命令,来帮助你书写 条件逻辑。
例如,你可以新建一条命令 /try-give-item <item> <required-balance>。
◉ 检查玩家是否为 OP
执行:/IF is-op? %player:name% THEN say It is op. ELSE say It is not op.
◉ 检查玩家余额是否充足
执行:/IF has-currency? %player:name% fuji:gold 100 THEN say Sufficient balance. ELSE say Insufficient balance.
◉ 使用 /IF ... THEN ... 命令的简化写法
/nop 命令 不执行任何动作,并且总是 返回成功。
你可以把它当作 else 命令 位置的 占位命令,从而实际上忽略 else 分支。
执行:/IF is-op? %player:name% THEN say It is op. ELSE nop
◉ 使用 /chain 命令在一个位置指定 多条命令
执行:/IF is-op? %player:name% THEN chain say It is op. chain say Hello op! ELSE nop
◉ 发挥 /execute if 的威力(以及 /execute unless 命令)
执行:/IF execute if block ~ ~-1 ~ minecraft:diamond_block THEN say You are standing on diamond block. ELSE say You are not standing on diamond block.
◉ 用 链式 if 组合 2 个条件,只有当它们都为 true 时才执行 then 命令
执行:/IF execute if block ~ ~-1 ~ minecraft:diamond_block if entity @s[nbt={Inventory:[{id:"minecraft:diamond"}]}] THEN say All true. ELSE say Not all true.
只有当 条件命令 为 true 时,then 命令 才会被执行:
- 玩家站在
minecraft:diamond_block方块上。 - 玩家背包中有
minecraft:diamond物品。
◉ 用判定条件筛选所有在线玩家
你可以把 /IF 与 /foreach 命令结合使用。
/foreach IF <判定命令> THEN ... ELSE .../foreach IF has-item? %player:name% minecraft:apple 1 THEN say Player %player:name% has an apple. ELSE nop/foreach IF is-in-world? %player:name% minecraft:overworld THEN say Player %player:name% is in overworld. ELSE nop
◉ 借助原版 Minecraft 的 /tag 命令存储状态
示例:
/tag Steve add killed_the_dragon/execute if entity @a[tag=killed_the_dragon]
◉ 借助原版 Minecraft 的 /scoreboard 命令存储状态
它类似 /tag 命令,但更高级。
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/IF <IfGreedyCommandString rest> |
(原文未提供说明) | 是 | 4 |
| 参数类型 | 对应类 |
|---|---|
[if-greedy-command-string] |
[IfGreedyCommandString] |
提供 /NOT <命令> 命令。
用于执行指定命令,并把 SUCCESS 与 FAILURE 的返回值 反转。
- 以当前命令来源执行
目标命令,获取命令返回值。 1.a. 如果命令返回值表示SUCCESS(值 > 0),则返回FAILURE(值 0)。 1.b. 如果命令返回值表示FAILURE(值 = 0),则返回SUCCESS(值 1)。
◉ 与其他 判定 命令配合使用
执行:/IF NOT has-item? <player> minecraft:apple 16 THEN say You don't have 16 apples. ELSE say You have 16 apples.
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/NOT <GreedyCommandString command> |
以控制台身份执行该命令,并反转 SUCCESS 与 FAILURE 的返回值。 |
是 | 4 |
提供 /OR 命令,用于组合多条命令的返回值。
◉ 组合多条命令的返回值
执行:/OR <命令-1> OR <命令-2> OR <命令-3> OR ...
◉ 如果玩家拥有 iron_ingot x 8 或 gold_ingot x 4,则返回 SUCCESS
执行:/OR has-item? Steve minecraft:iron_ingot 8 OR has-item? Steve minecraft:gold_ingot 4
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/OR <OrGreedyCommandString rest> |
当且仅当 任意一条 命令返回 SUCCESS 时,返回 SUCCESS。 |
是 | 4 |
| 参数类型 | 对应类 |
|---|---|
[or-greedy-command-string] |
[OrGreedyCommandString] |
原文:https://fuji-fabric.github.io/Modules/command_meta.attachment
提供统一的附着设施,用于把数据附着到任意对象上。
◉ 设置一个附着数据
执行:/attachment set news today hello world
◉ 读取一个附着数据
执行:/attachment get news today
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/attachment get <SubjectName subject> <SubjectId uuid> |
(原文未提供说明) | 是 | 4 |
/attachment set <SubjectName subject> <SubjectId uuid> <GreedyString data> |
(原文未提供说明) | 是 | 4 |
/attachment unset <SubjectName subject> <SubjectId uuid> |
(原文未提供说明) | 是 | 4 |
| 参数类型 | 对应类 |
|---|---|
[subject-id] |
[SubjectId] |
[subject-name] |
[SubjectName] |
本模块提供 /chain 命令,用于顺序执行 两条命令:
- 第一条命令,是
任意命令。(必需) - 第二条命令,是
/chain命令。(可选)
它的典型用法是把两条命令 压缩 成一条命令。
这样你就能在某些位置放入 多于 1 条命令。
例如:/execute run chain say 1 chain say 2
在原版 Minecraft 中,命令的 返回值 是一个 整数。
如果整数 <= 0,则该 命令执行 被视为 失败。
如果整数 > 0,则该 命令执行 被视为 成功。
事实上,可以依据命令执行的 返回值 判断该次执行是否成功。
/chain 命令接受 恰好一个参数,其类型为 贪心字符串(greedy string)。
贪心字符串 参数类型总是命令的 最后一个 参数。
一旦 命令解析器 看到 贪心字符串 参数类型,它就知道这是 最后一个 参数。
于是解析器会把所有剩余字符都 喂 给这个 贪心字符串参数。
换句话说,贪心字符串参数 会 吃掉 所有尚未被前面参数消耗掉的剩余字符。
例如,/say Hello Alice 同样只有一个参数,其类型为 贪心字符串。
你不需要用 " 字符转义 空格字符,这正是因为 /say 的参数类型是 贪心字符串。
以 /chain say 1 chain say 2 为例:
第一个 /chain 命令会把 say 1 chain say 2 作为 它唯一参数 的值接收。
然后 /chain 命令会把该值拆成两部分。
第一部分是 say 1,/chain 命令会把它提交给 命令执行器。
第二部分是 chain say 2,/chain 命令会 依据 前一条已提交命令的返回值来决定是否提交它。
这是一个递归的过程。
◉ 嵌套的链
执行:/chain say 1 chain say 2 chain say 3
◉ 可中断的链
执行:/chain bad command here chain say 2
◉ 把 chain 命令与判定命令一起使用
执行:/run as player Alice chain test-level-perm %player:name% 4 chain say value is true
◉ 借助 /execute if 命令
执行:/chain execute if block ~ ~-1 ~ minecraft:diamond_block if entity @s[nbt={Inventory:[{id:"minecraft:diamond"}]}] chain say You are standing on diamond block and have diamond.
注意:该用法与 command_meta.if 模块类似。
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/chain <ChainGreedyCommandString rest> |
串联命令并按顺序执行;若前一条命令失败,链条会中断。 | 是 | 4 |
| 参数类型 | 对应类 |
|---|---|
[chain-greedy-command-string] |
[ChainGreedyCommandString] |
本模块提供 /delay 命令。
用于 延迟 指定命令的 执行。
◉ 只应使用 /delay 执行短期任务
如果服务器重启,被延迟的命令 不会被持久化。
◉ 基本用法
执行:/delay 3 say three seconds passed
◉ 嵌套延迟
执行:/delay 1 delay 2 delay 3 say 6 seconds passed
◉ 细粒度延迟
执行:/delay 3.1415926 say pi seconds passed
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/delay <double time> <GreedyCommandString rest> |
在若干秒后执行一条命令。 | 是 | 4 |
原文:https://fuji-fabric.github.io/Modules/command_meta.for_each
本模块提供 /foreach 命令。
它允许把通常只针对单个玩家的命令 应用到每个 在线玩家上。
◉ 向在线玩家问好
执行:/foreach say hello %player:name%
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/foreach <GreedyCommandString rest> |
对每个在线玩家各执行一次该单玩家命令。 | 是 | 4 |
提供 /json 命令。
一个强大而统一的 JSON 文件编辑工具。
Json Path 的详细说明参见 https://goessner.net/articles/JsonPath/
◉ 读取一个 json 键
执行:/json read "config/fuji/config.json" "$.core.debug"
◉ 列出 json 键
执行:/json read "config/fuji/config.json" "$.modules.keys()"
◉ 设置某个 json 键的值
执行:/json write "config/fuji/config.json" "$.core.debug.log_debug_messages" BOOLEAN true
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/json delete <String filePath> <String jsonPath> |
(原文未提供说明) | 是 | 4 |
/json put <String filePath> <String jsonPath> <String jsonKey> <JsonValueType valueType> <GreedyString value> |
(原文未提供说明) | 是 | 4 |
/json read <String filePath> <String jsonPath> |
(原文未提供说明) | 是 | 4 |
/json renameKey <String filePath> <String jsonPath> <String oldJsonKey> <String newJsonKey> |
(原文未提供说明) | 是 | 4 |
/json write <String filePath> <String jsonPath> <JsonValueType valueType> <GreedyString value> |
(原文未提供说明) | 是 | 4 |
| 参数类型 | 对应类 |
|---|---|
[json-value-type] |
[JsonValueType] |
本模块提供 /nop 命令。
它是一条 什么都不做 的命令,直接返回 SUCCESS 作为返回值。
它可以用来占住 需要一条命令 的位置。
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/nop |
什么都不做,直接返回 SUCCESS 作为命令返回值。 | 是 | 4 |
原文:https://fuji-fabric.github.io/Modules/command_meta.one_of
提供 /one-of 命令,从指定的多条命令中随机挑一条并执行。
◉ 从指定命令列表中挑一条幸运命令并执行
执行:/one-of say 1 one-of say 2 one-of say lucky %player:name%
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/one-of <OneOfGreedyCommandString rest> |
one-of 命令随机挑选其中一条命令,并以控制台身份执行。 | 是 | 4 |
| 参数类型 | 对应类 |
|---|---|
[one-of-greedy-command-string] |
[OneOfGreedyCommandString] |
提供 /run 命令,用于在指定上下文中运行命令。
原版 Minecraft 的 目标选择器 有:@a、@e、@n、@p、@r 和 @s。
它们用于为 Player 参数类型和 Entity 参数类型选择取值:
-
/give @a minecraft:apple中的@a会选择所有在线玩家。(Player 参数) -
/kill @e中的@e会选择所有实体。(Entity 参数)
请记住,目标选择器 只能用于选择特定的 参数类型,例如 Player 和 Entity。
然而,%player:name% 是一个 占位符,它总会被替换为 上下文玩家。
如果你想指定 上下文玩家 的名字,应该使用 占位符,因为它总是有效。
例如:
-
/run as console say I am @s会说I am @s -
/run as console say I am %player:name%会说I am Steve(假设你的账号叫Steve)
注意:如果你使用 /execute as @a run say I am @s,@s 是会生效的(前提是你确实清楚自己在做什么)。
无论如何,如果你试图混用 目标选择器 与 占位符,必须小心其 语义。
◉ @p 与 %player:name% 的语义
所有执行命令的 fuji 命令都会尝试解析 占位符。
所以你可以在 /run as console say I am %player:name% 命令中插入 %player:name% 这类占位符。
@p 只是一个 目标选择器,你可以配合 /execute 命令使用它。
但你不应该使用 /run as console give @p minecraft:apple。
@p 会选择 最近的玩家 作为 Player 参数 的值。
那么问题来了:哪个玩家才算离控制台最近的玩家?
答案是:控制台 被视为位于 minecraft:overworld 出生点的虚拟玩家。
所以如果你把 @p 与 /run as console 命令一起使用,就会产生 不一致。
@p 指向的玩家会不一致。
它取决于当时哪个玩家离 minecraft:overworld 的出生点最近。
-
/run命令的主要目的是在执行命令实例时修改命令上下文。 -
/run命令会解析%player:name%这类占位符。(当然你仍然可以使用原版目标选择器,但不推荐) -
/run as {player/fake-op/console}让你方便地切换命令来源的角色。
◉ 命令 是在 命令上下文 中执行的
在 Minecraft 内部,当你把 命令 提交给 命令执行器 时,需要提供 命令上下文。
命令上下文 包含这些重要信息:
命令来源命令参数的值执行所在的维度执行位置执行权限等级
以及其他信息。
◉ /run 命令可用于切换 命令上下文
你可以用 /run as player 把 命令来源 改成另一个玩家。
如果玩家 Alice 发出 /run as player Bob say I am %player:name%。
那么 初始命令来源 是 Alice,执行命令来源 是 Bob。
我们会把 命令异常 同时报告给 初始命令来源 和 执行命令来源。
我们会用玩家 Bob 作为 上下文玩家 来 解析占位符。
所以结果是:玩家 Bob 执行了 /say I am Bob 命令。
◉ /run as fake-op 是如何工作的?
当你发出 /run as fake-op Alice say Hi 时,/run 命令会修改 命令上下文。
让 命令执行器 把玩家 Alice 当作拥有 4 级权限 来处理。
其效果类似于:我们给玩家 Alice 执行 /op,控制台执行 /run as player Alice say Hi,然后我们给玩家 Alice 执行 /deop。
不过我们并没有真的给玩家 Alice 执行 /op。
我们做的事很简单:只是告诉 命令执行器,在执行 这条命令 实例时,把玩家 Alice 当作拥有 4 级权限 来处理。
◉ 以指定玩家身份执行命令
执行:/run as player Alice back
◉ 以 fake-op 身份执行命令
执行:/run as fake-op Alice give %player:name% minecraft:apple 1
◉ 给在线玩家随机数量的钻石
执行:/run as console give @a minecraft:diamond %fuji:random 8 32%
◉ 给在线玩家随机数量的钻石(逐个执行)
执行:/run as console foreach give %fuji:escape player:name% minecraft:diamond %fuji:escape fuji:random 8 32 1%
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/run as console <GreedyCommandString rest> |
以控制台身份执行一条命令。 | 是 | 4 |
/run as fake-op <ServerPlayer player> <GreedyCommandString rest> |
以拥有 4 级权限的玩家身份执行一条命令。 | 是 | 4 |
/run as player <ServerPlayer player> <GreedyCommandString rest> |
以玩家身份执行一条命令。 | 是 | 4 |
提供 /shell 命令。
用于在 宿主机 shell 中执行 命令行。
一个 强大 而 危险 的模块。
◉ 这是一个 危险 的模块
本模块是一个强大而危险的模块,不建议启用。
◉ 使用占位符创建文件
执行:/shell touch %player:name%.dangerous
◉ 在宿主机上执行程序
执行:/shell emacs
◉ 调用宿主机上的程序备份服务器
你需要把 shell 模块与 command_scheduler 模块结合使用。
并配置好 外部备份程序。
◉ 从互联网下载病毒并执行
执行:/shell ...
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/command_meta/shell/config.json
{
"DANGER": "启用该模块有可能损害你的计算机!你需要把此字段改为 `CONFIRM` 才能启用该模块"
/* 安全选项。 */,
"security": {
/* 只有 `控制台` 能使用 `/shell` 命令? */
"only_allow_console": true
/* 只有这些 `玩家` 能使用 `/shell` 命令? */,
"allowed_player_names": []
}
}| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/shell <GreedyString rest> |
在宿主机操作系统中执行 shell 命令。 | 是 | 4 |
原文:https://fuji-fabric.github.io/Modules/command_meta.when_online
本模块提供 /when-online <player> <cmd> 命令。
用于在目标玩家 在线 时 恰好执行一次 指定命令:
- 如果目标玩家现在
在线,命令会立刻执行。 - 如果目标玩家现在
离线,命令会在该玩家上线时执行。
此外,你可以用 /when-online list 管理 已提交的命令。
例如:
/when-online Steve give %player:name% minecraft:apple 3/when-online Alex delay 8 say Hi %player:name%
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/command_meta/when_online/when-online-data.json
{
"tickets": []
}| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/when-online |
/when-online list 命令的别名。 |
否 | 4 |
/when-online <OfflinePlayerName targetPlayer> <GreedyCommandString command> |
当目标玩家 在线 时,恰好执行一次 指定命令。 |
是 | 4 |
/when-online list |
列出所有已提交的 when-online 工单。 |
否 | 4 |
本模块为 所有命令 提供 luckperms 权限。
目标命令 可以是 原版 Minecraft 的命令,也可以是任何其他 模组 的命令。
原版 Minecraft 使用的命令系统名为 brigadier 命令系统。
所有 命令 都由该系统 注册、解析 和 执行。
在该命令系统的设计中,所有命令被构建成一棵 树形结构,也就是 命令树。
所有命令都从 根命令 出发,沿着 命令树 的 路径 向下走。
所有命令都是 根命令节点 的 直接子节点 或 间接子节点。
基于这些事实,我们可以用 命令树 中的 路径 来 标识 一个 命令节点。
例如,命令字符串 /gamemode creative Steve。
可以解析为命令节点:gamemode、creative 和 Steve。
它的 命令路径 是 gamemode.gamemode.target。
你可以执行 /command-permission describe gamemode creative Steve 来观察发生了什么。
要查看该命令节点的 树形结构,执行 /help gamemode 命令。
要打开命令权限 GUI,执行 /command-permission gui 命令。
要列出所有命令及其命令路径,执行 /fuji inspect server-commands 命令。
brigadier 命令系统 把所有 命令节点 组织为 树形结构。
每个 命令节点 都有一个 requirement 选项,它是一个 判定式,用于决定 命令来源 能否使用该 命令节点。
这就是核心部分。
command_permission 模块会遍历整棵 命令树,为每个 命令节点 包装 其 requirement 选项。
这样我们就能为每个 命令节点 分配一个 luckperms 权限。
因为我们能用 命令树 中的 命令路径 来 标识 一个 命令节点。
执行:/command-permission describe gamemode creative Steve 可以观察其工作过程。
实际上,command_permission 模块并不处理它们。
该模块只做一件简单的事:检查命令来源是否拥有对应的 luckperms 权限 fuji.permission.<目标命令的命令路径>。
继承权限、通配权限、正则权限 这类复杂逻辑全部由 luckperms 模组处理。
是的,复杂的 权限计算 由 luckperms 模组完成。
command_permission 模块最初的灵感来自 Vanilla Permissions 模组。
如果你想要更高级的功能,可以看看 Vanilla Permissions 模组。
luckperms 模组有一个名为 权限上下文(permission context)的功能。
它允许你指定 按维度生效的权限 与 临时权限。
如果你感兴趣,可以查阅其官方 wiki 了解详情。
◉ 允许所有人使用 /gamemode 命令
执行 /lp group default permission set fuji.permission.gamemode true
注意:如果你希望客户端能使用游戏模式切换菜单,则必须在客户端额外安装模组,让客户端认为自己处于 op 状态,从而可以切换游戏模式。
该模组可以是 https://modrinth.com/mod/switcher
◉ 允许所有人使用 /gamemode 命令,但玩家 Alice 除外
执行以下命令:
/lp group default permission set fuji.permission.gamemode true/lp user Alice permission set fuji.permission.gamemode false
◉ 允许所有人使用 /gamemode spectator,但禁止 /gamemode creative
这里涉及核心机制和一些棘手之处。
现在执行 /command-permission describe gamemode spectator 命令。
你会发现第二个命令节点 creative 实际上是一个 参数。
它的 参数 类型为 gamemode,接受的可能取值为 adventure、creative、spectator 和 survival。
这 4 种游戏模式都是 gamemode 参数类型 的可能取值。
这就是为什么你无法直接封禁 creative 游戏模式。
如果你确实想允许用户使用 /gamemode spectator 而禁止 /gamemode creative。
你可以用 command_bundle 创建一条 用户级 命令来包装 /gamemode 命令。
例如,新建一条名为 /switch-to-survival 的命令,作为 /gamemode 命令的包装命令。
◉ 允许玩家使用 /seed 命令
Mojang 提供的 /seed 命令要求 权限等级 为 3 才能使用。
如果你想 允许 玩家使用 /seed 命令,但又不想给他们 op。
那么你可以为他们 设置 一个 正向字符串权限。
执行 /lp group default permission set fuji.permission.seed true。
这表示 允许 玩家使用 /seed 命令。
执行 /command-permission describe seed 命令可以观察其工作过程。
◉ 禁止玩家使用 /list 命令
Mojang 提供的 /list 命令要求 权限等级 为 0 才能使用。
如果你想 禁止 玩家使用 /list 命令。
但因为这个命令不需要任何字符串权限即可使用。
所以无法通过 luckperms 模组封禁它。
在这种情况下,你 可以 为他们设置一个 负向字符串权限。
执行 /lp group default permission set fuji.permission.list false。
这表示 禁止 玩家使用 /list 命令。
执行 /command-permission describe list 命令可以观察其工作过程。
◉ 取消某条命令的 requirement 覆盖
要 撤销 /seed 示例中的操作。
你可以 取消设置(unset)之前分配的权限。
执行 /lp group default permission unset fuji.permission.seed 命令,取消已分配的权限。
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/command_permission/config.json
{
/* 你可以定义 `规则` 来处理 `特殊情况`。
如果 `命令权限` 被某条 `规则` `匹配`,
我们会直接返回预先定义的 `权限测试结果`,而不去询问 luckperms。
`规则` 可用于处理 `特殊情况`。
例如,如果你启用了 `权限隐式继承` 功能,并授予了一个 `根权限` 如 `fuji.permission.fly`。
你希望允许玩家使用 `/fly`,其权限为 `fuji.permission.fly`。
但你不希望玩家使用 `/fly others <player>`,其权限为 `fuji.permission.fly.others.others`。
在这种情况下,你只需启用 `权限隐式继承` 功能并授予 `根权限`,然后用规则 `排除` 特殊情况。
注意:<red>预定义规则只对非 OP 玩家生效。</red> */
"rules": [
{
/* 用于匹配 `对应权限` 字符串的 `正则`。 */
"permission_pattern_regex": "fuji.permission.*others.*"
/* 对于 `匹配到的权限字符串`,我们直接返回 `预先定义` 的权限测试结果。 */,
"permission_test_result": "DENY_TO_USE_THE_COMMAND"
}
]
}| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/command-permission describe <GreedyCommandString command> |
描述 给定命令 的 所需权限。 |
是 | 4 |
/command-permission gui |
打开命令权限 GUI。 | 否 | 4 |
/command-permission verbose |
切换命令权限的详细模式。 | 是 | 4 |
本模块允许定义 正则 来 重写 玩家 发出 的命令行。
- 拦截
已发出的命令字符串网络包。 - 按自上而下的顺序把已定义的重写规则应用到
命令字符串上。
注意:command_rewrite 发生在命令生命周期的最开始。
在这个阶段你不会收到 命令补全建议 或 命令异常。
重写规则直接作用于原始命令字符串。
◉ 命令生命周期
-
发出(Issuing) – 命令以
原始字符串形式发出。此阶段没有命令补全建议或异常。 -
解析(Parsing) – 命令字符串被解析为
命令节点。此时可以提供命令补全建议和异常。 -
执行(Execution) – 与命令节点关联的
动作被执行,产生命令预期的效果。
-
command alias模块允许你定义新命令,并把它重定向到已有命令。 -
command bundle模块允许你定义新命令,并定义新命令的参数与主体。 -
command rewrite模块不定义任何新命令。它只在网络包层面工作,修改来自命令来源玩家发出的命令字符串。
◉ 你可以用本模块缩短命令字符串
例如,把命令字符串 /home 重写为 /home tp default。
从而为 /home tp default 命令提供一个快捷方式。
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/command_rewrite/config.json
{
/* 已定义的 `重写` 条目。 */
"rules": [
{
/* 用于匹配 `目标字符串` 的 `模式字符串`。 */
"regex": "\\?"
/* 用于替换 `匹配到的目标字符串` 的 `替换字符串`。 */,
"replacement": "help"
}
]
}本模块允许按 计划 执行命令。
它的典型用途是按计划执行 广播命令。
不过,它也可以用来执行任意指定命令。
- 定义一个
任务,用于按计划执行命令。 1.a.计划使用cron 表达式语言表达。 1.b. 你可以为一个任务指定多个cron 表达式。 1.c. 只要任一cron 表达式匹配,任务就会被触发。 -
任务会依据其cron 表达式自动触发。 - 当
任务被触发时,它会执行: 3.a. 如果enable属性为false,则什么都不做。 3.b. 如果剩余执行次数属性<= 0,则什么都不做。 3.c. 否则,把剩余执行次数属性减 1,并随机挑选一个命令组执行。 - 你可以用
/command-scheduler trigger <job>手动触发一个任务。
◉ 你可以使用 cron 表达式 生成器来指定 任务 的 触发 时机
参见:
- https://www.freeformatter.com/cron-expression-generator-quartz.html
- https://crontab.cronhub.io/
- https://odown.com/free-tools/cron-expression-generator/
◉ 列出每个已定义 任务 的 下次触发时间
执行 /fuji inspect jobs 查看已定义 任务 的 触发时间。
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/command_scheduler/scheduler.json
{
"jobs": [
{
"enable": true
/* 该 `任务` 的 `唯一` 名称。 */,
"name": "example_job"
/* 允许剩余执行的次数。 */,
"remaining_runs": 1024
/* 已定义的 `cron` 表达式列表。
任一满足的 `cron` 表达式都能 `触发` 该 `任务`。 */,
"schedules": [
"0 */3 * ? * *",
"0 */5 * ? * *"
]
/* `任务` 被 `触发` 时要执行的命令。 */,
"command_groups": [
[
"send-broadcast Group 1 Command 1 -> This is the first group of commands.",
"send-broadcast Group 1 Command 2 -> When job is fired, a random command group will be picked.",
"send-broadcast Group 1 Command 3 -> Commands in a group run in order from top to bottom.",
"send-broadcast Group 1 Command 4 -> You can execute `/command-schedule trigger` to `run` a `job` directly."
],
[
"send-broadcast Group 2 Command 1 -> This is the second group of commands",
"send-broadcast Group 2 Command 2 -> You can use `/fuji` command to inspect the `next fire dates` of each job.",
"send-broadcast Group 2 Command 3 -> The schedule for this job is described using 2 cron expression: one says `every 3 minutes`, another says `every 5 minutes`"
]
]
}
]
}| 任务名 | 说明 |
|---|---|
CommandScheduleJob |
该 任务 由 command_schedule 模块定义,用于 执行指定的命令。 |
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/command-scheduler list |
列出所有已定义的任务。 | 否 | 4 |
/command-scheduler trigger <JobName jobName> |
手动触发一个任务。 | 是 | 4 |
| 参数类型 | 对应类 |
|---|---|
[schedule-job-name, job-name] |
[JobName] |
本模块允许 监听 命令执行。
- 按自上而下的顺序匹配已定义的
规则。 - 找到
第一条匹配的规则。 - 如果存在,则应用
第一条匹配的规则。
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/command_spy/config.json
{
"rules": [
{
"enable": true,
"document": "匹配 `/login ...` 命令并忽略它。",
"matcher": {
"command_string_regex": "login .+",
"accept_silent_command": false,
"accept_player_command_source": true,
"accept_server_command_source": false
},
"if_matched": {
"log_to_console": false,
"notify_players_with_level_permission": 5
}
},
{
"enable": true,
"document": "匹配所有命令并记录它。",
"matcher": {
"command_string_regex": ".+",
"accept_silent_command": false,
"accept_player_command_source": true,
"accept_server_command_source": false
},
"if_matched": {
"log_to_console": true,
"notify_players_with_level_permission": 5
}
}
]
}本模块允许用 判定命令 定义一个 状态。
使用定义好的 状态,你可以:
- 定义玩家
进入或离开该状态时执行的命令。 - 检查玩家当前是否处于该
状态。 - 显示与该
状态相关的占位符。
◉ 用 判定命令 定义 状态
一个 状态 由 判定命令 组成。
你可以定义一个名为 has-iron-and-gold 的 状态,其 判定命令 为:
has-item? %player:name% minecraft:iron_ingot 16has-item? %player:name% minecraft:gold_ingot 8
◉ 与 luckperms 的 临时权限 集成
用 /lp group default permission settemp fuji.permission.fly true 10s 分配一个 临时权限。
然后定义一个 状态 来检查玩家是否 拥有指定的临时权限。
该 状态 可命名为 can-use-fly-command,其 判定命令 为:
has-perm? %player:name% fuji.permission.fly
最后,你可以定义玩家 离开该状态 时 要执行的命令。
例如,定义玩家 离开 该 状态 时 关闭飞行 的命令。
◉ 查询某玩家某个 状态 的值
执行:/command-state info Steve
此外,/is-in-state? <player> <state-id> 可以作为 判定命令 使用。
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/command_state/command-state-data.json
{
"player_states_map": {}
}文件:config/fuji/modules/command_state/config.json
{
"state_descriptors": [
{
"enable": false,
"id": "is-in-overworld"
/* 用于定义该 `状态` 的 `判定命令`。 */,
"definition": {
"predicate_commands": [
"is-in-world? %player:name% minecraft:overworld"
]
}
/* 为在线玩家 `检查` 并 `更新` 该 `状态` 的 `取值` 的间隔。 */,
"update_interval_seconds": 3,
"events": {
"on_enter_this_state_commands": [
"send-message %player:name% <green>You entered the overworld dimension."
],
"on_leave_this_state_commands": [
"send-message %player:name% <green>You left the overworld dimension."
]
}
},
{
"enable": false,
"id": "has-iron-and-gold"
/* 用于定义该 `状态` 的 `判定命令`。 */,
"definition": {
"predicate_commands": [
"has-item? %player:name% minecraft:iron_ingot 16",
"has-item? %player:name% minecraft:gold_ingot 8"
]
}
/* 为在线玩家 `检查` 并 `更新` 该 `状态` 的 `取值` 的间隔。 */,
"update_interval_seconds": 3,
"events": {
"on_enter_this_state_commands": [
"send-message %player:name% <green>You have `iron_ingot x 16` and `gold_ingot x 8`."
],
"on_leave_this_state_commands": [
"send-message %player:name% <green>You don't have `iron_ingot x 16` and `gold_ingot x 8`."
]
}
},
{
"enable": false,
"id": "can-use-fly-command"
/* 用于定义该 `状态` 的 `判定命令`。 */,
"definition": {
"predicate_commands": [
"has-perm? %player:name% fuji.permission.fly"
]
}
/* 为在线玩家 `检查` 并 `更新` 该 `状态` 的 `取值` 的间隔。 */,
"update_interval_seconds": 3,
"events": {
"on_enter_this_state_commands": [
"send-message %player:name% <green>You have gained access to `/fly` command."
],
"on_leave_this_state_commands": [
"send-message %player:name% <red>You temporary `/fly` command access has expired.",
"run as fake-op %player:name% fly false"
]
}
}
]
}| 任务名 | 说明 |
|---|---|
ConfigurationHandlerWriteStorageJob |
该 任务 用于把 数据 从 内存 写入 存储。注意:如果你在 磁盘 上修改了该 文件,需要尽快执行 /fuji reload。注意:触发 该任务时,磁盘 上的文件会被 覆盖。 |
CommandStateAutoUpdaterJob |
该 任务 用于为所有在线玩家 检查 并 更新 所有已定义 状态 的取值。触发时,其效果等同于执行 /command-state update-all 命令。 |
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/command-state info <ServerPlayer player> |
显示指定玩家所有 状态 的取值。 |
否 | 4 |
/command-state list |
列出所有已定义的 状态。 |
是 | 4 |
/command-state update <StateDescriptor state> |
为在线玩家更新指定 状态。 |
是 | 4 |
/command-state update-all |
为在线玩家更新所有已定义的 状态。 |
是 | 4 |
/is-in-state? <ServerPlayer player> <StateDescriptor state> |
返回该玩家指定 状态 的取值当前是否为 true。 |
是 | 4 |
| 占位符 | 说明 |
|---|---|
fuji:is_in_state |
返回该玩家指定 状态 的取值。示例:%fuji:is_in_state is-in-overworld%
|
| 参数类型 | 对应类 |
|---|---|
[state-id] |
[StateDescriptor] |
本模块提供一组 工具命令。
这些命令 简单 而 便捷。
其子模块各自提供具体命令,见下方各节。
原文:https://fuji-fabric.github.io/Modules/command_toolbox.bed
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/bed |
传送到床的位置。 | 否 | 0 |
/bed others <PlayerCollection others> |
传送到床的位置。 | 是 | 4 |
原文:https://fuji-fabric.github.io/Modules/command_toolbox.burn
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/burn <EntityCollection target> <int ticks> |
让目标实体燃烧指定刻数。 | 是 | 4 |
原文:https://fuji-fabric.github.io/Modules/command_toolbox.compass
允许你设置指南针物品的追踪目标点。
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/compass reset |
让手中的指南针不再追踪任何目标。 | 否 | 0 |
/compass reset others <PlayerCollection others> |
让手中的指南针不再追踪任何目标。 | 是 | 4 |
/compass track player <ServerPlayer target> |
让手中的指南针追踪指定玩家。 | 否 | 0 |
/compass track player others <PlayerCollection others> <ServerPlayer target> |
让手中的指南针追踪指定玩家。 | 是 | 4 |
/compass track pos <Dimension dimension> <BlockPos blockPos> |
让手中的指南针追踪指定位置。 | 否 | 0 |
/compass track pos others <PlayerCollection others> <Dimension dimension> <BlockPos blockPos> |
让手中的指南针追踪指定位置。 | 是 | 4 |
原文:https://fuji-fabric.github.io/Modules/command_toolbox.delete
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/delete <EntityCollection target> |
从维度中删除目标实体。 | 是 | 4 |
原文:https://fuji-fabric.github.io/Modules/command_toolbox.disconnect
◉ 断开某个玩家的连接
/dis-connect Steve <red>Kicked./dis-connect Steve <red>First Line<newline>Second Line
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/dis-connect <ServerPlayer target> <GreedyString reason> |
(原文未提供说明) | 是 | 4 |
/dis-connect others <PlayerCollection others> <GreedyString reason> |
(原文未提供说明) | 是 | 4 |
原文:https://fuji-fabric.github.io/Modules/command_toolbox.down
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/down |
传送到当前位置的最低点。 | 否 | 0 |
/down others <PlayerCollection others> |
传送到当前位置的最低点。 | 是 | 4 |
原文:https://fuji-fabric.github.io/Modules/command_toolbox.extinguish
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/extinguish |
把着火刻数设为 0。 | 否 | 4 |
/extinguish others <PlayerCollection others> |
把着火刻数设为 0。 | 是 | 4 |
原文:https://fuji-fabric.github.io/Modules/command_toolbox.feed
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/feed |
把饥饿值、饱食度与消耗度设为健康状态。 | 否 | 4 |
/feed others <PlayerCollection others> |
把饥饿值、饱食度与消耗度设为健康状态。 | 是 | 4 |
原文:https://fuji-fabric.github.io/Modules/command_toolbox.fly
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/fly |
切换玩家的飞行状态。 | 否 | 4 |
/fly <boolean flag> |
设置玩家的飞行状态。 | 否 | 4 |
/fly others <PlayerCollection others> |
切换玩家的飞行状态。 | 是 | 4 |
/fly others <PlayerCollection others> <boolean flag> |
设置玩家的飞行状态。 | 是 | 4 |
原文:https://fuji-fabric.github.io/Modules/command_toolbox.freeze
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/freeze <EntityCollection target> <int ticks> |
冻结目标实体指定刻数。 | 是 | 4 |
原文:https://fuji-fabric.github.io/Modules/command_toolbox.glow
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/glow |
切换发光状态。 | 否 | 0 |
/glow <EntityCollection entities> |
(原文未提供说明) | 是 | 4 |
/glow others <PlayerCollection others> |
切换发光状态。 | 是 | 4 |
原文:https://fuji-fabric.github.io/Modules/command_toolbox.god
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/god |
切换无敌状态。 | 否 | 4 |
/god <boolean flag> |
设置无敌状态。 | 否 | 4 |
/god others <PlayerCollection others> |
切换无敌状态。 | 是 | 4 |
/god others <PlayerCollection others> <boolean flag> |
设置无敌状态。 | 是 | 4 |
原文:https://fuji-fabric.github.io/Modules/command_toolbox.hat
本模块提供 /hat 命令。
它允许玩家把 任意物品 放到 头部装备槽。
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/hat |
戴上手中的物品。 | 否 | 0 |
/hat others <PlayerCollection others> |
戴上手中的物品。 | 是 | 4 |
原文:https://fuji-fabric.github.io/Modules/command_toolbox.heal
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/heal |
补满玩家的 生命值 与 饥饿值。 |
否 | 4 |
/heal others <PlayerCollection others> |
补满玩家的 生命值 与 饥饿值。 |
是 | 4 |
原文:https://fuji-fabric.github.io/Modules/command_toolbox.help_op
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/help-op <GreedyString message> |
向在线 OP 发送求助消息。 | 否 | 0 |
原文:https://fuji-fabric.github.io/Modules/command_toolbox.itemname
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/itemname reset |
(原文未提供说明) | 否 | 4 |
/itemname set <GreedyString name> |
(原文未提供说明) | 否 | 4 |
原文:https://fuji-fabric.github.io/Modules/command_toolbox.jump
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/jump [Integer distance] |
跳跃到视线所及的位置。 | 否 | 4 |
/jump others <PlayerCollection others> [Integer distance] |
跳跃到视线所及的位置。 | 是 | 4 |
原文:https://fuji-fabric.github.io/Modules/command_toolbox.lore
◉ 为主手物品设置 lore
执行:/lore set <rainbow>the first line<newline><bold><green>the second
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/lore set <GreedyString lore> |
为物品设置 lore。 | 是 | 4 |
/lore unset |
清除物品的 lore。 | 是 | 4 |
原文:https://fuji-fabric.github.io/Modules/command_toolbox.more
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/more [Boolean oversize] |
把手中物品的数量设为最大堆叠数。 | 是 | 4 |
原文:https://fuji-fabric.github.io/Modules/command_toolbox.near
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/near [Integer distance] |
列出附近的玩家。 | 否 | 4 |
原文:https://fuji-fabric.github.io/Modules/command_toolbox.nickname
本模块允许自定义玩家的 显示名称。
◉ 在 Styled Chat 模组中使用 nickname 模块
参见:https://github.com/fuji-fabric/fuji/issues/489
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/command_toolbox/nickname/config.json
{
/* `设置` 昵称时使用的 `格式`。 */
"nickname_format": "%s <grey>(%player:name%)",
"nickname_constraints": {
"max_length": 16,
"accept_string_pattern": ".+",
"reject_string_pattern": ""
}
}文件:config/fuji/modules/command_toolbox/nickname/nickname.json
{
"format": {
"player2format": {
"Steve": "<rainbow>Steve"
}
}
}| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/nickname reset |
清除显示名称。 | 否 | 0 |
/nickname reset others <PlayerCollection others> |
清除显示名称。 | 是 | 4 |
/nickname set <GreedyString format> |
设置显示名称。 | 否 | 0 |
/nickname set others <PlayerCollection others> <GreedyString format> |
设置显示名称。 | 是 | 4 |
原文:https://fuji-fabric.github.io/Modules/command_toolbox.ping
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/ping <ServerPlayer target> |
查询玩家的延迟。 | 是 | 4 |
原文:https://fuji-fabric.github.io/Modules/command_toolbox.realname
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/realname |
查询昵称与真实名的映射关系。 | 是 | 0 |
原文:https://fuji-fabric.github.io/Modules/command_toolbox.repair
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/repair |
修复手中的物品。 | 否 | 4 |
/repair others <PlayerCollection others> |
修复手中的物品。 | 是 | 4 |
原文:https://fuji-fabric.github.io/Modules/command_toolbox.reply
本模块提供 /reply 命令。
用于回复最近用 /msg 或 /tell 私聊过你的玩家。
你可以用 command_alias 模块创建一条新命令 /r,作为 /reply 命令的别名。
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/reply <GreedyString message> |
回复最近用 /msg 或 /tell 私聊你的玩家。 | 否 | 0 |
/reply set-target <ServerPlayer target> |
设置回复目标玩家。 | 否 | 4 |
原文:https://fuji-fabric.github.io/Modules/command_toolbox.rules
◉ 确保玩家被允许使用 /command-callback 命令
/command-callback 是一条 fuji 命令,用于 点击事件。
在原版 Minecraft 中,如果玩家 没有权限 使用该命令,客户端会报 Unknown Command 错误。
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/command_toolbox/rules/config.json
{
"rules": "<blue>===== custom text =====\nHello <orange>%player:name%</orange>, you are in <orange>%world:name%</orange> now.\n<hover:show_text:'you see me!'>Hover me</hover>\n<click:run_command:'/back'>click me to run `/back` command</click>\n<newpage><blue>This is the second page!\n<click:suggest_command:'/back'>click me to suggest /back command (This doesn't work inside a book)</click>\n<insert:'hello'>shift + click me to insert \"hello\" (This doesn't work inside a book)</insert>\n<click:open_url:'https://placeholders.pb4.eu/user/text-format/'>click me to open the url</click>\n<newpage>This is the third page!\n<bold><click:change_page:'1'>click me to the first page</click></bold>\n<orange>You can press `<keybind:'key.jump'>` key to jump!</orange>\n<gradient:red:green:blue>This is gradient text.</gradient>\n<rb>The rainbow text</rb>\n<newpage>The end.\n"
}| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/rules |
查询服务器规则。 | 否 | 0 |
/rules others <PlayerCollection others> |
查询服务器规则。 | 是 | 4 |
原文:https://fuji-fabric.github.io/Modules/command_toolbox.seen
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/command_toolbox/seen/seen.json
{
"player2seen": {}
}| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/seen <OfflinePlayerName playerName> |
查询玩家最后在线时间。 | 是 | 4 |
原文:https://fuji-fabric.github.io/Modules/command_toolbox.speed
◉ 需要重新加入服务器才能修复客户端摄像机异常
当设置新的 速度 后,客户端的 摄像机 会出现异常。
你必须重新加入服务器,才能修复客户端摄像机设置。
◉ 把 行走速度 翻倍
默认值是 0.1。
执行:/speed walk set Steve 0.2
◉ 把 飞行速度 翻倍
默认值是 0.05。
执行:/speed fly set Steve 0.1
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/speed fly get <ServerPlayer target> |
(原文未提供说明) | 是 | 4 |
/speed fly reset <ServerPlayer target> |
(原文未提供说明) | 是 | 4 |
/speed fly set <ServerPlayer target> <float speed> |
(原文未提供说明) | 是 | 4 |
/speed walk get <ServerPlayer target> |
(原文未提供说明) | 是 | 4 |
/speed walk reset <ServerPlayer target> |
(原文未提供说明) | 是 | 4 |
/speed walk set <ServerPlayer target> <float speed> |
(原文未提供说明) | 是 | 4 |
原文:https://fuji-fabric.github.io/Modules/command_toolbox.suicide
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/suicide |
杀死自己。 | 否 | 0 |
原文:https://fuji-fabric.github.io/Modules/command_toolbox.top
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/top |
传送到当前位置的最高点。 | 否 | 0 |
/top others <PlayerCollection others> |
传送到当前位置的最高点。 | 是 | 4 |
原文:https://fuji-fabric.github.io/Modules/command_toolbox.tphere
这是一个便捷命令,用于把 他人 传送到 你身边。
类似于 /tp @a <player>。
例如:
-
/tphere Steve把Steve传送到你身边。 -
/tphere @a把所有在线玩家传送到你身边。
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/tphere <PlayerCollection targets> |
(原文未提供说明) | 否 | 4 |
原文:https://fuji-fabric.github.io/Modules/command_toolbox.tppos
提供 /tppos 命令。
一条 统一 而 强大 的传送命令。
例如:
-
/tppos --z 64 --x 32 --y 128传送到指定坐标 -
/tppos --others Steve指定目标玩家。 -
/tppos offline Alex传送到Alex 离线时的位置。 -
/tppos --dimension指定目标维度,并开始随机传送。 -
/tppos --minRange 1000 --maxRange 2000指定随机传送的配置。 -
/tppos here @a把所有在线玩家传送到你身边。 /tppos --biome minecraft:mushroom_fields
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/tppos [Dimension dimension] [Double x] [Double y] [Double z] [Float yaw] [Float pitch] [Integer centerX] [Integer centerZ] [Boolean circle] [Integer minRange] [Integer maxRange] [Integer minY] [Integer maxY] [Integer maxTryTimes] [Integer asyncChunkLoadingTimeoutTicks] [Integer chunkInhabitedTimeLowerThanTicks] [BiomeId biome] |
统一传送命令。 | 否 | 4 |
/tppos here <PlayerCollection targets> |
把 他人 传送到 你身边。例如:1. /tppos here Steve 把 Steve 传送到 你身边。2. /tppos here @a 把 所有在线玩家 传送到 你身边。 |
否 | 4 |
/tppos offline <OfflinePlayerName player> |
传送到某玩家离线时的位置。 | 否 | 4 |
/tppos others <PlayerCollection others> [Dimension dimension] [Double x] [Double y] [Double z] [Float yaw] [Float pitch] [Integer centerX] [Integer centerZ] [Boolean circle] [Integer minRange] [Integer maxRange] [Integer minY] [Integer maxY] [Integer maxTryTimes] [Integer asyncChunkLoadingTimeoutTicks] [Integer chunkInhabitedTimeLowerThanTicks] [BiomeId biome] |
统一传送命令。 | 是 | 4 |
原文:https://fuji-fabric.github.io/Modules/command_toolbox.trashcan
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/trashcan |
打开一个垃圾桶 GUI。 | 否 | 0 |
/trashcan others <PlayerCollection others> |
打开一个垃圾桶 GUI。 | 是 | 4 |
原文:https://fuji-fabric.github.io/Modules/command_toolbox.warp
◉ 为传送点设置显示名称
执行:/warp set-name <warp> <blue>This is the display name
◉ 为传送点设置 lore
执行:/warp set-lore <warp> <blue>This is the first line|<red>This is the second line
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/command_toolbox/warp/warp.json
{
"warps": {}
}| 任务名 | 说明 |
|---|---|
ConfigurationHandlerWriteStorageJob |
该 任务 用于把 数据 从 内存 写入 存储。注意:如果你在 磁盘 上修改了该 文件,需要尽快执行 /fuji reload。注意:触发 该任务时,磁盘 上的文件会被 覆盖。 |
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/warp |
(原文未提供说明) | 是 | 0 |
/warp list |
列出传送点。 | 是 | 0 |
/warp set <String warpName> [Boolean override] |
把当前位置设为新的传送点。 | 否 | 4 |
/warp set-item <WarpDescriptor warp> <ItemStackWrapper itemStack> |
为某个传送点设置图标物品。 | 否 | 4 |
/warp set-lore <WarpDescriptor warp> <GreedyString lore> |
为某个传送点设置 lore。 | 否 | 4 |
/warp set-name <WarpDescriptor warp> <GreedyString name> |
为某个传送点设置显示名称。 | 否 | 4 |
/warp set-position <WarpDescriptor warp> |
为某个传送点设置位置。 | 否 | 4 |
/warp tp <WarpDescriptor warpName> |
传送到指定传送点。 | 否 | 0 |
/warp tp others <PlayerCollection others> <WarpDescriptor warpName> |
传送到指定传送点。 | 是 | 4 |
/warp unset <WarpDescriptor warpName> |
删除一个传送点。 | 否 | 4 |
| 参数类型 | 对应类 |
|---|---|
[warp-name] |
[WarpDescriptor] |
本模块允许在命令执行前定义 冷却(预热等待)。
command_warmup 模块发生在命令执行 之前。
command_cooldown 模块发生在命令执行 之后。
注意:拥有 4 级权限的玩家可以绕过命令预热。
◉ 为所有命令设置预热
正则:.+
正则中的 . 字符表示 匹配任意字符。
正则中的 + 字符表示 量词,一次或多次。
◉ 为所有命令设置预热,但为 /back 命令指定特殊配置
你只需把 /back 命令的 配置段 写在规则 最上方。
规则 按自上而下的顺序 匹配,并使用 第一条匹配的规则。
所以,你只要把 特殊规则 写在其他规则的上方即可。
◉ 为所有命令设置预热,但 /back 命令除外
正则:(?!back).+
该正则使用 负向前瞻,排除 以 back 开头 的字符串。
◉ 为多条命令共享同一份预热配置
正则:(back)|(heal)|(feed)
你可以在 正则 中使用 选择字符 |。
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/command_warmup/config.json
{
/* 是否在玩家没有移动时发送警告消息? */
"warn_for_move": true,
"admin_players_can_bypass": false
/* 已定义的 `预热` 规则。 */,
"rules": [
{
"tags": [
"default-tag-name"
]
/* `目标命令` 与 `预热毫秒数`。 */,
"command": {
/* 用于匹配 `目标命令` 的 `正则` 表达式。 */
"regex": "back"
/* `预热时间`,单位毫秒。 */,
"warmup_time_ms": 3000
},
"interruptible": {
/* 该请求是否可被打断? */
"enable": true
/* 打断该请求的最大距离。 */,
"interrupt_distance": 3.0
/* 玩家受到伤害时打断该请求。 */,
"interrupt_on_damaged": true
/* 玩家处于战斗状态时打断该请求。 */,
"interrupt_in_combat": true
}
},
{
"tags": [
"default-tag-name"
]
/* `目标命令` 与 `预热毫秒数`。 */,
"command": {
/* 用于匹配 `目标命令` 的 `正则` 表达式。 */
"regex": "heal"
/* `预热时间`,单位毫秒。 */,
"warmup_time_ms": 1000
},
"interruptible": {
/* 该请求是否可被打断? */
"enable": true
/* 打断该请求的最大距离。 */,
"interrupt_distance": 3.0
/* 玩家受到伤害时打断该请求。 */,
"interrupt_on_damaged": true
/* 玩家处于战斗状态时打断该请求。 */,
"interrupt_in_combat": true
}
}
]
}本模块在玩家死亡时,把其背包保存为 死亡记录。
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/deathlog |
打开 deathlog GUI。 |
否 | 4 |
该页是 disabler 系列的入口,原文未提供额外内容。其子模块分别用于关闭服务端的各类检测,见下方各节。
原文:https://fuji-fabric.github.io/Modules/disabler.chat_speed_disabler
本模块禁用 Kicked for spamming(因刷屏被踢出)检测。
原文:https://fuji-fabric.github.io/Modules/disabler.max_player_disabler
本模块禁用服务端的 最大玩家数量限制。
原文:https://fuji-fabric.github.io/Modules/disabler.move_speed_disabler
本模块禁用 player moved too quickly 与 vehicle moved too quickly 检测。
原文:https://fuji-fabric.github.io/Modules/disabler.move_wrongly_disabler
本模块禁用 player moved wrongly 与 vehicle moved wrongly 检测。
在原版 Minecraft 服务端中,有一个检测玩家移动是否正确的检查器。
不过,该检查器经常误判。
并且会强制把玩家拉回原位,让客户端感觉游戏有卡顿。
本模块在 服务器崩溃 时提供 服务端崩溃分析器。
本模块提供 构建文档文件 的工具。
注意:本模块通常由开发者用于生成用户手册。
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/document build |
(原文未提供说明) | 是 | 4 |
本模块提供一组 echo 命令。
echo 命令 会把 文本 显示在客户端的某个特定 位置。
具体命令由各子模块提供,见下方各节。
原文:https://fuji-fabric.github.io/Modules/echo.send_actionbar
本模块提供 /send-actionbar 命令。
用于把 文本 作为 动作栏(action bar)消息发送给指定玩家。
◉ 向玩家发送标题
执行:/send-title Alice --mainTitle "<rainbow>Hello" --subTitle "<blue>World" --fadeInTicks 60 --stayTicks 60 --fadeOutTicks 60
◉ 向在线玩家发送标题
执行:/foreach send-title %player:name% --mainTitle "<rainbow>Hello %player:name%"
注:原文该示例使用的命令为
send-title(与本节主题send-actionbar不同),此处按原文保留。
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/send-actionbar <ServerPlayer player> <GreedyString rest> |
(原文未提供说明) | 是 | 4 |
本模块提供 /send-bossbar 命令。
用于把 文本 作为 bossbar(Boss 血条)发送给指定玩家。
◉ 一个简单示例
执行:/send-bossbar Alice Hello World
◉ 全参数示例
执行:/send-bossbar Alice --stepType BACKWARD --totalMs 5000 --color PURPLE --style NOTCHED_6 --notifyMeOnComplete true --commandList "say the player %player:name% is healed|heal others %player:name%" <rb>Healing is coming [elapsed_time]/[total_time]/[left_time]
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/send-bossbar <ServerPlayer player> [Integer totalMs] [BossBarColor color] [BossBarOverlay style] [StringList commandList] [Boolean notifyMeOnComplete] [StepType stepType] <GreedyString title> |
(原文未提供说明) | 是 | 4 |
原文:https://fuji-fabric.github.io/Modules/echo.send_broadcast
本模块提供 /send-broadcast 命令。
用于把 文本 作为 消息 发送给 所有在线玩家。
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/send-broadcast <GreedyString rest> |
(原文未提供说明) | 是 | 4 |
本模块提供 /send-chat 命令。
用于以某个玩家的身份发送 聊天消息。
◉ 以玩家身份发送聊天消息
执行:/send-chat Steve i am steve.
◉ 为每个在线玩家各发送一条以该玩家身份的消息
执行:/foreach send-chat %player:name% i am %player:name%
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/send-chat <ServerPlayer player> <GreedyString message> |
(原文未提供说明) | 是 | 4 |
本模块提供 /send-console 命令。
用于把字符串发送到 控制台。
◉ 向控制台发送一个字符串
执行:/send-console Hello World
◉ 把某个动作记录到控制台
你可以与其他模块集成,来 记录特定动作。
效果类似:/run as console send-console Player %player:name% joins the server.
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/send-console <GreedyString message> |
(原文未提供说明) | 是 | 4 |
本模块提供 /send-custom 命令。
它允许定义带自动分页的 自定义文本。
之后可以把该文本 作为消息 或 作为成书 发送给玩家。
◉ 确保玩家被允许使用 /command-callback 命令
/command-callback 是一条 fuji 命令,用于 点击事件。
在原版 Minecraft 中,如果玩家 没有权限 使用该命令,客户端会报 Unknown Command 错误。
◉ 下载示例自定义文本
你可以下载 example-custom-text.txt 文件。
它位于 https://github.com/fuji-fabric/fuji/blob/dev/.github/files/example-custom-text.txt
◉ 把自定义文本作为成书发送
执行:/send-custom as-book Alice guide --author "alice" --title "<rb>The Guide" --giveBook true --openBook true
◉ 把自定义文本作为消息发送
执行:/send-custom as-message Alice guide
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/send-custom as-book <ServerPlayer player> <CustomTextName customTextName> [Boolean openBook] [Boolean giveBook] [String title] [String author] |
把 自定义文本 作为 成书 发送。 |
是 | 4 |
/send-custom as-message <ServerPlayer player> <CustomTextName name> |
把 自定义文本 作为 消息 发送。 |
是 | 4 |
| 参数类型 | 对应类 |
|---|---|
[custom-text-name] |
[CustomTextName] |
使用 对话框 GUI 发送 文本。
例如:
/send-dialog Steve <blue>Hello/send-dialog Steve --noButtonSlotIndex -1 <green>Confirm me./send-dialog Steve --yesButtonCommand "say confirmed" <blue>Confirm me.
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/send-dialog <ServerPlayer player> [Integer rows] [Integer yesButtonSlotIndex] [ItemStackWrapper yesButtonItem] [String yesButtonName] [String yesButtonCommand] [Integer noButtonSlotIndex] [ItemStackWrapper noButtonItem] [String noButtonName] [String noButtonCommand] [Boolean canCloseUsingNoButton] <GreedyString title> |
向玩家发送一个对话框 GUI。 | 是 | 4 |
本模块提供 /send-message 命令。
用于把 文本 作为 消息 发送给指定玩家。
◉ 向玩家问好
执行:/send-message Alice <blue>Hello %player:name%
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/send-message <ServerPlayer player> <GreedyString rest> |
(原文未提供说明) | 是 | 4 |
本模块提供 /send-title 命令。
用于把 文本 作为 标题(title)发送给指定玩家。
◉ 向玩家发送标题
执行:/send-title Alice --mainTitle "<rainbow>Hello" --subTitle "<blue>World" --fadeInTicks 60 --stayTicks 60 --fadeOutTicks 60
◉ 向在线玩家发送标题
执行:/foreach send-title %player:name% --mainTitle "<rainbow>Hello %player:name%"
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/send-title <ServerPlayer player> [String mainTitle] [String subTitle] [Integer fadeInTicks] [Integer stayTicks] [Integer fadeOutTicks] |
(原文未提供说明) | 是 | 4 |
本模块提供 /send-toast 命令。
用于把 文本 作为 toast(提示浮窗)发送给指定玩家。
你可以发送带自定义图标的 toast。
其语法与 /give 命令相同。
例如:
/send-toast @s --icon "minecraft:player_head[minecraft:profile=Steve]" <rb>Hello World
◉ 向玩家发送一个 toast
执行:/send-toast Alice --icon minecraft:golden_carrot <rb>eat this carrot
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/send-toast <ServerPlayer player> [AdvancementFrameTypeIR toastType] [ItemStackWrapper icon] <GreedyString message> |
(原文未提供说明) | 是 | 4 |
| 参数类型 | 对应类 |
|---|---|
[advancement-frame] |
[AdvancementFrameTypeIR] |
本模块启用 经济玩法。
它允许定义 自定义货币类型。
一个 玩家 可以拥有多个 账户。
每个 账户 持有一种 货币。
◉ 搭建 系统商店 与 玩家商店
你可以把本模块与 Universal Shops 模组配合使用。
该模组提供 系统商店 与 玩家商店。
它把类似 bukkit 中 QuickShop 插件的玩法带到了 fabric。
◉ 创建一条供玩家使用的 /balance 命令
你可以使用 command_bundle 模块。
创建一条 /balance 命令,包装 /economy account %player:name% fuji:gold 命令。
这样玩家就能方便地查询余额。
◉ 查询自己的所有 货币 余额
执行:/economy balance
◉ 查询目标玩家的所有 货币 余额
执行:/economy accounts Steve
◉ 查询目标玩家指定 货币 的 余额
执行:/economy account Steve fuji:gold
◉ 为玩家 增加、扣除、设置 或 清空 指定 货币 的 余额
/economy give Steve fuji:gold 100/economy take Steve fuji:gold 100/economy set Steve fuji:gold 100/economy clear Steve fuji:gold --confirm true
◉ 把指定 货币 的指定 金额 从自己转账给另一个玩家
执行:/economy pay Bob fuji:gold 100
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/economy/config.json
{
"provider_icon": "minecraft:cherry_sapling",
"balance_top_page_size": 10
/* 定义你的 `自定义经济货币` 类型。 */,
"currencies": [
{
/* `自定义货币` 的标识符。`命名空间` 必须是 `fuji`。 */
"currency_id": "fuji:gold"
/* 该货币的 `显示名称`。 */,
"currency_name": "<gold>Fuji Gold"
/* 该货币的 `显示物品`。 */,
"currency_icon_item": "minecraft:gold_ingot"
/* 该货币的默认余额。(原始数值格式) */,
"default_face_balance": 100.0
/* 该货币的 `格式化字符串`。 */,
"format_value_string": "%.2f"
/* 该货币的 `格式化文本`。 */,
"format_value_text": "<yellow>$%.2f"
},
{
/* `自定义货币` 的标识符。`命名空间` 必须是 `fuji`。 */
"currency_id": "fuji:diamond"
/* 该货币的 `显示名称`。 */,
"currency_name": "<aqua>Fuji Diamond"
/* 该货币的 `显示物品`。 */,
"currency_icon_item": "minecraft:diamond"
/* 该货币的默认余额。(原始数值格式) */,
"default_face_balance": 0.0
/* 该货币的 `格式化字符串`。 */,
"format_value_string": "%.2f"
/* 该货币的 `格式化文本`。 */,
"format_value_text": "<aqua>$%.2f"
}
]
}文件:config/fuji/modules/economy/economy-data.json
{
/* 为每种 `货币` 保存的 `账户`。 */
"currencies": []
}| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/economy account <OfflineGameProfile player> <CurrencyId currencyId> |
获取 玩家 在指定 货币 ID 下的 账户。 |
是 | 4 |
/economy accounts <OfflineGameProfile player> |
列出 玩家 拥有的所有 账户。 |
是 | 4 |
/economy balance |
查询你自己的经济 账户。 |
否 | 4 |
/economy balance-top <CurrencyId currencyId> |
以消息形式列出指定货币的排行榜玩家。 | 否 | 4 |
/economy balance-top gui <CurrencyId currencyId> |
以 GUI 形式列出指定货币的排行榜玩家。 | 否 | 4 |
/economy clear <OfflineGameProfile player> <CurrencyId currencyId> [Boolean confirm] |
清空玩家在 指定货币 下 账户 的 金额。 |
是 | 4 |
/economy give <OfflineGameProfile player> <CurrencyId currencyId> <double amount> |
为玩家在 指定货币 下的 账户 增加 金额。 |
是 | 4 |
/economy pay <OfflineGameProfile player> <CurrencyId currencyId> <double amount> |
把指定 金额 的 货币 支付到另一个玩家的账户。 |
否 | 4 |
/economy providers |
列出所有已安装的 经济提供者 及其提供的 经济货币。 |
是 | 4 |
/economy set <OfflineGameProfile player> <CurrencyId currencyId> <double amount> |
设置玩家在 指定货币 下 账户 的 金额。 |
是 | 4 |
/economy take <OfflineGameProfile player> <CurrencyId currencyId> <double amount> |
从玩家在 指定货币 下的 账户 扣除 金额。 |
是 | 4 |
/has-currency? <OfflineGameProfile player> <CurrencyId currencyId> <double amount> |
是否拥有指定数量的货币? | 是 | 4 |
| 占位符 | 说明 |
|---|---|
fuji:balance |
返回该玩家指定 货币 的 余额。语法为 %fuji:balance <currency-id>%。例如 %fuji:balance fuji:gold% 会返回 fuji:gold 货币的 余额。◉ 正确转义占位符: 1. /send-message %player:name% Your balance is %fuji:balance fuji:gold% 2. /run as console send-message %player:name% Your balance is %fuji:balance fuji:gold% 为防止占位符被 /run 命令解析,在第 2. 种情况下你需要在占位符前插入一个 反斜杠 字符。 |
| 参数类型 | 对应类 |
|---|---|
[currency_id] |
[CurrencyId] |
本模块为 Lisp 方言语言 提供一个 求值器。
◉ 本模块目前是实验性模块
未来的版本中可能会发生改动。
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/lisp <GreedyString form> |
/lisp eval 命令的别名。 |
是 | 4 |
/lisp eval <GreedyString form> |
求值一个 lisp 表达式。 | 是 | 4 |
提供 /fuji 命令。
用于 重载 fuji 的配置。
用于 查询 fuji 的状态。
用于 探索 fuji 的内容。
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/fuji |
/fuji inspect modules 的别名。 |
否 | 4 |
/fuji about |
打开关于界面。 | 否 | 4 |
/fuji debug |
切换 fuji 的调试模式。 | 是 | 4 |
/fuji gui |
/fuji inspect modules 的别名。 |
否 | 4 |
/fuji inspect argument-types |
查询 fuji 注册的所有参数类型。 | 否 | 4 |
/fuji inspect configurations |
查询 fuji 使用的所有已加载配置文件。 | 否 | 4 |
/fuji inspect events |
查询 fuji 注册的事件。 | 否 | 4 |
/fuji inspect fuji-commands |
查询 fuji 注册的所有命令。 | 否 | 4 |
/fuji inspect jobs |
查询 fuji 注册的任务。 | 否 | 4 |
/fuji inspect languages |
查询 fuji 已加载的语言文件。 | 否 | 4 |
/fuji inspect mixins |
查询 fuji 应用的 mixin。 | 否 | 4 |
/fuji inspect modules |
查询 fuji 所有已启用/已禁用的模块。 | 否 | 4 |
/fuji inspect permissions-and-metas |
查询 fuji 使用的权限与元数据。 | 否 | 4 |
/fuji inspect placeholders |
查询 fuji 注册的占位符。 | 否 | 4 |
/fuji inspect registry |
查询服务器中的所有注册表。 | 否 | 4 |
/fuji inspect server-commands |
查询服务器中注册的所有命令。 | 否 | 4 |
/fuji reload |
重载 /fuji inspect configurations 中的所有配置文件,并重载 /fuji inspect modules 中所有 已启用 的模块。注意:启用/禁用模块后,你必须 重启 服务器。 |
是 | 4 |
/fuji user-guide |
打印 fuji 的用户指南。 | 是 | 4 |
本模块提供为 功能方块 打开 虚拟 GUI 的命令。
每个子模块对应一种功能方块,见下方各节。所有子命令都以 /xxx(自己)或 /xxx others <players>(他人)两种形式存在,控制台可执行性与所需权限等级分别如下:自己使用需 4 级权限且控制台不可执行,对他人使用需 4 级权限且控制台可执行。
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/anvil |
(原文未提供说明) | 否 | 4 |
/anvil others <PlayerCollection others> |
(原文未提供说明) | 是 | 4 |
原文:https://fuji-fabric.github.io/Modules/functional.cartography
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/cartography |
(原文未提供说明) | 否 | 4 |
/cartography others <PlayerCollection others> |
(原文未提供说明) | 是 | 4 |
原文:https://fuji-fabric.github.io/Modules/functional.enchantment
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/functional/enchantment/config.json
{
"enchantment": {
"override_power": {
"power_provider_amount": 15
}
}
}| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/enchantment |
(原文未提供说明) | 否 | 4 |
/enchantment others <PlayerCollection others> |
(原文未提供说明) | 是 | 4 |
原文:https://fuji-fabric.github.io/Modules/functional.enderchest
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/enderchest |
(原文未提供说明) | 否 | 4 |
/enderchest others <PlayerCollection others> |
(原文未提供说明) | 是 | 4 |
原文:https://fuji-fabric.github.io/Modules/functional.grindstone
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/grindstone |
(原文未提供说明) | 否 | 4 |
/grindstone others <PlayerCollection others> |
(原文未提供说明) | 是 | 4 |
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/loom |
(原文未提供说明) | 否 | 4 |
/loom others <PlayerCollection others> |
(原文未提供说明) | 是 | 4 |
原文:https://fuji-fabric.github.io/Modules/functional.smithing
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/smithing |
(原文未提供说明) | 否 | 4 |
/smithing others <PlayerCollection others> |
(原文未提供说明) | 是 | 4 |
原文:https://fuji-fabric.github.io/Modules/functional.stonecutter
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/stonecutter |
(原文未提供说明) | 否 | 4 |
/stonecutter others <PlayerCollection others> |
(原文未提供说明) | 是 | 4 |
原文:https://fuji-fabric.github.io/Modules/functional.workbench
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/workbench |
(原文未提供说明) | 否 | 4 |
/workbench others <PlayerCollection others> |
(原文未提供说明) | 是 | 4 |
该页是 gameplay 系列的入口,原文未提供额外内容。见下方各节。
原文:https://fuji-fabric.github.io/Modules/gameplay.multi_obsidian_platform
本模块让每一个 末地传送门框架 都生成属于自己的 黑曜石平台。
◉ 所有黑曜石平台都与原版行为一致
也就是说,所有额外生成的 黑曜石平台 与位于 (100, 50, 0) 的原版平台行为 完全相同。
◉ 在下界建造 末地传送门 时的一个众所周知的现象
参见 https://bugs.mojang.com/browse/MC-252361
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/gameplay/multi_obsidian_platform/config.json
{
/* `主世界` 与 `末地` 之间的 `坐标缩放系数`。 */
"factor": 4.0
}本模块允许玩家从 头颅商店 购买装饰性头颅。
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/head/config.json
{
"economy_type": "ITEM",
"cost_item_type": "minecraft:emerald_block",
"cost_item_amount": 1
}| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/head |
参见 /head gui
|
否 | 0 |
/head gui |
打开头颅商店 GUI。 | 否 | 0 |
/head sync |
从互联网下载头颅数据库。(你需要先删除已有的头颅数据库文件。) | 是 | 4 |
本模块允许玩家设置自己的家。
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/home/home.json
{
"name2home": {}
}| 任务名 | 说明 |
|---|---|
ConfigurationHandlerWriteStorageJob |
该 任务 用于把 数据 从 内存 写入 存储。注意:如果你在 磁盘 上修改了该 文件,需要尽快执行 /fuji reload。注意:触发 该任务时,磁盘 上的文件会被 覆盖。 |
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/home |
传送到你的任意一个家。 | 否 | 0 |
/home gui |
(原文未提供说明) | 否 | 0 |
/home gui <OfflinePlayerName target> |
(原文未提供说明) | 否 | 4 |
/home list |
(原文未提供说明) | 否 | 0 |
/home rename <HomeName oldName> <String newName> |
(原文未提供说明) | 否 | 0 |
/home set <HomeName home> [Boolean override] |
(原文未提供说明) | 否 | 0 |
/home tp <HomeName home> |
(原文未提供说明) | 否 | 0 |
/home unset <HomeName home> |
(原文未提供说明) | 否 | 0 |
| 参数类型 | 对应类 |
|---|---|
[home-name] |
[HomeName] |
本模块允许定义 监狱。
它可以用来 惩罚 行为不当的玩家,而无需 封禁 他们。
- 每个
监狱描述符用于定义一个监狱实例。 1.a. 你可以用/jail create命令创建一个描述符。 1.b. 你可以用/jail delete命令删除一个描述符。 1.c. 你可以用/jail list命令列出所有已创建的描述符。 - 每个
监狱可以容纳多于 1 个玩家。 2.a. 每个被关押的玩家都会记录一条监狱记录。 2.b. 一个玩家同一时间只能被关进一个监狱。 - 每个
监狱都有一个位置属性。 3.a. 当你运行/jail create命令时,它会被初始化为你的当前位置。 3.b. 你可以用/jail set-position命令为它设置新位置。 3.c. 你可以用/jail tp命令传送到该位置。 - 你可以把
玩家关进监狱,或者释放出来。 4.a. 要关进,用/jail put命令。 4.b. 要释放,用/jail un-put命令。 4.c. 要查询信息,用/jail where命令。
◉ 被封禁的玩家 与 被关押的玩家 的区别
- 对于
被封禁的玩家:他们无法加入服务器。 - 对于
被关押的玩家:他们可以加入服务器。
注意:监狱 只用于保存信息。
你需要在 onJailedEvent 与 onUnjailedEvent 中编写 惩罚命令。
你也可以编写 巡逻命令,检查并限制被关押玩家的行为。
%fuji:jail_dimension%%fuji:jail_x%%fuji:jail_y%%fuji:jail_z%%fuji:jail_yaw%%fuji:jail_pitch%
◉ 把 被关押玩家 的 移动 限制在指定区域内
借助 位置占位符,你可以编写 巡逻命令 来限制移动。
你可以定义命令,把被关押玩家的移动限制在指定区域内。
/execute as %player:name% at @s unless dimension %fuji:jail_dimension% run execute in %fuji:jail_dimension% run tp @s %fuji:jail_x% %fuji:jail_y% %fuji:jail_z%/execute as %player:name% if entity @s[x=%fuji:jail_x%,y=%fuji:jail_y%,z=%fuji:jail_z%,distance=8..] run tp @s %fuji:jail_x% %fuji:jail_y% %fuji:jail_z%
注意:如果你启用了 teleport_warmup 模块,记得为 jailed 用户组分配 预热绕过 权限。
这样 被关押玩家 才能被 立即 传送回 监狱位置。
/lp group jailed permission set fuji.teleport_warmup.bypass
注意:要关闭 原版 Minecraft 命令反馈,可以执行:
/gamerule sendCommandFeedback false
有些命令需要 目标玩家 在线才能生效。
例如,当目标玩家 离线 时,/send-message %player:name% You are jailed. 不会生效。
在这种情况下,你可以使用 command_meta.when_online 模块来提交并排期一条命令。
执行:/when-online %player:name% send-message %player:name% You are jailed.
◉ 为 被关押玩家 创建 luckperms 组
你可以为 被关押玩家 创建一个 luckperms 组。
并为 被关押玩家 分配 正向权限 与 负向权限。
用这些 权限 控制 被关押玩家 的行为。
◉ 限制 被关押玩家 的行为
你可以与 anti_build 模块集成。
为 jailed 用户组 分配 负向权限,以限制他们的行为。
执行:
/lp group jailed permission set fuji.anti_build.break_block.override.* false/lp group jailed permission set fuji.anti_build.place_block.override.* false/lp group jailed permission set fuji.anti_build.interact_item.override.* false/lp group jailed permission set fuji.anti_build.interact_entity.override.* false/lp group jailed permission set fuji.anti_build.interact_block.override.* false
注意:你需要在 luckperms 模组配置中启用 通配符权限 功能。
◉ 限制 被关押玩家 只能使用被允许的命令
你可以与 command_permission 模块集成。
执行:
/lp group jailed permission set fuji.permission.* false
禁止使用 所有命令。
/lp group jailed permission set fuji.permission.back true
允许使用 /back 命令。
◉ 在你当前位置创建一个 监狱
执行:/jail create <jail-id>
◉ 把某个监狱的位置设为你的当前位置
执行:/jail set-position <jail-id>
◉ 传送到某个监狱的位置
执行:/jail tp <jail-id>
◉ 列出所有已创建的监狱
执行:/jail list
◉ 把玩家关进监狱
执行:
/jail put Steve <jail-id> Steal items./jail put Steve <jail-id> --duration 1s2m3h4d5w6M7y Steal items.
◉ 把玩家从监狱中释放
执行:/jail unput Steve
◉ 查询玩家被关在哪个监狱
执行:/jail where Steve
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/jail/config.json
{
"no_jail_status_text": "<grey>[None]",
"jailed_player_tab_list_text": "<dark_red>[Prisoner] %player:name%</dark_red>"
/* `监狱描述符` 用于定义一个 `监狱`。 */,
"jail_descriptors": [
{
"id": "example",
"display_name": "<blue>The Great Jail</blue>"
/* 未指定 `关押时长` 时使用的 `默认关押时长`。 */,
"default_jailed_duration": "15m",
"count_remaining_jail_seconds_when_prisoners_offline": false,
"global_position": {
"level": "minecraft:overworld",
"x": 0.0,
"y": 64.0,
"z": 0.0,
"yaw": 0.0,
"pitch": 0.0
},
"events": {
"on_jailed_event": [
"send-broadcast <dark_red><b>The player %player:displayname% has been jailed.<newline>◉ Duration: %fuji:jail_specified_duration%<newline>◉ Reason: %fuji:jail_reason%",
"lp user %player:name% permission set group.jailed",
"when-online %player:name% send-title %player:name% --mainTitle \"<dark_red>You have been jailed.\""
],
"on_unjailed_event": [
"send-broadcast <green><b>The player %player:displayname% has been un-jailed.",
"lp user %player:name% permission unset group.jailed",
"when-online %player:name% send-title %player:name% --mainTitle \"<green>You have been un-jailed.\""
]
},
"patrol": {
"patrol_interval_mill_seconds": 3000,
"patrol_commands": [
"execute as %player:name% at @s unless dimension %fuji:jail_dimension% run execute in %fuji:jail_dimension% run tp @s %fuji:jail_x% %fuji:jail_y% %fuji:jail_z%",
"execute as %player:name% if entity @s[x=%fuji:jail_x%,y=%fuji:jail_y%,z=%fuji:jail_z%,distance=8..] run tp @s %fuji:jail_x% %fuji:jail_y% %fuji:jail_z%"
]
}
}
]
}文件:config/fuji/modules/jail/jail-data.json
{
"jail_data_nodes": []
}| 任务名 | 说明 |
|---|---|
ConfigurationHandlerWriteStorageJob |
该 任务 用于把 数据 从 内存 写入 存储。注意:如果你在 磁盘 上修改了该 文件,需要尽快执行 /fuji reload。注意:触发 该任务时,磁盘 上的文件会被 覆盖。 |
PatrolJailJob |
该 任务 用于周期性地为某个 监狱 执行巡逻命令。 |
UpdateJailRecordsJob |
该任务用于更新所有 监狱 中所有生效的 监狱记录。 |
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/is-jailed? <String playerName> |
判定目标玩家是否被关押的判定命令。 | 是 | 4 |
/jail create <String jailId> |
创建一个新的 监狱描述符。 |
是 | 4 |
/jail delete <JailDescriptor jail> [Boolean confirm] |
删除一个已存在的 监狱描述符。 |
是 | 4 |
/jail gui |
打开监狱 GUI。 | 否 | 4 |
/jail list |
列出所有已定义的 监狱。 |
是 | 4 |
/jail put <OfflinePlayerName playerName> <JailDescriptor jail> [Duration duration] <GreedyString reason> |
把 玩家 关进指定的 监狱。 |
是 | 4 |
/jail set-position <JailDescriptor jail> |
把指定 监狱 的 位置 设为你的当前位置。 |
否 | 4 |
/jail tp <JailDescriptor jail> |
传送到某个已存在 监狱 的 位置。 |
否 | 4 |
/jail tp others <PlayerCollection others> <JailDescriptor jail> |
传送到某个已存在 监狱 的 位置。 |
是 | 4 |
/jail un-put <JailedPlayerName playerName> |
把玩家从当前所在的监狱中移出。 | 是 | 4 |
/jail where <JailedPlayerName playerName> |
查找玩家所在的 监狱。 |
是 | 4 |
| 占位符 | 说明 |
|---|---|
fuji:jail_id |
返回玩家当前 监狱记录 中的 监狱 id。 |
fuji:jail_displayname |
返回玩家当前 监狱记录 中的 监狱显示名称。 |
fuji:jail_creator_name |
返回玩家当前 监狱记录 中的 创建者名称。 |
fuji:jail_created_date |
返回玩家当前 监狱记录 中的 创建日期。 |
fuji:jail_specified_duration |
返回玩家当前 监狱记录 中的 指定关押时长。 |
fuji:jail_remaining_duration |
返回玩家当前 监狱记录 中的 剩余关押时长。 |
fuji:jail_reason |
返回玩家当前 监狱记录 中的 原因。 |
fuji:jail_dimension |
返回玩家当前 监狱记录 中的 维度。 |
fuji:jail_x |
返回玩家当前 监狱记录 中的 x 坐标。 |
fuji:jail_y |
返回玩家当前 监狱记录 中的 y 坐标。 |
fuji:jail_z |
返回玩家当前 监狱记录 中的 z 坐标。 |
fuji:jail_yaw |
返回玩家当前 监狱记录 中的 yaw 朝向。 |
fuji:jail_pitch |
返回玩家当前 监狱记录 中的 pitch 俯仰。 |
| 参数类型 | 对应类 |
|---|---|
[jail-id] |
[JailDescriptor] |
[jailed-player-name] |
[JailedPlayerName] |
本模块允许把一组物品堆制作成一个 礼包,并把礼包分发给玩家。
◉ 为在线玩家自动领取指定礼包
你可以用 command_scheduler 模块,每分钟自动为在线玩家执行 礼包领取命令。
◉ 给新手玩家一个礼包
你可以用 command_event 模块,给新手玩家一个礼包。
◉ 做一个展示所有可用礼包的 GUI
你可以与 command_menu 模块集成。
创建一个 菜单 来 展示 可用礼包,让 领取 礼包 更方便。
◉ 把礼包领取命令附着到对象上
你可以与 command_attachment 模块集成。
把礼包领取命令附着到 方块、实体 或 物品 上。
◉ 创建一个礼包
执行:/kit editor 创建一个新 礼包。
◉ 把礼包给予玩家
执行:/kit give Alice <kit-name> 把 礼包 给予玩家。
◉ 创建一条用户级命令,供玩家 领取礼包
/kit give 命令是 管理员级 命令,你不应允许玩家直接使用它。
提示:你需要用 command_bundle 模块创建一条新的 用户级 命令,供玩家 领取礼包。
◉ 为礼包关联冷却
你可以用 command_cooldown 模块,为 礼包领取命令 创建一个 命名冷却。
创建 命名冷却:
执行:/command-cooldown create example-kit-cooldown 60000
要检测冷却并在满足冷却时发放礼包:
你需要为该 命名冷却 配置 try-use 部分,并使用 /command-cooldown try-use 来使用它。
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/kit editor |
打开礼包编辑器 GUI。 | 否 | 4 |
/kit give <ServerPlayer player> <KitName kit> |
把礼包给予玩家。 | 是 | 4 |
/kit preview <ServerPlayer player> <KitName kit> |
打开 GUI 预览指定礼包。 | 是 | 4 |
| 参数类型 | 对应类 |
|---|---|
[kit-name] |
[KitName] |
本模块在可能的情况下,尊重 客户端语言选项。
在 Minecraft 1.20.1 之后,客户端 会把它的 客户端语言选项 发送给 服务端。
所以 服务端 可以在可能的情况下尊重 客户端语言。
禁用本模块时:fuji 会对所有玩家始终使用 default_language。
启用本模块时:fuji 会尽可能尊重玩家的 客户端语言选项。
也就是说,如果启用本模块,fuji 就会同时支持 多种语言。
fuji 会为不同玩家使用 不同语言。(尊重客户端语言选项)
把目标 实体 按指定的 方向 与 力度 弹射出去。
◉ 做一个踩上去就把玩家弹起的 弹跳板
你可以与 command_attachment 模块集成。
执行:/command-attachment attach-block-one ~ ~ ~ --interactType STEP_ON <command>
◉ 做一根把周围实体击飞的 击退棒
执行:/command-attachment attach-item-one launch at %player:name% @e[type=!minecraft:player,distance=..8] 30 1
◉ 使用较低 角度 实现 快速水平 移动
/launch facing @s 15 1/launch facing @s 15 3.9
力度 被限制在 [-3.9, +3.9]。
◉ 使用中等 角度 实现 水平与垂直兼顾 的移动
/launch facing @s 30 3.9/launch facing @s 45 3.9
◉ 使用较高 角度 实现 火箭发射器 效果
执行:/launch facing @s 60 3.9
提示:记得带上你的 鞘翅。
◉ 使用 垂直角度 实现 蹦床 效果
执行:/launch facing @s 90 1
◉ 使用 正力度 实现 推 的效果
执行:/launch facing @s 0 1
◉ 使用 负力度 实现 拉 的效果
执行:/launch facing @s 0 -1
◉ 以另一个实体的视角作为方向,击飞 目标实体
执行:/launch at @s @e[type=!minecraft:player,distance=..8] 30 1
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/launch at <Entity at> <EntityCollection target> <float angle> <double power> |
(原文未提供说明) | 是 | 4 |
/launch facing <EntityCollection target> <float angle> <double power> |
(原文未提供说明) | 是 | 4 |
本模块用于定义 排行榜。
排行榜 的 分数提供者 可以是 占位符、统计数据 或 记分板目标。
排行榜 的 时间窗口 可以是 hourly(每小时)、daily(每天)、weekly(每周)、monthly(每月)、yearly(每年)与 all_time(全部时间)。
你可以用 占位符 或 命令 来展示 排行榜。
- 你需要在配置文件中定义
排行榜。 - 已定义的
排行榜会在以下时机被更新: 2.a. 当玩家加入或离开服务器时,所有排行榜都会被更新。 2.b. 当Leaderboard Updater Job被触发时,所有排行榜都会被更新。 2.c. 你可以用/leaderboard update-all命令手动更新。 - 你可以用多种方式
展示排行榜。 3.a. 你可以用占位符展示排行榜。 3.b. 你可以用命令展示排行榜。
◉ 你可以用 占位符 从 统计数据 取数
例如:
%player:statistic_raw minecraft:deaths%%player:statistic_raw minecraft:killed minecraft:zombie%
更多 统计数据 参见:https://minecraft.wiki/w/Statistics
◉ 你可以用 占位符 从 记分板目标 取数
例如:%player:objective [objective]%
◉ 如何定义一个 排行榜?
要定义一个 排行榜,你需要指定:
-
排行榜 ID:该排行榜的唯一名称。 -
分数提供者:一个会被求值为数值的字符串。(通常是占位符)
◉ 什么是 最低第 N 名 与 最高第 N 名
对任何排行榜而言,其所有 分数 都按 自然顺序 排序。
自然顺序 是从 最低 到 最高 的顺序。(例如 0、1、2、3 …)
你可以用 最低占位符 选出 最低第 N 名的分数。
你可以用 最高占位符 选出 最高第 N 名的分数。
例如,你可能想为 死亡榜 选出 最低分,为 僵尸击杀榜 选出 最高分。
%fuji:lowest_n_score death-board 1 all_time%%fuji:highest_n_score zombie-kill-board 1 all_time%
◉ 按 最低分在前 的顺序列出指定 排行榜
执行:/leaderboard lowest death-board ALL_TIME
◉ 按 最高分在前 的顺序列出指定 排行榜
执行:/leaderboard highest zombie-kill-board ALL_TIME
◉ 按 最高分在前 的顺序列出指定 排行榜,时间窗口为 每天
执行:/leaderboard highest zombie-kill-board DAILY
◉ 给榜首玩家发奖励
执行:
/run as console send-broadcast The greatest zombie killer this week is %fuji:highest_n_name zombie-kill-board 1 weekly%/run as console give %fuji:highest_n_name zombie-kill-board 1 weekly% minecraft:diamond 1
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/leaderboard/config.json
{
/* 当指定的 `最低第 N 名` 或 `最高第 N 名` 没有数据时显示的 `文本`。 */
"leaderboard_no_player_text": "<red>None Player"
/* 当指定 `分数` 没有数据时显示的 `文本`。 */,
"leaderboard_no_score_text": "<yellow>---"
/* `weekly` 时间窗口所使用的每周起始日。 */,
"beginning_of_the_week": "SUNDAY"
/* `/leaderboard lowest` 与 `/leaderboard highest` 命令的 `默认每页条数`。 */,
"page_size": 10
/* `排行榜描述符` 用于定义一个 `排行榜`。 */,
"leaderboard_descriptors": [
{
/* 该 `排行榜` 的 `唯一` id。 */
"leaderboard_id": "death-board",
"display_name": "<dark_red>Death Board</dark_red>"
/* 该选项是一个会被求值为 `数值` 的 `字符串`。
该 `字符串` 值通常是 `占位符`。 */,
"score_provider": "%player:statistic_raw minecraft:deaths%"
},
{
/* 该 `排行榜` 的 `唯一` id。 */
"leaderboard_id": "zombie-kill-board",
"display_name": "<blue>Zombie Kills</blue>"
/* 该选项是一个会被求值为 `数值` 的 `字符串`。
该 `字符串` 值通常是 `占位符`。 */,
"score_provider": "%player:statistic_raw minecraft:killed minecraft:zombie%"
}
]
}文件:config/fuji/modules/leaderboard/leaderboard-data.json
{
"leaderboard_data": []
}| 任务名 | 说明 |
|---|---|
UpdateLeaderboardsJob |
该 任务 用于自动执行 /leaderboard update-all 命令。 |
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/leaderboard highest <LeaderBoardDescriptor leaderboard> <LeaderBoardTimeWindow timeWindow> [Integer pageSize] |
列出指定排行榜中最高分的 N 名玩家。 | 否 | 4 |
/leaderboard lowest <LeaderBoardDescriptor leaderboard> <LeaderBoardTimeWindow timeWindow> [Integer pageSize] |
列出指定排行榜中最低分的 N 名玩家。 | 否 | 4 |
/leaderboard update-all |
为 在线玩家 更新所有 排行榜。 |
是 | 4 |
| 占位符 | 说明 |
|---|---|
fuji:lowest_n_name |
返回指定 排行榜 id 的 最低第 N 名 玩家名。语法为 %fuji:lowest_n_name <leaderboard-id> <n> <time-window>。时间窗口 可以是 hourly、daily、weekly、monthly、yearly 与 all_time。例如:%fuji:lowest_n_name death-board 1 all_time% 返回 id 为 death-board 的排行榜中 死亡次数最少的玩家名。 |
fuji:highest_n_name |
返回指定 排行榜 id 的 最高第 N 名 玩家名。语法为 %fuji:highest_n_name <leaderboard-id> <n> <time-window>。时间窗口 可以是 hourly、daily、weekly、monthly、yearly 与 all_time。例如:%fuji:highest_n_name zombie-kill-board 1 all_time% 返回 id 为 zombie-kill-board 的排行榜中 僵尸击杀数最高的玩家名。 |
fuji:lowest_n_score |
返回指定 排行榜 id 的 最低第 N 名 分数。语法为 %fuji:lowest_n_score <leaderboard-id> <n> <time-window>。时间窗口 可以是 hourly、daily、weekly、monthly、yearly 与 all_time。例如:%fuji:lowest_n_score death-board 1 all_time% 返回 id 为 death-board 的排行榜中 最低的死亡次数分数。 |
fuji:highest_n_score |
返回指定 排行榜 id 的 最高第 N 名 分数。语法为 %fuji:highest_n_score <leaderboard-id> <n> <time-window>。时间窗口 可以是 hourly、daily、weekly、monthly、yearly 与 all_time。例如:%fuji:highest_n_score zombie-kill-board 1 all_time% 返回 id 为 zombie-kill-board 的排行榜中 最高的僵尸击杀分数。 |
| 参数类型 | 对应类 |
|---|---|
[leaderboard] |
[LeaderBoardDescriptor] |
[leaderboard-time-window] |
[LeaderBoardTimeWindow] |
本模块提供 维护模式,用于在维护期间阻止玩家加入服务器。
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/maintenance/config.json
{
"maintenance_mode_status": false,
"maintenance_messages": [
"<gold>Maintenance in progress, please wait...",
"<blue>Currently under maintenance, check back soon!",
"<aqua>We’ll be back shortly after maintenance.",
"<light_purple>Maintenance ongoing, thanks for your patience!",
"<green>Server is in maintenance mode, hang tight!"
],
"events": {
"on_enter_maintenance_mode_commands": [
"send-broadcast <yellow><bold>Maintenance mode is now on."
],
"on_leave_maintenance_mode_commands": [
"send-broadcast <green><bold>Maintenance mode is now off."
]
}
}| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/maintenance kick-all |
(原文未提供说明) | 是 | 4 |
/maintenance off |
(原文未提供说明) | 是 | 4 |
/maintenance on |
(原文未提供说明) | 是 | 4 |
自定义服务器的 MOTD。
◉ 使用 编辑器 帮你设计 MOTD
在线 MOTD 编辑器:https://colorize.fun/en/minecraft
◉ 使用 格式化代码 自定义 MOTD
格式化代码 是原版 Minecraft 的功能。
参见:https://minecraft.fandom.com/wiki/Formatting_codes
◉ 配置服务器图标
你可以把 64x64 像素的 .png 图片文件 放到 config/fuji/modules/motd/icon 目录中。
该模块会随机挑一张图片作为服务器图标。
用于响应服务器状态请求。
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/motd/config.json
{
/* 已定义的 `motd` 条目。 */
"messages": [
{
/* 该 `motd` 条目使用的 `文本`。 */
"text": "<gradient:#FFA1F5:#BFBDFB:#6ECBFF>Pure Survival %server:version% / Up %server:uptime% ❤ Discord Group XXX</gradient><newline><gradient:#99CCFF:#BBDFFF>%fuji:server_playtime%🔥 %fuji:server_mined%⛏ %fuji:server_placed%🔳 %fuji:server_killed%🗡 %fuji:server_moved%🌍"
/* 该 `motd` 条目使用的 `图标`。
`图标` 必须是 64x64 的 png 图片。 */,
"icon": null
},
{
/* 该 `motd` 条目使用的 `文本`。 */
"text": "Please put your icon in `config/fuji/modules/motd/icon/` dir."
/* 该 `motd` 条目使用的 `图标`。
`图标` 必须是 64x64 的 png 图片。 */,
"icon": "icon-1.png"
}
]
/* 该部分用于自定义服务器元数据中的 `玩家信息`。 */,
"players_info": {
/* 用一个 `随机增量` 增加 `最大玩家数`。 */
"max_players": {
"delta_min": 0,
"delta_max": 0
}
/* 用一个 `随机增量` 增加 `在线玩家数`。 */,
"online_players": {
"delta_min": 0,
"delta_max": 0
}
/* 自定义 `悬停` 在 `玩家信息` 区域时显示的 `悬停文本`。 */,
"hover_text": {
"enable": true,
"lines": [
"§aWelcome to the server!",
"§aServer version: %server:version%",
"§b§o§lJoin to play now."
]
}
}
/* 自定义 `版本文本`。
<red>注意:一旦启用该功能,客户端将不再显示 `ping 结果`。 */,
"version_text": {
"enable": false
/* 该 `motd` 条目使用的 `文本`。 */,
"text": "§bJoin to play now."
}
}本模块允许你对原版 Minecraft 中的某些 数值 进行 倍率 调整。
目前支持的 数值类型:
-
damage:玩家受到的伤害。 -
experience:玩家获得的经验。
◉ 把 僵尸 对玩家的伤害翻倍
执行:/lp group default meta set fuji.multiplier.damage.minecraft:zombie 2
◉ 取消玩家受到的 摔落伤害
执行:/lp group default meta set fuji.multiplier.damage.minecraft:fall 0
◉ 把玩家受到的 所有 伤害翻倍
执行:/lp group default meta set fuji.multiplier.damage.all 2
◉ 把玩家受到的 所有 伤害减半
执行:/lp group default meta set fuji.multiplier.damage.all 0.5
◉ 把玩家获得的所有经验翻倍
执行:/lp group default meta set fuji.multiplier.experience.all 2
自定义玩家头顶的名牌。
-
名牌实体是一种文本展示实体。 -
名牌实体是一种虚拟实体。 2.a. 该实体实际上并不存在于服务端世界中。 2.b.服务端在客户端世界中模拟名牌实体的存在,让客户端感觉它像一个真实实体。
各字段的语义参见 https://minecraft.wiki/w/Display
◉ 把名牌背景设为蓝色
把 background 设为 -16776961(蓝色的整数表示)
◉ 把名牌设为半透明
把 text_opacity 设为 128。
◉ 把文字尺寸放大为两倍
把 scale 中的 x、y、z 都设为 2.0。
◉ 为自己切换 名牌实体
执行:/nametag toggle @s
◉ 为在线玩家开启 名牌实体
执行:/nametag toggle others @a true
◉ 为在线玩家关闭 名牌实体
执行:/nametag toggle others @a false
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/nametag/config.json
{
/* 用于 `更新` 名牌的 `cron` 表达式。 */
"update_cron": "* * * ? * *"
/* 定义名牌的 `样式`。 */,
"style": {
"text": "<#B1B2FF>%fuji:player_playtime%🔥 %fuji:player_mined%⛏ %fuji:player_placed%🔳 %fuji:player_killed%🗡 %fuji:player_moved%🌍\n<dark_green>%player:displayname_visual%",
"offset": {
"x": 0.0,
"y": 0.2,
"z": 0.0
},
"size": {
"height": 0.0,
"width": 0.0
},
"scale": {
"x": 1.0,
"y": 1.0,
"z": 1.0
},
"brightness": {
"override_brightness": false,
"block": 15,
"sky": 15
},
"shadow": {
"shadow": false,
"shadow_radius": 0.0,
"shadow_strength": 1.0
},
"color": {
"background": 1073741824,
"text_opacity": -1
}
}
/* 定义 `名牌` 的 `渲染` 逻辑。 */,
"render": {
"see_through_blocks": false,
"view_range": 1.0
}
}文件:config/fuji/modules/nametag/nametag-data.json
{
"preferences": {}
}| 任务名 | 说明 |
|---|---|
UpdateNametagJob |
该 任务 用于 更新 每个玩家的名牌。 |
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/nametag toggle <ServerPlayer target> |
(原文未提供说明) | 是 | 4 |
/nametag toggle <ServerPlayer target> <boolean flag> |
(原文未提供说明) | 是 | 4 |
/nametag toggle others <PlayerCollection others> |
(原文未提供说明) | 是 | 4 |
/nametag toggle others <PlayerCollection others> <boolean flag> |
(原文未提供说明) | 是 | 4 |
为 Text Placeholder API 模组提供额外的占位符。
◉ 安装更多模组以提供额外占位符
参见 https://placeholders.pb4.eu/user/mod-placeholders/
◉ 在 语言文件 中使用 占位符
事实上,你可以在 语言文件 中书写 占位符。
上下文玩家 会被用于解析这些占位符。
| 任务名 | 说明 |
|---|---|
UpdateSumUpPlaceholderJob |
该 任务 用于 更新 服务端 的 汇总占位符。 |
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/placeholder list |
列出服务器中注册的所有占位符。 | 否 | 4 |
/placeholder parse [ServerPlayer player] <GreedyString input> |
使用上下文玩家解析一个占位符。 | 是 | 4 |
| 占位符 | 说明 |
|---|---|
fuji:player_mined |
返回该玩家挖掘的方块数。 |
fuji:server_mined |
返回服务器中所有玩家挖掘方块的总数。 |
fuji:player_placed |
返回该玩家放置的方块数。 |
fuji:server_placed |
返回服务器中所有玩家放置方块的总数。 |
fuji:player_killed |
返回该玩家击杀的实体数。 |
fuji:server_killed |
返回服务器中所有玩家击杀实体的总数。 |
fuji:player_moved |
返回该玩家移动的距离。 |
fuji:server_moved |
返回服务器中所有玩家移动距离的总和。 |
fuji:player_playtime |
返回该玩家的游戏时长。 |
fuji:server_playtime |
返回服务器中所有玩家游戏时长的总和。 |
fuji:health_bar |
以可视化爱心字符返回 玩家 的 生命值。 |
fuji:rotate |
求值时返回指定字符串的轮播字符串。 |
fuji:has_permission |
第一个字符串参数 是要检查的 权限。以布尔值返回 玩家 是否拥有该权限。 |
fuji:get_meta |
第一个字符串参数 是 luckperms 元数据 键。返回表示 元数据值 的 字符串。 |
fuji:random_player |
从 在线 玩家中随机挑一个玩家,返回其 名字。 |
fuji:random |
第一个整数参数 是 最小值。第二个整数参数 是 最大值。返回范围 [最小值, 最大值) 内的随机整数。 |
fuji:escape |
让 占位符 不被 文本解析器 解析。第一个参数 是 目标占位符 的字面字符串。第二个参数 是 转义层级 的整数,默认为 1。 |
fuji:protect |
接受一个 必填字符串参数,并返回它的 字面文本。 |
fuji:date |
返回当前 日期。可接受一个指定 日期格式 的可选参数。例如:%fuji:date yyyy MM dd%。详见 https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html
|
fuji:player_prefix |
返回该玩家的 luckperms 前缀。 |
fuji:player_suffix |
返回该玩家的 luckperms 后缀。 |
fuji:pos |
返回该玩家的 位置。 |
本模块提供一组 判定命令。
它们可用于测试 条件。
判定命令 会返回一个 整数值,表示 SUCCESS(成功)或 FAILED(失败)的测试结果。
它依赖原版 Minecraft 的 命令返回值。
参见 https://minecraft.fandom.com/wiki/Commands/return
事实上,你也可以把 判定命令 用于 命令方块。
◉ 测试一个条件,如果成功则运行一条命令
执行:/run as player Alice chain has-perm? %player:name% 4 chain say value is true
◉ 测试玩家是否手持苹果
执行:/command-debug is-holding? Steve minecraft:apple
◉ 测试玩家是否拥有指定字符串权限
执行:/command-debug has-perm? Steve fuji.permission.back
◉ 测试玩家生命值是否 >= 10
执行:/command-debug <=? Steve 10 %player:health%
◉ 测试玩家是否击杀了超过 100 只僵尸
执行:/command-debug <=? Steve 100 %player:statistic_raw minecraft:killed minecraft:zombie%
◉ 借助 原版 Minecraft 统计数据
参见:https://minecraft.fandom.com/wiki/Statistics
◉ 更多示例
你可以在 command_meta.IF 模块与 command_meta.chain 模块中看到更多示例。
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/!=? <ServerPlayer player> <double value> <GreedyString numericValueString> |
(原文未提供说明) | 是 | 4 |
/<=? <ServerPlayer player> <double value> <GreedyString numericValueString> |
(原文未提供说明) | 是 | 4 |
/<? <ServerPlayer player> <double value> <GreedyString numericValueString> |
(原文未提供说明) | 是 | 4 |
/=? <ServerPlayer player> <double value> <GreedyString numericValueString> |
(原文未提供说明) | 是 | 4 |
/>=? <ServerPlayer player> <double value> <GreedyString numericValueString> |
(原文未提供说明) | 是 | 4 |
/>? <ServerPlayer player> <double value> <GreedyString numericValueString> |
(原文未提供说明) | 是 | 4 |
/equals? <ServerPlayer player> <String expectedString> <GreedyString placeholderString> |
(原文未提供说明) | 是 | 4 |
/false? <ServerPlayer player> <GreedyString placeholderString> |
(原文未提供说明) | 是 | 4 |
/has-exp-level? <ServerPlayer player> <int expLevel> |
(原文未提供说明) | 是 | 4 |
/has-exp? <ServerPlayer player> <int exp> |
(原文未提供说明) | 是 | 4 |
/has-item? <ServerPlayer player> <Result itemPredicate> <int count> |
(原文未提供说明) | 是 | 4 |
/has-level? <OfflineGameProfile player> <int levelPermission> |
判定该玩家是否拥有该权限等级。 | 是 | 4 |
/has-perm? <OfflineGameProfile player> <GreedyString stringPermission> |
(原文未提供说明) | 是 | 4 |
/has-players? [Integer n] |
判定在线玩家数是否 >= n。 | 是 | 4 |
/is-holding? <ServerPlayer player> <Result itemPredicate> |
(原文未提供说明) | 是 | 4 |
/is-in-gamemode? <ServerPlayer player> <GameType gameMode> |
(原文未提供说明) | 是 | 4 |
/is-in-world? <ServerPlayer player> <Dimension dimension> |
(原文未提供说明) | 是 | 4 |
/is-op? <ServerPlayer player> |
(原文未提供说明) | 是 | 4 |
/matches? <ServerPlayer player> <String expectedString> <GreedyString placeholderString> |
(原文未提供说明) | 是 | 4 |
/true? <ServerPlayer player> <GreedyString placeholderString> |
(原文未提供说明) | 是 | 4 |
用于查询服务器健康状态。
包括:os、vm、cpu、disk、ram、tps、mspt 与 gc。
◉ 安装 spark 模组以显示 TPS、MSPT 与 CPU 信息
你需要安装 spark 模组来提供这些 占位符。
以显示 tps、mspt 与 cpu 信息。
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/profiler/config.json
{
"file_system": {
"blacklisted_filesystem": [
".*firmware.*",
".*systemd.*",
".*/proc.*",
".*/boot.*",
".*/run.*"
]
}
}| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/profiler |
打开服务器健康状态 GUI。 | 否 | 0 |
为玩家提供 PvP 管理。
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/pvp/pvp.json
{
"whitelist": []
}| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/pvp list |
列出已开启 PvP 的玩家。 | 是 | 0 |
/pvp off |
为该玩家关闭 PvP。 | 否 | 0 |
/pvp off others <PlayerCollection others> |
为该玩家关闭 PvP。 | 是 | 4 |
/pvp on |
为该玩家开启 PvP。 | 否 | 0 |
/pvp on others <PlayerCollection others> |
为该玩家开启 PvP。 | 是 | 4 |
/pvp status |
查询该玩家的 PvP 状态。 | 否 | 0 |
/pvp status others <PlayerCollection others> |
查询该玩家的 PvP 状态。 | 是 | 4 |
本模块提供入服排队的自定义。
本模块提供等级晋升系统。
它允许定义一个带 要求 与 奖励 的 等级。
-
等级节点用于定义一个等级。 1.a. 一个等级有基本信息,如id、显示名称与描述。 1.b. 一个等级可以有多个下一等级,以构建等级路径。 1.b.i. 从等级 A到等级 E,你可以定义一条等级路径:A -> B -> C -> D -> E1.b.ii. 从等级 A到等级 E,你还可以定义另一条等级路径:A -> F -> G -> E1.b.iii. 玩家可以用/rank up <next-rank>选择一条要走的等级路径。 - 一个
等级可以有事件: 2.a. 当玩家进入该等级时,会执行on_enter_this_rank_node_commands。 2.b. 当玩家离开该等级时,会执行on_lave_this_rank_node_commands。 2.c. 当玩家第一次进入该等级时,会执行on_first_enter_this_rank_node_commands。 - 一个
等级可以有要求: 3.a. 玩家必须满足所有要求,/rank up <next-rank>命令才能成功执行。 3.b. 管理员可以用/rank set <player> <rank>命令强制设置玩家等级。(忽略要求) 3.c. 玩家可以用/rank down <rank>降级到之前已获得过的等级。 3.d. 管理员可以用/rank remove <player>把玩家等级设为none(无)。
◉ 当唯一可选下一等级时自动晋升
你可以用 command_schedule 模块定义一个任务。
为每个在线玩家执行 /rank try-up %player:name% 命令。
这样,当玩家只有一个 可选的下一等级 时,就能自动晋升。
它可以是 /execute as @a run rank try-up @s 或 /foreach rank try-up %player:name%。
◉ 按类型列出等级节点
/rank list all-rank-nodes/rank list starting-rank-nodes Steve/rank list next-rank-nodes Steve/rank list previous-rank-nodes Steve/rank list walked-rank-nodes Steve
◉ 查询某个等级的信息
执行:/rank info newbie
◉ 查询当前等级进度
/rank progress/rank progress Steve
◉ 晋升到指定等级
执行:/rank up branch-1 --confirm true
◉ 降级到 已走过的等级
执行:/rank down branch-1 --confirm true
注意:如果你从该等级节点 降级,你必须再次满足它的 要求,才能 重新晋升 回来。
◉ 把玩家等级设为 none
执行:/rank remove Steve --confirm true。
◉ 允许玩家选择一个 中间等级 作为自己的 起始等级
你可以定义一个 起始等级节点 作为所有玩家的公共 起始等级节点。
不过,你也可以允许部分玩家挑选其他 等级节点 作为起始等级节点,从而跳过某些路径。
执行:/lp group default permission set fuji.rank.starting_rank_node.branch-1-3
这会允许玩家挑选 branch-1-3 作为 起始等级节点。
你可以为不同的 luckperms 组 定义多个 起始等级节点。
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/rank/config.json
{
"starting_rank_node_id": "newbie",
"no_rank_status_text": "<grey>[No Rank]",
"graph": [
{
"enable": true,
"id": "newbie",
"display_name": "<dark_grey>Newbie</dark_grey>",
"description": "<orange>This is the first line.\n<orange>This is the second line.",
"next_rank_nodes": [
"branch-1",
"branch-2"
],
"requirements": [],
"events": {
"on_enter_this_rank_node_commands": [
"lp user %player:name% permission set group.rank-%fuji:rank_id%",
"send-broadcast <#FFA1F5>Player %player:name% has been ranked up to %fuji:rank_displayname_raw%"
],
"on_leave_this_rank_node_commands": [
"lp user %player:name% permission unset group.rank-%fuji:rank_id%"
],
"on_first_enter_this_rank_node_commands": [
"when-online %player:name% send-message %player:name% <orange>You have received the ranked up bonus!",
"when-online %player:name% give %player:name% minecraft:apple 1"
]
}
},
{
"enable": true,
"id": "branch-1",
"display_name": "<pink>Branch-1</pink>",
"description": "<orange>This is the first line.\n<orange>This is the second line.",
"next_rank_nodes": [
"branch-1-1",
"branch-1-2",
"branch-1-3"
],
"requirements": [
{
"description": "Have 16 dirt blocks in your inventory.",
"commands": [
"has-item? %player:name% minecraft:dirt 16"
]
},
{
"description": "Have 8 apples in your inventory.",
"commands": [
"has-item? %player:name% minecraft:apple 8"
]
},
{
"description": "Have 4 diamonds in your inventory.",
"commands": [
"has-item? %player:name% minecraft:diamond 4"
]
},
{
"description": "Kill 2 zombies. (Currently %player:statistic_raw minecraft:killed minecraft:zombie%)",
"commands": [
"<=? %player:name% 2 %player:statistic_raw minecraft:killed minecraft:zombie%"
]
},
{
"description": "Play for 5 seconds.",
"commands": [
"<=? %player:name% 100 %player:statistic_raw minecraft:play_time%"
]
}
],
"events": {
"on_enter_this_rank_node_commands": [
"lp user %player:name% permission set group.rank-%fuji:rank_id%",
"send-broadcast <#FFA1F5>Player %player:name% has been ranked up to %fuji:rank_displayname_raw%"
],
"on_leave_this_rank_node_commands": [
"lp user %player:name% permission unset group.rank-%fuji:rank_id%"
],
"on_first_enter_this_rank_node_commands": [
"when-online %player:name% send-message %player:name% <orange>You have received the ranked up bonus!",
"when-online %player:name% give %player:name% minecraft:apple 1"
]
}
},
{
"enable": true,
"id": "branch-1-1",
"display_name": "<pink>Branch-1-1</pink>",
"description": "<orange>This is the first line.\n<orange>This is the second line.",
"next_rank_nodes": [
"expert"
],
"requirements": [
{
"description": "Have 16 dirt blocks in your inventory.",
"commands": [
"has-item? %player:name% minecraft:dirt 16"
]
},
{
"description": "Have 8 apples in your inventory.",
"commands": [
"has-item? %player:name% minecraft:apple 8"
]
},
{
"description": "Have 4 diamonds in your inventory.",
"commands": [
"has-item? %player:name% minecraft:diamond 4"
]
},
{
"description": "Kill 2 zombies. (Currently %player:statistic_raw minecraft:killed minecraft:zombie%)",
"commands": [
"<=? %player:name% 2 %player:statistic_raw minecraft:killed minecraft:zombie%"
]
},
{
"description": "Play for 5 seconds.",
"commands": [
"<=? %player:name% 100 %player:statistic_raw minecraft:play_time%"
]
}
],
"events": {
"on_enter_this_rank_node_commands": [
"lp user %player:name% permission set group.rank-%fuji:rank_id%",
"send-broadcast <#FFA1F5>Player %player:name% has been ranked up to %fuji:rank_displayname_raw%"
],
"on_leave_this_rank_node_commands": [
"lp user %player:name% permission unset group.rank-%fuji:rank_id%"
],
"on_first_enter_this_rank_node_commands": [
"when-online %player:name% send-message %player:name% <orange>You have received the ranked up bonus!",
"when-online %player:name% give %player:name% minecraft:apple 1"
]
}
},
{
"enable": true,
"id": "branch-1-2",
"display_name": "<pink>Branch-1-2</pink>",
"description": "<orange>This is the first line.\n<orange>This is the second line.",
"next_rank_nodes": [
"expert"
],
"requirements": [
{
"description": "Have 16 dirt blocks in your inventory.",
"commands": [
"has-item? %player:name% minecraft:dirt 16"
]
},
{
"description": "Have 8 apples in your inventory.",
"commands": [
"has-item? %player:name% minecraft:apple 8"
]
},
{
"description": "Have 4 diamonds in your inventory.",
"commands": [
"has-item? %player:name% minecraft:diamond 4"
]
},
{
"description": "Kill 2 zombies. (Currently %player:statistic_raw minecraft:killed minecraft:zombie%)",
"commands": [
"<=? %player:name% 2 %player:statistic_raw minecraft:killed minecraft:zombie%"
]
},
{
"description": "Play for 5 seconds.",
"commands": [
"<=? %player:name% 100 %player:statistic_raw minecraft:play_time%"
]
}
],
"events": {
"on_enter_this_rank_node_commands": [
"lp user %player:name% permission set group.rank-%fuji:rank_id%",
"send-broadcast <#FFA1F5>Player %player:name% has been ranked up to %fuji:rank_displayname_raw%"
],
"on_leave_this_rank_node_commands": [
"lp user %player:name% permission unset group.rank-%fuji:rank_id%"
],
"on_first_enter_this_rank_node_commands": [
"when-online %player:name% send-message %player:name% <orange>You have received the ranked up bonus!",
"when-online %player:name% give %player:name% minecraft:apple 1"
]
}
},
{
"enable": true,
"id": "branch-1-3",
"display_name": "<pink>Branch-1-3</pink>",
"description": "<orange>This is the first line.\n<orange>This is the second line.",
"next_rank_nodes": [
"expert"
],
"requirements": [
{
"description": "Have 16 dirt blocks in your inventory.",
"commands": [
"has-item? %player:name% minecraft:dirt 16"
]
},
{
"description": "Have 8 apples in your inventory.",
"commands": [
"has-item? %player:name% minecraft:apple 8"
]
},
{
"description": "Have 4 diamonds in your inventory.",
"commands": [
"has-item? %player:name% minecraft:diamond 4"
]
},
{
"description": "Kill 2 zombies. (Currently %player:statistic_raw minecraft:killed minecraft:zombie%)",
"commands": [
"<=? %player:name% 2 %player:statistic_raw minecraft:killed minecraft:zombie%"
]
},
{
"description": "Play for 5 seconds.",
"commands": [
"<=? %player:name% 100 %player:statistic_raw minecraft:play_time%"
]
}
],
"events": {
"on_enter_this_rank_node_commands": [
"lp user %player:name% permission set group.rank-%fuji:rank_id%",
"send-broadcast <#FFA1F5>Player %player:name% has been ranked up to %fuji:rank_displayname_raw%"
],
"on_leave_this_rank_node_commands": [
"lp user %player:name% permission unset group.rank-%fuji:rank_id%"
],
"on_first_enter_this_rank_node_commands": [
"when-online %player:name% send-message %player:name% <orange>You have received the ranked up bonus!",
"when-online %player:name% give %player:name% minecraft:apple 1"
]
}
},
{
"enable": true,
"id": "branch-2",
"display_name": "<aqua>Branch-2</aqua>",
"description": "<orange>This is the first line.\n<orange>This is the second line.",
"next_rank_nodes": [
"branch-2-1",
"branch-2-2"
],
"requirements": [
{
"description": "Have 16 dirt blocks in your inventory.",
"commands": [
"has-item? %player:name% minecraft:dirt 16"
]
},
{
"description": "Have 8 apples in your inventory.",
"commands": [
"has-item? %player:name% minecraft:apple 8"
]
},
{
"description": "Have 4 diamonds in your inventory.",
"commands": [
"has-item? %player:name% minecraft:diamond 4"
]
},
{
"description": "Kill 2 zombies. (Currently %player:statistic_raw minecraft:killed minecraft:zombie%)",
"commands": [
"<=? %player:name% 2 %player:statistic_raw minecraft:killed minecraft:zombie%"
]
},
{
"description": "Play for 5 seconds.",
"commands": [
"<=? %player:name% 100 %player:statistic_raw minecraft:play_time%"
]
}
],
"events": {
"on_enter_this_rank_node_commands": [
"lp user %player:name% permission set group.rank-%fuji:rank_id%",
"send-broadcast <#FFA1F5>Player %player:name% has been ranked up to %fuji:rank_displayname_raw%"
],
"on_leave_this_rank_node_commands": [
"lp user %player:name% permission unset group.rank-%fuji:rank_id%"
],
"on_first_enter_this_rank_node_commands": [
"when-online %player:name% send-message %player:name% <orange>You have received the ranked up bonus!",
"when-online %player:name% give %player:name% minecraft:apple 1"
]
}
},
{
"enable": true,
"id": "branch-2-1",
"display_name": "<aqua>Branch-2-1</aqua>",
"description": "<orange>This is the first line.\n<orange>This is the second line.",
"next_rank_nodes": [
"expert"
],
"requirements": [
{
"description": "Have 16 dirt blocks in your inventory.",
"commands": [
"has-item? %player:name% minecraft:dirt 16"
]
},
{
"description": "Have 8 apples in your inventory.",
"commands": [
"has-item? %player:name% minecraft:apple 8"
]
},
{
"description": "Have 4 diamonds in your inventory.",
"commands": [
"has-item? %player:name% minecraft:diamond 4"
]
},
{
"description": "Kill 2 zombies. (Currently %player:statistic_raw minecraft:killed minecraft:zombie%)",
"commands": [
"<=? %player:name% 2 %player:statistic_raw minecraft:killed minecraft:zombie%"
]
},
{
"description": "Play for 5 seconds.",
"commands": [
"<=? %player:name% 100 %player:statistic_raw minecraft:play_time%"
]
}
],
"events": {
"on_enter_this_rank_node_commands": [
"lp user %player:name% permission set group.rank-%fuji:rank_id%",
"send-broadcast <#FFA1F5>Player %player:name% has been ranked up to %fuji:rank_displayname_raw%"
],
"on_leave_this_rank_node_commands": [
"lp user %player:name% permission unset group.rank-%fuji:rank_id%"
],
"on_first_enter_this_rank_node_commands": [
"when-online %player:name% send-message %player:name% <orange>You have received the ranked up bonus!",
"when-online %player:name% give %player:name% minecraft:apple 1"
]
}
},
{
"enable": true,
"id": "branch-2-2",
"display_name": "<aqua>Branch-2-2</aqua>",
"description": "<orange>This is the first line.\n<orange>This is the second line.",
"next_rank_nodes": [
"expert"
],
"requirements": [
{
"description": "Have 16 dirt blocks in your inventory.",
"commands": [
"has-item? %player:name% minecraft:dirt 16"
]
},
{
"description": "Have 8 apples in your inventory.",
"commands": [
"has-item? %player:name% minecraft:apple 8"
]
},
{
"description": "Have 4 diamonds in your inventory.",
"commands": [
"has-item? %player:name% minecraft:diamond 4"
]
},
{
"description": "Kill 2 zombies. (Currently %player:statistic_raw minecraft:killed minecraft:zombie%)",
"commands": [
"<=? %player:name% 2 %player:statistic_raw minecraft:killed minecraft:zombie%"
]
},
{
"description": "Play for 5 seconds.",
"commands": [
"<=? %player:name% 100 %player:statistic_raw minecraft:play_time%"
]
}
],
"events": {
"on_enter_this_rank_node_commands": [
"lp user %player:name% permission set group.rank-%fuji:rank_id%",
"send-broadcast <#FFA1F5>Player %player:name% has been ranked up to %fuji:rank_displayname_raw%"
],
"on_leave_this_rank_node_commands": [
"lp user %player:name% permission unset group.rank-%fuji:rank_id%"
],
"on_first_enter_this_rank_node_commands": [
"when-online %player:name% send-message %player:name% <orange>You have received the ranked up bonus!",
"when-online %player:name% give %player:name% minecraft:apple 1"
]
}
},
{
"enable": true,
"id": "expert",
"display_name": "<purple>Expert</purple>",
"description": "<orange>This is the first line.\n<orange>This is the second line.",
"next_rank_nodes": [],
"requirements": [
{
"description": "Have 16 dirt blocks in your inventory.",
"commands": [
"has-item? %player:name% minecraft:dirt 16"
]
},
{
"description": "Have 8 apples in your inventory.",
"commands": [
"has-item? %player:name% minecraft:apple 8"
]
},
{
"description": "Have 4 diamonds in your inventory.",
"commands": [
"has-item? %player:name% minecraft:diamond 4"
]
},
{
"description": "Kill 2 zombies. (Currently %player:statistic_raw minecraft:killed minecraft:zombie%)",
"commands": [
"<=? %player:name% 2 %player:statistic_raw minecraft:killed minecraft:zombie%"
]
},
{
"description": "Play for 5 seconds.",
"commands": [
"<=? %player:name% 100 %player:statistic_raw minecraft:play_time%"
]
}
],
"events": {
"on_enter_this_rank_node_commands": [
"lp user %player:name% permission set group.rank-%fuji:rank_id%",
"send-broadcast <#FFA1F5>Player %player:name% has been ranked up to %fuji:rank_displayname_raw%"
],
"on_leave_this_rank_node_commands": [
"lp user %player:name% permission unset group.rank-%fuji:rank_id%"
],
"on_first_enter_this_rank_node_commands": [
"when-online %player:name% send-message %player:name% <orange>You have received the ranked up bonus!",
"when-online %player:name% give %player:name% minecraft:apple 1"
]
}
}
]
}文件:config/fuji/modules/rank/rank-data.json
{
"rank_data_node_map": {}
}| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/rank down <PreviousAvailableRankNode previousRank> [Boolean confirm] |
降级到上一个可用等级节点。 | 否 | 0 |
/rank info <RankNode rankNode> |
查询指定 等级节点 的信息。 |
是 | 4 |
/rank list all-rank-nodes |
列出所有已定义的 等级节点。 |
是 | 4 |
/rank list next-rank-nodes <ServerPlayer target> |
列出指定玩家所有可用的 下一等级节点。 |
是 | 4 |
/rank list previous-rank-nodes <ServerPlayer target> |
列出指定玩家所有可用的 上一等级节点。 |
是 | 4 |
/rank list starting-rank-nodes <ServerPlayer target> |
列出指定玩家所有可用的 起始等级节点。 |
是 | 4 |
/rank list walked-rank-nodes <ServerPlayer target> |
列出指定玩家所有 已走过的等级节点。 |
是 | 4 |
/rank progress |
查询等级进度。 | 否 | 0 |
/rank progress <ServerPlayer target> |
查询指定玩家的等级进度。 | 是 | 4 |
/rank remove <ServerPlayer player> [Boolean confirm] |
把指定玩家的等级设为 none。 | 是 | 4 |
/rank set <ServerPlayer target> <RankNode rankNode> |
为指定玩家设置等级。 | 是 | 4 |
/rank try-up <ServerPlayer target> |
如果该玩家只有一个 下一等级节点,则晋升到该节点,否则什么都不做。 |
是 | 4 |
/rank up <NextAvailableRankNode nextRank> [Boolean confirm] |
晋升到下一个可用等级节点。 | 否 | 0 |
| 占位符 | 说明 |
|---|---|
fuji:rank_id |
返回玩家当前等级的 等级 id。 |
fuji:rank_displayname |
返回玩家当前等级的 等级显示名称。 |
fuji:rank_displayname_raw |
返回玩家当前等级的 等级显示名称原始字符串。 |
| 参数类型 | 对应类 |
|---|---|
[next-available-rank-nodes] |
[NextAvailableRankNode] |
[previous-available-rank-nodes] |
[PreviousAvailableRankNode] |
[rank-id] |
[RankNode] |
提供随机传送功能。
- 按维度独立设置
- 实时搜索反馈
- 全异步的
区块加载与区块生成。(无卡顿) - 可自定义
中心 x与中心 z - 可自定义
最小范围与最大范围 - 支持
圆形与矩形形状 - 尊重
世界边界 - 跳过任何
液体方块 - 按
最小 Y与最大 Y过滤结果 - 按
指定方块过滤结果 - 按
指定生物群系过滤结果 - 按
区块居住时间过滤结果
◉ 提升 rtp 的性能
强烈建议使用 chunky 模组预生成世界区块。
如果 目标区块 尚未生成,我们只能在随机传送过程中现场生成它。
生成一个区块大约需要 2 到 10 秒。
这会拖慢 /rtp 的过程。
如果你预先生成了世界区块,那么速度就会很快。
◉ 限制 /rtp 命令的使用
你可以用 command_cooldown 模块为 /rtp 命令设置 冷却。
以防止滥用。
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/rtp/config.json
{
/* 为每个 `维度` 定义 `rtp` 设置。 */
"dimensions": {
"settings": [
{
"enable": true
/* 该设置对应的 `目标维度`。 */,
"dimension": "minecraft:overworld"
/* 用作 `rtp` `原点` 的 `中心 x`。 */,
"center_x": 0
/* 参见 `centerX`。 */,
"center_z": 0
/* `rtp` 使用 `圆形` 形状还是 `矩形` 形状? */,
"circle": false
/* `相对 x/z 距离` 的范围是 `(minRange, maxRange]`。 */,
"min_range": 1000
/* 参见 `minRange`。 */,
"max_range": 5000
/* `相对 y 距离` 的范围是 `(minY, maxY]`。 */,
"min_y": -64
/* 参见 `minY`。 */,
"max_y": 320
/* 中止一次 `rtp` 请求前的最大尝试次数。 */,
"max_try_times": 16,
"async_chunk_loading_timeout_ticks": 200,
"chunk_inhabited_time_lower_than_ticks": 6000,
"biomes": {
"skip": [
"minecraft:deep_cold_ocean",
"minecraft:cold_ocean",
"minecraft:frozen_ocean",
"minecraft:deep_frozen_ocean",
"minecraft:ocean",
"minecraft:deep_ocean",
"minecraft:lukewarm_ocean",
"minecraft:warm_ocean",
"minecraft:deep_lukewarm_ocean"
],
"only_accept_biomes_mode": {
"enable": false,
"accept": [
"minecraft:mushroom_fields",
"minecraft:plains"
]
}
},
"blocks": {
"skip": [
"minecraft:magma_block",
"minecraft:cactus",
"minecraft:void_air",
"minecraft:powder_snow",
"minecraft:sweet_berry_bush",
"minecraft:campfire",
"minecraft:fire"
]
}
},
{
"enable": true
/* 该设置对应的 `目标维度`。 */,
"dimension": "minecraft:the_nether"
/* 用作 `rtp` `原点` 的 `中心 x`。 */,
"center_x": 0
/* 参见 `centerX`。 */,
"center_z": 0
/* `rtp` 使用 `圆形` 形状还是 `矩形` 形状? */,
"circle": false
/* `相对 x/z 距离` 的范围是 `(minRange, maxRange]`。 */,
"min_range": 1000
/* 参见 `minRange`。 */,
"max_range": 5000
/* `相对 y 距离` 的范围是 `(minY, maxY]`。 */,
"min_y": 0
/* 参见 `minY`。 */,
"max_y": 128
/* 中止一次 `rtp` 请求前的最大尝试次数。 */,
"max_try_times": 16,
"async_chunk_loading_timeout_ticks": 200,
"chunk_inhabited_time_lower_than_ticks": 6000,
"biomes": {
"skip": [
"minecraft:deep_cold_ocean",
"minecraft:cold_ocean",
"minecraft:frozen_ocean",
"minecraft:deep_frozen_ocean",
"minecraft:ocean",
"minecraft:deep_ocean",
"minecraft:lukewarm_ocean",
"minecraft:warm_ocean",
"minecraft:deep_lukewarm_ocean"
],
"only_accept_biomes_mode": {
"enable": false,
"accept": [
"minecraft:mushroom_fields",
"minecraft:plains"
]
}
},
"blocks": {
"skip": [
"minecraft:magma_block",
"minecraft:cactus",
"minecraft:void_air",
"minecraft:powder_snow",
"minecraft:sweet_berry_bush",
"minecraft:campfire",
"minecraft:fire"
]
}
},
{
"enable": true
/* 该设置对应的 `目标维度`。 */,
"dimension": "minecraft:the_end"
/* 用作 `rtp` `原点` 的 `中心 x`。 */,
"center_x": 0
/* 参见 `centerX`。 */,
"center_z": 0
/* `rtp` 使用 `圆形` 形状还是 `矩形` 形状? */,
"circle": false
/* `相对 x/z 距离` 的范围是 `(minRange, maxRange]`。 */,
"min_range": 1000
/* 参见 `minRange`。 */,
"max_range": 5000
/* `相对 y 距离` 的范围是 `(minY, maxY]`。 */,
"min_y": 0
/* 参见 `minY`。 */,
"max_y": 256
/* 中止一次 `rtp` 请求前的最大尝试次数。 */,
"max_try_times": 16,
"async_chunk_loading_timeout_ticks": 200,
"chunk_inhabited_time_lower_than_ticks": 6000,
"biomes": {
"skip": [
"minecraft:deep_cold_ocean",
"minecraft:cold_ocean",
"minecraft:frozen_ocean",
"minecraft:deep_frozen_ocean",
"minecraft:ocean",
"minecraft:deep_ocean",
"minecraft:lukewarm_ocean",
"minecraft:warm_ocean",
"minecraft:deep_lukewarm_ocean"
],
"only_accept_biomes_mode": {
"enable": false,
"accept": [
"minecraft:mushroom_fields",
"minecraft:plains"
]
}
},
"blocks": {
"skip": [
"minecraft:magma_block",
"minecraft:cactus",
"minecraft:void_air",
"minecraft:powder_snow",
"minecraft:sweet_berry_bush",
"minecraft:campfire",
"minecraft:fire"
]
}
},
{
"enable": true
/* 该设置对应的 `目标维度`。 */,
"dimension": "fuji:overworld"
/* 用作 `rtp` `原点` 的 `中心 x`。 */,
"center_x": 0
/* 参见 `centerX`。 */,
"center_z": 0
/* `rtp` 使用 `圆形` 形状还是 `矩形` 形状? */,
"circle": false
/* `相对 x/z 距离` 的范围是 `(minRange, maxRange]`。 */,
"min_range": 1000
/* 参见 `minRange`。 */,
"max_range": 5000
/* `相对 y 距离` 的范围是 `(minY, maxY]`。 */,
"min_y": -64
/* 参见 `minY`。 */,
"max_y": 320
/* 中止一次 `rtp` 请求前的最大尝试次数。 */,
"max_try_times": 16,
"async_chunk_loading_timeout_ticks": 200,
"chunk_inhabited_time_lower_than_ticks": 6000,
"biomes": {
"skip": [
"minecraft:deep_cold_ocean",
"minecraft:cold_ocean",
"minecraft:frozen_ocean",
"minecraft:deep_frozen_ocean",
"minecraft:ocean",
"minecraft:deep_ocean",
"minecraft:lukewarm_ocean",
"minecraft:warm_ocean",
"minecraft:deep_lukewarm_ocean"
],
"only_accept_biomes_mode": {
"enable": false,
"accept": [
"minecraft:mushroom_fields",
"minecraft:plains"
]
}
},
"blocks": {
"skip": [
"minecraft:magma_block",
"minecraft:cactus",
"minecraft:void_air",
"minecraft:powder_snow",
"minecraft:sweet_berry_bush",
"minecraft:campfire",
"minecraft:fire"
]
}
},
{
"enable": true
/* 该设置对应的 `目标维度`。 */,
"dimension": "fuji:the_nether"
/* 用作 `rtp` `原点` 的 `中心 x`。 */,
"center_x": 0
/* 参见 `centerX`。 */,
"center_z": 0
/* `rtp` 使用 `圆形` 形状还是 `矩形` 形状? */,
"circle": false
/* `相对 x/z 距离` 的范围是 `(minRange, maxRange]`。 */,
"min_range": 1000
/* 参见 `minRange`。 */,
"max_range": 5000
/* `相对 y 距离` 的范围是 `(minY, maxY]`。 */,
"min_y": 0
/* 参见 `minY`。 */,
"max_y": 128
/* 中止一次 `rtp` 请求前的最大尝试次数。 */,
"max_try_times": 16,
"async_chunk_loading_timeout_ticks": 200,
"chunk_inhabited_time_lower_than_ticks": 6000,
"biomes": {
"skip": [
"minecraft:deep_cold_ocean",
"minecraft:cold_ocean",
"minecraft:frozen_ocean",
"minecraft:deep_frozen_ocean",
"minecraft:ocean",
"minecraft:deep_ocean",
"minecraft:lukewarm_ocean",
"minecraft:warm_ocean",
"minecraft:deep_lukewarm_ocean"
],
"only_accept_biomes_mode": {
"enable": false,
"accept": [
"minecraft:mushroom_fields",
"minecraft:plains"
]
}
},
"blocks": {
"skip": [
"minecraft:magma_block",
"minecraft:cactus",
"minecraft:void_air",
"minecraft:powder_snow",
"minecraft:sweet_berry_bush",
"minecraft:campfire",
"minecraft:fire"
]
}
},
{
"enable": true
/* 该设置对应的 `目标维度`。 */,
"dimension": "fuji:the_end"
/* 用作 `rtp` `原点` 的 `中心 x`。 */,
"center_x": 0
/* 参见 `centerX`。 */,
"center_z": 0
/* `rtp` 使用 `圆形` 形状还是 `矩形` 形状? */,
"circle": false
/* `相对 x/z 距离` 的范围是 `(minRange, maxRange]`。 */,
"min_range": 0
/* 参见 `minRange`。 */,
"max_range": 48
/* `相对 y 距离` 的范围是 `(minY, maxY]`。 */,
"min_y": 0
/* 参见 `minY`。 */,
"max_y": 256
/* 中止一次 `rtp` 请求前的最大尝试次数。 */,
"max_try_times": 16,
"async_chunk_loading_timeout_ticks": 200,
"chunk_inhabited_time_lower_than_ticks": 6000,
"biomes": {
"skip": [
"minecraft:deep_cold_ocean",
"minecraft:cold_ocean",
"minecraft:frozen_ocean",
"minecraft:deep_frozen_ocean",
"minecraft:ocean",
"minecraft:deep_ocean",
"minecraft:lukewarm_ocean",
"minecraft:warm_ocean",
"minecraft:deep_lukewarm_ocean"
],
"only_accept_biomes_mode": {
"enable": false,
"accept": [
"minecraft:mushroom_fields",
"minecraft:plains"
]
}
},
"blocks": {
"skip": [
"minecraft:magma_block",
"minecraft:cactus",
"minecraft:void_air",
"minecraft:powder_snow",
"minecraft:sweet_berry_bush",
"minecraft:campfire",
"minecraft:fire"
]
}
}
]
}
}| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/rtp [RtpDimension dimension] |
在指定维度随机传送。 | 否 | 0 |
/rtp others <PlayerCollection others> [RtpDimension dimension] |
在指定维度随机传送。 | 是 | 4 |
| 参数类型 | 对应类 |
|---|---|
[rtp-dimension] |
[RtpDimension] |
本模块提供一个告示牌编辑器,用于编辑告示牌方块上的文本。
◉ 修改状态
- 翻转取值:
/sign-edit glowing - 设置取值:
/sign-edit glowing --value true
◉ 设置指定行的文本
/sign-edit set-line 1 <blue>Hello World
◉ 设置所有行的文本
/sign-edit set-all First Line\nSecond Line
◉ 把文本从一面镜像到另一面
/sign-edit mirror
◉ 设置带 点击事件 的文本以执行命令
/sign-edit set-line 1 <click run_command 'say Hello'>Click Me</click>
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/sign-edit glowing [Boolean value] [Boolean frontSide] [Boolean bothSides] |
修改告示牌方块的 发光 状态。 |
否 | 4 |
/sign-edit locking [Boolean value] |
修改告示牌方块的 锁定 状态。 |
否 | 4 |
/sign-edit mirror |
把当前面向的一面镜像到另一面。 | 否 | 4 |
/sign-edit set-all [Boolean frontSide] [Boolean bothSides] <GreedyString text> |
设置告示牌方块所有行的文本。 | 否 | 4 |
/sign-edit set-color <DyeColor color> [Boolean frontSide] [Boolean bothSides] |
设置告示牌方块的 颜色。 |
否 | 4 |
/sign-edit set-line <SignLine line> [Boolean frontSide] [Boolean bothSides] <GreedyString text> |
设置告示牌方块指定行的文本。 | 否 | 4 |
| 参数类型 | 对应类 |
|---|---|
[sign-line] |
[SignLine] |
提供坐在方块上的功能。
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/sit/config.json
{
"right_click_to_sit": {
/* 是否允许 `右键点击` 一个 `楼梯方块` 或 `半砖方块` 坐下? */
"enable": true,
"allow_sneaking_to_sit": false,
"require_empty_hand_to_sit": false,
"require_no_opaque_block_above_to_sit": true,
"max_distance_to_sit": -1
}
}| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/sit |
在当前位置坐下。 | 否 | 0 |
/sit others <PlayerCollection others> |
在当前位置坐下。 | 是 | 4 |
本模块为玩家提供 皮肤 管理。
本模块提供 皮肤 管理:
- 当玩家
登录服务器时,本模块会修改皮肤。 1.a. 如果该玩家已有皮肤数据,则使用该数据。 1.b. 如果该玩家还没有皮肤数据: 1.b.i. 如果apply_default_skin_if_no_data选项为true,则使用配置文件中定义的默认皮肤。 1.b.ii. 如果apply_default_skin_if_no_data选项为false,则从Mojang 在线服务器拉取皮肤。 - 玩家可以在游戏中使用
/skin命令更换皮肤。
◉ 使用 Mojang 皮肤
执行:/skin use-my-mojang-skin 使用你自己的皮肤。
执行:/skin use-mojang-skin Alice 使用其他玩家的皮肤。
注意:这需要从 Mojang 服务器拉取皮肤,可能比较耗时。
◉ 从自定义 URL 设置皮肤
执行:/skin use-url-skin alex https://s.namemc.com/i/2af8c11db5fe6061.png
◉ 使用配置文件中 默认皮肤列表 里的 指定皮肤名
执行:/skin use-default-skin reimu-hakurei
◉ 使用配置文件中 默认皮肤列表 里的 随机 皮肤
执行:/skin use-random-default-skins
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/skin/config.json
{
"default_skin": {
/* 如果该选项为 `true`,则对没有 `皮肤` 数据的玩家应用 `默认皮肤`。
如果该选项为 `false`,则改为应用 `Mojang 在线皮肤`。 */
"apply_default_skin_if_no_data": false
/* 在 `默认皮肤列表` 中指定一个 `首选皮肤` 作为 `默认皮肤`。
如果你指定了 `无效的皮肤名`,或该选项为 `null`,则会从 `默认皮肤列表` 中随机挑一个皮肤。 */,
"preferred_skin_name": "reimu-hakurei"
/* 为本服务器定义的 `默认皮肤`。 */,
"default_skin_list": [
{
/* 用于描述该皮肤外观的名称。 */
"skin_name": "reimu-hakurei"
/* 该 `皮肤` 的 `属性`。 */,
"skin_property": {
"name": "textures",
"value": "ewogICJ0aW1lc3RhbXAiIDogMTYyMDIyMDc4MTQyNCwKICAicHJvZmlsZUlkIiA6ICJiYjdjY2E3MTA0MzQ0NDEyOGQzMDg5ZTEzYmRmYWI1OSIsCiAgInByb2ZpbGVOYW1lIiA6ICJsYXVyZW5jaW8zMDMiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZjVmMTcyMGM3ODBhNzk1OGI0MWYxNTNlNTA2OWRiNjg2MWJkMjgxYmU0MzJlN2JjNzk0MTE0YTdmNGVjNTJmZCIsCiAgICAgICJtZXRhZGF0YSIgOiB7CiAgICAgICAgIm1vZGVsIiA6ICJzbGltIgogICAgICB9CiAgICB9CiAgfQp9",
"signature": "olnQih89nZxKFe0UzWiXU8+wlndGBClUqXxAabwEm6j15SZH9ue7Xd2OM2kRKBiHoqbT+2TSg4xG7cBeAeapVN4vpRP5NPujERl/JI41jYNhMb+DmskreS59fh0QfZPAxOpj/rmmAJVfNN1QblxRM3wlMGaEgS5TH9HfeehgLrBaaDM8/JAgnas4Yh6L0uRoNebjXHrhqgguVBMF3xsWpvpAPCzQCYX2vjCCF3WtOEy7EEUF4u5Lo4teQhr9yfnYGBc/ktE4I0MByqTaKrLqvF45n4jOShPP0RcmLh9JpOXyrScRuaUDhQ8bd8xhkWEb94HMzwznvDLNh1/nbNybCMb5GydYf51hJVfqjU5TMWID71F8FTTBJrCZDBRESFIP+QZ3czYP+urgzmfLgDmcoPIukMaHWLU6qFpTF0QazAgF4u5Fe4J6QEZSyZz0B2kqQG3vN1dXxLgHItjQbEeceChNYNjuZFOTleXzpYkg5/4Zqy6Oek3bMscTYY7IPBV56WiO8eGw5JYMfyDeM3iyh4ZxLEC3HDRtOTBHo7WxWPR/AUOU9HP9CdmKQbGThGAUuqlqRJzbg5XNRvKIcnngI329VZV5RmAnt+G5Vfy6uqBagpMQZ3720PXPG6H5q4SBuXmHt1ccKgJvQv9lTh20EymuIALTnCodr8qDbnRfdrI="
}
},
{
/* 用于描述该皮肤外观的名称。 */
"skin_name": "remilia-scarlet"
/* 该 `皮肤` 的 `属性`。 */,
"skin_property": {
"name": "textures",
"value": "ewogICJ0aW1lc3RhbXAiIDogMTYzODY4MjMwMjQ3MSwKICAicHJvZmlsZUlkIiA6ICI0ZjU2ZTg2ODk2OGU0ZWEwYmNjM2M2NzRlNzQ3ODdjOCIsCiAgInByb2ZpbGVOYW1lIiA6ICJDVUNGTDE1IiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzE0YjRlODI2OTJiOWRjYmY2YzEyOTJkNjJiNzMxN2MxMjRjNGMzOTQ2Y2FiMjFlY2E4NDJiNDJlNzBmMGMwMjIiLAogICAgICAibWV0YWRhdGEiIDogewogICAgICAgICJtb2RlbCIgOiAic2xpbSIKICAgICAgfQogICAgfQogIH0KfQ==",
"signature": "renIrkVFQUor3+5AeDYOcGtUnUpdk9/i5ANWFGCBTSVZjeKQ/t5xDEe9kqwsWawR/55N2+1Db2c7lIpHpJ4cGqtG7BzTm+TZNUgSOu0rG27DwxheiuGbYSMm/lQSiNi7FvRlhLXuxsYZ0nHhXKoeG4xW5PXaE/zjXeXR1hffnfR/ROanmK/m2nIbkfPo59wjc+ZTF3nxhX+tGay+7dy/Y6xqhyZ4ZnM1a9+z8hC8ERgXzUUczfhRaDPQcv9dEdpyQhlfJyEV6r6NBSpBVVNaZ2bGs+VyxrRVtr/nXigps1KtFXH3j+gBiNYJWu7LpDS+1DTezlP9qkbDUPSKuO1O913GDRdJxdcVn7HGYD3W6yGB0r6sDBvb7RYESMzafRIFbBjhJrJFi3/aQjxTuFSc66bUkDqNBGYQcXyUXP1wEuB22mwQABv2OZiFdXMMRDniSZvPsxoriDdAS+umHcrAgTApu13xLyJJa8tFBD9rpGxDDoUbnNJdzZSpjrgfu38Kgpa3pW45HY21eSOubQNdz7qBTBmQwVViuVoAqH9mM/HqeIrGzwdRJaOH3GsZRofr4zh9HVc+5o02W72d39BskA56ae8zjGza9sF1jhkgiaW1NH/zuu7LnfujjvvMcczrddv8P1r7yqsIwUrP0ObB+ylsCsrb6mAV5uqXuklS7e4="
}
},
{
/* 用于描述该皮肤外观的名称。 */
"skin_name": "koishi-komeiji"
/* 该 `皮肤` 的 `属性`。 */,
"skin_property": {
"name": "textures",
"value": "eyJ0aW1lc3RhbXAiOjE1ODc4MDcxMTkyNzEsInByb2ZpbGVJZCI6IjIzZjFhNTlmNDY5YjQzZGRiZGI1MzdiZmVjMTA0NzFmIiwicHJvZmlsZU5hbWUiOiIyODA3Iiwic2lnbmF0dXJlUmVxdWlyZWQiOnRydWUsInRleHR1cmVzIjp7IlNLSU4iOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9iMjI4MTk0OWZlZDc2M2Q3OWYwODZiNGU4MjE0ZGVjNTdiZDM4NzgzODhkOTJmYWQ4NmRjMzQxNzE2MWNkYjJkIiwibWV0YWRhdGEiOnsibW9kZWwiOiJzbGltIn19fX0=",
"signature": "N/b/lSK6Y3Wqm4lTj47YHbec9yVAj7XmDjfWhVAa033UNA30U8o+2pTY0aVDAzFut624iC3xjqMzBlXt7SczsT0w8EV+MnW51V6aPlanj5SQ6zVwB20TdhhAzBNvIQbvo4x4BL99ZpyBJMBRcCVEehjaD3rgshBxH6t2z7WzzYM1cij/5egedjhm8ek8DMdYYakN6DWIOWDv05VQSiWRMhitSI2sqJMTYKaJcLph7/56Ke5zRNtA2mwEcdB+GnDPkeEINzx3A0WG/vOS3iYL8L4T5Dv1GzBlq9s10R1K4Ks5TQLhVJ4Rp2S4COLvvWsgREHQVf6NEIOG2ww4wqTi/xmHni2d6TM9K+vtLSBE7umEvLeOzp8oqbQvtD1ipa0iatR8lEXU1bcGITtwZi+i+zLeOIfx2592XevcOGwTuvhBBM53rN5suLnpcGFIT5TuOQrFinT1+vXoE2D/UkDll8nvtGzJyqFgSSFDrvf0e6ZkbFlIQRoJGkfhnDLON2aEycOe9EcD+NiLDXQc9++j+3Kl5QFyze3xd21+ConIZRGDXKqvoEhfp1ovR7ND76IVOAoGMcDT4N+n+NWdXIilipux3gQ5UZkALw1ocFzhEZY9pCYw9e7XGQRh27N/RYns+sSI1qXbtBbl0FCl7X5efvsJLWId0JuEag5f5RAYYYo="
}
}
]
}
}文件:config/fuji/modules/skin/skin-data.json
{
"nodes": []
}| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/skin |
/skin gui 命令的别名。 |
否 | 0 |
/skin gui |
打开 皮肤 GUI。 |
否 | 0 |
/skin use-default-skin <DefaultSkinName defaultSkinName> |
使用指定 皮肤名 的 默认皮肤。 |
否 | 0 |
/skin use-default-skin others <PlayerCollection others> <DefaultSkinName defaultSkinName> |
使用指定 皮肤名 的 默认皮肤。 |
是 | 4 |
/skin use-mojang-skin <Word skinName> |
把皮肤设为指定名字的在线皮肤。 | 否 | 0 |
/skin use-mojang-skin others <PlayerCollection others> <Word skinName> |
把皮肤设为指定名字的在线皮肤。 | 是 | 4 |
/skin use-my-mojang-skin |
把皮肤设为同名的在线皮肤。 | 否 | 0 |
/skin use-my-mojang-skin others <PlayerCollection others> |
把皮肤设为同名的在线皮肤。 | 是 | 4 |
/skin use-random-default-skins |
把皮肤设为随机默认皮肤。 | 否 | 0 |
/skin use-random-default-skins others <PlayerCollection others> |
把皮肤设为随机默认皮肤。 | 是 | 4 |
/skin use-url-skin alex <GreedyString url> |
使用 Alex 模型把皮肤设为自定义 URL。 | 否 | 0 |
/skin use-url-skin alex others <PlayerCollection others> <GreedyString url> |
使用 Alex 模型把皮肤设为自定义 URL。 | 是 | 4 |
/skin use-url-skin steve <GreedyString url> |
使用 Steve 模型把皮肤设为自定义 URL。 | 否 | 0 |
/skin use-url-skin steve others <PlayerCollection others> <GreedyString url> |
使用 Steve 模型把皮肤设为自定义 URL。 | 是 | 4 |
| 参数类型 | 对应类 |
|---|---|
[default-skin-name] |
[DefaultSkinName] |
自定义 可翻译文本,例如大多数 系统消息。
例如,你可以自定义以下 可翻译文本:
- 玩家加入与离开消息。
- 玩家死亡消息。(例如被僵尸杀死)
- 玩家白名单消息。(用于 GUI 中)
- 玩家成就消息。
- 玩家命令反馈。(指定命令的命令反馈)
- 服务器关闭消息。
- 玩家被封禁界面的消息。
- ……(服务端还有许多可翻译文本)
◉ 不要自定义已被其他模组处理的 可翻译文本
例如,如果你在使用 Styled Chat 模组,就不应修改 玩家加入消息 与 玩家离开消息。
因为 Styled Chat 模组已经处理了它们。
在客户端,你可以更改 语言选项,看到不同的 可翻译文本。
你的客户端中有 不同语言的语言文件。
服务端的情况类似。
服务端 中也有 不同语言的语言文件。
你可以在 https://github.com/fuji-fabric/fuji/blob/dev/.github/files/en_us.json 看到示例 语言文件。
◉ 本模块如何工作?
当 服务端 试图向 客户端 发送 可翻译文本 时。
我们会查看将要发送的是什么 可翻译文本,并在需要时用 用户自定义文本 替换 它。
客户端只会收到 用户自定义文本,并显示给玩家。
◉ 自定义玩家加入消息
键:multiplayer.player.joined
值:<rainbow>+ %s
◉ 自定义玩家离开消息
键:multiplayer.player.left
值:<dark_gray>%s leeeeeeeeft the game
◉ 自定义特定死亡类型的消息
键:death.attack.explosion.player
值:<rainbow>%1$s booooooom because of %2$s
◉ 自定义特定原版命令的反馈消息
键:commands.seed.success
值:<rainbow> Seeeeeeeeeeed: %s
◉ 自定义界面中使用的文本
注意:部分文本可能需要重启服务器才能生效。
键:multiplayer.disconnect.server_shutdown
值:Server closeeeeeeeed
键:multiplayer.disconnect.not_whitelisted
值:<rainbow>Please apply a whitelist first!
键:container.chest
值:<rb>I see you opening the chest!
◉ 取消某条消息的发送
键:multiplayer.player.left
值:null
注意:如果把 值 留为 null,表示 取消 该可翻译文本的发送。
◉ 自定义 界面 中的 文本
是的,你可以自定义 界面 中的 文本,例如 封禁界面。
键:multiplayer.disconnect.banned
值:<red>You are banned from this server
键:multiplayer.disconnect.banned.reason
值:<red>You are banned from this server<newline><yellow>Reason: %s
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/system_message/config.json
{
"rules": [
{
"enable": false,
"document": "修改玩家加入文本的样式。",
"is_screen_text": false,
"translatable_text_key": "multiplayer.player.joined",
"translatable_text_value": "<green>[+] Player %s joined the server."
},
{
"enable": false,
"document": "取消玩家离开文本的发送。",
"is_screen_text": false,
"translatable_text_key": "multiplayer.player.left",
"translatable_text_value": null
},
{
"enable": false,
"document": "修改玩家死亡消息。",
"is_screen_text": false,
"translatable_text_key": "death.attack.explosion.player",
"translatable_text_value": "<rainbow>%1$s booooooom because of %2$s"
},
{
"enable": false,
"document": "修改玩家死亡消息。",
"is_screen_text": false,
"translatable_text_key": "death.attack.fall",
"translatable_text_value": "<rb>%1$s hit the ground too hard"
},
{
"enable": false,
"document": "修改玩家死亡消息。",
"is_screen_text": false,
"translatable_text_key": "death.fell.accident.generic",
"translatable_text_value": "<rb>%1$s fell from a high place"
},
{
"enable": true,
"document": "修改 `/seed` 命令反馈的样式。",
"is_screen_text": false,
"translatable_text_key": "commands.seed.success",
"translatable_text_value": "<rainbow>Seeeeeeeeeeed: %s"
},
{
"enable": false,
"document": "修改白名单界面中显示的文本。",
"is_screen_text": true,
"translatable_text_key": "multiplayer.disconnect.not_whitelisted",
"translatable_text_value": "<rainbow>Please apply a whitelist first!"
},
{
"enable": false,
"document": "修改封禁界面中显示的文本。",
"is_screen_text": true,
"translatable_text_key": "multiplayer.disconnect.banned",
"translatable_text_value": "<red><b><i>You are banned from this server"
},
{
"enable": false,
"document": "修改封禁界面中显示的文本。",
"is_screen_text": true,
"translatable_text_key": "multiplayer.disconnect.banned.reason",
"translatable_text_value": "<red><b><i>You are banned from this server<newline><yellow>Reason: %s"
},
{
"enable": false,
"document": "修改箱子界面中显示的文本。",
"is_screen_text": true,
"translatable_text_key": "container.chest",
"translatable_text_value": "<rb>I see you opening the chest!"
}
]
}自定义 TAB 列表。
◉ 我想要复杂的 tab 列表
如果你想设计复杂而高级的 tab 列表。
我推荐使用 https://github.com/NEZNAMY/TAB
◉ 我想自定义 记分板
使用上面提到的模组,它工作得非常好。
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/tab/config.json
{
/* 用于 `更新` tab 列表的 `cron` 表达式。 */
"update_cron": "* * * ? * *"
/* 定义 tab 列表的样式。 */,
"style": {
"enable_header": true,
"enable_footer": true,
"header": [
"<rainbow><strikethrough> </strikethrough></rainbow><newline><#FFA1F5><b>Server Name</b><newline><grey><b>Online players: %server:online%</b></grey>"
],
"body": [
"<gradient:#FFA1F5:#BFBDFB:#6ECBFF>%player:displayname_visual%"
],
"footer": [
"<grey><b>TPS: %server:tps_colored% MSPT: %server:mspt_colored% PING: %player:ping_colored%</b></grey><newline><grey><b>Memory: %server:used_ram%/%server:max_ram% MB</b></grey><newline><#FFA1F5><b>%fuji:rotate Welcome to the server. %<newline><rainbow><strikethrough> </strikethrough></rainbow>"
]
}
}| 任务名 | 说明 |
|---|---|
RenderHeaderAndFooterJob |
该 任务 用于 更新 tab 列表中的 页眉 与 页脚。 |
在玩家传送前增加一个预热冷却。
在原版 Minecraft 内部有一个用于传送的传送函数。
我们监听该传送函数,并为其包上一层预热冷却。
◉ 如何为不同命令指定不同的冷却时间?
你需要使用 command_warmup 模块。
command_cooldown 模块会简单地把 所有 传送请求一视同仁。
因为我们只知道存在一个传送请求。
但我们并不知道是谁发起了这个传送请求。
所以我们只能把 所有 传送一视同仁。
◉ 传送预热的目的
主要目的是防止原版 Minecraft 中 传送命令 被 滥用。
例如用传送命令逃避死亡。
注意:管理员玩家 可以绕过传送预热。
◉ 在以下情况下 传送预热 不会生效
- 目标维度不在
生效维度列表中。 - 目标玩家的
age <= 3 - 目标玩家是
假玩家(fake player)。 - 目标玩家拥有
预热绕过权限。
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/teleport_warmup/config.json
{
/* `所有` 传送的 `预热秒数`。 */
"warmup_second": 3.0,
"admin_players_can_bypass": false,
"interruptible": {
/* 该请求是否可被打断? */
"enable": true
/* 打断该请求的最大距离。 */,
"interrupt_distance": 1.0
/* 玩家受到伤害时打断该请求。 */,
"interrupt_on_damaged": true
/* 玩家处于战斗状态时打断该请求。 */,
"interrupt_in_combat": true
},
"dimension": {
/* 为 `传送预热` 定义 `生效维度`。 */
"effective_dimensions": [
"minecraft:overworld",
"minecraft:the_nether",
"minecraft:the_end"
]
}
}本模块提供 /temp-ban 命令。
这样你就能为 /ban 命令指定 时长。
◉ 全参数示例
执行:/temp-ban player Alice 1s2m3h4d5w6M7y bad boy
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/temp-ban ip <String ip> <Duration expiry> <GreedyString reason> |
(原文未提供说明) | 是 | 4 |
/temp-ban player <GameProfileCollection collection> <Duration expiry> <GreedyString reason> |
(原文未提供说明) | 是 | 4 |
本模块仅用于 开发。
如果你是开发者,可以在这里尝试新东西。
在生产环境中你不需要启用本模块。
它没有害处,但也没什么用。
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/tester non-split <String string> |
(原文未提供说明) | 否 | 4 |
/tester non-split others <PlayerCollection others> <String string> |
(原文未提供说明) | 是 | 4 |
/tester run |
(原文未提供说明) | 否 | 4 |
/tester split <ServerPlayer target> <String string> |
(原文未提供说明) | 是 | 4 |
/tester split others <PlayerCollection others> <String string> |
(原文未提供说明) | 是 | 4 |
本模块允许你定义在聊天中显示的 称号。
或者在任何支持占位符的地方显示 当前生效称号。
◉ 把 fisher 称号给予玩家 Alice
执行:/lp user Alice permission set fuji.title.obtain.fisher true
◉ 把 fisher 称号给予玩家 Alice,但 7 天后过期
执行:/lp user Alice permission settemp fuji.title.obtain.fisher true 7d
◉ 显示 当前生效称号
在任何支持占位符的地方插入 %fuji:active_title%。(例如支持占位符的聊天模组)
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/title/config.json
{
"default_active_title_id": "resident",
"no_active_title_text": "<grey>[None]",
"title_descriptors": [
{
"id": "resident",
"item": "minecraft:grass_block",
"display_name": "<dark_green>[Resident]",
"lore": [
"<yellow>The title for a resident."
]
},
{
"id": "farmer",
"item": "minecraft:iron_hoe",
"display_name": "<green>[Farmer]",
"lore": [
"<yellow>The title for a farmer."
]
},
{
"id": "fisher",
"item": "minecraft:fishing_rod",
"display_name": "<blue>[Fisher]",
"lore": [
"<yellow>The title for a fisher."
]
}
]
}文件:config/fuji/modules/title/data.json
{
"preferences": []
}| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/title! |
打开 称号 GUI。 |
否 | 0 |
| 占位符 | 说明 |
|---|---|
fuji:active_title |
返回该玩家 当前生效称号 的 显示名称。 |
分析服务器所有已加载的区块,找出最卡顿的区块。
本模块使用一种 简单的统计方法 来估算 区块的卡顿程度。
方法很简单:统计 区块 内的 实体 与 方块实体 数量。
并按 实体 或 方块实体 的 类型 累加 分数。
它简单、快速且实用。
你可以把 一只僵尸 的分值定义为 4。
把 一只蜜蜂 的分值定义为 15。
把 一个活塞 的分值定义为 10。
这取决于你的实际情况。
简单的方法往往有效。
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/top_chunks/config.json
{
/* `全部区块` 中要列出的 `卡顿区块` 数量。 */
"top": {
"rows": 10,
"columns": 10
}
/* 为 `区块` 搜索 `最近的玩家` 的 `最大距离`。 */,
"distance_to_search_nearest_player": 128
/* 是否隐藏 `区块` 的 `位置`。 */,
"hide_location": true
/* 定义 `类型` 到 `分值` 的映射。
`类型` 是 `可翻译键`。 */,
"type2score": {
"entity.minecraft.armor_stand": 10,
"block.minecraft.jukebox": 35,
"block.minecraft.beehive": 15,
"entity.minecraft.falling_block": 10,
"entity.minecraft.item": 10,
"block.minecraft.beacon": 35,
"entity.minecraft.zoglin": 8,
"entity.minecraft.vindicator": 20,
"entity.minecraft.villager": 25,
"entity.minecraft.bee": 15,
"block.minecraft.mob_spawner": 100,
"entity.minecraft.endermite": 5,
"entity.minecraft.chest_boat": 5,
"block.minecraft.conduit": 40,
"entity.minecraft.cow": 3,
"block.minecraft.piston": 10,
"block.minecraft.comparator": 5,
"entity.minecraft.creeper": 3,
"entity.minecraft.item_frame": 3,
"entity.minecraft.skeleton": 2,
"entity.minecraft.cat": 8,
"entity.minecraft.glow_item_frame": 3,
"entity.minecraft.player": 15,
"block.minecraft.trapped_chest": 2,
"entity.minecraft.zombie": 4,
"block.minecraft.chest": 1,
"block.minecraft.dispenser": 10,
"block.minecraft.furnace": 3,
"entity.minecraft.zombified_piglin": 5,
"entity.minecraft.ravager": 80,
"entity.minecraft.panda": 5,
"entity.minecraft.tnt": 70,
"entity.minecraft.chicken": 3,
"entity.minecraft.piglin": 2,
"entity.minecraft.spider": 2,
"default": 1,
"entity.minecraft.evoker": 20,
"entity.minecraft.enderman": 4,
"entity.minecraft.boat": 5,
"block.minecraft.smoker": 3,
"entity.minecraft.hopper_minecart": 20,
"block.minecraft.hopper": 8,
"entity.minecraft.pillager": 20,
"entity.minecraft.mooshroom": 3,
"entity.minecraft.zombie_villager": 8,
"entity.minecraft.wither": 55,
"block.minecraft.daylight_detector": 25,
"block.minecraft.blast_furnace": 4,
"entity.minecraft.guardian": 6,
"block.minecraft.dropper": 10,
"entity.minecraft.drowned": 2,
"entity.minecraft.sheep": 5,
"block.minecraft.barrel": 1,
"entity.minecraft.vex": 20,
"entity.minecraft.experience_orb": 3,
"entity.minecraft.wolf": 8
}
}| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/chunks |
/chunks message 的别名命令。 |
是 | 0 |
/chunks gui |
按卡顿分值排序列出所有区块,并以 GUI 形式发送。 |
是 | 0 |
/chunks message |
按卡顿分值排序列出所有区块,并以 消息 形式发送。 |
是 | 0 |
本模块提供 /tpa 与 /tpahere 命令。
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/tpa/config.json
{
/* 每个 tpa 请求的过期时长(秒)。 */
"request_timeout": 300,
"mention_player": {
/* `声音` 的标识符。 */
"sound": "entity.experience_orb.pickup",
"volume": 100.0,
"pitch": 1.0
/* 播放该声音的次数。 */,
"repeat_count": 3
/* 每次播放声音之间的间隔。 */,
"interval_ms": 1000
}
}| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/tpa |
(原文未提供说明) | 否 | 0 |
/tpa <ServerPlayer target> |
(原文未提供说明) | 否 | 0 |
/tpa gui |
(原文未提供说明) | 否 | 0 |
/tpaaccept <ServerPlayer target> |
(原文未提供说明) | 否 | 0 |
/tpaaccept all |
(原文未提供说明) | 否 | 0 |
/tpacancel <ServerPlayer target> |
(原文未提供说明) | 否 | 0 |
/tpacancel all |
(原文未提供说明) | 否 | 0 |
/tpadeny <ServerPlayer target> |
(原文未提供说明) | 否 | 0 |
/tpadeny all |
(原文未提供说明) | 否 | 0 |
/tpahere <ServerPlayer target> |
(原文未提供说明) | 否 | 0 |
允许你编辑玩家的 槽位。
- 编辑在线/离线玩家的
背包。 - 编辑在线/离线玩家的
末影箱。
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/view ender <OfflinePlayerName target> |
查看玩家的末影箱。 | 否 | 4 |
/view inv <OfflinePlayerName target> |
查看玩家的背包。 | 否 | 4 |
本模块为 管理团队 提供 信息管理 功能。
一个供 管理团队 之间共享的 警告 GUI,用于 跟踪 玩家行为。
你可以为 玩家 创建 一条 警告。
所有 管理团队成员 都可以 查看 某 玩家 的 警告。
你可以用 警告 来 跟踪 玩家 的行为。
◉ 与高级 封禁 工具集成
你可以把 warning 模块与 temp_ban 模块集成。
不过,你可能需要一些更高级的封禁工具。
参见:https://github.com/Patbox/BanHammer
◉ 为玩家创建一条 永久警告
执行:/warning create Steve Steal items.
◉ 为玩家创建一条 临时警告
执行:/warning create-temp Steve 3d Steal items.
◉ 列出某玩家的所有警告
执行:/warning list Steve
◉ 打开 警告 GUI
执行:/warning gui
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/warning/config.json
{
/* 是否向被警告的玩家发送提醒? */
"warning_reminder": {
"remind_warned_player_on_join_server": true,
"reminder_source": {
"remind_permanent_warnings_type": false,
"remind_temporal_warnings_type": true
}
}
/* 定义 `警告规则`,用于执行 `惩罚命令`。
当玩家被 `添加` 一条新的 `警告` 时,我们会处理这些 `警告规则`。
然后挑 `一条警告规则` 来执行其命令。
我们会优先挑满足条件中 `警告数量最高` 的那一条。 */,
"on_permanent_warning_created": [
{
/* 如果该 `玩家` 的 `警告数量` >= `定义值`,则执行这些命令。 */
"if_number_of_warnings_greater_equal_than": 1,
"commands": [
"send-broadcast <dark_red>Player %player:name% has just received a permanent-warning.<newline><dark_red>◉ Reason: %fuji:last_warning_reason%",
"when-online %player:name% send-message %player:name% <dark_red>You have received a warning."
]
},
{
/* 如果该 `玩家` 的 `警告数量` >= `定义值`,则执行这些命令。 */
"if_number_of_warnings_greater_equal_than": 3,
"commands": [
"send-broadcast <dark_red>Player %player:name% has just received a permanent-warning.<newline><dark_red>◉ Reason: %fuji:last_warning_reason%",
"temp-ban player %player:name% 30m Warned 3 times."
]
}
],
"on_temporal_warning_created": [
{
/* 如果该 `玩家` 的 `警告数量` >= `定义值`,则执行这些命令。 */
"if_number_of_warnings_greater_equal_than": 1,
"commands": [
"send-broadcast <dark_red>Player %player:name% has just received a temporal-warning.<newline><dark_red>◉ Expiration Date: %fuji:last_warning_expiration_date%<newline><dark_red>◉ Reason: %fuji:last_warning_reason%"
]
},
{
/* 如果该 `玩家` 的 `警告数量` >= `定义值`,则执行这些命令。 */
"if_number_of_warnings_greater_equal_than": 3,
"commands": [
"send-broadcast <dark_red>Player %player:name% has just received a temporal-warning.<newline><dark_red>◉ Expiration Date: %fuji:last_warning_expiration_date%<newline><dark_red>◉ Reason: %fuji:last_warning_reason%",
"warning create %player:name% Received too many temporal warnings in a short period of time."
]
}
]
}文件:config/fuji/modules/warning/warning-data.json
{
"players": []
}| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/warning |
打开警告 GUI。 | 否 | 4 |
/warning clear <OfflinePlayerName targetPlayer> [Boolean confirm] |
清除某玩家的警告。 | 是 | 4 |
/warning clear-all [Boolean confirm] |
清除所有玩家的所有警告。 | 是 | 4 |
/warning create <OfflinePlayerName targetPlayer> <GreedyString warning> |
为该玩家创建一条新警告。 | 是 | 4 |
/warning create-temp <OfflinePlayerName targetPlayer> <Duration duration> <GreedyString warning> |
为该玩家创建一条带过期时间的新警告。 | 是 | 4 |
/warning gui |
打开警告 GUI。 | 否 | 4 |
/warning list <OfflinePlayerName targetPlayer> |
列出某玩家的警告。 | 是 | 4 |
| 占位符 | 说明 |
|---|---|
fuji:last_warning_created_date |
返回最近创建的一条警告的 创建日期。 |
fuji:last_warning_creator_name |
返回最近创建的一条警告的 创建者名称。 |
fuji:last_warning_expiration_date |
返回最近创建的一条警告的 过期日期。 |
fuji:last_warning_reason |
返回最近创建的一条警告的 原因。 |
本模块让 原版白名单系统 只比较 用户名,而 忽略 UUID。
◉ 只在离线服务器中启用本模块
如果你开的是正版验证(online-mode)服务器,则不需要启用本模块。
◉ 有什么区别?
对于 正版验证 服务器,玩家的 UUID 是确定的,并且始终一致。
对于 离线模式 服务器,玩家的 UUID 会随该玩家的 验证方式 变化,并受服务端 用户缓存 的影响。
提供一个 公告板,供 玩家 展示与分享自己的作品。
◉ 非生产作品 与 生产作品 的区别
对于 生产作品,我们提供 生产取样 来统计 漏斗 与 漏斗矿车。
◉ 生产作品 中的 取样 是什么?
它是针对 漏斗 与 漏斗矿车 的计数器。
它会统计定义取样时长内 物品传输的速率。
例如,你可以用它统计取样时长内传输了多少 骨头、线 与 煤炭。
它有点类似 carpet 模组里的 漏斗计数器。
你可以同时使用两者。
carpet 模组提供的 漏斗计数器 会销毁输出的物品。
而本模块提供的漏斗计数器不会。
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/works/config.json
{
/* `生产作品` 的 `取样` 所用的 `时长`。 */
"sample_time_ms": 3600000
/* `生产作品` 允许的 `最大距离`。 */,
"sample_distance_limit": 512
/* `生产作品` 最多展示的物品类型数。 */,
"sample_counter_top_n": 20
}文件:config/fuji/modules/works/works.json
{
/* 已创建的 `作品` 列表。 */
"works": []
}| 任务名 | 说明 |
|---|---|
ConfigurationHandlerWriteStorageJob |
该 任务 用于把 数据 从 内存 写入 存储。注意:如果你在 磁盘 上修改了该 文件,需要尽快执行 /fuji reload。注意:触发 该任务时,磁盘 上的文件会被 覆盖。 |
WorksOnScheduleDispatcherJob |
该 任务 用于为每个 作品 派发 onSchedule 事件。例如:结束某个 生产作品 的取样。 |
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/works |
打开作品展示 GUI。 | 否 | 0 |
提供统一的世界管理。
在早期的 Minecraft 中,一个 世界 只包含 1 个维度(主世界维度)。
在现代 Minecraft 中,一个 世界 可以包含 3 个或更多维度。(主世界、末地与下界)
每个 维度 都有自己的 维度类型。
我们可以用已有的 维度类型 创建额外的维度。
参见:https://minecraft.wiki/w/Dimension_definition
参见:https://minecraft.wiki/w/Dimension_type
注意:你可以直接把 维度 这个词等同于 世界。
在原版 Minecraft 中,服务端 里有一个名为 worlds 的变量,用于存放所有 已加载维度。
原版 Minecraft 会在服务端启动时 加载 3 个 维度。
它们是 minecraft:overworld、minecraft:the_nether 与 minecraft:the_end。
所以我们要做的是 模仿 这些动作。
我们在服务端启动时创建 维度 实例。
然后把这个 维度 放入 已加载维度 列表。
这样它就会被服务端识别。
注意:由 fuji 创建的维度被称为 运行时维度,因为它们是在运行时 创建 与 加载 的。
◉ 需要在 world 文件夹中存储特殊数据吗?
不需要,我们没有改动 world 文件夹,也没有往里面放任何特殊数据。
我们的需求很小:只需要在模块文件夹中定义 运行时维度描述符。
运行时维度描述符 应提供足够的信息来定义一个 维度选项。
◉ 什么是 DimensionOptions?
一个 DimensionOptions = 一个 维度类型 + 一个 区块生成器。
维度类型 用于定义 维度 的 环境。(例如 床会爆炸吗?、会无限燃烧吗?)
区块生成器 用于 生成 区块。(把 种子 与 区块位置 交给它,它就会为你填充方块)
参见:
- https://minecraft.wiki/w/Dimension_type
- https://minecraft.wiki/w/Dimension_definition
- https://minecraft.wiki/w/Noise_settings
实际上,world 模块本身并不做 世界生成。
我们做的事情很简单:运行时维度描述符 提供足够的信息来创建 DimensionOptions。
注意 Dimension Options = 维度类型 + 区块生成器:
- 我们用
维度类型描述某个维度的环境。(例如床会爆炸吗?、会无限燃烧吗?等) - 我们用
区块生成器描述区块如何生成。(我们会把指定的种子参数传给它)
◉ 什么是 区块生成器?
把一个 种子 与 区块位置 交给 区块生成器。
区块生成器 就会为你 填充 方块。
区块生成器 有 2 种类型:
-
平坦区块生成器(Flat Chunk Generator):用于超平坦世界,它逐层填充方块。 -
噪声区块生成器(Noise Chunk Generator):相比平坦区块生成器,它会加入一些噪声,让你的维度不至于像超平坦维度那样单调。
注意:minecraft:overworld、minecraft:the_nether 与 minecraft:the_end 都使用 噪声区块生成器,但它们的 区块生成器设置 不同。
有 3 个具有不同 区块生成器设置 的 NoiseChunkGenerator 实例。
这就是 minecraft:overworld、minecraft:the_nether 与 minecraft:the_end 看起来不一样的原因。
◉ 区块生成器 的逻辑
如果指定的区块尚未 生成,区块生成器会 生成 一个新的。
如果指定的区块已 生成,区块生成器会直接使用存储中 已存在的区块数据。
fuji 提供的 world 模块是一个简单的模块。
如果你想要更强大的工具,可以试试 WorldManager 模组与 WorldGameRules 模组。
参见:
- https://minecraft.wiki/w/World_generation
- https://minecraft.wiki/w/World_type
- https://minecraft.wiki/w/World
- https://minecraft.wiki/w/Biome
- https://minecraft.wiki/w/Void
- https://minecraft.wiki/w/Overworld
- https://minecraft.wiki/w/Feature
- https://minecraft.wiki/w/Structure
- https://minecraft.wiki/w/Terrain_features
- https://minecraft.fandom.com/wiki/Java_Edition_level_format
- https://minecraft.wiki/w/Chunk_format
- https://minecraft.wiki/w/Loot_table
你可以用 command_scheduler 模块自动执行 /world reset 命令。
每个 fuji 运行时维度都会保存自己的 time_of_day(相当于 level.dat 中的 DayTime)。
◉ Minecraft 中 一天 的时长
一天的总刻数 是 24000 刻,即 20 分钟。
它是 10 分钟白天 + 10 分钟夜晚。
◉ 保存的 已流逝刻数 与 /time 命令
level.dat 中 Time 的值 = /time query gametime。
level.dat 中 DayTime 的值 = /time query day * 24000 + /time query daytime。
注意:minecraft:overworld、minecraft:the_nether 与 minecraft:the_end 共享同一个 DayTime 实例。
注意:/time set {day/midnight/night/noon} 命令会直接把 DayTime 设定到第一天。
◉ /time query ... 命令的逻辑
对于 /time query daytime 命令,它返回 命令来源所在世界 的 DayTime % 24000:
- 如果
命令来源是玩家,则该世界是该玩家所在的世界。 - 如果
命令来源是控制台,则该世界是minecraft:overworld。
◉ /time {set/add} ... 命令的逻辑
对于 /time {set/add} 命令,它作用于服务端中的 所有维度。
天气 有 3 种类型:clear(晴朗)、rain(下雨)与 thunder(雷暴)。
如果是 clear,则 rain 与 thunder 都为 false。
如果是 thunder,则 rain 为 true。
天气系统 会在以下条件下 tick:
-
世界的维度选项带有天空光。 -
世界的gamerule DO_WEATHER_CYCLE为 true。
◉ /weather 命令的逻辑
/weather 命令 只 设置 minecraft:overworld 的 天气。
◉ 按维度设置天气
你可以直接在配置文件中修改天气,并执行 /fuji reload 使其生效。
这取决于该 数据包 如何与 世界 交互。
大多数数据包应该都能工作。
无论如何,在安装新数据包之前,请始终备份你的世界数据。
在原版 Minecraft 中只有 3 个维度。
它们是 minecraft:overworld、minecraft:the_nether 与 minecraft:the_end。
它们是 硬编码 的维度。
下界传送门 与 末地传送门 的联动使用的是这些 硬编码 维度。
◉ 我能在 运行时维度 中创建 下界传送门 吗?
不能,你无法在运行时维度中创建任何 下界传送门。
◉ 我能在 运行时维度 中创建 末地传送门 吗?
可以,但目标维度是硬编码的,始终是 minecraft:the_end。
EnderPortalBlockEntity 的逻辑:
- 如果玩家当前在
minecraft:the_end,则目标维度是minecraft:overworld。 - 否则目标维度是
minecraft:the_end。
◉ 创建一个额外的 the_nether 维度
执行:/world create my_nether minecraft:the_nether
注意:默认情况下,维度命名空间是 fuji。
执行 /world create "custom_namespace:my_nether" minecraft:the_nether 可使用自定义命名空间。
◉ 删除额外的维度
执行:/world delete fuji:my_nether --confirm true
◉ 用随机种子重置额外的维度
执行:/world reset fuji:my_nether --confirm true
◉ 为额外维度指定种子
/world create my_nether --seed 1234567890 minecraft:the_nether/world reset fuji:my_nether --useTheSameSeed true --confirm true
◉ 创建一个使用 overworld 维度类型的 平坦维度
执行:/world create my_flat_world minecraft:overworld --chunkGeneratorType FLAT
◉ 创建一个使用 overworld 维度类型与 自定义预设 的 平坦维度
执行:/world create my_desert_world minecraft:overworld --chunkGeneratorType FLAT --chunkGeneratorParameters "minecraft:bedrock,3*minecraft:stone,116*minecraft:sandstone;minecraft:desert"
◉ 创建一个 虚空维度
执行:/world create my_void_world minecraft:overworld --chunkGeneratorType FLAT --chunkGeneratorParameters "minecraft:air;minecraft:the_void"
注意:其中的 秘诀 是:虚空维度 只是一个使用自定义 minecraft:air 层 与 minecraft:the_void 生物群系的 平坦维度。
◉ 用 生成器 生成 参数
参见:https://minecraft.tools/en/flat.php
◉ 有用的资料
世界预设 的定义:https://minecraft.fandom.com/wiki/World_preset
超平坦维度 的定义:https://minecraft.fandom.com/wiki/Superflat
◉ 使用预定义的 世界预设 创建 运行时维度
执行:/world create example minecraft:overworld --worldPresetType DEBUG_ALL_BLOCK_STATES
注意:当你使用预定义的 世界预设 时,以下选项会被 忽略:
维度类型 id区块生成器类型-
区块生成器参数。
◉ import、make、load、unload 的定义
import 表示:在配置文件中定义一个 运行时维度描述符。
这样我们就知道如何创建该维度所使用的 原始区块生成器。
make 表示:我们用 运行时维度描述符 创建 维度 实例。
我们需要根据 运行时维度描述符 构造出 DimensionOptions。
一个 DimensionOptions = 一个 维度类型 + 一个 区块生成器。
load 表示:我们会把这个 维度 实例放入 服务端 的世界列表。
unload 表示:我们会把这个 维度 实例从 服务端 的世界列表中移除。
◉ /world create 与 /world delete 命令的定义
/world create 命令会执行 import、make 与 load。
/world delete 命令会执行 unload,并同时 删除该维度的区块文件。
◉ 如何 import 一个 维度目录?
/world import 与 /world create 命令类似。
你需要指定 足够的信息 来定义 运行时维度描述符。
注意 import 一个维度目录 就是 在配置文件中定义运行时维度描述符。
注意:如果你指定了 错误的种子,区块生成器 生成的新区块会与你 已有的区块 不一致。
◉ 导入一个 空岛维度
假设你有一个名为 sky_block 的 空岛维度 目录。
你需要把该 目录 放到 world/dimensions/fuji/sky_block。
然后执行:/world import sky_block minecraft:overworld --seed <seed> --chunkGeneratorType FLAT --chunkGeneratorParameters "minecraft:air;minecraft:the_void"
这会定义一个使用 平坦区块生成器 与 虚空层 的 运行时维度描述符。
虚空层 意味着:当需要 生成新区块 时,平坦区块生成器 会填充 minecraft:air。
◉ 导入一个 主世界维度
执行:/world import my_overworld minecraft:overworld --seed <seed>
你需要指定 维度类型 来定义 你的维度的环境。
同时还要指定 种子 来定义 你的维度的种子。
◉ 导入一个 超平坦维度
执行:/world import my_superflat minecraft:overworld --seed <seed> --chunkGeneratorType FLAT
◉ 使用 command_bundle 模块创建一条 /tpw 命令
/world tp 命令是 管理员级 命令。
你可以用 command_bundle 模块创建一条 /tpw resource-world 命令,把玩家传送到 fuji:overworld。
◉ 使用 tppos 模块把玩家传送到指定世界
/tppos --dimension minecraft:overworld --x 0 --y 128 --z 0 --yaw 0 --pitch 0/tppos --dimension minecraft:overworld --centerX 0 --centerZ 0 --minRange 0 --maxRange 1000 --maxTryTimes 16
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/world/config.json
{}文件:config/fuji/modules/world/world.json
{
"dimension_list": []
}| 任务名 | 说明 |
|---|---|
ConfigurationHandlerWriteStorageJob |
该 任务 用于把 数据 从 内存 写入 存储。注意:如果你在 磁盘 上修改了该 文件,需要尽快执行 /fuji reload。注意:触发 该任务时,磁盘 上的文件会被 覆盖。 |
| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/world create <FujiIdentifier name> <DimensionType dimensionType> [Long seed] [ChunkGeneratorType chunkGeneratorType] [String chunkGeneratorParameters] [WorldPresetType worldPresetType] |
该命令做以下事情:1. 把 维度描述符 添加 到 配置 文件中。2. 用该 维度描述符 创建 运行时维度。3. 把该运行时维度 加载 到 服务端。 |
是 | 4 |
/world delete <Dimension dimension> [Boolean confirm] |
该命令做以下事情:1. 在服务端 卸载 已 加载的运行时维度。2. 删除该维度的区块文件。3. 删除配置文件中的 运行时维度描述符。 |
是 | 4 |
/world import <FujiIdentifier name> <DimensionType dimensionType> [Long seed] [ChunkGeneratorType chunkGeneratorType] [String chunkGeneratorParameters] [WorldPresetType worldPresetType] |
该命令会 导入 一个放在 world/dimensions/fuji/<dimension-name> 的外部 维度目录。你需要提供足够的信息来定义 运行时维度描述符。注意:该命令与 /world create 命令几乎完全相同。 |
是 | 4 |
/world info <Dimension dimension> |
列出指定维度的调试信息。 | 是 | 4 |
/world list |
列出 已加载维度 与 未加载维度。 |
是 | 4 |
/world load <UnloadedRuntimeDimensionDescriptor dimension> |
该命令做以下事情:1. 依据 运行时维度描述符 创建 运行时维度 实例。2. 把创建好的 运行时维度 加载 到 服务端。 |
是 | 4 |
/world reset <Dimension dimension> [Boolean useTheSameSeed] [Boolean confirm] |
删除并创建指定世界。 | 是 | 4 |
/world save-configs |
把所有 维度描述符 从 内存 保存到 存储。 |
是 | 4 |
/world tp <Dimension dimension> |
以相同坐标传送到目标维度。 | 否 | 4 |
/world unload <LoadedRuntimeDimensionDescriptor dimension> |
(原文未提供说明) | 是 | 4 |
/world who |
列出每个玩家所在的维度。 | 是 | 4 |
/world who <Dimension dimension> |
列出指定维度中的玩家。 | 是 | 4 |
| 参数类型 | 对应类 |
|---|---|
[chunk-generator-type] |
[ChunkGeneratorType] |
[loaded-runtime-dimension-descriptor] |
[LoadedRuntimeDimensionDescriptor] |
[unloaded-runtime-dimension-descriptor] |
[UnloadedRuntimeDimensionDescriptor] |
[world-preset-type] |
[WorldPresetType] |
本模块允许你自定义 按维度的世界边界。
自 MC 1.21.9 起,/worldborder 命令已是 按维度生效 的。
只有当你的 MC 版本低于 MC 1.21.9 时,才应使用 world.border 模块。
在 Minecraft 内部,每个 维度 都有一个名为 getWorldBorder() 的函数。
它返回该 维度 的 世界边界。
原版 Minecraft 只返回 minecraft:overworld 的 世界边界。
fuji 修改了 getWorldBorder() 函数,让它返回 按维度的边界。
◉ 如何配置 按维度的边界?
你可以直接修改配置文件,并执行 /fuji reload 使改动生效。
◉ 我可以在原版维度中使用本模块吗?
可以。
/worldborder 命令只设置 minecraft:overworld 的 世界边界。
但 minecraft:the_nether 与 minecraft:the_end 维度会 同步 minecraft:overworld 的 世界边界。
参见:https://minecraft.wiki/w/World_border
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/world/border/config.json
{
/* 为每个 `维度` 定义 `边界`。 */
"borders": [
{
"enable": true,
"dimension_id": "fuji:example",
"border": {
"center_x": 0.0,
"center_z": 0.0,
"size": 9.999968E13,
"size_lerp_time": 0,
"size_lerp_target": 0.0,
"warning_blocks": 5,
"warning_time": 15,
"damage_per_block": 0.2,
"safe_zone": 5.0
}
}
]
}允许玩家下载离自己最近的 region 文件。
它对玩家保存与调试 红石结构 很有用。
它只是下载服务端使用的 同款 region 文件。
简单,没有意外。
它也可以帮助玩家下载别人的建筑,或自己的建筑。
⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。
文件:config/fuji/modules/world_downloader/config.json
{
/* 用于广播的 url 格式。 */
"url_format": "http://localhost:%port%%path%"
/* 下载器 http 服务使用的端口。 */,
"port": 22222
/* 每个连接的最大下载速度。 */,
"bytes_per_second_limit": 128000
/* 内存中保存的最大下载请求数。 */,
"max_simultaneous_download_count": 5
}| 命令语法 | 说明 | 控制台可执行 | 所需权限等级 |
|---|---|---|---|
/download |
下载你周围的 region 文件。 | 否 | 0 |