This commit is contained in:
boybook
2025-12-01 20:59:16 +08:00
parent 12738a142c
commit 760c2dd9ad
5535 changed files with 21070 additions and 2021 deletions

View File

@@ -0,0 +1,18 @@
---
front: https://nie.res.netease.com/r/pic/20211104/69055361-2e7a-452f-8b1a-f23e1262a03a.jpg
hard: 入门
time: 5分钟
---
# 摘要
在本章中,我们将学习我的世界中的命令,了解命令的用途,并学会使用各种基础的命令。
- 在第一节(*命令的用途*)中,我们将一起认识**命令****Command**)这一概念,认识到命令在开发过程中的重要性。
- 第二节(*使用命令的方法*)中,我们一起学习命令的执行方法,了解命令不同的执行途径。
- 在第三节(*理解命令参数*)中,我们了解命令的**参数****Argument**),学习什么是**坐标****Coordinate**),学习使用**目标选择器****Target Selector**)和**原始文本****Raw Text**)。
- 在第四节(*命令列表和概述*)中,我们将列出一个命令的列表和概述供大家参考。
- 在第五节(*常用命令及用法*)中,我们将一起学习一些常用命令。
- 在最后一节(*挑战:实体叠叠乐*)中,我们将一起完成一个挑战,以此巩固我们学到的知识。
本章关键词:命令 函数 命令方块 目标选择器 坐标 原始文本

View File

@@ -0,0 +1,17 @@
---
front: https://nie.res.netease.com/r/pic/20211104/69055361-2e7a-452f-8b1a-f23e1262a03a.jpg
hard: 高级
time: 10分钟
---
# 命令的用途
**命令****Command**)是我的世界中一个非常重要的系统。通过操作命令,你可以在世界中快速执行各式各样的操作,从简单的改变游戏模式或改变天气,到复杂的记分板和函数逻辑。
创作命令的初衷是为了通过这种系统让游戏世界得以动态运行。例如,开发者可以通过命令实时监测玩家周围的环境,然后对特定的环境做出特定的反应。通过这样的操作可以使游戏不再是一个纯粹的静态。虽然没有了命令,我们依旧有很多种形式为游戏添加各种逻辑,但是命令作为与游戏嵌合得最好且最简单的一种表示形式,不仅可以简化模组的开发,还可以使游戏运行地更加流畅。
![命令](./images/4.1_command.png)
同时,命令被整合到了模组开发的方方面面中。我们可以用**函数****Function**来批量执行命令我们还可以在实体、方块和物品等逻辑中执行命令甚至我们还可以通过模组API执行命令来简化脚本的逻辑或和模组其他部分相兼容比如通过统一的记分板来记录世界信息调配游戏资源内容。
接下来,我们将通过简洁易懂的语言一起来学习命令的执行。

View File

