本帖最后由 Dahesor 于 2023-1-1 12:10 编辑

☆命令教程“真”从零开始(十四)
修改属性/attribute【一拳打爆末影龙】


声明:
1. 本系列教程默认读者拥有关于Minecraft游戏本身的基础了解。
2. 本系列全部教程绝对适用于当前Java最新版 (1.19.3)
3. 本系列教程致力于基础原理而非使用方法,因为某些原因,这是本声明里最重要的一条。
4. 本教程 需要读者有特定的命令知识。这些这些内容在 下方表格中列出

<<<<<< 返回系列目录 ←←

需要前置知识:
请确保你理解下列的内容。下表的所有内容一定在本系列教程的某一帖讨论过,所以若您是从本系列第一帖起阅读至今,可以不用看。
对于跳跃式阅读的读者,还请检查一番:






前言

在前几天说过,玩家的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可以读取指定实体特定属性的基值或最终值。
格式:
  1. /attribute <目标> <属性ID> [base] get [<倍率>]
复制代码

在该命令中,<目标>应为一个只能选择一个实体(limit=1)的选择器(和/data一样,本命令一次只能对一个实体操作)。

中间的 [ base ] 是一个选填项。 填入 就代表获取该属性的 基值 缺省 则意味获取该属性的 最终数值 (经装备加成后)。

最后,可以通过[<倍率>]来指定返回的倍率。 【注2】


比如,上表中可以看到,攻击力的属性ID是 generic.attack_damage
现在假设我拿着一把钻石剑(提供攻击力+6),那么该如何得到我当前的攻击力呢?

  1. /attribute @s generic.attack_damage get
复制代码
返回自己的 最终 攻击力

此时游戏会返回“7”。因为玩家有1点基础攻击力,钻石剑+6,所以最后为7。
注意我们缺省了" base ",所以游戏返回的是我们的 最终数值 (经过钻石剑加成后的)。
但若是填入" base ":

  1. /attribute @s generic.attack_damage base get
复制代码
返回自己的 基础 攻击力

此时游戏不再返回7,而回返回玩家的基础攻击力1。因为本命令获取的是 基值 ,即 忽略武器装备的加成


好,更多的例子:

例1

假设,一名普通的玩家手持钻石剑(也只手持钻石剑)。
获取该玩家目前的攻速:
  1. /attribute @p generic.attack_speed get
复制代码
返回:1.6
这代表了,手持钻石剑时,玩家的攻速为1.6(每秒可全力攻击1.6次)

获取玩家的基础攻速:
  1. /attribute @p generic.attack_speed base get
复制代码
返回:4
这代表玩家的攻速基值为4(每秒全力攻击4次,是的,手持武器会降低你的攻速)


例2

获得最近僵尸的追踪距离:
  1. /attribute @e[limit=1,type=minecraft:zombie,sort=nearest] minecraft:generic.follow_range base get
复制代码


例3

假设一普通玩家穿着全套钻石装:

获取护甲最终值(加成后):
  1. /attribute @p generic.armor get
复制代码
返回:20(全套钻装提供满护甲值)

获取基值:
  1. /attribute @p generic.armor base get
复制代码
返回:0(玩家不穿装默认护甲值为0)



好,例子举到这里

看完了读取……现在就进入到非常令人激动的部分:修改吧。
命令/attribute有两种不同的“修改”。一种是修改基础数值,一种是修改“加成数值”(相当于给你一加一个虚拟的武器)。
让我们先进入到第一种,修改基值。



3. 修改基值

玩家的基础攻击力也太低了吧……万一生存第一天就遇到僵尸,使用低的可怜的1点攻击力,你得敲它20次才能把它敲死。

没关系,这里我们就来修改一下玩家的基础属性:
格式:
  1. /attribute <目标> <属性ID> base set <值>
复制代码

我们可以看到本格式与读取子命令十分相近,有区别的部分只是“<值>”与前面的get变成了set。


所以,我们实际上可以很容易地得到:

  1. /attribute @s generic.attack_damage base set 20
