Мне требуется пассивная способность, которая увеличивает скорость атаки с каждым ударом по одному противнику, скорость сбрасывается при смене цели. Как мне сообщили, аналогичная способность Рвение (Fervor) у Тролля из DotA. Попробовал найти в карте OpenDotA на сайте её наработку, но этой способности там нет, да и многого другого тоже. Может у кого есть открытая DotA с этой наработкой, либо представляет хорошо, как сделать?

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

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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
2
48
7 лет назад
2
quq_CCCP:
molot39, уже не первый раз такое слышу, но не дале, баги, работает ваще не так как описано в примере и так далее...
Хочешь похвастаться - код в студию
Думаю это не к месту, скоро будет новая версия робот сити, там будет реализация.
0
26
7 лет назад
Отредактирован 8gabriel8
0
quq_CCCP, а мне другую реализацию скинули:
function Trig_Fervor_Conditions takes nothing returns boolean
    return GetUnitAbilityLevel(GetAttacker(),'A06C') > 0 and not IsUnitType(GetTriggerUnit(),UNIT_TYPE_STRUCTURE)
endfunction

function Trig_Fervor_Tick takes nothing returns nothing
    local unit u
    local unit targ
    local trigger t = GetTriggeringTrigger()
    local hashtable gc = udg_HashCache
    local integer s = GetHandleId(t)
    local integer lvl = GetUnitAbilityLevel(u,'A06C')
    local integer c = 0

    if GetTriggerEventId() == EVENT_UNIT_DAMAGED then
        set u = LoadUnitHandle(gc,s,1)

        if GetEventDamageSource() == u then
            set targ = GetTriggerUnit()
            set c = GetUnitAbilityLevel(u,'A08T')

            if targ != LoadUnitHandle(gc,GetHandleId(u),StringHash("trollfervor")) then
                set c = R2I(c/2)
                call SaveUnitHandle(gc,GetHandleId(u),StringHash("trollfervor"),targ)
            else
                set c = c+1
                if c > lvl+1 then
                    set c = lvl+1
                endif
            endif
            call SetUnitAbilityLevel(u,'A08T',c)
            set targ = null
        endif
        set u = null
    endif
    call TriggerRemoveAction(t,LoadTriggerActionHandle(gc,s,2))
    call FlushChildHashtable(gc,s)
    call KillTrigger(t)
    set t = null
    set gc = null
endfunction

function Trig_Fervor takes nothing returns nothing
    local unit u = GetAttacker()
    local unit targ = GetTriggerUnit()
    local trigger t = CreateTrigger()
    local integer s = GetHandleId(t)
    local hashtable gc = udg_HashCache
    local triggeraction ta
    if GetUnitAbilityLevel(u,'A08T') == 0 then
        call UnitAddAbility(u,'A08T')
    endif
    call SaveUnitHandle(gc,s,1,u)
    call TriggerRegisterUnitEvent(t,targ,EVENT_UNIT_DAMAGED)
    call TriggerRegisterUnitEvent(t,u,EVENT_UNIT_ISSUED_ORDER)
    call TriggerRegisterUnitEvent(t,u,EVENT_UNIT_ISSUED_POINT_ORDER)
    call TriggerRegisterUnitEvent(t,u,EVENT_UNIT_ISSUED_TARGET_ORDER)
    call TriggerRegisterTimerEvent(t,2.5,false)
    set ta = TriggerAddAction(t,function Trig_Fervor_Tick)
    call SaveTriggerActionHandle(gc,s,2,ta)
    set u = null
    set targ = null
    set t = null
    set gc = null
    set ta = null
endfunction

function InitTrig_Fervor takes nothing returns nothing
    set gg_trg_Fervor = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Fervor, EVENT_PLAYER_UNIT_ATTACKED )
    call TriggerAddCondition( gg_trg_Fervor, Condition( function Trig_Fervor_Conditions ) )
    call TriggerAddAction( gg_trg_Fervor, function Trig_Fervor)
endfunction
И в инициализации создаётся хеш-таблица udg_HashCache.
0
48
7 лет назад
0
8gabriel8:
quq_CCCP, а мне другую реализацию скинули:
function Trig_Fervor_Conditions takes nothing returns boolean
    return GetUnitAbilityLevel(GetAttacker(),'A06C') > 0 and not IsUnitType(GetTriggerUnit(),UNIT_TYPE_STRUCTURE)
endfunction