@@ -0,0 +1,48 @@
---
front: https://nie.res.netease.com/r/pic/20211104/69055361-2e7a-452f-8b1a-f23e1262a03a.jpg
hard: 高级
time: 15分钟
---
# 使用命令的方法
每一个命令都必须经过使用才能生效,我们将命令的使用的过程称作**执行****Execute**)命令。
为了使大部分命令顺利执行,我们需要在世界选项中打开“**作弊模式**”。这样,所有的“作弊命令”和“非作弊命令”就都可以使用了,我们也就无需担心命令的可用性问题。在我的世界开发工作台的开发测试中,我们确保“作弊模式”是开启的:
![4.2_enable_cheat](./images/4.2_enable_cheat.png)
同时,我们强烈建议在探索命令系统时将游戏模式更改为**创造模式**。因为玩家可以在创造模式下自由地使用最高权限的命令,同时玩家在创造模式下还可以操控命令方块,以实现更多高级功能。
接下来,我们了解一下多种执行命令的方式。
## 通过聊天栏执行命令
进入世界后,我们按下`T`键(移动端用户是按下顶部的聊天按钮),我们将看到一个**聊天栏****Chat Bar**)覆盖在我们的界面上,这边是我们与其他玩家聊天的场所。但是,值得注意的是,这个聊天栏的功能不止于聊天。我们还可以将其视为一个控制台来执行命令。在聊天栏的第一个字符处输入斜杠`/`,我们将进入“命令的世界”。此时,我们将看到屏幕上出现了很多命令的提示信息,这些是可以用来提示我们输入正确的命令的信息,同时我们还可以利用这个信息进行命令的自动补全。
![输入`/`后出现的命令信息](./images/4.2_command_auto_complete.png)
当我们输入命令的前几个字母后屏幕上的提示信息也将筛选减少以适应我们已经输入的部分。随着我们的输入我们可以看到符合筛选的命令将会越来越少最终定位到某一个最终的命令上。不过在此之前如果你在使用PC设备并且在屏幕上还有一些候选命令的时候按下`Tab`键,你将体验到命令的自动补全功能。重复按下`Tab`键可以让补全的命令在当前屏幕上提示的所有命令中循环。这是一个快速输入某个命令的非常实用的功能。
## 通过命令方块执行命令
我们在创造模式开启作弊的聊天栏中输入以下命令:`/give @s command_block`。我们将得到一个**命令方块Command Block**。命令方块是一个可以以自己为执行者执行预先配置好的命令的方块只有在创造模式下通过对其按下“使用键”PC端是鼠标右键才可以将其配置界面打开。打开后我们将看到如下一系列选项。
![4.2_command_block_screen](./images/4.2_command_block_screen.png)
- **命令输入**:命令输入是我们输入命令的地方,这里的格式几乎与聊天栏中输入命令相同。唯一的不同点是命令方块中的命令无需斜杠`/`前缀。
- **方块类型**:我们放下命令方块时默认是**脉冲**模式。脉冲模式的命令方块时橙色的,每激活一次就执行一次命令。我们还可以将其改成绿色的**连锁**模式和紫色的**重复**模式。连锁模式的命令方块只在指向它的命令方块执行命令时才会执行命令,而重复模式的命令方块被激活时每一游戏刻都会执行一次命令。
- **条件**:默认为**无条件**,即不受条件制约,无视周围的命令方块执行成功与否。**有条件**时受到条件制约,即只有当前一个指向自己的命令方块执行指令成功时,自己才会执行命令。
- **红石**:脉冲模式和连锁模式默认**需要红石**,即必须由红石对其激活才能使其发挥作用,执行命令。但是如果调整成重复模式默认的**保持开启**,就可以使其重复模式的命令方块无需红石即可持续执行其中的命令;连锁模式是在感应后立即执行一次,脉冲模式将在设置完毕后立即执行一次,且此后将无法再次执行。
- **执行第一个已选项****Execute on First Tick**,在首刻执行):在激活后第一个游戏刻立即执行,而非进入挂起状态等待延迟后再执行。
- **已选项中的延迟****Delay in Ticks**,延迟刻数):对于脉冲模式命令方块和连锁模式命令方块,指定在被激活或触发后,执行命令之前延迟的游戏刻。对于重复模式命令方块,指定其重新执行命令所延迟的游戏刻。
## 通过函数文件执行命令
**函数****Function**)是一个允许开发者使用`.mcfunction`文件作为一个命令的集合来批量执行命令的功能,常常配合命令方块实现一些高级功能。
在函数文件中,一条命令单独占一行,没有斜杠`/`前缀。在文件中可以使用`#`来开启一个注释,`#`之后的文字都会属于注释内容而不被执行。
通过`/function`命令,我们可以执行一个函数。`/function`的语法是`/function <name: filepath>`。比如,我们可以通过`/function test`来执行行为包根目录的`functions`文件夹下的`test.mcfunction`文件。
通过`/reload`命令,我们可以重新加载行为包中的函数文件。通过该命令,我们可以更快地调试函数而不重启游戏。

View File

