命令新手教程

By Ganxiaozhe    2019/01/18

过了这么久,才惊觉应该写一个面向对于命令才刚接触的玩家的教程。


目录:

  1. 基础
  2. 命令方块
  3. 脉冲型
  4. 连锁型
  5. 循环型
  6. 不受制约
  7. 条件制约
  8. 记分板
  9. 基础指令
  10. 准则类型
  11. 标签指令
  12. 队伍指令
  13. 服务器基础操作

基础

首先由玩家应该知道按T键或者/键时,下方会出现聊天框,其实它除了用来嘴炮其他玩家聊天,还可以执行一些简短的命令哦(聊天框字串符长度限制较低,命令方块字串符长度则相对较高,为32,500个字符以内)。至于命令有哪些,可以通过在聊天框输入/help来查询。

另外,有的命令适合在聊天框执行,有的更适合或不能在命令方块里执行。一些需要反馈结果的、debug类命令就适合在聊天框中执行,如/help/scoreboard objectives list/entitydata @e[type=!player,c=1] {}/blockdata ~ ~ ~ {}等等。(如果你对如上命令感到疑惑并且迫于解答,可见Give教程 - 基础用法中的图例)

而相对另一些需要自动化、重复执行的指令或指令系统或OOC,就得在命令方块中执行。且命令方块不能执行/debug、/publish和所有除了/list外的多人游戏命令


在1.7版本及之前,获取命令方块的指令为:

  1. /give @p 137 1 0

这里的@p为最近玩家,可以理解成由于是你通过聊天框(假若聊天框是你身体一部分)执行,所以最近的就是你啦。当然也可以把@p换成你的游戏ID。

而在1.8版本及之后,获取命令方块的指令为:

  1. /give @p command_block 1 0
  2. /give @p minecraft:command_block 1 0

因为在1.8版本及之后,物品不再支持通过数字ID获取。另外minecraft:command_block相对于command_block,要更为严格一些(更深的定位),意思为在包minecraft也就是原版中获取英文ID为command_block的物品。

而在1.9版本之后,又出现了更多的命令方块,分别是脉冲型命令方块连锁型命令方块循环型命令方块,获取指令依次为:

  1. /give @p minecraft:command_block 1 0
  2. /give @p minecraft:chain_command_block 1 0
  3. /give @p minecraft:repeating_command_block 1 0

命令方块中输入指令可不加/,即/gamemode 1 @a在命令方块中可为gamemode 1 @a,加与不加影响不大,不过建议是不加。

单人游戏中一般要在作弊模式下才可执行指令或打开控制台(右键命令方块)。若要在多人游戏、服务器中正常运行命令方块或执行指令,请将文件server.properties的配置设置为:enable-command-block必须为true,op-permission-level必须为2及以上(默认为4)。


命令方块

我的世界命令方块类型 从左至右分别是脉冲、连锁、循环型命令方块,从上至下分别是不受制约与条件制约。

脉冲型

脉冲型命令方块是橙色的。它的功能与1.9之前的老版本中“标准”的命令方块差不多,激活一次执行一次命令。可通过点击控制台中的“脉冲”切换为其他类型命令方块。可以直接被红石或{auto:1b}标签激活。/blockdata x y z {auto:1b}

连锁型

连锁型命令方块是绿色的。无法直接被红石或{auto:1b}标签激活,只有在它前面指向它的命令方块成功执行命令之后它才会被激活。

循环型

循环型命令方块是紫色的。可以直接被红石或{auto:1b}标签激活,其被激活后会以1s/20次的速度执行命令,每gametick执行一次,理想情况为一秒20gametick,但是由于各种原因,有时候1秒并没有20gametick。另外,当循环型命令方块指向的是连锁型命令方块,连锁型命令方块也会以1s/20次的速度循环执行指令,且执行顺序在循环型命令方块之后。若再指向一个连锁型命令方块,该方块依然循环执行,其执行顺序在指向它的连锁型命令方块之后。以此类推。

所以在网站上命令系统中的高频循环是由一个循环型命令方块和许多连锁型命令方块组成的,可见其OOC。(OOC,全称Only One Command,使用方法:将OOC指令复制后粘贴至脉冲型命令方块,单次激活即可)