复制代码
将自己的基础攻击力设为20 其中, generic.attack_damage 为攻击力的属性ID,base set意味着我们要更改基值,而 20 是要更改的值。
现在尝试攻击僵尸,你一拳就可以打倒。

当然,我们可以刺激点:
  1. /attribute @s generic.attack_damage base set 2000
复制代码
将自己的基础攻击力设为2000
现在末影龙你也能一拳打倒了。

那,最大可以设到多高呢?
很夸张,夸张到可以闭眼按0:



  1. /attribute @s generic.attack_damage base set 100000000000000000000000000000000000
复制代码
将自己的攻击力设置为1×10 35 点。(1E35)

夸张吧……那,这该数值的上限是多少呢?
这个值是一个 double ……意思就是,在极端情况下你可以存 308 位数。是的。然而,每种属性都有一个接受范围。如果你输入的值大于这个范围,那么属性就会被设为最大可接受的值。
比如,攻击力的最大上限是2048,所以虽然你在上面的命令中输入了一个大的离谱的数字,但是游戏会把属性设为2048。
(小于最低值同理)


好,从夸张的数字中钻出来,我们也可以设置小数:
  1. /attribute @s generic.attack_damage base set 0.000001
复制代码
将自己的攻击力设置为0.000001
(基本上相当于没有。)

小数在一些属性上使用频繁,比如速度或击退抗性:
  1. /attribute @s generic.knockback_resistance base set 0.9
复制代码
使自己免疫90%的击退
我们从上面的表格可以看到对于击退抗性1就代表完全抵抗,所以这里0.9即可抵挡90%。

到这里,我们要再次提醒:

本子命令base set修改的是 基础 ,而非 加成 最终


为了让你明白这一点,以与下面的内容区分,让我们举这样一个例子:
假设有玩家,其基础攻击力为1:
  1. /attribute @s generic.attack_damage base get
复制代码
  • 读取该玩家 基础 攻击力
  • 返回1


他手持钻石剑,为他增加了6点加成数值:
  1. /attribute @s generic.attack_damage get
复制代码
  • 读取该玩家 最终 攻击力
  • 返回7


现在运行命令:
  1. /attribute @s generic.attack_damage base set 4
复制代码
将本玩家的基础攻击力设为4点

再次读取其攻击力:
  1. /attribute @s generic.attack_damage get
复制代码
  • 读取该玩家 最终 攻击力
  • 返回10
因为攻击力较之前增加了3点,所以总攻击力变成了10。


注意,我们所增加的是增 基础攻击力 ,所以:
  1. /attribute @s generic.attack_damage base get
复制代码
  • 读取该玩家 基础 攻击力
  • 返回4

如何?


那好,本节就到这里。
这里有更多的例子,你可以展开查看。




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用于管理目标上的自定义属性修饰符。
先来说,如何添加一个属性修饰器:
格式:
  1. /attribute <目标> <属性ID> modifier add <UUID> <名称> <值> <运算>
复制代码


嚯,这个语法里有挺多陌生的东西嘛……
<UUID>是什么?<名称>又是什么?这个我们要一个一个看。

5.1 UUID
  1. /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 <名称>
  1. /attribute <目标> <属性ID> modifier add <UUID> <名称> <值> <运算>
复制代码

接下来:什么是名称?

很简单:随便填


讲完了。

是的,这里可以随便填。什么都行,愿意填什么填什么,重复也可以。
这有点像是记分板或队伍的显示名称一样的东西。除了使用/data,你在加入这个属性修饰器后就再也无法看见它。

(这个名称大概是用来方便记录的。毕竟UUID一串数很难记。用/data可以筛选出拥有特定名称的属性修饰器……但还是没啥用因为对于玩家想删除还是要用/attribute,还是要用UUID)



5.3 <值> 与 <运算>

  1. /attribute <目标> <属性ID> modifier add <UUID> <名称> <值> <运算>
复制代码

让我们看向最后两个元素:
值与运算。
这是什么呢?这两个元素是在说,该属性修饰器要对属性作出怎样的更改。
其中<运算>其实就是运算。比如是加法“ 攻击力+6 ”还是乘法“ 攻击力×150% (攻击力×1.5) ”。
而值就是那个被加或者乘上去的数字。

