[指令日记]零基础的mc1.13指令教程
是时候把结构方块拿出来了
/give @s structure_block
现在介绍一下结构方块的4种模式
数据模式,主要用于地图自然生成时使用,本节不做介绍
储存模式,用于将结构数据储存起来,会保存至存档目录\generated\minecraft\structures文件里
加载模式,用于将储存的结构提取出来
角落模式,用于配合存储模式使用
/give @s structure_block
现在介绍一下结构方块的4种模式
数据模式,主要用于地图自然生成时使用,本节不做介绍
储存模式,用于将结构数据储存起来,会保存至存档目录\generated\minecraft\structures文件里
加载模式,用于将储存的结构提取出来
角落模式,用于配合存储模式使用
现在介绍储存模式
储存模式用于选择一定区域内的方块,并将其保存下来
介绍一下这些参数
结构名称:用于设定结构的名字
相对位置:确定起始点相对于结构方块的位置,是相对坐标
结构大小:。。。不解释了吧
比如,现在我填写如下数据
点击完成后,就能看到我们选定的区域
储存模式用于选择一定区域内的方块,并将其保存下来
介绍一下这些参数
结构名称:用于设定结构的名字
相对位置:确定起始点相对于结构方块的位置,是相对坐标
结构大小:。。。不解释了吧
比如,现在我填写如下数据
点击完成后,就能看到我们选定的区域
角落模式
配合储存模式可以较为方便的确定范围
比如,现在我想把下面的两个房子选中,但是不想一个个数坐标
此时就可以在这两个房子的体对角线上放置两个角落模式的结构方块
命名为同一个名字
然后再放置一个储存模式的结构方块,使用相同名字,并点击探测
然后我们就可以看到这两个房子被自动选定了
配合储存模式可以较为方便的确定范围
比如,现在我想把下面的两个房子选中,但是不想一个个数坐标
此时就可以在这两个房子的体对角线上放置两个角落模式的结构方块
命名为同一个名字
然后再放置一个储存模式的结构方块,使用相同名字,并点击探测
然后我们就可以看到这两个房子被自动选定了
结构方块还可以用来保存实体
我在其中一个房子里放了一个村民
在储存模式下,我们可以看到右下角有一个包括实体的选项,将其打开,并将结构保存
在另一个地方放置结构方块,将包括实体打开并将结构加载
此时村民被一同加载
我在其中一个房子里放了一个村民
在储存模式下,我们可以看到右下角有一个包括实体的选项,将其打开,并将结构保存
在另一个地方放置结构方块,将包括实体打开并将结构加载
此时村民被一同加载
加载模式的旋转
在加载模式中,还可以使用旋转
如图,下面的0,90,180,270就表示顺时针旋转的角度
需要注意的是,旋转(包括后面的镜像)仅仅是将方块和实体的位置变换了一下,方块和实体本身的数据并不改变,因此在旋转时,方块和实体的角度仍然需要手动调整一下
在加载模式中,还可以使用旋转
如图,下面的0,90,180,270就表示顺时针旋转的角度
需要注意的是,旋转(包括后面的镜像)仅仅是将方块和实体的位置变换了一下,方块和实体本身的数据并不改变,因此在旋转时,方块和实体的角度仍然需要手动调整一下
加载模式的镜像
加载模式还可以设置镜像,点击下面的“|”键即可设置镜像功能
默认为“|”,即不镜像
“< >”表示沿x轴和y轴所在的平面镜像
“^ v”表示沿y轴和z轴对称
应该不需要我再演示了吧
加载模式还可以设置镜像,点击下面的“|”键即可设置镜像功能
默认为“|”,即不镜像
“< >”表示沿x轴和y轴所在的平面镜像
“^ v”表示沿y轴和z轴对称
应该不需要我再演示了吧
结构完整性的设置
可以在结构加载时不完全加载,留下部分空缺
结构完整性范围是0~1,越大结构加载的越完整,默认为1(即完全加载)
种子用于控制结构缺失的位置,若为0则使用随机种子
例:
可以在结构加载时不完全加载,留下部分空缺
结构完整性范围是0~1,越大结构加载的越完整,默认为1(即完全加载)
种子用于控制结构缺失的位置,若为0则使用随机种子
例:
结构空位的使用
在结构方块保存时,会保存除了结构空位以外的所有方块,包括空气。因此,在生成结构时,如果不借助结构空位,可能会导致原有结构受损
现在我们获取结构空位
/give @s structure_void
在我们要保存的结构里,将结构空位放置在我们不希望保存的部位
可以打开对应的结构方块,将显示隐形方块打开,即可看到红色的结构空位和蓝色的空气
然后再将结构加载出来
此时原本的结构空位所在位置没有被替换为空气
在结构方块保存时,会保存除了结构空位以外的所有方块,包括空气。因此,在生成结构时,如果不借助结构空位,可能会导致原有结构受损
现在我们获取结构空位
/give @s structure_void
在我们要保存的结构里,将结构空位放置在我们不希望保存的部位
可以打开对应的结构方块,将显示隐形方块打开,即可看到红色的结构空位和蓝色的空气
然后再将结构加载出来
此时原本的结构空位所在位置没有被替换为空气
今天就到这了
明天应该是最后一期了,我会带大家做一个地图(的核心指令部分)
其实差不多是讲逻辑吧(逻辑这个东西,必须要用,用的越多,用起来就越顺手)
大家明天见
明天应该是最后一期了,我会带大家做一个地图(的核心指令部分)
其实差不多是讲逻辑吧(逻辑这个东西,必须要用,用的越多,用起来就越顺手)
大家明天见
首先祝贺大家已经完成了指令部分的学习,接下来,我将带大家到指令日记工作室。我们将参与一次地图制作,并且负责该地图的指令编写部分。
我们要做的地图是仿枪战游戏的爆破模式。玩家分成红蓝两队,其中红队要在规定时间内携带炸弹,对目标地点实施爆破,而蓝队要保护目标不被爆破
组员设计剧情如下~~~
A国和B国正在交战,A国派出秘密爆破小组,潜入B国的内部,对战略目标实施爆破。而正当一切顺利的进行时,这个小组却被B国的一个执勤小队发现。情况紧急,B国接到情况时,立刻调动了大批部队,前去支援。战斗一触即发,留给我们的时间不多了(什么鬼剧情)
我们要做的地图是仿枪战游戏的爆破模式。玩家分成红蓝两队,其中红队要在规定时间内携带炸弹,对目标地点实施爆破,而蓝队要保护目标不被爆破
组员设计剧情如下~~~
A国和B国正在交战,A国派出秘密爆破小组,潜入B国的内部,对战略目标实施爆破。而正当一切顺利的进行时,这个小组却被B国的一个执勤小队发现。情况紧急,B国接到情况时,立刻调动了大批部队,前去支援。战斗一触即发,留给我们的时间不多了(什么鬼剧情)
游戏大厅的设置
在游戏开始之前,我们需要设计游戏大厅。
游戏大厅一般包括地图的介绍、设置、分组和开始按钮(或其他方式开始游戏)
这里我就把内容简化一下吧,我们只需要设计分组和开始部分
个人比较喜欢用告示牌配合json的方法做分组,喜欢先放下告示牌然后用data指令编辑。
于是我们就可以编辑以下指令(我已经设置好了blue和red两个队伍)
/data merge block 10 57 8 {Text2:"{\"text\":\">| | 加入执勤队员 | |<\",\"color\":\"blue\",\"clickEvent\":{\"action\":\"run_command\",\"value\":\"/team join blue @p\"}}"}
/data merge block 6 57 8 {Text2:"{\"text\":\">| | 加入爆破小组 | |<\",\"color\":\"red\",\"clickEvent\":{\"action\":\"run_command\",\"value\":\"/team join red @p\"}}"}
当然,可以配合tellraw提醒加入队伍成功
关于开始游戏部分
开始游戏一般涉及一堆指令,如果只通过一个告示牌的话,指令的编写十分麻烦,因此采用命令方块的形式。因此我可以使用按钮。但是我想用告示牌激活,但我该怎样激活命令方块呢?
可以通过计分板加高频检测分数的形式,也可以放置红石块或红石火把。我选择后者
/data merge block 8 57 10 {Text2:"{\"text\":\">| | 点击开始游戏 | |<\",\"color\":\"green\",\"clickEvent\":{\"action\":\"run_command\",\"value\":\"/setblock 8 56 12 redstone_block\"}}"}
激活后会在当前钻石块的位置放置红石块
旁边单独放了一个命令方块,用于将红石块替换回空气
这样我们可以开始游戏了吗?
等一下,我们需要检查一下人数。
最好保证两队最多只差1人。
但是。。。该怎么检测呢???
在游戏开始之前,我们需要设计游戏大厅。
游戏大厅一般包括地图的介绍、设置、分组和开始按钮(或其他方式开始游戏)
这里我就把内容简化一下吧,我们只需要设计分组和开始部分
个人比较喜欢用告示牌配合json的方法做分组,喜欢先放下告示牌然后用data指令编辑。
于是我们就可以编辑以下指令(我已经设置好了blue和red两个队伍)
/data merge block 10 57 8 {Text2:"{\"text\":\">| | 加入执勤队员 | |<\",\"color\":\"blue\",\"clickEvent\":{\"action\":\"run_command\",\"value\":\"/team join blue @p\"}}"}
/data merge block 6 57 8 {Text2:"{\"text\":\">| | 加入爆破小组 | |<\",\"color\":\"red\",\"clickEvent\":{\"action\":\"run_command\",\"value\":\"/team join red @p\"}}"}
当然,可以配合tellraw提醒加入队伍成功
关于开始游戏部分
开始游戏一般涉及一堆指令,如果只通过一个告示牌的话,指令的编写十分麻烦,因此采用命令方块的形式。因此我可以使用按钮。但是我想用告示牌激活,但我该怎样激活命令方块呢?
可以通过计分板加高频检测分数的形式,也可以放置红石块或红石火把。我选择后者
/data merge block 8 57 10 {Text2:"{\"text\":\">| | 点击开始游戏 | |<\",\"color\":\"green\",\"clickEvent\":{\"action\":\"run_command\",\"value\":\"/setblock 8 56 12 redstone_block\"}}"}
激活后会在当前钻石块的位置放置红石块
旁边单独放了一个命令方块,用于将红石块替换回空气
这样我们可以开始游戏了吗?
等一下,我们需要检查一下人数。
最好保证两队最多只差1人。
但是。。。该怎么检测呢???
我创建了两个计分板,count_red和count_blue,判据都为dummy
然后放了个盔甲架
检查红队人数,并保存至盔甲架的count_red上
execute store result score @e[type=armor_stand] count_red if entity @a[team=red]
检查蓝队人数,并保存至盔甲架的count_blue上
execute store result score @e[type=armor_stand] count_blue if entity @a[team=blue]
将两队人数相减,结果保存至盔甲架的count_blue上
scoreboard players operation @e[type=armor_stand] count_blue -= @e[type=armor_stand] count_red
检查盔甲架的count_blue的数值大小,如果在-1~1之间,则在下图钻石块的位置放置一个红石块
execute if score @e[type=armor_stand,limit=1] count_blue matches -1..1 run setblock 4 56 9 redstone_block
然后放了个盔甲架
检查红队人数,并保存至盔甲架的count_red上
execute store result score @e[type=armor_stand] count_red if entity @a[team=red]
检查蓝队人数,并保存至盔甲架的count_blue上
execute store result score @e[type=armor_stand] count_blue if entity @a[team=blue]
将两队人数相减,结果保存至盔甲架的count_blue上
scoreboard players operation @e[type=armor_stand] count_blue -= @e[type=armor_stand] count_red
检查盔甲架的count_blue的数值大小,如果在-1~1之间,则在下图钻石块的位置放置一个红石块
execute if score @e[type=armor_stand,limit=1] count_blue matches -1..1 run setblock 4 56 9 redstone_block
当然,你可以再加一些文字提示
execute unless score @e[type=armor_stand,limit=1] count_blue matches -1..1 run tellraw @a {"text":"人数检查失败,请确认两队最多相差1人","color":"red"}
execute if score @e[type=armor_stand,limit=1] count_blue matches -1..1 run tellraw @a {"text":"人数检查成功,可以开始游戏","color":"green"}
execute unless score @e[type=armor_stand,limit=1] count_blue matches -1..1 run tellraw @a {"text":"人数检查失败,请确认两队最多相差1人","color":"red"}
execute if score @e[type=armor_stand,limit=1] count_blue matches -1..1 run tellraw @a {"text":"人数检查成功,可以开始游戏","color":"green"}
现在可以开始游戏了
tp到指定场地,give所有人物品(装备最好用replaceitem),蓝队给每个人一个拆弹工具,红队给随机玩家一个tnt。除了tnt以外的所有物品都附上消失诅咒。
我们先想想可能需要的计分板
我们需要判断玩家是否存活,因此需要一个判据为deathCount的计分板,设置其id为deaths
我们需要做击杀榜,因此需要一个判据为playerKillCount的计分板,设置其id为kills
可以加两个bossbar,用于显示两队人数。
/execute store result bossbar blue max if entity @a[team=blue]
/execute store result bossbar red max if entity @a[team=red]
这两个指令在游戏开始时使用一次
/execute store result bossbar blue value if entity @a[team=blue,scores={deaths=0}]
/execute store result bossbar blue value if entity @a[team=blue,scores={deaths=0}]
这两个指令在游戏进行时保持循环激活
然后我搞了点事情
tp到指定场地,give所有人物品(装备最好用replaceitem),蓝队给每个人一个拆弹工具,红队给随机玩家一个tnt。除了tnt以外的所有物品都附上消失诅咒。
我们先想想可能需要的计分板
我们需要判断玩家是否存活,因此需要一个判据为deathCount的计分板,设置其id为deaths
我们需要做击杀榜,因此需要一个判据为playerKillCount的计分板,设置其id为kills
可以加两个bossbar,用于显示两队人数。
/execute store result bossbar blue max if entity @a[team=blue]
/execute store result bossbar red max if entity @a[team=red]
这两个指令在游戏开始时使用一次
/execute store result bossbar blue value if entity @a[team=blue,scores={deaths=0}]
/execute store result bossbar blue value if entity @a[team=blue,scores={deaths=0}]
这两个指令在游戏进行时保持循环激活
然后我搞了点事情
在战斗中,红队需要知道携带tnt的队员的位置,因此可以在give tnt之前,先给那个人加一个“tnt”标签再给有“tnt”标签的人tnt。
然后在游戏中,就可以使用execute at @e[tag=tnt] run setworldspawn指令(用@e的原因一会说),然后给每个红队队员一个指南针,这样就可以让红队队员时刻知道自己的tnt的方向
然后在游戏中,就可以使用execute at @e[tag=tnt] run setworldspawn指令(用@e的原因一会说),然后给每个红队队员一个指南针,这样就可以让红队队员时刻知道自己的tnt的方向
tnt的掉落
在战斗中,携带tnt的队员可能会被打死而丢出tnt,也存在该队员自己扔出tnt的可能。而在实际游玩中,蓝队也存在捡起tnt的可能,但是我们不希望这种情况发生,因此我们必须进行必要的指令干预。
我们可以设计如下系统
其中前面这一栏用于检测tnt的掉落,后面那一栏用于检测tnt的拾取,暂时还没做,先来讲tnt的掉落
execute if entity @e[type=item,nbt={Item:{id:"minecraft:tnt"}},limit=1]
高频检测场上有没有tnt
data merge entity @e[type=item,nbt={Item:{id:"minecraft:tnt"}},limit=1] {PickupDelay:32767,Age:-32768,Tags:["tnt"]}
检测到后,立刻设置tnt不可被捡取,并能无限时间存在,并添加“tnt”标签(能够让指南针检测)(注:Tags标签用于保存实体拥有的通过tag指令获得的标签)
tag @a remove tnt
移除所有人的tnt标签
tellraw @a[team=red] {"text":"炸弹掉落,请去捡取","color":"red"}
通知红队队员去捡拾tnt
setblock 16 56 14 minecraft:redstone_block
setblock 14 56 14 air
更换红石块的位置,进行tnt拾取判定
需要注意的是,这个红石块并不能在游戏开始后就放置,因为give指令是通过item实体的形式给物品的。放置这个红石块最好在开始后延迟0.1秒
在战斗中,携带tnt的队员可能会被打死而丢出tnt,也存在该队员自己扔出tnt的可能。而在实际游玩中,蓝队也存在捡起tnt的可能,但是我们不希望这种情况发生,因此我们必须进行必要的指令干预。
我们可以设计如下系统
其中前面这一栏用于检测tnt的掉落,后面那一栏用于检测tnt的拾取,暂时还没做,先来讲tnt的掉落
execute if entity @e[type=item,nbt={Item:{id:"minecraft:tnt"}},limit=1]
高频检测场上有没有tnt
data merge entity @e[type=item,nbt={Item:{id:"minecraft:tnt"}},limit=1] {PickupDelay:32767,Age:-32768,Tags:["tnt"]}
检测到后,立刻设置tnt不可被捡取,并能无限时间存在,并添加“tnt”标签(能够让指南针检测)(注:Tags标签用于保存实体拥有的通过tag指令获得的标签)
tag @a remove tnt
移除所有人的tnt标签
tellraw @a[team=red] {"text":"炸弹掉落,请去捡取","color":"red"}
通知红队队员去捡拾tnt
setblock 16 56 14 minecraft:redstone_block
setblock 14 56 14 air
更换红石块的位置,进行tnt拾取判定
需要注意的是,这个红石块并不能在游戏开始后就放置,因为give指令是通过item实体的形式给物品的。放置这个红石块最好在开始后延迟0.1秒
tnt的拾取
当检测到tnt周围有存活的本队玩家时,可以让该玩家拾取tnt
但是我们不能直接改PickupDelay,因为我们无法排除周围有蓝队成员,而tnt被蓝队成员误拾取的情况
我设计的指令如下
execute at @e[type=item,tag=tnt,nbt={OnGround:1b}] if entity @a[team=red,distance=..1,scores={deaths=0}]
检测tnt是否落地(OnGround表示实体是否在地上),如果在地上,在周围检测没有死亡的红队队员(注意,在计分板创建时,玩家不会被追踪,也就是这个时候玩家没有分数(注意区分“没有分数”和“分数为0”),因此在游戏开始时需要手动set玩家的分数为0)
execute at @e[type=item,tag=tnt,nbt={OnGround:1b}] run tag @a[team=red,distance=..1,scores={deaths=0},limit=1] add tnt
当检测到tnt周围有红队玩家时,给该玩家加一个tnt标签(可以被指南针追踪)(加limit=1的原因是防止同时有多个玩家到判定范围)
kill @e[type=item,tag=tnt]
清除掉tnt掉落物
give @a[tag=tnt] tnt
给刚刚捡取tnt的玩家一个tnt
setblock 16 56 14 air
summon falling_block 14 57 14 {BlockState:{Name:redstone_block},Time:1}
更换红石块的位置,同时控制一定时间的延时
tellraw @a[team=red] [{"text":"炸弹已被捡取,捡取者:","color":"red"},{"selector":"@a[tag=tnt]"}]
提醒红队队员tnt已被捡取
当检测到tnt周围有存活的本队玩家时,可以让该玩家拾取tnt
但是我们不能直接改PickupDelay,因为我们无法排除周围有蓝队成员,而tnt被蓝队成员误拾取的情况
我设计的指令如下
execute at @e[type=item,tag=tnt,nbt={OnGround:1b}] if entity @a[team=red,distance=..1,scores={deaths=0}]
检测tnt是否落地(OnGround表示实体是否在地上),如果在地上,在周围检测没有死亡的红队队员(注意,在计分板创建时,玩家不会被追踪,也就是这个时候玩家没有分数(注意区分“没有分数”和“分数为0”),因此在游戏开始时需要手动set玩家的分数为0)
execute at @e[type=item,tag=tnt,nbt={OnGround:1b}] run tag @a[team=red,distance=..1,scores={deaths=0},limit=1] add tnt
当检测到tnt周围有红队玩家时,给该玩家加一个tnt标签(可以被指南针追踪)(加limit=1的原因是防止同时有多个玩家到判定范围)
kill @e[type=item,tag=tnt]
清除掉tnt掉落物
give @a[tag=tnt] tnt
给刚刚捡取tnt的玩家一个tnt
setblock 16 56 14 air
summon falling_block 14 57 14 {BlockState:{Name:redstone_block},Time:1}
更换红石块的位置,同时控制一定时间的延时
tellraw @a[team=red] [{"text":"炸弹已被捡取,捡取者:","color":"red"},{"selector":"@a[tag=tnt]"}]
提醒红队队员tnt已被捡取