Я написал такую систематизацию динамических триггеров:
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
Kind Ram, еще внезапно есть - это
Там изи детект всех видов урона и есть даже пример как это сделать....
Принятый ответ
28
Kind Ram, а нафига сотни ифов?
смотри уже готовые системы отлова урона которых 100500
они все на 1 триггере
делать динамические триггеры для отлова урона нафиг не нужно
quq_CCCP, а нафига для бафов event widget death?
можно же общее юнит умер
или ты бафы на деревья вешать хочешь?
32
nvc123, нельзя, исключено. Тебе нужно снять эффект (допустим кастом стана), но не после смерти а до смерти, иначе будет баг (юнита больше не смогут застанить если это герой). А с баффами аур, когда им рисуешь псевдо длительность и прочее, тоже нужно избавляться вовремя...
Есть только одно событие которое срабатывает до смерти юнита (даже с крестом перерождения) - TriggerRegisterDeathEvent - это событие на конкретный виджет. Так же в триггер подвешиваем событие на каст диспелов, если юнит кастанул одну из диспелящих абилок в себя, или на него то рассеять бафф и утилизировать триггер.
28
quq_CCCP, а к 1 общему триггеру нельзя просто кучу событий понапихать?
в теории можно тоже самое сделать через получение урона
32
nvc123, ну дабл срабатывания если на юнита повешают бафф дважды?
6
quq_CCCP:
Kind Ram, еще внезапно есть - это
Там изи детект всех видов урона и есть даже пример как это сделать....
Эта штука не совсем то, что я имею ввиду, но всё равно спасибо, пригодится чтобы сделать сопротивление холоду/огню и прочие.
nvc123:
Kind Ram, а нафига сотни ифов?
смотри уже готовые системы отлова урона которых 100500
они все на 1 триггере
Ни одна система урона не будет учитывать 100500 уникальных баффов/абилок без 100500 if-фов. Ну если твой компьютер не обладает нейросетью, которая сама в реальном времени программирует тебе исходный код. Что в реалиях 3-го вара далеко не очень выполнимо.
22
Так делай бд а там уже модификатор править после чего отдаеш результат.
32
Kind Ram, ну а в чем проблема, система удаления триггеров - выложена в теме с веномансером, про действия и условия опсисано все там же.
28
Kind Ram,
Вариант с одним триггером самый лучший, я уже объяснил почему, какие ещё проблемы?
28
Ни одна система урона не будет учитывать 100500 уникальных баффов/абилок без 100500 if-фов.
любая нормальная система учитывает 100500 уникальных значения без 100500 if-фов.
просто бегая по бд и толкая нужные строки
либо используя абстрактные методы
33
Ни одна система урона не будет учитывать 100500 уникальных баффов/абилок без 100500 if-фов.
любая нормальная система учитывает 100500 уникальных значения без 100500 if-фов.
просто бегая по бд и толкая нужные строки
«Если гвоздь плохо забивается, посмотри — может быть, это шуруп.»
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.