Minecraft指令手册

你好MC

首页 >> Minecraft指令手册 >> Minecraft指令手册最新章节(目录)
大家在看 掌中宝 七夜宠妻 灌篮高手之仙道彰的崛起 婚意绵绵,嫁给总裁33天 人在美漫,我是女英雄们的白月光 古穿今之武戏女王 重生方协文玫瑰孕气不断 绝地求生:非酋的逆袭 千户待嫁 火系法爷修炼指南
Minecraft指令手册 你好MC - Minecraft指令手册全文阅读 - Minecraft指令手册txt下载 - Minecraft指令手册最新章节 - 好看的游戏小说

第九十九章 初识模块-简单的注册\/登录系统 下

上一章 书 页 下一章 阅读记录

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

在上一章,我们解决了一个世纪难题:输入。这一章,我们将会尝试实现『注册』这个功能。

我们先理一下这个系统到底是怎样的:

1有一个passord触发器,存储着玩家的密码,注册时玩家要填写的字段

2有一个is_typed计分项,用来检测玩家是否填写了密码

3玩家按下按钮后,为玩家打开passord触发器,并指示玩家通过\/trigger指令填写密码。玩家填写密码后,检测玩家的密码是否符合要求,如果符合则通过检测并传送走玩家,如果不符合则返回错误信息,并再次为玩家打开触发器指示玩家填写。

理清楚之后,我们就可以开始动工了。我们将会采用前几章刚了解的『红石逻辑组』作为基础来建设这个系统。先搭建一个简单的结构:

◎墙→A→b (插图99-1)

◎······按钮

→······红石中继器

首先,既然要『玩家按下按钮后,为玩家打开passord触发器』,那么第一个命令方块A就应该填写:

scoreboard players enable @p passord

\\\\为最近的玩家开启它的passord计分项\\\\

命令方块b用来实现『指示玩家通过\/trigger指令填写密码』,因此填写:

tellra @p {“text“:“请运行指令\\“\/trigger passord set <密码>\\“输入账户密码来注册“,“color“:“yello“}

\\\\告诉最近的玩家『请运行指令“\/trigger passord set <密码>“输入账户密码来注册』\\\\

然后呢?我们需要一个一直处于运行状态的红石逻辑组来不断检测玩家是否已经输入密码,所以我们要在旁边搭建一个红石脉冲并配上一些命令方块:

脉冲→c→d→E (插图99-2)

c:execute as @p store success score @s is_typed run scoreboard players enable @s passord

\\\\检测玩家是否输入密码\\\\

d:tellra @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 passord set <密码>“输入账户密码来注册

*输入指令:\/trigger passord set *

已触发[passord](数值已设置为)

注册成功,请记好你的密码哦!

*被传送走*

运作得十分棒!但是,如果你再次尝试使用trigger指令的话......

*输入指令:\/trigger passord set *

已触发[passord](数值已设置为)

注册成功,请记好你的密码哦!

?我不是注册过了吗?

没错,这个beta1.0的系统漏洞百出,它起码有这几个问题:

1已注册的玩家可再注册

2passord一直可以被修改

3可能无法很好应对多玩家情况

4系统运作较慢

5对于后续扩展出『登录』功能不友好

为了解决这些问题,我们可以采用tag标签对玩家进行标记。那么我们会用到哪些tag标签呢?

?对于注册中的玩家,需要registering标签

?对于已经注册的玩家,需要registered标签

?对于处于登录中的玩家,需要logging_in标签

?对于已经登录的玩家,需要logged_in标签

其中,register是注册的意思,log in是登录的意思。

我们需要在玩家刚刚开始注册\/登录时给玩家添加上registering或logging_in标签以防止选择到那些已经登录和注册的人,给那些注册成功的玩家添加上registered标签和logged_in标签并移除掉registering标签,给那些登录成功的玩家添加上logged_in标签并移除掉logging_in。在后面,我们还会使用更多的标签来完善整个系统的运作。

另外,我们还需要关闭成功注册玩家的passord触发器以防止注册了还能再修改passord,还需要在每次红石逻辑组结束运行时重置每名玩家的is_typed的分数值。前者我们可以通过execute以玩家为执行者运行一遍trigger passord 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] passord

c:tellra @a[tag=registering]{“text“:“请运行指令\\“\/trigger passord set <密码>\\“输入账户密码来注册“,“color“:“yello“}

d:execute as @a[tag=registering] store success score @s is_typed run scoreboard players enable @s passord

E:execute as @a[tag=registering,scores={is_typed=1}] run tag @s add registered

\\\\给成功注册的玩家添加registered标签\\\\

F:tellra @a[tag=registering,scores={is_typed=1}]{“text“:“注册成功,请记好你的密码哦!“,“color“:“green“}

G:execute as @a[tag=registering,scores={is_typed=1}] run trigger passord add 0

\\\\将成功注册玩家的passord触发器使用一遍以关闭\\\\

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\\\\

现在,我们的『注册\/登录系统』beta2.0测试版出来了!让我们测试一下:

n个『已将xxx的[is_typed]分数设为0』

*按下按钮*

已为xxx添加了标签'registering'

请运行指令“\/trigger passord set <密码>“输入账户密码来注册

n个『已将xxx的[is_typed]分数设为0』

*输入密码*

已触发[passord](数值已设置为)

已为xxx启用了触发器[passord]

已移除xxx的标签'registering'

n个『已将xxx的[is_typed]分数设为0』

......

出bUG了,还是个很严重的bUG。

不要慌张,让我们来排查一下到底是什么问题。

仔细阅读上面的日志,你会发现:

由于红石逻辑组的特性,在过长的逻辑组中,执行顺序会难以把控,然后就出现了上面的问题。

那该怎么办?

改用『纯指令逻辑组』。

『纯指令逻辑组』,其实是目前最常见的逻辑组。它有一个更加专业的法:模块。在本书中,它也被称之为『命令块链』。

我们其实已经见过很多次『纯指令逻辑组』了,它其实就是由一个脉冲或循环型命令方块+一大串连锁型命令方块组成的。比如下面的这串命令方块:

A→b→c→d→(插图:99-4)

(为了方便,下面我都会称这东西为『模块』)

在这边,箭头代表着命令方块的朝向,A为循环型,bcd均为连锁。这些命令方块的朝向使得它们环环相扣。

循环型命令方块A是整个模块的核心,它负责整个模块的更新。如果A还是『始终活动』,那么A还具有维持整个模块运行的功能。我们从A是循环型这一点也不难看出,这个逻辑组还是个重复型逻辑组。

连锁型命令方块bcd是整个模块的通路。相比红石逻辑组通过红石元件来控制执行顺序,模块通路的执行顺序更加直观也不容易出乱子——因为它是通过命令方块的朝向来决定执行顺序。这也就是为什么在上面的模块中,执行顺序是从左到右的原因。

模块的难点在于对通路的理解,更确切地是对『连锁型命令方块』运作机制的理解。还记得我们在第二章提到的内容吗?让我们回顾一下:

『青得一批的那个是链(又叫做连锁),作用是你叫它动一下(接入红石信号),它不会动。它只会在收到执行信号时,将该执行信号立马传递给下一个它指向的链命令方块,然后再根据当前条件判断是否要执校听起来似乎有点复杂?举个例子:

E→F→G→h→

其中,E是未被激活的脉冲命令块,FGh三个命令方块都是已被激活且无条件限制的链命令块。当E激活时,EFGh将会同时执行指令,因为E激活时向F发出了执行信号,F收到后也向G发出了信号,G也向h发出了信号,三个链命令方块也都没有条件限制。』

现在,让我们仔细研究一下上面的EFGh为何会这样子执校为了搞清楚为何这样子,我们就得研究一个东西:

执行信号

可以肯定的是,游戏本身并没雍执行信号』这东西,但为了方便大家理解,我就根据命令方块的性质总结出来了『执行信号』这个东西。那么这东西有什么特别的呢?

脉冲型和循环型命令方块,在被激活的同时不仅仅会尝试运行指令,还会产生执行信号并尝试将其传递给它所朝向的连锁型命令方块。

连锁型命令方块不管是无条件还是条件限制、需要红石还是始终活动、有被激活还是没被激活,只要它收到了执行信号,那么它就一定会尝试将该信号传递给它所朝向的下一个连锁型命令方块,当然它在传递的同时也会根据当前条件决定是否要运行指令。

举个简单的例子:

甲→乙→丙→丁→(插图:99-5)

甲:脉冲型,需要红石,无条件,没有写指令

乙:连锁型,没有写指令

丙:连锁型,没有写指令

丁:连锁型,需要红石,无条件,写有\/setblock ~~1 ~ diamond_block

