Добавлен , опубликован
ОГНЕННЫЙ ШАР
Моя способность, Огненный шар летящий в точку, который при попадание куда-либо взрывается и наносит урон в радиусе взрыва. Имеет 3 уровня прокачки, в зависимости от прокачки меняются разные характеристики способности. Так же способность имеет небольшой шанс нанести критический взрыв, который нанесет больше урона.
Урон: 90/140/190
Скорость шара: 600/750/900
Радиус взрыва: 250/325/410
Максимальное расстояние: 1100
Шанс большого взрыва: 20%
Дополнительный урон от большого взрыва: 1.5
Перезарядка: 12/9/7
Стоимость маны: 50/70/90
Писал способность на Jass, использовал в ней структуры. Размер летящего шара зависит от уровня способности. Описания для способностей старался делать как в доте. Карту со способностью приложил.
Код:
function filter takes nothing returns boolean 
    return IsUnitEnemy(GetFilterUnit(),GetOwningPlayer(bj_lastCreatedUnit)) and not IsUnitType(GetFilterUnit(),UNIT_TYPE_DEAD)
endfunction

function move takes nothing returns nothing 
    local timer t = GetExpiredTimer()
    local fireball S = LoadInteger(hash,GetHandleId(t),1) 
    local real x1 = GetUnitX(S.dummy) 
    local real y1 = GetUnitY(S.dummy)
    local real x2 = x1 + S.speed * Cos(S.angle)
    local real y2 = y1 + S.speed * Sin(S.angle)
    call SetUnitPosition(S.dummy,x2,y2)
    call SetUnitFacing(S.dummy,S.angle)
    set S.dist = S.dist - S.speed 
    set bj_lastCreatedUnit = S.caster 
    call GroupEnumUnitsInRange(TempG,x2,y2,S.radius2,function filter)
    if S.dist <= 0 or FirstOfGroup(TempG) != null then
        call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Other\\Doom\\DoomDeath.mdl",x2,y2))
        call GroupEnumUnitsInRange(TempG,x2,y2,S.radius1,function filter)
        loop
            set bj_lastCreatedUnit = FirstOfGroup(TempG)
            exitwhen bj_lastCreatedUnit == null
            call UnitDamageTarget(S.caster,bj_lastCreatedUnit,S.damage,false,false,null,null,null)
            call GroupRemoveUnit(TempG,bj_lastCreatedUnit)
        endloop
        set bj_lastCreatedUnit = null 
        call KillUnit(S.dummy)
        set S.dummy = null
        set S.caster = null
        call S.destroy() 
        call FlushChildHashtable(hash,GetHandleId(t)) 
        call GroupClear(TempG) 
        call PauseTimer(t)
        call DestroyTimer(t)
    endif 
    set t = null 
endfunction 

struct fireball
    unit caster
    unit dummy 
    real speed 
    real damage
    real radius1
    real radius2
    real dist
    real angle 
    real sc
endstruct

function create takes nothing returns nothing 
    local timer t = CreateTimer()
    local fireball S = fireball.create()
    local integer random = GetRandomInt(1,500) 
    local integer lvl 
    local real x1 
    local real y1
    local real x2 = GetSpellTargetX()
    local real y2 = GetSpellTargetY() 
    set S.caster = GetSpellAbilityUnit()
    set lvl = GetUnitAbilityLevel(S.caster,'A000')
    set x1 = GetUnitX(S.caster)
    set y1 = GetUnitY(S.caster)
    set S.angle = Atan2(y2-y1,x2-x1)
    set S.dummy = CreateUnit(GetOwningPlayer(S.caster),'u000',x1,y1,bj_RADTODEG * S.angle)
    call UnitAddAbility(S.dummy,'Arav')
    if lvl == 1 then 
        set S.damage = 90
        set S.speed = 600 
        set S.radius1 = 250
        set S.radius2 = 100
        set S.sc = 1.10
    elseif lvl == 2 then
        set S.damage = 140
        set S.speed = 750
        set S.radius1 = 325
        set S.radius2 = 125
        set S.sc = 1.30
    elseif lvl == 3 then 
        set S.damage = 190
        set S.speed = 900
        set S.radius1 = 410
        set S.radius2 = 150
        set S.sc = 1.50
    endif
    if random < 100 then
        set S.damage = S.damage * 1.50
    endif
    call SetUnitScale(S.dummy,S.sc,S.sc,S.sc) 
    set S.dist = 1100 
    set S.speed = S.speed * 0.01
    call SaveInteger(hash,GetHandleId(t),1,S)
    call TimerStart(t,0.01,true,function move) 
    set t = null
endfunction

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

function InitTrig_Spell takes nothing returns nothing
    set gg_trg_Spell = CreateTrigger()
    call TriggerRegisterPlayerUnitEvent(gg_trg_Spell,Player(0),EVENT_PLAYER_UNIT_SPELL_EFFECT,null) 
    call TriggerAddAction(gg_trg_Spell,function cond)
endfunction

globals 
    hashtable hash = InitHashtable()
    group TempG = CreateGroup() 
endglobals
`
ОЖИДАНИЕ РЕКЛАМЫ...