属性修饰器是相当于给基础数值套个公式,算出最终属性。
可以利用的运算,有三种:

增加(add) 倍率(multiply_base) ,与 最终倍乘(multiply)

先不看那么多复杂的玩意,我们只用增加,先把我们的第一条命令写出来:
  1. /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的属性修饰器——
  1. /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的属性修饰器。
  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%
  1. /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%的属性修饰器:
  1. /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的最终倍称:
  1. /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的属性修饰器:
  1. /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 读取与删除

如果你突然忘记了某个属性修饰器是什么了,可以使用以下命令读取:

  1. /attribute <目标> <属性ID> modifier value get <UUID> [<倍率>]
复制代码

比如:
  1. /attribute @p generic.movement_speed modifier value get 0-0-0-0-0
复制代码
读取最近玩家速度属性的,UUID为0-0-0-0-0的属性修饰器


这里要求你提供UUID,这就是为什么需要你记下UUID的原因。



本教程的最后,如果你不想要一个属性修饰器,可以将其删除:
  1. /attribute <目标> <属性ID> modifier remove <UUID>
复制代码


比如:
  1. /attribute @p generic.movement_speed modifier remove 0-0-0-0-0
复制代码
将最近玩家速度属性的,UUID为0-0-0-0-0的属性修饰器删除


就这些了哦
最后做提醒,给玩家的属性修饰器在玩家死亡时会消失。



总结

以下提供了总结,来梳理本帖的内容:

Key Ideas

- 实体拥有属性,决定了他们的能力
- 有些属性是共用的,有些属性是特定实体独有。
- 属性拥有ID以作区分。
- 最终属性由两部分组成:基础属性,与属性修饰器(属性加成)
- /attribute是一个仅Java拥有的用于管理属性的命令。
- 它可以读取命令,格式为/attribute <目标> <属性ID> [base] get [<倍率>]
  • base可以用于代表读取基值。
- 本命令可以修改基值,格式为/attribute <目标> <属性ID> base set <值>
- 本命令可以管理属性修饰器。
- 可以添加:/attribute <目标> <属性ID> modifier add <UUID> <名称> <值> <运算>
  • UUID为一种ID,样式类似0-0-0-0-0。
  • 名称无关效果
  • 运算分为三种,增加(add),倍率(multiply_base),与最终倍乘(multiply)。
- 读取属性修饰器:/attribute <目标> <属性ID> modifier value get <UUID>
- 删除属性修饰器:/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可以读取指定实体特定属性的基值或最终值。
格式:

代码:

  1. /attribute <目标> <属性ID> [base] get [<倍率>]

在该命令中,&lt;目标&gt;应为一个只能选择一个实体(limit=1)的选择器(和/data一样,本命令一次只能对一个实体操作)。


中间的 [ base ] 是一个选填项。 填入 就代表获取该属性的 基值 缺省 则意味获取该属性的 最终数值 (经装备加成后)。


最后,可以通过[&lt;倍率&gt;]来指定返回的倍率。 【注2】


比如,上表中可以看到,攻击力的属性ID是 generic.attack_damage
现在假设我拿着一把钻石剑(提供攻击力+6),那么该如何得到我当前的攻击力呢?


代码:

  1. /attribute @s generic.attack_damage get
返回自己的 最终 攻击力


此时游戏会返回“7”。因为玩家有1点基础攻击力,钻石剑+6,所以最后为7。
注意我们缺省了&quot; base &quot;,所以游戏返回的是我们的 最终数值 (经过钻石剑加成后的)。
但若是填入&quot; base &quot;:


代码:

  1. /attribute @s generic.attack_damage base get
返回自己的 基础 攻击力


此时游戏不再返回7,而回返回玩家的基础攻击力1。因为本命令获取的是 基值 ,即 忽略武器装备的加成


好,更多的例子:


例1


假设,一名普通的玩家手持钻石剑(也只手持钻石剑)。
获取该玩家目前的攻速:

