вообщем функция работает отлично, но некоторые люди говорят,
что 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 а для этого их нужно куда то сохранить, много городушек и лишних действий, посему там где можно не юзать триггеры лучше их не юзать.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
28
Zeuz, boolexpr это хэндл
удалять не надо так как он хэшируется
сам IceFrog
он то ещё дно
простой просмотр его кода доказывает это
а если учесть что почти весь его код переписывали потом другие люди чтобы не было утечек то он глубокое дно
32
Насчет фрога - xgm.guru/p/wc3/omnislash там разжеванна малая часть его косяков.
28
таймер это конечно хорошо) но муй через него не получится, потому что не будет евент смерти кастера
если хочешь муи то юзай стек и 1 таймер
триггеры тут нафиг не нужны
если же твоя цель написать как можно более дебильный код то добавь перед каждой строчкой
if(true!=false and true==true and false==false)
малая часть его косяков
точнее те косяки которые не пофиксили другие
не стоит забывать что фрог работал над дотой не 1
17
nvc123, тогда получается boolexpr не утечна?
его можно создать где угодно)
и использовать как фрог?
28
Zeuz, ты хоть понимаешь что такое утечка памяти?
32
Zeuz:
nvc123, тогда получается boolexpr не утечна?
его можно создать где угодно)
и использовать как фрог
Лол, обьясняю еще раз
  • Condition( function SomeFunc ) и Filter( function SomeFunc ) возвращают Boolexpr, он кешируется, и не утекает
Но в триггере еще есть TriggerAddCondition( trigger, boolexpr ) который возвращает triggercondition - который какраз и утекает, это хендл который висит в памяти и требует удаления... туда же triggeraction .
Поэтому там где используются локальные триггеры которые будут удалены нужно удалять и triggeraction и triggercondition а для этого их нужно куда то сохранить, много городушек и лишних действий, посему там где можно не юзать триггеры лучше их не юзать.
Принятый ответ
33
quq_CCCP, а как удалить triggercondition и triggeraction? Они не удаляются при уничтожении триггера?
32
Кет:
quq_CCCP, а как удалить triggercondition и triggeraction? Они не удаляются при уничтожении триггера?
Нет не удаляются, есть TriggerRemoveCondition\Action и TriggerClearConditions\Actions
Ивенты триггера тоже никуда не деются, пока есть связанный с ними обьект.
        method FlushData takes nothing returns nothing
            call DisableTrigger( .trg )
            call TriggerRemoveCondition( .trg, .trc )
            call TriggerRemoveAction( .trg, .tra )
            call TriggerRemoveAction( .trg, .extra )
            call TriggerClearActions( .trg )
            call TriggerClearConditions( .trg )
            call RemoveDataBX( .trg )
            call RemoveDataBX( .trix )
            call DestroyTrigger( .trg )
            call DestroyTimer( .trix )
// и так далее...
32
И кстати да, чуть не забыл Использовать Boolexpr как IceFrog не нужно, ничего хорошего в этом нет.
для тех кто в танке ниже пример кода айсфрога
код

function A takes nothing returns boolean
	return IsUnitDead( GetFilterUnit() ) == false and IsUnitType( GetFilterUnit(), UNIT_TYPE_ANCIENT )) == false and IsUnitEnemy( GetFilterUnit(), bj_groupEnumOwningPlayer()
endfunction

function B takes nothing returns boolean
	return IsUnitDead( GetFilterUnit() ) == false and IsUnitType( GetFilterUnit(), UNIT_TYPE_ANCIENT )) == false and IsUnitEnemy( GetFilterUnit(), bj_groupEnumOwningPlayer()
endfunction

function C takes nothing returns boolean
	return IsUnitDead( GetFilterUnit() ) == false and IsUnitType( GetFilterUnit(), UNIT_TYPE_ANCIENT )) == false and IsUnitEnemy( GetFilterUnit(), bj_groupEnumOwningPlayer()
endfunction
// ...
// потом где то в коде спеллов
// 
call GroupEnumUnitsInRange( grp, x,y, 450.00, Condition( function A ) )
...
call GroupEnumUnitsInRange( grp, x,y, 450.00, Condition( function B ) )
...
call GroupEnumUnitsInRange( grp, x,y, 450.00, Condition( function C ) )
17
quq_CCCP, method FlushData takes nothing
returns nothing?
что она делает и как ее вызывать для удаления condition?
quq_CCCP, пожалуйста можешь обьяснить про правильную удаления триггера и Евента?
quq_CCCP, и показать простой пример
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.