Добавлен  KaneThaumaturge 
                            
                            
                            
                            
                            
                            
                        
                        
                    Решил тут код оптимизировать, заменив перебор группы формированием фильтра. Столкнулся с несколькими трудностями.
Есть такой участок кода:
Есть такой участок кода:
    private nothing uiClear(){
        unit u = GetEnumUnit()
        integer id = GetUnitUserData(u)
        if GetUnitTypeId(u) == 0 {
            GroupRemoveUnit(allUnits, u)
            FlushChildHashtable(HT, id)
            if dbg {dbgT("clr " + I2S(id))}
        }
        u = null
    }
    
    private nothing uiClearStart(){
        ForGroup(allUnits, function uiClear)
    }Нужно как-то сформировать группу уже с имеющийся группой allUnits, но такой нативки я не нашёл. Можно сделать перебором, но тогда какое отличие от исходного варианта.
Принятый ответ
 NazarPunk, ну, чтобы рассеивание заклинаний действительно рассеивали их.
Если они сделаны триггерно
И чтоб похищение магии тоже работало корректно
Если они сделаны триггерно
И чтоб похищение магии тоже работало корректно
code
library BuffRemover initializer brInit uses CreekKeepersNeptulonShadow, HashId
    private nothing bfActions (){ 
        unit u = GetEnumUnit()
        integer id = GetUnitUserData(u)
        integer bon = LoadInteger(HT, id, BlessingOfNeptulon_hid)
        integer bi
        
        //Благословение Нептулона (рассеивание/окончание)
        if (bon > 0) and (GetUnitAbilityLevel(u, 'NSe1') <= 0) and (GetUnitAbilityLevel(u, 'NSe2') <= 0) and (GetUnitAbilityLevel(u, 'NSe3') <= 0){
            bonStateDel(u, bon)
        }
        
        //Благословение Нептулона (похищение магии)
        if (bon <= 0) and ((GetUnitAbilityLevel(u, 'NSe1') > 0) or (GetUnitAbilityLevel(u, 'NSe2') > 0) or (GetUnitAbilityLevel(u, 'NSe3') > 0)) {
            if GetUnitAbilityLevel(u, 'NSe1') > 0 {bi = 1}
            if GetUnitAbilityLevel(u, 'NSe2') > 0 {bi = 2}
            if GetUnitAbilityLevel(u, 'NSe3') > 0 {bi = 3}
            bonStateAdd(u, bi)
        }
            
        u = null
    }
    
    private nothing brActionsStart(){
        ForGroup(allUnits, function bfActions)
    }
    
    private nothing brInit (){
        TimerStart(CreateTimer(), 0.25, true, function brActionsStart)
    }
endlibrary
    UPD:
Изменил с помощью фильтров. Получилось так:
Изменил с помощью фильтров. Получилось так:
code2
library BuffRemover initializer brInit uses CreekKeepersNeptulonShadow, HashId
    
    
    //Фильтры
    private boolean fBoN_end (){
        return (LoadInteger(HT, GetUnitUserData(GetFilterUnit()), BlessingOfNeptulon_hid) > 0) and (GetUnitAbilityLevel(GetFilterUnit(), 'NSe1') <= 0) and (GetUnitAbilityLevel(GetFilterUnit(), 'NSe2') <= 0) and (GetUnitAbilityLevel(GetFilterUnit(), 'NSe3') <= 0)
    }
    
    private boolean fBoN_abd (){
        return (LoadInteger(HT, GetUnitUserData(GetFilterUnit()), BlessingOfNeptulon_hid) <= 0) and ((GetUnitAbilityLevel(GetFilterUnit(), 'NSe1') > 0) or (GetUnitAbilityLevel(GetFilterUnit(), 'NSe2') > 0) or (GetUnitAbilityLevel(GetFilterUnit(), 'NSe3') > 0))
    }
    //Фильтры
    //Функции
    private nothing BoN_end (){ 
        bonStateDel(GetEnumUnit(), LoadInteger(HT, GetUnitUserData(GetEnumUnit()), BlessingOfNeptulon_hid))
    }
    
    private nothing BoN_abd (){ 
        integer bi
        unit u = GetEnumUnit()
        if GetUnitAbilityLevel(u, 'NSe1') > 0 {bi = 1}
        if GetUnitAbilityLevel(u, 'NSe2') > 0 {bi = 2}
        if GetUnitAbilityLevel(u, 'NSe3') > 0 {bi = 3}
        bonStateAdd(u, bi)
        u = null
    }
    //Функции
    
    
    private nothing brActions(){
        group g = CreateGroup()
        
        //Благославление Нептулона (рассеивание/окончание)
        GroupEnumUnitsInRect(g, bj_mapInitialPlayableArea, function fBoN_end)
        ForGroup(g, function BoN_end)
        GroupClear(g)
        
        //Благославление Нептулона (похищение магии)
        GroupEnumUnitsInRect(g, bj_mapInitialPlayableArea, function fBoN_abd)
        ForGroup(g, function BoN_abd)
        GroupClear(g)
        
        DestroyGroup(g)
        g = null
    }
    
    private nothing brInit (){
        TimerStart(CreateTimer(), 0.25, true, function brActions)
    }
endlibraryТак норм или можно еще оптимизировать?
    
        
            
                `
            
            
                
        
    
    ОЖИДАНИЕ РЕКЛАМЫ...
            
                    
                        Чтобы оставить комментарий, пожалуйста, войдите на сайт.
                    
                
             
                        
                        
                    
 WC3
                                WC3
                            



 
                    
                
Ред. nazarpunk
Так, можно же выбрать всех юнитов на карте, а потом в фильтре проверить принадлежат ли они группе, да?
Ред. KaneThaumaturge
Если они сделаны триггерно
И чтоб похищение магии тоже работало корректно
Изменил с помощью фильтров. Получилось так: