Я написал такую систематизацию динамических триггеров:
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 элементов массива зарезервированы на триггеры, которые нужны на протяжении всей игры.
P.S. первые 20 элементов массива зарезервированы на триггеры, которые нужны на протяжении всей игры.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Если в краце, это самый производительный алгоритм, на одном таймере.
Зачем тебе динамические триггеры?
Я понимаю создавать триггеры только для используемых героев в арене например. Но так для чего ты их юзаешь? Отлов урона всё равно через глобальный триггер надо делать.
Мне нужно либо - некоторые юниты, под определёнными баффами или с определёнными способностями отлавливали урон, при том что, при разных способностях следуют разные эффекты. Героев кстати в этой карте вообще нет. А юниты с подобными способностями регулярно появляются, умирают и исчезают из игры.
Тут как не крути нужны динамические триггеры.
И, собственно, я не уверен только в этой фукции, так как передаю в неё триггер:
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
просто занулённый юнит в итоге будет удалён из памяти, а насчёт триггера я не уверен.
Ред. 16GB
У меня в аосе записываются все мобы с течении двух часов всё было норм (это и те что идут по линиям и в лесу), нужно лишь пересоздавать триггер каждые 5 минут. Это было проверено тысячами игр.
И опять же я не говорил что записывать всех, если тебе не нужны все юниты, записывай только тех что нужны, но триггер надо использовать один.
Это значит что у меня будет длиннющего кода триггер с сотнями if-ов каждый из которых будет проверяться на соответствие да ещё при каждой реакции damage taken.
Ред. 16GB
Ред. quq_CCCP
Там изи детект всех видов урона и есть даже пример как это сделать....
смотри уже готовые системы отлова урона которых 100500
они все на 1 триггере
делать динамические триггеры для отлова урона нафиг не нужно
quq_CCCP, а нафига для бафов event widget death?
можно же общее юнит умер
или ты бафы на деревья вешать хочешь?
Есть только одно событие которое срабатывает до смерти юнита (даже с крестом перерождения) - TriggerRegisterDeathEvent - это событие на конкретный виджет. Так же в триггер подвешиваем событие на каст диспелов, если юнит кастанул одну из диспелящих абилок в себя, или на него то рассеять бафф и утилизировать триггер.
в теории можно тоже самое сделать через получение урона