Fuji 中文教程 - SJMC-Dev/SMP3-modpack GitHub Wiki

Fuji 中文教程(完整翻译版)

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(总览)

原文:https://fuji-fabric.github.io/

本手册分为两部分:

  1. core(核心) 核心部分请参考:

  2. modules(模块) 模块部分请参考本文档中各模块对应的章节。

本文档还提供交互式版本:在服务器中执行 /fuji 命令即可阅读。


2. core — 核心

原文:https://fuji-fabric.github.io/Modules/core

提示与常见问题

◉ 如何使用本模组?

功能由各个模块提供。所有模块默认全部关闭,你需要手动启用想用的模块。

◉ 如何启用一个模块?

  1. 编辑 <你的服务器目录>/config/fuji/config.json 文件。
  2. 在 modules 小节中,把各个模块的值设为 true 或 false。
  3. 重启服务器使改动生效。

◉ 服务器运行期间可以重载配置文件吗?

可以,但只能针对已启用的模块。对这些模块,使用 /fuji reload 重载该模块专属的配置文件。

你不能在服务器运行期间启用或禁用某个模块——模块只在服务器启动阶段加载。

这是设计上的取舍,原因有两点:

  1. 性能:被禁用的模块不会带来任何开销。
  2. 兼容性:如果与其他模组冲突,可以禁用相关模块来解决冲突。

◉ lore 文本太大看不清怎么办?

➜ lore 文本过大时调整字体大小

如果 lore 文本太大:

  • 打开 Esc → Options(选项)→ Video Settings(视频设置)→ GUI Scale(GUI 缩放)。

➜ 必要时改善 lore 文本渲染

如果调节 GUI 缩放 仍然不够,请安装客户端模组 ToolTipFix:

◉ 怎么让配置文件更容易编辑?

请使用现代的文本编辑器。

大多数配置文件采用 JSON 格式,体积可能很大。现代文本编辑器可以高亮显示结构并检查错误,让配置工作轻松很多。

推荐的文本编辑器:

  1. Visual Studio Code:https://code.visualstudio.com/
  2. Vim:https://neovim.io/
  3. 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 语法,不可直接复制到配置目录中。

文件 config.json(主控制文件)

该文件名为 主控制文件,用途是:

  1. 控制 core 的行为,从而影响所有 模块。
  2. 启用或禁用某个 模块。

你不能在服务器运行期间启用或禁用某个模块,必须重启服务器才能切换模块。

默认内容(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
    }
  }
}

文件 permission.json

◉ 本模组的命令权限是如何确定的?

  1. 每条命令在注册时都带有一个默认的 权限等级。 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]

3. afk — 暂离检测

原文:https://fuji-fabric.github.io/Modules/afk

模块说明

本模块添加一个 检查器,用于判定玩家是否处于 Away From Keyboard(离开键盘,即暂离)状态。

在 afk 状态下:

  1. 你可以定义玩家 进入 或 离开 该状态时执行的 命令。
  2. 你可以定义该状态下的 显示名称。

工作方式

➜ 跟踪最后操作时间

为每个玩家定义一个 数字,用于跟踪 最后操作时间。

操作 可以是:挖掘方块、移动、执行命令 等。

当收到来自某个玩家的 操作 时,更新该玩家的这个数字。

➜ 进入暂离状态

定义一个 任务,比较该 数字 的两个连续取值。

如果两次取值完全相同,就让该玩家 进入 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

4. afk.effect — 暂离状态效果

原文:https://fuji-fabric.github.io/Modules/afk.effect

模块说明

本模块为处于 afk 状态的玩家施加 效果。

支持的效果有:

  1. Invulnerable(无敌):处于 afk 状态的玩家不会被 伤害。
  2. Targetable(可被选为目标):处于 afk 状态的玩家不会被敌对实体选为 目标。
  3. Moveable(可被移动):处于 afk 状态的玩家不会被 外力 推动。(活塞、重力等)

配置

⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。

文件:config/fuji/modules/afk/effect/config.json

{
  "invulnerable": true,
  "targetable": false,
  "moveable": false
}

5. anti_build — 破坏行为限制

原文:https://fuji-fabric.github.io/Modules/anti_build

模块说明

本模块用于 禁止 玩家的特定 行为。

可禁止的 行为 包括:

  1. 破坏指定的方块。
  2. 放置指定的方块。
  3. 对指定物品进行交互。
  4. 对指定方块进行交互。
  5. 对指定实体进行交互。
  6. 攻击指定的实体。

示例

◉ 禁止放置 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(末地)维度放置 蘑菇 类方块

执行:

  1. /lp group default permission set fuji.anti_build.place_block.override.minecraft:red_mushroom false world=the_end
  2. /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"
      ]
    }
  }
}

6. back — 返回上一位置

原文:https://fuji-fabric.github.io/Modules/back

模块说明

本模块允许玩家 传送 到自己的 上一个位置。

上一个位置 可以是:

  • 上次传送的位置。
  • 上次死亡的位置。

配置

⚠️ 以下 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

7. chat — 聊天系统

原文:https://fuji-fabric.github.io/Modules/chat

模块说明

本模块为原版 Minecraft 的 聊天 系统提供相关功能。

注意

◉ 与其他 聊天相关 模组的兼容性问题

原版 Minecraft 的聊天系统没有标准 API 可供交互,这让 聊天相关模组 之间的兼容问题更难解决。

我已尽力以最兼容的方式编写代码。如果任何 chat 子模块无法工作,欢迎提交 issue。


8. chat.display — 展示物品 / 背包 / 末影箱

原文:https://fuji-fabric.github.io/Modules/chat.display

模块说明

本模块允许玩家向 他人 展示 自己的东西。

可以展示的 东西 包括:

  1. 主手物品。
  2. 自己的背包。
  3. 自己的末影箱。

提示

◉ 更高级的 服务端 展示类模组

新模组 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 创建一个 末影箱展示,并返回用于打开该展示的 可点击 文本。

9. chat.history — 聊天记录

原文:https://fuji-fabric.github.io/Modules/chat.history

模块说明

本模块为原版 Minecraft 的 聊天 系统提供 历史记录 功能。

工作方式

➜ 存储玩家发送的 聊天文本

当玩家发送一条聊天文本时,把它存储起来。

➜ 把 聊天文本 还原给新加入的玩家

当玩家加入服务器时,把所有已存储的聊天文本发送给该玩家。

acceptors 与 rejectors 是什么?

一条 聊天消息 = 聊天类型 + 聊天内容 + 聊天参数。

在原版 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

10. chat.mention — 聊天提及

原文:https://fuji-fabric.github.io/Modules/chat.mention

模块说明

本模块允许玩家在聊天中 提及 其他在线玩家:

  1. 名称高亮:被提及玩家的名字会被醒目地高亮显示。
  2. 声音提醒:被提及的玩家会收到声音提醒。

警告

◉ 本模块与 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>"
}

11. chat.replace — 聊天文本替换

原文:https://fuji-fabric.github.io/Modules/chat.replace

模块说明

本模块允许你把 聊天字符串 替换为给定的 聊天文本(包含占位符解析)。

也就是说,本模块可以用 指定的文本 替换 聊天字符串,并支持 占位符 解析。

警告

◉ 本模块无法与 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>"
      }
    ]
  }
}

12. chat.spy — 聊天监听

原文:https://fuji-fabric.github.io/Modules/chat.spy

模块说明

本模块允许监听指定的 聊天消息类型(主要是私聊消息类型)。

注意

在 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

13. chat.style — 聊天样式

原文:https://fuji-fabric.github.io/Modules/chat.style

模块说明

本模块允许自定义 全局聊天样式。

此外,玩家可以使用 /chat style 命令配置自己的 个人聊天样式。

警告

如果你在使用 Styled Chat 模组,可以 禁用 本模块,因为二者 目的 相同。

注意:更高级的聊天样式功能

fuji 提供的 chat.style 模块比较简单。

如果你想要高级的聊天功能,可以使用 Styled Chat 模组。

如果你想要 /mute、/tempmute 命令,可以使用 BanHammer 模组。

提示:即使你在使用 Styled Chat 模组,仍然可以使用 fuji 的 chat.* 系列模块。

大多数 chat.* 模块在设计上都能与其他 聊天相关模组 配合,尤其是 Styled Chat 模组。

本模块的主要特性

  1. 你可以使用 样式标签 定义复杂的 格式。
  2. 你可以为所有玩家定义 全局格式。
  3. 玩家可以用 /chat style 命令设置自己的 个人格式。
  4. 本模块在设计上可与其他 聊天相关 模组配合。
  5. 你可以用权限控制玩家能使用哪些样式标签。

用 样式标签 编写 复杂格式

语言语法参见:

  1. https://docs.advntr.dev/minimessage/format.html
  2. https://placeholders.pb4.eu/user/quicktext

为玩家设置 前缀 与 后缀

你需要安装 luckperms 模组来提供 前缀 和 后缀 功能。

安装后,执行 /lp group default meta setprefix <yellow>[awesome] 来设置 前缀。

要使用该 前缀,请使用占位符 %fuji:player_prefix%。

参见:https://luckperms.net/wiki/Prefixes,-Suffixes-&-Meta

设置单个玩家的聊天样式

执行:/chat style set prefix + %message% + suffix

允许玩家使用 <blue> 标签

执行:/lp group default permission set fuji.style.chat.blue

允许玩家使用 <b> 标签

执行:/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

14. chat.trigger — 聊天触发命令

原文:https://fuji-fabric.github.io/Modules/chat.trigger

模块说明

本模块允许在聊天中定义能够 执行命令 的 魔法咒语。

