Skip to content

CoreLib 动作

EmakiAttribute 启用后会向 CoreLib 动作注册表追加属性、资源、标签和同步相关段。它们可以写在支持 CoreLib 管道的配置节点中,例如 Forge/Strengthen/Cooking/Skills/Item 的动作列表、CoreLib 管道模板,或由其他插件通过 CoreLib 管道引擎触发。

NOTE

本页只记录 EmakiAttribute 注册的段;CoreLib 自带的消息、命令、经济、物品等通用段见 CoreLib 动作系统。当前段 ID 只使用下表中的规范名,不再提供历史别名入口。旧的 attributedamage 现在写作 attribute_damage;其余段的 id 未变。

「作用于谁」由 source 决定:作用于执行者自己写 self,指定玩家用 player_by_name

段 ID 速查

段 ID用途目标要求
attribute_damage对目标造成一次 Attribute 自定义伤害。REQUIRED_ENTITY
attribute_add给目标添加限时属性修饰。REQUIRED_ENTITY
attribute_set设置目标的限时属性修饰。REQUIRED_ENTITY
attribute_remove清理目标指定 effect_id 效果组内的全部限时属性。REQUIRED_ENTITY
attribute_resource_add增加目标指定资源当前值。REQUIRED_ENTITY
attribute_resource_set设置目标指定资源当前值。REQUIRED_ENTITY
attribute_resource_remove扣除目标指定资源当前值。REQUIRED_ENTITY
attribute_resource_consume消耗目标指定资源。REQUIRED_ENTITY
attribute_tag_add按属性标签批量添加限时属性。REQUIRED_ENTITY
attribute_tag_remove按属性标签移除限时属性。REQUIRED_ENTITY
attribute_tag_clear按属性标签清理限时属性。REQUIRED_ENTITY
attribute_sync同步目标或全部在线玩家的属性与资源状态。OPTIONAL
attribute_refresh刷新 Attribute 缓存,并同步目标或全部在线玩家。OPTIONAL

除两个同步段外,attribute_damage 与资源段只接受玩家目标;限时属性与标签段接受任意生物实体(含非玩家生物),非生物目标会跳过。attribute_damage 的目标要求虽声明为 REQUIRED_ENTITY,但实现只处理 Player,指向非玩家生物时以 not_player 跳过、不造成伤害。

升级须知:限时属性行为变化

两条对既有配置可见的变化:

  1. 标签入口的复合效果 ID 已消失。 attribute_tag_add effect_prefix=poison 过去会写出 poison:physical_attackpoison:movement_speed 等一条条互不相干的顶层记录,现在改为全部归入 poison 一个效果组。因此按 poison:physical_attack 这类复合 ID 精确删除的旧配置会失效,需改为 attribute_remove effect_id=poison;反过来,过去删不掉任何东西的 attribute_remove effect_id=poison 现在才真正生效。
  2. 多个效果组对同一属性 SET 时的胜者已确定。 过去由内部哈希表迭代顺序决定,同样的配置可能得到不同结果,也可能随扩容变化;现在固定为最后写入的那一条生效(按内部单调序号取最大者),重复运行结果稳定。/ea trace 会把被覆盖的那条显示为「被更高 revision 覆盖」。

单属性配置不受影响,行为逐字不变。

attribute_damage

对目标造成一次 Attribute 伤害。和 CoreLib 内置的 damage 不同,这个段走 EmakiAttribute,所以模块的伤害类型、抗性与战斗快照都会生效。

参数类型必填默认值说明
amountDOUBLE基础伤害值。
typeSTRING""伤害类型 ID;留空使用 EmakiAttribute 的默认伤害类型。
causeSTRINGCUSTOMBukkit EntityDamageEvent.DamageCause,如 CUSTOMMAGICENTITY_ATTACK
yaml
actions:
  - 'self | attribute_damage amount=25 type=physical cause=CUSTOM'
  - 'looking_at range=15 | attribute_damage amount=40 type=spell cause=MAGIC'

cause 写成无法识别的值时以 INVALID_CONFIG 失败,不会退回一个错误的 cause 继续打伤害;空值等同 CUSTOM。伤害被模块规则拒绝时以 REJECTED 失败。成功时输出 damage_type

限时属性

effect_id效果组 ID,不是单条效果的 ID。同一个 effect_id 下可以放多个属性,它们互不覆盖、一起到期、也能被 attribute_remove 一次整组清掉。attribute_addattribute_set 决定组内该属性这一条是加算还是覆盖,这也是两者分成独立段而不是共用一个 mode 参数的原因。

yaml
actions:
  - 'self | attribute_add effect_id=buff_strength attribute=physical_attack value=10 duration_ticks=200t'
  - 'self | attribute_add effect_id=buff_strength attribute=physical_crit_rate value=5 duration_ticks=200t'
  - 'self | attribute_remove effect_id=buff_strength'

上例的两条 attribute_add 进同一组,attribute_remove 一次清掉两个属性。

attribute_add / attribute_set

两个段参数相同。

参数类型必填默认值说明
effect_idSTRING效果组 ID;复用同一个 ID 会把多个属性归入同一组。
attributeSTRING属性 ID;未注册时以 INVALID_CONFIG 失败。
valueDOUBLE修饰值;NaN±InfINVALID_CONFIG 失败。
duration_ticksDURATION持续时间;支持 20t1s1000ms,纯数字按 tick 处理。
stack_modeSTRING属性定义的 temporary_stack_mode与组内同属性已有效果的合并方式:REPLACE 覆盖,STACK 数值与剩余时间相加。写入未声明的值以 INVALID_CONFIG 失败。
yaml
actions:
  - 'self | attribute_add effect_id=forge_bonus attribute=physical_attack value=12 duration_ticks=10s'
  - 'self | attribute_set effect_id=arena_buff attribute=physical_attack value=30 duration_ticks=200t'
  - 'self | attribute_add effect_id=forge_bonus attribute=physical_attack value=3 duration_ticks=10s stack_mode=STACK'

