Larcenist
REP: Respect, Envy, Prosperity?
- Reaction score
- 211
Purpose of the spell:
It is supposed to create an illusion of a target unit, and if that illusion is damaged the target is supposed to lose the same percentual amount of health the illusion lost and vice versa, as long as it doesn't drop below 5% of it's max health.
What doesn't work?
The first attack deals no damage at all whatsoever on certain units. On other units the first attack deals tremendous amounts of damage, way more than it really should. Regular attacks also seem to damage one of the units more than the other one most of the times.
Code:
It is supposed to create an illusion of a target unit, and if that illusion is damaged the target is supposed to lose the same percentual amount of health the illusion lost and vice versa, as long as it doesn't drop below 5% of it's max health.
What doesn't work?
The first attack deals no damage at all whatsoever on certain units. On other units the first attack deals tremendous amounts of damage, way more than it really should. Regular attacks also seem to damage one of the units more than the other one most of the times.
Code:
JASS:
scope Voodoo initializer Init
//! runtextmacro HAIL_CreateProperty("Data", "integer", "private")
globals
private constant integer SpellAID = 039;AL06039;
private constant real InitDuration = 3.0
private constant real AdditionalDur = 2.0
endglobals
private function Duration takes integer level returns real
return InitDuration + AdditionalDur * level
endfunction
private struct SpellData
unit caster
unit target
unit illusion
trigger vtrig
trigger vtrig2
timer vtimer
method onDestroy takes nothing returns nothing
call ResetData(.vtimer)
call DestroyTimer(.vtimer)
call ResetData(.vtrig2)
call DestroyTrigger(.vtrig2)
call ResetData(.target)
if .vtrig != null then
call ResetData(.vtrig)
call DestroyTrigger(.vtrig)
endif
endmethod
endstruct
private function TakesDamage takes nothing returns boolean
local SpellData data = GetData(GetTriggeringTrigger())
local real HP
local real maxHP
local real HPPercent
local unit Attacked = GetTriggerUnit()
call DisableTrigger(data.vtrig2)
if Attacked == data.target then
set HP = GetUnitState(data.target, UNIT_STATE_LIFE)
set maxHP = GetUnitState(data.target, UNIT_STATE_MAX_LIFE)
if data.target == null or maxHP == null then
call data.destroy()
else
set HPPercent = HP / maxHP
if HPPercent >= 0.05 then
call SetUnitState(data.illusion, UNIT_STATE_LIFE, HP * HPPercent)
endif
endif
elseif Attacked == data.illusion then
set HP = GetUnitState(data.illusion, UNIT_STATE_LIFE)
set maxHP = GetUnitState(data.illusion, UNIT_STATE_MAX_LIFE)
if data.illusion == null or maxHP == null then
call data.destroy()
else
set HPPercent = HP / maxHP
if HPPercent >= 0.05 then
call SetUnitState(data.target, UNIT_STATE_LIFE, HP * HPPercent)
endif
endif
endif
call EnableTrigger(data.vtrig2)
set Attacked = null
return true
endfunction
private function TrigActions takes nothing returns boolean
local SpellData data = GetData(GetTriggeringTrigger())
if IsUnitIllusion(GetSummonedUnit()) == true then
set data.illusion = GetSummonedUnit()
endif
set data.vtrig2 = CreateTrigger()
call SetData(data.vtrig2, data)
call TriggerRegisterUnitEvent(data.vtrig2, data.target, EVENT_UNIT_DAMAGED)
call TriggerRegisterUnitEvent(data.vtrig2, data.illusion, EVENT_UNIT_DAMAGED)
call TriggerAddCondition(data.vtrig2, Condition(function TakesDamage))
call ResetData(data.vtrig)
call DestroyTrigger(data.vtrig)
set data.vtrig = null
return true
endfunction
private function TimerActions takes nothing returns nothing
local SpellData data
if GetData(GetExpiredTimer()) != 0 then
set data = GetData(GetExpiredTimer())
call data.destroy()
endif
endfunction
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SpellAID
endfunction
private function Actions takes nothing returns nothing
local SpellData data
if GetData(GetSpellTargetUnit()) == 0 then
set data = SpellData.create()
set data.caster = GetTriggerUnit()
set data.target = GetSpellTargetUnit()
set data.vtrig = CreateTrigger()
set data.vtimer = CreateTimer()
call SetData(data.target, data)
call SetData(data.vtimer, data)
call SetData(data.vtrig, data)
call TimerStart(data.vtimer, Duration(GetUnitAbilityLevel(data.caster, SpellAID)), false, function TimerActions)
call TriggerRegisterUnitEvent(data.vtrig, data.caster, EVENT_UNIT_SUMMON)
call TriggerAddCondition(data.vtrig, Condition(function TrigActions))
else
call IssueImmediateOrder(GetTriggerUnit(), "stop")
call DisplayTimedTextToForce(GetForceOfPlayer(GetOwningPlayer(GetTriggerUnit())), 2.0, " |cffffcc00This target is already under the effect of Voodoo.|r")
endif
endfunction
//===========================================================================
private function Init takes nothing returns nothing
local trigger trig = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ(trig, EVENT_PLAYER_UNIT_SPELL_CAST)
call TriggerAddCondition(trig, Condition(function Conditions))
call TriggerAddAction( trig, function Actions )
endfunction
endscope