События висят в памяти пока существует обьект на который повешено это событие, в вашем случаи это юнит, если его удалить то не будет и события, триггер тоже можно удалить с кондишинами и экшинами. В тд вовсе ненужна никакая систетема, просто триггер на каждую волну куда и записывается все события на каждого юнита в волне, после окончания все это удаляется.
library TriggerRegisterAnyUnitDamagedEvent initializer Init
globals
public constant trigger TRIGGER = CreateTrigger()
private constant trigger TRIGGER_ADDER = CreateTrigger()
endglobals
private function TriggerAddEvent takes nothing returns boolean
if not HaveSavedHandle(HASHTABLE, GetHandleId(GetFilterUnit()), StringHash("bla_bla")) then
call SaveTriggerEventHandle(HASHTABLE, GetHandleId(GetFilterUnit()), StringHash("bla_bla"), TriggerRegisterUnitEvent(TRIGGER, GetFilterUnit(), EVENT_UNIT_DAMAGED))
endif
return false
endfunction
private function Init takes nothing returns nothing
local group g = CreateGroup()
local rect r = GetWorldBounds()
local region reg = CreateRegion()
local boolexpr filter = Condition(function TriggerAddEvent)
call GroupEnumUnitsInRect(g, r, filter)
call RegionAddRect(reg, r)
call TriggerRegisterEnterRegion(TRIGGER_ADDER, reg, filter)
call DestroyGroup(g)
call RemoveRect(r)
set g = null
set r = null
set reg = null
endfunction
function TriggerRegisterAnyUnitDamagedEvent takes code c returns nothing
call TriggerAddCondition(TRIGGER, Condition(c))
endfunction
endlibrary
Как видишь, на каждого нового заспавненного крипа прикрепляется евент, который остаётся после смерти крипа.
А такой триггер мне нужен, чтобы правильно работали скиллы у таверов. Например, один товер, атакуя кастует огненный столб на атакованного и т.д.
quq_CCCP, потому что этот эвент срабатывает еще до того, как юнит получит урон, достаточно лишь замахнуться, чтобы запустить триггер. А в этой библиотеке, триггер запускается, когда цель получит урон.
ScopteRectuS, цель получает урон очень часто, как будем отличать урон от физ тычки от абилок башни?
Да и если ты бросаешь спелл, зачем тебе ждать удара?
Просто создаешь триггер каждую волну, на каждого созданного тобой крипа вешаешь событие что он сдох, что получил урон. Усе.
Далее добавляешь кондищены и акшены, когда волна закончится и все мобы сдохли, удаляем всех крипов действием RemoveUnit, удаляем условия и действия у триггера, паузим триггер и удаляем через минутку-другую, а затем удаляем. Так не будет утечек и минимум нагрузки.
Я выкладывал код веномансера из доты, там прилеплена наработка грамотного удаления триггеров чтобы не было коллизии хендлов триггеров.
Есть волны крипов, есть здания... Дальше что?
Да и если ты бросаешь спелл, зачем тебе ждать удара?
Далее добавляешь кондищены и акшены, когда волна закончится и все мобы сдохли, удаляем всех крипов действием RemoveUnit, удаляем условия и действия у триггера, паузим триггер и удаляем через минутку-другую, а затем удаляем. Так не будет утечек и минимум нагрузки.
Я выкладывал код веномансера из доты, там прилеплена наработка грамотного удаления триггеров чтобы не было коллизии хендлов триггеров.
Отредактирован scopterectus
ps нашел
ps2: зачем при спавне крипов что то им добавлять, если та библиотека делает тоже самое?