Conditions - Chunk7w/mappet GitHub Wiki
条件 是 Mappet 中,一种用于监测各类参数的机制,与表达式功能类似,但使用的是截然不同的 GUI 编辑器,以及条件语句块。如果你不擅长编程,则可以尝试使用条件来代替表达式的功能。
条件支持在所有检测器中使用。
机制
条件可以设置多个条件语句块,这些条件语句块会监测当前环境,并返回一个布尔值(你可以理解它为是或不是,开或关,正或负,true
或 false
,1
或 0
)。
条件功能会 从上到下 遍历这些语句块,并逐一对它们进行求值。默认情况下,若所有语句块返回的都是正值,则该条件就会生效,并启用它应该启用的东西(例如启用发射器方块中的红石信号)。单个语句块可以进行反转,以及使用 OR(或) 进行比较(也就是使用 OR(或门) 而不是 AND(与门) 进行比较),甚至可以通过使用条件语句块进行嵌套。
示例
假设我们有以下几个条件:
默认情况下,可以把该条件读作:
如果玩家「拿着一个草方块」 并且 「是白天?」
只有在所有条件都符合的情况下,即玩家确实手持一个草方块,而且还是白天(游戏世界的时间介于 0
和 12000
之间)时,才会返回 true。
这一情况可以被总结为下面的表格:
语句块 | 结果 |
---|---|
拿住草方块 | true |
白天? | true |
但是,一旦其中一个条件变成了 false
,例如玩家没有拿着草方块,那么整个条件就会返回一个否定的结果。
不过,如果你想让玩家拿着草块,或者时间应该为白天,这种情况下,需要将「白天?」语句块标记为 或(OR) 语句,如图所示:
这样一来,如果玩家拿着草块,或者时间是白天,该条件便会发送一个肯定的结果。可以把它读作:
如果玩家「拿着草方块」或者「是白天?」
❗ 按钮用于反转一个语句块返回的结果,所以,如果我们选择「拿着草方块」语句块,并启用反转功能:
这样一来,条件就可以读作:
如果玩家 没有 「拿着草方块」 或者 「是白天?」
若此时,玩家没有拿着草方块,或者时间为白天,发射器方块就能发出红石信号了。
如果你是在嵌套条件里加上这些条件的话,它还会变得更复杂。对于这种情况,我的建议是 读出 这些语句块,看看它的逻辑是否合理。
编辑
当监测器模块被切换至 条件 状态时(出现 编辑条件... 按钮的时候),点击 编辑条件... 按钮,即可打开条件编辑器模块:
在显示 右击此处... 的区域右键,并选择 添加条件...,即可开始添加条件。可以试着添加一个「世界时间」的条件语句块。添加好后,你可以在左侧查看条件语句块列表,而右侧的,是条件语句块编辑器。
此时再进行右键,则可以对条件进行移除、拷贝和粘贴。如果列表中存在多个条件语句块,则可以拖拽它们来进行排序。
条件语句块
截至本篇文档发布前,条件编辑器支持以下条件语句块:
- 任务 语句块 - 该语句块可用于检测任意数量的玩家(或是整个世界中)是否有正在进行,或是已完成(即,不存在)的任务。
- 状态 语句块 - 该语句块可用于比较玩家或整个世界的某个状态。
- 对话 语句块 - 该语句块可用于检测玩家是否阅读了某个对话。
- 阵营 语句块 - 该语句块可用于检测玩家当前的关系属于哪一阵营。
- 物品 语句块 - 该语句块可用于检测玩家是否手持、装备,或在背包中存有某个物品。
- 世界时间 语句块 - 该语句块可用于检测世界时间。
- 条件 语句块 - 该语句块可用于设置嵌套条件。
所有条件语句块都有两个类似于 ❗ 和 🔀 的按钮。 ❗ 可用于反转语句块的输出结果, 🔀 按钮可用于将该语句块从 与(AND) 标记为 或(OR) 语句,来和之前语句块的结果相结合。
任务语句块
在任务语句块中,你可以选取任务的 ID、完成状态(不存在、存在或已完成)和目标玩家(关于目标的更多信息,详见下文)。
状态语句块
在状态语句块中,你可以选取某个状态的状态键(Key)、寻找该状态的目标(关于目标的更多信息,详见下文)和比较模式(关于比较模式的更多信息,详见下文。
对话语句块
在对话语句块中,你可以选取对话的 ID、标记 ID 和目标玩家(关于目标的更多信息,详见下文)。
阵营语句块
在阵营语句块中,你可以选取阵营的 ID、阵营的比较模式、目标玩家(关于目标的更多信息,详见下文)和比较模式(关于比较模式的更多信息,详见下文)。
阵营的比较模式可以为:
- 敌对 - 检测被搜寻到的玩家的态度是否为敌对。
- 中立 - 检测被搜寻到的玩家的态度是否为中立。
- 友好 - 检测被搜寻到的玩家的态度是否为友好。
- 积分 - 使用比较模式来检测被搜寻到的玩家的阵营积分。
物品语句块
在物品语句块中,你可以选取任意一组物品、物品比较模式以及目标玩家(关于目标的更多信息,详见下文)。
物品的比较模式可以为:
- 拿住(手) - 检测被搜寻到的玩家是否必须手持该物品(物品组本身的数量不纳入检测条件)。
- 装备(盔甲) - 检测被搜寻到的玩家的盔甲槽中(即头盔、胸甲、护腿或靴子)是否有某个物品组。
- 背包 - 检测被搜寻到的玩家的背包中是否有某个物品组。
世界时间语句块
在世界时间语句块中,你可以选择时间条件模式,以及时间范围(仅在时间条件模式为 介于... 时可用)。
时间条件模式可以为:
- 白天? - 检测世界是否为白天(
0
—12000
)。 - 夜晚? - 检测世界是否为夜晚(
12000
—24000
)。 - 介于... - 检测世界时间是否介于最小值(左侧的参数)和最大值(右边的参数)。
条件语句块
在条件语句块中,你可以通过点击 编辑条件... 按钮来编辑嵌套条件,该操作会在当前条件编辑器的基础上,再打开一个条件编辑器,并在那里编辑新的条件。
目标选择
在大多数条件编辑器中,会有一个 目标 按钮,用于切换至不同的目标选择模式。
- 全局 - 目标为整个世界/服务器。
- 主对象(Subject) - 目标为事件语境中的主对象(Subject)。
- 次对象(Object) - 标为事件语境中的次对象(Object)。
- 选择器 - 根据目标选择器给定的参数,锁定目标玩家(若目标选择器搜寻到了一个以上的玩家,则语句块会返回查找无效)。 译注:Subject 以及 Object 的译文在未来可能进行改动。
比较
在一部分条件语句块编辑器中,会存在一个 比较 模块,可以对 found(查找到的)
值设置比较。值参数可以设置用于计算比较的 target(目标值)
。假设 found
和 target
都是变量,则比较运算符的机制如下:
found < target
(<
) - 若found
小于target
则为 truefound <= target
(<=
) - 若found
小于或等于target
则为 truefound == target
(==
) - 若found
等于target
则为 truefound >= target
(>=
) - 若found
大于等于target
则为 truefound > target
(>
)- 若found
大于target
则为 true