вообщем функция работает отлично, но некоторые люди говорят,
что boolexpr эта хэндл т.е создает утечку, на практике я такое не обнаружил т.е хэндлы то не создаются
и еще ведь сам IceFrog использовал condition и много раз...
function BootsOfSpeedExpired takes nothing returns boolean
    local trigger t = GetTriggeringTrigger()
    local integer h = GetHandleId(t)
    local unit a = LoadUnitHandle(H,h,0)
    if GetTriggerEventId()==EVENT_WIDGET_DEATH then
    if GetTriggerUnit()== a then
    call UnitRemoveAbility( a, 'Aspb' )
    call FlushChildHashtable(H,h)
    call DestroyTrigger(t)
    endif
    endif
    if GetTriggerEventId()==EVENT_GAME_TIMER_EXPIRED then
    call UnitRemoveAbility( a, 'Aspb' )
    call FlushChildHashtable(H,h)
    call DestroyTrigger(t)
    endif
    set t=null
    set a=null
    return false
endfunction

function BootsOfSpeed takes unit a returns nothing
    local trigger t = CreateTrigger()
    local integer h = GetHandleId(t)
    call UnitAddAbility(a,'Aspb')
    call SetPlayerAbilityAvailable( GetOwningPlayer(a),'Aspb',false)
    call SaveUnitHandle(H,h,0,a)
    call TriggerRegisterTimerEvent(t,4.0,false)
    call TriggerRegisterUnitEvent(t,a,EVENT_UNIT_DEATH )
    call TriggerAddCondition(t,Condition(function BootsOfSpeedExpired))
    set t = null
    set a = null
endfunction

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

Zeuz:
nvc123, тогда получается boolexpr не утечна?
его можно создать где угодно)
и использовать как фрог
Лол, обьясняю еще раз
  • Condition( function SomeFunc ) и Filter( function SomeFunc ) возвращают Boolexpr, он кешируется, и не утекает
Но в триггере еще есть TriggerAddCondition( trigger, boolexpr ) который возвращает triggercondition - который какраз и утекает, это хендл который висит в памяти и требует удаления... туда же triggeraction .
Поэтому там где используются локальные триггеры которые будут удалены нужно удалять и triggeraction и triggercondition а для этого их нужно куда то сохранить, много городушек и лишних действий, посему там где можно не юзать триггеры лучше их не юзать.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
33
8 лет назад
Отредактирован Кет
0
Ну если число хендлов не растёт, значит всё хорошо =)
0
32
8 лет назад
0
Сам TriggerCondition и TriggerAction хендлы, их надо бы удалять, есть специальные функции для этого.
Таймером можно проверять хп кастера, если хп менье 0.405 то кастер сдох...
Триггеры на манеру Ледяной Лягухи не лучшее решение....
0
17
8 лет назад
0
quq_CCCP, можешь пожалуйста показать пример функцию таймера муй хп кастером?
0
32
8 лет назад
0
Период 0.5 - и счетчик, если кол-во циклов таймера больше 8 то удалить там спеллбук, запаузить таймер и удалить. И точно так же проверяешь хп кастера раз в 0.5 сек, вот и ненужно триггера.
0
28
8 лет назад
0
Zeuz, boolexpr это хэндл
удалять не надо так как он хэшируется
сам IceFrog
он то ещё дно
простой просмотр его кода доказывает это
а если учесть что почти весь его код переписывали потом другие люди чтобы не было утечек то он глубокое дно
0
32
8 лет назад
0
Насчет фрога - xgm.guru/p/wc3/omnislash там разжеванна малая часть его косяков.
0
28
8 лет назад
0
таймер это конечно хорошо) но муй через него не получится, потому что не будет евент смерти кастера
если хочешь муи то юзай стек и 1 таймер
триггеры тут нафиг не нужны
если же твоя цель написать как можно более дебильный код то добавь перед каждой строчкой
if(true!=false and true==true and false==false)
малая часть его косяков
точнее те косяки которые не пофиксили другие
не стоит забывать что фрог работал над дотой не 1
0
17
8 лет назад
0
nvc123, тогда получается boolexpr не утечна?
его можно создать где угодно)
и использовать как фрог?
0
28
8 лет назад
0
Zeuz, ты хоть понимаешь что такое утечка памяти?
0
32
8 лет назад
Отредактирован quq_CCCP
0
Zeuz:
nvc123, тогда получается boolexpr не утечна?
его можно создать где угодно)
и использовать как фрог
Лол, обьясняю еще раз
  • Condition( function SomeFunc ) и Filter( function SomeFunc ) возвращают Boolexpr, он кешируется, и не утекает
Но в триггере еще есть TriggerAddCondition( trigger, boolexpr ) который возвращает triggercondition - который какраз и утекает, это хендл который висит в памяти и требует удаления... туда же triggeraction .
Поэтому там где используются локальные триггеры которые будут удалены нужно удалять и triggeraction и triggercondition а для этого их нужно куда то сохранить, много городушек и лишних действий, посему там где можно не юзать триггеры лучше их не юзать.
Принятый ответ
0
33
8 лет назад
0
quq_CCCP, а как удалить triggercondition и triggeraction? Они не удаляются при уничтожении триггера?
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.