Я написал такую систематизацию динамических триггеров:
function ctrg_createtrg takes unit u_src, integer ev_type returns integer
    set udg_cus_trg_im=udg_cus_trg_im+1
    set udg_cus_trg_cu[udg_cus_trg_im]=u_src
    set udg_Player_trig[udg_cus_trg_im]=CreateTrigger()
    if ev_type==1 then
        call TriggerRegisterUnitEvent( udg_Player_trig[udg_cus_trg_im], u_src, EVENT_UNIT_DAMAGED )
    elseif ev_type==2 then
        call TriggerRegisterUnitEvent( udg_Player_trig[udg_cus_trg_im], u_src, EVENT_UNIT_TARGET_IN_RANGE )
    endif
    set u_src=null
    return udg_cus_trg_im
endfunction

function ctrg_isuhasowntrg takes unit who returns boolean
    local integer i=21
    loop
        exitwhen i>udg_cus_trg_im or who==udg_cus_trg_cu[i]
        set i=i+1
    endloop
    set who=null
    if i>udg_cus_trg_im then
        return false
    endif
    return true
endfunction

function ctrg_readytodead takes trigger itready returns nothing
    local integer i=21
    loop
        exitwhen i>udg_cus_trg_im or itready==udg_Player_trig[i]
        set i=i+1
    endloop
    if i<=udg_cus_trg_im then
        set udg_cus_trg_cu[i]=null
    endif
    set itready=null
endfunction

function ctrg_masscheck takes nothing returns nothing
    if udg_cus_trg_cu[udg_cus_trg_ic]==null then
        call DestroyTrigger(udg_Player_trig[udg_cus_trg_ic])
        if udg_cus_trg_ic!=udg_cus_trg_im then
            set udg_Player_trig[udg_cus_trg_ic]=udg_Player_trig[udg_cus_trg_im]
            set udg_cus_trg_cu[udg_cus_trg_ic]=udg_cus_trg_cu[udg_cus_trg_im]
            set udg_cus_trg_ic=udg_cus_trg_ic-1
        endif
        set udg_Player_trig[udg_cus_trg_im]=null
        set udg_cus_trg_cu[udg_cus_trg_im]=null
        set udg_cus_trg_im=udg_cus_trg_im-1
    endif
endfunction

function Trig_CustomTriggers_Utility_Conditions takes nothing returns boolean
    return udg_cus_trg_im>20
endfunction

function Trig_CustomTriggers_Utility_Actions takes nothing returns nothing
    set udg_cus_trg_ic=21
    loop
        call ctrg_masscheck()
        set udg_cus_trg_ic=udg_cus_trg_ic+1
        exitwhen udg_cus_trg_ic>udg_cus_trg_im
    endloop
endfunction

//===========================================================================
function InitTrig_CustomTriggers_Utility takes nothing returns nothing
    set gg_trg_CustomTriggers_Utility = CreateTrigger(  )
    call TriggerRegisterTimerExpireEventBJ( gg_trg_CustomTriggers_Utility, udg_cus_trg_timer )
    call TriggerAddCondition( gg_trg_CustomTriggers_Utility, Condition( function Trig_CustomTriggers_Utility_Conditions ) )
    call TriggerAddAction( gg_trg_CustomTriggers_Utility, function Trig_CustomTriggers_Utility_Actions )
endfunction
Будут ли тут оставаться утечки, касательно созданных триггеров?
P.S. первые 20 элементов массива зарезервированы на триггеры, которые нужны на протяжении всей игры.

Kind Ram, еще внезапно есть - это
Там изи детект всех видов урона и есть даже пример как это сделать....
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
32
Про создание и удаление триггеров достаточно подробно рассказано тут
6
на основе функций из твоей ссылки я и делал.
только у меня триггеры привязаны к юнитам, а не dur + я хз зачем там одноразовый таймер на 999999999999 секунд.
32
Kind Ram, а тебе нужно понимать, а нужно скопировать и вставить...
Если в краце, это самый производительный алгоритм, на одном таймере.
28
Kind Ram,
Зачем тебе динамические триггеры?
Я понимаю создавать триггеры только для используемых героев в арене например. Но так для чего ты их юзаешь? Отлов урона всё равно через глобальный триггер надо делать.
6
16GB:
Kind Ram,
Зачем тебе динамические триггеры?
Я понимаю создавать триггеры только для используемых героев в арене например. Но так для чего ты их юзаешь? Отлов урона всё равно через глобальный триггер надо делать.
Ты предлагаешь мне записывать абсолютно всех юнитов на карте в глобальный триггер?
Мне нужно либо - некоторые юниты, под определёнными баффами или с определёнными способностями отлавливали урон, при том что, при разных способностях следуют разные эффекты. Героев кстати в этой карте вообще нет. А юниты с подобными способностями регулярно появляются, умирают и исчезают из игры.
Тут как не крути нужны динамические триггеры.
И, собственно, я не уверен только в этой фукции, так как передаю в неё триггер:
function ctrg_readytodead takes trigger itready returns nothing
local integer i=21
loop
exitwhen i>udg_cus_trg_im or itready==udg_Player_trig[i]
set i=i+1
endloop
if i<=udg_cus_trg_im then
set udg_cus_trg_cu[i]=null
endif
set itready=null
endfunction
может мне стоит передавать туда юнита вместо триггера и по нему сравнивать?
просто занулённый юнит в итоге будет удалён из памяти, а насчёт триггера я не уверен.
28
Kind Ram,
У меня в аосе записываются все мобы с течении двух часов всё было норм (это и те что идут по линиям и в лесу), нужно лишь пересоздавать триггер каждые 5 минут. Это было проверено тысячами игр.
И опять же я не говорил что записывать всех, если тебе не нужны все юниты, записывай только тех что нужны, но триггер надо использовать один.
32
Единственная необходимость плодить динамические триггеры - это мемхак и кастом баффы, там просто необходимо знать что хп упало до нуля (event widget death) а так же другие события...
6
То есть вы хотите сказать что мне нужен один единственный триггер вообще на все события damage taken для разных способностей?
Это значит что у меня будет длиннющего кода триггер с сотнями if-ов каждый из которых будет проверяться на соответствие да ещё при каждой реакции damage taken.
28
Kind Ram:
То есть вы хотите сказать что мне нужен один единственный триггер вообще на все события damage taken для разных способностей?
Это значит что у меня будет длиннющего кода триггер с сотнями if-ов каждый из которых будет проверяться на соответствие да ещё при каждой реакции damage taken.
Да у меня так и сделано. И это позволит учитывать влияние абилок друг на друга. Например усиление триггерного сплеша от триггерного крита.
Типо вот
function ALDSAct takes nothing returns nothing
local unit d
local unit c
local unit t = GetTriggerUnit()
local unit s = GetEventDamageSource()
local unit dc
local integer i
local integer id
local boolean b
local boolean cl
local boolean rl
local real r1
local real r2
local real r3
local real Dm = GetEventDamage()
local integer q
local integer w
local item IT



