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 之后及每次重复时检查;失败会取消该动作剩余的重复。过滤掉所有目标本身不会取消后续重复。脚本条件失败会阻止其冷却开始;动作条件失败不会撤销脚本的冷却。
条件块放置
你可以通过以下两种方式放置或嵌套条件块:
-
置于单个动作下 —— 该条件仅作用于特定动作。如果满足条件,该动作就会执行;否则不执行。
-
置于整个脚本下 —— 该条件作用于脚本内的所有动作。如果不满足条件,则所有动作都不会执行。
下面是演示如何为单个动作和整个脚本嵌套条件块的示例。
置于单个动作下:
示例
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 ...。
| 条件 | 配套键 | 说明 |
|---|---|---|
isAlive | runIfAliveIs | ⚠️ 不是 runIfIsAliveIs |
hasTags | runIfHasTagIs | ⚠️ 单数形式的 Tag |
doesNotHaveTags | runIfDoesNotHaveTagIs | ⚠️ 单数形式的 Tag |
locationIsAir | runIfLocationIsAirIs | |
isOnFloor | runIfIsOnFloorIs | |
isStandingOnMaterial | runIfIsStandingOnMaterialIs | |
randomChance | runIfRandomChanceIs | |
targetCountLowerThan | runIfTargetCountLowerThanIs | |
targetCountGreaterThan | runIfTargetCountGreaterThanIs |
条件键名不区分大小写,因此 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 可要求非空集合。