Добавлен , опубликован
На этот раз я решил сделать полностью с нуля героя на Wurst Script. Это пока что демо версия, т.к. он немного не доработан в качестве визуала и возможно задумки. Так же есть небольшие утечки, которые я не смог найти.

Способности

Пассивно - Пламя Феникса
Все способности Телеандора дополнительно наносят урон равный 100% от его интелекта
Код способности
import AbilityObjEditing
import HeroesID

let BURNING_OUT_GROUP = CreateGroup()


@compiletime function burningOut()
    new AbilityDefinitionArchMageBrillianceAura(BURNING_OUT_ID)
    ..setHeroAbility(false)
    ..setLevels(1)
    ..setArtCaster("")
    ..setArtEffect("")
    ..setArtSpecial("")
    ..setArtTarget("")
    ..presetButtonPosNormal(1, 1)
    ..presetTargetsAllowed(lvl -> "")
    ..presetIcon("ReplaceableTextures\\PassiveButtons\\PASPhoenixClaw")
    ..presetTooltipNormal(lvl -> "|cffff7300Пламя Феникса|r")
    ..presetTooltipNormalExtended(lvl -> "Способности Телеандора дополнительно наносят (|cffffcc00100|r% от |cff008cffинтелекта|r) ед. урона.")
Q - Рывок Феникса
Телеандор обращается в феникса и делает рывок вперёд, нанося противникам 100/200/300 урона
Если у кого есть идеи как более точно высчитать урон при движении, буду рад.
Код способности
import ChannelAbilityPreset
import HeroesID
import RegisterEvents
import ClosureTimers
import SecondaryFunction
import UnitIds
import Units

let PHOENIX_JERK_DUMMY_ID = compiletime(UNIT_ID_GEN.next())


@compiletime function _PhoenixJerk_()
    new ChannelAbilityPreset(PHOENIX_JERK_ID, 3, true)
    ..presetTargetTypes(Targettype.PASSIVE)
    ..presetButtonPosResearch(0, 0)
    ..presetButtonPosNormal(0, 2)
    ..presetBaseOrderID(lvl -> "AImove")
    ..presetDisableOtherAbilities(lvl -> false)
    ..presetFollowThroughTime(lvl -> 0.)
    ..setHotkeyLearn("Q")
    ..setHotkeyNormal("Q")
    ..setName("Рывок Феникса")
    ..setTooltipLearn("Рывок Феникса (|cffffcc00Q|r)")
    ..presetTooltipNormal(lvl -> "Рывок Феникса, |cffffcc00Уровень [" +  lvl.toString() + "|r] (|cffffcc00Q|r)")
    ..setTooltipLearnExtended("Телеандор совершает рывок вперёд и наносит 100/200/300 ед. урона всем противникам на пути.")
    ..presetTooltipNormalExtended(lvl -> "Телеандор совершает рывок вперёд и наносит |cffffcc00" + (100 * lvl).toString() + "|r ед. урона всем противникам на пути.")
    ..presetCooldown(lvl -> 5.)
    ..presetManaCost(lvl -> 50)
    ..presetCastRange(lvl -> 900)
    ..presetIcon("ReplaceableTextures\\CommandButtons\\BTNPhoenixWings")
    ..setAnimationNames("")

@compiletime function _PhoenixJerkDummy_()
    new UnitDefinition(PHOENIX_JERK_DUMMY_ID, UnitIds.forceofnature)
    ..setNormalAbilities("Avul,Aloc")
    ..setSpeedBase(1)
    ..setMovementHeight(100.)
    ..setMovementType(MovementType.Fly)
    ..setUpgradesUsed("")
    ..setGoldBountyAwardedBase(0)
    ..setGoldBountyAwardedNumberofDice(0)
    ..setGoldBountyAwardedSidesperDie(0)
    ..setSightRadiusDay(1800)
    ..setSightRadiusNight(800)
    ..setRace(Race.Human)
    ..setShadowImageUnit("")
    ..setIconGameInterface("ReplaceableTextures\\CommandButtons\\BTNPhoenixWings")
    ..setModelFile(Units.phoenix)
    ..setAttacksEnabled(0)
    ..setName("Рывок Феникса")


