███摘要:随着MC的CBer们的脑洞与创造力不断提升,不少CBer期望能够实现诸如随机生成物品、随机刷新资源、随机给予装备等要求。因此不少人开始了对随机执行命令或使用命令产生随机结果的方法进行了探索,并摸索出了诸多通过纯命令来获得随机结果的方法。本文对截至目前(1.16.1)的Java Edition中能够进行随机执行命令或产生随机结果的方法进行了总结。使用论文格式仅供娱乐。
███关键词:Minecraft Java Edition;命令;数据包;随机;目标选择器;战利品表;谓词
1.背景
███大部分命令的执行均为固定结果,即在完全相同的条件下命令的执行结果是完全相同的,而这在一定程度上限制了不少CBer们的能力。而跳出这一限制,用有限的命令在同一情景下做出多种不同的随机效果,这样的作品无疑会很吸引眼球。而要灵活掌握随机命令的精华,则需要对能够产生随机结果的方法有较为熟练的掌握,并在适当时选取合适的方法。
███本文在总结能够通过命令的方式产生随机结果的方法的基础上,对这些方法的适用场景以及使用技巧加以概述,以求能够解开各位心中的疑惑。
2.基于刷怪笼的命令执行随机
███该方法的适用版本为1.4+,随机结果为随机执行多条命令中的一个或几个。
(待编辑)
3.基于命令spreadplayers的实体分散随机
███本方法的适用版本为1.6.1+,随机结果为将玩家在指定区域随机分散。1.8+版本中也常用于实体的随机分散。
███该方法基于命令/spreadplayers对实体的随机分散特性,能够将实体在指定区域分散,常用于玩家的随机传送与Marker的随机分散。命令/spreadplayers的语法格式为:spreadplayers <x> <z> <分散间距> <最大范围> <考虑队伍> <传送目标…>
(1.16+为spreadplayers <x> <z> <分散间距> <最大范围> [under 最大高度] <考虑队伍> <传送目标…>
)[1]。其中传送目标可填写多个玩家名或UUID或目标选择器。
███一般用于单个实体随机传送时,无需关注“分散间距”与“考虑队伍”两个参数,任意填写符合命令语法的参数即可。在同时分散多个无队伍实体时,可以适当控制实体的分散间距,已避免实体在某个区域过度集中分布。
███该方法常用于单个Marker的随机分散,如用于建筑生成的Marker在地表的随机传送。也常用于某些资源的全图随机刷新,如部分小游戏地图中的全图随机道具刷新。
4.基于发射器与命令方块的命令方块放置随机(已移除机制)
███本方法的适用版本为1.8 ~ 1.8.5,随机结果为随机放置最多9个命令方块中的一个。
(待编辑)
5.基于@r/sort=random的目标选择器随机
███本方法的适用版本为1.8+,随机结果为随机选择一个或多个实体。
███虽然@r目标选择器早在1.4版本即被加入,但由于大多数地图玩家数量较少或为单人地图,因此虽然@r选择器能在理论上实现随机,但实际能力有限,直到1.8支持选择实体后才得到较为广泛的应用。
███在1.8 ~ 1.12.2版本中,@r除了可以用来随机选择玩家,也可以在指定了type参数后用来随机选择非玩家实体。这样就可以在数个实体中随机选取所需实体进行加分或加tag来进行标记,并配合后续操作。以此为基础,可以事先准备数个有着相同标记而有不同信息的标记实体并进行随机选取后加分或加tag,并根据选取的信息选择执行不同的命令。
███在1.13之后,@r不再可以选择非玩家实体,取而代之的是sort=random参数。在1.13+版本中的@e[type=<实体id>,sort=random,limit=1]
即等价于1.8 ~ 1.12.2版本中的@r[type=<实体id>]
。
███MCBBS用户⭐✔️曾依据此原理,在1.12版本下对Marker进行随机加分并获取分数,并进行一些后期处理来达到生成指定范围内的随机数的目的[2]。
███综合来看,使用目标选择器进行随机可用于Marker的随机标记、玩家的随机分组等,有着一定的应用空间。
6.基于战利品表的物品随机
███本方法的适用版本为1.9+,随机结果为产生一个或多个物品。除了可以随机给玩家物品以外,还可以根据随机生成的不同物品来执行不同的命令。
(待编辑)
7.基于UUID获取的分数随机
███本方法的适用版本为1.13+,随机结果为产生一个随机分数。一个实体最多只能产生2个(1.16+后为4个)随机数。实际使用时一个实体往往只会使用一个随机数。可根据分数的不同执行不同的命令。
(待编辑)
8.基于谓词的是非随机
███本方法的适用版本为1.15+,随机结果决定了一条命令是否执行,或一个实体是否被选中。若无execute store子命令的配合,一般情况下一次随机的结果只能被使用一次。
(待编辑)
9.总结
(待编辑)