attribute_remove

参数类型必填默认值说明
effect_idSTRING要清理的效果组 ID;该组内全部属性一起移除。
yaml
actions:
  - 'self | attribute_remove effect_id=arena_buff'

三个段的 effect_idattribute 都会做 id 归一化。effect_id 为空时以 INVALID_CONFIG 失败;目标不是生物实体时以 not_living_entity 跳过(非玩家生物同样可用)。目标身上没有该组时以 skipped 而非成功返回。成功时输出 effect_idattributevalueduration_ticksstatusaffected_countexistedremaining_ticks,其中 statusAPPLIED / REPLACED / STACKED / REMOVED

资源

四个资源段会通过 EmakiAttribute 的资源同步边界修改玩家资源当前值。它们共用同一组参数。

参数类型必填默认值说明
resourceSTRING资源 ID,如 healthmana
amountDOUBLE操作数量。
段 ID计算方式
attribute_resource_add当前值 + amount
attribute_resource_set直接设为 amount
attribute_resource_remove当前值 - amount,最低为 0
attribute_resource_consumeattribute_resource_remove 完全相同

attribute_resource_consumeattribute_resource_remove 的算式一致,保留两个 id 是因为已有配置按名字引用它们;两者共用同一份实现。

最终值仍会按资源定义的同步规则截断,所以 add 不会超过上限。

yaml
actions:
  - 'self | attribute_resource_add resource=mana amount=10'
  - 'self | attribute_resource_set resource=health amount=20'
  - 'self | attribute_resource_remove resource=health amount=5'
  - 'self | attribute_resource_consume resource=mana amount=20'

resource 会做 id 归一化;指向未加载的资源时以 INVALID_CONFIG 失败。成功时输出 resourceoperationamountold_valuenew_valuecurrent_max

标签限时属性

标签指向一组配置在一起的属性,所以一次调用就能施加整套增益而不必逐项列出。

attribute_tag_add

参数类型必填默认值说明
tagSTRING属性标签,不区分大小写。
valueDOUBLE对每个命中属性施加的修饰值。
duration_ticksDURATION持续时间。
effect_prefixSTRINGtag:<tag>整套命中属性归入的效果组 ID;为空时用 tag:<标签>
stack_modeSTRING""叠加模式:REPLACESTACK。为空时各属性用自身的 temporary_stack_mode;写了无法识别的值以 INVALID_CONFIG 失败。
yaml
actions:
  - 'self | attribute_tag_add tag=DEBUFF value=-5 duration_ticks=5s effect_prefix=poison stack_mode=REPLACE'

上例命中的全部属性都进 poison 这一个组,因此可以直接用 attribute_remove effect_id=poison 整组清掉。

attribute_tag_remove / attribute_tag_clear

参数类型必填默认值说明
tagSTRING要移除限时属性的属性标签。
yaml
actions:
  - 'self | attribute_tag_remove tag=DEBUFF'
  - 'self | attribute_tag_clear tag=BUFF'

这两个段行为完全一致,都是按标签移除。这个重复是从旧实现保留下来的:判断 clear 原本想做什么(大概是清掉全部标签)会改变现有配置可能依赖的行为,所以没有动它。

tag 为空时以 INVALID_CONFIG 失败;没有任何属性带该标签、或目标身上没有对应效果时以 skipped 返回而不再报成功。三个段成功时都输出 tageffect_idstatuscount(命中并处理的属性条数)。

同步

两个段都只有一个参数,区别在默认值和是否清缓存。

段 ID参数类型默认值说明
attribute_syncallBOOLEANfalse重算属性值,不清缓存。默认只处理目标。
attribute_refreshallBOOLEANtrue先清掉模块缓存再重算,是改完属性配置后该跑的段。默认处理全部在线玩家。
yaml
actions:
  # 只同步自己
  - 'self | attribute_sync'
  # 同步全部在线玩家,不需要目标,可省略 source
  - 'attribute_sync all=true'
  # 配置改完后清缓存并全服重算
  - 'attribute_refresh'
  # 只对自己清缓存重算
  - 'self | attribute_refresh all=false'

这两个段的目标要求是 OPTIONAL 而不是 REQUIRED_ENTITY,因为 all=true 根本不需要目标;all=false 的路径自己检查玩家,拿不到玩家时跳过。

它们也是本模块唯一线程域随参数变化的段:all=true 要遍历在线玩家列表,跑在服务端全局域上;all=false 只碰单个实体。all 的值写成占位符时无法在规划期读出,此时按该段自己的默认值判定域,所以 attribute_refresh 会按全局域规划。

成功时输出 allall=false 时还带上 player

使用提示

  • attribute_sync all=trueattribute_refresh all=true 外,本页段都需要玩家目标。
  • 如果需要让 MythicMobs 技能直接对目标生物添加或清除限时属性,请使用 MythicMobs 集成 中的 emaki_attribute_addemaki_attribute_removeemaki_attribute_add_tagemaki_attribute_clear_tag。那些是 MythicMobs 机制,不是本页的 CoreLib 段。
  • duration_ticks 使用 CoreLib DURATION 解析,20t1s1000ms 都可用;纯数字按 tick 处理。
  • 相关服务尚未就绪时,段以 MISSING_CONTEXT 失败而不是静默跳过。