提示:用 chat.trigger 创建 聊天命令

chat.replace 中的 正则 用于在 给定字符串 中 查找 目标模式。

chat.trigger 中的 正则 用于把目标模式与 给定字符串 进行 匹配。

你可以像其他游戏里的 !report、!noclip 那样定义 聊天命令。

示例

◉ 在聊天字符串中定义一个简单的魔法咒语

  • 正则:magic
  • 命令:say magic!

◉ 在聊天字符串中定义带参数的复杂魔法咒语

  • 正则:i am (.+)
  • 命令:
    1. say You just said: $0
    2. say 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"
      ]
    }
  ]
}

15. cleaner — 实体清理

原文:https://fuji-fabric.github.io/Modules/cleaner

模块说明

本模块提供一个 实体清理器。

它监控指定的条件,并 清理 那些 符合已定义规则 的实体。

注意

◉ 原版 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 的 物品实体。

◉ 定义 匹配器 来清理 生物实体

要启用对生物实体的清理:

  1. 把 ignore_living_entity 设为 false。
  2. 为目标实体定义 匹配器,例如: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

16. color — 样式标签

原文:https://fuji-fabric.github.io/Modules/color

模块说明

本模块在一些 地方 引入 样式标签。

配置

⚠️ 以下 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>"
      }
    ]
  }
}

17. color.anvil — 铁砧中的样式标签

原文:https://fuji-fabric.github.io/Modules/color.anvil

模块说明

本模块在 铁砧方块 中引入 样式标签。

配置

⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。

文件:config/fuji/modules/color/anvil/config.json

{
  /* 默认情况下,任何玩家都可以使用 `所有样式标签`。
  启用该选项后,玩家需要拥有 `对应权限` 才能使用该 `样式标签`。
  
  例如,使用 `<red>` 标签需要 `fuji.style.anvil.red` 权限。 */
  "requires_corresponding_permission_to_use_style_tag": false
}

18. color.sign — 告示牌中的样式标签

原文:https://fuji-fabric.github.io/Modules/color.sign

模块说明

本模块在 告示牌方块 中引入 样式标签。

提示

◉ 你可以在告示牌上书写 样式标签

例如:<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
}

19. command_advice — 命令装饰(advice)

原文:https://fuji-fabric.github.io/Modules/command_advice

模块说明

本模块允许你用指定的 命令 来 装饰 一个已存在的 目标命令。

命令装饰(command advice)是 目标命令 的 修饰器。

它可以借助 命令 来 修改 已存在 目标命令 的 效果,而无需改动目标命令原本的 定义。

各 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 命令的示例:

  1. 使用 CANCEL_IF_ANY_SUCCESS advice 类型来检查 条件。
  2. 使用 ON_EXECUTION_CANCELLED advice 类型,在条件不满足时给用户发送 反馈。
  3. 使用 ON_EXECUTION_SUCCESS advice 类型,为目标命令的执行扣除 代价。

配置

⚠️ 以下 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."
      ]
    }
  ]
}

20. command_alias — 命令别名

原文:https://fuji-fabric.github.io/Modules/command_alias

模块说明

本模块允许为 一个已存在的目标命令 定义 别名。

定义出的 别名命令 会重定向到对应的已存在命令节点。

提示

command_alias 命令只能定义 一条新命令 作为 已有命令 的别名。

它通过 命令重定向 实现。

你无法用 command_alias 模块真正定义 一条带参数的新命令,这是它的短板。

如果你想定义 带参数的新命令,请参考 command_bundle 模块。

简而言之:

  1. 想定义 不带参数的简单命令,用 command_alias 模块。
  2. 想定义 带参数的复杂命令,用 command_bundle 模块。

示例

◉ 定义 新的快捷命令 作为 已有命令 的别名

例如:

  1. 定义一条新 /r 命令,作为 /reply 命令的别名。
  2. 定义一条新 /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

21. command_attachment — 命令附着

原文:https://fuji-fabric.github.io/Modules/command_attachment

模块说明

本模块允许把命令 附着 到各种 对象 上:

  • 物品堆
  • 方块
  • 实体
  • ...

工作方式

当你把命令附着到一个物品上时,我们会在该物品的 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_cooldown 模块创建一个 命名冷却。

命名冷却 可以限制指定命令的 使用间隔 与 使用次数。

然后用 command_attachment 模块把 命名冷却测试命令 附着到 物品 上。

示例

◉ 制作一根魔法棒,点击时治疗玩家

执行 /command-attachment attach-item-one heal

◉ 制作一根魔法棒,效果为:

  1. 左键点击时给予钻石 × 1。(限制使用 3 次)
  2. 右键点击时给予金锭 × 1。(限制使用 5 次)

执行以下命令:

  1. /command-attachment attach-item-one --maxUseTimes 3 --interactType LEFT_CLICK give %player:name% minecraft:diamond 1
  2. /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]

22. command_bundle — 自定义命令(bundle / 模板命令)

原文:https://fuji-fabric.github.io/Modules/command_bundle

模块说明

本模块允许 创建 一条新命令(称为 bundle 命令 或 模板命令)。

这条新命令由已存在的命令组合而成。

它可以接受 用户自定义参数 与 占位符。

本模块可以当作一套通用的 命令模板 系统来使用。

本模块的特性

  1. 提供用户友好的 DSL,便于轻松创建 新的自定义命令。
  2. 支持 用户自定义变量、占位符 以及 原版目标选择器。
  3. 支持复杂的 参数类型:必填参数、字面量参数,甚至 带指定默认值的可选参数。
  4. 强大的 类型系统,可使用内置的 参数类型。
  5. 无需重启服务器即可动态注册与注销 自定义命令。

如何创建一条新命令

要创建一条新命令,你需要指定以下内容:

  1. 命令的 head(头部):描述你的 新命令 长什么样。
  2. 命令的 body(主体):描述你的 新命令 被执行时应该执行哪些 命令。

如何为新命令编写 head 组件

head 由 命令节点 组成。

例如,head 实例 first second third 描述了一条命令 /first second third。

它由三个 命令节点 组成,全部都是 字面量参数。

参数 有 3 种类型:

  1. 字面量参数(Literal Argument):可以直接写出来。例如 first、second、third 和 claim-kit 都是字面量参数。
  2. 必填参数(Required Argument):语法为 <参数类型 参数名>。例如 <int age> 描述一个 必填参数,其 参数类型为 int、参数名为 age。
  3. 可选参数(Optional Argument):语法为 [参数类型 参数名 默认值]。它类似 必填参数,但当 命令来源 未指定该参数时,你可以提供一个 默认值。

你可以在 body 组件中 引用 必填参数 或 可选参数 的值。

例如,写下 $age 即可引用 head 组件中名为 age 的 变量。

◉ head 组件使用的是什么 类型系统?

本模组会为特定的 参数类型 注册一个 参数类型适配器。

你可以执行 /fuji inspect argument-types 列出所有已注册的 适配器。

该界面中列出的任何 参数类型 你都可以使用。

如何为新命令编写 body 组件

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 命令。

装饰内容为:

  1. 在 /heal 命令执行前 say。
  2. 在 /heal 命令执行前生成 爱心粒子。
  3. 在 /heal 命令执行后 say。

Head:composite-heal

Body:

  1. say before heal %player:name%
  2. run as fake-op %player:name% particle minecraft:heart ~ ~2 ~
  3. run as player %player:name% heal
  4. say after heal %player:name%

◉ 把 bundle 命令 当作模板命令使用

在本例中,我们要注册一条新命令 /warn,作为某个具体命令实例的 模板。

Head:warn <player player-arg> <greedy greedy-arg>

Body:

  1. send-message $player-arg <red>You are warned: $greedy-arg

◉ 用 bundle 命令 包装一个具体的命令实例

在本例中,假设你想允许玩家使用 /give @s minecraft:apple。

你只想允许玩家获得免费的 苹果,而不希望让玩家随意使用 /give 命令。

那么,你可以定义一条类似 /free-apple 的 bundle 命令,来 包装 /give 命令的某个具体实例。

Head:free-apple

Body:

  1. 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:

  1. 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

23. command_cooldown — 命令冷却

原文:https://fuji-fabric.github.io/Modules/command_cooldown

模块说明

本模块允许为命令执行定义 冷却。

注意:冷却 有 2 种类型

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。

该命令会 检测 指定的 命名冷却:

  1. 如果结果是 成功情形,它会执行 /say Used successfully once。
  2. 如果结果是 失败情形,它什么都不做。

执行:/command-cooldown test kitfood Alice --onFailed "say false" say true

该命令会 检测 指定的 命名冷却:

  1. 如果结果是 成功情形,它会执行 /say true。
  2. 如果结果是 失败情形,它会执行 /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]

24. command_debug — 命令调试

原文:https://fuji-fabric.github.io/Modules/command_debug

模块说明

本模块为命令执行提供调试工具。

示例

◉ 执行指定命令并查看调试信息

执行 /command-debug has-exp? Alice 100

命令

命令语法 说明 控制台可执行 所需权限等级
/command-debug <GreedyCommandString command> (原文未提供说明) 是 4

25. command_event — 事件触发命令

原文:https://fuji-fabric.github.io/Modules/command_event

模块说明

本模块允许定义 命令 来响应目标 事件。

当关心的事件发生时,指定命令会作为响应被执行。

工作方式

当关心的事件发生时,本模块会以控制台身份为该事件执行指定命令。

该 事件 中的 上下文玩家 会被用作 占位符上下文,用于解析 命令字符串 中的 占位符。

示例

◉ 玩家加入时发送消息

你可以用 /send-custom 或 /send-message 在玩家加入时发送消息。

