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

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

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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
32
7 лет назад
0
8gabriel8, ты знаешь ГУИ меньше всего подходит для создание нестандартных способностей героя, а больше всего подходит под создание карт кампаний и роликов.
// OpenDota 6.41 deprotected by NETRAT and DioD
// inspired by everyone who posted on forum threads and feedback page
// based on OpenDota 6.32b, deprotected by DimonT, NETRAT and TheBloodiest
// http://dimon.xgm.ru/opendota/
// Visit our modmaking community at http://xgm.ru/

// Objects used:
// 'A0O0' = Beast Rage (Beastmaster : Rexxar)
// 'A0NZ' = Beast Rage

// DEBUG Trigger Number : 12
function SafeAddSpell takes unit pEU,integer pfV,integer pfw returns nothing
	if GetUnitAbilityLevel(pEU,pfV)==0 then
		call UnitAddAbility(pEU,pfV)
	endif
	call SetUnitAbilityLevel(pEU,pfV,pfw)
endfunction

function BeastRageMain takes nothing returns nothing
	local unit lKg=GetAttacker()
	local unit lFB=GetTriggerUnit()
	local string lf5=H2Tx(lKg)
	local unit lMd=GetUnit(lf5,"BeastRage|PreviousTarget")
	local integer lMa=ReturnMax(GetInteger(lf5,"BeastRage|Counter"),0)
	local integer lmZ=GetUnitAbilityLevel(lKg,'A0O0')
	if lMd!=lFB then
		set lMa=lMa/2
	else
		set lMa=ReturnMin(lMa+1,21)
	endif
	call SafeAddSpell(lKg,'A0NZ',lMa*lmZ)
	call SetInteger(lf5,"BeastRage|Counter",lMa)
	call SetHandle(lf5,"BeastRage|PreviousTarget",lFB)
	call SetBoolean(lf5,"BeastRage|Wait",true)
	call PolledWait(.4)
	call SetBoolean(lf5,"BeastRage|Wait",false)
endfunction

function BeastRageCheck takes nothing returns boolean
	return GetUnitAbilityLevel(GetAttacker(),'A0O0')>0 and GetBoolean(H2Tx(GetAttacker()),"BeastRage|Wait")==false and IsUnitType(GetTriggerUnit(),UNIT_TYPE_STRUCTURE)==false
endfunction

function BeastRageInit takes nothing returns nothing
	local trigger ltt=CreateTrigger()
	call TriggerRegisterAnyUnitEventBJ(ltt,EVENT_PLAYER_UNIT_ATTACKED)
	call TriggerAddCondition(ltt,Condition(function BeastRageCheck))
	call TriggerAddAction(ltt,function BeastRageMain)
	call SpellPreload('A0NZ')
endfunction
вот код из опен доты, примитив но с геймкешем.
8gabriel8, Это то что я чаще всего вижу в ГУИ - когда вейты пихают везде, даже там где они не нужны, если герой дальнего боя то вместо того чтобы отлавливать урон, ждут пока он замахнется и ставят вейт на мнимое время полёта снаряда, совсем забывая что можно промазать, цель может умереть и так далее.
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:
Он имеет ввиду, чтобы ты проверил способность вместе с предметом Огненный плащ или способностью Жар преисподней, не будет ли это считаться атакой юнита, как будет работать, когда много юнитов к тебе подбегает, ведь часть из них как бы будет атакована не в первый раз, а часть в первый одновременно, если эффект будет считаться атакой, естественно.
а... понял
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.