scope ThunderWraith initializer InitTW // Cho vào scope để dùng đc private
private struct tw // Khi cho vào scope rồi thì có thể dùng private, để WE kô bị "nhầm" với các struct khác
unit caster
unit target
unit dummy
integer int
integer tick
string sfx
endstruct
private function ThunderWraith takes nothing returns nothing // Private ở đây có tác dụng tượng tự trên
local timer ti = GetExpiredTimer()
local tw d = GetTimerData( ti ) // Lấy struct qua timer
local location loc = GetUnitLoc( d.target ) // Lấy vị trí của target
call SetUnitPositionLoc( d.dummy, loc ) // Di chuyển vị trí của dummy tới vị trí của target.
set d.tick = d.tick - 1 // Giảm tick
if d.tick <= 0 then // Hết tick, hết 1s, giật sét 1 lần
call IssueTargetOrder( d.dummy, "chainlightning", d.target)
call DestroyEffect( AddSpecialEffectTarget( "chest", d.target, d.sfx ) )
call UnitDamageTarget( d.caster, d.target, ((35*I2R(GetUnitAbilityLevel(d.caster, 'A004')))+ 15),true,false,ATTACK_TYPE_MAGIC,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
set d.tick = 25 // Set d.tick = 25 để có thể chạy lại từ đầu
set d.int = d.int - 1 // Sét đánh 1 lần, giảm 1 lần.
if d.int <= 0 then // Hết lần đánh sét, end spell.
call KillUnit( d.dummy ) // "Giết" dummy
call ReleaseTimer( ti )
call d.destroy()
endif
endif
call RemoveLocation( loc )
set loc = null
set ti = null
endfunction
private function Act takes nothing returns nothing
local tw d = tw.create() // Tạo struct
local timer ti = NewTimer() // Tạo timer
local location loc // Khai báo biến loc
set d.caster = GetTriggerUnit() // Đặt giá trị cho d.caster là thằng cast spell.
set d.target = GetSpellTargetUnit() // Đặt giá trị cho d.target là thằng bị cast.
set loc = GetUnitLoc( d.target ) // Lấy vị trí của thằng target
set d.sfx = "Abilities\\Spells\\Orc\\LightningShield\\LightningShieldBuff.mdl"
set d.int = 3 // Số lần bị sét đánh
set d.tick = 25 // Tick này khi chạy hết sẽ giảm 1 d.int và chạy lại từ đầu, hết d.int hết thì end spell.
set d.dummy = CreateUnitAtLoc( GetOwningPlayer( d.caster ), 'e001', loc, 0. )
call UnitAddAbility( d.dummy, 'A006' )
call SetTimerData( ti, d ) // Lưu struct vào timer
call TimerStart( ti, 0.04 , true, function ThunderWraith ) // Chạy timer, mỗi 0.04s sẽ chạy 1 lần function ThunderWraith. Nếu để 0.04s giảm 1 d.tick thì hết 1s thì hết d.tick.
call RemoveLocation( loc ) // Remove leak, GUI đã quá quen thuộc rồi
set loc = null // "Null" loc, remove leak
set ti = null
endfunction
private function Cond takes nothing returns boolean
return GetSpellAbilityId() == 'A004'
endfunction
//===========================================================================
private function InitTW takes nothing returns nothing
local trigger TrigTW = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( TrigTW, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition( TrigTW, Condition ( function Cond ))
call TriggerAddAction( TrigTW, function Act )
endfunction
endscope