kingkingyyk3
Visitor (Welcome to the Jungle, Baby!)
- Reaction score
- 216
This spell is from DotA v6.60 that released yesterday...
A mystic snake made of energy jumps from target to target dealing damage and stealing some energy. After it reaches its last target, it jumps back to Medusa to replenish her mana. The snake deals more damage and steals more mana per jump. The snake power increased by 20% per jump.
Level 1 - 60 base damage, 20 base mana, 3 Jumps
Level 2 - 100 base damage, 30 base mana, 4 Jumps
Level 3 - 140 base damage, 40 base mana. 5 Jumps
Level 4 - 180 base damage, 50 base mana, 6 Jumps
Screenshot! :
Hope you like it.
A mystic snake made of energy jumps from target to target dealing damage and stealing some energy. After it reaches its last target, it jumps back to Medusa to replenish her mana. The snake deals more damage and steals more mana per jump. The snake power increased by 20% per jump.
Level 1 - 60 base damage, 20 base mana, 3 Jumps
Level 2 - 100 base damage, 30 base mana, 4 Jumps
Level 3 - 140 base damage, 40 base mana. 5 Jumps
Level 4 - 180 base damage, 50 base mana, 6 Jumps
JASS:
/////////////////////////////////////////////////////////////////////////////////////////////
// ~~~~~Mystic Snake~~~~~~~ //
// ~~by kingking~~ //
// //
// Things needed for this spell : //
// 1) Missle Dummy //
// 2) This script //
// 3) Key Timers 2 //
// 4) Jass NewGen Pack v5b or newer to compile //
// //
// Original Created by : IceFrog, the one who make DotA.. //
/////////////////////////////////////////////////////////////////////////////////////////////
scope MysticSnake initializer Init
globals
private constant integer ABIL_ID = 039;A000039; //Ability's ID
private constant real PERCENT_INCREASE_PER_JUMP = 20. //Damage and Mana loss factor
private constant real AOE = 475. //Pick Unit AoE
private constant integer MISSLE_DUMMY_ID = 039;h003039; //Missle Dummy's ID
private constant real MISSLE_SPEED = 20. //Speed of Missle Slide
private constant real TIMER_INTERVAL = .03125 //Timer Callback Interval
private constant attacktype ATTACK_TYPE = ATTACK_TYPE_MAGIC //Damage's attack type
private constant damagetype DAMAGE_TYPE = DAMAGE_TYPE_MAGIC //Damage's damage type
private integer TempIndex
endglobals
/////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////Restricted area for newbies//////////////////////////////////////////
private struct Data
unit cs
integer lv
real dmg
real mana
group damaged
integer jumptimes
unit target1
unit target2
boolean nullz
group temp
player p
unit missle
real x
real y
boolean complete_jump
method onDestroy takes nothing returns nothing
call KillUnit(.missle)
call GroupClear(.damaged)
call DestroyGroup(.damaged)
endmethod
endstruct
private function JumpCount takes integer i returns integer
return 2 + i
endfunction
private function DamageCount takes real r returns real
return (40. * r + 20.) * .8
endfunction
private function ManaCount takes real r returns real
return (10. * r + 10.) * .8
endfunction
private function Cond takes nothing returns boolean
return GetSpellAbilityId() == ABIL_ID
endfunction
private function Move takes nothing returns boolean
local Data d = KT_GetData()
local real x = GetUnitX(d.missle)
local real y = GetUnitY(d.missle)
local real tx = GetUnitX(d.target2)
local real ty = GetUnitY(d.target2)
local real dx = x - tx
local real dy = y - ty
local real angle = 57.296 * Atan2(dy,dx) - 180.
if (dx * dx + dy * dy) > 100. and GetWidgetLife(d.target2) > .405 then
call SetUnitFacing(d.missle,angle)
call SetUnitPosition(d.missle,x + MISSLE_SPEED * Cos(angle * bj_DEGTORAD),y + MISSLE_SPEED * Sin(angle * bj_DEGTORAD))
return false
else
set d.dmg = d.dmg * (1. + (0.01 * PERCENT_INCREASE_PER_JUMP))
set d.mana = d.mana * (1. + (0.01 * PERCENT_INCREASE_PER_JUMP))
call UnitDamageTarget(d.cs,d.target2,d.dmg,FALSE,FALSE,ATTACK_TYPE,DAMAGE_TYPE,null)
call SetUnitState(d.target2,UNIT_STATE_MANA,GetUnitState(d.target2,UNIT_STATE_MANA) - d.mana)
set d.complete_jump = true
return true
endif
endfunction
private function MoveBack takes nothing returns boolean
local Data d = KT_GetData()
local real x = GetUnitX(d.missle)
local real y = GetUnitY(d.missle)
local real tx = GetUnitX(d.cs)
local real ty = GetUnitY(d.cs)
local real dx = x - tx
local real dy = y - ty
local real angle = 57.296 * Atan2(dy,dx) - 180.
if (dx * dx + dy * dy) > 100. then
call SetUnitPosition(d.missle, x + MISSLE_SPEED * Cos(angle * bj_DEGTORAD), y + MISSLE_SPEED * Sin(angle * bj_DEGTORAD))
return false
else
call SetWidgetLife(d.cs,GetWidgetLife(d.cs) + d.dmg)
call SetUnitState(d.cs,UNIT_STATE_MANA,GetUnitState(d.cs,UNIT_STATE_MANA) + d.mana)
set d.complete_jump = true
return true
endif
endfunction
private function Pick takes nothing returns boolean
local Data d = TempIndex
return GetWidgetLife(GetFilterUnit()) > .405 and not IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE) and not IsUnitType(GetFilterUnit(),UNIT_TYPE_MAGIC_IMMUNE) and IsUnitEnemy(GetFilterUnit(),d.p) and not IsUnitInGroup(GetFilterUnit(),d.damaged)
endfunction
private function Act takes nothing returns nothing
local Data d = Data.create()
local unit u
set d.cs = GetTriggerUnit()
set d.target1 = GetTriggerUnit()
set d.target2 = GetSpellTargetUnit()
set d.lv = GetUnitAbilityLevel(d.cs,ABIL_ID)
set d.dmg = DamageCount(d.lv)
set d.mana = ManaCount(d.lv)
set d.jumptimes = JumpCount(d.lv) - 1
set d.p = GetOwningPlayer(d.cs)
set d.missle = CreateUnit(d.p,MISSLE_DUMMY_ID,GetUnitX(d.cs),GetUnitY(d.cs),0.)
set d.nullz = false
set d.complete_jump = false
set d.damaged = CreateGroup()
call KT_Add(function Move,d,TIMER_INTERVAL)
loop
exitwhen d.complete_jump == true
call TriggerSleepAction(.3)
endloop
set d.target1 = d.target2
loop
exitwhen d.jumptimes == 0 or d.nullz == true
set d.temp = CreateGroup()
set d.x = GetUnitX(d.target1)
set d.y = GetUnitY(d.target1)
set TempIndex = d
call GroupEnumUnitsInRangeCounted(d.temp,d.x,d.y,AOE,Condition(function Pick),1)
set u = FirstOfGroup(d.temp)
if d.target2 != null then
set d.target2 = u
call SetUnitX(d.missle,GetUnitX(d.target1))
call SetUnitY(d.missle,GetUnitY(d.target1))
call KT_Add(function Move,d,TIMER_INTERVAL)
loop
exitwhen d.complete_jump == true
call TriggerSleepAction(.3)
endloop
call GroupAddUnit(d.damaged,d.target2)
set d.complete_jump = false
set d.target1 = d.target2
call GroupClear(d.temp)
call DestroyGroup(d.temp)
else
set d.nullz = true
endif
set d.jumptimes = d.jumptimes - 1
endloop
call KT_Add(function MoveBack,d,TIMER_INTERVAL)
set d.complete_jump = false
loop
exitwhen d.complete_jump == true
call TriggerSleepAction(.3)
endloop
call d.destroy()
set u = null
endfunction
private function Init takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(t,EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(t,Condition(function Cond))
call TriggerAddAction(t,function Act)
set t = null
endfunction
endscope
Screenshot! :
Hope you like it.