不受制约

命令方块默认的是不受制约,即只要指向它的命令方块有红石信号传递,则它执行。

条件制约

可通过点击“条件制约/不受制约”,或通过Damages来切换/setblock chain_command_block 9 replace。当该命令方块为条件制约时,则只有当指向其的命令方块执行成功后该命令方块才会执行。条件制约通常用于连锁型命令方块。





记分板

基础指令

记分板可用多种形式追踪、设置并列出玩家及实体的分数。每一个记分项只允许同一对象在其中储存一个变量。记分项由名称、显示名称、准则以及每个对象所对应的整数数据组成。分数的范围为-2147483648至2147483647,没有小数。

其基础指令分为:/scoreboard objectives|players|teams,其中teams是队伍的操作。

/scoreboard objectives list可以列出当前创建的所有记分项。

创建记分板可以用:/scoreboard objectives add money dummy 货币money为记分项名称(自定义),dummy为记分项准则,货币为记分项显示名称(自定义)。

若要移除该记分项(money),指令为:/scoreboard objectives remove money



设置对象记分项分数值可用/scoreboard players set [obj] money [value],[obj]处可填@a、@p、@r或虚拟对象,可添加选择器;[value]可填-2147483648至2147483647的整数。如将所有创造模式玩家money设置为100,指令为:/scoreboard players set @a[m=1] money 100

在原有的基础上增加分数,就需要使用:/scoreboard players add [obj] money [value]

而要在原有的基础上减少分数,指令为:/scoreboard players remove [obj] money [value]

在1.13之前版本,通过选择器[score_money_min=100,score_money=100]就能选中money分值为100的对象了。score_[name]_min=大于等于,score_[name]=小于等于。



/scoreboard objectives setdisplay [位置] [记分项名称]可以设置分数项的显示位置,显示的为记分项显示名称,一个显示位置一次只能显示一个记分项。

显示位置分别有:list、sidebar、belowName以及sidebar.team.[color]。

list:在玩家列表中以黄色文字在玩家名称后显示分数信息(默认为 Tab 键),并不会显示记分项名称。

sidebar:在屏幕的右侧显示。在列表的最上方显示记分项的显示名称,并从上至下显示对象的分数。值得注意的是,即使玩家离线,如果在该记分项下存在分数也会在"侧边栏"中进行显示。没有分数值的对象则被显示。若记分项中没有任何对象有值,则右侧不会显示任何数据。除此之外,以#开头的虚拟对象在任何情况下都不会在侧边栏可见。

belowName:在玩家的名称牌之下,头之上,于记分项的显示名称后面显示分数。在10个方块后面、玩家潜行时隐藏显示。在单人游戏中不可见。

若将money显示于侧边栏,指令为:/scoreboard objectives setdisplay sidebar money

若要清空侧边栏显示:/scoreboard objectives setdisplay sidebar



准则类型

表格来源 Minecraft Wiki

准则描述可否编辑
dummy
虚拟型
只能通过命令修改分数,诸如死亡等游戏行为并不能修改分数。这可以被用来制作事件的标记、映射和通货。
trigger
触发器‌[仅Java版]
只能通过命令修改分数,诸如死亡等游戏行为并不能修改分数。/trigger能够用于设置/增减使用trigger作准则的记分项。如果以trigger为准则的记分项没有对玩家启用,则该玩家使用该/trigger命令会失败。成功使用过一次/trigger成功之后,该玩家的该命令将重新被关闭。注意/trigger可以在不允许作弊的情况下被非管理员的普通玩家使用。这可以比较方便地通过/tellraw来制作功能面板。
deathCount
死亡次数‌[仅Java版]
当玩家死亡时,分数会自动增加。
playerKillCount
杀人数量‌[仅Java版]
当玩家杀死其他玩家时分数会自动增加。
totalKillCount
杀怪数量‌[仅Java版]
当玩家杀死其他生物时分数会自动增加。
health
生命值‌[仅Java版]
普通玩家会在0~20之间。代表玩家拥有红心数量的两倍。在玩家第一次改变血量前会显示为0。额外的血或者伤害吸收的血也会计算在血量中,也就是说当获得了伤害吸收或者生命提升的信标效果后生命值可以超过20。
xp
经验值‌[仅Java版]
对应玩家拥有的经验值。
level
等级‌[仅Java版]
对应玩家当前的经验等级。
food
饱和度‌[仅Java版]
在0~20之间,代表玩家拥有的饱和度。在玩家第一次改变饱和度前会显示为0。
air
空气值‌[仅Java版]
在0~300之间;代表潜水的玩家所存余的空气,对应玩家的空气NBT标签。
armor
盔甲值‌[仅Java版]
在0~20之间;代表玩家拥有的盔甲值。在玩家第一次更换盔甲前会显示为0。

