随机箱子位置与物品

By MCSugar_cane    2017/12/31

在饥饿游戏中,地图中所有的箱子都是随机生成的,其中的物品也都不同。想知道这是如何做到的吗?看看这个教程吧:3

甘小蔗:强烈建议下载演示地图,其中将系统一分为二,并通过指令分段执行详细化,可谓是十分详细!

随机箱子位置与物品演示地图

效果图:

随机箱子位置与物品



代码:

箱子随机位置部分:

  1. /summon Armor_Stand ~ ~2 ~ {CustomName:"ger",CustomNameVisible:1b,NoGravity:1}
  2. /spreadplayers 2002 214 0 20 false @e[type=armor_stand,name=ger,c=1]
  3. /execute @e[type=armor_stand,name=ger] ~ ~ ~ /setblock ~ ~ ~ chest

以此激活以上命令后,可以实现在XZ:2002 214的附近XZ20半径内随机放置一个箱子。

01: 生成名为ger的盔甲架,用作扩散

02: 扩散盔甲架ger,使其在XZ为2002 214的附近20格半径内扩散(位置随机)

03: 在盔甲架ger位置处放置箱子,用作后面随机物品的blockdata


箱子随机物品部分:

随机箱子位置与物品

首先,如图所示,召唤一组名为tpme的盔甲架用于@r随机选中,再tp一个实体(如atme)至随机的tpme处(指令为:tp @e[type=armor_stand,name=atme,c=1] @r[type=armor_stand,name=tpme],这里每个tpme被选中的几率为1/3),使其下坠激活压力板。各组压力板下指令分别为:

    1
  1. /execute @e[type=armor_stand,name=ger] ~ ~ ~ /blockdata ~ ~ ~ {Items:[{id:"minecraft:cake",Count:1b,Damage:0s,Slot:0b}]}
  2. /tp @e[r=3,name=atme] 1998 5 216
  3. /kill @e[type=armor_stand,name=ger]
  4. 2
  5. /execute @e[type=armor_stand,name=ger] ~ ~ ~ /blockdata ~ ~ ~ {Items:[{id:"minecraft:apple",Count:1b,Damage:0s,Slot:0b}]}
  6. /tp @e[r=3,name=atme] 1998 5 216
  7. /kill @e[type=armor_stand,name=ger]
  8. 3
  9. /execute @e[type=armor_stand,name=ger] ~ ~ ~ /blockdata ~ ~ ~ {Items:[{id:"minecraft:diamond",Count:5b,Damage:0s,Slot:0b},{id:"minecraft:bone",Count:2b,Damage:0s,Slot:5b}]}
  10. /tp @e[r=3,name=atme] 1998 5 216
  11. /kill @e[type=armor_stand,name=ger]

01,04,07: 都为编辑箱子内的物品数据标签,也就是定义箱子内物品。

02,03 05,06 08,09: 则是将被传送用来激活石制压力板的实体传送至原来的位置,并清除盔甲架ger,结束指令。

注意:

除了这一种方法之外,还可以用 execute @r[type=armor_stane,name=ger] ~ ~ ~ blockdata ~ ~-1 ~ {auto:1b}execute @r[type=armor_stane,name=ger] ~ ~ ~ blockdata ~ ~-1 ~ {auto:0b} 等等方法,来进行更简单的物品随机。这里{auto:1b}意思为使命令方块在无红石激活情况下强制被激活。

PS: 其实这里箱子物品随机用Loottable来实现更好,不过其设计内容较多,这里不再做介绍