Minecraft(我的世界)中文论坛

 找回密码
 注册(register)

!header_login!

只需一步,立刻登录

查看: 1557|回复: 10

[命令方块] [1.9]CB逻辑FAQ、常见错误

[复制链接]
发表于 2016-2-8 16:53:07 | 显示全部楼层 |阅读模式

您尚未登录,立即登录享受更好的浏览体验!

您需要 登录 才可以下载或查看,没有帐号?注册(register)

x
本帖最后由 pca006132 于 2016-8-2 07:32 编辑

大家好,这里是CB逻辑的FAQ(不是fa q),这个帖子想写很久了,然而一直都懒得写,今天就写几个新手常见的问题吧。
先说明一下,这个帖子是不会怎么解释个别命令的用途、写法的,而且会用到一些简写,所以请先明白一下命令的用法之后再来看本帖子
常用简写表:


高频是啥?为什么要高频?
刚学cb的时候我也挺纳闷: 啥是高频啊?高频来干啥啊?
到了现在我总算可以说一下什么是高频,以及为何要高频了
需要知道的是,CB是不能够使用MC的Event的,就是说,mc里面发生了什么事情也好,cb是不会自动激活的
(什么刷怪笼检测玩家位置生成指定pos的红石块掉落沙的黑科技这里暂时不提)
cb几乎是只能透过某些数值的修改来判断某件事情有没有发生过。因此,我们就需要不断地去检测某些数值去判断有没有发生过某些事情,然后去作出相应的操作。
其实呢,高频也是有一个问题的,就是不可以在那个gt里激活其他的CB,因为CB需要1gt以激活,所以难以做到模块调用什么的(全部都高频检测的话除外),也难以做到在1gt内clone自身同时激活那个指令(就是循环啊递归那那堆高级东西)


啥是微观延迟?不管微观延迟会有什么问题?
其实呢,微观延迟只是玩cb这类东西的人才会那么叫它的,是所谓的微观延迟就是命令在同一gt内执行的先后次序
在1.8的时候,微观延迟才是一个大问题,在1.9,因为ccb的出现,微观延迟的影响已经减低了很多了,然而还是有它的影响的: icb、rcb之间的执行先后次序我之前看着别人用我的懒癌卫士,看着他们用的一大堆rcb我心都醉了。rcb和rcb之间的激活次序几乎是未知的,如果你那个系统的逻辑对次序没有要求那倒还好,如果有要求的话那就会出现下面的问题了: 次序混乱


顺序?次序乱了有什么问题?
经常看见新人会犯这个错误,就是命令的顺序乱了。

其实我也是挺不理解的,明明次序乱了根本就执行不了他们为什么总是觉得没问题呢?
比如他们会先把玩家杀掉,然后execute玩家去执行某些指令。
我这时就在纳闷,well,你杀掉了玩家还想玩家怎么execute?

一般来说呢,系统的执行顺序是一个很重要的因素,会直接影响出来的结果是否正确的。
举个栗子,1 + 2 * 3,小学生也会先乘除后加减吧23333
我们很清楚 1 + (2 * 3)得出的结果是和 (1 + 2) * 3截然不同的,命令也是如此
execute掉落物生成某个东西然后杀掉掉落物,和杀掉掉落物之后execute掉落物生成某个东西的结果是截然不同的
前一个就能够成功生成。后面那个?掉落物都死了你还想怎么execute啊
比如是很简单的非门,先set @a scb 1,然后set @a scb 0 {HurtTime:0b}
依着上面的次序就是一个成功的非门,当HurtTime不等于0的时候分数就是1。然而顺序反了的话,分数就会永远是1了(因为set 1那个是没有任何条件的)

单人?多人?究竟有何分别?(这个章节里面scb和tag是混为一体的讨论的,因为它们都能够标记实体)
相信第一次做系统的CBer都会有这个疑惑:为什么我的系统一到多人就会bug了?
其实这就要从你的逻辑开始说起了。举个栗子:

假设我要做一个系统,当玩家杀死了一只怪物的时候就会给他一个金粒。以下是三个方案:
1: 检测怪物是否存在(testfor),不存在的时候(比较器+非门)就give @p 金粒
2: 弄一个记分板,判据为totalKillCount,然后使用scoreboard players test(或者是testfor @a[score_(记分板)_min=1])来检测玩家有没有杀死过怪物,当比较器有信号就给玩家金粒,并且把那个分数重置
3: 与2类似,不过就改为高频give @a[score_(记分板)_min=1] 金粒,然后scoreboard players set @a (记分板) 0


这三个方法有什么坏处呢?给你们一点时间想想。下面是答案


从上面的例子我们可以看到,testfor这类命令其实是有个局限性的,就是难以对每个实体去进行分别的操作,所以这时候我们需要记分板/tag。
为什么呢?因为我们能够使用记分板标记每个符合条件的实体,并对不同分数的实体进行不同的操作,而不是检测到符合条件的实体之后就进行某个操作(而这些操作一般来说都是不会限制对象的)。

