跳转至

运行时 Buff 管理

运行时可通过 get_buff(entity, buff_id) 取得正在系统中生效的 Buff 实例,通过 has_buff(entity, buff_id) 判断是否存在,通过 get_buffs(entity) 取得 Buff 列表副本。

id 的 Buff 会作为匿名实例加入,不参与同 ID 刷新,避免多个不同的临时 Buff 因为都没填 ID 而互相覆盖。需要刷新、叠层或按 ID 驱散时,应显式设置稳定 id

列表副本可安全排序、过滤或清空,不会修改系统内部数组;但数组里的 GFBuff 仍是运行中的对象引用,适合调整剩余时间、层数或周期参数。

var buff := combat_system.get_buff(entity, &"StrBoost")
if buff != null:
    buff.time_left = 8.0
    buff.stacks = mini(buff.stacks + 1, buff.max_stacks)

刷新修饰器

如果只修改已挂载 GFModifiervalue,需要让目标属性重新计算。可以调用 refresh_buff_modifiers(entity, buff_id),它会刷新该 Buff 当前修饰器影响到的属性。

var buff := combat_system.get_buff(entity, &"StrBoost")
if buff != null and not buff.modifiers.is_empty():
    buff.modifiers[0].value = 0.35
    combat_system.refresh_buff_modifiers(entity, &"StrBoost")

如果要增删 modifierstags 列表本身,应优先 remove_buff() 后重新构造并 add_buff(),因为标签和修饰器的挂载/卸载由 Buff 生命周期负责。

移除与目标校验

运行时可通过 remove_buff(entity, buff_id) 驱散单个 Buff,通过 clear_buffs(entity, predicate) 清理全部或部分 Buff,通过 remove_skill(entity, skill) 取消某个技能的系统驱动与冷却信号监听。

手动目标施放会先经过 targeting_rule 校验;即使 max_count <= 0 表示不截断目标,未通过校验的手动目标也不会让技能以空目标执行。若技能 owner 没有 global_position 且调用时未传入 cast_center,索敌中心会回退到 Vector2.ZERO,项目应为非空间对象显式传入施法中心。