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