◉ 执行命令欢迎新玩家

你可以使用玩家首次加入事件。

例如:

  1. send-broadcast <light_purple>Welcome new player %player:name% to join us!
  2. kit give %player:name% <kit-name>
  3. send-custom as-message %player:name% new-player-guide
  4. run as fake-op %player:name% rtp
  5. delay 10 spawnpoint %player:name%

◉ 把死亡的玩家传送到指定位置

你可以使用玩家死亡事件。

  1. 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."
      ]
    }
  }
}

26. command_interactive — 交互式告示牌

原文:https://fuji-fabric.github.io/Modules/command_interactive

模块说明

本模块允许在 告示牌方块 上 书写 命令,之后通过 点击 告示牌来执行。

工作方式

如果玩家 右键点击 一个 告示牌方块。

我们会检查 正面文本 中是否包含 / 字符。

如果包含,我们就视为该玩家发出了该命令。

提示

包含 / 字符的 告示牌方块 被称为 交互式告示牌方块。

你可以用 右键点击 来执行交互式告示牌上写下的命令。

你可以用 Shift + 右键点击 来编辑 交互式告示牌方块。

提示

你可以在第一个 / 字符之前写一些注释文本。

4 行内容会被拼接起来,当作一整行长文本处理。

所以要小心 空格字符,并忽略 换行符。


27. command_menu — 菜单 GUI

原文:https://fuji-fabric.github.io/Modules/command_menu

模块说明

本模块允许定义可执行命令的 菜单 GUI。

menu 与 slot 的定义

菜单 是一个虚拟的 容器 GUI。

虚拟 GUI 由 槽位 组成。

槽位 用于放置一个 物品堆。

GUI 的 最小尺寸 为 9 x 1 = 9 个槽位。

GUI 的 最大尺寸 为 9 x 6 = 54 个槽位。

简而言之,你可以定义一个 菜单 来容纳 槽位,并把 命令 绑定到这些 槽位 上。

用内置 事件 打开 GUI

command_menu 模块提供一个名为 onSneakingAndSwapHandsEvent 的事件。

当玩家按下 SHIFT + F 键时它会触发。

你可以在配置文件中配置该事件。

用 command_bundle 创建命令来打开 GUI

/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 版本的数据格式可能不同。

  1. /give @s minecraft:player_head[minecraft:profile=Steve]
  2. /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]

28. command_meta — 命令元指令(系列入口)

原文:https://fuji-fabric.github.io/Modules/command_meta

该页是 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 项。


29. command_meta.AND — 逻辑与

原文:https://fuji-fabric.github.io/Modules/command_meta.AND

模块说明

提供 /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]

30. command_meta.IF — 条件判断

原文:https://fuji-fabric.github.io/Modules/command_meta.IF

模块说明

本模块提供一个简单的 /IF 命令。

它可以用来表达 条件逻辑,例如 IF ... THEN ... ELSE ...。

工作方式

/IF 命令的语法为:/IF <条件命令> THEN <then 命令> ELSE <else 命令>

IF、THEN、ELSE 这三个字面量必须 首字母大写。

该命令的执行流程如下:

  1. 开始执行给定的 /IF 命令实例。
  2. 检查给定 /IF 命令实例是否存在可能的 歧义。 2.a. 如果 没有歧义,进入步骤 3.。 2.b. 如果 存在歧义,则中止整个 /IF 命令的执行。
  3. 执行 条件命令,并获取其 返回值: 3.a. 如果 返回值为 true,则执行 then 命令。 3.b. 如果 返回值为 false,则执行 else 命令。

◉ 任何 失败 都会导致执行 else 命令

如果 条件命令 的 执行 期间发生任何 错误,else 命令 都会被执行。

例如,/IF bad command THEN say true ELSE say false 命令会做以下事情:

  1. 首先执行 /bad command。
  2. 由于 /bad command 执行期间出现 错误,/say false 命令会被执行。

◉ 不支持 递归 IF

/IF 命令是一个足够 简单 的命令,只提供非常基础的 条件表达式。

不支持 嵌套 IF。

一旦在 /IF 命令中发现 歧义,整个 /IF 命令的执行就会被中止。

/IF 命令与 /execute if 命令的区别

/execute if 命令是一个强大的命令:

  1. 可以使用 递归 if。例如:/execute if <第一个条件> if <第二个条件>
  2. 可以使用大量 原版 Minecraft 判定器。例如:/execute if {block|biome|loaded|dimension|score|blocks|entity|predicate|function|items|data}
  3. 可以结合 /execute if 与 /execute unless 命令来 模拟 else 子句。

◉ /IF 命令的 目的 是什么?

  1. 它允许你把 任意命令 用作 条件,依据该命令的 返回值 来判定。
  2. 它避免了 条件子句 与 then 命令 产生 副作用。(无需借助 /tag 或 /scoreboard)
  3. 它提供了一种简单、内联的方式来表达 IF ... THEN ... ELSE ... 逻辑。
  4. 它支持 占位符。
  5. 你仍然可以把 /execute if 命令用作 /IF 命令的 条件命令。

用 /command-debug 命令查看某条命令的 返回值

返回值 不会在游戏内显式显示。

不过,你可以用 /command-debug 命令查看指定命令的 返回值。

执行:

  1. /command-debug execute if block ~ ~-1 ~ minecraft:diamond_block
  2. /command-debug execute if block ~ ~-1 ~ minecraft:diamond_block if entity @s[nbt={Inventory:[{id:"minecraft:diamond"}]}]

◉ /execute if 命令的行为

  1. 当 没有任何条件为 true 时,它会抛出 Test failed 异常。
  2. 当 指定条件之一为 true 时,它返回 0,表示 部分成功。
  3. 当 所有指定条件都为 true 时,它返回 正整数,表示 成功。

注意:如果 /execute if 命令发生 分支,该 正整数 等于 成功分支的数量。

例如,如果服务器有 3 名玩家在线,但只有 2 名玩家站在 minecraft:diamond_block 方块上。

执行:/command-debug execute at @a if block ~ ~-1 ~ minecraft:diamond_block

作为该 /execute ... 命令实例的 返回值,你会得到整数 2。

有用的命令参考

  1. https://minecraft.fandom.com/wiki/Commands/execute
  2. https://minecraft.wiki/w/Commands/return
  3. https://minecraft.fandom.com/wiki/Commands/scoreboard
  4. https://minecraft.fandom.com/wiki/Commands/tag
  5. https://minecraft.fandom.com/wiki/Commands/data

便捷地书写 IF ... THEN ... ELSE ... 逻辑

你可以使用 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 命令 才会被执行:

  1. 玩家站在 minecraft:diamond_block 方块上。
  2. 玩家背包中有 minecraft:diamond 物品。

◉ 用判定条件筛选所有在线玩家

你可以把 /IF 与 /foreach 命令结合使用。

  1. /foreach IF <判定命令> THEN ... ELSE ...
  2. /foreach IF has-item? %player:name% minecraft:apple 1 THEN say Player %player:name% has an apple. ELSE nop
  3. /foreach IF is-in-world? %player:name% minecraft:overworld THEN say Player %player:name% is in overworld. ELSE nop

◉ 借助原版 Minecraft 的 /tag 命令存储状态

示例:

  1. /tag Steve add killed_the_dragon
  2. /execute if entity @a[tag=killed_the_dragon]

◉ 借助原版 Minecraft 的 /scoreboard 命令存储状态

它类似 /tag 命令,但更高级。

命令

命令语法 说明 控制台可执行 所需权限等级
/IF <IfGreedyCommandString rest> (原文未提供说明) 是 4

参数类型

参数类型 对应类
[if-greedy-command-string] [IfGreedyCommandString]

31. command_meta.NOT — 逻辑非

原文:https://fuji-fabric.github.io/Modules/command_meta.NOT

模块说明

提供 /NOT <命令> 命令。

用于执行指定命令,并把 SUCCESS 与 FAILURE 的返回值 反转。

工作方式

  1. 以当前命令来源执行 目标命令,获取 命令返回值。 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

32. command_meta.OR — 逻辑或

原文:https://fuji-fabric.github.io/Modules/command_meta.OR

模块说明

提供 /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]

33. command_meta.attachment — 通用数据附着

原文: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]

34. command_meta.chain — 命令串联

原文:https://fuji-fabric.github.io/Modules/command_meta.chain

模块说明

本模块提供 /chain 命令,用于顺序执行 两条命令:

  1. 第一条命令,是 任意命令。(必需)
  2. 第二条命令,是 /chain 命令。(可选)

/chain 命令的用途是什么?

它的典型用法是把两条命令 压缩 成一条命令。

这样你就能在某些位置放入 多于 1 条命令。

例如:/execute run chain say 1 chain say 2

原版 Minecraft 命令的 返回值

在原版 Minecraft 中,命令的 返回值 是一个 整数。

如果整数 <= 0,则该 命令执行 被视为 失败。

如果整数 > 0,则该 命令执行 被视为 成功。

事实上,可以依据命令执行的 返回值 判断该次执行是否成功。

/chain 命令是如何工作的?

/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]

35. command_meta.delay — 延迟执行

原文:https://fuji-fabric.github.io/Modules/command_meta.delay

模块说明

本模块提供 /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

36. command_meta.for_each — 遍历在线玩家

原文:https://fuji-fabric.github.io/Modules/command_meta.for_each

模块说明

本模块提供 /foreach 命令。

它允许把通常只针对单个玩家的命令 应用到每个 在线玩家上。

示例

◉ 向在线玩家问好

执行:/foreach say hello %player:name%

命令

