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

Принятый ответ

Никакой, события удаляются - от слова никак!
0
32
7 лет назад
0
Никакой, события удаляются - от слова никак!
Принятый ответ
Этот комментарий удален
0
21
7 лет назад
0
quq_CCCP, ты отвечал в моём предыдущем вопросе (про библиотеку, которая добавляет событие на получение урона всем юнитам), там добавляется событие на каждого юнита на карте. Так как карта у меня жанра TD, получается, что карта будет иметь миллион утечек памяти?
0
26
7 лет назад
0
карта будет иметь миллион утечек памяти?
А почему вы решили, что события вызывают утечки?
0
21
7 лет назад
Отредактирован scopterectus
0
Uber, а что нет? ну не совсем утечки, но ненужный объект все равно же остаётся в памяти.
0
26
7 лет назад
0
Не знаю, может вы мне скажите.
0
21
7 лет назад
0
Uber, :-) я не знаю, поэтому тут и спросил (развёрнутого ответа).
2
32
7 лет назад
2
События висят в памяти пока существует обьект на который повешено это событие, в вашем случаи это юнит, если его удалить то не будет и события, триггер тоже можно удалить с кондишинами и экшинами. В тд вовсе ненужна никакая систетема, просто триггер на каждую волну куда и записывается все события на каждого юнита в волне, после окончания все это удаляется.
0
21
7 лет назад
0
quq_CCCP, у меня скиллы у таверов работают, когда они атакуют противников.
0
32
7 лет назад
0
ScopteRectuS:
quq_CCCP, у меня скиллы у таверов работают, когда они атакуют противников.
Совершенно не понимаю связь с триггерами на отслеживание урона?
Есть волны крипов, есть здания... Дальше что?
0
21
7 лет назад
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
Как видишь, на каждого нового заспавненного крипа прикрепляется евент, который остаётся после смерти крипа.
А такой триггер мне нужен, чтобы правильно работали скиллы у таверов. Например, один товер, атакуя кастует огненный столб на атакованного и т.д.
0
32
7 лет назад
0
Знаешь, а нафига тебе нужно отслеживать урон:? Есть событие любой игрок игрока N атакован, одно событие на игрока, на всю игру. Не забивает память.
0
21
7 лет назад
0
quq_CCCP, потому что этот эвент срабатывает еще до того, как юнит получит урон, достаточно лишь замахнуться, чтобы запустить триггер. А в этой библиотеке, триггер запускается, когда цель получит урон.
0
32
7 лет назад
0
ScopteRectuS, цель получает урон очень часто, как будем отличать урон от физ тычки от абилок башни?
Да и если ты бросаешь спелл, зачем тебе ждать удара?
0
21
7 лет назад
0
у меня есть проверка, на наличие какой-либо абилки. спел кастует дамми юнит, товер продолжает атаковать
0
32
7 лет назад
0
Просто создаешь триггер каждую волну, на каждого созданного тобой крипа вешаешь событие что он сдох, что получил урон. Усе.
Далее добавляешь кондищены и акшены, когда волна закончится и все мобы сдохли, удаляем всех крипов действием RemoveUnit, удаляем условия и действия у триггера, паузим триггер и удаляем через минутку-другую, а затем удаляем. Так не будет утечек и минимум нагрузки.
Я выкладывал код веномансера из доты, там прилеплена наработка грамотного удаления триггеров чтобы не было коллизии хендлов триггеров.
0
21
7 лет назад
Отредактирован scopterectus
0
quq_CCCP, можно ссылочку на этот скиллНъ??
ps нашел
ps2: зачем при спавне крипов что то им добавлять, если та библиотека делает тоже самое?
0
32
7 лет назад
0
У тебя код добавляет всех подряд, темболее нафиг тебе отдельный триггер и добавление всех юнитов на карте?
Событие юнит получает урон - нужно только крипам, когда ты их создаешь, добавляешь и событие на каждого созданного юнита, это быстрее и не требует отдельного триггера + не будет проблем с повторным событием и не будет юнитов которым эти события ненужны.
Ты же хотел чтобы без утечек и максимально быстро?
0
21
7 лет назад
0
quq_CCCP, а, кажется я понял, что ты хотел донести.
0
20
7 лет назад
0
разве что отключением\удалением самого триггера
Чтобы оставить комментарий, пожалуйста, войдите на сайт.