Добавлен under11,
опубликован
CHAIN FROST
Способность Chain Frost, повторение способности персонажа Lich(Kel'Thuzed) из DotA.
Герой выпускает в выбранного врага летящий шар, который при попадании во врага, наносит цели урон и уменьшает скорость атаки и передвижения. С каждым повторным попаданием урон в следующую цель увеличивается. Способность является ультимативной и поэтому имеет 3 уровня исследования. Большинство характеристик способностей зависят именно от уровня. Способность делал без перезарядки и манакоста, но все равно вставлю эти данные в характеристики для логической и балансной состовляющей.
Герой выпускает в выбранного врага летящий шар, который при попадании во врага, наносит цели урон и уменьшает скорость атаки и передвижения. С каждым повторным попаданием урон в следующую цель увеличивается. Способность является ультимативной и поэтому имеет 3 уровня исследования. Большинство характеристик способностей зависят именно от уровня. Способность делал без перезарядки и манакоста, но все равно вставлю эти данные в характеристики для логической и балансной состовляющей.
Урон: 250/400/550
Дополнительный урон при повторном попадании: 15/20/25
Скорость шара: 800
Максимальное число отскоков: 10
Перезарядка: 100/80/60
Стоимость маны: 200/350/500
Замедление скорости передвижения: 65%
Замедление скорости атаки: 30%
Дополнительный урон при повторном попадании: 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
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
В доте подобное не используется и я у себя не хотел бы делать так же
Ну молодец сашка, продвинулся не хило, хоть теперь не делаешь смертельные кусты XD
но я поддерживал твоё стремление клепать абилки, до одного момента