Чел кидал пример работы с фильтрами, там в коде он обнуляет переменную после 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() или постоянно загружать с хэш-таблицы.

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

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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
1
32
5 лет назад
1
Эмм как насчет глобальных переменных, т.к в фильтрах ты не создаешь условия а только делаешь проверки, без разрыва потока вейтами, то глобалки доступное и изящное решение.
Принятый ответ
0
19
5 лет назад
0
quq_CCCP, Да, что-то не подумал.
0
32
5 лет назад
0
Потом странная идиотия, создавать переменная к которой нужно обратится всего 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
0
19
5 лет назад
0
Хотя не получится же, там получаемый юнит зависит от ид юнита. Глобалкой не выйдет.
1
32
5 лет назад
1
Но можно было сделать сразу проверку на типы, без IsUnitType ибо проверка на typeid быстрее и в "узких местах" лучше начинать с неё.
KaneThaumaturge, Почему не выйдет? Что собрался делать напиши, какое условие?
0
19
5 лет назад
0
В фильтре юнит загружается по хэндлу проверяемого юнита. По-этому глобалкой никак не получится.
Я так сделал, думаю не особо затратно будет:
    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))))
    }
1
32
5 лет назад
1
Кто такой u и откуда он берется?
0
19
5 лет назад
0
Это ошибка, я уже заменил. Это GetFilterUnit()
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.