Функция для удаления евента триггера
Какой функцией можно удалить trigger event с какого-либо триггера?

Лучший ответ:
Никакой, события удаляются - от слова никак!



Просмотров: 411

quq_CCCP #1 - 4 месяца назад 0

Никакой, события удаляются - от слова никак!
Это сообщение удалено
ScopteRectuS #3 - 4 месяца назад 0
quq_CCCP, ты отвечал в моём предыдущем вопросе (про библиотеку, которая добавляет событие на получение урона всем юнитам), там добавляется событие на каждого юнита на карте. Так как карта у меня жанра TD, получается, что карта будет иметь миллион утечек памяти?
Uber #4 - 4 месяца назад 1
карта будет иметь миллион утечек памяти?
А почему вы решили, что события вызывают утечки?
ScopteRectuS #5 - 4 месяца назад (отредактировано ) 0
Uber, а что нет? ну не совсем утечки, но ненужный объект все равно же остаётся в памяти.
Uber #6 - 4 месяца назад 1
Не знаю, может вы мне скажите.
ScopteRectuS #7 - 4 месяца назад 0
Uber, :-) я не знаю, поэтому тут и спросил (развёрнутого ответа).
quq_CCCP #8 - 4 месяца назад 2
События висят в памяти пока существует обьект на который повешено это событие, в вашем случаи это юнит, если его удалить то не будет и события, триггер тоже можно удалить с кондишинами и экшинами. В тд вовсе ненужна никакая систетема, просто триггер на каждую волну куда и записывается все события на каждого юнита в волне, после окончания все это удаляется.
ScopteRectuS #9 - 4 месяца назад 0
quq_CCCP, у меня скиллы у таверов работают, когда они атакуют противников.
quq_CCCP #10 - 4 месяца назад 0
ScopteRectuS:
quq_CCCP, у меня скиллы у таверов работают, когда они атакуют противников.
Совершенно не понимаю связь с триггерами на отслеживание урона?
Есть волны крипов, есть здания... Дальше что?
ScopteRectuS #11 - 4 месяца назад 0

вот сама библиотека

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 #12 - 4 месяца назад -1
Знаешь, а нафига тебе нужно отслеживать урон:? Есть событие любой игрок игрока N атакован, одно событие на игрока, на всю игру. Не забивает память.
ScopteRectuS #13 - 4 месяца назад 0
quq_CCCP, потому что этот эвент срабатывает еще до того, как юнит получит урон, достаточно лишь замахнуться, чтобы запустить триггер. А в этой библиотеке, триггер запускается, когда цель получит урон.
quq_CCCP #14 - 4 месяца назад 0
ScopteRectuS, цель получает урон очень часто, как будем отличать урон от физ тычки от абилок башни?
Да и если ты бросаешь спелл, зачем тебе ждать удара?
ScopteRectuS #15 - 4 месяца назад 0
у меня есть проверка, на наличие какой-либо абилки. спел кастует дамми юнит, товер продолжает атаковать
quq_CCCP #16 - 4 месяца назад 2
Просто создаешь триггер каждую волну, на каждого созданного тобой крипа вешаешь событие что он сдох, что получил урон. Усе.
Далее добавляешь кондищены и акшены, когда волна закончится и все мобы сдохли, удаляем всех крипов действием RemoveUnit, удаляем условия и действия у триггера, паузим триггер и удаляем через минутку-другую, а затем удаляем. Так не будет утечек и минимум нагрузки.
Я выкладывал код веномансера из доты, там прилеплена наработка грамотного удаления триггеров чтобы не было коллизии хендлов триггеров.
ScopteRectuS #17 - 4 месяца назад (отредактировано ) 0
quq_CCCP, можно ссылочку на этот скиллНъ??
ps нашел
ps2: зачем при спавне крипов что то им добавлять, если та библиотека делает тоже самое?
quq_CCCP #18 - 4 месяца назад 2
У тебя код добавляет всех подряд, темболее нафиг тебе отдельный триггер и добавление всех юнитов на карте?
Событие юнит получает урон - нужно только крипам, когда ты их создаешь, добавляешь и событие на каждого созданного юнита, это быстрее и не требует отдельного триггера + не будет проблем с повторным событием и не будет юнитов которым эти события ненужны.
Ты же хотел чтобы без утечек и максимально быстро?
ScopteRectuS #19 - 4 месяца назад 2
quq_CCCP, а, кажется я понял, что ты хотел донести.
ssbbssc #20 - 4 месяца назад 0
разве что отключением\удалением самого триггера