本帖最后由 贰逼 于 2017-4-18 22:41 编辑

首先说两句废话,spreadplayers指令大家可能没有听说过,是因为这条指令设计的领域脱离了Mc指令研究主流——区域随机。但是这条指令一旦要使用,用处非常大,所以大家必须好好学习这条指令,同时也能解决大家一些对于这条指令的疑问。

索引:
1Page - SpreadPlayers用途、指令格式
2Page - SpreadPlayers疑难解答
3Page - SpreadPlayers输出特点
4Page - SpreadPlayers成品


SpreadPlayers用途、指令格式

这条指令用于对玩家(1.8之后对于所有实体)在指定的区域内传送并将实体打散(Spread-传播、蔓延)。通过这个特点,可以做出许多形形色色的装置,最常用的领域就是在PVP游戏中为了防止玩家在起点不进行斗殴,可以用这条指令进行随机传送。
与Tp不同,不是将玩家传送到某一个特定的点,而是将玩家传送到特定的区域内随机的点。
例如:


原本的盔甲架▲


在tp中选择红色羊毛左下角白色羊毛点后的盔甲架▲


spreadplayers选择原坐标、白色羊毛范围(红色羊毛)之后的盔甲架△

有上面的例子我们可以直接区分tp与spreadplayers差别——点与范围,固定与随机。

那么Spreadplayers究竟如何使用?


  1. /spreadplayers <x> <z> <spreadDistance><maxRange><respeceTeams true;false> <player ..>
复制代码
  1. /spreadplayers <x坐标> <z坐标> <扩散最小距离> <扩散最大距离> <是否启用队伍 true或者false> <玩家 ..>
复制代码

其中,xz为需要扩散玩家的中心点,最小距离与最大距离形成一片平面区域,并扩散玩家。
[第二页:疑难解答]

SpreadPlayers疑难解答

xz两坐标:
首先来解答关于为何只有xz两坐标而不是xyz三坐标。
从前文中有一个细节——平面区域,所以xz选择的只能是一个平面区域,那为什么没加入y围成一个立体区域进行扩散?没有y会不会卡进其他方块?
看一下图解:

一个最大距离为4,最小距离为0的平面,周围突起▲

中心放置盔甲架▲

第一次扩散,仿佛被卡在了凹陷处▲

但是第二次扩散证明了扩散(Spreadplayers)不受y坐标限制△


既然不会卡进方块,会不会掉落?

最大距离2,最小距离0的区域▲
红色羊毛与白色羊毛起落相差10+

传播后虽然传播到了下层,但是不会掉落。
所以通过验证,xz的值是自定的,而y默认为世界高度(256),则选择除了x,256,z的一个立体区域进行传播,因而省略y坐标。
(同时出现的传播特性在下页讲解)

队伍的true与false:
很容易理解,就是是否开启队伍模式

例如我是红队,在这个区域传播

指令中开启队伍模式,只有红队可以传播

而其他的队伍就不会有任何事情发生。

若开启队伍:
  1. /spreadplayers x z 最小距离 最大距离 true @a[team=队伍颜色] 目标选择器 特殊NBT
复制代码

若关闭队伍:
  1. /spreadplayers x z 最小距离 最大距离 true  目标选择器 特殊NBT
复制代码

[第三页:输出特点]
SpreadPlayers输出特点


1.正方形区域
由于xz的立体区域定性,所以输出只会在最大距离和最小距离所形成的方形区域内。

一个最小距离0,最大距离4的区域,按照类似r=5的定性思维,输出会在红色区域内,


2.区域范围为256*平方差
尚文提到了所形成的是边相等的正方形,
而最小距离和最大距离所形成的准确来说则是平方差


传播在最小距离2,最大距离5区域中,


无论如何,都在范围平方差(5?-3?=16)的区域内传播,所以输出的范围值为平方差

3.传播至方块表层
spreadplayers类似小黑瞬移一样,不会卡进方块(上文已提到),不会坠入底部,只会传送到方块表层。

最大距离5,最小距离0的红色区域内,中空,传播会不会是实体掉落虚空?

不会,传播自动选择方块表层




↑不会出现这种情况


[/quote]
[第四页:成品]


SpreadPlayers成品
1.平方差随机器:(为drognoz灵感)

  1. /summon 生物名 红色羊毛坐标 ~ ~ ~ {Attributes:[{Name:generic.movementSpeed,Base:0.0}]}
复制代码
首先在红色羊毛(及y轴更向上坐标)生成,
然后执行
  1. /spreadplayers x z a b false @e[type=生物名]
复制代码
之后便有了一个随机值范围:
(2b)?-(2a)?
=(2b+2a)(2b-2a)
这个随机器是目前最简单的大范围随机器


概率随机器:
小概率:


  1. /summon 生物名 下层中心点坐标 ~ ~ ~ {Attributes:[{Name:generic.movementSpeed,Base:0.0}]}
复制代码
生成用于随机的实体
  1. /spreadplayers 下层中心点坐标 0 a false @e[type=生物名]
复制代码
若下方大区域边长为m,上方小区域边长为n,则概率为:
n?/m?
最后固定输出
大概率:

3.世界随机传送
首先我们要认识到tp可以tp到世界边境(tp坐标无限),由此所以spreadplayers也不受长度制约(受玩家数量制约)
所以世界传送大法在服务器里是/r或者/tp r
原版中是:
  1. /spreadplayers 0 0 0 世界范围半径 false @p
复制代码


当然,spreadplayers也用于玩家互动类游戏(PVP、运动类)等,
总之,spreadplayers是一条强大的随机指令

[groupid=546]Command Block Logic[/groupid]