function Trig_Fervor_Tick takes nothing returns nothing
    local unit u
    local unit targ
    local trigger t = GetTriggeringTrigger()
    local hashtable gc = udg_HashCache
    local integer s = GetHandleId(t)
    local integer lvl = GetUnitAbilityLevel(u,'A06C')
    local integer c = 0

    if GetTriggerEventId() == EVENT_UNIT_DAMAGED then
        set u = LoadUnitHandle(gc,s,1)

        if GetEventDamageSource() == u then
            set targ = GetTriggerUnit()
            set c = GetUnitAbilityLevel(u,'A08T')

            if targ != LoadUnitHandle(gc,GetHandleId(u),StringHash("trollfervor")) then
                set c = R2I(c/2)
                call SaveUnitHandle(gc,GetHandleId(u),StringHash("trollfervor"),targ)
            else
                set c = c+1
                if c > lvl+1 then
                    set c = lvl+1
                endif
            endif
            call SetUnitAbilityLevel(u,'A08T',c)
            set targ = null
        endif
        set u = null
    endif
    call TriggerRemoveAction(t,LoadTriggerActionHandle(gc,s,2))
    call FlushChildHashtable(gc,s)
    call KillTrigger(t)
    set t = null
    set gc = null
endfunction

function Trig_Fervor takes nothing returns nothing
    local unit u = GetAttacker()
    local unit targ = GetTriggerUnit()
    local trigger t = CreateTrigger()
    local integer s = GetHandleId(t)
    local hashtable gc = udg_HashCache
    local triggeraction ta
    if GetUnitAbilityLevel(u,'A08T') == 0 then
        call UnitAddAbility(u,'A08T')
    endif
    call SaveUnitHandle(gc,s,1,u)
    call TriggerRegisterUnitEvent(t,targ,EVENT_UNIT_DAMAGED)
    call TriggerRegisterUnitEvent(t,u,EVENT_UNIT_ISSUED_ORDER)
    call TriggerRegisterUnitEvent(t,u,EVENT_UNIT_ISSUED_POINT_ORDER)
    call TriggerRegisterUnitEvent(t,u,EVENT_UNIT_ISSUED_TARGET_ORDER)
    call TriggerRegisterTimerEvent(t,2.5,false)
    set ta = TriggerAddAction(t,function Trig_Fervor_Tick)
    call SaveTriggerActionHandle(gc,s,2,ta)
    set u = null
    set targ = null
    set t = null
    set gc = null
    set ta = null
endfunction

function InitTrig_Fervor takes nothing returns nothing
    set gg_trg_Fervor = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Fervor, EVENT_PLAYER_UNIT_ATTACKED )
    call TriggerAddCondition( gg_trg_Fervor, Condition( function Trig_Fervor_Conditions ) )
    call TriggerAddAction( gg_trg_Fervor, function Trig_Fervor)
endfunction
И в инициализации создаётся хеш-таблица udg_HashCache.
И что совсем ни как без хеша?
0
26
7 лет назад
0
molot39, я не знаю, я почти не разбираюсь в JASS и хеш-таблицах. Покажи свою наработку
0
48
7 лет назад
0
могу даже болванку скинуть, только малек доработаю болванку. В самом проекте исправил, а в болванке нет=)
0
26
7 лет назад
0
Давай, только поскорее. Эта пассивка, наверное, самое маленькое из того, что потребуется сделать, а уже около недели с ней не могу справиться.
2
13
7 лет назад
2
molot39, Продебаж код на количество стаков... к примеру с "огненым плащем" огруженным несколькими юнитами
0
48
7 лет назад
0
Borodach:
molot39, Продебаж код на количество стаков... к примеру с "огненым плащем" огруженным несколькими юнитами
чё?
не отвлекайте, я восстанавливаю болванку с нуля, удалил старую
0
26
7 лет назад
0
Он имеет ввиду, чтобы ты проверил способность вместе с предметом Огненный плащ или способностью Жар преисподней, не будет ли это считаться атакой юнита, как будет работать, когда много юнитов к тебе подбегает, ведь часть из них как бы будет атакована не в первый раз, а часть в первый одновременно, если эффект будет считаться атакой, естественно.
0
48
7 лет назад
0
8gabriel8:
Он имеет ввиду, чтобы ты проверил способность вместе с предметом Огненный плащ или способностью Жар преисподней, не будет ли это считаться атакой юнита, как будет работать, когда много юнитов к тебе подбегает, ведь часть из них как бы будет атакована не в первый раз, а часть в первый одновременно, если эффект будет считаться атакой, естественно.
а... понял
0
11
7 лет назад
0
Изменить скорость атаки сложно. Удобнее с каждым ударом повышать урон. Сделать триггер. По идее, если у тебя герой, он должен быть записан в глобал. Событие, герой, типа тролль атакует юнита. Записываем атакованного юнита в переменную. Если атакованный юнит уже есть в переменной триггерно наносим ему урон. С каждой атакой повышаем процент, который мы тоже создали качестве переменной. Если атакованный юнит не равно переменной ранее атакованной боевой единице, то обнуляем переменные и начинаем все сначала.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.