代码:

  1. /attribute @p generic.attack_speed get
返回:1.6
这代表了,手持钻石剑时,玩家的攻速为1.6(每秒可全力攻击1.6次)


获取玩家的基础攻速:

代码:

  1. /attribute @p generic.attack_speed base get
返回:4
这代表玩家的攻速基值为4(每秒全力攻击4次,是的,手持武器会降低你的攻速)


例2


获得最近僵尸的追踪距离:

代码:

  1. /attribute @e[limit=1,type=minecraft:zombie,sort=nearest] minecraft:generic.follow_range base get



例3


假设一普通玩家穿着全套钻石装:


获取护甲最终值(加成后):

代码:

  1. /attribute @p generic.armor get
返回:20(全套钻装提供满护甲值)


获取基值:

代码:

  1. /attribute @p generic.armor base get
返回:0(玩家不穿装默认护甲值为0)


好,例子举到这里


看完了读取……现在就进入到非常令人激动的部分:修改吧。
命令/attribute有两种不同的“修改”。一种是修改基础数值,一种是修改“加成数值”(相当于给你一加一个虚拟的武器)。
让我们先进入到第一种,修改基值。


3. 修改基值


玩家的基础攻击力也太低了吧……万一生存第一天就遇到僵尸,使用低的可怜的1点攻击力,你得敲它20次才能把它敲死。


没关系,这里我们就来修改一下玩家的基础属性:
格式:

代码:

  1. /attribute <目标> <属性ID> base set <值>

我们可以看到本格式与读取子命令十分相近,有区别的部分只是“&lt;值&gt;”与前面的get变成了set。


所以,我们实际上可以很容易地得到:


代码:

  1. /attribute @s generic.attack_damage base set 20
将自己的基础攻击力设为20 其中, generic.attack_damage 为攻击力的属性ID,base set意味着我们要更改基值,而 20 是要更改的值。
现在尝试攻击僵尸,你一拳就可以打倒。


当然,我们可以刺激点:

代码:

  1. /attribute @s generic.attack_damage base set 2000
将自己的基础攻击力设为2000
现在末影龙你也能一拳打倒了。


那,最大可以设到多高呢?
很夸张,夸张到可以闭眼按0:





代码:

  1. /attribute @s generic.attack_damage base set 100000000000000000000000000000000000
将自己的攻击力设置为1×10 35 点。(1E35)


夸张吧……那,这该数值的上限是多少呢?
这个值是一个 double ……意思就是,在极端情况下你可以存 308 位数。是的。然而,每种属性都有一个接受范围。如果你输入的值大于这个范围,那么属性就会被设为最大可接受的值。
比如,攻击力的最大上限是2048,所以虽然你在上面的命令中输入了一个大的离谱的数字,但是游戏会把属性设为2048。
(小于最低值同理)


好,从夸张的数字中钻出来,我们也可以设置小数:

代码:

  1. /attribute @s generic.attack_damage base set 0.000001
将自己的攻击力设置为0.000001
(基本上相当于没有。)


小数在一些属性上使用频繁,比如速度或击退抗性:

代码:

  1. /attribute @s generic.knockback_resistance base set 0.9
使自己免疫90%的击退
我们从上面的表格可以看到对于击退抗性1就代表完全抵抗,所以这里0.9即可抵挡90%。


到这里,我们要再次提醒:


本子命令base set修改的是 基础 ,而非加成或最终值


为了让你明白这一点,以与下面的内容区分,让我们举这样一个例子:
假设有玩家,其基础攻击力为1:

代码:

  1. /attribute @s generic.attack_damage base get
  • 读取该玩家 基础 攻击力
  • 返回1



他手持钻石剑,为他增加了6点加成数值:

代码:

  1. /attribute @s generic.attack_damage get
  • 读取该玩家 最终 攻击力
  • 返回7



现在运行命令:

代码:

  1. /attribute @s generic.attack_damage base set 4
将本玩家的基础攻击力设为4点


再次读取其攻击力:

代码:

  1. /attribute @s generic.attack_damage get
  • 读取该玩家 最终 攻击力
  • 返回10
