声明:
1. 本系列教程默认读者拥有关于Minecraft游戏本身的基础了解。
2. 本系列全部教程绝对适用于当前Java最新版 (1.19.3) 。
3. 本系列教程致力于基础原理而非使用方法,因为某些原因,这是本声明里最重要的一条。
4. 本教程 需要读者有特定的命令知识。这些这些内容在 下方表格中列出 :
<<<<<< 返回系列目录 ←←
需要前置知识:
请确保你理解下列的内容。下表的所有内容一定在本系列教程的某一帖讨论过,所以若您是从本系列第一帖起阅读至今,可以不用看。
对于跳跃式阅读的读者,还请检查一番:
前言
在前几天说过,玩家的NBT是不能被直接修改的。
这导致了,曾经,直接更改玩家的属性——比如攻击力或生命值是一种无法实现的东西。
曾经,我们想要更改玩家的属性,只能为其加上状态效果,或是装备。也衍生出了很多可以影响玩家攻击力的方法。
但是,从1.16,一个新的命令被加入到Minecraft,改变了这种局面。
我们终于可随意地更改任意实体的属性了!!!
这包括攻击力,移动速度,生命值护甲值击退抗性等等等等……
这个命令,叫/attribute
(如你在标题所见的,我拿到这玩意干的的一件事就是把攻击力加到100万(闭眼按零),然后一拳锤爆了末影龙)
玩家的能力有多大?
你的 生命值上限 有20点。
基础 攻击力 只有1点。
而基础 护甲值 ,
是什么决定了你的各种能力的大小?
是 属性(Attributes) 。
玩家——或任何生物或实体,都拥有属性。
这些属性决定了实体在游戏中的一切能力。
但属性并不是永远固定的。玩家的 基础 攻击力只有1点,但是通过持有武器,我们的攻击力可以被 修改 。
也就是说,
这就是属性的基础机制。
每个属性都有一个 属性ID 以作区分。比如, 生命值上限 的属性ID是 generic.max_health 。
下表列出了Minecraft中存在的所有属性以及ID:
属性 列表
| 属性名称 | 属性ID | 概述 |
|
•
|
任何实体都拥有的属性: | 以下属性可以在 任意 实体上找到 |
|
生命值上限
|
generic.max_health
|
最大生命值。生物能恢复的生命值上限。玩家默认为20点。(生存无提升手段)
|
|
移动速度
|
generic.movement_speed | 移动的速度。数值越高越快。玩家的默认移速为0.1。你可以使用公式43.178 * 属性值 - 0.022 来计算大致的,以格/米作单位的速度。 |
| 盔甲值 | generic.armor | 对物理伤害的抵抗性。每一点可抵挡4%的物理伤害。玩家的默认数值为0。(通过穿戴护甲可以提升) |
| 盔甲韧性 | generic.armor_toughness | 当实体受的伤害变高时,盔甲所能减免的伤害比例会逐渐降低,盔甲韧性可以减缓它降低的幅度。该属性玩家默认为0。(钻石与下界合金可以提供本属性加成)你可以 前往Wiki本页面查看盔甲公式 。 |
| 击退抗性 | generic.knockback_resistance |
减免的击退。0代表无防御,1代表无法击退。0与1中间的数值代表减免的百分比。玩家默认为0。
(下界合金装给予击退抗性) |
|
•
|
可攻击实体的属性: | 这些属性可以在所有 能够进行攻击 的实体上找到。(如被动生物便没有以下属性) |
|
攻击力
|
generic.attack_damage | 普通攻击造成的伤害。玩家默认为1。(装备武器可以增加) |
|
•
|
玩家专属属性: | 只有 玩家 拥有以下属性 |
| 攻击速度 | generic.attack_speed | 本数值代表了玩家每秒可以进行的攻击速度。玩家默认为4。 |
| 幸运值 | generic.luck |
幸运值。这影响了战利品表的掉落。(比如打开宝箱,击杀怪物等)。玩家默认为0。
(幸运状态效果可增加本属性) |
|
•
|
非玩家生物 的属性: | 以下属性只能在 非玩家生物 上找到 |
| 追踪距离 | generic.follow_range | 生物追逐玩家或其他实体的最大距离。这可以是怪物的追踪,抑或是狼追逐骷髅,猪追逐手持胡萝卜的玩家。 |
|
•
|
特定生物专属属性:
|
下列属性只有特定的生物拥有:
|
| 击退力度 | generic.attack_knockback |
攻击时的击退力度。
仅
疣猪兽,劫掠兽,与僵尸疣猪兽
|
| 跳跃力 | horse.jump_strength | 马的跳跃力。衡量标准不明。默认为0.7左右。 马专属属性 |
|
生成增援
|
zombie.spawn_reinforcements | 僵尸攻击时在其周围生成更多僵尸的可能性。 仅僵尸及其变种 |
| 飞行速度 | generic.flying_speed | 飞行速度。衡量标准不明。 仅鹦鹉拥有 |
就像你看到的这样,目前MC共有14种属性 【注1】 。这些属性控制了所有实体的能力。
下面让我们来进入正题:1.16新增的命令 /attribute 可以获取,或修改指定实体的属性。
该命令拥有3个子命令:用于获取属性值的get,用于修改属性基值的set,与用于修改属性加成的modifier。
首先让我们来看向,读取子命令get。
2. 获取属性
命令/attribute的子命令get可以读取指定实体特定属性的基值或最终值。
格式:
- /attribute <目标> <属性ID> [base] get [<倍率>]
在该命令中,<目标>应为一个只能选择一个实体(limit=1)的选择器(和/data一样,本命令一次只能对一个实体操作)。
中间的 [ base ] 是一个选填项。 填入 就代表获取该属性的 基值 , 缺省 则意味获取该属性的 最终数值 (经装备加成后)。
最后,可以通过[<倍率>]来指定返回的倍率。 【注2】
比如,上表中可以看到,攻击力的属性ID是 generic.attack_damage 。
现在假设我拿着一把钻石剑(提供攻击力+6),那么该如何得到我当前的攻击力呢?
- /attribute @s generic.attack_damage get
此时游戏会返回“7”。因为玩家有1点基础攻击力,钻石剑+6,所以最后为7。
注意我们缺省了" base ",所以游戏返回的是我们的 最终数值 (经过钻石剑加成后的)。
但若是填入" base ":
- /attribute @s generic.attack_damage base get
此时游戏不再返回7,而回返回玩家的基础攻击力1。因为本命令获取的是 基值 ,即 忽略武器装备的加成 。
好,更多的例子:
例1
假设,一名普通的玩家手持钻石剑(也只手持钻石剑)。
获取该玩家目前的攻速:
- /attribute @p generic.attack_speed get
这代表了,手持钻石剑时,玩家的攻速为1.6(每秒可全力攻击1.6次)
获取玩家的基础攻速:
- /attribute @p generic.attack_speed base get
这代表玩家的攻速基值为4(每秒全力攻击4次,是的,手持武器会降低你的攻速)
例2
获得最近僵尸的追踪距离:
- /attribute @e[limit=1,type=minecraft:zombie,sort=nearest] minecraft:generic.follow_range base get
例3
假设一普通玩家穿着全套钻石装:
获取护甲最终值(加成后):
- /attribute @p generic.armor get
获取基值:
- /attribute @p generic.armor base get
好,例子举到这里
看完了读取……现在就进入到非常令人激动的部分:修改吧。
命令/attribute有两种不同的“修改”。一种是修改基础数值,一种是修改“加成数值”(相当于给你一加一个虚拟的武器)。
让我们先进入到第一种,修改基值。
3. 修改基值
玩家的基础攻击力也太低了吧……万一生存第一天就遇到僵尸,使用低的可怜的1点攻击力,你得敲它20次才能把它敲死。
没关系,这里我们就来修改一下玩家的基础属性:
格式:
- /attribute <目标> <属性ID> base set <值>
我们可以看到本格式与读取子命令十分相近,有区别的部分只是“<值>”与前面的get变成了set。
所以,我们实际上可以很容易地得到:
- /attribute @s generic.attack_damage base set 20
现在尝试攻击僵尸,你一拳就可以打倒。
当然,我们可以刺激点:
- /attribute @s generic.attack_damage base set 2000
现在末影龙你也能一拳打倒了。
那,最大可以设到多高呢?
很夸张,夸张到可以闭眼按0:
- /attribute @s generic.attack_damage base set 100000000000000000000000000000000000
夸张吧……那,这该数值的上限是多少呢?
这个值是一个 double ……意思就是,在极端情况下你可以存 308 位数。是的。然而,每种属性都有一个接受范围。如果你输入的值大于这个范围,那么属性就会被设为最大可接受的值。
比如,攻击力的最大上限是2048,所以虽然你在上面的命令中输入了一个大的离谱的数字,但是游戏会把属性设为2048。
(小于最低值同理)
好,从夸张的数字中钻出来,我们也可以设置小数:
- /attribute @s generic.attack_damage base set 0.000001
(基本上相当于没有。)
小数在一些属性上使用频繁,比如速度或击退抗性:
- /attribute @s generic.knockback_resistance base set 0.9
我们从上面的表格可以看到对于击退抗性1就代表完全抵抗,所以这里0.9即可抵挡90%。
到这里,我们要再次提醒:
为了让你明白这一点,以与下面的内容区分,让我们举这样一个例子:
假设有玩家,其基础攻击力为1:
- /attribute @s generic.attack_damage base get
- 读取该玩家 基础 攻击力
-
返回1
他手持钻石剑,为他增加了6点加成数值:
- /attribute @s generic.attack_damage get
- 读取该玩家 最终 攻击力
-
返回7
现在运行命令:
- /attribute @s generic.attack_damage base set 4
再次读取其攻击力:
- /attribute @s generic.attack_damage get
- 读取该玩家 最终 攻击力
-
返回10
注意,我们所增加的是增 基础攻击力 ,所以:
- /attribute @s generic.attack_damage base get
- 读取该玩家 基础 攻击力
-
返回4
如何?
那好,本节就到这里。
这里有更多的例子,你可以展开查看。
4. 属性修饰符
在上面,我们讲述了如何更改 基础 值 。
我们可以轻易地将玩家变成神,抑或是手无搏鸡之力的恐怖地图受害者。
但是一款游戏,角色只有基础数值是的话是很空虚的。
除了游戏角色本身的属性,当其佩戴装备时,一般会有属性的加成。
Minecraft不例外哈。玩家的基础攻击力只有 1 点,但是钻石剑拥有 +6 点的属性加成。
基础数值经过加成数值的“ 洗礼 ”后,才是最终的属性, 7 。 (1+6)
钻石剑为我们提供了加成数值。但这所谓的“加成数值”是有学名的。
当实体的基础数值经过属性修饰器的运算后,就会得到最终数值。
正常来讲啊,在普通生存中,属性修饰器一般由装备给予,比如,上面讲的,使用钻石剑。
但实际上不止装备,修饰器有时也会由其他道具,比如药水(状态效果)添加。比如,Ⅰ级的力量药水会给予3点额外攻击力……或者说,拥有1级力量效果会给予玩家一个 攻击力+3 的属性修饰器。
或者……属性修饰器也可以由游戏机制给予……比如,你是怎么疾跑的?
你之所以可以疾跑,是因为在疾跑时游戏给予了你一个 速度+130% 的属性修饰器。
为什么女巫在喝药水的时候会减速(你也会)?因为游戏为其添加了一个 速度-0.25 的属性修饰器。
你可能看出来了,
5. 使用/attribute modifier
命令/attribute的子命令/attribute modifier用于管理目标上的自定义属性修饰符。
先来说,如何添加一个属性修饰器:
格式:
- /attribute <目标> <属性ID> modifier add <UUID> <名称> <值> <运算>
嚯,这个语法里有挺多陌生的东西嘛……
<UUID>是什么?<名称>又是什么?这个我们要一个一个看。
5.1 UUID
复制代码
- /attribute <目标> <属性ID> modifier add <UUID> <名称> <值> <运算>
首先,来看一下UUID是什么。
各位知道 ID ( Id entity, 识别码) 是什么吧。
用于区分不同东西的一个“身 0 份 0 证”。
那知道 UID ( U nique Id entifier, 唯一识别码) 是什么么?
和ID差不多的东西。
论坛就在用,区分不同用户。Unique是在说,这种ID具有 唯一性 。(不然怎么区分不同用户)
那么,UUID又是什么呢?
通用唯一识别码( U niversally U nique Id entifier , UUID ) 。
看名字就知道,这和ID差不多,实际上就是一串用于区分不同东西的数字而已。
只不过,"唯一"指明了这串码不会重复 【注3】 ,“通用”说明这是国际通用的标准。
是的,不止Minecraft在用,UUID也不是Mojang发明的。世界上所有的UUID都由一套算法生成。
简单概括:
我们不会深入接触,有兴趣的话可以在 百科: UUID 查看。这里你只需要知道这是一种ID就好了。
回到命令上:为什么添加一个属性修饰符需要一个UUID呢?
当然是为了区分多个不同的UUID啊。
你想想,你可以添加那么多不同的属性修饰器,当然需要某种方法来区分啦。
UUID长这样:
数字-数字-数字-数字-数字
由5个数字组成,中间以连字符相接。比如:
0-0-0-0-0
这就是一个UUID了。
任意更改数字就可以创造出其他UUID。比如:
88888888-4632-4444-3333-3141592657
可以随意乱编,但注意对于任意实体,其所有的属性修饰器的UUID必不能重复。同时你要把UUID记下来,不然无法对一个已添加的属性修饰符做出更改或删除——游戏完全使用UUID来区分不同的属性修饰器。
所以我推荐别弄得太复杂。
注意:
1. 这只是UUID的一种表现形式,还有其他的比如高 低 位,以及在NBT说过的整形数列 等 。
2. 这是十六进制。所以可以用A~F,比如 1-A-fab3-231-ABCDEF123456 这样。 在上面为了简化没有说
5.2 <名称>
复制代码
- /attribute <目标> <属性ID> modifier add <UUID> <名称> <值> <运算>
接下来:什么是名称?
是的,这里可以随便填。什么都行,愿意填什么填什么,重复也可以。
这有点像是记分板或队伍的显示名称一样的东西。除了使用/data,你在加入这个属性修饰器后就再也无法看见它。
(这个名称大概是用来方便记录的。毕竟UUID一串数很难记。用/data可以筛选出拥有特定名称的属性修饰器……但还是没啥用因为对于玩家想删除还是要用/attribute,还是要用UUID)
5.3 <值> 与 <运算>
复制代码
- /attribute <目标> <属性ID> modifier add <UUID> <名称> <值> <运算>
让我们看向最后两个元素:
值与运算。
这是什么呢?这两个元素是在说,该属性修饰器要对属性作出怎样的更改。
其中<运算>其实就是运算。比如是加法“ 攻击力+6 ”还是乘法“ 攻击力×150% (攻击力×1.5) ”。
而值就是那个被加或者乘上去的数字。
属性修饰器是相当于给基础数值套个公式,算出最终属性。
可以利用的运算,有三种:
即 增加(add) , 倍率(multiply_base) ,与 最终倍乘(multiply) 。
先不看那么多复杂的玩意,我们只用增加,先把我们的第一条命令写出来:
- /attribute @s generic.attack_damage modifier add 0-0-0-0-0 sha_dou_xing 3 add
这条命令为目标的 攻击力 属性增加了一个 攻击力+3 的属性修饰器,其UUID为 0-0-0-0-0 。
解析:
这就是你的第一条命令啦
但是除了运算add,也就是增加,我们还有另外两种运算:下面将深入了解:
5.4 运算
可以利用的运算,有三种:增加(add),倍率(multiply_base),与最终倍乘(multiply)。
公式是这样的:
最终属性值 = [( 基值 + 修饰符: 增加数值 ) × (1 + 修饰符: 倍率 )] × 修饰符: 最终倍乘
让我们一个个来:
增加(又名:属性增量)(add)
首先,你可以对一个属性做加(减)法。
假设某玩家的基础攻击力是1, 没有 属性修饰器,那么该玩家的最终攻击力就是:
最终属性值 = [( 基础数值 + 增加数值 ) × (1 + 倍率 )] × 最终倍乘
= [( 1 + 0 ) × 1 ] × 1
= 1 × 1 × 1
= 1
然后我们用/attribute命令为其添加了一个攻击力+3的属性修饰器——
- /attribute @s generic.attack_damage modifier add 0-0-0-0-0 sha_dou_xing 3 add
那么,该玩家的最终攻击力就是:
最终属性值 = [( 基础数值 + 增加数值 ) × (1 + 倍率 )] × 最终倍乘
= [( 1 + 3 ) × 1 ] × 1
= 4 × 1 × 1
= 4
-
拥有多个增加类属性修饰器时,会相加:
假设我们又给了该玩家一个攻击力+1的属性修饰器。
- /attribute @s generic.attack_damage modifier add 0-0-0-0-1 sha_dou_xing2 1 add
那么,该玩家的最终攻击力就是:
最终属性值 = [( 基础数值 + 增加数值 ) × (1 + 倍率 )] × 最终倍乘
= [( 1 + 3+1 ) × 1 )] × 1
= 5 × 1 × 1
= 5
理解了么?
倍率(又名:倍率增量)(multiply_base)
倍率 ,或者说“倍率增量”,会将指定一个倍率。或者说,乘以一个值。注意这在增加运算后运行,换句话说,乘的是已经被增加后的值。
继续上面的假设:
在拥有上面说过的 攻击力+3,+1 的同时,我们再添加一个倍率属性修饰器 攻击力+50% :
- /attribute @s generic.attack_damage modifier add 0-0-0-0-2 sha_dou_xing 0.5 multiply_base
最终属性值 = [( 基础数值 + 增加数值 ) × (1 + 倍率 )] × 最终倍乘
= [( 1 + 3+1 ) × ( 1 + 0.5 )] × 1
= 5 × 1.5 × 1
= 7.5
注意,倍率在加法之后算。
-
若有多个倍率的属性修饰器,倍率数值将按加法叠加:
添加一个攻击力-20%的属性修饰器:
- /attribute @s generic.attack_damage modifier add 0-0-0-0-3 sha_dou_xing -0.2 multiply_base
最终属性值 = [( 基础数值 + 增加数值 ) × (1 + 倍率 )] × 最终倍乘
= [( 1 + 3+1 ) × ( 1 + 0.5 - 0.2 )] × 1
= 5 × 1.3 × 1
= 6.5
最终倍乘(multiply)
最终倍称也是乘法,在倍率之后运行。于倍率不同之处在于多个最终倍称 以乘法叠加 而非加法:
继续上面的例子:
我们在原来的基础上再为玩家添加一个值为2的最终倍称:
- /attribute @s generic.attack_damage modifier add 0-0-0-0-4 sha_dou_xing 2 multiply
最终属性值 = [( 基础数值 + 增加数值 ) × (1 + 倍率 )] × 最终倍乘
= [( 1 + 3+1 ) × ( 1 + 0.5 - 0.2 )] × 2
= 5 × 1.3 × 2
= 13
-
若有多个最终倍乘的属性修饰器,数值将按乘法叠加。
如,在原来的基础上我们再添加一个最终倍乘5的属性修饰器:
- /attribute @s generic.attack_damage modifier add 0-0-0-0-5 sha_dou_xing 5 multiply
最终属性值 = [( 基础数值 + 增加数值 ) × (1 + 倍率 )] × 最终倍乘
= [( 1 + 3+1 ) × ( 1 + 0.5 - 0.2 )] × (2 × 5)
= 5 × 1.3 × 10
= 65
以上就是所有的关于添加属性修饰器的格式了。
当然,一个完整的命令不会只能添加不能删除的。
所以,让我们继续:
5.5 读取与删除
如果你突然忘记了某个属性修饰器是什么了,可以使用以下命令读取:
- /attribute <目标> <属性ID> modifier value get <UUID> [<倍率>]
比如:
- /attribute @p generic.movement_speed modifier value get 0-0-0-0-0
这里要求你提供UUID,这就是为什么需要你记下UUID的原因。
本教程的最后,如果你不想要一个属性修饰器,可以将其删除:
- /attribute <目标> <属性ID> modifier remove <UUID>
比如:
- /attribute @p generic.movement_speed modifier remove 0-0-0-0-0
就这些了哦
最后做提醒,给玩家的属性修饰器在玩家死亡时会消失。
总结
以下提供了总结,来梳理本帖的内容:
Key Ideas
- 实体拥有属性,决定了他们的能力
- 有些属性是共用的,有些属性是特定实体独有。
- 属性拥有ID以作区分。
- 最终属性由两部分组成:基础属性,与属性修饰器(属性加成)
- /attribute是一个仅Java拥有的用于管理属性的命令。
- 它可以读取命令,格式为/attribute <目标> <属性ID> [base] get [<倍率>]
-
base可以用于代表读取基值。
- 本命令可以管理属性修饰器。
- 可以添加:/attribute <目标> <属性ID> modifier add <UUID> <名称> <值> <运算>
- UUID为一种ID,样式类似0-0-0-0-0。
- 名称无关效果
-
运算分为三种,增加(add),倍率(multiply_base),与最终倍乘(multiply)。
- 删除属性修饰器:/attribute <目标> <属性ID> modifier remove <UUID>
以上就是今天的全部内容。
……好好好是我懒,鸽了两周。
但这也是不可抗力好吧!真的哦!
下一帖不会很慢啦。
换了新的排版,喜欢么?
顺手求支持。
偶,还有,
要高/中考的各位,祝你们好运。
附录,注释,与外部链接
【1】战斗测试(CombatTest)中有另外两种关于攻击范围的属性。
【2】由于一个Bug,倍率后的值无法在聊天框中被显示出来。虽然使用/execute store 可以得到正确的数字。考略到没讲到/execute,这里跳过倍率没有举任何例子。
【3】不是完全唯一。重复地随机生成有极低几率重复,可以忽略。
另见:
Wiki:命令/attribute
百科: UUID
Wiki: 战斗测试CombatTest
附录:勿使用以下UUID:
#更新日志
Java 1.16.5/a 页面发布
Java 1.17/a 1.17更新完成
Java 1.17/b 更改了关于攻速的误导信息
Java 1.18/a 1.18版本升级完成
Java 1.19.3/a 1.19升级完成
上一篇: 【命令】命令教程“真”从零开始(十三)给予与替换物品,命令/replaceitem
索引:系列《命令教程“真”从零开始》
下一篇: 【命令】命令教程“真”从零开始(十五)最接近神的一次:填充命令/fill[1.17]
2021.12 数据,可能有更多内容
☆命令教程“真”从零开始(十四) ☆ ☆ 修改属性/attribute【一拳打爆末影龙】 ☆声明:
1. 本系列教程默认读者拥有关于Minecraft游戏本身的基础了解。
2. 本系列全部教程绝对适用于当前Java最新版 (1.17) 。
3. 本系列教程致力于基础原理而非使用方法,因为某些原因,这是本声明里最重要的一条。
4. 本教程 需要读者有特定的命令知识。这些这些内容在 下方表格中列出 :
需要前置知识:
请确保你理解下列的内容。下表的所有内容一定在本系列教程的某一帖讨论过,所以若您是从本系列第一帖起阅读至今,可以不用看。
对于跳跃式阅读的读者,还请检查一番:
※ 带有本符号的内容是阅读本帖的大前提,您必须理解。
• 带有本符号的内容意味着,若您不理解可能会对阅读本帖的特定片段造成困扰,但大体上可以看懂。
点击链接可以跳转至对应教程:
※ 有关命令基础格式 【命令】命令教程“真”从零开始 (一) 指令本身,选择器,与命令方块 [1.16]
前言
在前几天说过,玩家的NBT是不能被直接修改的。
这导致了,曾经,直接更改玩家的属性——比如攻击力或生命值是一种无法实现的东西。
曾经,我们想要更改玩家的属性,只能为其加上状态效果,或是装备。也衍生出了很多可以影响玩家攻击力的方法。
但是,从1.16,一个新的命令被加入到Minecraft,改变了这种局面。
我们终于可随意地更改任意实体的属性了!!!
这包括攻击力,移动速度,生命值护甲值击退抗性等等等等……
这个命令,叫/attribute
(如你在标题所见的,我拿到这玩意干的的一件事就是把攻击力加到100万(闭眼按零),然后一拳锤爆了末影龙)
1. 属性
玩家的能力有多大?
你的 生命值上限 有20点。
基础 攻击力 只有1点。
而基础 护甲值 ,
是什么决定了你的各种能力的大小?
是 属性(Attributes) 。
玩家——或任何生物或实体,都拥有属性。
这些属性决定了实体在游戏中的一切能力。
但属性并不是永远固定的。玩家的 基础 攻击力只有1点,但是通过持有武器,我们的攻击力可以被 修改 。
也就是说,
最终的属性由两部分决定:
这就是属性的基础机制。
每个属性都有一个 属性ID 以作区分。比如, 生命值上限 的属性ID是 generic.max_health 。
下表列出了Minecraft中存在的所有属性以及ID:
属性 列表
| 属性名称 |
| 属性ID |
| 概述 |
| • |
| 任何实体都拥有的属性: |
| 以下属性可以在 任意 实体上找到 |
| 生命值上限 |
| generic.max_health |
| 最大生命值。生物能恢复的生命值上限。玩家默认为20点。(生存无提升手段) |
| 移动速度 |
| generic.movement_speed |
| 移动的速度。数值越高越快。玩家的默认移速为0.1。你可以使用公式43.178 * 属性值 - 0.022 来计算大致的,以格/米作单位的速度。 |
| 盔甲值 |
| generic.armor |
| 对物理伤害的抵抗性。每一点可抵挡4%的物理伤害。玩家的默认数值为0。(通过穿戴护甲可以提升) |
| 盔甲韧性 |
| generic.armor_toughness |
| 当实体受的伤害变高时,盔甲所能减免的伤害比例会逐渐降低,盔甲韧性可以减缓它降低的幅度。该属性玩家默认为0。(钻石与下界合金可以提供本属性加成)你可以 前往Wiki本页面查看盔甲公式 。 |
| 击退抗性 |
| generic.knockback_resistance |
|
减免的击退。0代表无防御,1代表无法击退。0与1中间的数值代表减免的百分比。玩家默认为0。
(下界合金装给予击退抗性) |
| • |
| 可攻击实体的属性: |
| 这些属性可以在所有 能够进行攻击 的实体上找到。(如被动生物便没有以下属性) |
|
攻击力
|
| generic.attack_damage |
| 普通攻击造成的伤害。玩家默认为1。(装备武器可以增加) |
| • |
| 玩家专属属性: |
| 只有 玩家 拥有以下属性 |
| 攻击速度 |
| generic.attack_speed |
| 本数值代表了玩家每秒可以进行的攻击速度。玩家默认为4。 |
| 幸运值 |
| generic.luck |
|
幸运值。这影响了战利品表的掉落。(比如打开宝箱,击杀怪物等)。玩家默认为0。
(幸运状态效果可增加本属性) |
| • |
| 非玩家生物 的属性: |
| 以下属性只能在 非玩家生物 上找到 |
| 追踪距离 |
| generic.follow_range |
| 生物追逐玩家或其他实体的最大距离。这可以是怪物的追踪,抑或是狼追逐骷髅,猪追逐手持胡萝卜的玩家。 |
| • |
|
特定生物专属属性:
|
|
下列属性只有特定的生物拥有:
|
| 击退力度 |
| generic.attack_knockback |
|
攻击时的击退力度。
仅
疣猪兽,劫掠兽,与僵尸疣猪兽
|
| 跳跃力 |
| horse.jump_strength |
| 马的跳跃力。衡量标准不明。默认为0.7左右。 马专属属性 |
|
生成增援
|
| zombie.spawn_reinforcements |
| 僵尸攻击时在其周围生成更多僵尸的可能性。 仅僵尸及其变种 |
| 飞行速度 |
| generic.flying_speed |
| 飞行速度。衡量标准不明。 仅鹦鹉拥有 |
就像你看到的这样,目前MC共有14种属性 【注1】 。这些属性控制了所有实体的能力。
下面让我们来进入正题:1.16新增的命令 /attribute 可以获取,或修改指定实体的属性。
该命令拥有3个子命令:用于获取属性值的get,用于修改属性基值的set,与用于修改属性加成的modifier。
首先让我们来看向,读取子命令get。
2. 获取属性
注意:本命令为Java版独有
命令/attribute的子命令get可以读取指定实体特定属性的基值或最终值。
格式:
代码:
- /attribute <目标> <属性ID> [base] get [<倍率>]
在该命令中,<目标>应为一个只能选择一个实体(limit=1)的选择器(和/data一样,本命令一次只能对一个实体操作)。
中间的 [ base ] 是一个选填项。 填入 就代表获取该属性的 基值 , 缺省 则意味获取该属性的 最终数值 (经装备加成后)。
最后,可以通过[<倍率>]来指定返回的倍率。 【注2】
比如,上表中可以看到,攻击力的属性ID是 generic.attack_damage 。
现在假设我拿着一把钻石剑(提供攻击力+6),那么该如何得到我当前的攻击力呢?
代码:
- /attribute @s generic.attack_damage get
此时游戏会返回“7”。因为玩家有1点基础攻击力,钻石剑+6,所以最后为7。
注意我们缺省了" base ",所以游戏返回的是我们的 最终数值 (经过钻石剑加成后的)。
但若是填入" base ":
代码:
- /attribute @s generic.attack_damage base get
此时游戏不再返回7,而回返回玩家的基础攻击力1。因为本命令获取的是 基值 ,即 忽略武器装备的加成 。
好,更多的例子:
例1
假设,一名普通的玩家手持钻石剑(也只手持钻石剑)。
获取该玩家目前的攻速:
代码:
- /attribute @p generic.attack_speed get
这代表了,手持钻石剑时,玩家的攻速为1.6(每秒可全力攻击1.6次)
获取玩家的基础攻速:
代码:
- /attribute @p generic.attack_speed base get
这代表玩家的攻速基值为4(每秒全力攻击4次,是的,手持武器会降低你的攻速)
例2
获得最近僵尸的追踪距离:
代码:
- /attribute @e[limit=1,type=minecraft:zombie,sort=nearest] minecraft:generic.follow_range base get
例3
假设一普通玩家穿着全套钻石装:
获取护甲最终值(加成后):
代码:
- /attribute @p generic.armor get
获取基值:
代码:
- /attribute @p generic.armor base get
好,例子举到这里
看完了读取……现在就进入到非常令人激动的部分:修改吧。
命令/attribute有两种不同的“修改”。一种是修改基础数值,一种是修改“加成数值”(相当于给你一加一个虚拟的武器)。
让我们先进入到第一种,修改基值。
3. 修改基值
玩家的基础攻击力也太低了吧……万一生存第一天就遇到僵尸,使用低的可怜的1点攻击力,你得敲它20次才能把它敲死。
没关系,这里我们就来修改一下玩家的基础属性:
格式:
代码:
- /attribute <目标> <属性ID> base set <值>
我们可以看到本格式与读取子命令十分相近,有区别的部分只是“<值>”与前面的get变成了set。
所以,我们实际上可以很容易地得到:
代码:
- /attribute @s generic.attack_damage base set 20
现在尝试攻击僵尸,你一拳就可以打倒。
当然,我们可以刺激点:
代码:
- /attribute @s generic.attack_damage base set 2000
现在末影龙你也能一拳打倒了。
那,最大可以设到多高呢?
很夸张,夸张到可以闭眼按0:
代码:
- /attribute @s generic.attack_damage base set 100000000000000000000000000000000000
夸张吧……那,这该数值的上限是多少呢?
这个值是一个 double ……意思就是,在极端情况下你可以存 308 位数。是的。然而,每种属性都有一个接受范围。如果你输入的值大于这个范围,那么属性就会被设为最大可接受的值。
比如,攻击力的最大上限是2048,所以虽然你在上面的命令中输入了一个大的离谱的数字,但是游戏会把属性设为2048。
(小于最低值同理)
好,从夸张的数字中钻出来,我们也可以设置小数:
代码:
- /attribute @s generic.attack_damage base set 0.000001
(基本上相当于没有。)
小数在一些属性上使用频繁,比如速度或击退抗性:
代码:
- /attribute @s generic.knockback_resistance base set 0.9
我们从上面的表格可以看到对于击退抗性1就代表完全抵抗,所以这里0.9即可抵挡90%。
到这里,我们要再次提醒:
本子命令base set修改的是 基础 值 ,而非加成或最终值
为了让你明白这一点,以与下面的内容区分,让我们举这样一个例子:
假设有玩家,其基础攻击力为1:
代码:
- /attribute @s generic.attack_damage base get
- 读取该玩家 基础 攻击力
-
返回1
他手持钻石剑,为他增加了6点加成数值:
代码:
- /attribute @s generic.attack_damage get
- 读取该玩家 最终 攻击力
-
返回7
现在运行命令:
代码:
- /attribute @s generic.attack_damage base set 4
再次读取其攻击力:
代码:
- /attribute @s generic.attack_damage get
- 读取该玩家 最终 攻击力
-
返回10
注意,我们所增加的是增 基础攻击力 ,所以:
代码:
- /attribute @s generic.attack_damage base get
- 读取该玩家 基础 攻击力
-
返回4
如何?
那好,本节就到这里。
这里有更多的例子,你可以展开查看。
代码:
- /attribute @e[type=zombie,limit=1] generic.follow_range base set 10000
注意/attribute只能处理一个实体,所以我们添加了limit=1。
代码:
- /attribute @s generic.max_health base set 1
(噩梦UHC)
代码:
-
/attribute @r generic.movement_speed base set 100
玩家的默认移动速度为0.5,所以100是一个非常快的数值。(嗖一下)
代码:
- /attribute @s generic.attack_damage base set -1
即使是负数也可以接受为值。但是一般来讲游戏会把负数的属性值设为0。(只有幸运属性接受负值。)
4. 属性修饰符
在上面,我们讲述了如何更改 基础 值 。
我们可以轻易地将玩家变成神,抑或是手无搏鸡之力的恐怖地图受害者。
但是一款游戏,角色只有基础数值是的话是很空虚的。
除了游戏角色本身的属性,当其佩戴装备时,一般会有属性的加成。
Minecraft不例外哈。玩家的基础攻击力只有 1 点,但是钻石剑拥有 +6 点的属性加成。
基础数值经过加成数值的“洗礼”后,才是最终的属性, 7 。(1+6)
钻石剑为我们提供了加成数值。但这所谓的“加成数值”是有学名的。
这些加成,被称作 属性修饰器(Attribute Modifiers) 我们说,钻石剑提供一个 攻击力+6 的 属性修饰器
当实体的基础数值经过属性修饰器的运算后,就会得到最终数值。
正常来讲啊,在普通生存中,属性修饰器一般由装备给予,比如,上面讲的,使用钻石剑。
但实际上不止装备,修饰器有时也会由其他道具,比如药水(状态效果)添加。比如,Ⅰ级的力量药水会给予3点额外攻击力……或者说,拥有1级力量效果会给予玩家一个 攻击力+3 的属性修饰器。
或者……属性修饰器也可以由游戏机制给予……比如,你是怎么疾跑的?
你之所以可以疾跑,是因为在疾跑时游戏给予了你一个 速度+130% 的属性修饰器。
为什么女巫在喝药水的时候会减速(你也会)?因为游戏为其添加了一个 速度-0.25 的属性修饰器。
你可能看出来了,
只要,你的某属性与基础值有差,那一定是因为某个属性修饰器
以上提到的的所有属性修饰器都是由某种装备或机制提供的。
但接下来的命令,/attribute的第三个子命令, /attribute modifier ,即可为指定的实体添加一个永久的属性修饰器。
大概……相当于为目标装备一个“虚拟”的装备吧。
5. 使用/attribute modifier
命令/attribute的子命令/attribute modifier用于管理目标上的自定义属性修饰符。
先来说,如何添加一个属性修饰器:
格式:
代码:
- /attribute <目标> <属性ID> modifier add <UUID> <名称> <值> <运算>
嚯,这个语法里有挺多陌生的东西嘛……
<UUID>是什么?<名称>又是什么?这个我们要一个一个看。
5.1 UUID
代码:
- /attribute <目标> <属性ID> modifier add <UUID> <名称> <值> <运算>
首先,来看一下UUID是什么。
各位知道 ID ( Id entity,识别码) 是什么吧。
用于区分不同东西的一个“身0份0证”。
那知道 UID ( U nique Id entifier,唯一识别码) 是什么么?
和ID差不多的东西。
论坛就在用,区分不同用户。Unique是在说,这种ID具有 唯一性 。(不然怎么区分不同用户)
那么,UUID又是什么呢?
通用唯一识别码( U niversally U nique Id entifier , UUID ) 。
看名字就知道,这和ID差不多,实际上就是一串用于区分不同东西的数字而已。
只不过,"唯一"指明了这串码不会重复 【注3】 ,“通用”说明这是国际通用的标准。
是的,不止Minecraft在用,UUID也不是Mojang发明的。世界上所有的UUID都由一套算法生成。
简单概括:
UUID就是具有唯一性的,由一种通用算法生成的ID
我们不会深入接触,有兴趣的话可以在 百科:UUID 查看。这里你只需要知道这是一种ID就好了。
回到命令上:为什么添加一个属性修饰符需要一个UUID呢?
当然是为了区分多个不同的UUID啊。
你想想,你可以添加那么多不同的属性修饰器,当然需要某种方法来区分啦。
UUID长这样:
数字-数字-数字-数字-数字
由5个数字组成,中间以连字符相接。比如:
0-0-0-0-0
这就是一个UUID了。
任意更改数字就可以创造出其他UUID。比如:
88888888-4632-4444-3333-3141592657
可以随意乱编,但注意对于任意实体,其所有的属性修饰器的UUID必不能重复。同时你要把UUID记下来,不然无法对一个已添加的属性修饰符做出更改或删除——游戏完全使用UUID来区分不同的属性修饰器。
所以我推荐别弄得太复杂。
注意:
1. 这只是UUID的一种表现形式,还有其他的比如高 低 位,以及在NBT说过的整形数列 等 。
2. 这是十六进制。所以可以用A~F,比如 1-A-fab3-231-ABCDEF123456 这样。 在上面为了简化没有说
5.2 <名称>
代码:
- /attribute <目标> <属性ID> modifier add <UUID> <名称> <值> <运算>
接下来:什么是名称?
很简单:随便填
是的,这里可以随便填。什么都行,愿意填什么填什么,重复也可以。
这有点像是记分板或队伍的显示名称一样的东西。除了使用/data,你在加入这个属性修饰器后就再也无法看见它。
(这个名称大概是用来方便记录的。毕竟UUID一串数很难记。用/data可以筛选出拥有特定名称的属性修饰器……但还是没啥用因为对于玩家想删除还是要用/attribute,还是要用UUID)
5.3 <值> 与 <运算>
代码:
- /attribute <目标> <属性ID> modifier add <UUID> <名称> <值> <运算>
让我们看向最后两个元素:
值与运算。
这是什么呢?这两个元素是在说,该属性修饰器要对属性作出怎样的更改。
其中<运算>其实就是运算。比如是加法“ 攻击力+6 ”还是乘法“ 攻击力×150% (攻击力×1.5) ”。
而值就是那个被加或者乘上去的数字。
属性修饰器是相当于给基础数值套个公式,算出最终属性。
可以利用的运算,有三种:
即 增加(add) , 倍率(multiply_base) ,与 最终倍乘(multiply) 。
先不看那么多复杂的玩意,我们只用增加,先把我们的第一条命令写出来:
代码:
- /attribute @s generic.attack_damage modifier add 0-0-0-0-0 sha_dou_xing 3 add
这条命令为目标的 攻击力 属性增加了一个 攻击力+3 的属性修饰器,其UUID为 0-0-0-0-0 。
解析:
attribute <命令头> 属性命令
@s <目标> 选择执行者(自己)
generic.attack_damage <属性ID> 攻击伤害属性
modifier <子命令> 管理属性修饰器
add <子命令的子命令> 添加属性修饰器
0-0-0-0-0 <UUID> 即用于将本属性修饰器与其他的区分的ID
sha_dou_xing <名称> 基本没用的东西,填什么都行XD
3 <值> 要更改的数量
add <运算> 对基础值的运算:这里add代表增加,和上面的值连起来就是 +3
这就是你的第一条命令啦
但是除了运算add,也就是增加,我们还有另外两种运算:下面将深入了解:
5.4 运算
可以利用的运算,有三种:增加(add),倍率(multiply_base),与最终倍乘(multiply)。
公式是这样的:
最终属性值 = [( 基值 + 修饰符: 增加数值 ) × (1 + 修饰符: 倍率 )] × 修饰符: 最终倍乘
让我们一个个来:
增加(又名:属性增量)(add)
首先,你可以对一个属性做加(减)法。
假设某玩家的基础攻击力是1, 没有 属性修饰器,那么该玩家的最终攻击力就是:
最终属性值 = [( 基础数值 + 增加数值 ) × (1 + 倍率 )] × 最终倍乘
= [( 1 + 0 ) × 1 ] × 1
= 1 × 1 × 1
= 1
然后我们用/attribute命令为其添加了一个攻击力+3的属性修饰器——
代码:
- /attribute @s generic.attack_damage modifier add 0-0-0-0-0 sha_dou_xing 3 add
那么,该玩家的最终攻击力就是:
最终属性值 = [( 基础数值 + 增加数值 ) × (1 + 倍率 )] × 最终倍乘
= [( 1 + 3 ) × 1 ] × 1
= 4 × 1 × 1
= 4
-
拥有多个增加类属性修饰器时,会相加:
假设我们又给了该玩家一个攻击力+1的属性修饰器。
代码:
- /attribute @s generic.attack_damage modifier add 0-0-0-0-1 sha_dou_xing2 1 add
那么,该玩家的最终攻击力就是:
最终属性值 = [( 基础数值 + 增加数值 ) × (1 + 倍率 )] × 最终倍乘
= [( 1 + 3+1 ) × 1 )] × 1
= 5 × 1 × 1
= 5
理解了么?
倍率(又名:倍率增量)(multiply_base)
倍率 ,或者说“倍率增量”,会将指定一个倍率。或者说,乘以一个值。注意这在增加运算后运行,换句话说,乘的是已经被增加后的值。
继续上面的假设:
在拥有上面说过的 攻击力+3,+1 的同时,我们再添加一个倍率属性修饰器 攻击力+50% :
代码:
- /attribute @s generic.attack_damage modifier add 0-0-0-0-2 sha_dou_xing 0.5 multiply_base
最终属性值 = [( 基础数值 + 增加数值 ) × (1 + 倍率 )] × 最终倍乘
= [( 1 + 3+1 ) × ( 1 + 0.5 )] × 1
= 5 × 1.5 × 1
= 7.5
注意,倍率在加法之后算。
-
若有多个倍率的属性修饰器,倍率数值将按加法叠加:
添加一个攻击力-20%的属性修饰器:
代码:
- /attribute @s generic.attack_damage modifier add 0-0-0-0-3 sha_dou_xing -0.2 multiply_base
最终属性值 = [( 基础数值 + 增加数值 ) × (1 + 倍率 )] × 最终倍乘
= [( 1 + 3+1 ) × ( 1 + 0.5 - 0.2 )] × 1
= 5 × 1.3 × 1
= 6.5
最终倍乘(multiply)
最终倍称也是乘法,在倍率之后运行。于倍率不同之处在于多个最终倍称 以乘法叠加 而非加法:
继续上面的例子:
我们在原来的基础上再为玩家添加一个值为2的最终倍称:
代码:
- /attribute @s generic.attack_damage modifier add 0-0-0-0-4 sha_dou_xing 2 multiply
最终属性值 = [( 基础数值 + 增加数值 ) × (1 + 倍率 )] × 最终倍乘
= [( 1 + 3+1 ) × ( 1 + 0.5 - 0.2 )] × 2
= 5 × 1.3 × 2
= 13
-
若有多个最终倍乘的属性修饰器,数值将按乘法叠加。
如,在原来的基础上我们再添加一个最终倍乘5的属性修饰器:
代码:
- /attribute @s generic.attack_damage modifier add 0-0-0-0-5 sha_dou_xing 5 multiply
最终属性值 = [( 基础数值 + 增加数值 ) × (1 + 倍率 )] × 最终倍乘
= [( 1 + 3+1 ) × ( 1 + 0.5 - 0.2 )] × (2 × 5)
= 5 × 1.3 × 10
= 65
以上就是所有的关于添加属性修饰器的格式了。
当然,一个完整的命令不会只能添加不能删除的。
所以,让我们继续:
5.5 读取与删除
如果你突然忘记了某个属性修饰器是什么了,可以使用以下命令读取:
代码:
- /attribute <目标> <属性ID> modifier value get <UUID> [<倍率>]
比如:
代码:
- /attribute @p generic.movement_speed modifier value get 0-0-0-0-0
这里要求你提供UUID,这就是为什么需要你记下UUID的原因。
如果你把UUID给了忘呢?这个……唯一的办法就是用/data get entity <目标> Attributes 来查找。(具体见本系列第12帖)
本教程的最后,如果你不想要一个属性修饰器,可以将其删除:
代码:
- /attribute <目标> <属性ID> modifier remove <UUID>
比如:
代码:
- /attribute @p generic.movement_speed modifier remove 0-0-0-0-0
就这些了哦
总结
以下提供了总结,来梳理本帖的内容:
Key Ideas
- 实体拥有属性,决定了他们的能力
- 有些属性是共用的,有些属性是特定实体独有。
- 属性拥有ID以作区分。
- 最终属性由两部分组成:基础属性,与属性修饰器(属性加成)
- /attribute是一个仅Java拥有的用于管理属性的命令。
- 它可以读取命令,格式为/attribute <目标> <属性ID> [base] get [<倍率>]
-
base可以用于代表读取基值。
- 本命令可以管理属性修饰器。
- 可以添加:/attribute <目标> <属性ID> modifier add <UUID> <名称> <值> <运算>
- UUID为一种ID,样式类似0-0-0-0-0。
- 名称无关效果
-
运算分为三种,增加(add),倍率(multiply_base),与最终倍乘(multiply)。
- 删除属性修饰器:/attribute <目标> <属性ID> modifier remove <UUID>
以上就是今天的全部内容。
……好好好是我懒,鸽了两周。
但这也是不可抗力好吧!真的哦!
下一帖不会很慢啦。
换了新的排版,喜欢么?
顺手求支持。
偶,还有,
要高/中考的各位,祝你们好运。
附录,注释,与外部链接
【1】战斗测试(CombatTest)中有另外两种关于攻击范围的属性。
【2】由于一个Bug,倍率后的值无法在聊天框中被显示出来。虽然使用/execute store 可以得到正确的数字。考略到没讲到/execute,这里跳过倍率没有举任何例子。
【3】不是完全唯一。重复地随机生成有极低几率重复,可以忽略。
另见:
Wiki:命令/attribute
百科:UUID
Wiki:战斗测试CombatTest
附录:勿使用以下UUID:
以下UUID由原版使用。若使用以下UUID,当原版的效果也被激活时会出现BUG。(虽然一般重新进入世界会消失。)
只做提醒。正常你是绝对不会输入进这些UUID的。
- CB3F55D3-645C-4F38-A497-9C13A33DB5CF
- CB3F55D3-645C-4F38-A497-9C13A33DB5CF
- 662A6B8D-DA3E-4C1C-8813-96EA6097278D
- E199AD21-BA8A-4C53-8D13-6182D5C69D3A
- 020E0DFB-87AE-4653-9556-831010E291A0
- 49455A49-7EC5-45BA-B886-3B90B23A1718
- B9766B59-9566-4402-BC1F-2EE2A276D836
- 5CD17E52-A79A-43D3-A529-90FDE04B181E
- 91AEAA56-376B-4498-935B-2F7F68070635
- 7107DE5E-7CE8-4030-940E-514C1F160890
- 648D7064-6A60-4F59-8ABE-C2C23A6DD7A9
- 22653B89-116E-49DC-9B6B-9971489B5BE5
- 22653B89-116E-49DC-9B6B-9971489B5BE5
- 03C3C89D-7037-4B42-869F-B146BCB64D2E
-
CC5AF142-2BD2-4215-B636-2605AED11727
#更新日志
Java 1.16.5/a页面发布
Java 1.17/a1.17更新完成
Java 1.17/b更改了关于攻速的误导信息
上一篇: 【命令】命令教程“真”从零开始(十三)给予与替换物品,命令/replaceitem
系列《命令教程“真”从零开始》
前往来自 麻瓜草稿簿 的 系列教程索引 【命令】命令教程“真”从零开始 (一) 指令本身,选择器,与命令方块 【命令】命令教程“真”从零开始 (二) 命令tp与相对,局部坐标与朝向锚
【命令】 命令教程“真”从零开始 (三) 四个新手指令
【命令】 命令教程“真”从零开始 (四) 有关队伍命令/team的……差不多一切
【命令】命令教程“真”从零开始 (五) 记分板与/scoreboard
【命令】 命令教程“真”从零开始 (六) /tag指令,与进阶~选择器参数
【命令】命令教程“真”从零开始 (七) 新手指令杂烩2号
【命令】命令教程“真”从零开始 (八) 区块与强制加载命令/forceload
【命令】命令教程“真”从零开始 (九) 调整苦力怕防爆,防喷/gamerule
【命令】命令教程“真”从零开始 (十) 简单,又新手(雾)的方块指令/setblock
【命令】命令教程“真”从零开始 ( X ) 我就不信不能用大白话讲清楚NBT
【命令】命令教程"真"从零开始(十二)数据运算三方法之一修改NBT/data
【命令】命令教程“真”从零开始(十三)给予与替换物品,命令/replaceitem
【命令】命令教程“真”从零开始(十四)修改属性/attribute【一拳打爆末影龙】 【命令】命令教程“真”从零开始(十五)最接近神的一次:填充命令/fill 【命令】命令教程"真"从零开始(十六)复制一片区域:复制命令/clone
下一篇: 【命令】命令教程“真”从零开始(十五)最接近神的一次:填充命令/fill[1.17]
