跳到主要内容

Elite Script 条件

条件(Conditions)允许脚本编写者根据特定条件让脚本和/或动作不运行。

脚本层级的 Conditions 必须以大写字母开头

在脚本层级,该键区分大小写。写在那里的小写 conditions: 会被忽略,脚本会在没有任何条件的情况下运行,且不记录任何内容。在动作内部,该键不区分大小写,但如果一个动作同时包含 Conditions: 和 conditions:,EliteMobs 会跳过整个脚本。请使用 YAML 映射,而不是列表。内部键(isAlive、conditionType、Target 等)不区分大小写,但 BLOCKING 和 FILTERING 等枚举值必须大写。

示例
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Conditions:
isAlive: true
conditionType: BLOCKING
Target:
targetType: SELF
Actions:
- action: PLACE_BLOCK
Target:
targetType: SELF
offset: 0,3,0
duration: 20
material: DIRT
Conditions:
locationIsAir: true
conditionType: FILTERING
Target:
targetType: ACTION_TARGET
Cooldowns:
local: 60
global: 20

Example 要求 Boss 实体有效。动作检查其位置上方 3 格的方块,仅在该处为空气时放置泥土,持续 20 tick。每个动作可以有自己的条件。

Target​

条件使用 Targets 系统。条件的 Target 独立于动作的 Target,省略时默认为 SELF。在动作的 FILTERING 条件中使用 ACTION_TARGET,可逐一检查动作解析出的目标。

脚本条件和动作的 BLOCKING 条件会解析自己的 Target。SELF 或 NEARBY_PLAYERS 等实体目标会为每项检查提供实体。LOCATION 和 LOCATIONS 不提供实体:只有位置检查会作用于它们的位置,目标数量为 0。ACTION_TARGET 在此流程中不解析任何内容,因此只有 randomChance 和目标数量检查生效。LANDING_LOCATION 在脚本层级条件中会失败,因为这些条件在落点存在之前就已运行。


条件类型​

键说明值
conditionType设置条件的类型BLOCKING / FILTERING

BLOCKING 阻止条件所在的整个脚本或单个动作执行。阻止一个动作不会阻止其他动作。FILTERING 配合 ACTION_TARGET 会移除未通过适用检查的目标。

动作之外的条件始终为 BLOCKING。动作内部的条件可以是 BLOCKING 或 FILTERING。

注意:如果目标是 SELF(Boss)且条件检查是 isAlive,则该检查始终为 BLOCKING! 即使将其放入 FILTERING 条件中,这一特定部分仍会以 BLOCKING 的方式运作。

动作内部的条件默认设置为 FILTERING。

使用 ACTION_TARGET 配合 FILTERING 检查每个已解析的动作目标。BLOCKING 需要 SELF 或 NEARBY_PLAYERS 等具体条件目标;其实体计数流程不会解析 ACTION_TARGET。

randomChance、targetCountLowerThan 和 targetCountGreaterThan 只在脚本层级或动作的 BLOCKING 条件中检查。逐目标的 FILTERING 流程不会评估它们。

适用检查按 AND(且)组合,必须全部通过。阻断检查要求选中的所有实体和位置都通过。空集合本身不会导致失败;如需至少一个实体,请使用 targetCountGreaterThan: 0。当条件目标是具体选择而非 ACTION_TARGET 时,过滤会检查这个独立集合,然后保留动作的全部原始目标,或将它们全部移除。

过滤取决于动作请求的目标类型:实体动作检查实体有效性、标签和未经偏移的脚部位置;位置动作只检查位置条件。标签和 isAlive 不能过滤位置集合,但上述针对 SELF 的特殊阻断有效性检查除外。

脚本条件在启动动作前检查。动作的阻断条件在 wait 之后及每次重复时检查;失败会取消该动作剩余的重复。过滤掉所有目标本身不会取消后续重复。脚本条件失败会阻止其冷却开始;动作条件失败不会撤销脚本的冷却。


条件块放置​

你可以通过以下两种方式放置或嵌套条件块:

  1. 置于单个动作下 —— 该条件仅作用于特定动作。如果满足条件,该动作就会执行;否则不执行。

  2. 置于整个脚本下 —— 该条件作用于脚本内的所有动作。如果不满足条件,则所有动作都不会执行。

下面是演示如何为单个动作和整个脚本嵌套条件块的示例。

置于单个动作下:

示例
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: MESSAGE
Target:
targetType: NEARBY_PLAYERS
range: 10
sValue: "&2Hello World!"
- action: SET_WEATHER
Target:
targetType: SELF
weather: THUNDER
duration: 120
Conditions:
conditionType: BLOCKING
locationIsAir: true
Target:
targetType: SELF
offset: "0,3,0"

