Ой, я ж самое главное не сказал! У меня в карте все ульты трехуровневые. Я делаю так:
Ability[0] = a0
CD[1] = a0cdlvl1
CD[2] = a0cdlvl2
CD[3] = a0cdlvl3
Ability[1] = a1
CD[4] = a1cdlvl1
CD[5] = a1cdlvl2
CD[6] = a1cdlvl3
... При касте заклинания я циклом с переменной i проверяю, не ульт ли это, и если да, то запускаю таймер на время, равное udg_CD[3 * i + GetUnitAbilityLevel(u, udg_Ability[i])].