用CB实现原版幸运方块

幸运方块是指破坏该方块后产生一个或一系列随机事件的方块
根据上面那句话,可以将本文内容分成三部分

1)幸运方块生成与定位阶段

A.放置幸运方块
我的方法是使用定位生物来生成特定方块
(老方法啦。。。而且也不是什么很特殊的方块啦。。。)
(为了偷懒,用了下面这种方式,后文同)
三个持续激活的命令方块

  1. /execute @e[type=Shulker] ~ ~ ~ /setblock ~ ~ ~ minecraft:tnt 1 replace
  2. /execute @e[type=Shulker] ~ ~ ~ detect ~ ~ ~ minecraft:tnt 1 /summon ArmorStand ~ ~100 ~ {NoGravity:1b,Invisible:1b,Silent:1b,Marker:1b,Invulnerable:1b,Tags:["lucky_block_pos"]}
  3. /kill @e[type=Shulker]

这是通过放置潜影贝来生成“命令方块”
原理:
放置的方块是一破坏就会点燃的TNT,通过这个方块可以实现破坏时被定位
盔甲架后面跟的一大堆NBT是保证盔甲架在原位保持不动且不会消失、不会被发现(除使用/kill指令外)
盔甲架的tag是为了在点燃TNT的时候确定为幸运方块的激活点,可以用[tag=lucky_block_pos]选择
生成在上方100格是为了破坏方块时不会阻碍(100只是我用的数字,视情况而定)
电脑配置好的同学有兴趣的话可以试一下,把第三个去掉,只执行第一条和第二条指令 [滑稽脸]
B.定位幸运方块
上面第二个命令方块的指令以上面举的100格为例子讲解
TNT的附加值设为1时,是一破坏就会爆炸的状态(可以按F3将鼠标移到方块上,看右边底端的true和false);破坏后产生一个点燃的TNT(1.10.2中可以用[type=PrimedTnt]选择)。
所以,本阶段的命令方块指令如下

  1. /execute @e[type=PrimedTnt] ~ ~ ~ /execute @e[type=ArmorStand,tag=lucky_block_pos,r=2] ~ ~ ~ /summon ArmorStand ~ ~-100 ~ {NoGravity:1b,Invisible:1b,Invulnerable:1b,Silent:1b,Marker:1b,Tags:["lucky_block_active"]}
  2. /execute @e[type=ArmorStand,tag=lucky_block_active] ~ ~ ~ /kill @e[type=PrimedTnt,r=2]
  3. /execute @e[type=ArmorStand,tag=lucky_block_active] ~ ~ ~ /kill @e[type=ArmorStand,tag=lucky_block_pos,r=0,c=1,dy=100]

到目前为止,已经将点燃的TNT和原盔甲架清除,在幸运方块原地使用了带有lucky_block_active标签的盔甲架代替,完成定位。
接下来就是随机选择事件、生成事件的阶段

2)随机事件选择阶段

