[指令日记]零基础的mc1.13指令教程

死亡观战
这个部分我思考了好长时间,中途一度想放弃,今天起床后才有思路。事先调了一会命令方块,没调好,各种乱编号乱传送,所以我估计可能要晚一些再放,不排除明天放或者弃坑的可能
如果不做这个系统,可以直接给死亡的玩家开旁观。但是如果有这个系统,就可以让你的地图更高大上一些。
所以,这一块先略过吧

楼主 化学爱好者_C60  发布于 2019-02-18 17:19:00 +0800 CST  
tnt的安装
我的想法是携带tnt的玩家手持tnt站在爆破目标附近潜行来安装tnt,于是我需要检测玩家是否潜行
刚刚对比了一下潜行玩家和没有潜行的玩家的nbt,没有找到控制潜行的nbt(注:玩家拥有nbt,可以被检测和查看,但是不能修改),于是我决定利用潜行和非潜行状态下玩家眼睛的高度的不同来判断玩家是否潜行。
测试结果:非潜行状态下玩家的眼睛比脚高1.62个方块,潜行状态下玩家的眼睛比脚高1.54个方块
可以利用这个微小的差别来判断玩家是否潜行
execute as @a at @s anchored eyes positioned ^ ^ ^ positioned ~ ~-1.54 ~ if entity @s[distance=..0.01]
结果表明,这个方法可行

↑没有潜行 有潜行↓




我们可以在目标地点设置盔甲架(为了和开始游戏时的盔甲架区分,可以给盔甲架加上aim标签。开始时的盔甲架也可以加上标签,然后重新编辑开始时的检测指令),然后检测周围有没有潜行的手持tnt的玩家。如果有,就可以执行安装炸弹的指令了

楼主 化学爱好者_C60  发布于 2019-02-18 18:08:00 +0800 CST  
原本以为这个东西挺简单的,没想到弄了那么长时间


tag @a remove preparing
移除所有人的preparing标签


execute at @e[type=armor_stand,tag=aim] as @a[distance=..5,nbt={SelectedItem:{id:"minecraft:tnt"}}] at @s anchored eyes positioned ^ ^ ^ positioned ~ ~-1.54 ~ if entity @s[distance=..0.01] run tag @s add preparing
如果在目标周围检测到手持tnt的潜行的人,那么给这个人一个preparing标签,表示这个人正在安装tnt


execute if entity @a[tag=preparing] run scoreboard players add @e[type=armor_stand,tag=aim] time 6
如果检测到有人在装tnt,则给有aim标签的盔甲架在time计分板上增加6分(time是一个判据为dummy的计分板)


execute as @e[type=armor_stand] store result bossbar bomb value run scoreboard players get @s time
将拥有aim标签的盔甲架的time分数保存至id为bomb的boss栏里(bomb表示tnt的安装、爆炸进程,最大值为600)


execute if entity @a[tag=preparing] run bossbar set bomb players @a[tag=preparing]
如果检测到有人正在安装tnt,让这个人可以看到bomb的进程


execute unless entity @a[tag=preparing] run scoreboard players set @e[tag=aim] time 0
如果没有检测到有人在装炸弹,则重置炸弹安装时间


execute unless entity @a[tag=preparing] run bossbar set bomb players
如果没有检测到有人在装炸弹,则设置bomb无人可见