除此之外,还有一些复合准则:展开

例如要统计玩家放置TNT数量,则需创建记分项准则为:/scoreboard objectives add puttnt stat.useItem.minecraft.tnt,则每当玩家放置一个tnt时,其puttnt分数都会add 1。

每个对象的记分项分数值都可以被输出显示,格式为:{"score":{"name":"对象","objective":"记分项名"}},如:

  1. tellraw @a ["\u00a77\u00a7l玩家",{"selector":"@p","color":"dark_red","bold":"true"},"\u00a77\u00a7l共放置TNT",{"score":{"name":"@p","objective":"puttnt"},"color":"yellow","bold":"true"},"\u00a77\u00a7l次"]


标签指令

除了记分项,在1.9版本之后还可以通过给实体添加tag来进行选择器操作。标签指令分别是:

添加标签:/scoreboard players tag [实体] add [自定义标签名]

移除标签:/scoreboard players tag [实体] remove [自定义标签名]

列举标签:/scoreboard players tag [实体] list

  1. /scoreboard players tag @e[type=pig] add animal //给所有猪添加animal标签
  2. /scoreboard players tag @e[type=cow] add animal //给所有牛添加animal标签
  3. /summon minecraft:chicken ~ ~1 ~ {Tags:["animal"]}//召唤一只具有animal标签的鸡

进而通过指令/say @e[tag=animal],就可以输出所有猪、牛以及一只鸡:3



队伍指令

