本帖最后由 Dahesor 于 2021-8-23 02:48 编辑

☆命令教程“真”从零开始(十三)☆
☆给予与替换物品,命令/replaceitem☆


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


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




前言

我要一背包的钻石快!
满足你!

只要简单地执行下面的命令:
  1. /give @p diamond_block 2304
复制代码
你就会获得一整背包的钻石砖!

那今天,我们就来看看这个神奇的命令,给予命令 /give
当然不止。除了该命令,今天我们的内容还包括了清除物品命令/clear,与可以替换容器物品的命令/replaceitem。

让我们开始吧

1. 命令/give


这是一个十分简单又常用的命令,可以给予玩家一定数量的特定物品。
格式:
  1. /give <目标> <物品ID> [<数量>]
复制代码

目标处应指定一 玩家 ID或选择器 或UUID ,为“要给谁物品”。<物品ID>则是那个要给予的物品的ID。[<数量>]作为一个可选元素,可以指定给予的数量。若不指定数量会默认为1个。

比如:
  1. /give @a diamond_block 64
复制代码
给予所有玩家(@a)一组钻石块
注意“diamond_block”是钻石块的ID。

或:
  1. /give @a stone
复制代码
给予所有玩家(@a)一颗石头(stone)
由于没有指定数量,所以数量默认为一。

有一点,请不要被“1组=64个”的这个概念限制了。/give是可以接受大于64的数字的,比如:
  1. /give @a diamond_block 128
复制代码
给予所有玩家两组钻石块

然而,这个上限是6400个物品,也就是100组,不能超过这个数字


这是个相当简单的命令,不必多说。
对于不知道物品ID的读者,可以前往 Wiki本页面查看 ,或在游戏中按下F3+H(若键盘有fnLock,则按下fn+F3+H),显示更详细的的标签提示,即可直接看到ID:

142703zdapisrivsz51rxf.png

如图,圈起来的就是ID。前面的minecraft:是命名空间,一般可以省略……对于这部分内容在 系列第十帖 有着较详细的描述。

上面就是/give的全部内容了……但是较有意思的一点是,/give命令的实质并不是修改玩家的物品栏,而是在玩家的精准位置生成一个可以被瞬间捡起的掉落物……所以当目标的背包满的时候使用/give,物品会掉出来。
(所以说,/give的功能完全可以用/summon加NBT实现(啊,要用execute来确定玩家位置))

/give命令可以使用NBT来获取特殊的物品,比如锋利lv.9999的钻石剑之类的……这部分内容在系列第十一帖讲述,若感兴趣请移步 【命令】命令教程“真”从零开始 ( X ) 我就不信不能用大白话讲清楚NBT [1.16]

这里简单举个NBT例子:
  1. /give @a crossbow{Charged:1b} 2
复制代码