Boss 脚部所在方块和上方 3 格的方块都必须是空气,SET_WEATHER 才会执行。阻断条件先检查实体位置,再检查偏移后的位置。MESSAGE 没有条件,因此仍会执行。

置于整个脚本下:

示例
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: MESSAGE
Target:
targetType: NEARBY_PLAYERS
range: 10
sValue: "&2Hello World!"
- action: SET_WEATHER
Target:
targetType: SELF
weather: THUNDER
duration: 120
Conditions:
conditionType: BLOCKING
locationIsAir: true
Target:
targetType: SELF
offset: "0,3,0"

Boss 脚部所在方块和上方 3 格的方块都必须是空气,才会在受击时允许这两个动作执行。否则整个脚本被阻止,包括 SET_WEATHER 和 MESSAGE。


用 runIf...Is 反转条件​

每个条件都有一个用于反转它的配套 runIf...Is 键。它们全都是布尔值,并且全都默认为 true(表示"条件为真时运行")。把其中一个设为 false 就会反转对应的条件。

不存在通用的 runIfConditionIs 键 —— 每个条件都有它自己确切的名称,而且其中有三个不遵循显而易见的命名规律。无法识别的键不会被静默忽略;它会在启动时记录 Failed to read key ... for script ...。

条件配套键说明
isAliverunIfAliveIs⚠️ 不是 runIfIsAliveIs
hasTagsrunIfHasTagIs⚠️ 单数形式的 Tag
doesNotHaveTagsrunIfDoesNotHaveTagIs⚠️ 单数形式的 Tag
locationIsAirrunIfLocationIsAirIs
isOnFloorrunIfIsOnFloorIs
isStandingOnMaterialrunIfIsStandingOnMaterialIs
randomChancerunIfRandomChanceIs
targetCountLowerThanrunIfTargetCountLowerThanIs
targetCountGreaterThanrunIfTargetCountGreaterThanIs

条件键名不区分大小写,因此 runifaliveis 同样有效。

runIfConditionTypeIs 不起作用

runIfConditionTypeIs 会被解析器接受且不产生警告,但没有任何地方读取它。请使用 conditionType 来选择 BLOCKING 或 FILTERING;没有办法反转它。

例如,locationIsAir: true 要求空气。添加 runIfLocationIsAirIs: false 会反转比较,要求非空气方块。反转针对配置的比较结果,因此将布尔条件及其配套键同时设为 false,会再次反转比较。

示例:

eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SET_WEATHER
Target:
targetType: SELF
weather: THUNDER
duration: 120
Conditions:
conditionType: BLOCKING
locationIsAir: true
runIfLocationIsAirIs: false
Target:
targetType: SELF

此动作仅在 Boss 脚部所在方块不是空气时设置雷暴,例如 Boss 在水中时。反转 isAlive 检查的是 Bukkit 有效性,不会创建死亡触发器;实体不存在时,即使反转也会失败。


基于位置的条件​

locationIsAir​

检查目标方块是否为空气,包括洞穴空气和虚空空气。设为 false 可要求非空气方块。

键说明值
locationIsAir设置为检查该位置是否为空气方块(或相反)。布尔值
示例
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SET_WEATHER
Target:
targetType: SELF
weather: THUNDER
duration: 120
Conditions:
conditionType: BLOCKING
locationIsAir: true
Target:
targetType: SELF
offset: "0,3,0"

天气动作要求 Boss 脚部所在方块和上方 3 格都为空气。如果位置动作只应检查其实际目标位置,请像第一个示例那样使用 FILTERING 和 ACTION_TARGET。


isOnFloor​

检查当前位置的方块不是固体,且下方一个单位处的方块是固体。这是材质检查,不检查实体的实际接地状态或碰撞形状。

键说明值
isOnFloor设置为检查该位置是否为地面位置(或相反)。布尔值
示例
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SET_WEATHER
Target:
targetType: SELF
weather: THUNDER
duration: 120
Conditions:
conditionType: BLOCKING
isOnFloor: true
Target:
targetType: SELF

天气动作要求 Boss 脚部所在方块非固体,且下方一个单位处的方块为固体。失败只会阻止此动作。


isStandingOnMaterial​

精确比较目标位置下方一个单位处方块的材质。

键说明值
isStandingOnMaterial设置应当检查的材质类型。Material
示例
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SET_WEATHER
Target:
targetType: SELF
weather: THUNDER
duration: 120
Conditions:
conditionType: BLOCKING
isStandingOnMaterial: BIRCH_WOOD
Target:
targetType: SELF

