вообщем функция работает отлично, но некоторые люди говорят,
что 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 а для этого их нужно куда то сохранить, много городушек и лишних действий, посему там где можно не юзать триггеры лучше их не юзать.
`
ОЖИДАНИЕ РЕКЛАМЫ...
3
29
8 лет назад
3
почему бы не использовать таймер?
0
33
8 лет назад
0
0
17
8 лет назад
0
16GB, таймер это конечно хорошо) но муй через него не получится, потому что не будет евент смерти кастера
Кет, boolexpr действительно создает хэндл, но временно и сразу же сам очишает...
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? Они не удаляются при уничтожении триггера?
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 )
0
28
8 лет назад
0
quq_CCCP, евент это просто регистрация триггера у объекта
его не нужно удалять (да и не возможно)
Чтобы оставить комментарий, пожалуйста, войдите на сайт.