Добавлен
Есть триггер на отлов урона для всех юнитов на карте с событием EVENT_UNIT_DAMAGED, который должен отлавливать урон от автоатак. Урон от кастом способностей нужно пускать в обход триггера.
У меня есть несколько вариантов:
  1. выключать триггер - наносить урон - включать
  2. устанавливать переменную (ignore=true) - наносить урон - отлавливать переменную в триггере
  3. сохранять данные по урону в массив/хэш - наносить урон - в триггере искать урон.
Самым адекватным кажется первый вариант.
Несколько вопросов:
  1. как лучше реализовать ?
  2. какое временное окно между нанесением урона и его отловом в тригере ?
  3. Может ли в момент отключения триггера проскочить левый урон?
  4. Нормально ли часто включать/выключать триггер (возможно до 20 раз в сек) с большим количеством событий?

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

Кастовать способности даммиком и отлавливать урон от него.
0
19
7 лет назад
0
Похожие вопросы:

ответ
Эмм что за ерунда, сократил код, убрав всё лишнее, но утечки все равно остаются, по 1.5 - 2 хэндла за каждое нанесение урона (тип хэндла не знаю как посмотреть). Когда триггер отключаешь, то всё нормально.
Сокращенный код
function SDMSCreateTextTag takes nothing returns nothing
    local unit u=GetTriggerUnit()
    local unit s=GetEventDamageSource()
    local integer i=GetConvertedPlayerId(GetOwningPlayer(u))
    local texttag tt=CreateTextTag()
    local real dmg=GetEventDamage()

    if ( dmg > 1.00 ) and ( dmg < 9999.00 ) then
        if GetPlayerId(GetOwningPlayer(u))==12 then
            call SetTextTagText(tt, "|cff9db9eb-"+I2S(R2I(dmg))+"|r", 0.023)
        else
            call SetTextTagText(tt, "|cffffa500-"+I2S(R2I(dmg))+"|r", 0.023)
        endif
        call SetTextTagPosUnit(tt, u, 0)
        call SetTextTagColor(tt, 255, 255, 255, 255) 
        call SetTextTagVelocity(tt, 0.05325*Cos(90 * bj_DEGTORAD), 0.05325*Sin(90 * bj_DEGTORAD))
        call SetTextTagPermanent(tt, false)
        call SetTextTagLifespan(tt, 1.0)
        call SetTextTagFadepoint(tt, 0.0)
    endif
    call PolledWait(2.0)

    call DestroyTextTag(tt)
    set u=null
    set s=null
    set i=0
    set dmg=0
    set tt=null
endfunction

function SDMSTriggerRegisterUnitDamaged takes nothing returns nothing
    call TriggerRegisterUnitEvent(udg_SDMStrigger,GetEnteringUnit(),EVENT_UNIT_DAMAGED)
endfunction

function theSDMSTriggerActions takes nothing returns nothing
    local trigger UnitEnter=CreateTrigger()

    call TriggerRegisterEnterRectSimple(UnitEnter, gg_rct_Arena)
    call TriggerAddAction(UnitEnter,function SDMSTriggerRegisterUnitDamaged)

    set UnitEnter=null
endfunction

function InitTrig_the_SDMS_Trigger takes nothing returns nothing
    local trigger tr=CreateTrigger()

    set udg_SDMStrigger=CreateTrigger()//Тут также меняется название глобальной переменной типа триггер.
    call TriggerAddAction(udg_SDMStrigger,function SDMSCreateTextTag)
    call TriggerRegisterTimerEventSingle(tr,0.0)
    call TriggerAddAction(tr,function theSDMSTriggerActions)

    set tr=null
endfunction
Wait вызывает утечки ((
Пришлось делать через таймер
ответ
там есть куча статей на эту тему + пример на гуи от меня любимого
ответ
ОП, спелы все триггерные?

Если да, то заводишь глобальную переменную bool IsSpell = false, перед нанесением урона в коде даёшь ей true, после - обратно false. В триггере, который срабатывает на получение урона, первым действием ставишь локалку булёвую, которая ==IsSpell. Вуаля, ты отслеживаешь весь урон с абилок, а что не урон с абилок, то есть урон с руки.

Сам так всегда делал, никогда не понимал пляски с бубнами и прочими орбами. Оно, конечно, проще идеологически, но по факту намного геморройнее: добавлять орб, проверять орб, удалять орб, подменять реальный орб триггерно...

Кстати, можно по такой же схеме через логические переменные указывать тип урона, например, чистый, физический (почему бы и не давать с абилок физический урон?) или магический, от этого вообще что угодно можно пилить, хоть кучу видов брони, хоть цветовые индикаторы разного типа урона.
ответ
У тебя событие в триггере неверное. Ты указал, что юнит атакован, а необходимо событие, что юнит получает урон.
ответ
Я использую следующий костыль: урон от заклинаний наносится только от лица дамика, который имеет соответствующую способность для проверки. Пассивку, например с названием "Урон - огонь". Тем самым, можно отследить тип полученного урона.

0
21
7 лет назад
0
Кастовать способности даммиком и отлавливать урон от него.
Принятый ответ
0
6
7 лет назад
0
Надо лучше искать, спасибо боту
1
27
7 лет назад
Отредактирован MpW
1
Разницы нет. Урон проходит, и триггер тут же моментально ловит. Например, триггерно наносишь урон, то тут же срабатывает событие.
выключать триггер - наносить урон - включать это нужно делать в триггере, который наносит самому себе урон. чтобы не было критической ошибки. Или фильтруем: способы 2.3.
Пример 2 (ignore=true) очень хорошо работает, от такого способа можно узнать, что заклинанием нанес а не от руки (или узнать каким skill-ом нанес ущерб). Это если все способности на триггерах будет сделано.
Не все способности могут наносить урон сразу, пример буран (если ледяной булыжник ударит по башке герою, то будет урон, а так герою может повезти и он избежит этого). Это длительный каст скилла, пока булыжники падают вниз, затем летят еще. И так далее.
Если урон наносит даймик, то опыт при убийстве герой может не получать. На героя не будет агриться противник и прочее.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.