肉丁土豆园地

安静的小博客里,属于我的编程时光
玩家进入退出检测 - 我的世界OCO指令系列

最近在搞一些我的世界指令。
其中有这么一个指令,就是玩家进入退出的检测。

本指令不需要引用任何模块。

意义

玩家进入退出的检测是一个老生常谈的问题了。然而现在流传的大多数对应指令有很多缺陷,于是我研究出了一套功能较为全面,避免大多数缺陷的检测系统。

本检测系统有如下好处

  • 指令编写工程化,可读性高
  • 可以获得一段时间内退出或者进入的具体人数,避免了可能的误差,且检测间隔可调整。
  • 可以通过标签获取到新进入的玩家。
  • 作为附加功能,可以获得当前在线人数。
  • 不包含红石。

有如下坏处:

  • 出于指令的即时性考虑,只能作为框架在原命令方块组中间追加命令,而不能作为一个模块异步调用。
  • 相对于其他的指令实现可能看起来比较复杂。

指令

由于我没有完整的构思就写了这个指令,所以不贴原理了。

scoreboard players operation TE-numLast TE = TE-num TE
scoreboard players set TE-num TE 0
execute @e ~~~ scoreboard players add TE-num TE 1
scoreboard players operation TE-diff TE = TE-num TE
scoreboard players operation TE-diff TE -= TE-numLast TE
execute @e ~~~ scoreboard players operation @s TE-tick -= TE-tick TE
tag @e add TE-new
tag @e[scores={TE-tick=0}] remove TE-new
scoreboard players add TE-tick TE 1
scoreboard players operation @e TE-tick = TE-tick TE
// 这里是指令插入点
tag @e[tag=TE-new] remove TE-new

除了第一个命令是循环之外,其余命令均为连锁命令方块,无延迟无条件。

用法

看指令也能看出来,这个实际上不是玩家的进入和退出的检测,而是实体的增加和减少的检测。这是因为可以通过修改在指令插入点内的指令的选择器来进行筛选。

在指令插入点内,可以通过 TE-new 标签获取新增的实体,通过 TE-numTE 计分板获取当前实体数量,通过 TE-diffTE 计分板获取相较于上次检查变化的数量。

posted on 2024-02-05 23:57  肉丁土豆表  阅读(16)  评论(0编辑  收藏  举报