Array
(
[scriptVersion] => 7
[oeValues] => Array
(
[auto] => Array
(
)
[Art] => ReplaceableTextures\CommandButtons\BTNWitchDoctor.blp
[turnRate] => 0.3
[dmgplus1] => 4755
[bldtm] => 1
[goldcost] => 4600
[sides1] => 1
[manaN] => 40
[acquire] => 800
[upgrades] => Array
(
)
[Upgrade] => Array
(
)
[Name] => Vol'jin the Witch Doctor
[weapTp1] => missile
[MissileHoming] => 1
[file] => units\orc\WitchDoctor\WitchDoctor.mdl
[uberSplat] => OSMA
[Missileart] => Abilities\Weapons\WitchDoctorMissile\WitchDoctorMissile.mdl
[Missilespeed] => 1500
[dice1] => 1
[RngBuff1] => 250
[regenMana] => 1.5
[modelScale] => 0.6
[rangeN1] => 800
[backSw1] => 0.6
[atkType1] => pierce
[cool1] => 2
[Ubertip] => "Try out my Voodoo maaan." credits to der_kleine_Tomy
[abilList] => Array
(
)
[moveHeight] => 33
[dmgpt1] => 0.73
[buildingShadow] => Array
(
)
[castbsw] => 0.52
[targs1] => Array
(
)
[weapsOn] => 1
[castpt] => 0.35
)
[settings] => Array
(
[balanceTip] => |cffFFFF00+3% |rattackspeed/lvl|n|cffFFFF00+8% |rdamage/lvl
[abil_factor] => 0.375
[author] => SirCoqaLot.
[alpha] => 255
[authorDisplay] => SirCoqaLot.
[version] => 1.0
[element] => astral
[rarity] => unique
)
[effects] => Array
(
[0] => Array
(
[x] => 30.6495
[y] => 41.4911
[z] => -44.8
[scale] => 0.65
[rot] => 3.78737
[file] => Doodads\Ruins\Props\RuinsPillar\RuinsPillar2.mdl
[red] => 255
[green] => 255
[blue] => 255
[alpha] => 255
[pitch] => 0
[advanced] => false
[animation] => Array
(
)
[aniSpeed] => 50
)
[1] => Array
(
[x] => -0.643791
[y] => 3.86516
[z] => -19.2
[scale] => 0.55
[rot] => 2.37859
[file] => Doodads\Ruins\Structures\RuinsBuilding\RuinsBuilding1.mdl
[red] => 255
[green] => 255
[blue] => 255
[alpha] => 255
[pitch] => 0
[advanced] => false
[animation] => Array
(
)
[aniSpeed] => 50
)
[2] => Array
(
[x] => -33.6028
[y] => 41.232
[z] => -44.8
[scale] => 0.65
[rot] => 2.3562
[file] => Doodads\Ruins\Props\RuinsPillar\RuinsPillar2.mdl
[red] => 255
[green] => 255
[blue] => 255
[alpha] => 255
[pitch] => 0
[advanced] => false
[animation] => Array
(
)
[aniSpeed] => 50
)
[3] => Array
(
[x] => -43.0318
[y] => -40.6332
[z] => -44.8
[scale] => 0.65
[rot] => 4.36332
[file] => Doodads\Ruins\Props\RuinsPillar\RuinsPillar2.mdl
[red] => 255
[green] => 255
[blue] => 255
[alpha] => 255
[pitch] => 0
[advanced] => false
[animation] => Array
(
)
[aniSpeed] => 50
)
[4] => Array
(
[x] => -18.1515
[y] => -1.18787
[z] => 0
[scale] => 0.1
[rot] => 3.15605
[file] => Doodads\Ruins\Structures\RuinsArchway0_\RuinsArchway0_0.mdl
[red] => 255
[green] => 255
[blue] => 255
[alpha] => 255
[pitch] => -1.55
[advanced] => false
[animation] => Array
(
)
[aniSpeed] => 50
)
[5] => Array
(
[x] => 39.3035
[y] => -47.2271
[z] => -44.8
[scale] => 0.65
[rot] => 5.63115
[file] => Doodads\Ruins\Props\RuinsPillar\RuinsPillar2.mdl
[red] => 255
[green] => 255
[blue] => 255
[alpha] => 255
[pitch] => 0
[advanced] => false
[animation] => Array
(
)
[aniSpeed] => 50
)
[6] => Array
(
[x] => -0.428693
[y] => -31.4557
[z] => 0
[scale] => 0.3
[rot] => 2.41424
[file] => Doodads\Ruins\Structures\RuinsBuilding\RuinsBuilding1.mdl
[red] => 255
[green] => 255
[blue] => 255
[alpha] => 255
[pitch] => 0
[advanced] => false
[animation] => Array
(
)
[aniSpeed] => 50
)
[7] => Array
(
[x] => 21.0413
[y] => -2.58734
[z] => 6.4
[scale] => 0.1
[rot] => 0.0121412
[file] => Doodads\Ruins\Structures\RuinsArchway0_\RuinsArchway0_0.mdl
[red] => 255
[green] => 255
[blue] => 255
[alpha] => 255
[pitch] => -1.55
[advanced] => false
[animation] => Array
(
)
[aniSpeed] => 50
)
[8] => Array
(
[x] => 21.0126
[y] => -1.06811
[z] => 0
[scale] => 0.1
[rot] => 6.27143
[file] => Doodads\Ruins\Structures\RuinsArchway0_\RuinsArchway0_0.mdl
[red] => 255
[green] => 255
[blue] => 255
[alpha] => 255
[pitch] => -1.55
[advanced] => false
[animation] => Array
(
)
[aniSpeed] => 50
)
[9] => Array
(
[x] => -18.1515
[y] => -1.18787
[z] => 6.4
[scale] => 0.1
[rot] => 3.14332
[file] => Doodads\Ruins\Structures\RuinsArchway0_\RuinsArchway0_0.mdl
[red] => 255
[green] => 255
[blue] => 255
[alpha] => 255
[pitch] => -1.55
[advanced] => false
[animation] => Array
(
)
[aniSpeed] => 50
)
[10] => Array
(
[x] => -49.8303
[y] => -7.55039
[z] => -6.4
[scale] => 0.15
[rot] => 3.04305
[file] => Doodads\Terrain\CliffDoodad\Waterfall\Waterfall.mdl
[red] => 255
[green] => 255
[blue] => 255
[alpha] => 255
[pitch] => 0
[advanced] => false
[animation] => Array
(
)
[aniSpeed] => 50
)
[11] => Array
(
[x] => 43.0294
[y] => -10.8368
[z] => -6.4
[scale] => 0.15
[rot] => 6.20243
[file] => Doodads\Terrain\CliffDoodad\Waterfall\Waterfall.mdl
[red] => 255
[green] => 255
[blue] => 255
[alpha] => 255
[pitch] => 0
[advanced] => false
[animation] => Array
(
)
[aniSpeed] => 50
)
[12] => Array
(
[x] => 37.1381
[y] => 1.76902
[z] => 0
[scale] => 0.75
[rot] => 5.06146
[file] => Abilities\Spells\NightElf\MoonWell\MoonWellTarget.mdl
[red] => 255
[green] => 255
[blue] => 255
[alpha] => 255
[pitch] => 0
[advanced] => false
[animation] => Array
(
)
[aniSpeed] => 50
)
[13] => Array
(
[x] => -28.1361
[y] => 5.13231
[z] => 0
[scale] => 0.8
[rot] => 4.99103
[file] => Abilities\Spells\NightElf\MoonWell\MoonWellTarget.mdl
[red] => 255
[green] => 255
[blue] => 255
[alpha] => 255
[pitch] => 0
[advanced] => false
[animation] => Array
(
)
[aniSpeed] => 50
)
[14] => Array
(
[x] => -0.769684
[y] => -20.2385
[z] => 25.6
[scale] => 0.075
[rot] => 4.64599
[file] => Doodads\Ruins\Structures\RuinsArchway0_\RuinsArchway0_0.mdl
[red] => 255
[green] => 255
[blue] => 255
[alpha] => 255
[pitch] => -1.55
[advanced] => false
[animation] => Array
(
)
[aniSpeed] => 50
)
[15] => Array
(
[x] => 15.9636
[y] => -7.30034
[z] => 25.6
[scale] => 0.0625
[rot] => 0.0209271
[file] => Doodads\Ruins\Structures\RuinsArchway0_\RuinsArchway0_0.mdl
[red] => 255
[green] => 255
[blue] => 255
[alpha] => 255
[pitch] => -1.55
[advanced] => false
[animation] => Array
(
)
[aniSpeed] => 50
)
[16] => Array
(
[x] => -18.0239
[y] => -5.19101
[z] => 25.6
[scale] => 0.0625
[rot] => 3.09748
[file] => Doodads\Ruins\Structures\RuinsArchway0_\RuinsArchway0_0.mdl
[red] => 255
[green] => 255
[blue] => 255
[alpha] => 255
[pitch] => -1.55
[advanced] => false
[animation] => Array
(
)
[aniSpeed] => 50
)
)
[dmgTable] => Array
(
[0] => Array
(
[id] => MOD_ATTACKSPEED
[base] => 0
[add] => 0.03
)
[1] => Array
(
[id] => MOD_DAMAGE_BASE_PERC
[base] => 0
[add] => 0.08
)
)
[triggers] => Array
(
[0] => Array
(
[name] => On Attack
[code] => local integer level = tower.getLevel()
local unit towerUnit = tower.getUnit()
local real attackspeed = tower.getCurrentAttackspeed()
local PeriodicEvent periodicEvent = tower.userInt
local real towerUnitZ = GetUnitFlyHeight(towerUnit)
local integer counter = 0
local integer maxWards = 2
local Effect e
local real duration
local real x
local real y
if level == 25 then
set maxWards = 4
elseif level >= 15 then
set maxWards = 3
endif
loop
// Check whether all wards already exist, if not create one
if not HaveSavedInteger(voljin_hashtable, tower, counter) then
set x = LoadReal(voljin_hashtable, tower, counter + 2)
set y = LoadReal(voljin_hashtable, tower, counter + 3)
set e = Effect.createAnimated("units\\orc\\SerpentWard\\SerpentWard.mdl", x, y, towerUnitZ - 20, -(45.0 + 90.0 * (counter / 4)))
call e.setScale(0.4)
set duration = (6.0+tower.getLevel()*0.1) * tower.getProp_BuffDuration()
call SaveInteger(voljin_hashtable, tower, counter, e) // Save the effect
call SaveReal(voljin_hashtable, tower, counter + 1, duration) // Save the duration
set tower.userInt2 = tower.userInt2 + 1 // Save the amount of wards
// The first ward has been created => Start the Periodic Event
if tower.userInt2 == 1 then
call periodicEvent.enableAdvanced(attackspeed, false)
set tower.userReal = attackspeed // Save the periodic interval
endif
exitwhen true // Exit
endif
set counter = counter + 4 // Move to the next ward
exitwhen counter > (maxWards * 4 - 4)
endloop
set towerUnit = null
[values] => Array
(
[visible] => true
[icon] => ReplaceableTextures\CommandButtons\BTNSerpentWard.blp
[name] => Serpent Ward
[short_explain] => Whenever Vol'jin attacks he might summon a serpent ward to assist him.
[ONATTACK_chance] => 0.18
[ONATTACK_chanceLevelAdd] => 0.0028
[long_explain] => Vol'jin has an |cffffff8018%|r chance on attack to summon |cffffff801|r of |cffffff802|r Serpent Wards to assist him. Each ward lasts |cffffff806|r seconds modified by this tower's buff duration, deals |cffffff8020%|r of Vol'jins attack damage and has Vol'jins current attackspeed at cast. Each Ward attacks a random target in |cffffff80800|r range and has a |cffffff8035%|r chance to stack |cffffff80'Maledict'|r on attack. Wards can not be resummoned and their duration cannot be refreshed. |n|n|cffFF8000Level Bonus:|r|n|cffffff80+0.2%|r attackdamage|n|cffffff80+0.1|r seconds duration|n|cffffff80+0.28%|r chance to summon a ward|n|cffffff80+1|r maximum ward at level |cffffff8015|r and |cffffff8025|r
)
)
[1] => Array
(
[name] => Header
[code] => globals
BuffType sir_voljin_debuff
ProjectileType sir_voljin_projectile
hashtable voljin_hashtable
// 0 = Ward 1
// 1 = Duration
// 2/3 = Position(x/y)
// 4 = Ward 2
// ...
endglobals
function damageEvent takes Buff b returns nothing
set b.userReal = b.userReal + Event.damage
endfunction
function expireEvent takes Buff b returns nothing
call b.getCaster().doSpellDamage(b.getBuffedUnit(),(0.15+(0.035+0.0014*b.getCaster().getLevel())*b.getLevel())*R2I(b.userReal),b.getCaster().calcSpellCritNoBonus())
endfunction
function purgeEvent takes Buff b returns nothing
call b.getCaster().doSpellDamage(b.getBuffedUnit(),(0.3+(0.07+0.0028*b.getCaster().getLevel())*b.getLevel())*R2I(b.userReal),b.getCaster().calcSpellCritNoBonus())
endfunction
function ApplyMaledict takes Tower caster, Unit target, boolean B returns nothing
local Buff b = target.getBuffOfType(sir_voljin_debuff)
local real duration = caster.getProp_BuffDuration()
if B == true and b == 0 then
set sir_voljin_debuff.applyAdvanced(caster, target,1, 0, 8.0/duration).userReal = 0.0
elseif (b != 0 and B == false and caster.calcChance(0.35)) or (b != 0 and B == true) then
call sir_voljin_debuff.applyAdvanced(caster, target, b.getLevel() + 1, 0, 8.0/duration)
endif
endfunction
function voljin_hit takes Projectile p, Unit hit returns nothing
local Tower tower = p.getCaster()
call tower.doAttackDamage(hit,tower.getCurrentAttackDamageWithBonus() * (0.2+tower.getLevel()*0.002),tower.calcAttackMulticrit(0,0,0))
call ApplyMaledict(tower,hit,false)
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 voljin_hashtable = InitHashtable()
set sir_voljin_debuff = BuffType.create(0,0,false)
call sir_voljin_debuff.setBuffIcon('@@0@@')
call sir_voljin_debuff.addEventOnDamaged(damageEvent,1,0)
call sir_voljin_debuff.setEventOnExpire(expireEvent)
call sir_voljin_debuff.setEventOnPurge(purgeEvent)
set sir_voljin_projectile=ProjectileType.create("Abilities\\Weapons\\SerpentWardMissile\\SerpentWardMissile.mdl",10.0,1200.0)
call sir_voljin_projectile.enableHoming(ProjectileTargetEvent.voljin_hit,0.0)
endfunction
[values] => Array
(
[visible] => false
[icon] =>
[name] =>
[short_explain] =>
[long_explain] =>
)
)
[2] => Array
(
[name] => On Tower Destruction
[code] => local integer counter = 0
loop
if HaveSavedInteger(voljin_hashtable, tower, counter) then
call Effect(LoadInteger(voljin_hashtable, tower, counter)).destroy()
endif
set counter = counter + 4
exitwhen counter > 12
endloop
call FlushChildHashtable(voljin_hashtable, tower)
[values] => Array
(
[visible] => false
[icon] =>
[name] =>
[short_explain] =>
[long_explain] =>
)
)
[3] => Array
(
[name] => On Damage
[code] => local Unit creep = Event.getTarget()
local real damage = Event.damage
local integer numPurgedBuffs = 0
// Remove buffs (positive and negative buffs) and count them
if tower.userInt3 <= Game.getGameTime() then
set tower.userInt3 = Game.getGameTime()+100-tower.getLevel() // adding the cd
loop
exitwhen not (creep.purgeBuff(true) or creep.purgeBuff(false))
set numPurgedBuffs = numPurgedBuffs + 1
endloop
set damage = damage*(1+numPurgedBuffs*(0.12+tower.getLevel()*0.0016)) // 12% damage
set Event.damage = damage
if numPurgedBuffs != 0 then
call tower.getOwner().displaySmallFloatingText(I2S(R2I(damage)),tower,255,150,255,0)
endif
endif
[values] => Array
(
[ONDAMAGE_chance] => 1.0
[visible] => true
[icon] => ReplaceableTextures\CommandButtons\BTNRegenerate.blp
[name] => Purify
[short_explain] => Whenever Vol'jin deals damage to a creep he purges it and deals additional damage.
[ONDAMAGE_chanceLevelAdd] => 0.0
[long_explain] => Whenever Vol ' jin deals damage he purges all buffs and debuffs from his target, increasing his damage dealt on that attack by |cffffff8012%|r for each purged effect. This ability has a |cffffff804|r second cooldown.|n|n|cffFF8000Level Bonus:|r|n|cffffff80-0.04|r seconds cooldown|n|cffffff80+0.16%|r damage per purged effect
)
)
[4] => Array
(
[name] => Periodic
[code] => local Effect e
local Unit u
local Projectile p
local PeriodicEvent periodicEvent = tower.userInt
local Iterate it
local Unit array targets
local integer numTargets = 0
local integer counter = 0
local real duration
local real facing
local real x
local real y
// If it's the first time this event fires
if periodicEvent == 0 then
set tower.userInt = Event.getCurrentPeriodicEvent() // Save the event
call Event.getCurrentPeriodicEvent().disable() // Disable it
return
endif
// Get all targets in range
set it = Iterate.overUnitsInRangeOfCaster(tower,TARGET_CREEPS,800)
loop
set u = it.next()
exitwhen u == 0
set targets[numTargets] = u
set numTargets = numTargets + 1
endloop
loop
// Is there a ward ?
if HaveSavedInteger(voljin_hashtable, tower, counter) then
set e = LoadInteger(voljin_hashtable, tower, counter) // Load ward effect
set u = targets[GetRandomInt(0, numTargets - 1)] // Get a random target
set duration = LoadReal(voljin_hashtable, tower, counter + 1) - tower.userReal // Set duration to duration - periodic interval
if duration > 0 then // Is there duration remaining?
if u != 0 then // Is there are unit which can be attacked ?
// Load position
set x = LoadReal(voljin_hashtable, tower, counter + 2)
set y = LoadReal(voljin_hashtable, tower, counter + 3)
// Calculate the angle between the ward and the target
set facing = Atan2(GetUnitY(u.getUnit()) - y, GetUnitX(u.getUnit()) - x) * bj_RADTODEG
call e.setFacing(facing) // Set facing
call e.setAnimation("attack") // Play attack animation
// Shoot prohectile
set p = Projectile.createFromPointToUnit(sir_voljin_projectile, tower, 1.0, 1.0, x, y, 147.0, u, true, false, false)
call p.setScale(0.4)
call e.queueAnimation("stand") // Play the stand animation again
endif
// Save the remaining duration
call SaveReal(voljin_hashtable, tower, counter + 1, duration)
else // No more duration
// Remove the ward effect from the hashtable
call RemoveSavedInteger(voljin_hashtable, tower, counter)
call e.destroy() // Destroy the ward
set tower.userInt2 = tower.userInt2 - 1 // Decrease the ward counter
endif
endif
set counter = counter + 4 // Next ward
// Up to 4 wards with each taking 4 storage places in the hashtable starting at 0
// => 4 wards * 4 places - 4
exitwhen counter > (4 * 4 - 4)
endloop
// Disable the event
call periodicEvent.disable()
// Are there any wards?
if tower.userInt2 > 0 then
// Activate the event
set tower.userReal = tower.getCurrentAttackspeed()
call periodicEvent.enableAdvanced(tower.getCurrentAttackspeed() ,false)
endif
[values] => Array
(
[visible] => false
[PERIODIC_period] => 0.1
[icon] =>
[name] =>
[short_explain] =>
[long_explain] =>
)
)
[5] => Array
(
[name] => Autocast
[code] => local Iterate it = Iterate.overUnitsInRangeOfUnit(tower,TARGET_CREEPS,tower,800)
local Unit u
loop
set u = it.next()
exitwhen u == 0
call ApplyMaledict(tower,u,true)
endloop
[values] => Array
(
[AUTOCAST_cooldown] => 5
[AUTOCAST_autoRange] => 800
[AUTOCAST_manacost] => 30
[icon] => ReplaceableTextures\CommandButtons\BTNBigBadVoodooSpell.blp
[AUTOCAST_range] => 800
[AUTOCAST_targetType] => 0
[AUTOCAST_numBuffsBeforeIdle] => 0
[caster_art] =>
[long_explain] => Vol'jin jinxes all units in |cffffff80800|r range around him. Targets caught by the jinx are dealt |cffffff8015%|r of the damage they received as spell damage after |cffffff808|r seconds. Maledict stacks, with each stack adding |cffffff803.5%|r additional damage. If Maledict is purged it deals double damage. This ability is unaffected by Buff Duration. |n|n|cffFF8000Level Bonus:|r|n|cffffff80+0.14%|r damage per stack
[target_art] =>
[AUTOCAST_autocastType] => AC_TYPE_OFFENSIVE_IMMEDIATE
[AUTOCAST_buffType] => 0
[AUTOCAST_isExtended] => true
[name] => Maledict
[AUTOCAST_targetSelf] => false
[short_explain] => Vol'jin jinxes an area and deals magic damageto the targets based on the damage they received.
)
)
[6] => Array
(
[name] => On Tower Creation
[code] => local real towerX = tower.getX()
local real towerY = tower.getY()
set tower.userInt = 0 // Contains the Periodic Event
set tower.userInt2 = 0 // Stores the amount of wards
set tower.userReal = 0 // Stores the periodic interval
set tower.userInt3 = Game.getGameTime()-100 // stores the cooldown of purify
// Ward 1
call SaveReal(voljin_hashtable, tower, 2, towerX + 38)
call SaveReal(voljin_hashtable, tower, 3, towerY - 53)
// Ward 2
call SaveReal(voljin_hashtable, tower, 6, towerX - 43)
call SaveReal(voljin_hashtable, tower, 7, towerY - 45)
// Ward 3
call SaveReal(voljin_hashtable, tower, 10, towerX - 33)
call SaveReal(voljin_hashtable, tower, 11, towerY + 38)
// Ward 4
call SaveReal(voljin_hashtable, tower, 14, towerX + 35)
call SaveReal(voljin_hashtable, tower, 15, towerY + 38)
[values] => Array
(
[visible] => false
[icon] =>
[name] =>
[short_explain] =>
[long_explain] =>
)
)
)
[abilities] => Array
(
)
[buffs] => Array
(
[0] => Array
(
[id] => @@0@@
[derivedFrom] => BHav
[oeValues] => Array
(
[Targetattach] => overhead
[EditorName] => Maledict
[Buffubertip] => This unit suffers from Maledict; it will be dealt spell damage when Maledict ends or is purged.
[TargetArt] => Abilities\Spells\Orc\SpiritLink\SpiritLinkTarget.mdl
[Targetattachcount] => 1
[Bufftip] => Maledict
[Buffart] => ReplaceableTextures\CommandButtons\BTNBigBadVoodooSpell.blp
)
)
)
[units] => Array
(
)
[references] => Array
(
)
)