Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
Wurst
Тип:
Способность
Версия Warcraft:
1.26 (default) +

Предисловие

Это мой первый опыт в создании сложных триггерных способностей на Wurst, но утечек нет, а это главное.

Способности

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

import AbilityObjEditing
import HeroesID

@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 урона
Если у кого есть идеи как более точно высчитать урон при движении, буду рад.
Код способности
package PhoenixJerk

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())

            dummy.pause()
            dummy.setAnimation("Walk - 2")
            
            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 - Шар Феникса
Телеандор наполняет перед собой шар энергии, который летит в указанного противника по пути увеличивая свою скорость, размер и урон.
Код способности
package PhoenixBolt

import ChannelAbilityPreset
import HeroesID
import UnitIds
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("ReplaceableTextures\\CommandButtons\\BTNPhoenixBolt")
    ..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("ReplaceableTextures\\PassiveButtons\\BTNPhoenixBolt")
    ..setModelFile("Abilities\\Weapons\\RedDragonBreath\\RedDragonMissile.mdl")
    ..setAttacksEnabled(0)
    ..setName("Шар Феникса")
    ..setScalingValue(0.1)


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 += .02
                        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 * интелект) ед. урона.
Код способности
package PhoenixFlame

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.removeUnit(dummy)
                PHOENIX_FLAME_GROUP_MOVE_ID.addUnit(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 секунд Телеандор перерождается и наносит накопленный урон в накопленной области вокруг себя и восстанавливает накопленное количество маны и здоровья.
Код способности
package Supernova

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) -> 
            DestroyEffect( AddSpecialEffect("Abilities\\Spells\\Human\\MarkOfChaos\\MarkOfChaosTarget.mdl", teleandor.getX(), teleandor.getY()) )
            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

Послесловие