当我们同时激活甲和丁时,尽管甲乙丙都会因为没有填写指令而执行失败,但丁却因为收到了由甲产生并经过乙丙传递的执行信号,加上本身已被激活且没有条件限制,就执行了指令,在上面放置了一个钻石块。

这就是执行信号。但连锁型命令方块并不一定会在接收到执行信号后立马就执行指令,它还会看一下情况:

1如果自身未被激活

→不会运行指令,仅仅会传递执行信号

2如果自身已被激活

→1.如果没有条件限制

→→尝试运行指令,然后再传递执行信号

→→否则不会运行指令,仅仅会传递执行信号

→2.如果有条件限制

→→如果正后方的命令方块上一次执行指令成功

→→→尝试运行指令,然后再传递执行信号

→→→否则不会运行指令,仅仅会传递执行信号

举个例子:

戊→己→庚→(插图:99-6)

戊:脉冲、不受制约、需要红石,填雍setblock ~~1 ~ minecraft:diamond_block』

己:连锁、条件制约、始终活动,填雍say yes』

庚:连锁、不受制约、始终活动,填雍say no』

当我们第一次激活『戊』命令方块时,戊就会在上方放一个钻石块,己由于戊执行成功,就会发送『yes』的消息,庚由于不受制约所以肯定会发出『no』的消息,最终三个命令方块都运行了指令。

当我们第二次激活『戊』命令方块时,由于戊上方已经有钻石块了,所以指令执行失败。己由于戊执行失败,自己也不会执校最终只有戊和庚执行并且只有庚执行成功。

如果你能看懂并理解上面的内容,那么恭喜你,你已经基本上掌握了连锁型命令方块的运作机制,模块本身最难以理解的点已被攻破。现在让我们回到注册\/登录系统上,尝试以模块的形式替代原有的红石逻辑组:

◎墙A→b→c→(插图:99-7)

d→E→F→G→h→I→J→

A[脉][无][红]——execute positioned ~~~-3 run tag @a[distance=..3,tag=!registered,tag=!logged_in] add registering

b[链][无][始]——同替代前

c[链][无][始]——同替代前

d[重][无][红]

E[链][无][始]

F[链][无][始]

G[链][无][始]

h[链][无][始]

I[链][无][始]

J[链][无][始]

现在,我们系统的beta3.0版本出来了,让我们测试一下bUG有无解决:

*按下按钮*

已为xxx添加了标签'registering'

请运行指令“\/trigger passord set <密码>“输入账户密码来注册

n个『已将xxx的[is_typed]分数设为0』

*输入密码*

已触发[passord](数值已设置为)

已为xxx启用了触发器[passord]

已为xxx添加了标签'registered'

注册成功,请记好你的密码哦!

已触发[passord](数值已增加0)

已将xxx传送到 13.,-60.000000, 10.

已移除xxx的标签'registering'

n个『已将xxx的[is_typed]分数设为0』

解决了!!!

现在,我们已经完成了这个系统的大半部分,接下来我们将会尝试完成『检测玩家的密码是否符合要求,如果符合则通过检测并传送走玩家,如果不符合则返回错误信息,并再次为玩家打开触发器指示玩家填写』这个部分。

其实这个部分相当简单。比如我们想要玩家不能设定密码为0,就可以这么干:

在d命令方块后面插入两个新的命令方块,写入以下内容

execute as @a[tag=registering,scores={is_typed=1}] unless score @s passord matches 0 run tag @s add correct_input

\\\\为密码不是0的玩家添加标签correct_input(正确输入)\\\\

execute as @a[tag=registering,scores={is_typed=1}] if score @s passord matches 0 run tag @s add error_input

\\\\为密码是0的玩家添加标签error_input(错误输入)\\\\

修改E、F、G、h、I命令方块的内容为

execute as @a[tag=correct_input,tag=registering] run tag @s add registered

tellra @a[tag=correct_input,tag=registering]{“text“:“注册成功,请记好你的密码哦!“,“color“:“green“}

execute as @a[tag=correct_input,tag=registering] run trigger passord add 0

execute as @a[tag=correct_input,tag=registering] run tp @s 13 -60 10 180 0

execute as @a[tag=correct_input,tag=registering] run tag @s remove registering

在I后新增命令方块3个,内容为

execute as @a[tag=correct_input,tag=registered] run tag @s remove correct_input