命令语法 说明 控制台可执行 所需权限等级
/foreach <GreedyCommandString rest> 对每个在线玩家各执行一次该单玩家命令。 是 4

37. command_meta.json — JSON 文件编辑

原文:https://fuji-fabric.github.io/Modules/command_meta.json

模块说明

提供 /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]

38. command_meta.nop — 空操作

原文:https://fuji-fabric.github.io/Modules/command_meta.nop

模块说明

本模块提供 /nop 命令。

它是一条 什么都不做 的命令,直接返回 SUCCESS 作为返回值。

它可以用来占住 需要一条命令 的位置。

命令

命令语法 说明 控制台可执行 所需权限等级
/nop 什么都不做,直接返回 SUCCESS 作为命令返回值。 是 4

39. command_meta.one_of — 随机选择一条命令

原文: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]

40. command_meta.run — 切换命令上下文执行

原文:https://fuji-fabric.github.io/Modules/command_meta.run

模块说明

提供 /run 命令,用于在指定上下文中运行命令。

警告:小心使用原版 Minecraft 的 目标选择器

原版 Minecraft 的 目标选择器 有:@a、@e、@n、@p、@r 和 @s。

它们用于为 Player 参数类型和 Entity 参数类型选择取值:

  1. /give @a minecraft:apple 中的 @a 会 选择 所有在线玩家。(Player 参数)
  2. /kill @e 中的 @e 会 选择 所有实体。(Entity 参数)

请记住,目标选择器 只能用于选择特定的 参数类型,例如 Player 和 Entity。

然而,%player:name% 是一个 占位符,它总会被替换为 上下文玩家。

如果你想指定 上下文玩家 的名字,应该使用 占位符,因为它总是有效。

例如:

  1. /run as console say I am @s 会说 I am @s
  2. /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 与 /execute 命令有什么区别?

  1. /run 命令的主要目的是在执行 命令 实例时 修改命令上下文。
  2. /run 命令会解析 %player:name% 这类 占位符。(当然你仍然可以使用原版目标选择器,但不推荐)
  3. /run as {player/fake-op/console} 让你方便地切换 命令来源 的 角色。

◉ 命令 是在 命令上下文 中执行的

在 Minecraft 内部,当你把 命令 提交给 命令执行器 时,需要提供 命令上下文。

命令上下文 包含这些重要信息:

  1. 命令来源
  2. 命令参数的值
  3. 执行所在的维度
  4. 执行位置
  5. 执行权限等级

以及其他信息。

◉ /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

41. command_meta.shell — 执行宿主机命令(危险)

原文:https://fuji-fabric.github.io/Modules/command_meta.shell

模块说明

提供 /shell 命令。

用于在 宿主机 shell 中执行 命令行。

一个 强大 而 危险 的模块。

☠️ 危险

◉ 这是一个 危险 的模块

本模块是一个强大而危险的模块,不建议启用。

示例

◉ 使用占位符创建文件

执行:/shell touch %player:name%.dangerous

◉ 在宿主机上执行程序

执行:/shell emacs

◉ 调用宿主机上的程序备份服务器

你需要把 shell 模块与 command_scheduler 模块结合使用。

并配置好 外部备份程序。

详见 https://rdiff-backup.net/

◉ 从互联网下载病毒并执行

执行:/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

42. command_meta.when_online — 玩家上线时执行

原文:https://fuji-fabric.github.io/Modules/command_meta.when_online

模块说明

本模块提供 /when-online <player> <cmd> 命令。

用于在目标玩家 在线 时 恰好执行一次 指定命令:

  1. 如果目标玩家现在 在线,命令会 立刻 执行。
  2. 如果目标玩家现在 离线,命令会在 该玩家上线时 执行。

此外,你可以用 /when-online list 管理 已提交的命令。

例如:

  1. /when-online Steve give %player:name% minecraft:apple 3
  2. /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

43. command_permission — 命令权限(LuckPerms)

原文:https://fuji-fabric.github.io/Modules/command_permission

模块说明

本模块为 所有命令 提供 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 如何处理 继承权限、通配权限 与 正则权限?

实际上,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 除外

执行以下命令:

  1. /lp group default permission set fuji.permission.gamemode true
  2. /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

44. command_rewrite — 命令重写

原文:https://fuji-fabric.github.io/Modules/command_rewrite

模块说明

本模块允许定义 正则 来 重写 玩家 发出 的命令行。

工作方式

  1. 拦截 已发出的命令字符串 网络包。
  2. 按自上而下的顺序把已定义的重写规则应用到 命令字符串 上。

注意:command_rewrite 发生在命令生命周期的最开始。

在这个阶段你不会收到 命令补全建议 或 命令异常。

重写规则直接作用于原始命令字符串。

◉ 命令生命周期

  1. 发出(Issuing) – 命令以 原始字符串 形式发出。此阶段没有命令补全建议或异常。
  2. 解析(Parsing) – 命令字符串被解析为 命令节点。此时可以提供命令补全建议和异常。
  3. 执行(Execution) – 与命令节点关联的 动作 被 执行,产生命令预期的 效果。

与 command_alias、command_bundle 模块的区别

  1. command alias 模块允许你定义 新命令,并把它重定向到 已有命令。
  2. command bundle 模块允许你定义 新命令,并定义新命令的参数与主体。
  3. command rewrite 模块不定义任何新命令。它只在 网络包 层面工作,修改来自命令来源玩家 发出的命令字符串。

提示

◉ 你可以用本模块缩短命令字符串

例如,把命令字符串 /home 重写为 /home tp default。

从而为 /home tp default 命令提供一个快捷方式。

配置

⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。

文件:config/fuji/modules/command_rewrite/config.json

{
  /* 已定义的 `重写` 条目。 */
  "rules": [
    {
      /* 用于匹配 `目标字符串` 的 `模式字符串`。 */
      "regex": "\\?"
      /* 用于替换 `匹配到的目标字符串` 的 `替换字符串`。 */,
      "replacement": "help"
    }
  ]
}

45. command_scheduler — 定时执行命令

原文:https://fuji-fabric.github.io/Modules/command_scheduler

模块说明

本模块允许按 计划 执行命令。

它的典型用途是按计划执行 广播命令。

不过,它也可以用来执行任意指定命令。

工作方式

  1. 定义一个 任务,用于按计划执行 命令。 1.a. 计划 使用 cron 表达式 语言表达。 1.b. 你可以为一个 任务 指定多个 cron 表达式。 1.c. 只要任一 cron 表达式 匹配,任务 就会被 触发。
  2. 任务 会依据其 cron 表达式 自动 触发。
  3. 当 任务 被 触发 时,它会执行: 3.a. 如果 enable 属性为 false,则什么都不做。 3.b. 如果 剩余执行次数 属性 <= 0,则什么都不做。 3.c. 否则,把 剩余执行次数 属性减 1,并随机挑选一个 命令组 执行。
  4. 你可以用 /command-scheduler trigger <job> 手动 触发 一个 任务。

提示

◉ 你可以使用 cron 表达式 生成器来指定 任务 的 触发 时机

参见:

  1. https://www.freeformatter.com/cron-expression-generator-quartz.html
  2. https://crontab.cronhub.io/
  3. 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]

46. command_spy — 命令监听

原文:https://fuji-fabric.github.io/Modules/command_spy

模块说明

本模块允许 监听 命令执行。

工作方式

  1. 按自上而下的顺序匹配已定义的 规则。
  2. 找到 第一条匹配的规则。
  3. 如果存在,则应用 第一条匹配的规则。

配置

⚠️ 以下 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
      }
    }
  ]
}

47. command_state — 状态

原文:https://fuji-fabric.github.io/Modules/command_state

模块说明

本模块允许用 判定命令 定义一个 状态。

使用定义好的 状态,你可以:

  • 定义玩家 进入 或 离开 该 状态 时执行的命令。
  • 检查玩家当前是否处于该 状态。
  • 显示与该 状态 相关的 占位符。

提示

◉ 用 判定命令 定义 状态

一个 状态 由 判定命令 组成。

你可以定义一个名为 has-iron-and-gold 的 状态,其 判定命令 为:

  1. has-item? %player:name% minecraft:iron_ingot 16
  2. has-item? %player:name% minecraft:gold_ingot 8

◉ 与 luckperms 的 临时权限 集成

用 /lp group default permission settemp fuji.permission.fly true 10s 分配一个 临时权限。

然后定义一个 状态 来检查玩家是否 拥有指定的临时权限。

该 状态 可命名为 can-use-fly-command,其 判定命令 为:

  1. 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]

48. command_toolbox — 工具命令集

原文:https://fuji-fabric.github.io/Modules/command_toolbox

模块说明

本模块提供一组 工具命令。

这些命令 简单 而 便捷。

其子模块各自提供具体命令,见下方各节。


49. command_toolbox.bed — 回到床

原文:https://fuji-fabric.github.io/Modules/command_toolbox.bed

命令

命令语法 说明 控制台可执行 所需权限等级
/bed 传送到床的位置。 否 0
/bed others <PlayerCollection others> 传送到床的位置。 是 4

50. command_toolbox.burn — 点燃实体

原文:https://fuji-fabric.github.io/Modules/command_toolbox.burn

命令

命令语法 说明 控制台可执行 所需权限等级
/burn <EntityCollection target> <int ticks> 让目标实体燃烧指定刻数。 是 4

51. command_toolbox.compass — 指南针追踪

原文: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

52. command_toolbox.delete — 删除实体

原文:https://fuji-fabric.github.io/Modules/command_toolbox.delete

命令

命令语法 说明 控制台可执行 所需权限等级
/delete <EntityCollection target> 从维度中删除目标实体。 是 4