连续截了几个图,大家感受一下吧(不会做gif
按下潜行






松开潜行


再次按下


楼主 化学爱好者_C60  发布于 2019-02-18 18:45:00 +0800 CST  
tnt的拆除/引爆
当检测到time为600之后(即我设定的bossbar的bomb最大值),就可以判定tnt安装完毕了。此时停止tnt掉落检测,停止tnt安装检测,提醒所有人tnt已被安放完毕,并且bomb这个boss栏可以被所有人看见
在安放位置生成一个捡不起来,不会消失的tnt物品,代表被安放的tnt
设置循环型命令方块,内容为减小time的数值,每个游戏刻减少1,这样就可以在boss栏做出来倒计时的效果。
tnt的拆除指令类似于tnt的安放指令,这里不再介绍
如果最终time的数值减小到0,就可以设置tnt的爆炸指令了
tnt的爆炸指令比较简单,在指定位置生成一个瞬间爆炸的爬行者就行了
execute at @e[type=item,nbt={Item:{id:"minecraft:tnt"}}] run summon creeper ~ ~ ~ {Fuse:0, ExplosionRadius:10}
不要忘了把mobGriefing这条规则设置成false,否则爬行者炸坏地图我不负责哦

楼主 化学爱好者_C60  发布于 2019-02-18 19:28:00 +0800 CST  
游戏胜利的判定
个人偏向于通过标签检测,因为本地图中各个队伍的胜利条件都是任意满足一个即可。(如果出现多个选项任意满足两个或以上,可以通过计分板)


红队有两个胜利条件,任意完成一个即可胜利
1、全灭蓝队
2、安放tnt并引爆
我们可以在任意条件满足后随便找一个人给一个red_win标签,然后检测到这个标签后,提示红队获胜,打扫战场后把玩家传送回大厅


蓝队有3个胜利条件,但是胜负判定在不同阶段是不同的。因此可以借助循环型需要红石命令方块或者借助execute的if/unless来停止或启用某些游戏结束的判断。
1、全灭红队
2、等待时间结束
3、拆除tnt
其中条件1、2在tnt安放之前任意满足一个即可,满足后随便给一个人blue_win标签供检测。tnt安放后,胜利条件1和2停用。tnt拆除后,随便给一个人blue_win,检测到后提示蓝队获胜,打扫战场后把玩家传送回大厅。

楼主 化学爱好者_C60  发布于 2019-02-18 19:47:00 +0800 CST  
我会抽时间把死亡观战那一部分补上的(也有可能弃坑)。
应该是结束了吧。语言功底差,不知道该怎么收尾。总之希望大家都能有所收获。当然,我们仍然可以继续深入学习,比如数据包、函数、战利品表等。如果可以,暑假我会在开一坑,来介绍这方面的内容(弃坑预警


The End

楼主 化学爱好者_C60  发布于 2019-02-18 19:52:00 +0800 CST  
关于死亡观战
这几天我试了好几种方法,但是都解决不了这个问题:如何将在众多玩家中把某一个玩家tp到他想要观察的玩家旁边。
目前想到的方法都是通过某些手段使观战玩家的某项数据与参战玩家的某项数据相同。这个很容易做到。但是有一点似乎做不到,就是在不断变化的数值里选择相同的数值。当然,在人数比较少的情况下,可以使用穷举,但是我们不知道在这个游戏中,参战者有多少。如果对游戏的人数加以限制,这个问题就可以通过穷举法来解决。

楼主 化学爱好者_C60  发布于 2019-02-20 13:32:00 +0800 CST  
补充:在命令中可能会用到的数据类型
布尔型(Boolean):只有0和1,或者true或false
字节(Byte):由8个二进制数组成,可以表示-128~127之间的整数
短整型(Short):可以表示-32768~32767之间的整数
整型(Int):可以表示-2147483648~2147483647之间的整数
长整形(Long):可以表示-9223372036854775808~9223372036854775807之间的整数
单精度浮点数(Single):可以表示-3.4E38~3.4E38之间的数
双精度浮点数(Double):可以表示正负4.9E-324~1.7E308之间的数


注:xey表示x×10^y

楼主 化学爱好者_C60  发布于 2019-03-02 11:47:00 +0800 CST  
更新了更新了(???)
补充两个东西
刷怪箱矿车(实体)(id:spawner_minecart)
拥有刷怪笼的所有nbt,可以看成矿车和刷怪笼的综合体,破坏后掉落矿车
例:/summon spawner_minecart ~ ~ ~ {SpawnData:{id:sheep}}


知识之书(物品)(id:knowledge_book)
右键消耗后可解锁配方
例:/give @s knowledge_book{Recipes:["minecraft:diamond_helmet","minecraft:diamond_chestplate","minecraft:diamond_leggings","minecraft:diamond_boots"]} ---给自己一个使用后解锁全套钻石装的知识之书




楼主 化学爱好者_C60  发布于 2019-03-16 23:00:00 +0800 CST  



楼主 化学爱好者_C60  发布于 2019-03-27 16:57:00 +0800 CST  
啥?1.14更了?
艾玛我现在还不知道1.14命令有啥变化呢
从上个月忙到这个月估计还要忙到下个月的我瑟瑟发抖
争取五一更吧,顺便把clickevent补上

楼主 化学爱好者_C60  发布于 2019-04-23 23:38:00 +0800 CST  
clickEvent 在被点击时执行一些事件
格式为 "clickEvent":{"action":"事件","value":"值"}


可供使用的action有以下几种:
run_command:执行命令
suggest_command:修改聊天框里的内容为目标命令
open_url:用于打开链接


run_command 用于执行命令
示例:
/tellraw @a {"text":"点我获得一个钻石","clickEvent":{"action":"run_command","value":"/give @s diamond"}}


实际上,run_command相当于是让玩家在聊天框里发送了value里的东西,因此“/”不能漏掉,并且需要玩家有执行的命令权限。不过也因为这个原因,我们可以做出让玩家说话的效果。比如:
/tellraw @a {"text":"点我和大家打招呼","clickEvent":{"action":"run_command","value":"大家好"}}




suggest_command 修改玩家聊天框里的内容
示例:
/tellraw @a {"text":"再给我一颗钻石吧","clickEvent":{"action":"suggest_command","value":"/give @s diamond"}}




open_url 用于打开链接
示例:





楼主 化学爱好者_C60  发布于 2019-05-01 22:41:00 +0800 CST  
clickEvent补充到楼上了,已做备份,被吞了再告诉我一下

楼主 化学爱好者_C60  发布于 2019-05-01 22:43:00 +0800 CST  
补充:1.14命令部分的改动

楼主 化学爱好者_C60  发布于 2019-05-04 15:08:00 +0800 CST  
这里推荐大家和wiki结合着看,效果更佳哦


首先与json文本相关的nbt的微小变动
这里以告示牌为例
在1.13中,部分物品的nbt格式为:
xxx:"JSON"
比如:
/setblock ~ ~ ~ oak_sign{Text1:"\"\"",Text2:"{\"text\":\"大家好\",\"color\":\"red\"}"}
这会导致json文本里的所有引号都需要添加转义符
在1.14中,这种表达方式仍然可以使用。不过,我们又多了一种更简便的表达方式——将最外面的双引号变成单引号。这样就不需要在内部的每个双引号前面加转义符了(不过需要在内部出现的单引号之前加转义符)。
示例:
/setblock ~ ~ ~ oak_sign{Text1:'""',Text2:'{"text":"大家好","color":"red"}'}

楼主 化学爱好者_C60  发布于 2019-05-04 15:38:00 +0800 CST  
关于物品的Lore标签的修改
现在Lore标签由字符串改为json文本了
这意味着终于可以不使用默认的紫色斜体了
示例:
/give @s diamond{display:{Lore:['[{"text":"能随便编辑","italic":"false"},{"text":"Lore","italic":"false","underlined":"true"},{"text":"标签的感觉","italic":"false"}]','[{"text":"真","color":"blue"},{"text":"舒","color":"yellow"},{"text":"服","color":"red"}]']}}


楼主 化学爱好者_C60  发布于 2019-05-04 16:01:00 +0800 CST  
execute命令的新条件
在execute的条件子命令里,添加了一个新的条件data,用于判断是否存在对应的nbt标签目录
execute ... if/unless data block <x> <y> <z> <nbt标签目录> ...
execute ... if/unless data entity <实体> <nbt标签目录> ...
若发现存在该nbt目录,会获取该目录的数量。
示例:
/execute if data entity @e[sort=nearest,limit=1,type=villager] Offers.Recipes --- 检测最近村民是否能够交易,若可以,则返回1(因为只有一个Recipes目录)
/execute if data entity @e[sort=nearest,limit=1,type=villager] Offers.Recipes[] --- 检测最近村民是否能够交易,若可以,则返回能进行的交易数量(此时检测的是Recipes下的目录数量)
/execute if data entity @e[sort=nearest,limit=1,type=villager] Offers.Recipes[2] --- 检测最近村民是否拥有第三组交易,若可以,则返回1


这里补充说明一下,关于nbt目录,之前好像没有提到。
以这里的村民的交易组合为例,村民的交易nbt的形式为
Offers: { Recipes: [ { 0 } , { 1 } , { 2 } , …] }
交易相关的nbt会保存至Offers目录里的Recipes目录中,并且Recipes目录下会保存多个交易组合。
表示这个目录的方法就是在不同级的标签之间加点,比如Offers.Recipes
但是,在Recipes中又存在多个交易,为了便于分清我想要获取的是哪一组,我就需要在Recipes后加中括号和数字,表示我到底想要获取哪一组数据,就像这样
Offers.Recipes[0]
此处表示村民的第一组交易

楼主 化学爱好者_C60  发布于 2019-05-04 16:31:00 +0800 CST  
问一下,你们能看到楼上(304L)的execute命令的新条件吗?考虑到那一楼可能会被吞,已做备份

楼主 化学爱好者_C60  发布于 2019-05-04 16:34:00 +0800 CST  
data命令的新模式:modify (我保证我要被这个东西搞晕了,一边被高数欺负,一边被这玩意折磨。。。)
很强大的一个模式,可以做到修改指定nbt而不影响别的nbt,甚至可以复制粘贴
格式为:
/data modify <目标> <目录> <操作> from <目标> <目录> --- 获取后者的nbt并以某种方式整合进前者nbt中
/data modify <目标> <目录> <操作> value <值> --- 将值以某种方式整合进目标nbt中


目标:可以是实体,也可以是方块。格式为以下两者之一
entity <目标选择器>
block <x> <y> <z>


目录:就是楼上说的目录


操作:一共有5中操作
prepend:在目录的开头插入值
append:在目录的结尾插入值
insert:在目录的指定位置插入值,格式为: insert <第几项>
merge:将值覆盖至原目录,原目录下存在而值里不存在的目录将被保留
set:将原目录下的值设置为目标值,原目录下存在而值里不存在的目录将被舍弃


此处感谢@脏鬼👻

楼主 化学爱好者_C60  发布于 2019-05-04 17:34:00 +0800 CST  
举例来说,此处我获取一个钻石
/give @s diamond{display:{Lore:['"0"','"1"','"2"']}}


然后我将这个钻石丢出,在第一行插入一个a
/data modify entity @e[type=item,sort=nearest,limit=1] Item.tag.display.Lore prepend value '"a"'
再次捡起后


或者在第二行插入一个来自别的实体或方块的json
/data modify entity @e[type=item,sort=nearest,limit=1] Item.tag.display.Lore insert 1 from block -5 57 2 Text2
此处我选择将某个地方的告示牌上的内容复制过来


楼主 化学爱好者_C60  发布于 2019-05-04 17:59:00 +0800 CST  

楼主:化学爱好者_C60

字数:59733

发表时间:2019-01-27 01:23:00 +0800 CST

更新时间:2019-07-22 08:34:08 +0800 CST

评论数:924条评论

帖子来源:百度贴吧  访问原帖

 

热门帖子

随机列表

大家在看