(此章节已于2022年7月31日重写)
在上一章,我们解决了一个世纪难题:输入。这一章,我们将会尝试实现『注册』这个功能。
我们先理一下这个系统到底是怎样的:
①有一个password触发器,存储着玩家的密码,注册时玩家要填写的字段
②有一个is_typed计分项,用来检测玩家是否填写了密码
③玩家按下按钮后,为玩家打开password触发器,并指示玩家通过/trigger指令填写密码。玩家填写密码后,检测玩家的密码是否符合要求,如果符合则通过检测并传送走玩家,如果不符合则返回错误信息,并再次为玩家打开触发器指示玩家填写。
理清楚之后,我们就可以开始动工了。我们将会采用前几章刚了解的『红石逻辑组』作为基础来建设这个系统。先搭建一个简单的结构:
◎墙→A→B (插图99-1)
◎······按钮
→······红石中继器
首先,既然要『玩家按下按钮后,为玩家打开password触发器』,那么第一个命令方块A就应该填写:
scoreboard players enable @p password
\\为最近的玩家开启它的password计分项\\
命令方块B用来实现『指示玩家通过/trigger指令填写密码』,因此填写:
tellraw @p {“text“:“请运行指令\“/trigger password set <密码>\“输入账户密码来注册“,“color“:“yellow“}
\\告诉最近的玩家『请运行指令“/trigger password set <密码>“输入账户密码来注册』\\
然后呢?我们需要一个一直处于运行状态的红石逻辑组来不断检测玩家是否已经输入密码,所以我们要在旁边搭建一个红石脉冲并配上一些命令方块:
脉冲→C→D→E (插图99-2)
C:execute as @p store success score @s is_typed run scoreboard players enable @s password
\\检测玩家是否输入密码\\
D:tellraw @p[scores={is_typed=1}]{“text“:“注册成功,请记好你的密码哦!“,“color“:“green“}
\\给已输入密码的玩家发送成功提示\\
E:execute as @p[scores={is_typed=1}] run tp @s 13 -60 10 180 0
\\把注册成功的玩家传送走\\
这样子,我们的Beta1.0注册登录系统就做好了!让我们来试一试:
*按下按钮*
请运行指令“/trigger password set <密码>“输入账户密码来注册
*输入指令:/trigger password set *
已触发[password](数值已设置为)
注册成功,请记好你的密码哦!
*被传送走*
运作得十分棒!但是,如果你再次尝试使用trigger指令的话......
*输入指令:/trigger password set *
已触发[password](数值已设置为)
注册成功,请记好你的密码哦!
?我不是注册过了吗?
没错,这个Beta1.0的系统漏洞百出,它起码有这几个问题:
①已注册的玩家可再注册
②password一直可以被修改
③可能无法很好应对多玩家情况
④系统运作较慢
⑤对于后续扩展出『登录』功能不友好
为了解决这些问题,我们可以采用tag标签对玩家进行标记。那么我们会用到哪些tag标签呢?
?对于注册中的玩家,需要registering标签
?对于已经注册的玩家,需要registered标签
?对于处于登录中的玩家,需要logging_in标签
?对于已经登录的玩家,需要logged_in标签
其中,register是注册的意思,log in是登录的意思。
我们需要在玩家刚刚开始注册/登录时给玩家添加上registering或logging_in标签以防止选择到那些已经登录和注册的人,给那些注册成功的玩家添加上registered标签和logged_in标签并移除掉registering标签,给那些登录成功的玩家添加上logged_in标签并移除掉logging_in。在后面,我们还会使用更多的标签来完善整个系统的运作。
本小章还未完,请点击下一页继续阅读后面精彩内容!
另外,我们还需要关闭成功注册玩家的password触发器以防止注册了还能再修改password,还需要在每次红石逻辑组结束运行时重置每名玩家的is_typed的分数值。前者我们可以通过execute以玩家为执行者运行一遍trigger password add 0来实现,后者可以通过加上写有『scoreboard players set @a is_typed 0』的命令方块来实现。
让我们在系统中加入标签进行筛选,并加入上面的指令,看一看是否能够解决一些问题:
◎墙→A→B→C(插图:99-3)
脉冲→D→E→F→G→H→I→J
A:execute positioned ~~~-4 run tag @a[distance=..3,tag=!registered,tag=!logged_in] add registering
\\给未登录且未注册的玩家添加registering标签\\
B:scoreboard players enable @a[tag=registering] password
C:tellraw @a[tag=registering]{“text“:“请运行指令\“/trigger password set <密码>\“输入账户密码来注册“,“color“:“yellow“}
D:execute as @a[tag=registering] store success score @s is_typed run scoreboard players enable @s password
E:execute as @a[tag=registering,scores={is_typed=1}] run tag @s add registered
\\给成功注册的玩家添加registered标签\\
F:tellraw @a[tag=registering,scores={is_typed=1}]{“text“:“注册成功,请记好你的密码哦!“,“color“:“green“}
G:execute as @a[tag=registering,scores={is_typed=1}] run trigger password add 0
\\将成功注册玩家的password触发器使用一遍以关闭\\
H:execute as @a[tag=registering,scores={is_typed=1}] run tp @s 13 -60 10 180 0
I:execute as @a[tag=registering,scores={is_typed=1}] run tag @s remove registering
J:scoreboard players set @a is_typed 0
\\重置is_typed\\