因为攻击力较之前增加了3点,所以总攻击力变成了10。


注意,我们所增加的是增 基础攻击力 ,所以:

代码:

  1. /attribute @s generic.attack_damage base get
  • 读取该玩家 基础 攻击力
  • 返回4

如何?


那好,本节就到这里。
这里有更多的例子,你可以展开查看。

代码:

  1. /attribute @e[type=zombie,limit=1] generic.follow_range base set 10000
将一只僵尸的追踪距离设置为1万格
注意/attribute只能处理一个实体,所以我们添加了limit=1。


代码:

  1. /attribute @s generic.max_health base set 1
将自己的最大生命值设为1点
(噩梦UHC)


代码:

  1. /attribute @r generic.movement_speed base set 100
将随机玩家的移动速度设为100
玩家的默认移动速度为0.5,所以100是一个非常快的数值。(嗖一下)


代码:

  1. /attribute @s generic.attack_damage base set -1
将自己的攻击力设为-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用于管理目标上的自定义属性修饰符。
先来说,如何添加一个属性修饰器:
格式:

代码:

  1. /attribute <目标> <属性ID> modifier add <UUID> <名称> <值> <运算>



嚯,这个语法里有挺多陌生的东西嘛……
&lt;UUID&gt;是什么?&lt;名称&gt;又是什么?这个我们要一个一个看。


5.1 UUID

代码:

  1. /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差不多,实际上就是一串用于区分不同东西的数字而已。


只不过,&quot;唯一&quot;指明了这串码不会重复 【注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 &lt;名称&gt;

代码:

  1. /attribute <目标> <属性ID> modifier add <UUID> <名称> <值> <运算>

接下来:什么是名称?


很简单:随便填


讲完了。


是的,这里可以随便填。什么都行,愿意填什么填什么,重复也可以。
这有点像是记分板或队伍的显示名称一样的东西。除了使用/data,你在加入这个属性修饰器后就再也无法看见它。


(这个名称大概是用来方便记录的。毕竟UUID一串数很难记。用/data可以筛选出拥有特定名称的属性修饰器……但还是没啥用因为对于玩家想删除还是要用/attribute,还是要用UUID)


5.3 &lt;值&gt; 与 &lt;运算&gt;


代码:

  1. /attribute <目标> <属性ID> modifier add <UUID> <名称> <值> <运算>

让我们看向最后两个元素:
值与运算。
这是什么呢?这两个元素是在说,该属性修饰器要对属性作出怎样的更改。
其中&lt;运算&gt;其实就是运算。比如是加法“ 攻击力+6 ”还是乘法“ 攻击力×150% (攻击力×1.5) ”。
而值就是那个被加或者乘上去的数字。


属性修饰器是相当于给基础数值套个公式,算出最终属性。
可以利用的运算,有三种:


增加(add) 倍率(multiply_base) ,与 最终倍乘(multiply)


先不看那么多复杂的玩意,我们只用增加,先把我们的第一条命令写出来:

代码:

  1. /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 &lt;命令头&gt; 属性命令
@s &lt;目标&gt; 选择执行者(自己)
generic.attack_damage &lt;属性ID&gt; 攻击伤害属性
modifier &lt;子命令&gt; 管理属性修饰器
add &lt;子命令的子命令&gt; 添加属性修饰器
0-0-0-0-0 &lt;UUID&gt; 即用于将本属性修饰器与其他的区分的ID
sha_dou_xing &lt;名称&gt; 基本没用的东西,填什么都行XD
3 &lt;值&gt; 要更改的数量
add &lt;运算&gt; 对基础值的运算:这里add代表增加,和上面的值连起来就是 +3


这就是你的第一条命令啦


但是除了运算add,也就是增加,我们还有另外两种运算:下面将深入了解:


5.4 运算


可以利用的运算,有三种:增加(add),倍率(multiply_base),与最终倍乘(multiply)。


公式是这样的:


最终属性值 = [( 基值 + 修饰符: 增加数值 ) × (1 + 修饰符: 倍率 )] × 修饰符: 最终倍乘