if GetUnitAbilityLevel(t,'B03H') > 0 and IsUnitType(s,UNIT_TYPE_HERO) and (Dm == 1. or GetUnitTypeId(t) == 'o00L') then
//call echo("start range attack hero "+R2S(Dm))
call SetUnitState(t,UNIT_STATE_LIFE,GetUnitState(t,UNIT_STATE_LIFE)+1.)



if GetUnitAbilityLevel(s,'A08V') > 0 and LoadInteger(udg_AssassinHash,GetHandleId(s),StringHash("BEAC")) == 0 and (GetRandomInt(1,100) <= 20 or GetUnitAbilityLevel(t,EMT()) > 0) then
call BestEye(s)
endif

if Dm > 0. and IsTarget(t,s) and GetUnitAbilityLevel(s,'A0NK') > 0 then
call MagicShot(s,GetUnitX(t),GetUnitY(t))
endif


if LoadBoolean(udg_AssassinHash,GetHandleId(s),StringHash("LSBB")) then

if LoadInteger(udg_AssassinHash,GetHandleId(s),StringHash("LSBD")) > 0 then
call LongSwordCheck(s)
else
call SaveInteger(udg_AssassinHash,GetHandleId(s),StringHash("LSBI"),LoadInteger(udg_AssassinHash,GetHandleId(s),StringHash("LSBI"))+1)
if LoadInteger(udg_AssassinHash,GetHandleId(s),StringHash("LSBI")) >= 4 then
call LongSwordAdd(s)
call SaveInteger(udg_AssassinHash,GetHandleId(s),StringHash("LSBI"),0)
endif
endif
endif

call HMCreate(s,t)
call UnitRemoveAbility(t,'B03H')
set Dm = 0.
endif

if Dm > 0. then
set i = 0
set id = 0
set b = false
set cl = false
set rl = false
set r1 = 0.
set r2 = 0.
set r3 = 0.
set q = GetPlayerId(GetOwningPlayer(s))
set w = GetPlayerId(GetOwningPlayer(t))
//set Dm = GetEventDamage()
set dc = RDC(s)

if GetUnitAbilityLevel(t,'B03I') > 0 then
call UnitAddAbility(t,'A086')
call UnitRemoveAbility(t,'B03I')
endif

if (GetUnitAbilityLevel(t,'B03H') > 0 or GetUnitAbilityLevel(s,'A0BI') > 0) and GetUnitTypeId(s) != 'e015' and not IsUnitType(s,UNIT_TYPE_HERO)  then
call UnitAddAbility(t,'A087')
call UnitRemoveAbility(t,'B03H')
//call echo("range attack creep")
endif

if GetUnitTypeId(s) == 'e015' then
call UnitAddAbility(t,'A087')

set s = dc
//call echo("range attack hero "+R2S(Dm))
endif



//all block effect
if LoadBoolean(udg_AssassinHash,GetHandleId(t),StringHash("URB1")) and LoadBoolean(udg_AssassinHash,GetHandleId(t),StringHash("URB2")) == false and Dm > 0. then
call DDCUC(t,Dm,true)
call AssistanceSystem_Timer(Dm,t,s)
set Dm = 0.00
endif

//if GetUnitTypeId(s) != 'h02E' then 


if GetUnitAbilityLevel(dc,'A0AO') > 0 and Dm > 0.and GetUnitTypeId(s) != 'h036' and not (GetUnitTypeId(s) == 'h02T' and GetUnitState(s,UNIT_STATE_MANA) == 100.) then
call DDCUC(t,Dm,true)
set Dm = 0.00
endif

if GetUnitAbilityLevel(dc,'B030') > 0 and Dm > 0. then
call DDCUC(t,Dm,true)
set Dm = 0.00
endif

if GetUnitAbilityLevel(t,'A0EX') > 0 and Dm < GetUnitState(t,UNIT_STATE_MAX_LIFE) then
call DelayedDamageCheck(t,Dm*.2)
set Dm = Dm*.8
endif

if Dm > 0. and GetUnitTypeId(t) == 'n01N' then
if FDFD(dc,t) <= 500. then
call IssueImmediateOrder(t,"stomp")
else
call DDCUC(t,Dm*.8,true)
set Dm = Dm*.2
endif
endif
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.