那么,究竟单人的系统和多人的系统有什么分别呢?(读者: 打死楼主!绕了这么大个圈圈才入正题)
单人的系统简单来说就是使用了很多类似例子1、2的系统,就是使用了很多的testfor(特地使用testfor的另当别论),而没有考虑到当目标多于一个(而且可能多于一个)的时候该如何处理的系统。(简单来说就是多人会出现bug 23333333)
而多人的系统一般来说就是使用分数来标记实体,然后利用execute、选择器这类能够分别对不同实体进行不同操作的命令去执行所需操作,因此在多人(或者是多个目标)的时候不会出现bug的系统。

*进阶
一般来说呢,很多单人系统都能够透过使用记分板来"升级"为多人系统的,然而有些情况下是不行的。
“execute 实体 指令”这个其实就是对选择到的实体执行一个命令,然后到下一个实体执行,如此类推直至全部选择到的实体都执行完毕。然而,有些情况下我们会希望对每个实体执行多个命令,之后才到下一个实体。
比如说多人的钓鱼竿传送系统。那个流程是这样的: 把玩家传送到对应的浮标(name=unknown)
然而,我们如何把玩家传送到对应的浮标呢?即使我们有办法为每个玩家设定一个独特的编号,并且对其抛出的浮标设定一个编号,然而我们要检测哪对玩家、浮标分数相同,并且tp,我们就需要两个命令: 所有浮标分数 -= 一个玩家的编号,然后把玩家tp到分数为0的浮标。
问题来了,我们该如何对每个实体执行两个(或以上)的命令呢?目前是无解的。
所以我们有两个方法:
穷举,就是穷举什么编号对什么编号,问题在于当穷举量不足的时候系统就会出现bug了(虽然就这个例子来说,估计穷举三十个已经足够了)
批量处理,其实就是穷举的变种,好处就是能够减少穷举量、减少bug,然而问题就是效率可能会比较低。方法就是一大堆类似的命令去处理几个实体,然后其余的就等下一个gt的处理(处理过的就弄个tag,然后处理c=1,tag=!什么什么的实体)


来自testfor的逆袭: testfor类指令的用处
看了前面的小朋友们可能会觉得: 哇!testfor辣鸡啊,以后不用了! 然后为了避免被testfor党揍,楼主只好写了这个篇章
其实呢,testfor不是没用,然而你使用的时候要有正确的姿势!以下就说说楼主是怎么使用testfor这类指令的

1. flag
游戏什么的,不立个flag相信你会挺痛苦的2333333333333
用途就是记录一下发展到什么地步、该作出什么动作啊等等的(相信经常玩galgame的大家都非常清楚了)
flag嘛,难道你还需要分别针对他们去作出操作吗23333当然就是检测他们然后决定做什么啊,所以这种情况下testfor就比记分板方便多了,直接多了
尤其是在1.9,有了cond,妈妈再也不用担心2gt的延迟啦

2. 一些只需要探测的东西
和flag类似,只需要探测自然不需要分别去进行操作啊233333
比如之前进阶例子里所说的批量处理,那里可以加入个testfor,当符合指定条件的实体不存在时,那些命令自然不需要执行
一些类似while循环的系统一般也会使用testfor这类的东西的

3. testforblock这类型的
嘛,当你要检测方块的nbt的时候,你能想到一个方法直接execute增加分数吗?反正我就想不到。这种情况下stats + testforblock这类指令自然是你最好的选择了。

4. 服务器
做过大型多人游戏的朋友应该很清楚,大部分服务器是禁不起高频的肆虐的,基本上高频服务器的话很容易会爆炸的。所以我们都是局部高频,然后根据情况去激活命令,而不是全部命令一起高频的。

scb?tag?我应该用什么?
相信很多刚开始玩1.9的朋友都会对此感到疑惑,我该用scb还是tag啊233333【其实楼主也是在摸索,然而懒着懒着就找到点好方法了
以下是楼主的几个守则,希望能帮到大家

1. 计算用scb
这点就不用说了,难道计算还用tag吗(╯‵□′)╯︵┻━┻

2. 逻辑运算/经常修改标记就用scb
其实呢,用tag倒不是不可以,然而会麻烦。为什么这么说呢?就让我举个栗子
比如说是一个简单的非门,我们需要先把所有实体设置一个分数(或者是tag),然后当那个实体符合某个条件就设定另一个分数(或者移除先前的tag并且加上新的tag)
那么你们说哪个方便点?当然是scb啦233333直接覆盖掉前面那个,不用自己去移除

3. 多个条件用scb
为什么这么说呢?选择器的蛋疼特性你们又不是不知道的,每个条件只能出现一次,tag就只能检测一个。然而scb就不同了,能检测好几个分数,那么自然是scb好了。

那么是不是不用tag呢?当然不是了23333
以下是几个用tag的情况

4. 生成某实体,并且需要标记的话,用tag
scb也不是不行,然而你需要检测nbt,很多时候就是nbt出错了,而且这个比较麻烦。
倒不如在生成的时候在nbt那里加上Tags:["tag1"]这样子更方便,直接在生成的时候瞬间标记好。

5. 实体分类用tag
用记分板当然可以,然而麻烦啊,你很多分类的话你打算怎么办?一大堆记分板?还是分bit那样子储存分数?检测的时候又要做一大堆计算?
tag大法好,直接加上tag,然后就可以放任不管了,多方便啊23333

