Хочу сделать ультимейт по типу высасывания жизни, но при этом врага кидало в сон. Ну вы поняли совместить две способности в одну. Расспишите подробно в триггерах как создать: Событие, Условие и Действие.

А в чем проблема, т.к сон сбивается при уроне, то стандартные способности не подойдут, берешь обычное высасывание жизни, и создаешь триггер событием которого будет - юнит приводит способность в действие, условие - примененная способность == твоё сосание жизни, ну и действие:
Применяем на жертву PauseUnit, вручаем жертве способность на основе кольца защиты с нулевым бонусом и прекрепленным эффектом сна, далее создаем новый триггер, с событиями - юнит получает урон, юнит умирает, время вышло, кастер отдел приказ, цель точка, цель обьект, без указания цели. Ну и добавляем триггеру новое условие, в котором будем делать действия. Сохраняем в хештаблицу юнита цель и нашего кастера. Выгружаем в условии вновь созданного нами триггера, проверяем от чего сработал триггер, если триггер сработал от смерти, или урона, или от приказа не равного - приказу похищения жизни, триггер отключаем, у юнита удаляем паузу и абилку пустышку для визуального эффекта. Если цель получила урон не от кастера, и урон выше 0 - то паузим кастера и тут же сбиваем паузу, попутно так же выключая триггер и снимая с жертвы паузу и спецэффект. Ну и не забываем обнулять все локальные переменные и удалять триггер в конце.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
28
quq_CCCP, разве юнитов в паузе можно продамажить и вообще как-либо с ними взаимодействовать? + вроде таймеры баффов/дебаффов тоже паузятся вместе с юнитом. Если пауза на это не влияет, то зачем я морфил юнитов, станил их, отбирал абилку атаки ._.
32
rsfghd, конечно можно, то что баффы паузятся - ну кроме мемхака особо ниче не сделать. Тут увы, нужно это учитывать.
1
quq_CCCP:
А в чем проблема, т.к сон сбивается при уроне, то стандартные способности не подойдут, берешь обычное высасывание жизни, и создаешь триггер событием которого будет - юнит приводит способность в действие, условие - примененная способность == твоё сосание жизни, ну и действие:
Применяем на жертву PauseUnit, вручаем жертве способность на основе кольца защиты с нулевым бонусом и прекрепленным эффектом сна, далее создаем новый триггер, с событиями - юнит получает урон, юнит умирает, время вышло, кастер отдел приказ, цель точка, цель обьект, без указания цели. Ну и добавляем триггеру новое условие, в котором будем делать действия. Сохраняем в хештаблицу юнита цель и нашего кастера. Выгружаем в условии вновь созданного нами триггера, проверяем от чего сработал триггер, если триггер сработал от смерти, или урона, или от приказа не равного - приказу похищения жизни, триггер отключаем, у юнита удаляем паузу и абилку пустышку для визуального эффекта. Если цель получила урон не от кастера, и урон выше 0 - то паузим кастера и тут же сбиваем паузу, попутно так же выключая триггер и снимая с жертвы паузу и спецэффект. Ну и не забываем обнулять все локальные переменные и удалять триггер в конце.
Тоесть таким образом союзный вражеский юнит не собьёт ульт?
32
ну почему, собьет, только он ударит - или нанесет урон спеллом, жертва проснется и высасывание прекратится, реализовать конечно можно и иначе.
1
quq_CCCP:
ну почему, собьет, только он ударит - или нанесет урон спеллом, жертва проснется и высасывание прекратится, реализовать конечно можно и иначе.
Ну quq_CCCP:
ну почему, собьет, только он ударит - или нанесет урон спеллом, жертва проснется и высасывание прекратится, реализовать конечно можно и иначе.
Ну ударит и собьется ульт, как это сделать, чтоб не сбивался?