init
    registerPlayerUnitEvent(EVENT_PLAYER_UNIT_SPELL_EFFECT) ->
        let caster = GetTriggerUnit()
        if caster.getTypeId() == TELEANDOR_ID and GetSpellAbilityId() == PHOENIX_JERK_ID
            caster.pause()
            caster.hide()

            let dummy = createUnit(caster.getOwner(), PHOENIX_JERK_DUMMY_ID, caster.getPos(), caster.getFacingAngle())
            
            let a = GetUnitFacing(dummy) * bj_DEGTORAD
            let x1 = dummy.getX() + 700. * Cos(a)
            let y1 = dummy.getY() + 700. * Sin(a)

            caster.setPos( vec2(x1, y1) )

            doPeriodically(0.02) cb ->
                let x0 = dummy.getX()
                let y0 = dummy.getY()
                let d = SquareRoot( (x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0) )

                if d == 0.
                    destroy cb
                    caster.unpause()
                    caster.show()
                    caster.select()
                    dummy.remove()

                let g = CreateGroup()
                g.enumUnitsInRange(dummy.getPos(), 100.)

                for u from g
                    if u.isEnemyNew(caster.getOwner())
                        caster.damageTarget(u, 25. * caster.getAbilityLevel(PHOENIX_JERK_ID) + caster.getInt(true), true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
                g.clear()
                g.destr()

                let newX = x0 + 25. * Cos(a)
                let newY = y0 + 25. * Sin(a)

                dummy.setPos( vec2(newX, newY) )
W - Шар Феникса
Телеандор наполняет перед собой шар энергии, который летит в указанного противника по пути увеличивая свою скорость, размер и урон.
Код способности
import ChannelAbilityPreset
import HeroesID
import UnitIds
import Icons
import RegisterEvents
import ClosureTimers

let PHOENIX_BOLT_DUMMY_ID = compiletime(UNIT_ID_GEN.next())


@compiletime function _PhoenixJerk_()
    new ChannelAbilityPreset(PHOENIX_BOLT_ID, 3, true)
    ..presetTargetTypes(Targettype.UNIT)
    ..presetButtonPosResearch(1, 0)
    ..presetButtonPosNormal(1, 2)
    ..presetBaseOrderID(lvl -> "acidbomb")
    ..presetDisableOtherAbilities(lvl -> false)
    ..presetFollowThroughTime(lvl -> 1.2)
    ..setHotkeyLearn("W")
    ..setHotkeyNormal("W")
    ..setName("Шар Феникса")
    ..setTooltipLearn("Шар Феникса (|cffffcc00W|r)")
    ..presetTooltipNormal(lvl -> "Шар Феникса, |cffffcc00Уровень [" +  lvl.toString() + "|r] (|cffffcc00W|r)")
    ..setTooltipLearnExtended("В течении секунды Телеандор заряжает шар, который летит в указанного противника и с каждой секундой увеличивается в размерах. " +
                    "Чем большее расстояние пройдёт шар , тем больше урона получит противник. " +
                    "|n|n|cff7c7c7cДальность применения 700/1400/2100|r")
    ..presetTooltipNormalExtended(lvl ->"В течении секунды Телеандор заряжает шар, который летит в указанного противника и с каждой секундой увеличивается в размерах. " +
                    "Чем большее расстояние пройдёт шар , тем больше урона получит противник. " +
                    "|n|n|cff7c7c7cДальность применения|r |cffffffff" + (700 * lvl).toString() + "|r |cff7c7c7c.|r")
    ..presetCooldown(lvl -> 15.)
    ..presetManaCost(lvl -> 50)
    ..presetCastRange(lvl -> 700. * lvl)
    ..presetIcon(Icons.bTNFireBolt)
    ..setAnimationNames("spell")

@compiletime function _PhoenixJerkDummy_()
    new UnitDefinition(PHOENIX_BOLT_DUMMY_ID, UnitIds.forceofnature)
    ..setNormalAbilities("Avul,Aloc")
    ..setSpeedBase(1)
    ..setMovementHeight(75.)
    ..setMovementType(MovementType.Fly)
    ..setUpgradesUsed("")
    ..setGoldBountyAwardedBase(0)
    ..setGoldBountyAwardedNumberofDice(0)
    ..setGoldBountyAwardedSidesperDie(0)
    ..setSightRadiusDay(0)
    ..setSightRadiusNight(0)
    ..setRace(Race.Human)
    ..setShadowImageUnit("")
    ..setIconGameInterface(Icons.bTNFireBolt)
    ..setModelFile("Abilities\\Weapons\\RedDragonBreath\\RedDragonMissile.mdl")
    ..setAttacksEnabled(0)
    ..setName("Шар Феникса")
    ..setScalingValue(0.0)


init
    registerPlayerUnitEvent(EVENT_PLAYER_UNIT_SPELL_EFFECT) ->
        if GetSpellAbilityId() == PHOENIX_BOLT_ID
            let caster = GetTriggerUnit()
            let target = GetSpellTargetUnit()
            let x = caster.getX() + 50. * Cos(GetUnitFacing(caster) * bj_DEGTORAD )
            let y = caster.getY() + 50. * Sin(GetUnitFacing(caster) * bj_DEGTORAD )
            let z = caster.getFlyHeight() + 75.
            let dummy = createUnit(caster.getOwner(), PHOENIX_BOLT_DUMMY_ID, vec3(x, y, z), caster.getFacingAngle())
            real svp = .0
            doPeriodically(0.048) cb ->
                svp += .02

                dummy.setScale(svp)

                if svp == .3
                    destroy cb
                    doPeriodically(0.02) cb ->
                        let x1 = target.getX()
                        let y1 = target.getY()
                        let z1 = target.getFlyHeight() + 75.
                        let x0 = dummy.getX()
                        let y0 = dummy.getY()
                        let z0 = dummy.getFlyHeight()
                        let d = SquareRoot( (x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0) )
                        let a = bj_RADTODEG * Atan2(y1 - y0, x1 - x0)
                        real newZ = 0

                        if z0 > z1
                            newZ = z0 + d / z0 / 10.
                        else if z0 == z1
                            newZ = z0
                        else if z0 < z1
                            newZ = - (z1 + d / z0 / 10.)

                        svp += .01
                        dummy.setScale(svp)

                        let newX = x0 + (svp * 10) * Cos(a * bj_DEGTORAD)
                        let newY = y0 + (svp * 10) * Sin(a * bj_DEGTORAD)

                        if d > 16.
                            dummy.setPosFly(  vec3(newX, newY, newZ) )
                        else
                            destroy cb
                            dummy.kill()
                            caster.damageTarget(target, 100. * svp + caster.getInt(true), true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
Пассивно - Гнев Феникса
Когда Телеандор убивает противника, из него вырывается пламя, которое устремляется к Телеандору и начинает вращаться вокруг него. После 5 секунд пламя, летит в одного из ближайших противников и наносит ему (5 * интелект) ед. урона.
Код способности
import ChannelAbilityPreset
import HeroesID
import UnitIds
import RegisterEvents
import ClosureTimers
import Teleandor
import SecondaryFunction

let PHOENIX_FLAME_DUMMY_ID = compiletime(UNIT_ID_GEN.next())
let PHIH = InitHashtable()
let PHOENIX_FLAME_GROUP_MOVE_ID = CreateGroup()
let PHOENIX_FLAME_GROUP_CIRCLE_ID = CreateGroup()
let PHOENIX_FLAME_GROUP_DAMAGE_ID = CreateGroup()


@compiletime function _WrathOfThePhoenix_()
    new AbilityDefinitionArchMageBrillianceAura(PHOENIX_FLAME_ID)
    ..setLevels(3)
    ..setArtCaster("")
    ..setArtEffect("")
    ..setArtSpecial("")
    ..setArtTarget("")
    ..presetButtonPosResearch(2, 0)
    ..presetButtonPosNormal(2, 2)
    ..presetHotkey("E")
    ..presetTargetsAllowed(lvl -> "")
    ..setIconResearch("ReplaceableTextures\\CommandButtons\\BTNPhoenixFire.blp")
    ..setIconNormal("ReplaceableTextures\\PassiveButtons\\PASPhoenixFire.blp")
    ..presetTooltipLearn(lvl -> "Гнев Феникса (|cffffcc00E|r)")
    ..setTooltipLearnExtended("Когда Телеандор убивает противника из него вырывается сгусток пламени, который устремляется к герою и начинает вращатся вокруг него. Спустя |cffffcc005|r секунд сгустки летят в ближайших противников и наносят им (25/50/75 + |cff008cffинтелект|r) ед. урона.")
    ..presetTooltipNormal(lvl -> "Гнев Феникса, |cffffcc00Уровень [" +  lvl.toString() + "|r] (|cffffcc00E|r)")
    ..presetTooltipNormalExtended(lvl -> "Когда Телеандор убивает противника из него вырывается сгусток пламени, который устремляется к герою и начинает вращатся вокруг него. Спустя |cffffcc005|r секунд сгустки летят в ближайших противников и наносят им (|cffffcc00" + (25 * lvl).toString() + " |r + |cff008cffинтелект|r) ед. урона.")

@compiletime function _WrathOfThePhoenixDummy_()
    new UnitDefinition(PHOENIX_FLAME_DUMMY_ID, UnitIds.forceofnature)
    ..setNormalAbilities("Avul,Aloc")
    ..setSpeedBase(1)
    ..setMovementHeight(0.)
    ..setMovementType(MovementType.Fly)
    ..setUpgradesUsed("")
    ..setGoldBountyAwardedBase(0)
    ..setGoldBountyAwardedNumberofDice(0)
    ..setGoldBountyAwardedSidesperDie(0)
    ..setSightRadiusDay(0)
    ..setSightRadiusNight(0)
    ..setRace(Race.Human)
    ..setShadowImageUnit("")
    ..setIconGameInterface("ReplaceableTextures\\CommandButtons\\BTNPhoenixFire")
    ..setModelFile("Abilities\\Weapons\\PhoenixMissile\\Phoenix_Missile_mini.mdl")
    ..setAttacksEnabled(0)
    ..setName("Гнев Феникса")
    ..setScalingValue(1.)


init
    registerPlayerUnitEvent(EVENT_PLAYER_UNIT_DEATH) ->
        let killer = GetKillingUnit()
        if killer.getTypeId() == TELEANDOR_ID and killer.getAbilityLevel(PHOENIX_FLAME_ID) > 0
            let target = GetTriggerUnit()
            let dummy = createUnit(killer.getOwner(), PHOENIX_FLAME_DUMMY_ID, target.getPos3Fly(), killer.getFacingAngle())
            PHOENIX_FLAME_GROUP_MOVE_ID.addUnit(dummy)


    doPeriodically(1.) cb ->
        for dummy in PHOENIX_FLAME_GROUP_CIRCLE_ID
            let time = PHIH.loadInt(dummy.getHandleId(), 'time')
            if time > 0
                PHIH.saveInt(dummy.getHandleId(), 'time', time - 1)


    doPeriodically(0.02) cb ->
        let x0 = teleandor.getX()
        let y0 = teleandor.getY()
        let z0 = teleandor.getFlyHeight() + 150.

        for dummy in PHOENIX_FLAME_GROUP_MOVE_ID
            let x1 = dummy.getX()
            let y1 = dummy.getY()
            let z1 = dummy.getFlyHeight()
            let a = bj_RADTODEG * Atan2(y0 - y1, x0 - x1)
            let d = SquareRoot( (x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0) )

            if d > 100.
                let newX = x1 + 15. * Cos(a * bj_DEGTORAD)
                let newY = y1 + 15. * Sin(a * bj_DEGTORAD)
                let newZ = z1 + d / z0 / 10.

                dummy.setPosFly( vec3(newX, newY, newZ) )
            else
                PHOENIX_FLAME_GROUP_MOVE_ID.removeUnit(dummy)
                PHOENIX_FLAME_GROUP_CIRCLE_ID.addUnit(dummy)
                dummy.setFlyHeight(z0, 0.)
                PHIH.saveInt(dummy.getHandleId(), 'time', 5)

        for dummy in PHOENIX_FLAME_GROUP_CIRCLE_ID
            let x1 = dummy.getX()
            let y1 = dummy.getY()
            let id = dummy.getHandleId()
            int ds = PHIH.loadInt(id, 'DegC')

            if ds == 60
                ds = 0
            else
                ds = ds + 1
            PHIH.saveInt(id, 'DegC', ds)

            let x2 = x0 + 100 * Cos( (6. * ds) * bj_DEGTORAD )
            let y2 = y0 + 100 * Sin( (6. * ds) * bj_DEGTORAD )
            let a = bj_RADTODEG * Atan2(y2 - y1, x2 - x1)
            let newX = x1 + 10 * Cos(a * bj_DEGTORAD)
            let newY = y1 + 10 * Sin(a * bj_DEGTORAD)

            dummy.setPos( vec2(newX, newY) )

            let d = SquareRoot( (x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0) )

            if d > 150.
                PHOENIX_FLAME_GROUP_CIRCLE_ID.addUnit(dummy)
                PHOENIX_FLAME_GROUP_MOVE_ID.removeUnit(dummy)

            let g = CreateGroup()
            g.enumUnitsInRange(teleandor.getPos(), 600.)

            let test = g.next()

            if test != null
                let t = g.getRandomUnit()

                if t != null and PHIH.loadInt(dummy.getHandleId(), 'time') == 0 and t.isEnemyNew(teleandor.getOwner())
                    PHOENIX_FLAME_GROUP_CIRCLE_ID.removeUnit(dummy)
                    PHOENIX_FLAME_GROUP_DAMAGE_ID.addUnit(dummy)
                    PHIH.saveUnitHandle(dummy.getHandleId(), 'targ', t)
                g.clear()
                g.destr()

        for dummy in PHOENIX_FLAME_GROUP_DAMAGE_ID
            let t = PHIH.loadUnitHandle(dummy.getHandleId(), 'targ')
            let x1 = t.getX()
            let y1 = t.getY()
            let z1 = t.getFlyHeight() + 50.
            let x2 = dummy.getX()
            let y2 = dummy.getY()
            let z2 = dummy.getFlyHeight()
            let a = bj_RADTODEG * Atan2(y1 - y2, x1 - x2)
            let d = SquareRoot( (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1) )
            let newX = x2 + 15. * Cos(a * bj_DEGTORAD)
            let newY = y2 + 15. * Sin(a * bj_DEGTORAD)
            real newZ = 0

            if z1 > z2
                newZ = z2 + d / z1 / 10.
            else if z1 == z2
                newZ = z1
            else if z1 < z2
                newZ = - (z2 + d / z1 / 10.)

            if d > 16.
                dummy.setPosFly( vec3(newX, newY, newZ) )
            else
                PHOENIX_FLAME_GROUP_DAMAGE_ID.removeUnit(dummy)
                teleandor.damageTarget(t, 25. * teleandor.getAbilityLevel(PHOENIX_FLAME_ID) + teleandor.getInt(true) * 2, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
                PHIH.flushChild(dummy.getHandleId())
                dummy.kill()
R - Сверхновый
В течении 5 секунд Телеандор наполняется силой, с каждой секундой увеличивая дальность способности на 250, урона на 100 и количество восспоняемого здоровья и маны на 10%. Спустя 5 секунд Телеандор перерождается и наносит накопленный урон в накопленной области вокруг себя и восстанавливает накопленное количество маны и здоровья.
Код способности
import ChannelAbilityPreset
import HeroesID
import UnitIds
import Units
import RegisterEvents
import ClosureTimers
import Teleandor
import SecondaryFunction

let SUPERNOVA_DUMMY_ID = compiletime(UNIT_ID_GEN.next())
let IGNITION_ID = compiletime(ABIL_ID_GEN.next())
let DESCRIPTION = "Телеандор в течении |cffffcc005|r секунд накапливает силу. Каждую секунду область действия увеличивавется на |cffffcc00250|r, " +
                    "урон на |cffffcc00100|r, а количество восполняемого здороья и маны на |cffffcc0010|r%. " + 
                    "По истечению времени Телеандор наносит накопленный урон и перерождается с накопленным запасом здоровья и маны." +
                    "|n|n|cff7c7c7cСпустя|r |cffffffff1|r |cff7c7c7cсекунду можно использовать способность|r |cffffffffВозжигание|r|cff7c7c7c, " +
                    "которая позволит использовать способность до её полного накопления.|r"

@compiletime function _Supernova_()
    new ChannelAbilityPreset(SUPERNOVA_ID, 1, true)
    ..presetTargetTypes(Targettype.PASSIVE)
    ..presetButtonPosResearch(3, 0)
    ..presetButtonPosNormal(3, 2)
    ..presetBaseOrderID(lvl -> "absorb")
    ..presetDisableOtherAbilities(lvl -> false)
    ..presetFollowThroughTime(lvl -> 5.)
    ..setHotkeyLearn("R")
    ..setHotkeyNormal("R")
    ..setName("Сверхновый")
    ..setTooltipLearn("Сверхновый (|cffffcc00R|r)")
    ..presetTooltipNormal(lvl -> "Сверхновый (|cffffcc00R|r)")
    ..setTooltipLearnExtended(DESCRIPTION)
    ..presetTooltipNormalExtended(lvl -> DESCRIPTION)
    ..presetCooldown(lvl -> 60.)
    ..presetManaCost(lvl -> 200)
    ..presetCastRange(lvl -> 900)
    ..presetIcon("ReplaceableTextures\\CommandButtons\\BTNPhoenixBeam")

@compiletime function _Ignition_()
    new ChannelAbilityPreset(IGNITION_ID, 1, true)
    ..presetTargetTypes(Targettype.PASSIVE)
    ..setHeroAbility(false)
    ..presetButtonPosNormal(2, 1)
    ..presetBaseOrderID(lvl -> "shockwave")
    ..presetDisableOtherAbilities(lvl -> false)
    ..presetFollowThroughTime(lvl -> 0.)
    ..setHotkeyNormal("F")
    ..setName("Возгорание")
    ..presetTooltipNormal(lvl -> "Возгорание (|cffffcc00F|r)")
    ..presetTooltipNormalExtended(lvl -> "Использовать |cffffcc00Сверхновый|r немедленно.")
    ..presetCooldown(lvl -> 0.)
    ..presetManaCost(lvl -> 0)
    ..presetIcon("ReplaceableTextures\\CommandButtons\\BTNPhoenixBeam")

@compiletime function _SupernovaDummy_()
    new UnitDefinition(SUPERNOVA_DUMMY_ID, UnitIds.forceofnature)
    ..setNormalAbilities("Avul,Aloc")
    ..setSpeedBase(1)
    ..setMovementHeight(0.)
    ..setMovementType(MovementType.Fly)
    ..setUpgradesUsed("")
    ..setGoldBountyAwardedBase(0)
    ..setGoldBountyAwardedNumberofDice(0)
    ..setGoldBountyAwardedSidesperDie(0)
    ..setSightRadiusDay(1800)
    ..setSightRadiusNight(800)
    ..setRace(Race.Human)
    ..setShadowImageUnit("")
    ..setIconGameInterface("ReplaceableTextures\\CommandButtons\\BTNPhoenixBeam")
    ..setModelFile(Units.phoenix)
    ..setAttacksEnabled(0)
    ..setName("Сверхновый")


int time = 0
int time2 = 0

function _SupernovaAction_()
    teleandor.hide()
    let dummy = createUnit(teleandor.getOwner(), SUPERNOVA_DUMMY_ID, teleandor.getPos3Fly(), teleandor.getFacingAngle())
    dummy.pause()
    DestroyEffect( AddSpecialEffect("Abilities\\Spells\\Human\\MarkOfChaos\\MarkOfChaosTarget.mdl", teleandor.getX(), teleandor.getY()) )
    dummy.setAnimation("Birth")
    doAfter(0.3) -> 
        dummy.setAnimation("Morph")
        doAfter(2.5) -> 
            dummy.setAnimation("Morph Alternate")
            DestroyEffect( AddSpecialEffect("Abilities\\Spells\\Human\\MarkOfChaos\\MarkOfChaosTarget.mdl", teleandor.getX(), teleandor.getY()) )
            doAfter(0.1) -> 
                dummy.setAnimation("Birth")
                doAfter(0.3) -> 
                    if time > 5
                        time = 5
                    let range = 250. * time
                    let damage = 100. * time + teleandor.getInt(true)
                    let state = 0.1 * time
                    let g = CreateGroup()
                    g.enumUnitsInRange(teleandor.getPos(), range)
                    for u from g
                        if u.isEnemyNew(teleandor.getOwner())
                            teleandor.damageTarget(u, damage, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
                            DestroyEffect( AddSpecialEffect("Abilities\\Spells\\Human\\MarkOfChaos\\MarkOfChaosTarget.mdl", u.getX(), u.getY()) )
                    g.clear()
                    g.destr()
                    teleandor.addHP( teleandor.getHP() * state )
                    teleandor.addMana( teleandor.getMana() * state )
                    dummy.remove()
                    teleandor.show()
                    teleandor.unpause()
                    teleandor.issueImmediateOrder("Stop")
                    teleandor.select()
                    time = 0
                    time2 = 0


init
    registerPlayerUnitEvent(EVENT_PLAYER_UNIT_SPELL_CAST) ->
        if GetSpellAbilityId() == SUPERNOVA_ID
            let caster = GetTriggerUnit()
            let x = caster.getX()
            let y = caster.getY()
            doPeriodically(1.) cb ->
                if time < 5
                    time += 1

                DestroyEffect( AddSpecialEffect("Abilities\\Spells\\Items\\AIam\\AIamTarget.mdl", x, y) )

                if time == 5
                    destroy cb
                    caster.removeAbility(IGNITION_ID)
                    _SupernovaAction_()
                else if time == 1
                    caster.addAbility(IGNITION_ID)

                if time2 == 1
                    destroy cb

        else if GetSpellAbilityId() == IGNITION_ID
            _SupernovaAction_()
            GetTriggerUnit().removeAbility(IGNITION_ID)
            time2 = 1

Послесловие

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