命令描述成功条件
teams list [队伍名称]列出所有队伍与其显示名称与队员数量。可选参数队伍名称 可用以显示指定队伍所有的队员。如果指定了队伍名称 ,这个队伍必须存在且有玩家。如果不指定,记分板上必须至少有一个已添加的队伍。
teams add <队伍名称> [显示名称...]以给定的名称和可选的显示名称创建一个队伍。填写的名字不能与现有队伍重名且在16个字符以内。显示名称是JSON文本。
teams remove <队伍名称>从记分板系统中删除队伍。填写的队伍名称必须是一个存在的队伍。
teams empty <队伍名称>删除队伍中的所有成员。填写的队伍名称 必须是一个存在的队伍,且队伍必须至少有一名玩家。
teams join <队伍> [玩家...]将指定的玩家加入指定的队伍。*可用以代表所有正在被记分板追踪的玩家。填写的队伍必须存在。需要注意玩家不一定要在线甚至存在,也可以甚至是已经在队伍中。
teams leave [玩家...]将指定的玩家移出队伍。如果不指定,执行命令的玩家离开自己的队伍。*可用以代表所有正在被记分板追踪的玩家。所有的玩家都必须在队伍中,有可能出现部分成功部分失败的情况,但命令方块只返回失败。
teams option <队伍> color <>将把队伍中所有成员在聊天框,头上,Tab菜单与侧边栏的名字染色。合法的颜色有:black、dark_blue、dark_green、dark_aqua、dark_red、dark_purple、gold、gray、dark_gray、blue、green、aqua、red、light_purple、yellow和white。还有一个合法的颜色是reset(名字以默认颜色和格式显示)。填写的队伍必须存在,且必须是合法颜色值。
teams option <队伍> friendlyfire <true|false>它的默认模式,true,对PVP机制没有影响。然而,当设置成false时,将保护玩家不受同队伍成员间的混战攻击,弓箭和瞬间伤害喷溅药水的伤害。但依然会受到他人负面状态效果的打击。填写队伍必须存在,设置必须是布尔值true或false。
teams option <队伍> seeFriendlyInvisibles <true|false>当设置成true,将可看到隐身队友(包括自己)的半透明影像而不会完全不可见。填写的team必须存在,设置必须是布尔值true或false。
teams option <队伍> nametagVisibility <never|hideForOtherTeams|hideForOwnTeam|always>控制指定队伍队伍的成员名称牌的可见性,默认为always。设置为never时,队伍中任何成员的头上都不会出现名称牌。设置为"hideForOtherTeams"时,队伍中成员的名称牌将不对队伍外的玩家显示。设置为hideForOwnTeam时,只有玩家本队其他成员的名称牌将被隐藏。设置为always时,所有名称牌都可见。填写的队伍必须存在,且设置必须是never、hideForOtherTeams、hideForOwnTeam或always。
teams option <队伍> deathMessageVisibility <never|hideForOtherTeams|hideForOwnTeam|always>控制指定队伍team成员死亡信息的可见性,默认为always。设置为never时,队伍中任何成员的死亡信息都不会出现聊天框。设置为hideForOtherTeams时,只有队伍外的玩家的死亡信息会被隐藏。设置为hideForOwnTeam时,只有玩家本队其他成员的死亡信息将被隐藏。设置为always时,所有死亡信息都会出现在聊天框。填写的队伍必须存在,且设置必须是never、hideForOtherTeams、hideForOwnTeam或always。
teams option <队伍> collisionRule <always|never|pushOwnTeam|pushOtherTeams>控制队伍队伍成员的碰撞模式,默认为always。设置为never时,队伍中任何成员都不会与玩家或生物发生碰撞。设置为pushOwnTeam时,队伍中的成员只能推撞本队的玩家与生物。设置为pushOtherTeams时,队伍中的成员只能推撞其他队伍的玩家与生物。设置为always时,所有玩家与生物都会被推撞。队伍必须存在,设置必须为never、pushOwnTeam、pushOtherTeams或always。

  1. /scoreboard teams add spawn_player 主城玩家 //创建名称为spawn_player,显示名称为主城玩家的队伍
  2. /scoreboard teams option spawn_player friendlyfire false//使同在spawn_player队伍的玩家不能互相攻击
  3. /scoreboard teams join spawn_player @a[m=2] //将所有冒险模式玩家加入spawn_player队伍




服务器基础操作

对于命令方块制作的服务器,流畅性不时让人头痛,其实不仅仅是命令系统的优化会影响到玩家游戏体验,还存在WorldSpawnChunks对玩家的影响。

通常WorldSpawnChunks由16chunk*16chunk组成,除外还有17chunk*17chunk的LazyLoadChunks包含了WorldSpawnChunks。其中出生点区块(SpawnChunks)是一块围绕世界出生点的区域中的一个区块。这个区域中区块的特殊性在于它不会被从内存中卸载,因此不管距离玩家多远,只要有玩家在主世界中,这个区块内的东西都会正常更新。

所以一般服务器中都会把命令方块系统区域设置在SpawnChunks,但是这样对于客户端来说,SpawnChunks的加载加上命令方块的运行,相比在SpawnChunks外会更加的卡顿。当玩家进入服务器时,会随机出生在SpawnChunks中心的20block*20block内,为了避免玩家在SpawnChunks停留过久,建议做一个玩家首次进入服务器的处理系统,如WorldSpawnChunks中心设置为在0 60 0位置:

  1. /tp @a[tag=!firstTemp] 2000 60 2000 //将首次进入玩家移动至2000 60 2000,进而远离WorldSpawnChunks
  2. /spawnpoint @a[tag=!firstTemp] 2000 60 2000 //将首次进入玩家出生点设置在2000 60 2000,使其不重生在WorldSpawnChunks
  3. /scoreboard players tag @a[tag=!firstTemp] add firstTemp //给首次进入玩家添加firstTemp标签,使上诉指令只执行一次




『更多关于命令的新手教程可见』

LOADING | 此框架正在加载中
QQ群:771363745