由于楼主要和周公谈心了,所以其他的FAQ就明天继续慢慢更新所以请大家明天继续看哦:D

以下是几个楼主的帖子,希望能够帮助到大家
记分板基础用法 这里说的是一些记分板的基本逻辑运算,比如and or not啊,还有一些数值方面的比如如何生成随机数、比较分数
1.9逻辑 这个是1.9的情况下,如何做到一些逻辑运算(and or not那些,以及嵌套)
NBT教程 虽然与逻辑无关,然而相信NBT是命令这个范畴里一个比较蛋疼的东西,这个教程说明的就是不同类型的nbt,以及如何修改、检测
选择器教程 这个就是选择器的讲解,相信也没哪个选择器教程比这个更详尽了(可能是我孤陋寡闻吧),用好选择器能节省很多力气的
懒癌卫士 这么好的机会怎么能不安利懒癌卫士呢?懒癌卫士就是一个1.9的命令编辑器,内置自动补全等方便功能来自群组: Command Block Logic

评分

参与人数 11人气 +16 金粒 +205 收起 理由
ruhuasiyu + 1 MCBBS有你更精彩~
lzs1234 + 2 + 50 忘评分了
acordome + 1 CB逻辑FA Q 233333
guaiwanji + 1 太霸气的帖子了!
FHC红石 + 3 + 50 发现没评分
握地师兄 + 1 + 20 1.9CB逻辑FA Q 【手动滑稽
chyx + 2 好平
=w=_Agus + 1 + 15 我的眼睛 理论贴+1
kongbaiyo + 2 + 35 我的眼睛 理论贴+1
_Duang_ + 1 + 15 hhhhhhhhhhh不赖
白天 + 1 + 20 Mcbbs有你更精彩~

查看全部评分

回复

使用道具 举报

发表于 2016-2-8 17:04:42 | 显示全部楼层
沙发
不错的帖子
另外testfor那一栏对咱很有帮助
(不会编了233)

点评

不明觉厉。。。  详情 回复 发表于 2017-5-30 13:16
回复

使用道具 举报

发表于 2016-2-8 17:13:55 | 显示全部楼层
楼主厉害
看不懂
新年快乐{:10_559:}
挺有帮助的
回复

使用道具 举报

发表于 2016-2-8 17:14:34 | 显示全部楼层
testfor还可以探测人数

点评

然而execute @a ~ ~ ~ scoreboard players add ... 也行的 用testfor的话除非是接到红石系统里,不然的话其实是更加麻烦了,因为要stats  详情 回复 发表于 2016-2-8 17:22
回复

使用道具 举报

 楼主| 发表于 2016-2-8 17:22:07 | 显示全部楼层
FHC红石 发表于 2016-2-8 17:14
testfor还可以探测人数

然而execute @a ~ ~ ~ scoreboard players add ...
也行的
用testfor的话除非是接到红石系统里,不然的话其实是更加麻烦了,因为要stats

评分

参与人数 1金粒 +1 收起 理由
FHC红石 + 1 我的不要计分板

查看全部评分

回复

使用道具 举报

发表于 2016-2-9 13:43:02 来自手机 | 显示全部楼层
写的很好,顶!
回复

使用道具 举报

发表于 2016-2-9 17:03:10 | 显示全部楼层
表示我还没玩过1.9的QAQ
回复

使用道具 举报

发表于 2016-2-9 20:47:23 | 显示全部楼层
大量用rcb要光是次序混乱就算了
这个顺序在跨区快时顺序可能在退出重进后变的。。。。。
http://www.mcbbs.net/thread-490944-1-1.html

评分

参与人数 1人气 +2 金粒 +35 收起 理由
pca006132 + 2 + 35 怪bugjang

查看全部评分

回复

使用道具 举报

发表于 2016-8-3 19:35:13 | 显示全部楼层
我这个玩红石的完全看不懂..

评分

参与人数 1人气 -1 金粒 -10 收起 理由
Zero_Exact -1 -10 无意义

查看全部评分

回复

使用道具 举报

发表于 2016-11-19 09:38:12 | 显示全部楼层
表示看不大懂

评分

参与人数 1人气 -1 金粒 -10 收起 理由
Zero_Exact -1 -10 无意义

查看全部评分

回复

使用道具 举报

发表于 2017-5-30 13:16:27 | 显示全部楼层
白天 发表于 2016-2-8 17:04
沙发
不错的帖子
另外testfor那一栏对咱很有帮助

不明觉厉。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册(register)

本版积分规则

Archiver|小黑屋|Mcbbs.net ( 京ICP备15023768号-1 ) | 手机版本

GMT+8, 2017-11-20 01:29 , Processed in 0.164133 second(s), 18 queries , Memcache On.

"Minecraft"以及"我的世界"为Mojang Synergies AB的商标。本站与Mojang以及微软公司没有从属关系。

© 2010-2017 我的世界中文论坛 版权所有。本站原创图文内容版权属于原创作者,未经许可不得转载。

快速回复 返回顶部 返回列表