Я написал такую систематизацию динамических триггеров:
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
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-фов.
просто бегая по бд и толкая нужные строки
«Если гвоздь плохо забивается, посмотри — может быть, это шуруп.»
Чтобы оставить комментарий, пожалуйста, войдите на сайт.