Anariys3333:
quq_CCCP:
А в чем проблема, т.к сон сбивается при уроне, то стандартные способности не подойдут, берешь обычное высасывание жизни, и создаешь триггер событием которого будет - юнит приводит способность в действие, условие - примененная способность == твоё сосание жизни, ну и действие:
Применяем на жертву PauseUnit, вручаем жертве способность на основе кольца защиты с нулевым бонусом и прекрепленным эффектом сна, далее создаем новый триггер, с событиями - юнит получает урон, юнит умирает, время вышло, кастер отдел приказ, цель точка, цель обьект, без указания цели. Ну и добавляем триггеру новое условие, в котором будем делать действия. Сохраняем в хештаблицу юнита цель и нашего кастера. Выгружаем в условии вновь созданного нами триггера, проверяем от чего сработал триггер, если триггер сработал от смерти, или урона, или от приказа не равного - приказу похищения жизни, триггер отключаем, у юнита удаляем паузу и абилку пустышку для визуального эффекта. Если цель получила урон не от кастера, и урон выше 0 - то паузим кастера и тут же сбиваем паузу, попутно так же выключая триггер и снимая с жертвы паузу и спецэффект. Ну и не забываем обнулять все локальные переменные и удалять триггер в конце.
Тоесть таким образом союзный вражеский юнит не собьёт ульт?
Ну и добавляем триггеру новое условие, в котором будем делать действия: какое условие ставить? И хэш-таблица как сохраняется?
1
quq_CCCP:
Ну мб пример кода сделать?
quq_CCCP:
Ну мб пример кода сделать?
Сейчас
32
Ну вот пример на jass:
код
function Trig_Surge_Expires_Conditions takes nothing returns boolean
    local trigger trg = GetTriggeringTrigger()
    local integer id = GetHandleId(trg)
    local unit targ = LoadUnitHandle( HashData, id, 0 )
    call DisableTrigger(trg)
    
    call UnitRemoveAbility( targ, 'A0C9' )
    call UnitRemoveAbility( targ, 'B07W' )
    
    call RemoveSavedHandle( HashData, ExSurge, GetHandleId(targ))
    call FlushChildHashtable( HashData, id )
    call S0I(trg)
    set trg = LoadTriggerHandle( HashData, ExPhaseKey, GetHandleId(targ) )
    if trg == null then
        //call SetUnitPathing( targ, true )
    endif
    
    set targ = null
    set trg = null
    return false
endfunction

function Trig_Surge_Actions takes nothing returns nothing
    local unit targ = GetSpellTargetUnit( )
    local real dur = RMaxBJ( 1.50 * GetUnitAbilityLevel( GetSpellAbilityUnit(),'A0R7' ) + 1.50, 3.01 )
    local trigger trg  = LoadTriggerHandle( HashData, ExSurge, GetHandleId(targ) )
    local integer id 
    
    if trg != null then
        call TriggerEvaluate(trg)
    endif
    set trg = LoadTriggerHandle( HashData, ExPhaseKey, GetHandleId(targ) )
    if trg != null then
        call TriggerEvaluate(trg)
    endif
    
    set trg = CreateTrigger()
    set id = GetHandleId(trg)
    call SaveTriggerHandle( HashData,ExSurge, GetHandleId(targ), trg )
    call SaveUnitHandle( HashData, id, 0, targ )
    
    call TriggerAddCondition( trg, Condition(function Trig_Surge_Expires_Conditions ) )
    call TriggerRegisterDeathEvent( trg, targ )
    call TriggerRegisterTimerEvent( trg, dur, false )
    call UnitAddAbility( targ, 'A0C9' )
    call UnitMakeAbilityPermanent( targ, true, 'A0C9' ) 
    call SetUnitAbilityLevel( targ, 'A0C9', GetUnitAbilityLevel( GetSpellAbilityUnit(),'A0R7' ) )
    call AuraUpdateEffect( targ, 'A0R7' )
    call IO1(UD,GetUnitX(targ),GetUnitY(targ))
    call DestroyEffect(AddSpecialEffectTarget("effects\\Surge.mdx",targ,"origin"))
    
    if not IsUnitType( targ,UNIT_TYPE_FLYING)then
         //call SetUnitPhased(targ)
    endif
    
    set targ = null
    set trg = null
endfunction

function  Trig_Surge_Conditions takes nothing  returns boolean
     if GetSpellAbilityId() == 'A0R7' then
        call Trig_Surge_Actions()
     endif
    return false
endfunction

function Register_Surge takes nothing returns nothing
    local trigger trg = CreateTrigger( )
    local integer nIndex = 1
    call TriggerAddCondition( trg, Condition( function Trig_Surge_Conditions ) )
    loop
        exitwhen nIndex > 11
    
        if IsSlotPlayer( Player( nIndex ) ) then
            call TriggerRegisterPlayerUnitEvent( trg, Player( nIndex ), EVENT_PLAYER_UNIT_SPELL_EFFECT, OnlyHero )
        endif
        set nIndex = nIndex + 1
    endloop
    
    set trg = null
