Conditions - Chunk7w/mappet GitHub Wiki

条件 是 Mappet 中,一种用于监测各类参数的机制,与表达式功能类似,但使用的是截然不同的 GUI 编辑器,以及条件语句块。如果你不擅长编程,则可以尝试使用条件来代替表达式的功能。

条件支持在所有检测器中使用。

机制

条件可以设置多个条件语句块,这些条件语句块会监测当前环境,并返回一个布尔值(你可以理解它为是或不是,开或关,正或负,truefalse10 )。

条件功能会 从上到下 遍历这些语句块,并逐一对它们进行求值。默认情况下,若所有语句块返回的都是正值,则该条件就会生效,并启用它应该启用的东西(例如启用发射器方块中的红石信号)。单个语句块可以进行反转,以及使用 OR(或) 进行比较(也就是使用 OR(或门) 而不是 AND(与门) 进行比较),甚至可以通过使用条件语句块进行嵌套。

示例

假设我们有以下几个条件:

一个简单的条件

默认情况下,可以把该条件读作:

如果玩家「拿着一个草方块」 并且 「是白天?」

只有在所有条件都符合的情况下,即玩家确实手持一个草方块,而且还是白天(游戏世界的时间介于 012000 之间)时,才会返回 true

这一情况可以被总结为下面的表格:

语句块 结果
拿住草方块 true
白天? true

但是,一旦其中一个条件变成了 false,例如玩家没有拿着草方块,那么整个条件就会返回一个否定的结果。

不过,如果你想让玩家拿着草块,或者时间应该为白天,这种情况下,需要将「白天?」语句块标记为 或(OR) 语句,如图所示:

标记为或门

这样一来,如果玩家拿着草块,或者时间是白天,该条件便会发送一个肯定的结果。可以把它读作:

如果玩家「拿着草方块」或者「是白天?」

❗ 按钮用于反转一个语句块返回的结果,所以,如果我们选择「拿着草方块」语句块,并启用反转功能:

标记为非门

这样一来,条件就可以读作:

如果玩家 没有 「拿着草方块」 或者 「是白天?」

若此时,玩家没有拿着草方块,或者时间为白天,发射器方块就能发出红石信号了。

如果你是在嵌套条件里加上这些条件的话,它还会变得更复杂。对于这种情况,我的建议是 读出 这些语句块,看看它的逻辑是否合理。

编辑

当监测器模块被切换至 条件 状态时(出现 编辑条件... 按钮的时候),点击 编辑条件... 按钮,即可打开条件编辑器模块:

空白的条件编辑器

在显示 右击此处... 的区域右键,并选择 添加条件...,即可开始添加条件。可以试着添加一个「世界时间」的条件语句块。添加好后,你可以在左侧查看条件语句块列表,而右侧的,是条件语句块编辑器。

条件编辑器

此时再进行右键,则可以对条件进行移除、拷贝和粘贴。如果列表中存在多个条件语句块,则可以拖拽它们来进行排序。

条件语句块

截至本篇文档发布前,条件编辑器支持以下条件语句块:

  • 任务 语句块 - 该语句块可用于检测任意数量的玩家(或是整个世界中)是否有正在进行,或是已完成(即,不存在)的任务
  • 状态 语句块 - 该语句块可用于比较玩家或整个世界的某个状态
  • 对话 语句块 - 该语句块可用于检测玩家是否阅读了某个对话
  • 阵营 语句块 - 该语句块可用于检测玩家当前的关系属于哪一阵营
  • 物品 语句块 - 该语句块可用于检测玩家是否手持、装备,或在背包中存有某个物品。
  • 世界时间 语句块 - 该语句块可用于检测世界时间。
  • 条件 语句块 - 该语句块可用于设置嵌套条件。

所有条件语句块都有两个类似于 ❗ 和 🔀 的按钮。 ❗ 可用于反转语句块的输出结果, 🔀 按钮可用于将该语句块从 与(AND) 标记为 或(OR) 语句,来和之前语句块的结果相结合。

任务语句块

在任务语句块中,你可以选取任务的 ID、完成状态(不存在、存在或已完成)和目标玩家(关于目标的更多信息,详见下文)。

状态语句块

在状态语句块中,你可以选取某个状态的状态键(Key)、寻找该状态的目标(关于目标的更多信息,详见下文)和比较模式(关于比较模式的更多信息,详见下文。

对话语句块

在对话语句块中,你可以选取对话的 ID、标记 ID 和目标玩家(关于目标的更多信息,详见下文)。

阵营语句块

在阵营语句块中,你可以选取阵营的 ID、阵营的比较模式、目标玩家(关于目标的更多信息,详见下文)和比较模式(关于比较模式的更多信息,详见下文)。

阵营的比较模式可以为:

  • 敌对 - 检测被搜寻到的玩家的态度是否为敌对。
  • 中立 - 检测被搜寻到的玩家的态度是否为中立。
  • 友好 - 检测被搜寻到的玩家的态度是否为友好。
  • 积分 - 使用比较模式来检测被搜寻到的玩家的阵营积分。

物品语句块

在物品语句块中,你可以选取任意一组物品、物品比较模式以及目标玩家(关于目标的更多信息,详见下文)。

物品的比较模式可以为:

  • 拿住(手) - 检测被搜寻到的玩家是否必须手持该物品(物品组本身的数量不纳入检测条件)。
  • 装备(盔甲) - 检测被搜寻到的玩家的盔甲槽中(即头盔、胸甲、护腿或靴子)是否有某个物品组。
  • 背包 - 检测被搜寻到的玩家的背包中是否有某个物品组。

世界时间语句块

在世界时间语句块中,你可以选择时间条件模式,以及时间范围(仅在时间条件模式为 介于... 时可用)。

时间条件模式可以为:

  • 白天? - 检测世界是否为白天(012000)。
  • 夜晚? - 检测世界是否为夜晚(1200024000)。
  • 介于... - 检测世界时间是否介于最小值(左侧的参数)和最大值(右边的参数)。

条件语句块

在条件语句块中,你可以通过点击 编辑条件... 按钮来编辑嵌套条件,该操作会在当前条件编辑器的基础上,再打开一个条件编辑器,并在那里编辑新的条件。

目标选择

在大多数条件编辑器中,会有一个 目标 按钮,用于切换至不同的目标选择模式。

  • 全局 - 目标为整个世界/服务器。
  • 主对象(Subject) - 目标为事件语境中的主对象(Subject)。
  • 次对象(Object) - 标为事件语境中的次对象(Object)。
  • 选择器 - 根据目标选择器给定的参数,锁定目标玩家(若目标选择器搜寻到了一个以上的玩家,则语句块会返回查找无效)。 译注:Subject 以及 Object 的译文在未来可能进行改动。

比较

在一部分条件语句块编辑器中,会存在一个 比较 模块,可以对 found(查找到的) 值设置比较。值参数可以设置用于计算比较的 target(目标值) 。假设 foundtarget 都是变量,则比较运算符的机制如下:

  • found < target (<) - 若 found 小于 target 则为 true
  • found <= target (<=) - 若 found 小于或等于 target 则为 true
  • found == target (==) - 若 found 等于 target 则为 true
  • found >= target (>=) - 若 found 大于等于 target 则为 true
  • found > target (>)- 若 found 大于 target 则为 true