让我们一个个来:


增加(又名:属性增量)(add)


首先,你可以对一个属性做加(减)法。


假设某玩家的基础攻击力是1, 没有 属性修饰器,那么该玩家的最终攻击力就是:


最终属性值 = [( 基础数值 + 增加数值 ) × (1 + 倍率 )] × 最终倍乘
= [( 1 + 0 ) × 1 ] × 1
= 1 × 1 × 1
= 1


然后我们用/attribute命令为其添加了一个攻击力+3的属性修饰器——

代码:

  1. /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的属性修饰器。

代码:

  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%

代码:

  1. /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%的属性修饰器:

代码:

  1. /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的最终倍称:

代码:

  1. /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的属性修饰器:

代码:

  1. /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 读取与删除


如果你突然忘记了某个属性修饰器是什么了,可以使用以下命令读取:


代码:

  1. /attribute <目标> <属性ID> modifier value get <UUID> [<倍率>]

比如:

代码:

  1. /attribute @p generic.movement_speed modifier value get 0-0-0-0-0
读取最近玩家速度属性的,UUID为0-0-0-0-0的属性修饰器


这里要求你提供UUID,这就是为什么需要你记下UUID的原因。
如果你把UUID给了忘呢?这个……唯一的办法就是用/data get entity &lt;目标&gt; Attributes 来查找。(具体见本系列第12帖)


本教程的最后,如果你不想要一个属性修饰器,可以将其删除:

代码:

  1. /attribute <目标> <属性ID> modifier remove <UUID>



比如:

代码:

  1. /attribute @p generic.movement_speed modifier remove 0-0-0-0-0
将最近玩家速度属性的,UUID为0-0-0-0-0的属性修饰器删除


就这些了哦


总结


以下提供了总结,来梳理本帖的内容:


Key Ideas

- 实体拥有属性,决定了他们的能力
- 有些属性是共用的,有些属性是特定实体独有。
- 属性拥有ID以作区分。
- 最终属性由两部分组成:基础属性,与属性修饰器(属性加成)
- /attribute是一个仅Java拥有的用于管理属性的命令。
- 它可以读取命令,格式为/attribute &lt;目标&gt; &lt;属性ID&gt; [base] get [&lt;倍率&gt;]
  • base可以用于代表读取基值。
- 本命令可以修改基值,格式为/attribute &lt;目标&gt; &lt;属性ID&gt; base set &lt;值&gt;
- 本命令可以管理属性修饰器。
- 可以添加:/attribute &lt;目标&gt; &lt;属性ID&gt; modifier add &lt;UUID&gt; &lt;名称&gt; &lt;值&gt; &lt;运算&gt;
  • UUID为一种ID,样式类似0-0-0-0-0。
  • 名称无关效果
  • 运算分为三种,增加(add),倍率(multiply_base),与最终倍乘(multiply)。
- 读取属性修饰器:/attribute &lt;目标&gt; &lt;属性ID&gt; modifier value get &lt;UUID&gt;
- 删除属性修饰器:/attribute &lt;目标&gt; &lt;属性ID&gt; modifier remove &lt;UUID&gt;




以上就是今天的全部内容。


……好好好是我懒,鸽了两周。
但这也是不可抗力好吧!真的哦!
下一帖不会很慢啦。


换了新的排版,喜欢么?
顺手求支持。
偶,还有,
要高/中考的各位,祝你们好运。


附录,注释,与外部链接


【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
【命令】命令教程&quot;真&quot;从零开始(十二)数据运算三方法之一修改NBT/data
【命令】命令教程“真”从零开始(十三)给予与替换物品,命令/replaceitem
【命令】命令教程“真”从零开始(十四)修改属性/attribute【一拳打爆末影龙】 【命令】命令教程“真”从零开始(十五)最接近神的一次:填充命令/fill 【命令】命令教程&quot;真&quot;从零开始(十六)复制一片区域:复制命令/clone


下一篇: 【命令】命令教程“真”从零开始(十五)最接近神的一次:填充命令/fill[1.17]