关于单位生命周期的一些技巧
测试环境:1.27a
单位生命周期指的是:

编辑器中给出了7种选项:
- 操纵死尸(Animate Dead) 'Buan'
- 疾病云雾(Disease Cloud) 'Bapl' → 'Bplg'
- 自然之力(Force of Nature) 'BEfn'
- 类(Generic) 'BTLF'
- 治疗守卫(Healing Ward) 'Bhwd'
- 复活死尸(Raise Dead) 'Brai'
- 水元素(Water Elemental) 'BHwe'
但还有一个可用Id并未列入:
- 召唤单位(Summoned Unit) 'BFig'
PS:吐槽一下原版翻译(召唤出来的物品)想了半天也不知道要表达什么意思,所以改成通俗易懂的。
这些Id都有自己的效果,和物体编辑器中的效果一致,但无一例外,都会给目标单位添加召唤(UNIT_TYPE_SUMMONED)类别。
实际上触发器中疾病云雾(Disease Cloud)的Id是错误的,应该是'Bplg'。
如果使用触发器添加疾病云雾(Disease Cloud),则实际上添加了类(Generic)。
这是因为这个函数存在限制:
native UnitApplyTimedLife takes unit whichUnit, integer buffId, real duration returns nothing
buffId只能为上述8个Id,如果为其他Id,则强制添加类(Generic)。



通常情况下,拥有生命周期的单位都会在生命周期结束后死亡。
有时候我们可能想要取消一个单位的生命周期,比如试图想让一个拥有生命周期的单位拥有无限的持续时间。
https://www.hiveworkshop.com/threads/timed-life-and-unit-immortality.250357/
这个贴子讲了如何让单位躲过生命周期到期的审判,只需要单位的最大生命值为0。
YDWE的JAPI可以修改单位生命值为0,并且单位不会死亡。
还有一个方法是通过添加高数值的负数恢复指环来达到无法死亡的效果,不推荐。
来看一段示例,这是取消一个单位生命周期的函数:
function UnitCancelTimedLife takes unit whichUnit, integer buffId returns boolean
local real maxLife
local real life
local boolean b = false
if GetUnitAbilityLevel(whichUnit, buffId) <= 0 then
return false
endif
set maxLife = GetUnitState(whichUnit, UNIT_STATE_MAX_LIFE)
set life = GetWidgetLife(whichUnit)
call SetUnitState(whichUnit, UNIT_STATE_MAX_LIFE, 0.)
set b = UnitRemoveAbility(whichUnit, buffId)
call SetUnitState(whichUnit, UNIT_STATE_MAX_LIFE, maxLife)
call SetWidgetLife(whichUnit, life)
return b
endfunction
只需要用变量记录下单位的当前血量和最大生命值,将单位最大生命值设置成0,然后删除单位身上的生命周期BUFF,单位在0点最大生命值时无法死亡。删除生命周期BUFF后将最大生命值和血量设置回去,便成功删除掉生命周期。
T的一个示例:
UnitCancelTimedLife
事件
单位 - 任意单位 被召唤(召唤单位)
条件
((触发单位) 拥有 水元素) 等于 TRUE
动作
[逆天] - 设置 [实数] loc_life = ((触发单位) 的 生命值)
[逆天] - 设置 [实数] loc_maxLife = ((触发单位) 的 生命值)
单位 - 设置 (触发单位) 的 最大生命值 [JAPI] 为 0.00
单位 - 删除 水元素 从 (触发单位)
单位 - 设置 (触发单位) 的 最大生命值 [JAPI] 为 (loc_maxLife)
单位 - 设置 (触发单位) 的 生命值 为 (loc_life)
PS:一些生命周期带来的特性可能还会存在。