Не пойму чего утекают и лаги начинает, даже текст End Magic не выводит после окончание бафа...
globals
    constant integer c_WhistleMagic_Ability_ID = 'Aroa'    
    constant integer c_WhistleMagic_Buff_ID = 'Broa'
    constant real c_WhistleMagic_Interval = .03125
    constant real c_WhistleMagic_Base = 0.10

    timer WhistleMagic_TIMER = CreateTimer()
    integer WhistleMagic_MAX = 0
    
    unit array WhistleMagic_CASTER
    real array WhistleMagic_STAT_DAMAGE
    real array WhistleMagic_STAT_ARMOR
endglobals

function WhistleMagic_Periodic takes nothing returns nothing
    local integer i = 0
    loop
        exitwhen i == WhistleMagic_MAX
        if GetUnitAbilityLevel(WhistlePhysical_CASTER[i], c_WhistlePhysical_Buff_ID) == 0 then
        
            call DisplayTextToPlayer(GetOwningPlayer(WhistleMagic_CASTER[i]), 0, 0, "End Magic")
            
            call RPGCharacter[WhistleMagic_CASTER[i]].removeStats()
            call RPGCharacter[WhistleMagic_CASTER[i]].setStats(RPG_STAT_DAMAGE_MAGIC, -WhistleMagic_STAT_DAMAGE[i], true)
            call RPGCharacter[WhistleMagic_CASTER[i]].setStats(RPG_STAT_ARMOR_MAGIC, -WhistleMagic_STAT_ARMOR[i], true)
            call RPGCharacter[WhistleMagic_CASTER[i]].refresh()
            call RPGCharacter[WhistleMagic_CASTER[i]].addStats()
            
            set WhistleMagic_MAX = WhistleMagic_MAX - 1
            set WhistleMagic_STAT_DAMAGE[i] = WhistleMagic_STAT_DAMAGE[WhistleMagic_MAX]
            set WhistleMagic_STAT_ARMOR[i] = WhistleMagic_STAT_ARMOR[WhistleMagic_MAX]
            set WhistleMagic_CASTER[i] = WhistleMagic_CASTER[WhistleMagic_MAX]
            
            set WhistleMagic_STAT_DAMAGE[WhistleMagic_MAX] = .0
            set WhistleMagic_STAT_ARMOR[WhistleMagic_MAX] = .0
            set WhistleMagic_CASTER[WhistleMagic_MAX] = null
            
            set i = i - 1
            if WhistleMagic_MAX == 0 then
                call PauseTimer(WhistleMagic_TIMER)
            endif
        endif
        set i = i + 1
    endloop
endfunction

function WhistleMagic_Cast takes nothing returns boolean
    local boolean b = (GetSpellAbilityId() == c_WhistleMagic_Ability_ID)
    local unit u = GetTriggerUnit()
    
    if b and GetUnitAbilityLevel(u, c_WhistleMagic_Buff_ID) == 0 then
        if WhistleMagic_MAX == 0 then
            call TimerStart(WhistleMagic_TIMER, c_WhistleMagic_Interval, true, function WhistleMagic_Periodic)
        endif
        
        call DisplayTextToPlayer(GetOwningPlayer(u), 0, 0, "Start Magic")

        set WhistleMagic_STAT_DAMAGE[WhistleMagic_MAX] = c_WhistleMagic_Base
        set WhistleMagic_STAT_ARMOR[WhistleMagic_MAX] = c_WhistleMagic_Base
        set WhistleMagic_CASTER[WhistleMagic_MAX] = u
        set WhistleMagic_MAX = WhistleMagic_MAX + 1
        
        call RPGCharacter[u].removeStats()
        call RPGCharacter[u].setStats(RPG_STAT_DAMAGE_MAGIC, c_WhistleMagic_Base, true)
        call RPGCharacter[u].setStats(RPG_STAT_ARMOR_MAGIC, c_WhistleMagic_Base, true)
        call RPGCharacter[u].refresh()
        call RPGCharacter[u].addStats()
    endif
    set u = null
    return b
endfunction

function InitTrig_WhistleMagic takes nothing returns nothing
    local trigger t = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_SPELL_CAST)
    call TriggerAddCondition(t, Condition(function WhistleMagic_Cast))
    set t=null
endfunction

Принятый ответ

Ой извини, уже нашел ошибку
if GetUnitAbilityLevel(WhistlePhysical_CASTER[i], c_WhistlePhysical_Buff_ID) == 0 then вот что было такой переменный оказалось в другой способности
`
ОЖИДАНИЕ РЕКЛАМЫ...