По каким-то необъяснимым для меня причинам триггер на срабатывание урона проходит лишь в том случае, если применивший не сдвигается с места пока не долетит каст, то есть пока не пройдёт действие Wait в начале триггера. Если убрать Wait, то всё работает.
Ещё заметил такую особенность, что с Wait больше 3 сек урон также не наносится, даже если применивший вообще не будет сдвигаться с места.
Что эт за галиматья?

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

Yonsen, вейт это баганая херня которая не должна юзаться в подобных случаях
кроме того не забывай что враг может отбежать и тогда урон будет нанесён раньше чем долетит снаряд
данный спелл можно сделать 2 способами
  1. юзаем систему снарядов и канал (необходим школьный курс геометрии и статьи про движение)
  2. через отлов урона и даммик (герой кастует канал на врага - создаётся дамми юнит - дамми юнит кастует спелл на врага; срабатывает событие юнит получил урон, условие: тип юнита (источник урона) равен типу дамми юнита, действие: удаляем юнита источник урона и проверяем баффы, наносим доп урон и т.д. )
quq_CCCP, не самая лучшая реализация (куча триггеров и прочее)

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
1
27
7 лет назад
Отредактирован MpW
1
Подожди. Выводи на экран на сколько времени ты поставил. Может в расчетах получилось, что 1000000 сек.
Пишут, что не всегда хорошо использовать вэйты.
И почему это, если кастер двигается, урон не получается?!! такого не должно быть. на основе чего сделал?
на скрине это разве триггер на срабатывание урона?
И еще локалки придется использовать. возможно за это время, пока поток поставлен на паузу. Я успею 10 раз применить черную стрелу. К чему веду, к тому что глобалки будут перезаписаны 10 раз
1
32
7 лет назад
1
Yonsen, Ну кто так делает? Выкини свой триггер в утиль... Какой вейт, это никогда не будет работать!
При касте создавай событие для отдельного триггера, где проверяй что цель получила урон от того кто кастанул стрелу и имеет бафф способности этой стреллы, если все сходится удаляй бафф и наноси урон.
Чтобы не добавлять по 100 событий на одного юнита заноси его в группу - уже попавшиеся, так же ставь метку на юнита на котором уже есть событие с помощью хеш таблицы или custo, value что на них пока срабатывать триггерну ненужно.
Могу скинуть пример как делается по нормальному детект автокастов и снарядов дефолтных способностей.
0
3
7 лет назад
0
Steal nerves:
Подожди. Выводи на экран на сколько времени ты поставил. Может в расчетах получилось, что 1000000 сек.
Пишут, что не всегда хорошо использовать вэйты.
И почему это, если кастер двигается, урон не получается?!! такого не должно быть. на основе чего сделал?
на скрине это разве триггер на срабатывание урона?
И еще локалки придется использовать. возможно за это время, пока поток поставлен на паузу. Я успею 10 раз применить черную стрелу. К чему веду, к тому что глобалки будут перезаписаны 10 раз
Сделано на основе пивчанского брюмастера. У меня такое подозрение, что спелл банально не докастовывается, типо я его прерываю.
quq_CCCP:
Yonsen, Ну кто так делает? Выкини свой триггер в утиль... Какой вейт, это никогда не будет работать!
При касте создавай событие для отдельного триггера, где проверяй что цель получила урон от того кто кастанул стрелу и имеет бафф способности этой стреллы, если все сходится удаляй бафф и наноси урон.
Чтобы не добавлять по 100 событий на одного юнита заноси его в группу - уже попавшиеся, так же ставь метку на юнита на котором уже есть событие с помощью хеш таблицы или custo, value что на них пока срабатывать триггерну ненужно.
Могу скинуть пример как делается по нормальному детект автокастов и снарядов дефолтных способностей.
Делаю как умею:D
Из твоих слов я не знаю как проверить, что юнит получил урон от КОНКРЕТНОГО юнита. А вообще лучше скинь пример, только картой, не скрином. Заранее благодарствую
0
27
7 лет назад
Отредактирован MpW
0
Yonsen, ты хочешь сделать стрелы или это такая активная способность? Если хочешь пустышку юзать. то лучше канала нет
0
3
7 лет назад
0
Это активная способность. Суть вот какая: 1 сек кастуется спелл, вылетает какая-нибудь байда и при соприкосновении с вражеским юнитом наносится урон в зависимости от того сколько на нём дот
Steal nerves:
Yonsen, ты хочешь сделать стрелы или это такая активная способность? Если хочешь пустышку юзать. то лучше канала нет
В канале нельзя настроить, что бы от кастера вылетала какая-нибудь фигня
0
20
7 лет назад
0
Yonsen:
можно триггерный снаряд сделать
0
26
7 лет назад
0
Кислотную бомбу за основу и лови получение урона с её баффом
бафф снимаешь, наносишь урон какой надо... всё
источник урона - это твой герой
юнит-инициатор - это цель
остальное по шаблону
0
32
7 лет назад
0
   struct DMD
        trigger trg
        triggercondition trc
        triggeraction tra
        triggeraction extra
        unit cast
        unit targ
        unit ex
        integer id
        timer trix
        boolean del
            
        method FlushData takes nothing returns nothing
            call DisableTrigger( .trg )
            call TriggerRemoveCondition( .trg, .trc )
            call TriggerRemoveAction( .trg, .tra )
            call TriggerRemoveAction( .trg, .extra )
            call TriggerClearActions( .trg )
            call TriggerClearConditions( .trg )
            call RemoveDataBX( .trg )
            call RemoveDataBX( .trix )
            call DestroyTrigger( .trg )
            call DestroyTimer( .trix )

            set this.trg = null
            set this.trc = null
            set this.tra = null
            set this.extra = null
            set this.cast = null
            set this.targ = null
            set this.ex = null
            set this.trix = null
            set this.id = 0
            set this.del = false
        endmethod
    endstruct

    function IsTargetHasBuff takes nothing returns boolean
        local DMD st = GetDataBX( GetTriggeringTrigger( ) )
        set bj_lastEventId = GetTriggerEventId( )
        
        if bj_lastEventId == EVENT_WIDGET_DEATH then
            call TriggerRemoveAction( st.trg, st.tra )
            return true
        endif
        
        if bj_lastEventId == EVENT_UNIT_DAMAGED then
            if  GetEventDamageSource( ) == DummyAttacker then
                return false
            elseif GetEventDamage( ) == 0.00 and GetEventDamageSource( ) == st.cast  and GetUnitAbilityLevel( st.targ, 'BNss' ) > 0  then
                call TriggerRemoveAction( st.trg, st.tra )
                return true
            endif
        endif
    
        return GetEventDamage( ) == 0.00 and GetUnitAbilityLevel( st.targ, st.id ) > 0 and GetEventDamageSource( ) == st.cast 
    endfunction

    function Destroy_DMD takes nothing returns nothing
        local DMD st = GetDataBX( GetExpiredTimer( ) )
        call st.FlushData( )
        call st.destroy( )
    endfunction
    
    function RemoveDMDBuff takes nothing returns nothing
        local DMD st = GetDataBX( GetTriggeringTrigger( ) )
        if st.del then
            call UnitRemoveAbility( st.targ, st.id )
        endif
        call PauseTimer( st.trix )
        call DisableTrigger( st.trg )
        call TimerStart( st.trix, 10.00, false, function Destroy_DMD )
        return
    endfunction
    
    function DummyMissile takes unit target, unit caster, integer buffid, real time, boolean del, code actions returns nothing
        local DMD st = DMD.create( )
        set st.cast = caster
        set st.targ = target
        set st.id = buffid
        set st.del = del
        set st.trix = CreateTimer( )
        set st.trg = CreateTrigger( )
        set st.trc = TriggerAddCondition( st.trg, Condition( function IsTargetHasBuff ) )
        set st.tra = TriggerAddAction( st.trg, actions )
        set st.extra = TriggerAddAction( st.trg, function RemoveDMDBuff )
        call TriggerRegisterUnitEvent( st.trg, target, EVENT_UNIT_DAMAGED )
        //call TriggerRegisterUnitEvent( st.trg, target, EVENT_UNIT_SPELL_EFFECT)
        call TriggerRegisterDeathEvent( st.trg, target )
        call TimerStart( st.trix, time, false, function Destroy_DMD )
        call SetDataBX( st.trg, st )
        call SetDataBX( st.trix, st )
    endfunction
    
0
28
7 лет назад
Отредактирован nvc123
0
Yonsen, вейт это баганая херня которая не должна юзаться в подобных случаях
кроме того не забывай что враг может отбежать и тогда урон будет нанесён раньше чем долетит снаряд
данный спелл можно сделать 2 способами
  1. юзаем систему снарядов и канал (необходим школьный курс геометрии и статьи про движение)
  2. через отлов урона и даммик (герой кастует канал на врага - создаётся дамми юнит - дамми юнит кастует спелл на врага; срабатывает событие юнит получил урон, условие: тип юнита (источник урона) равен типу дамми юнита, действие: удаляем юнита источник урона и проверяем баффы, наносим доп урон и т.д. )
quq_CCCP, не самая лучшая реализация (куча триггеров и прочее)
Принятый ответ
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.