вообщем функция работает отлично, но некоторые люди говорят,
что 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
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? Они не удаляются при уничтожении триггера?
0
32
8 лет назад
Отредактирован quq_CCCP
0
Кет:
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 )
// и так далее...
0
33
8 лет назад
Отредактирован Кет
0
а, точно, вспомнил — я ж так и делаю =)
2
32
8 лет назад
2
И кстати да, чуть не забыл Использовать 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 ) )
0
17
8 лет назад
0
quq_CCCP, method FlushData takes nothing
returns nothing?
что она делает и как ее вызывать для удаления condition?
quq_CCCP, пожалуйста можешь обьяснить про правильную удаления триггера и Евента?
quq_CCCP, и показать простой пример
4
33
8 лет назад
Отредактирован Кет
4
Zeuz, FlushData — это не нативка, это Кук сам создал. Тебя интересует вот это:
call TriggerRemoveCondition( .trg, .trc )
call TriggerRemoveAction( .trg, .tra )
call TriggerRemoveAction( .trg, .extra )
call TriggerClearActions( .trg )
call TriggerClearConditions( .trg )
call DestroyTrigger( .trg )
Соответственно, все события и действия нужно куда-то записывать при создании триггера. Типа
local triggeraction tra = TriggerAddAction(trg, function TrgAction)
0
17
8 лет назад
0
Кет, примерную функцию сделай пожалуйста)
Кет, правильное удаление триггера и евент
0
33
8 лет назад
Отредактирован Кет
0
Zeuz, ну а это что? =(
call TriggerRemoveCondition( .trg, .trc )
call TriggerRemoveAction( .trg, .tra )
call TriggerClearActions( .trg )
call TriggerClearConditions( .trg )
call DestroyTrigger( .trg )
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.