Чел кидал пример работы с фильтрами, там в коде он обнуляет переменную после 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))))
    }
32
KaneThaumaturge, так же можно делать вот так:
function dwFolter takes nothing returns boolean
local unit u = GetTriggerUnit()
local integer id = GetUnitUserData(u)
local boolean b = (id==2) and not( IsUnitDead(u))... ну и так далее
set u = null
return b
endfunction
Обнуляя переменные до return, базовые типы обнулять ненужно.
Только непойму почему ты не можешь юзать глобалки? В них просто заносишь нужные данные перед условием как в локалки и все, но их обнулять ненужно.
20
Только непойму почему ты не можешь юзать глобалки?
Мой идиотизм
Я сделал, спасибо. Хотя второй вариант тоже не плох.
    private boolean dwFilter() {
        BuferUnit = GetFilterUnit()
        integer id = GetUnitUserData(BuferUnit)
        BuferUnit2 = LoadUnitHandle(HT, id, waterguardsBase_hid)
        return (id == 'n002') and (UnitAlive(BuferUnit)) and ((DistanceBetweenCoords(GetUnitX(BuferUnit), GetUnitY(BuferUnit), GetUnitX(BuferUnit2), GetUnitY(BuferUnit2)) >= 850.00) or (not UnitAlive(BuferUnit2)))
    }
Чтобы оставить комментарий, пожалуйста, войдите на сайт.