Алгоритмы, Наработки и Способности
Способ реализации:
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
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован Берги
Отредактирован ArhiMEN
Либо на сайт сюда заливаешь там же, где заливал карту, после чего нажимаешь на "Вставить картинку"