给予所有玩家两把上弦( Charged : 1 b 【注1】 的弩。


2. 命令/clear

有了给予命令,我们当然也少不了可以清除物品的清除命令。
命令/clear可以清除玩家背包内特定物品。
格式:

  1. /clear [<目标>] [<物品>] [<最大数量>]
复制代码
与/give命令十分地相似,/clear命令也有<目标>,指定命令对象。也有<物品ID>,指定要清除的物品。同样也有<最大数量>,指定要清除多少个物品。

如:
  1. /clear @s tnt 16
复制代码
清除自己(最多)16个TNT

注意最后面的元素“[<最大数量>]”是可选的。若不指定一个最大数量,命令将会清除所有物品:

  1. /clear @s dirt
复制代码
清除命令执行者身上的所有泥土

有一个很有趣的事实是,这个最大数量可以为0:
  1. /clear @s dirt 0
复制代码
清除命令执行者身上的 0 个泥土

这……好像没用啊。清除0个和没执行命令有什么区别么?
有。
虽然没有对玩家的实际影响,但该命令却可以找出这名玩家身上 有没有 泥土。
当你尝试清除的玩家身上并没有目标物品时,命令会 执行失败 ,但是如果有,虽然清除了0个,但命令会 执行成功
你可以将本命令输入进条件制约的连锁型命令方块上,来侦测玩家是否拥有特定物品。
(当然……这玩意在/execute store中还可以找出物品的数量,但这里就不多说了)

接下来,你可能注意到了,不只是数量时可选元素,就连[<物品ID>]也是。
当你不指定物品ID时,命令会清除玩家身上的所有物品:
  1. /clear @r
复制代码
将一名随机玩家的背包清空

然后,目标本身也是可选元素。若不指定要清除的目标,命令会清除执行者身上的物品:
  1. /clear
复制代码
把自己的背包清空

2.1 标签

然而,/clear命令并不是只能清除全部或单个物品。
我们还可以清除一整个标签的物品——这么说:
游戏内置(或通过数据包添加)中,对于特定的一些物品,用一种叫做 标签(tags) 的东西将它们“归类”了起来。
(注意这里的标签和NBT或/tag没有关系,不要混淆)

比如,你想清楚玩家身上的所有铁砧。但是你应该知道铁砧有很多种类,比如轻微损坏的铁砧,严重损坏的铁砧等。
如果你想要把全部的三种铁砧清除,你将需要三条命令。
不过我们有一种更便捷的方法,那就是用标签:
  1. /clear @a #anvil
复制代码
我们原本物品ID的位置被替换为了“ # anvil ”。这其中的“ # ”代表了这是一个标签而非物品。后面的“ anvil ”是铁砧。
# anvil ”就是“铁砧标签”的意思。
本命令会清除所有损坏程度的铁砧。

同样:
  1. /clear @a #bed
复制代码
清除所有的床,无论其颜色

  1. /clear @a #logs
复制代码
清除所有的原木,无论是什么种类,剥没剥皮

  1. /clear @a #beacon_payment_items
复制代码
这里的标签“ # beacon_payment_items ”为“ 可以放置在信标GUI中以激活信标 ”的物品。
正常来讲,这包括了铁锭,金锭,钻石,绿宝石,和下界合金锭。


那么,你该在哪里查找可用的标签呢?
简单,在 Wiki的标签页面


注意:
1. 标签不是用来给你便捷地使用的……标签在游戏中的用处还有很多……我们以后会说。
2. 若你的世界按装了数据包(原版模组),或者模组,那么标签的内容 可能被更改

以下内容涉及NBT,可跳过



3. 替换物品命令/replaceitem


警告: 这是已移除特性

警告:本命令已在1.17被移除,新出现的 命令/item 取而代之


命令/replaceitem,可以 替换 方块(箱子、熔炉等)或实体(玩家或生物)物品栏内 特定位置 的物品。
格式:
  1. /replaceitem (block <x> <y> <z> | entity <选择器>) <栏位> <物品> [<数量>]
复制代码
其中,命令头后面的是要 被替换物品 的对象。这可以是一个方块(接上它的坐标),或者是实体(接上选择器(或ID/UUID))。
紧接其后的是“<栏位>”,即要替换容器或物品栏的哪一格。
最后面的即是要替换的<物品>与其数量(若不指定默认为1)。

比如:
  1. /replaceitem @p weapon.mainhand carrot 1
复制代码
在上面的命令中,要替换的物品“ carrot ”是胡萝卜。栏位“ weapon.mainhand ”是“ 主手 ”的意思。由于选择器是@p,最近的玩家,所以上面的命令实际上是在说: 将最近玩家的主手物品(正在选中的那一栏)替换为1个胡萝卜🥕。

蛮简单吧。现在的唯一问题就是,栏位要填啥?如何指定物品栏或容器内的特定物品?

栏位的ID由两部分组成。大概长这样: 类别.位置
类别 规定了这是哪里的东西,而 位置 则是具体位置。
比如上面的例子“ weapon.mainhand ”中, weapon 是武器的意思。哪里的武器呢? mainhand (主手)的。
我们也可以有 weapon.offhand ,即副手物品。 offhand 就是副手。

下面是所有可供选择的“类别”:
我们有 weapon ,即武器(主副手)。
我们有 armor ,即盔甲栏。
inventory ,背包内的。
hotbar ,快捷栏上的。
enderchest ,末影箱里的。
horse ,马匹的东西,包括鞍与马铠,与其箱子内的东西。
还有 villager ,村民拥有的。
最后是容器的,无论是箱子漏斗发射器: container

嘛,我在这里可能说不太清,但你只要看向这个表格就好了:
栏位
栏位编号
描述
armor . head
-
盔甲栏。从上到下分别是头盔,胸甲,护腿,和靴子。
仅对盔甲架、生物及玩家有效(并非所有生物会显示或利用这些物品)
除了头部外,无法替换非护甲类物品。如你可以在玩家的头部装备栏放一块玻璃,但不能在胸甲放。


armor . chest
-
armor . legs
-
armor . feet
-
weapon . mainhand

weapon
-
手持物。 mainhand 是主手, offhand 是副手。对于玩家, mainhand 为其选中的格子。
仅对盔甲架和生物有效(虽然并非所有生物会显示或利用这些物品)。
weapon weapon . mainhand 效果一致
weapon . offhand
-
hotbar . 栏位编号
0到8
仅玩家:玩家 快捷栏 。需将 栏位编号 替换为0~8的数字以代表快捷栏的特定位置。这个栏位编号是从左往右从0开始算的。如, hotbar.0 代表快捷栏第一位(最左), hotbar.4 是中间那格, hotbar.8 是最右侧的那格。
enderchest . 栏位编号
0到26
仅玩家:玩家 末影箱 。需将 栏位编号 替换为0~26的数字以代表末影箱的特定位置。这个 栏位编号 是从左往右,从上到下排列的。 栏位编号 从零开始算起。如, enderchest.0 代表末影箱第一格(左上角), enderchest.17 是第二行最后一个, enderchest.26 是最后一格(右下角)。
inventory . 栏位编号
0到26
仅玩家、漏斗矿车和运输矿车:物品栏。需将 栏位编号 替换为0~26的数字。编号从左到右从上到下算起。如 inventory . 0 为背包最左上角。 inventory.26 为背包右下角。注意 不计算快捷栏 。替换快捷栏物品应使用hotbar。
由于漏斗矿车只有五格,所以无法对其使用 5或以上 的栏位编号。
horse . saddle
-
仅马、驴和骡的鞍。 必须 替换为鞍或空气(清空) ,不然无法成功替换。
horse . chest
-
仅马、驴和骡的箱子(箱子本身,不是其内容)。 必须 替换为 箱子 或空气(清空) ,不然无法成功替换。
horse . armor
-
仅马和羊驼; 必须替换为马铠(马)或地毯(羊驼) 或空气(清空) ,不然无法成功替换。
horse . 栏位编号
0到14
驮箱子的驴和骡: 其箱子内的东西。需将需将 栏位编号 替换为0~14的数字以代表特定位置。计数顺序与上面的一样。
villager . 栏位编号
0到7
仅村民: 这是村民所拥有的东西。需将需将 栏位编号 替换为0 ~ 7的数字
container . 栏位编号
0到7
对于 任意容器 物品展示框 :这是其中包含的物品。对于箱子、发射器、投掷器、漏斗或陷阱箱,其 栏位编号 从左上角“0”开始,之后从左到右,从上到下递增。根据容器的不同,最大到26。
  • 对于熔炉,高炉,烟熏炉,0代表原料栏,1为燃料栏,2为输出栏。
  • 对于酿造台,0,1,2从左到右分别代表三个药水栏。3是顶部的栏位。烈焰粉的栏位为4。
  • 对于物品展示框,container.0代表其展示的物品,其余无效。
  • 大型箱子或陷阱箱被视为两个独立的容器。

上面的就是所有你可以填写的栏位了。我本来想参考Wiki偷偷懒的,结果Wiki竟然很多是错的!(当然,被我改正了)。下面举几个例子:

  1. /replaceitem entity @r enderchest.8 stone 6
复制代码
将随机玩家的末影箱的第9(8+1)栏(第一行最右侧)的物品替换为6颗石头
注意原物品会消失。
  1. /replaceitem entity @a hotbar.0 sand
复制代码
将所有玩家的快捷栏的第1栏的物品替换为1个沙子

  1. /replaceitem entity @e[type=donkey] horse.chest chest
复制代码
为所有驴按上箱子

  1. /replaceitem entity @e[type=donkey] horse.chest air
复制代码
为所有驴卸下箱子
当你想要将特定位置物品清空,将物品ID指定为air(空气)即可。

  1. /replaceitem block ~ ~ ~ container.4 diamond 64
复制代码
在执行位置的容器第5格(假设它有第五格)放置64颗钻石

  1. /replaceitem entity @a armor.head glass
复制代码
在所有玩家的头部替换为玻璃


好,这样应该够了。
最后的几件事是,本命令可以使用NBT,和在give与clear中一样。
/replaceitem是无法突破堆叠上限的……比如你无法替换64个药水。嗯。
而且/replaceitem命令运行时是没有动画或提示的。而/give至少会有捡起物品的“破"的一声。


后记

以上就是本期所有内容了。
前面的两帖,NBT与/data的教程自我感觉其实不咋好……但是也不知道怎么改。判断为还太菜理解不够……但是这不是想明白就能解决的。
那就先放哪,等我把这个系列写完,也许就知道怎么改了。

那,这一帖,与接下来几帖都很简单……最难的就是/attribute了。
直到JSON文本之前都很简单。对。
那,如果你有学到什么的话,请支持一下作者吧……反正给人气又不会扣你自己的。

再见。

注释

【1】但是无法射击,因为没说填了啥


#更新日志
Java 1.16.5/a  页面发布
Java 1.16.5/b  删除了一个多余的空格,改正了钻石的英文。
Java 1.16.5/c  添加了关于/item的提示。
Java 1.16.5/d  添加了关于物品展示框的说明。

Java 1.17/a  1.17更新完成,添加了/give数量限制


上一篇: 【命令】命令教程"真"从零开始(十二)数据运算三方法之一修改NBT/data


系列《命令教程“真”从零开始》
前往来自 麻瓜草稿簿 系列教程索引
下一篇: 【命令】命令教程“真”从零开始(十四)修改属性/attribute【一拳打爆末影龙】