限制弓射程

By MCSugar_cane    2018/02/14

在服务器弓能射到很远的地方,难免会使管理员头烦,所以做了这个限制玩家弓射程的教程,希望有助于你更好的管理~

PS: 代码在1.12版本下编写,其他版本请自行测试

效果图:

限制弓射程



判定箭是否为玩家射出:

首先这个弓射程限制如要只对玩家生效,还需要判定箭是否为玩家射出,如下:

初始化:

  1. /scoreboard objectives add useb stat.useItem.minecraft.bow 使用弓统计

判定是否为玩家射出: [高频循环]

  1. /execute @a[score_useb_min=1] ~ ~ ~ scoreboard players tag @e[type=arrow,r=2,tag=] add pArrow
  2. /execute @a[score_useb_min=1] ~ ~ ~ scoreboard players tag @e[type=spectral_arrow,r=2,tag=] add pArrow
  3. /scoreboard players tag @e[type=arrow,tag=!pArrow] add nArrow
  4. /scoreboard players set @a[score_useb_min=1] useb 0

01,02: 为玩家射出的弓箭(灵光箭)加上pArrow标签(在玩家使用弓后,给玩家附近2格内的新出现的无标签的弓加上pArrow标签)

03: 为非玩家射出的弓箭加上nArrow标签

04: 重置玩家使用弓次数



通过rm限制射程:

已知选择器"rm"是表示最小半径,与选择器"r"恰恰相反。如要选择玩家半径10以外的生物,则为@e[rm=10]

利用它我们可以轻松做到限制弓射程,也就是弓射程只在玩家半径N内。只需高频循环指令:

  1. /execute @a ~ ~ ~ entitydata @e[tag=pArrow,rm=25] {Motion:[0.0,-1.0,0.0]}


通过时间限制射程:

在多人中,用"rm"来限制射程就有些勉强了。我们可以采取另一种方法,也就是给在空中的箭计时,使其超过该计时则结束。

初始化:

  1. /scoreboard objectives add aTimer dummy

高频循环:

  1. /scoreboard players add @e[tag=pArrow] aTimer 1 {OnGround:0b}
  2. /entitydata @e[tag=pArrow,score_aTimer_min=20] {Motion:[0.0,-1.0,0.0]}

最后,情人节快乐~