@@ -0,0 +1,253 @@
---
front: https://nie.res.netease.com/r/pic/20211104/69055361-2e7a-452f-8b1a-f23e1262a03a.jpg
hard: 高级
time: 15分钟
---
# 理解命令参数
通过前期的探索,我们可以粗略地了解到,一个命令是由如下部分组成的:
1. 如果是聊天栏输入的命令,则必须有一个`/`开头;
2. 紧跟着`/`之后是命令的**名称****Name**
3. 在命令名称之后是一个空格` `
4. 紧接着是各个命令参数,参数与参数之间以空格隔开。
所以可见,我们必须要理解何为命令的**参数****Argument**),才能正确地使用一个命令。
## 参数
参数是命令名之后跟着的一系列用于精确界定命令执行范围或执行对象的数据。大部分命令都有一个或多个参数。参数分为多种类型,分别有**必需参数**、**可选参数**和**字面参数**。
### 必需参数
**必需参数****Required Argument**)是一种通过尖括号包裹起来的参数,格式是`<descriptor: type>`。尖括号代表该命令必须具有该参数才能正常运作,否则将会出现执行错误。例如,给予一个玩家管理员的命令:
```shell
/op <player: target>
```
冒号之前的部分称作该参数的**描述符****Descriptor**),通常又称为参数名,在这里是`player`,代表这里应该输入一个玩家。冒号之后的部分称作该参数的**类型****Type**),这里是`target``target`类型代表可以输入一个玩家名或者一个目标选择器。关于目标选择器,后面我们会一起重点学习。
如果该命令只输入`/op`,那么将会报错,提示缺少必要的参数。
### 可选参数
**可选参数****Optional Argument**)是一种通过方块号包裹起来的参数,是并非一定要输入的参数。这种参数往往具有一些默认值,如果不输入将自动调用其默认值。可选参数的格式为`[descriptor: type]`。例如,将一个玩家踢出世界的命令:
```shell
/kick <name: target> [reason: message]
```
这个命令有两个参数,第一个参数是一个必需参数,而第二个便是一个可选参数。如果只传入第一个玩家名,保留第二个为空,那么踢出玩家时将不会带有原因,而如果传入第二个可选参数,那么踢出玩家时将展示踢出原因。
### 字面参数
**字面参数****Literal Argument**)是一种和上面两种参数表达方式都不一样的参数,它没有描述符和类型,仅仅是一个字面意义的文本。也就是说,这个参数不允许玩家自定义传入的值,该写成什么样就写成什么样。往往,一个字面参数可以允许多个字面值,当有多个字面值时,各个值之间用`|`分隔开,此时如果一个字面参数是必需的,那么在外围将包裹尖括号;如果是可选的,将包裹方括号。对于只有一个字面值的字面参数,其外面没有括号,这种字面参数往往都是必需参数。它的格式一般为`arg``<arg1|arg2|...>``[arg1|arg2|...]`。例如,天气命令:
```shell
/weather <clear|rain|thunder> [duration: int]
/weather query
```
`/weather <clear|rain|thunder>`用来更换天气,`/weather query`用来查询天气。此时`<clear|rain|thunder>`是一个必需的字面参数,`query`是一个必须的只有一种选择的字面参数。
### 参数类型列表
这里列出了常见的参数类型列表和它们的描述。
| 类型 | 描述 |
| :--------- | :----------------------------------------------------------- |
| Boolean | 布尔值,`true`或者`false`。 |
| int | 整数,比如`1``2``3`等。 |
| float | 浮点数,比如`1.3``3.14`等。 |
| string | 字符串,可以直接是一个单词/汉字或是一个由引号包裹的多个单词/带空格的汉字,比如`single``"multiple words"`。 |
| message | 消息文本,无需引号包括的字符串。 |
| x y z | 代表坐标的三个浮点数,中间用空格间隔,比如`16.5 128 32`代表x=16.5、y=128、z=32的位置。可以用`~`表示相对坐标,或用`^`表示局部坐标,具体详见[坐标](#坐标)。 |
| Block | 方块ID。 |
| Item | 物品ID。 |
| EntityType | 实体ID。 |
| json | JSON格式文本。 |
| target | 一个玩家名或一个目标选择器。 |
| …… | …… |
## 坐标
我的世界中的**坐标****Coordinate**是一个三维空间的欧拉右手直角坐标系但是与典范的欧拉坐标系不同我的世界的坐标系经过一定的旋转旋转成了y轴正方向代表朝上因此我们在世界中的高度成为了y坐标。
![4.3_coords](./images/4.3_coords.png)
具体来讲xyz的三个轴代表如下方向
- x轴的正方向为东其坐标反映了玩家距离原点在东+)西(-)方向上的距离。
- z轴的正方向为南其坐标反映了玩家距离原点在南+)北(-)方向上的距离。
- y轴的正方向为上其坐标反映了玩家位置的高低程度其中海平面为62
一般来讲如果需要给予坐标一个单位的话我们认为世界中坐标的单位为米m
### 相对坐标
在命令中,我们可以使用`~`来代表**相对坐标****Relative Coordinate**)。单独的`~`代表与执行原点距离为0的位置`~`后面加一个数字(例如`~1`)代表相对于执行原点偏移了这个数字大小的距离的位置。后面所跟的数字可正可负,正代表沿着该轴正方向偏移,负则代表沿着该轴负方向偏移。
例如,`/tp ~1 ~5 ~-3`可以将玩家传送到往东1m往上5m同时往北3m的位置。
### 局部坐标
和相对坐标类似,**局部坐标****Local Coordinate**)也是一种从执行原点开始计算的坐标,不过其各个轴的方向和相对坐标有很大不同。局部坐标是以玩家视角面对的方向为轴的。准确地说:
- x轴的正方向为左其坐标反映了在以玩家视角为参考左+)右(-)方向上的距离。
- z轴的正方向为前其坐标反映了在以玩家视角为参考前+)后(-)方向上的距离。
- y轴的正方向为上其坐标反映了在以玩家视角为参考上+)下(-方向上的距离注意玩家的上不一定就是竖直方向例如玩家“90°看天”时玩家的上方向和水平面平行
局部坐标使用`^`代替`~`,其余的用法和相对坐标完全相同。
## 目标选择器
对于带有`target`类型参数的命令,我们知道可以使用玩家的名字来执行。但是,有时候使用玩家名是非常不便的。比如,我们通常不知道使用我们的玩法组件的玩家究竟是何名,自然无法在开发过程中预先使用玩家的名字。这时候,我们就需要**目标选择器****Target Selector**)的登场了。
我们有5种基选择器来选择不同的目标实体它们分别是
| 基选择器 | 功能 |
| :------- | :----------------------------------------------------------- |
| `@p` | 选择距离执行原点最近的玩家,执行原点通常是玩家或者命令方块。当`x``y``z`参数被指定时将选择距离该指定坐标最近的玩家。 |
| `@r` | 选择一个随机玩家。当`type`参数被指定时将选择其他类型的实体。 |
| `@a` | 选择所有玩家,无论存活与否。 |
| `@e` | 选择所有实体。 |
| `@s` | 选择命令的执行实体。 |
上面所说的“参数”皆指**选择器参数****Selector Parameter**),而非命令参数。选择器参数是跟在基选择器后面用方括号包裹起来的一种变量,可以用来筛选和缩小选择器选择的范围。选择器参数通常的语法是:
```shell
@<selector>[param1=value1,param2=value2,...]
```
我们可以看到,方括号内可以具有一个或多个选择器参数,每个选择器参数之间用英文半角逗号隔开。每个参数内部都会先出现一个参数名,参数名之后紧跟一个等号(`=`),等号后是该参数选择的值。
比如,我们想将所有冒险模式下的玩家更改为生存模式,而不影响创造模式或旁观者模式下的玩家,那么我应该使用如下命令和选择器参数:`/gamemode survival @a[m=adventure]`
有一些选择器参数允许进行一种反选,这可以通过在参数的值之前添加英文半角感叹号`!`来实现,这称作对参数的值进行**否定****Negate**)。比如,`/gamemode survival @a[m=!adventure]`将实现将所有非冒险模式下的玩家的游戏摩米士全部更改为生存模式。
### 选择器参数列表
下面列出了所有的选择器参数及其功能:
| 参数 | 功能 |
| :----------- | :----------------------------------------------------------- |
| `x, y, z` | 指定选择器的执行原点,不必同时指定全部三个轴,不指定时默认和命令的执行原点一致。 |
| `r, rm` | 指定距离执行原点一定范围内的实体,该参数的值代表范围的半径。`r`是radius的缩写代表范围的最大半径`rm`是radius minimum的缩写代表范围的最小半径。两者都可不同时指定`r`不指定时默认为无穷大,`rm`不指定时默认为0。 |
| `dx, dy, dz` | 指定在矩形长方体内的实体,执行原点将是该长方体的一个顶点。`d`是distance的缩写三个参数分别代表距离该顶点执行原点的距离。若三者其中之一被指定另外没有指定的参数默认值均为0。 |
| `c` | 指定最大可能选择的实体数,最终选择的实体依赖于基础目标选择器本来应选出的实体的排列顺序。比如,对于`@p``@r`该参数默认为1`c`可以使其增加选择最近或随机目标的数量。而`@a``@e`仅仅会限制选择的目标数量,限制的顺序依赖内部代码的排序。负的值可以使得选择顺序被反转,比如`@p[c=-5]`可以选中距离执行原点最远的5个目标。`c`是count的缩写。 |
| `type` | 指定实体ID不可以被用于`@p``@a`因为它们只能用于选择ID为`player`的实体即玩家。该参数的值可以被否定用于选择非某ID的实体。 |
| `m` | 指定玩家的游戏模式。`m`是mode的缩写。 |
| `tag` | 指定具有某种标签的实体,其中实体的标签可以`/tag`给予。 该参数的值可以被否定,用于选择不具有某个标签的实体。可以同时指定多个`tag`参数,来更严格地筛选出想要的目标。 |
| `name` | 指定目标的名字,玩家名或者实体的自定义名字皆可以用该参数指定。该参数的值可以被否定,用于选择不具有某个名字的实体。可以同时指定多个`name`参数,来更严格地筛选出想要的目标。 |
| `l, lm` | 指定具有一定经验等级的实体,该参数的值代表等级。`l`是level的缩写代表最大经验等级`lm`是level minimum的缩写代表最小经验等级。两者都可不同时指定。 |
| `rx, rxm` | 指定具有一定的绕x轴旋转角的实体即指定具有一定**俯仰角****Pitch**)的实体,该参数的值的单位为角度制。`rx`是rotation x的缩写代表最大俯仰角`rxm`是rotation x minimum的缩写代表最小俯仰角。实体的俯仰角范围为从-90°向正上看天到90°向整下看地。两者都可不同时指定。 |
| `ry, rym` | 指定具有一定绕y轴旋转角的实体即指定具有一定**偏航角****Yaw**)的实体,该参数的值的单位为角度制。`ry`是rotation y的缩写代表最大偏航角`rym`是rotation y minimum的缩写代表最小偏航角。实体的偏航角范围为从-180°到180°。两者都可不同时指定。 |
| `scores` | 指定具有特定记分项的目标。该参数的值允许使用花括号来进一步指定记分项,各个记分项之间使用英文半角逗号分隔,记分项的值可以使用`..`来代表一个范围。比如,`1..5`代表可以接受从1到5这个区间内的值。记分项的值也可以被否定用来筛选不满足指定分数值的目标。花括号内的语法示例`[scores={objectiveA=valueA1..valueA2,objectiveB=!valueB,...}]`。 |
| `family` | 指定目标所属的**族****Family*****科系***类型。族可以在实体JSON文件的的`minecraft:type_family`组件中定义。该参数的值可以被否定,用于选择不属于某个族的实体。可以同时指定多个`family`参数,来更严格地筛选出想要的目标。 |
## 原始文本
**原始文本****Raw Text**是一种JSON格式的文本可以为我的世界中的文本增添一些富文本特性和动态翻译特性。原始文本可以被用在很多地方比如命令中、书中和自定义游戏内容的许多支持原始文本的对象里。原始文本会以JSON的格式写入但是以富文本的形式输出。在阅读原始文本的格式之前建议先初步自行了解一下JSON的基本格式。
我的世界基岩版的原始文本具有严格的格式,首先,它必须是一个用花括号包裹起来的对象,且其中只有一个字段,即`rawtext`数组。`rawtext`数组中包含许多对象,每个对象称作一个原始文本**内容对象**。大体的格式如下:
```json
{
"rawtext": [
{ /* object 1 */ },
{ /* object 2 */ },
// other objects
]
}
```
要使每个内容对象生效,每个内容对象都必须要含有以下**内容标签**字段之一:`translate``text``selector``score`。如果一个内容对象含有多个内容标签,也只会有一个内容标签生效。生效是按照内容标签的权重来计算的,而上面列出的内容标签的顺序也恰是它们的权重顺序,当两个同时出现时,靠前的内容标签会生效。
每个内容标签的格式都略微不同,分别如下。
### `translate`
`translate`是用于翻译本地化文本的内容标签。格式如下:
```json
{
"rawtext": [
{
"translate": "some.localization.key", // String类型本地化键名如果在语言文件中没有找到该本地化键名或者填入的不是本地化键名而是普通的文本则直接显示该文本。
"with": [ /* some arguments for localization */ ] //可选Array类型用于填充到本地化文本中的参数当本地化文本中带有一个或多个类似于“%s”的变量时用于替换变量所在的位置。数组中每一个元素都可以是一个单独的字符串文本或者另一个完整的原始文本对象。
}
]
}
```
### `text`
`text`是最简单的内容标签,就是单纯地输出一段纯文本。格式如下:
```json
{
"rawtext": [
{
"text": "Some Text." //String类型纯文本。
}
]
}
```
### `selector`
`selector`是一个单独的目标选择器,主要用于输出玩家或实体的名字。格式如下:
```json
{
"rawtext": [
{
"selector": "@someSelector[someParams=someValues]" //String类型其内容按照目标选择器的格式进行写入即可会返回一个或多个实体的名字返回多个实体名时会按照“AA、BB和CC”的格式。
}
]
}
```
### `score`
`score`是用于显示一个记分项分数的标签。格式如下:
```json
{
"rawtext": [
{
"score": {
"name": "Entity Name or @selector or *", // String类型需要显示分数的实体名字或一个目标选择器。也可以使用“*”作为值,此时将显示该原始文本的“读者”的分数,如果该原始文本的潜在读者为多个人,则无法显示。
"objective": "someObjective", //String类型记分项的内部名称。
"value": "someValue" //可选String类型如果设置了该字段那么不管实际分数为多少都会显示该字段所给的值。
}
}
]
}
```
### 追加
在介绍原始文本的最一开始我们便提到,一个原始文本数组里面可以有多个内容对象。向一个原始文本数组中添加多个内容对象的行为称为原始文本的**追加****Append**)。
```json
{
"rawtext": [
{ /* object */ },
{ /* appended object */ },
// other appended objects
]
}
```
追加的原始文本内容对象最后解析的文本会和原来的文本的末尾直接连在一起。从输出结果来看和分别连着写了两个原始文本没有什么区别。但是,有些情况下只允许我们写一个原始文本,那么我们就需要用追加功能来依次排列我们所需要的内容标签,灵活运用四种标签组合出一个完整的预期的文本。
### 换行与参数顺序
你可以在原始文本中使用`\n`代表一个**换行**。换行有助于更好地进行文本排版。
你还可以使用`%%1``%%2`等来代替`%s``%d`这种不带顺序的参数占位符。这样即使`%%2`在文本出现在了`%%1`的前面,你依旧可以使`with`字段中的第二个元素成功替换到排在前面的`%%2`的位置。
本节的最后简单地提示一点。如果你系统学习过JSON你应该知道JSON文件不管是写成多行带有缩进的格式还是全部写到一行中去其功能是不受任何影响的。本节中的原始文本为了便于大家理解所以使用了带缩进的排版但是事实上大部分使用原始文本的地方都是需要写到一行中的还请各位开发者在使用时随机应变正确地输入原始文本。