53. command_toolbox.disconnect — 踢出玩家

原文: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

54. command_toolbox.down — 传送到最低点

原文:https://fuji-fabric.github.io/Modules/command_toolbox.down

命令

命令语法 说明 控制台可执行 所需权限等级
/down 传送到当前位置的最低点。 否 0
/down others <PlayerCollection others> 传送到当前位置的最低点。 是 4

55. command_toolbox.extinguish — 灭火

原文:https://fuji-fabric.github.io/Modules/command_toolbox.extinguish

命令

命令语法 说明 控制台可执行 所需权限等级
/extinguish 把着火刻数设为 0。 否 4
/extinguish others <PlayerCollection others> 把着火刻数设为 0。 是 4

56. command_toolbox.feed — 喂饱

原文:https://fuji-fabric.github.io/Modules/command_toolbox.feed

命令

命令语法 说明 控制台可执行 所需权限等级
/feed 把饥饿值、饱食度与消耗度设为健康状态。 否 4
/feed others <PlayerCollection others> 把饥饿值、饱食度与消耗度设为健康状态。 是 4

57. command_toolbox.fly — 飞行

原文: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

58. command_toolbox.freeze — 冻结实体

原文:https://fuji-fabric.github.io/Modules/command_toolbox.freeze

命令

命令语法 说明 控制台可执行 所需权限等级
/freeze <EntityCollection target> <int ticks> 冻结目标实体指定刻数。 是 4

59. command_toolbox.glow — 发光

原文:https://fuji-fabric.github.io/Modules/command_toolbox.glow

命令

命令语法 说明 控制台可执行 所需权限等级
/glow 切换发光状态。 否 0
/glow <EntityCollection entities> (原文未提供说明) 是 4
/glow others <PlayerCollection others> 切换发光状态。 是 4

60. command_toolbox.god — 无敌

原文: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

61. command_toolbox.hat — 把物品戴在头上

原文:https://fuji-fabric.github.io/Modules/command_toolbox.hat

模块说明

本模块提供 /hat 命令。

它允许玩家把 任意物品 放到 头部装备槽。

命令

命令语法 说明 控制台可执行 所需权限等级
/hat 戴上手中的物品。 否 0
/hat others <PlayerCollection others> 戴上手中的物品。 是 4

62. command_toolbox.heal — 治疗

原文:https://fuji-fabric.github.io/Modules/command_toolbox.heal

命令

命令语法 说明 控制台可执行 所需权限等级
/heal 补满玩家的 生命值 与 饥饿值。 否 4
/heal others <PlayerCollection others> 补满玩家的 生命值 与 饥饿值。 是 4

63. command_toolbox.help_op — 向 OP 求助

原文:https://fuji-fabric.github.io/Modules/command_toolbox.help_op

命令

命令语法 说明 控制台可执行 所需权限等级
/help-op <GreedyString message> 向在线 OP 发送求助消息。 否 0

64. command_toolbox.itemname — 物品名

原文:https://fuji-fabric.github.io/Modules/command_toolbox.itemname

命令

命令语法 说明 控制台可执行 所需权限等级
/itemname reset (原文未提供说明) 否 4
/itemname set <GreedyString name> (原文未提供说明) 否 4

65. command_toolbox.jump — 跳跃传送

原文:https://fuji-fabric.github.io/Modules/command_toolbox.jump

命令

命令语法 说明 控制台可执行 所需权限等级
/jump [Integer distance] 跳跃到视线所及的位置。 否 4
/jump others <PlayerCollection others> [Integer distance] 跳跃到视线所及的位置。 是 4

66. command_toolbox.lore — 物品 lore

原文: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

67. command_toolbox.more — 补满数量

原文:https://fuji-fabric.github.io/Modules/command_toolbox.more

命令

命令语法 说明 控制台可执行 所需权限等级
/more [Boolean oversize] 把手中物品的数量设为最大堆叠数。 是 4

68. command_toolbox.near — 附近的玩家

原文:https://fuji-fabric.github.io/Modules/command_toolbox.near

命令

命令语法 说明 控制台可执行 所需权限等级
/near [Integer distance] 列出附近的玩家。 否 4

69. command_toolbox.nickname — 昵称

原文: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

70. command_toolbox.ping — 查询延迟

原文:https://fuji-fabric.github.io/Modules/command_toolbox.ping

命令

命令语法 说明 控制台可执行 所需权限等级
/ping <ServerPlayer target> 查询玩家的延迟。 是 4

71. command_toolbox.realname — 查询真实名

原文:https://fuji-fabric.github.io/Modules/command_toolbox.realname

命令

命令语法 说明 控制台可执行 所需权限等级
/realname 查询昵称与真实名的映射关系。 是 0

72. command_toolbox.repair — 修复物品

原文:https://fuji-fabric.github.io/Modules/command_toolbox.repair

命令

命令语法 说明 控制台可执行 所需权限等级
/repair 修复手中的物品。 否 4
/repair others <PlayerCollection others> 修复手中的物品。 是 4

73. command_toolbox.reply — 回复私聊

原文: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

74. command_toolbox.rules — 服务器规则

原文: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

75. command_toolbox.seen — 最后在线时间

原文:https://fuji-fabric.github.io/Modules/command_toolbox.seen

配置

⚠️ 以下 JSON 内容仅供参照。 它并非合法的 JSON 语法,不可直接复制到配置目录中。

文件:config/fuji/modules/command_toolbox/seen/seen.json

{
  "player2seen": {}
}

命令

命令语法 说明 控制台可执行 所需权限等级
/seen <OfflinePlayerName playerName> 查询玩家最后在线时间。 是 4

76. command_toolbox.speed — 移动速度

原文: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

77. command_toolbox.suicide — 自杀

原文:https://fuji-fabric.github.io/Modules/command_toolbox.suicide

命令

命令语法 说明 控制台可执行 所需权限等级
/suicide 杀死自己。 否 0

78. command_toolbox.top — 传送到最高点

原文:https://fuji-fabric.github.io/Modules/command_toolbox.top

命令

命令语法 说明 控制台可执行 所需权限等级
/top 传送到当前位置的最高点。 否 0
/top others <PlayerCollection others> 传送到当前位置的最高点。 是 4

79. command_toolbox.tphere — 把他人传送到自己身边

原文:https://fuji-fabric.github.io/Modules/command_toolbox.tphere

模块说明

这是一个便捷命令,用于把 他人 传送到 你身边。

类似于 /tp @a <player>。

例如:

  1. /tphere Steve 把 Steve 传送到 你身边。
  2. /tphere @a 把 所有在线玩家 传送到 你身边。

命令

命令语法 说明 控制台可执行 所需权限等级
/tphere <PlayerCollection targets> (原文未提供说明) 否 4

80. command_toolbox.tppos — 统一传送命令

原文: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

81. command_toolbox.trashcan — 垃圾桶

原文:https://fuji-fabric.github.io/Modules/command_toolbox.trashcan

命令

命令语法 说明 控制台可执行 所需权限等级
/trashcan 打开一个垃圾桶 GUI。 否 0
/trashcan others <PlayerCollection others> 打开一个垃圾桶 GUI。 是 4

82. command_toolbox.warp — 传送点

原文: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]

83. command_warmup — 命令预热

原文:https://fuji-fabric.github.io/Modules/command_warmup

模块说明

本模块允许在命令执行前定义 冷却(预热等待)。

注意

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
      }
    }
  ]
}

84. deathlog — 死亡记录

原文:https://fuji-fabric.github.io/Modules/deathlog

模块说明

本模块在玩家死亡时,把其背包保存为 死亡记录。

命令

命令语法 说明 控制台可执行 所需权限等级
/deathlog 打开 deathlog GUI。 否 4

85. disabler — 检测禁用器(系列入口)

原文:https://fuji-fabric.github.io/Modules/disabler

该页是 disabler 系列的入口,原文未提供额外内容。其子模块分别用于关闭服务端的各类检测,见下方各节。


86. disabler.chat_speed_disabler — 禁用刷屏检测

原文:https://fuji-fabric.github.io/Modules/disabler.chat_speed_disabler

模块说明

本模块禁用 Kicked for spamming(因刷屏被踢出)检测。


87. disabler.max_player_disabler — 禁用人数上限

原文:https://fuji-fabric.github.io/Modules/disabler.max_player_disabler

模块说明

本模块禁用服务端的 最大玩家数量限制。


88. disabler.move_speed_disabler — 禁用移动过快检测

原文:https://fuji-fabric.github.io/Modules/disabler.move_speed_disabler

模块说明

本模块禁用 player moved too quickly 与 vehicle moved too quickly 检测。


89. disabler.move_wrongly_disabler — 禁用错误移动检测

原文:https://fuji-fabric.github.io/Modules/disabler.move_wrongly_disabler

模块说明

本模块禁用 player moved wrongly 与 vehicle moved wrongly 检测。

警告

在原版 Minecraft 服务端中,有一个检测玩家移动是否正确的检查器。

不过,该检查器经常误判。

并且会强制把玩家拉回原位,让客户端感觉游戏有卡顿。


90. doctor — 崩溃分析

原文:https://fuji-fabric.github.io/Modules/doctor

模块说明

本模块在 服务器崩溃 时提供 服务端崩溃分析器。


91. document — 文档生成

原文:https://fuji-fabric.github.io/Modules/document

模块说明

本模块提供 构建文档文件 的工具。

注意:本模块通常由开发者用于生成用户手册。

命令

命令语法 说明 控制台可执行 所需权限等级
/document build (原文未提供说明) 是 4

92. echo — 消息发送(系列入口)

原文:https://fuji-fabric.github.io/Modules/echo

模块说明

本模块提供一组 echo 命令。

echo 命令 会把 文本 显示在客户端的某个特定 位置。

具体命令由各子模块提供,见下方各节。


93. echo.send_actionbar — 发送动作栏消息

原文: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

94. echo.send_bossbar — 发送 Boss 血条

原文:https://fuji-fabric.github.io/Modules/echo.send_bossbar

模块说明

本模块提供 /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

95. echo.send_broadcast — 发送广播

原文:https://fuji-fabric.github.io/Modules/echo.send_broadcast

模块说明

本模块提供 /send-broadcast 命令。

用于把 文本 作为 消息 发送给 所有在线玩家。

命令

命令语法 说明 控制台可执行 所需权限等级
/send-broadcast <GreedyString rest> (原文未提供说明) 是 4

96. echo.send_chat — 以玩家身份发送聊天消息

原文:https://fuji-fabric.github.io/Modules/echo.send_chat

模块说明

本模块提供 /send-chat 命令。

用于以某个玩家的身份发送 聊天消息。

示例

◉ 以玩家身份发送聊天消息

执行:/send-chat Steve i am steve.

◉ 为每个在线玩家各发送一条以该玩家身份的消息

执行:/foreach send-chat %player:name% i am %player:name%

命令

命令语法 说明 控制台可执行 所需权限等级
/send-chat <ServerPlayer player> <GreedyString message> (原文未提供说明) 是 4

97. echo.send_console — 发送到控制台

原文:https://fuji-fabric.github.io/Modules/echo.send_console

模块说明

本模块提供 /send-console 命令。

用于把字符串发送到 控制台。

示例

◉ 向控制台发送一个字符串

执行:/send-console Hello World

◉ 把某个动作记录到控制台

你可以与其他模块集成,来 记录特定动作。

效果类似:/run as console send-console Player %player:name% joins the server.

命令

命令语法 说明 控制台可执行 所需权限等级
/send-console <GreedyString message> (原文未提供说明) 是 4

98. echo.send_custom — 发送自定义文本

原文:https://fuji-fabric.github.io/Modules/echo.send_custom

模块说明

本模块提供 /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]

99. echo.send_dialog — 发送对话框

原文:https://fuji-fabric.github.io/Modules/echo.send_dialog

模块说明

使用 对话框 GUI 发送 文本。

例如:

  1. /send-dialog Steve <blue>Hello
  2. /send-dialog Steve --noButtonSlotIndex -1 <green>Confirm me.
  3. /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

100. echo.send_message — 发送消息

原文:https://fuji-fabric.github.io/Modules/echo.send_message

模块说明

本模块提供 /send-message 命令。

用于把 文本 作为 消息 发送给指定玩家。

示例

◉ 向玩家问好

执行:/send-message Alice <blue>Hello %player:name%

命令

命令语法 说明 控制台可执行 所需权限等级
/send-message <ServerPlayer player> <GreedyString rest> (原文未提供说明) 是 4

101. echo.send_title — 发送标题

原文:https://fuji-fabric.github.io/Modules/echo.send_title

模块说明

本模块提供 /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

102. echo.send_toast — 发送提示浮窗

原文:https://fuji-fabric.github.io/Modules/echo.send_toast

模块说明

本模块提供 /send-toast 命令。

用于把 文本 作为 toast(提示浮窗)发送给指定玩家。

提示

你可以发送带自定义图标的 toast。

其语法与 /give 命令相同。

例如:

  1. /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]

103. economy — 经济系统

原文:https://fuji-fabric.github.io/Modules/economy

模块说明

本模块启用 经济玩法。

它允许定义 自定义货币类型。

一个 玩家 可以拥有多个 账户。

每个 账户 持有一种 货币。

提示

◉ 搭建 系统商店 与 玩家商店

你可以把本模块与 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

◉ 为玩家 增加、扣除、设置 或 清空 指定 货币 的 余额

  1. /economy give Steve fuji:gold 100
  2. /economy take Steve fuji:gold 100
  3. /economy set Steve fuji:gold 100
  4. /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]

104. evaluator — Lisp 求值器

原文:https://fuji-fabric.github.io/Modules/evaluator

模块说明

本模块为 Lisp 方言语言 提供一个 求值器。

警告

◉ 本模块目前是实验性模块

未来的版本中可能会发生改动。

命令

命令语法 说明 控制台可执行 所需权限等级
/lisp <GreedyString form> /lisp eval 命令的别名。 是 4
/lisp eval <GreedyString form> 求值一个 lisp 表达式。 是 4

105. fuji — 模组管理命令

原文:https://fuji-fabric.github.io/Modules/fuji

模块说明

提供 /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

106. functional — 功能方块 GUI(系列入口)

原文:https://fuji-fabric.github.io/Modules/functional

模块说明

本模块提供为 功能方块 打开 虚拟 GUI 的命令。

每个子模块对应一种功能方块,见下方各节。所有子命令都以 /xxx(自己)或 /xxx others <players>(他人)两种形式存在,控制台可执行性与所需权限等级分别如下:自己使用需 4 级权限且控制台不可执行,对他人使用需 4 级权限且控制台可执行。


107. functional.anvil — 打开铁砧界面

原文:https://fuji-fabric.github.io/Modules/functional.anvil

命令

命令语法 说明 控制台可执行 所需权限等级
/anvil (原文未提供说明) 否 4
/anvil others <PlayerCollection others> (原文未提供说明) 是 4

108. functional.cartography — 打开制图台界面

原文:https://fuji-fabric.github.io/Modules/functional.cartography

命令

命令语法 说明 控制台可执行 所需权限等级
/cartography (原文未提供说明) 否 4
/cartography others <PlayerCollection others> (原文未提供说明) 是 4

109. functional.enchantment — 打开附魔台界面

原文: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

110. functional.enderchest — 打开末影箱界面

原文:https://fuji-fabric.github.io/Modules/functional.enderchest

命令

命令语法 说明 控制台可执行 所需权限等级
/enderchest (原文未提供说明) 否 4
/enderchest others <PlayerCollection others> (原文未提供说明) 是 4

111. functional.grindstone — 打开砂轮界面

原文:https://fuji-fabric.github.io/Modules/functional.grindstone

命令

命令语法 说明 控制台可执行 所需权限等级
/grindstone (原文未提供说明) 否 4
/grindstone others <PlayerCollection others> (原文未提供说明) 是 4

112. functional.loom — 打开织布机界面

原文:https://fuji-fabric.github.io/Modules/functional.loom

命令

命令语法 说明 控制台可执行 所需权限等级
/loom (原文未提供说明) 否 4
/loom others <PlayerCollection others> (原文未提供说明) 是 4

113. functional.smithing — 打开锻造台界面

原文:https://fuji-fabric.github.io/Modules/functional.smithing

命令

命令语法 说明 控制台可执行 所需权限等级
/smithing (原文未提供说明) 否 4
/smithing others <PlayerCollection others> (原文未提供说明) 是 4

114. functional.stonecutter — 打开切石机界面

原文:https://fuji-fabric.github.io/Modules/functional.stonecutter

命令

命令语法 说明 控制台可执行 所需权限等级
/stonecutter (原文未提供说明) 否 4
/stonecutter others <PlayerCollection others> (原文未提供说明) 是 4

115. functional.workbench — 打开工作台界面

原文:https://fuji-fabric.github.io/Modules/functional.workbench

命令

命令语法 说明 控制台可执行 所需权限等级
/workbench (原文未提供说明) 否 4
/workbench others <PlayerCollection others> (原文未提供说明) 是 4

116. gameplay — 玩法调整(系列入口)

原文:https://fuji-fabric.github.io/Modules/gameplay

该页是 gameplay 系列的入口,原文未提供额外内容。见下方各节。


117. gameplay.multi_obsidian_platform — 多个黑曜石平台

原文: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
}

118. head — 头颅商店

原文:https://fuji-fabric.github.io/Modules/head

模块说明

本模块允许玩家从 头颅商店 购买装饰性头颅。

配置

⚠️ 以下 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

119. home — 家

原文:https://fuji-fabric.github.io/Modules/home

模块说明

本模块允许玩家设置自己的家。

配置

⚠️ 以下 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]

120. jail — 监狱

原文:https://fuji-fabric.github.io/Modules/jail

模块说明

本模块允许定义 监狱。

它可以用来 惩罚 行为不当的玩家,而无需 封禁 他们。

工作方式

  1. 每个 监狱描述符 用于定义一个 监狱 实例。 1.a. 你可以用 /jail create 命令 创建 一个描述符。 1.b. 你可以用 /jail delete 命令 删除 一个描述符。 1.c. 你可以用 /jail list 命令列出所有已创建的描述符。
  2. 每个 监狱 可以容纳 多于 1 个玩家。 2.a. 每个 被关押的玩家 都会记录一条 监狱记录。 2.b. 一个 玩家 同一时间只能被关进一个 监狱。
  3. 每个 监狱 都有一个 位置 属性。 3.a. 当你运行 /jail create 命令时,它会被 初始化 为你的当前位置。 3.b. 你可以用 /jail set-position 命令为它设置新位置。 3.c. 你可以用 /jail tp 命令传送到该位置。
  4. 你可以把 玩家 关进 监狱,或者 释放 出来。 4.a. 要 关进,用 /jail put 命令。 4.b. 要 释放,用 /jail un-put 命令。 4.c. 要查询信息,用 /jail where 命令。

◉ 被封禁的玩家 与 被关押的玩家 的区别

  1. 对于 被封禁的玩家:他们无法 加入 服务器。
  2. 对于 被关押的玩家:他们可以 加入 服务器。

注意:监狱 只用于保存信息。

你需要在 onJailedEvent 与 onUnjailedEvent 中编写 惩罚命令。

你也可以编写 巡逻命令,检查并限制被关押玩家的行为。

关于 监狱 位置 的 占位符

  1. %fuji:jail_dimension%
  2. %fuji:jail_x%
  3. %fuji:jail_y%
  4. %fuji:jail_z%
  5. %fuji:jail_yaw%
  6. %fuji:jail_pitch%

◉ 把 被关押玩家 的 移动 限制在指定区域内

借助 位置占位符,你可以编写 巡逻命令 来限制移动。

你可以定义命令,把被关押玩家的移动限制在指定区域内。

  1. /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%
  2. /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 用户组分配 预热绕过 权限。

这样 被关押玩家 才能被 立即 传送回 监狱位置。

  1. /lp group jailed permission set fuji.teleport_warmup.bypass

注意:要关闭 原版 Minecraft 命令反馈,可以执行:

  1. /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 用户组 分配 负向权限,以限制他们的行为。

执行:

  1. /lp group jailed permission set fuji.anti_build.break_block.override.* false
  2. /lp group jailed permission set fuji.anti_build.place_block.override.* false
  3. /lp group jailed permission set fuji.anti_build.interact_item.override.* false
  4. /lp group jailed permission set fuji.anti_build.interact_entity.override.* false
  5. /lp group jailed permission set fuji.anti_build.interact_block.override.* false

注意:你需要在 luckperms 模组配置中启用 通配符权限 功能。

◉ 限制 被关押玩家 只能使用被允许的命令

你可以与 command_permission 模块集成。

执行:

  1. /lp group jailed permission set fuji.permission.* false

禁止使用 所有命令。

  1. /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

◉ 把玩家关进监狱

执行:

  1. /jail put Steve <jail-id> Steal items.
  2. /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]

121. kit — 礼包

原文:https://fuji-fabric.github.io/Modules/kit

模块说明

本模块允许把一组物品堆制作成一个 礼包,并把礼包分发给玩家。

提示

◉ 为在线玩家自动领取指定礼包

你可以用 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]

122. language — 多语言

原文:https://fuji-fabric.github.io/Modules/language

模块说明

本模块在可能的情况下,尊重 客户端语言选项。

什么是客户端语言?

在 Minecraft 1.20.1 之后,客户端 会把它的 客户端语言选项 发送给 服务端。

所以 服务端 可以在可能的情况下尊重 客户端语言。

有什么区别?

禁用本模块时:fuji 会对所有玩家始终使用 default_language。

启用本模块时:fuji 会尽可能尊重玩家的 客户端语言选项。

也就是说,如果启用本模块,fuji 就会同时支持 多种语言。

fuji 会为不同玩家使用 不同语言。(尊重客户端语言选项)


123. launcher — 弹射实体

原文:https://fuji-fabric.github.io/Modules/launcher

模块说明

把目标 实体 按指定的 方向 与 力度 弹射出去。

提示

◉ 做一个踩上去就把玩家弹起的 弹跳板

你可以与 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

示例

◉ 使用较低 角度 实现 快速水平 移动

  1. /launch facing @s 15 1
  2. /launch facing @s 15 3.9

力度 被限制在 [-3.9, +3.9]。

◉ 使用中等 角度 实现 水平与垂直兼顾 的移动

  1. /launch facing @s 30 3.9
  2. /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

124. leaderboard — 排行榜

原文:https://fuji-fabric.github.io/Modules/leaderboard

模块说明

本模块用于定义 排行榜。

排行榜 的 分数提供者 可以是 占位符、统计数据 或 记分板目标。

排行榜 的 时间窗口 可以是 hourly(每小时)、daily(每天)、weekly(每周)、monthly(每月)、yearly(每年)与 all_time(全部时间)。

你可以用 占位符 或 命令 来展示 排行榜。

工作方式

  1. 你需要在配置文件中定义 排行榜。
  2. 已定义的 排行榜 会在以下时机被 更新: 2.a. 当玩家 加入 或 离开 服务器时,所有排行榜都会被更新。 2.b. 当 Leaderboard Updater Job 被 触发 时,所有排行榜都会被更新。 2.c. 你可以用 /leaderboard update-all 命令手动更新。
  3. 你可以用多种方式 展示 排行榜。 3.a. 你可以用 占位符 展示 排行榜。 3.b. 你可以用 命令 展示 排行榜。

提示

◉ 你可以用 占位符 从 统计数据 取数

例如:

  1. %player:statistic_raw minecraft:deaths%
  2. %player:statistic_raw minecraft:killed minecraft:zombie%

更多 统计数据 参见:https://minecraft.wiki/w/Statistics

◉ 你可以用 占位符 从 记分板目标 取数

例如:%player:objective [objective]%

示例

◉ 如何定义一个 排行榜?

要定义一个 排行榜,你需要指定:

  1. 排行榜 ID:该排行榜的唯一名称。
  2. 分数提供者:一个会被求值为 数值 的字符串。(通常是 占位符)

◉ 什么是 最低第 N 名 与 最高第 N 名

对任何排行榜而言,其所有 分数 都按 自然顺序 排序。

自然顺序 是从 最低 到 最高 的顺序。(例如 0、1、2、3 …)

你可以用 最低占位符 选出 最低第 N 名的分数。

你可以用 最高占位符 选出 最高第 N 名的分数。

例如,你可能想为 死亡榜 选出 最低分,为 僵尸击杀榜 选出 最高分。

  1. %fuji:lowest_n_score death-board 1 all_time%
  2. %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

◉ 给榜首玩家发奖励

执行:

  1. /run as console send-broadcast The greatest zombie killer this week is %fuji:highest_n_name zombie-kill-board 1 weekly%
  2. /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]

125. maintenance — 维护模式

原文:https://fuji-fabric.github.io/Modules/maintenance

模块说明

本模块提供 维护模式,用于在维护期间阻止玩家加入服务器。

配置

⚠️ 以下 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

126. motd — 服务器列表信息

原文:https://fuji-fabric.github.io/Modules/motd

模块说明

自定义服务器的 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."
  }
}

127. multiplier — 数值倍率

原文:https://fuji-fabric.github.io/Modules/multiplier

模块说明

本模块允许你对原版 Minecraft 中的某些 数值 进行 倍率 调整。

目前支持的 数值类型:

  1. damage:玩家受到的伤害。
  2. 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


128. nametag — 头顶名牌

原文:https://fuji-fabric.github.io/Modules/nametag

模块说明

自定义玩家头顶的名牌。

工作方式

  1. 名牌实体 是一种 文本展示实体。
  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

129. placeholder — 额外占位符

原文:https://fuji-fabric.github.io/Modules/placeholder

模块说明

为 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 返回该玩家的 位置。

130. predicate — 判定命令

原文:https://fuji-fabric.github.io/Modules/predicate

模块说明

本模块提供一组 判定命令。

它们可用于测试 条件。

工作方式

判定命令 会返回一个 整数值,表示 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

131. profiler — 服务器健康状态

原文:https://fuji-fabric.github.io/Modules/profiler

模块说明

用于查询服务器健康状态。

包括: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

132. pvp — PvP 管理

原文:https://fuji-fabric.github.io/Modules/pvp

模块说明

为玩家提供 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

133. queue — 排队

原文:https://fuji-fabric.github.io/Modules/queue

模块说明

本模块提供入服排队的自定义。


134. rank — 等级系统

原文:https://fuji-fabric.github.io/Modules/rank

模块说明

本模块提供等级晋升系统。

它允许定义一个带 要求 与 奖励 的 等级。

工作方式

  1. 等级节点 用于定义一个 等级。 1.a. 一个 等级 有基本信息,如 id、显示名称 与 描述。 1.b. 一个 等级 可以有多个 下一等级,以构建 等级路径。 1.b.i. 从 等级 A 到 等级 E,你可以定义一条 等级路径:A -> B -> C -> D -> E 1.b.ii. 从 等级 A 到 等级 E,你还可以定义另一条 等级路径:A -> F -> G -> E 1.b.iii. 玩家可以用 /rank up <next-rank> 选择一条要 走 的 等级路径。
  2. 一个 等级 可以有 事件: 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. 一个 等级 可以有 要求: 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%。

示例

◉ 按类型列出等级节点

  1. /rank list all-rank-nodes
  2. /rank list starting-rank-nodes Steve
  3. /rank list next-rank-nodes Steve
  4. /rank list previous-rank-nodes Steve
  5. /rank list walked-rank-nodes Steve

◉ 查询某个等级的信息

执行:/rank info newbie

◉ 查询当前等级进度

  1. /rank progress
  2. /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]

135. rtp — 随机传送

原文:https://fuji-fabric.github.io/Modules/rtp

模块说明

提供随机传送功能。

特性

  • 按维度独立设置
  • 实时搜索反馈
  • 全异步的 区块加载 与 区块生成。(无卡顿)
  • 可自定义 中心 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]

136. sign_editor — 告示牌编辑器

原文:https://fuji-fabric.github.io/Modules/sign_editor

模块说明

本模块提供一个告示牌编辑器,用于编辑告示牌方块上的文本。

示例

◉ 修改状态

  • 翻转取值:/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]

137. sit — 坐下

原文:https://fuji-fabric.github.io/Modules/sit

模块说明

提供坐在方块上的功能。

配置

⚠️ 以下 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

138. skin — 皮肤管理

原文:https://fuji-fabric.github.io/Modules/skin

模块说明

本模块为玩家提供 皮肤 管理。

工作方式

本模块提供 皮肤 管理:

  1. 当玩家 登录服务器 时,本模块会 修改皮肤。 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 在线服务器 拉取皮肤。
  2. 玩家可以在游戏中使用 /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]

139. system_message — 系统消息

原文:https://fuji-fabric.github.io/Modules/system_message

模块说明

自定义 可翻译文本,例如大多数 系统消息。

例如,你可以自定义以下 可翻译文本:

  1. 玩家加入与离开消息。
  2. 玩家死亡消息。(例如被僵尸杀死)
  3. 玩家白名单消息。(用于 GUI 中)
  4. 玩家成就消息。
  5. 玩家命令反馈。(指定命令的命令反馈)
  6. 服务器关闭消息。
  7. 玩家被封禁界面的消息。
  8. ……(服务端还有许多可翻译文本)

警告

◉ 不要自定义已被其他模组处理的 可翻译文本

例如,如果你在使用 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!"
    }
  ]
}

140. tab — TAB 列表

原文:https://fuji-fabric.github.io/Modules/tab

模块说明

自定义 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 列表中的 页眉 与 页脚。

141. teleport_warmup — 传送预热

原文:https://fuji-fabric.github.io/Modules/teleport_warmup

模块说明

在玩家传送前增加一个预热冷却。

工作方式

在原版 Minecraft 内部有一个用于传送的传送函数。

我们监听该传送函数,并为其包上一层预热冷却。

◉ 如何为不同命令指定不同的冷却时间?

你需要使用 command_warmup 模块。

command_cooldown 模块会简单地把 所有 传送请求一视同仁。

因为我们只知道存在一个传送请求。

但我们并不知道是谁发起了这个传送请求。

所以我们只能把 所有 传送一视同仁。

◉ 传送预热的目的

主要目的是防止原版 Minecraft 中 传送命令 被 滥用。

例如用传送命令逃避死亡。

注意:管理员玩家 可以绕过传送预热。

◉ 在以下情况下 传送预热 不会生效

  1. 目标维度不在 生效维度 列表中。
  2. 目标玩家的 age <= 3
  3. 目标玩家是 假玩家(fake player)。
  4. 目标玩家拥有 预热绕过权限。

配置

⚠️ 以下 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"
    ]
  }
}

142. temp_ban — 临时封禁

原文:https://fuji-fabric.github.io/Modules/temp_ban

模块说明

本模块提供 /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

143. tester — 开发测试

原文:https://fuji-fabric.github.io/Modules/tester

模块说明

本模块仅用于 开发。

如果你是开发者,可以在这里尝试新东西。

在生产环境中你不需要启用本模块。

它没有害处,但也没什么用。

命令

命令语法 说明 控制台可执行 所需权限等级
/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

144. title — 称号

原文:https://fuji-fabric.github.io/Modules/title

模块说明

本模块允许你定义在聊天中显示的 称号。

或者在任何支持占位符的地方显示 当前生效称号。

示例

◉ 把 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 返回该玩家 当前生效称号 的 显示名称。

145. top_chunks — 卡顿区块分析

原文:https://fuji-fabric.github.io/Modules/top_chunks

模块说明

分析服务器所有已加载的区块,找出最卡顿的区块。

工作方式

本模块使用一种 简单的统计方法 来估算 区块的卡顿程度。

方法很简单:统计 区块 内的 实体 与 方块实体 数量。

并按 实体 或 方块实体 的 类型 累加 分数。

它简单、快速且实用。

你可以把 一只僵尸 的分值定义为 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

146. tpa — 传送请求

原文:https://fuji-fabric.github.io/Modules/tpa

模块说明

本模块提供 /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

147. view — 查看玩家背包

原文:https://fuji-fabric.github.io/Modules/view

模块说明

允许你编辑玩家的 槽位。

  1. 编辑在线/离线玩家的 背包。
  2. 编辑在线/离线玩家的 末影箱。

命令

命令语法 说明 控制台可执行 所需权限等级
/view ender <OfflinePlayerName target> 查看玩家的末影箱。 否 4
/view inv <OfflinePlayerName target> 查看玩家的背包。 否 4

148. warning — 警告记录

原文:https://fuji-fabric.github.io/Modules/warning

模块说明

本模块为 管理团队 提供 信息管理 功能。

一个供 管理团队 之间共享的 警告 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 返回最近创建的一条警告的 原因。

149. whitelist — 白名单

原文:https://fuji-fabric.github.io/Modules/whitelist

模块说明

本模块让 原版白名单系统 只比较 用户名,而 忽略 UUID。

警告

◉ 只在离线服务器中启用本模块

如果你开的是正版验证(online-mode)服务器,则不需要启用本模块。

◉ 有什么区别?

对于 正版验证 服务器,玩家的 UUID 是确定的,并且始终一致。

对于 离线模式 服务器,玩家的 UUID 会随该玩家的 验证方式 变化,并受服务端 用户缓存 的影响。


150. works — 作品展示板

原文:https://fuji-fabric.github.io/Modules/works

模块说明

提供一个 公告板,供 玩家 展示与分享自己的作品。

注意

◉ 非生产作品 与 生产作品 的区别

对于 生产作品,我们提供 生产取样 来统计 漏斗 与 漏斗矿车。

提示

◉ 生产作品 中的 取样 是什么?

它是针对 漏斗 与 漏斗矿车 的计数器。

它会统计定义取样时长内 物品传输的速率。

例如,你可以用它统计取样时长内传输了多少 骨头、线 与 煤炭。

它有点类似 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

151. world — 世界管理

原文:https://fuji-fabric.github.io/Modules/world

模块说明

提供统一的世界管理。

世界、维度 与 维度类型 的定义

在早期的 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 = 一个 维度类型 + 一个 区块生成器。

维度类型 用于定义 维度 的 环境。(例如 床会爆炸吗?、会无限燃烧吗?)

区块生成器 用于 生成 区块。(把 种子 与 区块位置 交给它,它就会为你填充方块)

参见:

  1. https://minecraft.wiki/w/Dimension_type
  2. https://minecraft.wiki/w/Dimension_definition
  3. https://minecraft.wiki/w/Noise_settings

world 模块如何生成维度?

实际上,world 模块本身并不做 世界生成。

我们做的事情很简单:运行时维度描述符 提供足够的信息来创建 DimensionOptions。

注意 Dimension Options = 维度类型 + 区块生成器:

  1. 我们用 维度类型 描述某个 维度 的 环境。(例如 床会爆炸吗?、会无限燃烧吗? 等)
  2. 我们用 区块生成器 描述 区块 如何生成。(我们会把指定的 种子 参数传给它)

◉ 什么是 区块生成器?

把一个 种子 与 区块位置 交给 区块生成器。

区块生成器 就会为你 填充 方块。

区块生成器 有 2 种类型:

  1. 平坦区块生成器(Flat Chunk Generator):用于 超平坦 世界,它逐 层 填充方块。
  2. 噪声区块生成器(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 模组。

参见:

  1. https://github.com/DrexHD/WorldManager
  2. https://github.com/DrexHD/WorldGameRules

关于 维度 的有用概念

提示:做一个每天自动重置的资源世界

你可以用 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:

  1. 如果 命令来源 是 玩家,则该 世界 是 该玩家所在的世界。
  2. 如果 命令来源 是 控制台,则该 世界 是 minecraft:overworld。

◉ /time {set/add} ... 命令的逻辑

对于 /time {set/add} 命令,它作用于服务端中的 所有维度。

提示:世界 的 天气系统

天气 有 3 种类型:clear(晴朗)、rain(下雨)与 thunder(雷暴)。

如果是 clear,则 rain 与 thunder 都为 false。

如果是 thunder,则 rain 为 true。

天气系统 会在以下条件下 tick:

  1. 世界 的 维度选项 带有 天空光。
  2. 世界 的 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 的逻辑:

  1. 如果玩家当前在 minecraft:the_end,则目标维度是 minecraft:overworld。
  2. 否则目标维度是 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

◉ 为额外维度指定种子

  1. /world create my_nether --seed 1234567890 minecraft:the_nether
  2. /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

注意:当你使用预定义的 世界预设 时,以下选项会被 忽略:

  1. 维度类型 id
  2. 区块生成器类型
  3. 区块生成器参数。

◉ 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 模块把玩家传送到指定世界

  1. /tppos --dimension minecraft:overworld --x 0 --y 128 --z 0 --yaw 0 --pitch 0
  2. /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]

152. world.border — 按维度世界边界

原文:https://fuji-fabric.github.io/Modules/world.border

模块说明

本模块允许你自定义 按维度的世界边界。

警告:MC 1.21.9 起的 按维度世界边界

自 MC 1.21.9 起,/worldborder 命令已是 按维度生效 的。

只有当你的 MC 版本低于 MC 1.21.9 时,才应使用 world.border 模块。

工作方式

在 Minecraft 内部,每个 维度 都有一个名为 getWorldBorder() 的函数。

它返回该 维度 的 世界边界。

原版 Minecraft 只返回 minecraft:overworld 的 世界边界。

fuji 修改了 getWorldBorder() 函数,让它返回 按维度的边界。

◉ 如何配置 按维度的边界?

你可以直接修改配置文件,并执行 /fuji reload 使改动生效。

◉ 我可以在原版维度中使用本模块吗?

可以。

提示:/worldborder 命令的逻辑

/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
      }
    }
  ]
}

153. world_downloader — 世界区域文件下载

原文:https://fuji-fabric.github.io/Modules/world_downloader

模块说明

允许玩家下载离自己最近的 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

⚠️ **GitHub.com Fallback** ⚠️