天气动作要求 Boss 脚部下方一个单位处为 BIRCH_WOOD。BIRCH_LOG 和 BIRCH_PLANKS 不匹配。失败只会阻止此动作。

基于实体的条件​

isAlive​

检查目标实体的 Bukkit isValid() 状态。这是有效性检查,不直接比较生命值;实体不存在时检查失败。

键说明值
isAlive期望的 Bukkit 实体有效性。布尔值
示例
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SET_WEATHER
Target:
targetType: SELF
weather: THUNDER
duration: 120
Conditions:
conditionType: BLOCKING
isAlive: true
Target:
targetType: SELF

天气动作只在 Boss 的 Bukkit 实体有效时执行。失败只会阻止此动作。


hasTags​

要求受管理的精英怪或玩家的 EliteMobs 标签存储中包含列出的全部标签。标签是区分大小写的字符串,可通过 TAG 和 UNTAG 等动作设置。不会读取原版计分板标签,普通怪物也没有这种存储。没有此存储时,反转前的 hasTags 失败,而 doesNotHaveTags 通过。

键说明值
hasTags设置为检查该实体是否拥有一组标签。String List
示例
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SET_WEATHER
Target:
targetType: SELF
weather: THUNDER
duration: 120
Conditions:
conditionType: BLOCKING
hasTags:
- isCool
- hasANiceBeard
Target:
targetType: SELF

天气动作要求 Boss 同时拥有 isCool 和 hasANiceBeard。失败只会阻止此动作。


doesNotHaveTags​

当目标没有集齐全部指定标签时通过。缺少任意一个就足够,并不要求所有标签都不存在。

键说明值
doesNotHaveTags设置为检查该实体是否不拥有一组标签。String List
示例
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SET_WEATHER
Target:
targetType: SELF
weather: THUNDER
duration: 120
Conditions:
conditionType: BLOCKING
doesNotHaveTags:
- isStinky
- isSus
Target:
targetType: SELF

除非 Boss 同时拥有 isStinky 和 isSus,否则动作会执行。只有其中一个标签时仍可通过。

其他条件​

randomChance​

每次阻断检查进行到此条件时都会重新生成随机数。请使用 0.0(从不)到 1.0(总是)的单个数值,不支持 ~ 范围。runIfRandomChanceIs: false 会反转结果。对于重复动作,一次失败就会取消其剩余重复。

键说明值
randomChance条件生效的几率。0.0 到 1.0 之间的数字
示例
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SET_WEATHER
Target:
targetType: SELF
weather: THUNDER
duration: 120
Conditions:
conditionType: BLOCKING
randomChance: 0.1
Target: # Not required
targetType: SELF # Not required

天气动作在每次检查时有 10% 的概率执行。失败只会阻止此动作。

条件的显式 Target 可省略,因为它默认为 SELF。省略并不会禁用同一块中的其他条件。

使用标签过滤 NEARBY​

要根据特定标签过滤 NEARBY_MOBS 或 NEARBY_PLAYERS,请使用 ACTION_TARGET 作为条件的目标(前提是该条件应用于某个动作而非脚本本身)。这能确保脚本准确地仅过滤出带有指定标签的怪物/玩家。

示例
eliteScript:
Example:
Actions:
- action: SET_MOB_AI
Target:
targetType: NEARBY_MOBS
range: 40
bValue: false
Conditions:
conditionType: FILTERING
hasTags:
- TurnOff
Target:
targetType: ACTION_TARGET

此脚本关闭各轴向外延伸 40 格的搜索盒内、带有 TurnOff 标签的受管理精英怪的 AI,Boss 自身除外。普通怪物没有这种标签存储。示例没有 Events,需从其他脚本调用,或添加触发事件。

targetCountLowerThan 和 targetCountGreaterThan​

在检查标签及其他逐实体条件前,比较条件目标的实体数量。它不统计动作过滤后的目标。比较是严格的,相等时不会通过。

键说明值
targetCountLowerThan要求条件目标的实体数量严格小于阈值。整数
键说明值
targetCountGreaterThan要求条件目标的实体数量严格大于阈值。整数
示例
eliteScript:
Example:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SET_WEATHER
Target:
targetType: SELF
weather: THUNDER
duration: 120
Conditions:
conditionType: BLOCKING
targetCountGreaterThan: 2
Target:
targetType: NEARBY_MOBS
range: 15

各轴向外延伸 15 格的搜索盒内,除 Boss 外的非玩家生物实体超过 2 个时,天气动作才会执行。

请显式设置条件的 Target 以统计所需群体。省略时会统计默认的 SELF 选择。使用 targetCountGreaterThan: 0 可要求非空集合。