Planar Gate v1
3200
|
ID: 651
Family ID:
Author: Majildian
Rarity: unique
Element: astral
Attack Type: Energy
Attack Range: 700
Attack CD: 2.5
Damage: 3573-3573
Mana: 1200
Mana regen: 12
Status: Approved
|
Astral Eruption
Releases a huge wave of astral power through the gate, weakening the boundary between the planes. This empowers all currently alive falcons and any that are created during the next 6 seconds, allowing them to deal double damage and partially shift their targets into the astral plane, increasing the damage they take from astral towers by 1% of the falcon's current damage ratio. Level Bonus: +0.18 seconds AC_TYPE_OFFENSIVE_IMMEDIATE 1000, 0 range, 35s cooldown
Planeshift
On attack the Gate releases a magical falcon to hunt down its enemies. The falcon deals energy damage equal to the Gate's current attack damage and bounces until it runs out of damage. Each bounce deals 5% less damage. There is a maximum of 1 falcon summoned at a time and a 20% chance to ignore the maximum. Level Bonus: -0.1% damage loss per bounce +1 falcon every 8 levels |
Download
Toggle Triggers Autocast
caster_art:
AUTOCAST_cooldown: 35
AUTOCAST_numBuffsBeforeIdle: 0
AUTOCAST_isExtended: false
AUTOCAST_autocastType: AC_TYPE_OFFENSIVE_IMMEDIATE
AUTOCAST_manacost: 1000
AUTOCAST_range: 0
AUTOCAST_buffType: Maj_astralEruption
AUTOCAST_targetSelf: true
AUTOCAST_targetType: 0
target_art:
AUTOCAST_autoRange: 700
private function onAutocast takes Tower tower returns nothing
local real x = tower.getX()
local real y = tower.getY()
call Maj_astralEruption.apply(tower, tower, tower.getLevel())
call Effect.createColored("Abilities\\Spells\\Orc\\Voodoo\\VoodooAura.mdl", x, y, 0, 0, 1, 1, 255, 255, 255).setLifetime(0.5)
call TriggerSleepAction(0.3)
call Effect.createColored("Abilities\\Spells\\Orc\\Voodoo\\VoodooAura.mdl", x, y, 0, 0, 2, 1, 255, 255, 255).setLifetime(0.5)
call TriggerSleepAction(0.3)
call Effect.createColored("Abilities\\Spells\\Orc\\Voodoo\\VoodooAura.mdl", x, y, 0, 0, 3, 1, 255, 255, 255).setLifetime(0.5)
endfunction
Header globals
ProjectileType Maj_bouncingProj
BuffType Maj_astralEruption
BuffType Maj_astralDmgModBuff
endglobals
// p.userInt = number of crits
// p.userInt2 = UID
// p.userInt3 = check for buff
// p.userReal = damage loss per bounce
// p.userReal2 = damage ratio of this projectile
// p.userReal3 = damage to deal
function bounce takes Projectile p, Unit target returns nothing
local Tower tower = p.getCaster()
local Iterate it
local Unit next
local Projectile P
local Playor pl
local integer intVar
local string critStr
local real dmgMod
local Buff b
//Check if this projectile has damage ratio left and if the target is still alive.
if p.userReal2 > 0 and target.getUID() == p.userInt2 then
//Set the locals.
set it = Iterate.overUnitsInRangeOfUnit(tower, TARGET_CREEPS, target, 500)
set intVar = 0
set critStr = ""
set b = target.getBuffOfType(Maj_astralDmgModBuff)
//Check if the tower cast the buff since the last time this projectile hit.
if tower.getBuffOfType(Maj_astralEruption) > 0 and p.userInt3 == 0 then
set p.userInt3 = 1
endif
//Check if the tower crit this attack, and if so, display the damage colored red above the tower
//with exclamation marks after it equal to the number of crits. This only runs the first time the
//projectile hits because p.userInt is set to 0 at the end.
if p.userInt > 0 then
set pl = tower.getOwner()
set intVar = 0
loop
set critStr = critStr + "!"
set intVar = intVar + 1
exitwhen intVar == p.userInt
endloop
call pl.displayFloatingText(I2S(R2I(p.userReal3)) + critStr, tower, 255, 0, 0)
endif
//Check if the buff was applied on the tower when it launched this projectile, and if
//the target isn't immune then increase the damage it takes from astral, and apply the
//buff or if the buff was already applied, increase the amount of damage taken to remove
//when the buff gets purged or similar.
if p.userInt3 == 1 then
if target.isImmune() == false then
set dmgMod = p.userReal2*0.01
call target.modifyProperty(MOD_DMG_FROM_ASTRAL, dmgMod)
if b > 0 then
set b.userReal = b.userReal+dmgMod
else
set b = Maj_astralDmgModBuff.apply(tower,target,0)
set b.userReal = dmgMod
endif
endif
endif
// Deal the damage (double if the projectile got buffed).
call tower.doAttackDamage(target,p.userReal3 * p.userReal2 * (1+p.userInt3),1)
//Choose a target from all creeps in 500 range that isn't this projectile's target.
set next = it.nextRandom()
if next == target and next != 0 then
set next = it.nextRandom()
endif
//If no valid targets in range, end here and decrease tower's userInt so portal can fire again.
if next == 0 then
set tower.userInt = tower.userInt - 1
return
endif
call it.destroy()
//Fire the projectile to the next unit and set all the necessary values.
set P = Projectile.createLinearInterpolationFromUnitToUnit(Maj_bouncingProj, tower, 1, 1, target, next, .35, true)
set P.userInt = 0
set P.userInt2 = next.getUID()
set P.userInt3 = p.userInt3
set P.userReal = p.userReal
set P.userReal2 = p.userReal2-p.userReal //decrease new projectile's damage multiplier
set P.userReal3 = p.userReal3
//Or if the projectile had no damage ratio, end here and decrease the tower userInt.
else
set tower.userInt = tower.userInt - 1
endif
endfunction
//In case the buff gets purged.
function removeMod takes Buff b returns nothing
call b.getBuffedUnit().modifyProperty(MOD_DMG_FROM_ASTRAL, -b.userReal)
endfunction
//Do not remove or rename this function!
//Put your initialization tasks here, this function will be called on map init
private function init takes nothing returns nothing
set Maj_astralEruption = BuffType.create(6, 0.18, true)
set Maj_astralDmgModBuff = BuffType.create(-1, 0, false)
set Maj_bouncingProj = ProjectileType.createInterpolate("Abilities\\Weapons\\MurgulMagicMissile\\MurgulMagicMissile.mdl", 1250)
call Maj_bouncingProj.setEventOnInterpolationFinished(ProjectileTargetEvent.bounce)
call Maj_astralEruption.setBuffIcon('@@0@@')
call Maj_astralDmgModBuff.setBuffIcon('@@1@@')
call Maj_astralDmgModBuff.addEventOnCleanup(removeMod)
endfunction
On Attack
ONATTACK_chance: 1.0
ONATTACK_chanceLevelAdd: 0.0
function onAttack takes Tower tower returns nothing
local Unit target
local integer crits
local real curDmg
local Projectile p
local Buff b
//Check if the amount of birds summoned is low enough to create another one.
if tower.userInt < R2I(1+(tower.getLevel()/8)) or tower.calcChance(0.20) then
//Set the locals.
set target = Event.getTarget()
set crits = tower.getNumberOfCrits()
set curDmg = tower.getCurrentAttackDamageWithBonus()
set b = tower.getBuffOfType(Maj_astralEruption)
//Set the projectile values.
set p = Projectile.createLinearInterpolationFromUnitToUnit(Maj_bouncingProj, tower, 1, 1, tower, target, .5, true)
set p.userInt2 = target.getUID()
set p.userReal = 0.05-(tower.getLevel()*0.001) //damage multiplier loss per bounce
set p.userReal2 = 1 //Projectile's current damage multiplier
if b > 0 then
set p.userInt3 = 1
else
set p.userInt3 = 0
endif
//Check for crits.
if (crits > 0) then
set p.userReal3 = curDmg * (crits * (tower.getProp_AtkCritDamage() - 1) + 1)
set p.userInt = crits
else
set p.userReal3 = curDmg
set p.userInt = 0
endif
//Increase counter for birds summoned.
set tower.userInt = tower.userInt+1
endif
//Remove crits so a 0! doesn't pop up over the tower.
call tower.resetAttackCrits()
endfunction
On Damage
ONDAMAGE_chance: 1.0
ONDAMAGE_chanceLevelAdd: 0.0
function onDamage takes Tower tower returns nothing
//Set damage to 0 so the tower doesn't deal 2x damage on first hit.
set Event.damage = 0
endfunction
On Tower Creation function onCreate takes Tower tower returns nothing
set tower.userInt = 0
endfunction
|
Description: