Добавлен , опубликован
CHAIN FROST
Способность Chain Frost, повторение способности персонажа Lich(Kel'Thuzed) из DotA.
Герой выпускает в выбранного врага летящий шар, который при попадании во врага, наносит цели урон и уменьшает скорость атаки и передвижения. С каждым повторным попаданием урон в следующую цель увеличивается. Способность является ультимативной и поэтому имеет 3 уровня исследования. Большинство характеристик способностей зависят именно от уровня. Способность делал без перезарядки и манакоста, но все равно вставлю эти данные в характеристики для логической и балансной состовляющей.
Урон: 250/400/550
Дополнительный урон при повторном попадании: 15/20/25
Скорость шара: 800
Максимальное число отскоков: 10
Перезарядка: 100/80/60
Стоимость маны: 200/350/500
Замедление скорости передвижения: 65%
Замедление скорости атаки: 30%
Способность писал на Jass, с использованием структур. В карте присутствует один импортируемый эффект, приложу его к ресурсу вместе с картой. Описания для способностей сделал простые, ибо слишком лень было делать его детальнее.
globals
    unit bj_lastFilterUnit  = null
    constant hashtable hash = InitHashtable( )
    constant group TempG1   = CreateGroup( )
endglobals

struct ChainFrost 
    unit caster
    unit target 
    unit dummy
    real angle
    real speed
    real damage_1
    real damage_2
    integer count 
endstruct

function filter takes nothing returns boolean
    set bj_lastFilterUnit = GetFilterUnit( )
    return IsUnitEnemy( bj_lastFilterUnit, GetOwningPlayer( bj_lastCreatedUnit ) ) and not IsUnitType( bj_lastFilterUnit, UNIT_TYPE_DEAD ) and bj_lastFilterUnit != bj_lastReplacedUnit
endfunction

function move takes nothing returns nothing
    local timer t = GetExpiredTimer( )
    local ChainFrost S = LoadInteger( hash, GetHandleId( t ), 1 )
    local boolean b = false
    local real x1 = GetUnitX( S.dummy )
    local real y1 = GetUnitY( S.dummy )
    local real x2 = GetUnitX( S.target )
    local real y2 = GetUnitY( S.target )
    local unit slow
    local unit e
    
    set S.angle = Atan2( y2 - y1, x2 - x1 )
    set x1 = x1 + S.speed * Cos( S.angle )
    set y1 = y1 + S.speed * Sin( S.angle )
    call SetUnitPosition( S.dummy, x1, y1 )
    call SetUnitFacing( S.dummy, bj_RADTODEG * S.angle)
    
    if S.count < 10 then
        if SquareRoot((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)) <= 50 then
            call UnitDamageTarget( S.caster, S.target, S.damage_1, false, false, null, null, null)
            
            set e = CreateUnit( GetOwningPlayer( S.caster ), 'u003', x2, y2, GetRandomReal( 0, 360 ) )
            call KillUnit(e)
            set e = null

            set slow = CreateUnit( GetOwningPlayer( S.caster ), 'u002', x1, y1, S.angle * bj_RADTODEG )
            call IssueTargetOrder( slow, "slow", S.target )
            call KillUnit(slow)
            set slow = null
            
            set bj_lastCreatedUnit = S.caster
            set bj_lastReplacedUnit = S.target
            call GroupEnumUnitsInRange( TempG1, x2, y2, 600., function filter)
            set b = FirstOfGroup(TempG1) == null
            
            if not b then
                set S.count = S.count + 1
                set S.damage_1 = S.damage_1 + S.damage_2
                
                set bj_groupRandomConsidered = 0
                set bj_groupRandomCurrentPick = null
                call ForGroup( TempG1, function GroupPickRandomUnitEnum )
                set S.target = bj_groupRandomCurrentPick
                call GroupClear( TempG1 )
            endif
        endif
    else
        set b = true
    endif
    
    if b then
        call KillUnit( S.dummy )
        set S.caster = null
        set S.target = null
        set S.dummy  = null
        call S.destroy()
        call FlushChildHashtable( hash, GetHandleId( t ) )
        call DestroyTimer( t )
    endif
    
    set t = null
endfunction

function create takes nothing returns nothing 
    local timer t = CreateTimer()
    local ChainFrost S = ChainFrost.create()
    local integer lvl
    local real x1
    local real y1
    local real x2
    local real y2
    
    set S.caster = GetSpellAbilityUnit()
    set S.target = GetSpellTargetUnit()
    set x1 = GetUnitX( S.caster )
    set y1 = GetUnitY( S.caster )
    set x2 = GetUnitX( S.target )
    set y2 = GetUnitY( S.target )
    set lvl = GetUnitAbilityLevel( S.caster, 'A000' )
    set S.angle = Atan2(y2 - y1, x2 - x1)
    set S.count = 0 
    set S.speed = 8
    set S.dummy = CreateUnit( GetOwningPlayer( S.caster ), 'u001', x1, y1, bj_RADTODEG * S.angle)
    
    if     lvl == 1 then 
        set S.damage_1 = 250
        set S.damage_2 = 15
    elseif lvl == 2 then
        set S.damage_1 = 400 
        set S.damage_2 = 20
    elseif lvl == 3 then 
        set S.damage_1 = 550 
        set S.damage_2 = 25 
    endif
    
    call SaveInteger( hash, GetHandleId(t), 1, S )
    call TimerStart( t, 0.01, true, function move )
    set t = null
endfunction

function condition takes nothing returns boolean
    if GetSpellAbilityId() == 'A000' then
        call create()
    endif
    return false
endfunction

function InitTrig_Spell takes nothing returns nothing 
    local trigger t = CreateTrigger()
    local integer index = 0
loop
    exitwhen index == 9
    call TriggerRegisterPlayerUnitEvent(t,Player(index),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
    set index = index + 1 
endloop
    call TriggerAddCondition(t,function condition)
endfunction
`
ОЖИДАНИЕ РЕКЛАМЫ...
1
27
3 года назад
1
ну красавчик, шо, только со скейлами эффектов стоило поиграться и сделать зависимыми от уровня
2
5
3 года назад
2
rsfghd:
ну красавчик, шо, только со скейлами эффектов стоило поиграться и сделать зависимыми от уровня
Да, стоило бы, но мне кажется что не в этом случае
В доте подобное не используется и я у себя не хотел бы делать так же
0
14
3 года назад
0
rsfghd:
ну красавчик, шо, только со скейлами эффектов стоило поиграться и сделать зависимыми от уровня
Меня ты не хвалил когда я такие вещи делал) ну зачем такого как я хвалить не правда ли?

under11
Ну молодец сашка, продвинулся не хило, хоть теперь не делаешь смертельные кусты XD
2
5
3 года назад
2
Гуванч:
Ну молодец сашка, продвинулся не хило, хоть теперь не делаешь смертельные кусты XD
А как механика опасных для жизни кустов может быть связана со способностью(любой) ?

или ты просто хотел сказать о том, что я стал чуть больше разбираться в редакторе, но не смог придумать достойного примера ?
1
27
3 года назад
1
Гуванч, ну так-то ты на то время знал уже вджасс, но всё равно по коду юзал порой не очень красивые примеры, как создание и удаление группы, вместо темповой глобалки
но я поддерживал твоё стремление клепать абилки, до одного момента
0
14
3 года назад
0
under11:
Гуванч:
Ну молодец сашка, продвинулся не хило, хоть теперь не делаешь смертельные кусты XD
А как механика опасных для жизни кустов может быть связана со способностью(любой) ?

или ты просто хотел сказать о том, что я стал чуть больше разбираться в редакторе, но не смог придумать достойного примера ?
ты стал намного лучше и все вот что я хотел сказать
2
5
3 года назад
2
Гуванч:
ты стал намного лучше и все вот что я хотел сказать
Спасибо! Стараюсь, но прогресс мог быть куда больше!
Чтобы оставить комментарий, пожалуйста, войдите на сайт.