Добавлен , не публикуется
использую для отображения урона и других действий при событии получения урона
код
library DamageEventLib
globals
    private constant hashtable H = InitHashtable( )
    private constant timer TempTimer = CreateTimer( )
    private constant group TempGroup = CreateGroup( )
endglobals

private function DamageShow takes nothing returns nothing
    local timer t = GetExpiredTimer( )
    local unit damaged = LoadUnitHandle( H, GetHandleId( t ), 0 )
    local real life = LoadReal( H, GetHandleId( t ), 1 ) - GetWidgetLife( damaged )
    
    if life > 0.00 then
        set bj_lastCreatedTextTag = CreateTextTag( )
        call SetTextTagText( bj_lastCreatedTextTag, I2S( R2I( life ) ), 11.50 * 0.023 / 10 )
        call SetTextTagPosUnit( bj_lastCreatedTextTag, damaged, 0.00 )
        call SetTextTagColor( bj_lastCreatedTextTag, 255, 0, 255, 255 )
        call SetTextTagVelocity( bj_lastCreatedTextTag, 0.00, 64.00 * 0.071 / 128 * 0.44807361612 )
        call SetTextTagPermanent( bj_lastCreatedTextTag, false )
        call SetTextTagFadepoint( bj_lastCreatedTextTag, 0.00 )
        call SetTextTagLifespan( bj_lastCreatedTextTag, 2.00 )
    endif
    
    call RemoveSavedHandle( H, GetHandleId( damaged ), 0 )
    call FlushChildHashtable( H, GetHandleId( t ) )
    call DestroyTimer( t )
    
    set t = null
    set damaged = null
endfunction

private function DamageEvent_Actions takes nothing returns nothing
    local unit attacker = GetEventDamageSource( )
    local unit damaged  = GetTriggerUnit( )
    local real damage   = GetEventDamage( )
    local timer t = LoadTimerHandle( H, GetHandleId( damaged ), 0 )
    
    if t == null then
        set t = CreateTimer( )
        call SaveTimerHandle( H, GetHandleId( damaged ), 0, t )
        call SaveUnitHandle( H, GetHandleId( t ), 0, damaged )
        call SaveReal( H, GetHandleId( t ), 1, GetWidgetLife( damaged ) )
        call TimerStart( t, 0.00, false, function DamageShow )
    endif
    
    set damaged  = null
    set attacker = null
	set t = null
endfunction

//===========================================================================
private function Regist takes unit u returns nothing
    call TriggerRegisterUnitEvent( gg_trg_DamageEvent, u, EVENT_UNIT_DAMAGED )
endfunction

private function Regist_1 takes nothing returns boolean
    if GetUnitAbilityLevel( GetTriggerUnit( ), 'Aloc' ) <= 0 then
        call Regist( GetTriggerUnit( ) )
    endif
    return false
endfunction

private function Regist_2 takes nothing returns boolean
    call Regist( GetFilterUnit( ) )
    return false
endfunction

private function Regist_3 takes nothing returns nothing
    if gg_trg_DamageEvent != null then
        call DestroyTrigger( gg_trg_DamageEvent )
    endif
    
    set gg_trg_DamageEvent = CreateTrigger( )
    call TriggerAddCondition( gg_trg_DamageEvent, Condition( function DamageEvent_Actions ) )
    call GroupEnumUnitsInRect( TempGroup, bj_mapInitialPlayableArea, Condition( function Regist_2 ) )
    call TimerStart( TempTimer, 600.00, false, function Regist_3 )
endfunction

function InitTrig_DamageEvent takes nothing returns nothing
    local trigger trg = CreateTrigger( )
    local region rectRegion = CreateRegion( )
    
    call RegionAddRect( rectRegion, bj_mapInitialPlayableArea )
    call TriggerRegisterEnterRegion( trg, rectRegion, null )
    call TriggerAddCondition( trg, Condition( function Regist_1 ) )
    
    call TimerStart( TempTimer, 0.00, false, function Regist_3 )
    
    set trg = null
    set rectRegion = null
endfunction
endlibrary
`
ОЖИДАНИЕ РЕКЛАМЫ...
23
Случайно наткнулся на заготовку, понравилась. Примерно понимаю , как на jass её переписать.
Но есть вопрос - в функции Regist_3 для убитых юнитов используется удаление их триггеров. Ок, а как быть с утечками event при регистрации событий в функции regist? Event нельзя удалить, к сожалению, а если будет куча юнитов, накопится куча утечек
Ответы (16)
28
EugeAl, ивенты удаляются вместе с триггером, акшона нет, а кондишн в кэше висит. Периодическое удаление сделано с целью очищать триггер от ивентов не существующих юнитов
28
EugeAl, хотя я посмотрел, всё равно заготовку нужно переделывать, ибо локальный триггер то не очищается от событий)
23
rsfghd, вот вот)
а еще вопрос - зачем сделано создание region вместо просто bj initial playable map rect? Ведь есть событие enter rect, вроде как
28
function TriggerRegisterEnterRectSimple takes trigger trig, rect r returns event
    local region rectRegion = CreateRegion()
    call RegionAddRect(rectRegion, r)
    return TriggerRegisterEnterRegion(trig, rectRegion, null)
endfunction
Загруженные файлы
28
rsfghd
хотя я посмотрел, всё равно заготовку нужно переделывать, ибо локальный триггер то не очищается от событий)
я тупой кусок бездарного говна и лучше бы сдох, как же я ненавижу свою , на локальном триггере лишь одно событие - входа юнита на карту, а регистрация события получения урона приходится на тот же триггер, что и очищается
голова совсем замучена, почему ты меня не поправил?)
23
rsfghd, а, все понял по региону )
Так триггер то удаляется, но trigger - это один handle, а event - это другой handle, вот я к чему ) и он висит без триггера, получается, то есть утекает.
хорошо бы Анрайза сюда, чтоб он нам разжевал по внутренней начинке движка, удаляется оно или нет...
28
EugeAl, ивенты удаляются вместе с триггером, я бы кинул тебе доказательства но лень перерывать хгм
28
nvc123
событие автоматически удаляется когда удаляются связанные с ним объекты
занимаемый событием хэндл очищается только тогда когда удаляется триггер
23
rsfghd, там же
quq_CCCP 6 лет назад
События никак не удаляются, они связаны с обьектами на которые они рассчитаны, у триггера можно удалять только условия и действия, напишите что хотите сделать?
Ладно, напишу сам Анрайзу.
28
quq_CCCP
События висят в памяти пока существует обьект на который повешено это событие, в вашем случаи это юнит, если его удалить то не будет и события, триггер тоже можно удалить с кондишинами и экшинами. В тд вовсе ненужна никакая систетема, просто триггер на каждую волну куда и записывается все события на каждого юнита в волне, после окончания все это удаляется.
судя по всему удалять триггер даже не нужно
28
EugeAl, решил протестировать быстренько, пересоздание триггера даже хуже делает)
Загруженные файлы
23
rsfghd, ок, поделюсь )
Если удалять не нужно, тогда вообще получается можно все такие события на 1 триггер вешать, и все ок будет.
23
rsfghd, из переписки с Unryze
События типа Event_unit_damaged
Unryze
2 часа назад
Ничего не удаляется, удаляется лишь юнит и именно всё идущее от него, абилки атаки и т.д. Триггеры никак не учитываются.
23
rsfghd, насчёт этого сказать не могу, но кое какие моменты я отсюда присмотрел, скажем так )
Чтобы оставить комментарий, пожалуйста, войдите на сайт.