cr4xzZz
Also known as azwraith_ftL.
- Reaction score
- 51
Shadow Word
Really simple spell. Had nothing to do and decided to make it.
GUI/JASS/vJASS? vJASS.
MUI? Yes.
Leakless? Yes.
Lagless? Yes.
Follows JESP? It should.
Requires?
- JASS NewGen Pack v1.5a
- ABCT v2.0
Description:
A single word causes powerful magics to envelop the target. Creates a healing mechanism on a friendly target or damages an unfriendly one. Does not dispel on attack, cannot be purged. Lasts 8 seconds.
Level 1 - Heals or damages 10 hit points per second.
Level 2 - Heals or damages 20 hit points per second.
Level 3 - Heals or damages 30 hit points per second.
Level 4 - Heals or damages 40 hit points per second.
Code:
JASS:
scope ShadowWord
//###########################################################
// CONFIGURATION MENU
//###########################################################
globals
// Raw code of the Shadow Word ability
private constant integer AID_RAW = 039;A000039;
// Interval between healing/damaging
private constant real INTERVAL = 1.
// Effect on the unit if it is an enemy
private constant string ENEMY_SFX = "Abilities\\Spells\\Orc\\Voodoo\\VoodooAuraTarget.mdl"
// Effect on the unit if it is an ally
private constant string ALLY_SFX = "Abilities\\Spells\\Items\\StaffOfSanctuary\\Staff_Sanctuary_Target.mdl"
// Attachment point of the special effect
private constant string ATTACH_POINT = "chest"
endglobals
// Damage dealt by Shadow Word ability if the target is an enemy
private constant function DAMAGE takes integer whichLvl returns real
return whichLvl * 10.
endfunction
// Heal amount by Shadow Word ability if the target is an ally
private constant function HEAL takes integer whichLvl returns real
return whichLvl * 10.
endfunction
// Duration of the Shadow Word ability
private constant function DURATION takes integer whichLvl returns integer
return 8
//return 7 + (1 * whichLvl) <--- could be something like this
endfunction
//###########################################################
// END CONFIGURATION MENU
//###########################################################
private struct Data
unit hero
unit target
real value
integer ticks
effect sfx
method onDestroy takes nothing returns nothing
call DestroyEffect(.sfx)
endmethod
endstruct
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == AID_RAW
endfunction
private function Callback takes nothing returns boolean
local Data d = ABCT_GetData()
if IsUnitAlly(d.target, GetOwningPlayer(d.hero)) or d.hero == d.target then
call SetWidgetLife(d.target, GetWidgetLife(d.target) + d.value)
else
call UnitDamageTarget(d.hero, d.target, d.value, true, true, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, null)
endif
set d.ticks = d.ticks - 1
if d.ticks <= 0 or GetWidgetLife(d.target) < 0.405 then
call d.destroy()
return true
endif
return false
endfunction
private function Actions takes nothing returns nothing
local Data d = Data.create()
local integer lvl
set d.hero = GetTriggerUnit()
set d.target = GetSpellTargetUnit()
set lvl = GetUnitAbilityLevel(d.hero, AID_RAW)
if IsUnitAlly(d.target, GetOwningPlayer(d.hero)) == true or d.hero == d.target then
set d.value = HEAL(lvl)
set d.sfx = AddSpecialEffectTarget(ALLY_SFX, d.target, ATTACH_POINT)
else
set d.value = DAMAGE(lvl)
set d.sfx = AddSpecialEffectTarget(ENEMY_SFX, d.target, ATTACH_POINT)
endif
set d.ticks = R2I(DURATION(lvl) / INTERVAL)
call ABCT_Start(function Callback, d, INTERVAL)
endfunction
function InitTrig_ShadowWord takes nothing returns nothing
local trigger trig = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(trig, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(trig, Condition(function Conditions))
call TriggerAddAction(trig, function Actions)
endfunction
endscope
Implementation instructions can be found in the map.
Screenshots:
Credits:
Credits to Cohadar for ABCT and Tinki3 for the Test Map Template.