首页 男生 游戏竞技 Minecraft指令手册

第九十八章 触发器-简单的注册/登录系统 上

Minecraft指令手册 你好MC 4714 2024-07-09 15:29

  (本章已于2022年7月31日重写)

  现在,我们已经了解了N多条指令,并学会了搭建红石逻辑组,但我们似乎并没有拿所学的知识来做点什么有趣的东西。在此前的章节中,最多最多,我们也就用了几个命令方块来实现诸如生成钻石之类的小功能,谈不上有多厉害。

  所以在接下来的内容中,我们将会用指令在Minecraft Java1.19版本中尝试做出一个有趣的具有实际功能的东西,那到底这个东西是什么呢?

  在『第五十一章 whitelist-白名单』这一个章节,我提到了在Minecraft Java的离线服务器中,单纯使用白名单并不保险。而在给出的三个解决方法中,第二条写到:

  『不要使用原版的服务端,采用第三方可以装插件的服务端或在原版服务端的基础上裝Forge再加上Sbr /ongeForge(海绵端),并给服务器装上适宜的登录插件,让玩家进入服务器还需输入一次密码进行二次验证』

  现在有很多Minecraft Java服务器就是这么干。这些服务器往往会开两个甚至更多的MC服务器——一个主服,另一个是专门用来登录的登录服。当玩家想要进入他们的服务器时,往往并不会直接进入到主服,而是先进入到登录服进行登录,登录成功后玩家才能进入到主服(例子有EaseCation服务器,你在服务器退出登录后就会来到它的登录服)。对于某些没钱的服务器来说,虽然开不了登录服,但也会装一些登录插件,让玩家在登录之后才能进行全部的操作。

  但是不管怎样,以上的效果都是要在安装第三方服务端,并安装服务器插件(甚至可能还要配置数据库)之后才能做到。那在原版中,我们能否通过指令来实现以上效果呢?

  如果仅仅说是做出一个『注册/登录』的效果来说,在Minecraft Java版中当然是可以的,而且也很容易做出来。让我们来试一试。

  要做出『注册/登录』系统,首先我们要清楚:

  什么是注册和登录?

  Oxford Languages词典对『注册』一词的定义如下:

  『特指电子计算机某网络的用户向该网络输入用户名、密码等,以取得对该网络的使用许可』

  结合我们平常注册账号的常识,不难得出,注册和登录的流程是这样的:

  用户向服务器发送注册/登录请求→服务器让用户填写用户名和密码等信息→用户填写完后,将信息发送至服务器→服务器检查信息→服务器根据检查的结果,判断是否允许用户进行下一步操作

  现在,我们要在Minecraft中做出『注册/登录』的效果,本质上其实就是要实现上面的流程。而为了实现上面的流程,我们就要研究一下如何把上面的流程转化到Minecraft中。

  我们可以做一个房间,设置出生点就在这个房间里面,然后放置一个按钮在墙上,并告诉玩家需要点击这个按钮来注册/登录。玩家点击这个按钮后,就会激活相应的逻辑组运行指令,此时就可以输入用户名和密码进行注册或登录,命令方块也会获取到玩家填写的内容,并进行一番操作,最后告诉玩家是否成功,如果成功则将他传送到外面。

  前半段很简单,我们可以很容易做出来一个里面放着一个按钮的房间(插图98-1)。难点其实在后半段,有两个难点要解决:

  ①怎么让玩家输入用户名和密码,并将这些信息存储到哪里?

  ②怎么检测玩家输入的内容是否符合要求?

  先来看第一个问题。

  让玩家输入用户名和密码,首先就是要有一个能够让玩家输入文字的地方。在Minecraft中,哪里可以输入文字呢?

  多得去了!聊天框、书与笔、铁砧、命令方块......重点在于,我们是否可以正确获取到玩家输入的文字,并将其储存起来?

  先来看看书与笔。我们可以检测书与笔的NBT,然后将获取到的信息储存在.......

  书与笔的内容肯定不只是数字,所以我们不能将信息储存在计分板中,只能将信息储存到某个NBT标签中。然而,一方面我们还没有正式学习NBT,另一方面我们也不知道储存在哪里,储存完后又该如何获取如何修改,因此采用书与笔作为输入框的方法对于现在的我们来说,不可取。

  既然书与笔不可取,那么铁砧、命令方块等一大堆东西就都不行了。额,所以现在,我们应该怎么获取、从哪获取到玩家的输入内容并将其储存起来呢?

  或许我们应该换个角度思考:我们可以将玩家输入的内容存储到哪里?

  对于现在的我们来说,计分板是个不错的选择。等等,那么我们是否可以开放一个计分项让玩家自由修改,然后我们再从中获取计分项的值呢?

  好主意!但问题来了,要修改计分项的话,玩家就得有2级权限(Java版),但就算是个傻子也不会给刚进服的玩家2级权限吧?况且,/obr /和/deobr /可不能在命令方块中运行。

  那是否有没有一种方法,能够让没有权限的玩家也能够修改特定计分项的值呢?

  还真有!那就是:

  触发器(Trigger)

  在『第四十一章 objectives——管理一个计分项』中,我们曾经了解到trigger准则计分项所具有的特性:

  『触发器,类似于dummy,但所有玩家均可修改自己的trigger型计分项』

  也就是说,我们可以创建一个trigger准则的计分项,然后指示玩家去修改自己在这个计分项上的分数,进而达到『玩家输入,我们也能检测到并储存』的效果。

  那我们到底该怎样正确使用触发器呢?

  让我们先创建一个trigger准则的计分项:

  /scoreboard objectives add br /assword trigger

  这将会创建一个叫做『br /assword』的trigger准则计分项,我们将会使用它来储存玩家的密码。

  然后呢,怎么让玩家能够修改?

  你应该知道,让玩家使用/scoreboard br /layers set 去修改自己的trigger类计分项的分数是不现实的,因为scoreboard必须要2级权限才能使用。因此,Mojang专门为触发器加入了一条指令:

  /trigger

  作用:修改执行者自己的trigger计分项上的分数

  存在版本:Java1.8-今

  需要权限等级:Java-0

  需要作弊:否

  格式:

  /trigger <允许的trigger计分项>

  \\使执行者自己在指定计分项上的分数+1\\

  /trigger <允许的trigger计分项>(add|set)<值>

  \\设置执行者自己在指定计分项上的分数\\

  举个例子:

  /trigger br /assword set 1

  如果br /assword是个已被启用的trigger计分项,那么运行上述指令将会修改执行者自己在br /assword计分项上的分数为1。

  等等,『已被启用』是个啥意思?trigger计分项要被修改还得先启用?

  没错,Mojang虽然给了我们触发器,但是这个触发器并不是随时随地都能让没权限的玩家自由修改的。要让玩家能够使用触发器,首先你需要使用scoreboard br /layers enable命令来为指定玩家启用触发器:

  /scoreboard br /layers enable <目标>

  比如:

  /scoreboard br /layers enable @s br /assword

  就可以让我们自己能够修改一次br /assword。注意啊!不是无限修改,而是只能修改一次!

  就算你为指定玩家启用了触发器,但只要那批玩家使用trigger指令修改了一次,那么触发器就会自动关闭,直到我们再次为他们开启触发器。也就是说,如果你这样运行指令,将会得到如下结果:

  /scoreboard br /layers enable @s br /assword

  已为XXX启用了触发器[br /assword]

  /trigger br /assword set 1

  已触发[br /assoword](数值已设为1)

  /trigger br /assword set 1

  你尚无法触发这个记分项

  总而言之:要让玩家修改触发器,得先打开触发器,然后玩家就能够修改一次,修改完后触发器自动关闭,直到下一次被打开。

  懂了吧?现在我们回来看看上面的第一个问题,你是否已经想到了解决办法?

  没错,就是:

  先创建一个储存密码用的br /assword的触发器计分项(这步我们上面已经完成了)。当玩家按下按钮时,为其打开该触发器,并指示玩家通过/trigger指令修改该触发器的值,同时不断检测玩家是否已经输入。当检测到玩家输入时,对玩家输入的内容进行检查,如果符合条件则通过检测,否则重新打开触发器,让玩家重新输入。

  这已经非常符合最终的注册和登录流程了。但是我们仍然要解决两个问题:

  ①如何检测玩家是否输入了密码?

  ②到底密码要符合怎样的条件才可以通过检测?

  (唉作者,用户名呢?用户名怎么办?)

  (其实不需要用户名,玩家名称完全可以当成用户名来使用)

  对于第一个问题,我们有两个解决办法:

  ①不断检测触发器的值是否改变,也就是通过execute的条件子命令判断

  这个方法最简单,但是有些问题:万一玩家输入的是默认值该怎么办?

  ②不断尝试为指定玩家打开触发器,并将成功次数存储到另一个计分项上

  这个方法也很简单,只要计分项的值不等于0,就代表着打开触发器成功,也就代表玩家已经输入过了。这同时也能解决『万一玩家输入的是默认值』的问题。

  因此,我们不妨采用第二个解决办法,创建一个专门的计分项来记录触发器是否打开成功:

  /scoreboard objectives add is_tybr /ed dummy

  然后在等待玩家输入密码的过程中,不断重复执行:

  /execute as 玩家 store success score @s is_tybr /ed run scoreboard br /layers enable @s br /assword

  随后检测就可以了。

  第二个问题就更简单了,因为这个问题没有标准答案,我们也不会在这章讨论这个问题。

  现在,我们成功解决了输入的问题,整个『注册/登录』系统的最大难关已被拔除。在下一章,我们将会尝试搭建一个简陋的Beta版本,来检测一下我们的想法是否可行。

目录
设置
手机
书架
书页
评论