Видео со способностями добавлю позже.
Решил поискать как весь вурст код компилируется в джасс, вот что нашёл:
Гнев Феника
function call_doPeriodically_PhoenixFlame_328 takes integer this, integer cb returns nothing
	local real x0 = unit_getX(Teleandor_teleandor)
	local real y0 = unit_getY(Teleandor_teleandor)
	local real z0 = unit_getFlyHeight(Teleandor_teleandor) + 150.
	local group iterator = group_iterator(PhoenixFlame_PHOENIX_FLAME_GROUP_MOVE_ID)
	local unit dummy_1
	local real x1_1
	local real y1_1
	local real z1
	local real a_1
	local real d
	local real newX
	local real newY
	local real newZ
	local group iterator_1
	local unit dummy_2
	local real x1_2
	local real y1_2
	local integer id
	local integer ds
	local real x2
	local real y2
	local real a_2
	local real newX_1
	local real newY_1
	local real d_1
	local group g
	local unit test
	local unit t
	local group iterator_2
	local unit dummy_3
	local unit t_1
	local real x1_3
	local real y1_3
	local real z1_1
	local real x2_1
	local real y2_1
	local real z2
	local real a_3
	local real d_2
	local real newX_2
	local real newY_2
	local real newZ_1
	loop
		exitwhen  not group_hasNext(iterator)
		set dummy_1 = group_next(iterator)
		set x1_1 = unit_getX(dummy_1)
		set y1_1 = unit_getY(dummy_1)
		set z1 = unit_getFlyHeight(dummy_1)
		set a_1 = bj_RADTODEG * Atan2(y0 - y1_1, x0 - x1_1)
		set d = SquareRoot((x1_1 - x0) * (x1_1 - x0) + (y1_1 - y0) * (y1_1 - y0))
		if d > 100. then
			set newX = x1_1 + 15. * Cos(a_1 * bj_DEGTORAD)
			set newY = y1_1 + 15. * Sin(a_1 * bj_DEGTORAD)
			set newZ = z1 + d / z0 / 10.
			call unit_setPosFly(dummy_1, newX, newY, newZ)
		else
			call group_removeUnit_1(PhoenixFlame_PHOENIX_FLAME_GROUP_MOVE_ID, dummy_1)
			call group_addUnit_1(PhoenixFlame_PHOENIX_FLAME_GROUP_CIRCLE_ID, dummy_1)
			call unit_setFlyHeight(dummy_1, z0, 0.)
			call hashtable_saveInt(PhoenixFlame_PHIH, handle_getHandleId(dummy_1), 1953066341, 5)
		endif
	endloop
	call group_close(iterator)
	set iterator_1 = group_iterator(PhoenixFlame_PHOENIX_FLAME_GROUP_CIRCLE_ID)
	loop
		exitwhen  not group_hasNext(iterator_1)
		set dummy_2 = group_next(iterator_1)
		set x1_2 = unit_getX(dummy_2)
		set y1_2 = unit_getY(dummy_2)
		set id = handle_getHandleId(dummy_2)
		set ds = hashtable_loadInt(PhoenixFlame_PHIH, id, 1147496259)
		if ds == 60 then
			set ds = 0
		else
			set ds = ds + 1
		endif
		call hashtable_saveInt(PhoenixFlame_PHIH, id, 1147496259, ds)
		set x2 = x0 + 100. * Cos(6. * ds * bj_DEGTORAD)
		set y2 = y0 + 100. * Sin(6. * ds * bj_DEGTORAD)
		set a_2 = bj_RADTODEG * Atan2(y2 - y1_2, x2 - x1_2)
		set newX_1 = x1_2 + 10. * Cos(a_2 * bj_DEGTORAD)
		set newY_1 = y1_2 + 10. * Sin(a_2 * bj_DEGTORAD)
		call unit_setPos(dummy_2, newX_1, newY_1)
		set d_1 = SquareRoot((x1_2 - x0) * (x1_2 - x0) + (y1_2 - y0) * (y1_2 - y0))
		if d_1 > 150. then
			call group_removeUnit_1(PhoenixFlame_PHOENIX_FLAME_GROUP_CIRCLE_ID, dummy_2)
			call group_addUnit_1(PhoenixFlame_PHOENIX_FLAME_GROUP_MOVE_ID, dummy_2)
		endif
		set g = CreateGroup()
		call group_enumUnitsInRange(g, unit_getPos(Teleandor_teleandor), unit_getPos_return_y, 600.)
		set test = group_next(g)
		if test != null then
			set t = group_getRandomUnit(g)
			if t != null and hashtable_loadInt(PhoenixFlame_PHIH, handle_getHandleId(dummy_2), 1953066341) == 0 and unit_isEnemyNew(t, unit_getOwner(Teleandor_teleandor)) then
				call group_removeUnit_1(PhoenixFlame_PHOENIX_FLAME_GROUP_CIRCLE_ID, dummy_2)
				call group_addUnit_1(PhoenixFlame_PHOENIX_FLAME_GROUP_DAMAGE_ID, dummy_2)
				call hashtable_saveUnitHandle(PhoenixFlame_PHIH, handle_getHandleId(dummy_2), 1952543335, t)
			endif
			call group_clear(g)
			call group_destr(g)
		endif
	endloop
	call group_close(iterator_1)
	set iterator_2 = group_iterator(PhoenixFlame_PHOENIX_FLAME_GROUP_DAMAGE_ID)
	loop
		exitwhen  not group_hasNext(iterator_2)
		set dummy_3 = group_next(iterator_2)
		set t_1 = hashtable_loadUnitHandle(PhoenixFlame_PHIH, handle_getHandleId(dummy_3), 1952543335)
		set x1_3 = unit_getX(t_1)
		set y1_3 = unit_getY(t_1)
		set z1_1 = unit_getFlyHeight(t_1) + 50.
		set x2_1 = unit_getX(dummy_3)
		set y2_1 = unit_getY(dummy_3)
		set z2 = unit_getFlyHeight(dummy_3)
		set a_3 = bj_RADTODEG * Atan2(y1_3 - y2_1, x1_3 - x2_1)
		set d_2 = SquareRoot((x2_1 - x1_3) * (x2_1 - x1_3) + (y2_1 - y1_3) * (y2_1 - y1_3))
		set newX_2 = x2_1 + 15. * Cos(a_3 * bj_DEGTORAD)
		set newY_2 = y2_1 + 15. * Sin(a_3 * bj_DEGTORAD)
		set newZ_1 = 0.
		if z1_1 > z2 then
			set newZ_1 = z2 + d_2 / z1_1 / 10.
		elseif z1_1 == z2 then
			set newZ_1 = z1_1
		elseif z1_1 < z2 then
			set newZ_1 =  - (z2 + d_2 / z1_1 / 10.)
		endif
		if d_2 > 16. then
			call unit_setPosFly(dummy_3, newX_2, newY_2, newZ_1)
		else
			call group_removeUnit_1(PhoenixFlame_PHOENIX_FLAME_GROUP_DAMAGE_ID, dummy_3)
			call unit_damageTarget(Teleandor_teleandor, t_1, 25. * unit_getAbilityLevel(Teleandor_teleandor, HeroesID_PHOENIX_FLAME_ID) + unit_getInt(Teleandor_teleandor, true) * 2, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
			call hashtable_flushChild(PhoenixFlame_PHIH, handle_getHandleId(dummy_3))
			call unit_kill(dummy_3)
		endif
	endloop
	call group_close(iterator_2)
	set iterator = null
	set dummy_1 = null
	set iterator_1 = null
	set dummy_2 = null
	set g = null
	set test = null
	set t = null
	set iterator_2 = null
	set dummy_3 = null
	set t_1 = null
endfunction
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
32
2 года назад
Отредактирован Берги
0
Отличный ресурс
0
11
2 года назад
Отредактирован ArhiMEN
0
Bergi_Bear, у меня немного тупой вопрос, но как добавить картинки в ресурс? Я из того, что написано на сайте ничего не понял. Сайты не работают, на которые нужно добавлять картинки.
0
17
2 года назад
0
ArhiMEN, качаешь приложение Imgur, регистрируешься, кидаешь туда картинки которые нужны, и потом нажимаешь на них, после чего копируешь ссылку и вставляешь в ресурс.
Либо на сайт сюда заливаешь там же, где заливал карту, после чего нажимаешь на "Вставить картинку"
0
11
2 года назад
0
Komkozavr, спасибо
0
35
2 года назад
0
Если будешь создавать галерею скринов в ряд по три картинки, то вставляешь ссылку и перед imgur пишешь i.imgur и в конце расширении картинки дописывай
0
10
2 года назад
0
Bergi_Bear, у меня немного тупой вопрос, но как добавить картинки в ресурс? Я из того, что написано на сайте ничего не понял. Сайты не работают, на которые нужно добавлять картинки.
Кидаешь ссылку изображения в то место в тексте куда тебе надо чтобы было изображение. Ссылку можно сгенерировать в хгме во время редактирования ресурса, если ты вложил изображение в ресурс.
0
2
2 года назад
0
Прикольно придумано)
0
35
8 месяцев назад
0
Жду видео, которое автор обещал добавить
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.