Чел кидал пример работы с фильтрами, там в коде он обнуляет переменную после return, что, естественно, у меня вызвало ошибку.
Пример его кода:
function Trig_Kill_Conditions takes nothing returns boolean 
local unit u = GetTriggerUnit() 
local integer i = GetUnitTypeId(u) 
return IsUnitType(u, UNIT_TYPE_TOWNHALL) == false or \ 
i != 'hfoo' or \ 
i != 'n006' 
set u = null 
endfunction
Пример моего кода:
    private boolean dwFilter() {
        unit u = GetFilterUnit()
        integer id = GetUnitUserData(u)
        unit u2 = LoadUnitHandle(HT, id, waterguardsBase_hid)
        return (GetUnitUserData(u) == 'n002') and (UnitAlive(u)) and ((DistanceBetweenCoords(GetUnitX(u), GetUnitY(u), GetUnitX(u2), GetUnitY(u2)) >= 850.00) or (not UnitAlive(u2)))
        u = null
        u2 = null
    }
Как у него все работает?
Не вводить переменные, которые оставляют после себя утечки?
Но с локальными переменные работает быстрее, чем постоянно ссылаться на GetFilterUnit() или постоянно загружать с хэш-таблицы.

Эмм как насчет глобальных переменных, т.к в фильтрах ты не создаешь условия а только делаешь проверки, без разрыва потока вейтами, то глобалки доступное и изящное решение.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
32
Эмм как насчет глобальных переменных, т.к в фильтрах ты не создаешь условия а только делаешь проверки, без разрыва потока вейтами, то глобалки доступное и изящное решение.
Принятый ответ
32
Потом странная идиотия, создавать переменная к которой нужно обратится всего 1 раз...
function Trig_Kill_Conditions takes nothing returns boolean 
local unit u = GetTriggerUnit() 
local integer i = GetUnitTypeId(u) 
return IsUnitType(u, UNIT_TYPE_TOWNHALL) == false or \ 
i != 'hfoo' or \ 
i != 'n006' 
set u = null 
endfunction
Можно было сделать так:
function Trig_Kill_Conditions takes nothing returns boolean 
set bj_forLoopAIndex = GetUnitTypeId(GetTriggerUnit())
return not ( IsUnitType( GetTriggerUnit, UNIT_TYPE_TOWNHALL) or bj_forLoopAIndex ==  'hfoo' or bj_forLoopAIndex == 'n006' )
endfunction
20
Хотя не получится же, там получаемый юнит зависит от ид юнита. Глобалкой не выйдет.
32
Но можно было сделать сразу проверку на типы, без IsUnitType ибо проверка на typeid быстрее и в "узких местах" лучше начинать с неё.
KaneThaumaturge, Почему не выйдет? Что собрался делать напиши, какое условие?
20
В фильтре юнит загружается по хэндлу проверяемого юнита. По-этому глобалкой никак не получится.
Я так сделал, думаю не особо затратно будет:
    private boolean dwFilter() {
        integer id = GetUnitUserData(u)
        return (id == 'n002') and (UnitAlive(GetFilterUnit())) and ((DistanceBetweenCoords(GetUnitX(GetFilterUnit()), GetUnitY(GetFilterUnit()), GetUnitX(LoadUnitHandle(HT, id, waterguardsBase_hid)), GetUnitY(LoadUnitHandle(HT, id, waterguardsBase_hid))) >= 850.00) or (not UnitAlive(LoadUnitHandle(HT, id, waterguardsBase_hid))))
    }
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.