【麦仁丝课堂】第一期 玩家序数(UID)统计系统
本帖最后由 Mirence 于 2024-6-15 18:46 编辑命令方块进阶教程之
玩家序数统计系统
导语:玩家序数统计系统的功能是给予每一个玩家对应的数字,也就是很多服务器中所说的UID,有利于更好地分辨和定位玩家。
玩家序数统计系统的简要内容如下表:
难度★
主要指令/tag, /scoreboard
用途服务器
玩家序数统计系统的主要流程如下图:
正文:
这里的命令方块组结构采用的是简单的“循环开启+若干连锁有条件”类型。
第一步:跟踪一个未被统计过的玩家。
我们可以随机为一个未被统计过的玩家添加一个实体标签t1,用于跟踪这个玩家*。因为一次只能给予一个玩家一个序数,所以为避免两个未被统计过的玩家同时上线,这里采用随机玩家@r作为目标选择器的变量。
可以将以下指令写入第一个“循环 开启”命令方块中(t2是已统计的玩家拥有的标签):
tag @r add t1*跟踪:当一个命令方块不足以对一个玩家执行完所有命令,而且两个命令方块中的目标选择器可能无法选择到同一个玩家时,可以先用一个命令方块标记这个玩家,以便后面更多的命令方块可以都对该玩家执行命令,麦仁丝将这种方法称为“跟踪”。如上文我用@r作为目标选择器的变量,如果不对这个随机玩家进行“跟踪”,且所有命令方块都用同一个目标选择器“@r”的话,那么这明显是错误的。除了可以通过实体标签跟踪外,还可以通过计分板、盔甲架(实体)等进行跟踪。
第二步:给予跟踪的玩家玩家序数(UID)
首先,我们需要一个虚拟实体来记录当前玩家拥有的最高的序数,即上一次给予玩家的序数。当第一个命令方块成功执行后(也就是当游戏中存在未被统计过的玩家时),在给予序数之前,我们可以为虚拟实体e1在计分板se(专门统计虚拟实体分数的计分板,无初始分数)上的分数加1分,然后再将e1在se上的分数赋值给被跟踪玩家在计分板s1上的分数(即让被跟踪玩家在s1上的分数等于e1在se上的分数)。s1就是专门用来统计各个玩家的玩家序数的计分板。此时这个被跟踪玩家的玩家序数就能比上一个玩家高一分了,实现了每一个玩家在s1的分数各不相同。
我们可以将以下指令写入第二个“连锁 有条件”命令方块中:
scoreboard players add e1 se 1 我们可以将以下指令写入第三个“连锁 有条件”命令方块中:
scoreboard players operation @a s1 = e1 se
第三步:取消跟踪玩家
给予了被跟踪玩家序数之后,这个玩家已经成为被统计过的玩家(可以理解为注册过的玩家),最后我们只要在给予被跟踪玩家一个表示已统计的标签t2,再去掉被跟踪玩家的跟踪标签t1,所有命令就执行结束了。
我们可以将以下指令写入第四个“连锁 有条件”命令方块中:
tag @a add t2 我们可以将以下指令写入第五个“连锁 有条件”命令方块中:
tag @a remove t1 当又有一个新玩家进入游戏时,他(她)又会被跟踪,并在s1上给予其比上一个被跟踪的玩家高1的分数,以此推类……于是便实现了每一个玩家对应一个分数,这就是各个玩家的玩家序数(UID)。
玩家序数统计系统 思维流程图:
思维导图注释:
循环:第一个命令方块为重复命令方块
添加: 添加实体标签
删除:删除实体标签
设置:计分板指令
e:s:(虚拟)实体e在计分板s上的分数
玩家序数统计系统 指令内容汇总:
①tag @r add t1 循环 开启
②scoreboard players add e1 se 1 连锁 有条件
③scoreboard players operation @a s1 = e1 se 连锁 有条件
④tag @a add t2 连锁 有条件
⑤tag @a remove t1 连锁 有条件
玩家序数统计系统 事物名称汇总:
计分板:2个
s1:玩家序数计分板
se:虚拟实体计分板
└ e1:最高序数
实体标签:2个
t1:用于跟踪一个未统计玩家
t2:已统计玩家
虚拟实体:1个
e1: se: 最高序数
那么,本期教程就到这里结束了。如果真正掌握了玩家序数统计系统并且能够灵活运用命令方块的话,实际上可以发现教程中的一些内容仍然是可以简化和调整的。但麦仁丝更加喜欢清晰地表达,也就是清晰在前,简化在后。本期教程作为命令方块进阶教程的第一期教程,也是一次试验,所以内容是比较简单的,以后还会有许多比较复杂的内容,希望这种教学方式能够让大家更好地理解教程的内容。
感谢大家的支持!!!
(本期教程最早于2021年8月9日发布于网易我的世界论坛,现麦仁丝已转驻苦力怕论坛,将停止在网易我的世界论坛上的发布教程)
点此前往 麦仁丝课堂 目录
点此前往 命令方块进阶教程 食用指南
(本期视频版教程尚未发布)
其他版本:
在线序数统计系统plus
玩家序数统计系统plus
本帖最后由 Mirence 于 2023-2-27 12:04 编辑利用1.19版本更新的/execute指令可以再次简化该装置,最少只需要3个命令方块!!!(原本写的2个来着后来发现不行。。。)
点击前往 玩家序数统计系统plus
不过,我应该并不是第一个发现能够简化的人,毕竟1.19版本已经出了一段时间了[贴吧_滑稽]。
本帖最后由 小逗 于 2023-1-18 16:11 编辑
让没tag的玩家向虚拟实体加一分
execute as @a positioned as @s run scoreboard players add uid uid 1同步一次分数
scoreboard players operation @a uid = uid uid给没tag的玩家加上tag
tag @a add uid共三步,这不就好了嘛[哔哩_微笑],干嘛硬凑五步
本帖最后由 Mirence 于 2023-1-18 16:55 编辑
对于玩家序数统计系统中的“跟踪”这一步骤:
若该装置只是用于为所有进入过游戏的玩家标上UID编号,因为两个玩家几乎不太可能同时同位置进入游戏,所以两个命令方块中目标选择器的选择对象基本是相同的,若能保证不会有以上事情发生,那么可以去掉“跟踪”这一步,这样能够省去两个命令方块;
若该装置不是用于UID编号,而是为符合一定条件的玩家编号,若有可能同时出现多个玩家符合条件,那么这里是一定要有“跟踪”这一步骤的。
Mirence 发表于 2023-1-18 16:54
对于玩家序数统计系统中的“跟踪”这一步骤:
若该装置只是用于为所有进入过游戏的玩家标上UID编号 ...
够严谨
这个忒快了吧( 666666666666666666
页: [1]