execute as @a[tag=registering,tag=error_input] run tellra @s {“text“:“请不要将0作为你的密码,请重新输入“,“color“:“red“}

execute as @a[tag=registering,tag=error_input] run tag @s remove error_input

让我们测试一下:

......

*输入密码*

已触发[passord](数值已设置为0)

已为xxx启用了触发器[passord]

已为xxx添加了标签'error_input'

请不要将0作为你的密码,请重新输入

已移除xxx的标签'error_input'

*再次输入密码*

已触发[passord](数值已设置为1)

已为xxx启用了触发器[passord]

已为xxx添加了标签'correct_input'

已为xxx添加了标签'registered'

注册成功,请记好你的密码哦!

已触发[passord](数值已增加0)

已将xxx传送到 13.,-60.000000, 10.

已移除xxx的标签'registering'

已移除xxx的标签'correct_input'

oK,完美运行,这就是系统的beta4.0版本。

只不过由于篇幅限制,我们就讲到这里。接下来对于『登录』功能甚至『登出』功能的实现,请你自己独立完成。这边有几个要求和提示:

1登录模块和注册模块要分开,但其实两者的原理都差不多

2创建一个新的触发器enter_passord,用于登录密码的输入

3优化模块的运行,使得玩家在按下按钮后才会调用登录和注册模块,并在没有处于登录\/注册中的玩家后停止模块运行(提示:setblock或fill红石块)

4创建一个新的触发器,已登录的玩家可以修改此触发器到一个特定的值来退出登录

5新玩家进来后必须要出生在注册\/登录房里

6未追踪玩家的分数无法被比较。所以如果你拿未追踪玩家的分数来比较,由于没有分数,所以游戏总会返回false(假)

你可以加qq群或通过作家的话中的网盘链接获取到我做的完整『注册\/登录系统』的存档(minecraft Java1.19版本,非网易版)。

本章到此为止。

喜欢Minecraft指令手册请大家收藏:(m.86xiaoshuo.com)Minecraft指令手册86小说更新速度最快。

上一章 目 录 下一章 存书签
站内强推 披荆斩棘的赘婿:从扮演傻子开始 吞噬圣尊 重生之杀手至尊 夺嫡:疯癫王爷竟是绝世全才! 恶雌身娇体弱,四个兽夫轮流喂养 我怎么成别人的外挂了 重回高考,暑假从10元赚到2亿 我在异界种田封神 特种高手在都市 综影视:尊重他人命运 大唐:开局邀请皇后前往草原做客 天兽鼎 黑神特战队 南国三部曲:从邪恶中拯救我 宿舍求生,我被拉进了管理群 刀来启示录 明末亲军锦衣卫 青龙道仙 全民转职:让你当死灵法师,没让你当肝帝 老婆给了一巴掌,宿主说爽到了
经典收藏 爱你,怪我入戏太深 恐怖游戏逃生指南 综漫:我野原新之助,天生剑豪! 率土:最强雇佣兵 春风十里,不如你 重生:游戏才刚出,你怎么就乱杀 火影:抓我实验?那我不当人了! 网游:我杀死的野怪都成了召唤兽 摄政王妃要逆天 锦鲤缘 绝地求生:非酋的逆袭 仙医武圣 求生游戏:奥丁的战争领主 错婚诱情 如妻而至 款款情深,霸道总裁好无赖 人在木叶:开局公开处刑 三国之武魂传说 热血传奇之沙城城主 重生之神级败家女
最近更新 全民深海游戏 网游之双星传说 杀怪掠夺属性点,这一世我无敌了 超神:暗影大帝降临 文明之万象王座 网游:神级刺客,窃取百分百成功 梦幻西游:我的大主播系统 开局在马刺发育三年 NBA数据自由定制,谗哭科詹库 火影:开局觉醒无限瞳术 百变小樱:转世后制作卡牌 全民塔防:塔防世界你搁这养蛊呢 四合院:柱子从39年开始 不好意思,所有武器我全是绝活 团播,主播他有恋爱脑死亡守护 自建帐以来:罗马汗国记 轮椅飙车公路求生 网游:蓝星online NBA:开局融合盘古精血 星耀足坛:史上最强带刀后卫
Minecraft指令手册 你好MC - Minecraft指令手册txt下载 - Minecraft指令手册最新章节 - Minecraft指令手册全文阅读 - 好看的游戏小说