Prometheus
Everything is mutable; nothing is sacred
- Reaction score
- 589
Includes~
MUI
Non Laggy
Fun
and if placed on a large map, screwing over your enemies!
endIncludes~
A spell I made for a spell contest, this spell simply throws units to any point in the map.
Throws 4/8/12 units and has 3 levels.
MUI
Non Laggy
Fun
and if placed on a large map, screwing over your enemies!
endIncludes~
A spell I made for a spell contest, this spell simply throws units to any point in the map.
Throws 4/8/12 units and has 3 levels.
Code:
Changelog:
1.00 > Released
1.10 > Loop Return Leak Removed
1.50 > Couple of constants added, globals used, BJs removed, reals used
JASS:
globals
real rx
real ry
unit move
endglobals
constant function Spell_Raw_Code takes nothing returns integer
return 039;A000039; //This is the spell ID, change 'A000' to your spell ID, keep the ' and '.
endfunction
constant function damage takes nothing returns real //This is the damage done, when it is used it is multiplied by the level of the ability.
return 50.00 //Change this to modify the damage.
endfunction
function isally takes nothing returns boolean
return IsUnitAlly(GetFilterUnit(), GetOwningPlayer(GetTriggerUnit())) == false and GetWidgetLife(GetFilterUnit()) > 0.405 == true //This tells the spell not to throw around dead or allied units.
endfunction
function IsPointNotPathable takes nothing returns boolean
return IsTerrainPathable(rx, ry, PATHING_TYPE_WALKABILITY)
endfunction
function move takes nothing returns nothing
local integer looz = 1
loop
exitwhen looz >= 15
if IsPointNotPathable() then
call SetUnitPosition(move, rx, ry)
set looz = 15
else
set rx = GetRandomReal(GetRectMinX(GetPlayableMapRect()), GetRectMaxX(GetPlayableMapRect()))
set ry = GetRandomReal(GetRectMinY(GetPlayableMapRect()), GetRectMaxY(GetPlayableMapRect()))
set looz = looz + 1
endif
endloop
endfunction
function Trig_Blink_Throw_Actions takes nothing returns nothing
local unit caster = GetTriggerUnit()
local location caspos = GetUnitLoc(caster)
local real cx = GetUnitX(caster)
local real cy = GetUnitY(caster)
local integer level = GetUnitAbilityLevel(GetTriggerUnit(), 039;A000039;)
local boolexpr isall = Condition(function isally)
local group g = GetUnitsInRangeOfLocMatching((level * 100) + 400, caspos, isall)
local group randus = GetRandomSubGroup(level * 4, g)
local integer loopa = 1
local location rand
local integer num = CountUnitsInGroup(randus)
call GroupClear(g)
call DestroyGroup(g)
loop
exitwhen loopa > level * 4
set move = GroupPickRandomUnit(randus)
set rx = GetRandomReal(GetRectMinX(GetPlayableMapRect()), GetRectMaxX(bj_mapInitialPlayableArea))
set ry = GetRandomReal(GetRectMinY(GetPlayableMapRect()), GetRectMaxY(bj_mapInitialPlayableArea))
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\NightElf\\Blink\\BlinkCaster.mdl", move, "origin")) //This and the below line create that cool blink effect.
call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\NightElf\\Blink\\BlinkCaster.mdl", rx, ry))
call move()
call GroupRemoveUnit(randus, move)
call RemoveLocation(rand)
set loopa = loopa + 1
call UnitDamageTarget(caster, move, damage() * level, true, true, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_UNIVERSAL, WEAPON_TYPE_WHOKNOWS) //This does the damage.
set num = CountUnitsInGroup(randus)
if num == 0 then //This if/endif checks if there are no more units and if there are, it stops.
set caster = null
set move = null
call RemoveLocation(caspos)
set caspos = null
call GroupClear(randus)
call DestroyGroup(randus)
set randus = null
call DestroyBoolExpr(isall)
return
endif
endloop
set caster = null
set move = null
call RemoveLocation(caspos)
set caspos = null
call DestroyGroup(randus)
set randus = null
set rand = null
call DestroyBoolExpr(isall)
endfunction
//===========================================================================
function Trig_Blink_Throw_Conditions takes nothing returns boolean
return GetSpellAbilityId() == Spell_Raw_Code()
endfunction
function InitTrig_Blink_Throw takes nothing returns nothing
set gg_trg_Blink_Throw = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_Blink_Throw, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(gg_trg_Blink_Throw, Condition( function Trig_Blink_Throw_Conditions))
call TriggerAddAction(gg_trg_Blink_Throw, function Trig_Blink_Throw_Actions)
endfunction