View File

@@ -0,0 +1,76 @@
---
front: https://nie.res.netease.com/r/pic/20211104/69055361-2e7a-452f-8b1a-f23e1262a03a.jpg
hard: 高级
time: 5分钟
---
# 命令列表和概述
本节列出了当前所有可用的命令及其概述。
### 列表
| 命令 | 概述 |
| ----------------- | ------------------------------------------------------------ |
| `?` | 提供帮助或命令的列表。 |
| `alwaysday` | 锁定或解锁昼夜循环。 |
| `camerashake` | 对玩家的相机应用指定强度和时长的摇晃效果。 |
| `clear` | 清空玩家背包的物品。 |
| `clearspawnpoint` | 清除一个玩家的出生点。 |
| `clone` | 把方块从一个区域复制到另一个区域。 |
| `daylock` | 锁定或解锁昼夜循环。 |
| `deop` | 撤销一名玩家的管理员状态。 |
| `difficulty` | 设置难度等级。 |
| `effect` | 添加或移除状态效果。 |
| `enchant` | 向玩家所选择的物品添加一个魔咒。 |
| `event` | 触发指定对象的一个事件。 |
| `execute` | 代表一个或多个实体执行一个命令。 |
| `fill` | 用特定的方块填充全部或部分区域。 |
| `fog` | 添加或移除迷雾设置文件。 |
| `function` | 运行对应函数文件里的命令。 |
| `gamemode` | 设置玩家的游戏模式 |
| `gamerule` | 设置或查询一个游戏规则。 |
| `give` | 给予玩家一个物品。 |
| `help` | 提供帮助或命令的列表。 |
| `kick` | 从服务器踢出一名玩家。 |
| `kill` | 杀死实体(玩家、生物等)。 |
| `locate` | 显示距离最近的给定类型的结构的坐标。 |
| `me` | 显示一条关于你自己的消息。 |
| `mobevent` | 控制哪些生物事件允许运行。 |
| `msg` | 向一名或多名玩家发送私密消息。 |
| `music` | 允许你控制播放音乐音轨。 |
| `op` | 授权一名玩家草管理员状态。 |
| `particle` | 创建一个粒子发射器。 |
| `playanimation` | 使一个或多个实体播放一个一次性动画。假设所有变量都被正确设置。 |
| `playsound` | 播放一条声音。 |
| `reload` | 从全部行为包加载所有函数文件。 |
| `removeedunpc` | 删除地图内所有NPC。 |
| `replaceitem` | 替换物品栏中的物品。 |
| `ride` | 使实体骑乘其他实体,停止实体的骑乘,使坐骑赶下骑手,或召唤坐骑或骑手。 |
| `say` | 在聊天栏中向其他玩家发送一条消息。 |
| `schedule` | 计划在一个区域一旦加载时或加载特定长度的时间后便执行的操作 |
| `scoreboard` | 追踪并显示各个记分项的分数。 |
| `setblock` | 将一个方块更改为另一个方块。 |
| `setmaxplayers` | 设置该游戏绘画的最大玩家数量。 |
| `setworldspawn` | 设置世界出生点。 |
| `spawnpoint` | 为一个玩家设置出生点。 |
| `spreadplayers` | 将实体传送到随机的位置。 |
| `stopsound` | 停止播放一条声音。 |
| `structure` | 在世界中保存或加载一个结构。 |
| `summon` | 召唤一个实体。 |
| `tag` | 管理存储在实体中的标签。 |
| `teleport` | 传送实体(玩家、生物等)。 |
| `tell` | 向一名或多名玩家发送私密消息。 |
| `tellraw` | 向一个玩家发送一条JSON消息。 |
| `testfor` | 计数满足特定条件的实体(玩家、生物、物品等)。 |
| `testforblock` | 测试一个特定的方块是否在特定的位置。 |
| `testforblocks` | 测试两个区域中的方块是否匹配。 |
| `tickingarea` | 添加、移除或列出常加载区域。 |
| `time` | 更改或查询世界的游戏时间。 |
| `title` | 控制屏幕标题。 |
| `titleraw` | 通过JSON消息控制屏幕标题。 |
| `toggledownfall` | 切换天气。 |
| `tp` | 传送实体(玩家、生物等)。 |
| `w` | 向一名或多名玩家发送私密消息。 |
| `weather` | 设置天气。 |
| `xp` | 添加或移除玩家的经验。 |

