Чел кидал пример работы с фильтрами, там в коде он обнуляет переменную после 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()
1
32
5 лет назад
Отредактирован quq_CCCP
1
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, базовые типы обнулять ненужно.
Только непойму почему ты не можешь юзать глобалки? В них просто заносишь нужные данные перед условием как в локалки и все, но их обнулять ненужно.
0
19
5 лет назад
Отредактирован KaneThaumaturge
0
Только непойму почему ты не можешь юзать глобалки?
Мой идиотизм
Я сделал, спасибо. Хотя второй вариант тоже не плох.
    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)))
    }
Чтобы оставить комментарий, пожалуйста, войдите на сайт.