endfunction
Это код способности surge, из доты, когда то давно делал. Ну собственно тут довольно примитивный код и как раз пример как нужно следить за юнитом, тут реализован и диспел и перебивание баффа при повторном применении, это не намного сложнее кастомного сна, который я описал выше.
Просто добавляем в кондишене второго триггера услвоие с GetTriggerEventId() == ну и событие, к примеру EVENT_WIDGET_DEATH чтобы снимать эффект при смерти, уроне выше 0 не от кастера или от истечении времени.
1
quq_CCCP:
Ну вот пример на jass:
код
function Trig_Surge_Expires_Conditions takes nothing returns boolean
    local trigger trg = GetTriggeringTrigger()
    local integer id = GetHandleId(trg)
    local unit targ = LoadUnitHandle( HashData, id, 0 )
    call DisableTrigger(trg)
    
    call UnitRemoveAbility( targ, 'A0C9' )
    call UnitRemoveAbility( targ, 'B07W' )
    
    call RemoveSavedHandle( HashData, ExSurge, GetHandleId(targ))
    call FlushChildHashtable( HashData, id )
    call S0I(trg)
    set trg = LoadTriggerHandle( HashData, ExPhaseKey, GetHandleId(targ) )
    if trg == null then
        //call SetUnitPathing( targ, true )
    endif
    
    set targ = null
    set trg = null
    return false
endfunction

function Trig_Surge_Actions takes nothing returns nothing
    local unit targ = GetSpellTargetUnit( )
    local real dur = RMaxBJ( 1.50 * GetUnitAbilityLevel( GetSpellAbilityUnit(),'A0R7' ) + 1.50, 3.01 )
    local trigger trg  = LoadTriggerHandle( HashData, ExSurge, GetHandleId(targ) )
    local integer id 
    
    if trg != null then
        call TriggerEvaluate(trg)
    endif
    set trg = LoadTriggerHandle( HashData, ExPhaseKey, GetHandleId(targ) )
    if trg != null then
        call TriggerEvaluate(trg)
    endif
    
    set trg = CreateTrigger()
    set id = GetHandleId(trg)
    call SaveTriggerHandle( HashData,ExSurge, GetHandleId(targ), trg )
    call SaveUnitHandle( HashData, id, 0, targ )
    
    call TriggerAddCondition( trg, Condition(function Trig_Surge_Expires_Conditions ) )
    call TriggerRegisterDeathEvent( trg, targ )
    call TriggerRegisterTimerEvent( trg, dur, false )
    call UnitAddAbility( targ, 'A0C9' )
    call UnitMakeAbilityPermanent( targ, true, 'A0C9' ) 
    call SetUnitAbilityLevel( targ, 'A0C9', GetUnitAbilityLevel( GetSpellAbilityUnit(),'A0R7' ) )
    call AuraUpdateEffect( targ, 'A0R7' )
    call IO1(UD,GetUnitX(targ),GetUnitY(targ))
    call DestroyEffect(AddSpecialEffectTarget("effects\\Surge.mdx",targ,"origin"))
    
    if not IsUnitType( targ,UNIT_TYPE_FLYING)then
         //call SetUnitPhased(targ)
    endif
    
    set targ = null
    set trg = null
endfunction

function  Trig_Surge_Conditions takes nothing  returns boolean
     if GetSpellAbilityId() == 'A0R7' then
        call Trig_Surge_Actions()
     endif
    return false
endfunction

function Register_Surge takes nothing returns nothing
    local trigger trg = CreateTrigger( )
    local integer nIndex = 1
    call TriggerAddCondition( trg, Condition( function Trig_Surge_Conditions ) )
    loop
        exitwhen nIndex > 11
    
        if IsSlotPlayer( Player( nIndex ) ) then
            call TriggerRegisterPlayerUnitEvent( trg, Player( nIndex ), EVENT_PLAYER_UNIT_SPELL_EFFECT, OnlyHero )
        endif
        set nIndex = nIndex + 1
    endloop
    
    set trg = null
endfunction
Это код способности surge, из доты, когда то давно делал. Ну собственно тут довольно примитивный код и как раз пример как нужно следить за юнитом, тут реализован и диспел и перебивание баффа при повторном применении, это не намного сложнее кастомного сна, который я описал выше.
Просто добавляем в кондишене второго триггера услвоие с GetTriggerEventId() == ну и событие, к примеру EVENT_WIDGET_DEATH чтобы снимать эффект при смерти, уроне выше 0 не от кастера или от истечении времени.
А можешь скрин прислать как создать способность,ибо по описанию не совсем понятны некоторые детали(
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.