использую для отображения урона и других действий при событии получения урона
код
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
Но есть вопрос - в функции Regist_3 для убитых юнитов используется удаление их триггеров. Ок, а как быть с утечками event при регистрации событий в функции regist? Event нельзя удалить, к сожалению, а если будет куча юнитов, накопится куча утечек
а еще вопрос - зачем сделано создание region вместо просто bj initial playable map rect? Ведь есть событие enter rect, вроде как
кусок бездарного говна и лучше бы сдох, как же я ненавижу свою, на локальном триггере лишь одно событие - входа юнита на карту, а регистрация события получения урона приходится на тот же триггер, что и очищаетсяголова совсем замучена, почему ты меня не поправил?)
Ред. rsfghd
Ред. EugeAl
Unryze
2 часа назад
Ничего не удаляется, удаляется лишь юнит и именно всё идущее от него, абилки атаки и т.д. Триггеры никак не учитываются.