Code:
// trigger condition
function AT_condition takes nothing returns boolean
return GetSpellAbilityId() == 'H000'
endfunction
// filter ketika damage unit
function AT_Filter takes nothing returns boolean
return IsPlayerEnemy(GetOwningPlayer(GetTriggerUnit()), GetOwningPlayer(GetFilterUnit())) and GetWidgetLife(GetFilterUnit()) > 0.405
endfunction
// Copy group ...
function US_CopyGroup takes group g returns group
set bj_groupAddGroupDest = CreateGroup()
call ForGroup(g, function GroupAddGroupEnum)
return bj_groupAddGroupDest
endfunction
// this function responsible in increasing burst level
function charge_burst takes nothing returns nothing
// mencari timer yang tadi distart pada fungsi sebelumnya
local timer t = GetExpiredTimer()
// mengambil nama string dari timer ( untuk indentitas ), exec dalam fungsi ini memiliki nilai yang sama dengan exec di fungsi sebelumnya karena itu string dari timer adalah seperti identitas alamat dalam mengambil data dari gamecache
local string exec = H2S(t)
// mengambil integer dari burst
local integer burst = GetStoredInt ( exec,"burst")
// mengambil integer dari maxburst
local integer maxburst = GetStoredInt ( exec,"maxburst")
// line logikal untuk menambah burst, karena timer digunakan maka fungsi ini aka diulang terus menerus ( repeating timer dengan waktu periodik 0.5 detik
set burst = burst + 1
if burst > maxburst then
set burst = maxburst
endif
// menyimpan value dari burst
call StoreDataInteger( exec, "burst", burst )
// remove memory leak
// not yet
endfunction
// this function responsible for inflicting damage
function damage_burst takes nothing returns nothing
// catatan : dalam get stored saya menggunakan exec dan exe ... perhatikan baik2x karena ada gamecache yang diambil dari sisi timer dan ada yang dari sisi trigger
// mengambil nama string dari trigger untuk identitas ( trigger endcast dari fungsi charge_actions
local string exec = H2S(GetTriggeringTrigger())
// mengambil timer yang disimpan pada exec, get expired timer tidak bisa digunakan karena timer distart bukan untuk fungsi ini
local timer tn = GetStoredTimer (exec,"timer")
// mengambil string dari timer untuk identitas
local string exe = H2S(tn)
// mengambil value burst ( value ini sudah berubah karena adanya fungsi charge_burst yang di execute lebih dulu ; seperti meng-overwrite data dalam gamecache )
local integer burst = GetStoredInt( exe ,"burst")
// mengambil lokasi dari gamecache
local location lcc = GetStoredLocation ( exe ,"target")
// mengambil unit dari gamecache
local unit cst = GetStoredUnit (exe, "caster")
// the utilities
// filter untuk damage area
local boolexpr b = Condition(function AT_Filter)
local group g = CreateGroup()
local group n
local unit f
// line untuk mendamage unit musuh dalam radius 500 sebesar 100*burst
call GroupEnumUnitsInRangeOfLoc(g, lcc, 500 , b)
set n = US_CopyGroup(g)
loop
set f = FirstOfGroup(n)
exitwhen f == null
call UnitDamageTarget(GetTriggerUnit(), f, 100*burst, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC, null)
call GroupRemoveUnit(n, f)
endloop
// removing leaks
// Not Yet
endfunction
function charge_actions takes nothing returns nothing
// Membuat timer untuk di "attach" ke fungsi lain, karena memang seperti ini kegunaan timer dan handle lainnya
local timer time = CreateTimer()
// Location untuk menentukan area target dari spell dan nanti akan dipindahkan
local location lcc = GetSpellTargetLoc()
// trigger yang akan dipindahkan ke fungsi lainnya, singkatnya seperti trigger dalam trigger
local trigger trig = CreateTrigger()
// merubah kode timer dari handle ke string ... merupakan "kewajiban" dalam gamecache
local string exec = H2S(time)
// unit yang akan dipindahkan ke fungsi lainnya
local unit cst = GetTriggerUnit()
// pembuatan even trigger, dalah hal ini sama seperti dalam inisiasi trigger
call TriggerRegisterUnitEvent(trig,GetTriggerUnit(),EVENT_UNIT_SPELL_ENDCAST)
// menyimpan action dari trigger kedalam gamecache untuk dipindahkan ke fungsi damage_burst
call StoreDataHandle(H2S(trig),"trigact",TriggerAddAction(trig,function damage_burst))
// persiapan menyimpan kedalam gamecache untuk dimasukan ke fungsi selanjutnya
// menyimpan trigger
call StoreDataHandle(exec, "lp", trig)
// menyimpan burst valuenya 0
call StoreDataInteger(exec, "burst", 0)
// menyimpan maximum burst ( waktu channeling akan selesai apabila value mencapai 5 )
call StoreDataInteger(exec, "maxburst", 5)
// menyimpan unit caster
call StoreDataHandle(exec, "caster", cst)
// menyimpan lokasi target
call StoreDataHandle(exec, "target", lcc)
// menyimpan timer sebagai identitas untuk fungsi yang akan dikirim, bagian ini dibuat khusus untuk damage_burst
call StoreDataHandle(H2S(trig), "timer", time)
// memulai timer
call TimerStart(time, 0.5, true, function charge_burst )
// catatan kaki ... untuk penyimpanan ada yang menggunakan exec dan H2S(trig), hal ini akan dimengerti mengapa setelah melihat fungsi-fungsi diatas
// removing leaks
// Not yet
endfunction
//==== inisiasi trigger biasa ...
function InitTrig_burst takes nothing returns nothing
set gg_trg_burst = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_burst, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_burst, Condition( function AT_condition ) )
call TriggerAddAction( gg_trg_burst, function charge_actions )
endfunction
semoga cukup jelas ... ::smoke::
Share This Thread