因为是随机选择,调皮的lz当然不会放过/spreadplayers的~啦~
/spreadplayers是在一定范围内随机传送的指令,我们可以利用其随机性生成随机选择
(附带说一句,lz之所以不用计分板的高频加/减循环是为了尽可能保证随机,当然使用这种方法也是可以的,后面会具体讲
比如,我做了24个事件,要利用随机选择,建议通过给盔甲架(带有lucky_block_active标签)某个计分板设置为随机分数来实现
如下,先创建计分板并召唤盔甲架

  1. /scoreboard objectives add random dummy
  2. /summon ArmorStand ~ ~ ~ {Tags:["random"]}

创建之后,根据下图举例说明(可依照自己的想法改动,此处不提供固定的指令):
(带下划线表示可以修改,加粗部分表示重点部分)
红色:
a.  /scoreboard players set @e[type=ArmorStand,tag=lucky_block_active] random 1
b.  /scoreboard players set @e[type=ArmorStand,tag=lucky_block_active] random 2
c.  /scoreboard players set @e[type=ArmorStand,tag=lucky_block_active] random 3
d.  /scoreboard players set @e[type=ArmorStand,tag=lucky_block_active] random 4
即:底下一层命令方块为设置盔甲架(带有active标签)在计分板random的分数,依照分数可生成对应事件
注意:正中间(有浮冰的那条线)在红色层(底层)没有命令方块(/spreadplayers不会将盔甲架传送到那里)
蓝色:
a,b,c,d.  /tp @e[type=ArmorStand,tag=random] X Y Z
注意:这里的(X,Y,Z)是浮冰顶端命令方块(黄色a)再向上一格的位置(盔甲架召唤位置),即黄色a在(X,Y-1,Z)
黄色:
a.  /spreadplayers ~ ~ 1 2 false @e[type=ArmorStand,tag=random]
b.  /setblock ~ ~2 ~ minecraft:stone_pressure_plate 0 destroy
b是以前用的,现在加上白色a之后似乎不用黄色b了。。。
白色:
a.  /execute @e[type=ArmorStand,tag=random] ~ ~ ~ detect ~ ~ ~ minecraft:stone_pressure_plate 1 /setblock ~ ~ ~ minecraft:stone_pressure_plate 0 destroy

这里是利用了destroy可以使被激活的压力板快速变回未激活的状态,从而快速多次激活底下的命令方块

QQ截图20170922173324


下面是指令的大致结构:

  1. /scoreboard players set @e[type=ArmorStand,tag=lucky_block_active] random [对应事件编号]
  2. /tp @e[type=ArmorStand,tag=random] [X] [Y] [Z]
  3. /spreadplayers ~ ~ [最小扩散范围] [最大扩散范围] false @e[type=ArmorStand,tag=random]
  4. /execute @e[type=ArmorStand,tag=random] ~ ~ ~ detect ~ ~ ~ minecraft:stone_pressure_plate 1 /setblock ~ ~ ~ minecraft:stone_pressure_plate 0

至此,我们已经给每个出现的盔甲架(带有lucky_block_active标签)附加上的随机生成的计分板分数
为了使盔甲架在获得分数到生成事件之间分数不发生变化,执行以下指令:

  1. /scoreboard players tag @e[type=ArmorStand,score_random_min=1,tag=lucky_block_active] remove lucky_block_active

表示:所有在random计分板中分数大于等于1(这里表示分数不为0)的盔甲架(lucky_block_active),执行此指令后会消除其lucky_block_active标签
此指令可以在一个独立的循环型命令方块(保持开启)中执行,因为在盔甲架得到分数到消除标签、锁定分数之间,即使分数发生变化,也对整体没有影响

3)随机事件生成阶段

现在到最后阶段啦~
事件生成一般是以......的方式构造命令方块组的(全部使用“保持开启”模式)
中间部分(除去第一个和最后一个)的命令方块自己随便用,首尾两个命令方块有一定的要求

  1. 第一个
  2. /scoreboard players tag @e[score_random_min=2333,score_random=2333] add 2333
  3. 第二个
  4. /scoreboard players reset @e[tag=2333] random
  5. 最后一个
  6. /kill @e[type=ArmorStand,tag=2333]

这里2333代替了盔甲架在random最终获得的分数

(第二个其实无所谓啦。。。)
幸运方块的事件生成是以盔甲架(2333标签)为参照物定位的
比如这个简单黑曜石水牢

  1. /execute @e[tag=2333] ~ ~ ~ /execute @p ~ ~ ~ /fill ~-1 ~-1 ~-1 ~1 ~2 ~1 minecraft:obsidian 0 replace
  2. /execute @e[tag=2333] ~ ~ ~ /execute @p ~ ~ ~ /setblock ~1 ~1 ~ minecraft:glass 0 replace
  3. /execute @e[tag=2333] ~ ~ ~ /execute @p ~ ~ ~ /setblock ~-1 ~1 ~ minecraft:glass 0 replace
  4. /execute @e[tag=2333] ~ ~ ~ /execute @p ~ ~ ~ /setblock ~ ~1 ~1 minecraft:glass 0 replace
  5. /execute @e[tag=2333] ~ ~ ~ /execute @p ~ ~ ~ /setblock ~ ~1 ~-1 minecraft:glass 0 replace

然后就做完啦!

发表评论

您必须 登录 才能发表留言!