View File

@@ -0,0 +1,214 @@
---
front: https://nie.res.netease.com/r/pic/20211104/69055361-2e7a-452f-8b1a-f23e1262a03a.jpg
hard: 高级
time: 20分钟
---
# 常用命令及用法
本节我们介绍最常用的一些命令及其使用方法。我们从实体、世界、聊天、方块、音效和粒子等角度介绍常用的命令。
## 实体命令
### summon
`/summon`命令可以用于在世界中召唤一系列实体。它的语法为:
```shell
summon <entityType: EntityType> [spawnPos: x y z] [spawnEvent: string] [nameTag: string]
```
- `entityType`EntityType类型实体类型可以为实体ID。
- `spawnPos`x y z类型生成点是你要召唤的实体的生成坐标。
- `spawnEvent`string类型生成事件生成时实体触发的事件。
- `nameTag`string类型实体出生自带的名字。
### scoreboard
`scoreboard`命令是一种可以在各个实体的基础上跟踪数值,以及执行数学运算的命令,其使用的容器被称作**记分板****Scoreboard**)。记分板非常复杂,如果想详细了解,可以参见[Minecraft Wiki的记分板页面](https://zh.minecraft.wiki/w/%E8%AE%B0%E5%88%86%E6%9D%BF)。
### tag
`tag`命令允许你在各个实体的基础上跟踪标签。有如下几种子命令:
为目标添加一个标签:
```shell
tag <entity: targets> add <name: string>
```
移除目标的一个标签:
```shell
tag <entity: targets> remove <name: string>
```
列出目标所拥有的所有标签:
```shell
tag <entity: targets> list
```
## 世界命令
### time
`time`命令可以用于调整世界时间。它的语法如下:
- `set`子命令:
```shell
/time set <amount: int>
/time set <time: TimeSpec>
```
- `query`子命令:
```shell
time query <daytime|gametime|day>
```
- `add`子命令:
```shell
time add <amount: int>
```
`set`子命令用于设置当前时间,后面紧跟的参数为要设置的时间数值或`TimeSpec`枚举值,枚举值可以为`day``night``noon``midnight``sunrise``sunset`
`query`子命令用于查询当日时间、游戏时间和天数。
`add`子命令用于在当前时间的基础上添加一定量的时间。
### weather
`weather`命令用于调整天气。它的语法如下:
```shell
/weather <clear|rain|thunder> [duration: int]
```
第一个字面参数是要调整的目标:
- `clear`代表晴天。
- `rain`代表雨雪。
- `thunder`代表雷暴。
第二个可选参数代表该状态的持续时间单位是游戏刻其中20游戏刻等于1秒。
### gamemode
`gamemode`命令可以用来更改一个玩家的游戏模式。它的语法如下:
```shell
/gamemode <gameMode: GameMode> [player: target]
/gamemode <gameMode: int> [player: target]
```
我们可以看到,第一个参数是必需参数,可以为一个代表游戏模式的整数,或是一个`GameMode`枚举值。枚举值可以为`survival``s`)生存模式、`creative``c`)创造模式、`adventure``a`)冒险模式和、`default``d`)默认的游戏模式。
第二个参数是可选参数,如果不指定则默认更改当前执行命令的玩家的游戏模式。如若指定玩家,则更改指定玩家的游戏模式,该参数可以为玩家名或一个目标选择器。
### gamerule
`gamerule`命令是用来更新一个**游戏规则****Game Rule**)的。游戏中有大量的游戏规则,控制着游戏中的各种事件是否应该发生。我们可以通过如下语法使用该命令:
```shell
/gamerule <rule: BoolGameRule> [value: Boolean]
/gamerule <rule: IntGameRule> [value: int]
```
游戏规则有两种形态,一种是布尔游戏规则,其值只有`true``false`;一种是整数游戏规则,其值可以为整数。完整的游戏规则列表可以在[Minecraft Wiki的游戏规则页面](https://zh.minecraft.wiki/w/%E6%B8%B8%E6%88%8F%E8%A7%84%E5%88%99)找到。
## 聊天命令
### tell
`tell`命令是用于向一个或多个玩家私发消息的命令。该命令有两个别名,分别是`msg``w`,这两个别名和本名有相同的效果。有如下格式:
```shell
tell <target: target> <message: message>
msg <target: target> <message: message>
w <target: target> <message: message>
```
第一个参数可以为玩家名或目标选择器,通过目标选择器可以选择多个玩家。第二个参数是一个消息文本,即你要发送的消息。通过灵活使用该命令可以做到针对世界中不同玩家发送不同的独占消息,制作一些针对每个人都不同的成就、交易消息等非常有用。
## 方块命令
### setblock
`setblock`命令可以在指定坐标处放置一个指定方块。
```shell
setblock <position: x y z> <tileName: Block> [tileData: int] [destroy|keep|replace]
setblock <position: x y z> <tileName: Block> [blockStates: block states] [destroy|keep|replace]
```
其中最后一个字面参数分别可以用于选择一下三种模式:
- `destroy`:摧毁模式,原位置的方块将被模拟摧毁,正常掉落并播放破坏音效。该模式为默认值。
- `keep`:保留模式,只有在原位置是空气时才会成功放置,否则都将保留原方块不变。
- `replace`:替换模式,原方块直接消失并被替换成新方块,不会经历破坏和掉落。
### fill
`fill`命令用于在某个矩形区域内批量填充方块,其语法如下:
```shell
fill <from: x y z> <to: x y z> <tileName: Block> [tileData: int] [oldBlockHandling: FillMode]
fill <from: x y z> <to: x y z> <tileName: Block> [blockStates: block states] [oldBlockHandling: FillMode]
```
最后一个`oldBlockHandling`枚举参数除了上述三种模式外,还支持如下两种模式:
- `hollow`:镂空模式,将区域的最外层方块更改为指定的方块,内部全部替换为空气。
- `outline`:外框模式,将区域的最外层方块更改为指定的方块,内部保留原样。
该参数的默认值为`replace`
### clone
`clone`命令用于将一处地形复制(克隆)到另一处,其本质也是方块的复制。
```shell
clone <begin: x y z> <end: x y z> <destination: x y z> [maskMode: MaskMode] [cloneMode: CloneMode]
clone <begin: x y z> <end: x y z> <destination: x y z> filtered <cloneMode: CloneMode> <tileName: Block> <blockStates: block states>
clone <begin: x y z> <end: x y z> <destination: x y z> filtered <cloneMode: CloneMode> <tileName: Block> <tileData: int>
```
其中`maskMode`枚举参数能够指定掩码模式,有以下几种类型:
- `masked`:执行一种类似于计算机中“掩码取或”的过程,即使最终结果为仅复制非空气方块,保持目的区域中原本会被替换为空气的方块不变。
- `replace`:执行纯粹的替换过程,用源区域的方块覆盖目标区域中的所有方块。该模式为默认值。
- `filtered`:执行一种类似于筛选的过程,使命令只复制指定方块。其本质也是一种掩码模式,但是需要再跟一些参数额外制定一个方块。
`cloneMode`枚举参数能够指定克隆模式,有以下三种类型:
- `force`:强制克隆,即使源区域与目标区域有重叠。
- `move`:移动克隆,并将源区域替换为空气。如果掩码模式为`filtered`,只有被指定的克隆的方块位置才会替换为空气。
- `noraml`:正常克隆,不强制或移动。该模式为默认值。
## 音效命令
### playsound
`playsound`命令用于在游戏中播放一条声音。其语法如下:
```shell
playsound <sound: string> [player: target] [position: x y z] [volume: float] [pitch: float] [minimumVolume: float]
```
其中`sound`参数必须指定一个`sound_definitions.json`中定义的声音事件,例如`mob.fox.ambient`
## 粒子命令
### particle
`particle`命令的主要作用是在游戏中生成一个国际版粒子发射器。
```shell
particle <effect: string> <position: x y z>
```
`effect`参数是粒子发射器的ID必须带有命名空间。`position`是粒子发射器生成的初坐标,之后发射器可能会根据其定义文件里的配置情况而改变位置。

View File

@@ -0,0 +1,51 @@
---
front: https://nie.res.netease.com/r/pic/20211104/69055361-2e7a-452f-8b1a-f23e1262a03a.jpg
hard: 高级
time: 10分钟
---
# 挑战:实体叠叠乐
在本节中,我们一起来进行一个挑战——实体叠叠乐。我们将运用目标选择器和命令相配合,制作一组叠高高的实体。
## 召唤实体
为了制作叠高高的实体,我们先召唤出一个基础实体,比如一个**尸壳****Husk**)。尸壳在白天不会燃烧,所以我们可以放心将其召唤出来。我们使用尸壳的刷怪蛋召唤出一个尸壳。
![召唤尸壳](./images/4.6_husk.png)
## 为尸壳命名
我们希望使用`/ride`命令来使一个尸壳骑乘另一个尸壳,然而尸壳不是玩家,所以不能使用玩家名作为`target`类型的参数值,我们必须使用目标选择器。为了使目标尸壳被精确选中,我们可以使用`name`选择器参数,因此我们需要给这个尸壳命名。使用铁砧和命名牌使尸壳获得一个名字。
![命名牌](./images/4.6_nametag_renaming.png)
![尸壳命名](./images/4.6_named_husk.png)
## 为尸壳添加一个骑手
我们先为该尸壳添加一个**骑手****Rider**),即让另一个尸壳骑乘在该尸壳的头上。我们使用`/ride`命令的`summon_rider`参数,这个参数可以召唤一个新的实体充当骑手。
```shell
/rider @e[name=叠叠乐演示实体] summon_rider husk
```
![summon_rider](./images/4.6_ride_summon_rider.png)
可以看到,我们使用了`@e`选择器配合`name`参数精确指定到了该实体。执行成功后,我们可以看到这个尸壳头上已经出现了一个新的尸壳。
![两个尸壳](./images/4.6_husk_with_rider.png)
## 为尸壳添加一个坐骑
我们还可以让这个尸壳再坐在另一个尸壳的身上,所以我们可以继续用`/ride`命令为其添加一个**坐骑****Ride**)。我们只需要将`summon_rider`参数改为`summon_ride`,即可成功添加一个坐骑。
```shell
/rider @e[name=叠叠乐演示实体] summon_ride husk
```
![summon_ride](./images/4.6_ride_summon_ride.png)
成功之后,我们看到了三个尸壳坐在一起,颇有叠高高的风味。
![三个尸壳](./images/4.6_husk_with_rider_and_ride.png)