HomeUser Control Panel (unavailable in archive)ForumsTutorialsArt GalleryResourcesMaps

Custom Trigger Events

12-07-2007, 12:48 PM#1
Malf
I wanted to have my own event in my system. My system is your average custom buff system, it just applies stuff. But I want to catch events like whenever a buff is applied and such. It's called Enchantments System, and here's the code:

Collapse Enchantment System:
library EnchantmentSystem initializer InitEnchantments requires Tags

// -------------Private ------------

interface Enchantment
    unit Source = null
    unit Target = null
    real Duration = 0.
    string EnchantmentType = ""
    integer Buff
endinterface

private struct EnchantmentEvent
    unit Source = null
    unit Target = null
    real Duration = 0.
    string EnchantmentType = ""
    EventFunc Func
    boolean Disabled = false
    method Disable takes nothing returns nothing
        set .Disabled = true
    endmethod
endstruct

function interface EventFunc takes EnchantmentEvent e returns nothing

globals
    private timer global_timer = null
    private Enchantment array current
    private integer enchantment_count = 0
endglobals

globals
    private trigger global_handler = null
    private integer event_count = 0
    private EnchantmentEvent array current_event
endglobals

private function OnApply takes Enchantment e returns nothing
local integer i = 0
local EnchantmentEvent ev 
    loop
        set i = i+1
        exitwhen i > event_count
        set ev = EnchantmentEvent(i)
        if ev.Disabled == false then
            set ev.Source = e.Source
            set ev.Target = e.Target
            set ev.Duration = e.Duration
            set ev.EnchantmentType = e.EnchantmentType
            call ev.Func.execute(ev)
        endif
    endloop
endfunction

function OnEnchantmentApply takes EventFunc Func returns EnchantmentEvent
local EnchantmentEvent e = EnchantmentEvent.create()
    set e.Func = Func
    set event_count = event_count + 1
    set current_event[event_count] = e
    return e
endfunction

private function InitEnchantments takes nothing returns nothing
    set global_timer = CreateTimer()
    set global_handler = CreateTrigger()
endfunction

private function Enchantments takes nothing returns nothing
local integer i = 0
local Enchantment e1
local integer I
    loop
        set i = i+1
        exitwhen i > enchantment_count
        set e1 = current[i]
        if e1.Duration <= 0 or GetWidgetLife(e1.Target) < .405 or e1.Target == null then
            call UnitRemoveAbility(e1.Target,e1.Buff)
            set I = current[i]
            set current[i] = current[enchantment_count]
            set current[enchantment_count] = I
            call current[enchantment_count].destroy()
            set enchantment_count = enchantment_count - 1
        else
            set e1.Duration = e1.Duration - 0.10
        endif
    endloop
endfunction

// -------------- Super Private Stuff ----------------------

//! textmacro SetupModule takes enchantmentname, applier, order, buff, slot
scope $enchantmentname$Module
    globals
        private timer $enchantmentname$_timer = null
        private constant integer SLOT = $slot$
    endglobals
    struct $enchantmentname$ extends Enchantment
        static method Get takes unit from returns $enchantmentname$
            return Tag(Tag.Get(from)).Slot[SLOT]
        endmethod
        static method Apply takes unit source, unit target, real duration returns $enchantmentname$
        local $enchantmentname$ e = $enchantmentname$.create()
        local Tag t = Tag.Get(target)
        local unit u = CreateUnit(GetOwningPlayer(source),'e000',GetUnitX(target),GetUnitY(target),0)
            call UnitAddAbility(u,'$applier$')
            call IssueTargetOrder(u,"$order$",target)
            call UnitApplyTimedLife(u,'BTLF',0.1)
            set u = null
            set e.Buff = '$buff$'
            set e.EnchantmentType = "$enchantmentname$"
            set e.Source = source
            set e.Target = target
            set e.Duration = duration
            if enchantment_count == 0 then
                call TimerStart(global_timer,0.10,true,function Enchantments)
            endif
            set enchantment_count = enchantment_count + 1
            set current[enchantment_count] = e
            set t.Slot[SLOT] = integer(e)
            call OnApply.execute(e)
            return e
        endmethod
        static method Remove takes Enchantment e returns nothing
            set e.Duration = 0
        endmethod
    endstruct
endscope
//! endtextmacro

// --------------------------------------------------------------
// ---------------------- CONFIGURATION AREA --------------------
// --------------------------------------------------------------

//! runtextmacro SetupModule("Knockdown","A000","creepthunderbolt","B000","4")
//! runtextmacro SetupModule("Stun","A001","thunderbolt","B001","5")
//! runtextmacro SetupModule("Cripple","A002","cripple","B002","6")
//! runtextmacro SetupModule("Daze","A003","curse","B003","7")
//! runtextmacro SetupModule("Mute","A004","doom","B004","8")


endlibrary
Now so you don't have to scroll down for the one above, the custom event part is this:
Collapse JASS:
function interface EventFunc takes EnchantmentEvent e returns nothing

globals
    private timer global_timer = null
    private Enchantment array current
    private integer enchantment_count = 0
endglobals

globals
    private trigger global_handler = null
    private integer event_count = 0
    private EnchantmentEvent array current_event
endglobals

private function OnApply takes Enchantment e returns nothing
local integer i = 0
local EnchantmentEvent ev 
    loop
        set i = i+1
        exitwhen i > event_count
        set ev = EnchantmentEvent(i)
        if ev.Disabled == false then
            set ev.Source = e.Source
            set ev.Target = e.Target
            set ev.Duration = e.Duration
            set ev.EnchantmentType = e.EnchantmentType
            call ev.Func.execute(ev)
        endif
    endloop
endfunction

function OnEnchantmentApply takes EventFunc Func returns EnchantmentEvent
local EnchantmentEvent e = EnchantmentEvent.create()
    set e.Func = Func
    set event_count = event_count + 1
    set current_event[event_count] = e
    return e
endfunction

private function InitEnchantments takes nothing returns nothing
    set global_timer = CreateTimer()
    set global_handler = CreateTrigger()
endfunction

private function Enchantments takes nothing returns nothing
local integer i = 0
local Enchantment e1
local integer I
    loop
        set i = i+1
        exitwhen i > enchantment_count
        set e1 = current[i]
        if e1.Duration <= 0 or GetWidgetLife(e1.Target) < .405 or e1.Target == null then
            call UnitRemoveAbility(e1.Target,e1.Buff)
            set I = current[i]
            set current[i] = current[enchantment_count]
            set current[enchantment_count] = I
            call current[enchantment_count].destroy()
            set enchantment_count = enchantment_count - 1
        else
            set e1.Duration = e1.Duration - 0.10
        endif
    endloop
endfunction

// -------------- Super Private Stuff ----------------------

//! textmacro SetupModule takes enchantmentname, applier, order, buff, slot
scope $enchantmentname$Module
    globals
        private timer $enchantmentname$_timer = null
        private constant integer SLOT = $slot$
    endglobals
    struct $enchantmentname$ extends Enchantment
        static method Get takes unit from returns $enchantmentname$
            return Tag(Tag.Get(from)).Slot[SLOT]
        endmethod
        static method Apply takes unit source, unit target, real duration returns $enchantmentname$
        local $enchantmentname$ e = $enchantmentname$.create()
        local Tag t = Tag.Get(target)
        local unit u = CreateUnit(GetOwningPlayer(source),'e000',GetUnitX(target),GetUnitY(target),0)
            call UnitAddAbility(u,'$applier$')
            call IssueTargetOrder(u,"$order$",target)
            call UnitApplyTimedLife(u,'BTLF',0.1)
            set u = null
            set e.Buff = '$buff$'
            set e.EnchantmentType = "$enchantmentname$"
            set e.Source = source
            set e.Target = target
            set e.Duration = duration
            if enchantment_count == 0 then
                call TimerStart(global_timer,0.10,true,function Enchantments)
            endif
            set enchantment_count = enchantment_count + 1
            set current[enchantment_count] = e
            set t.Slot[SLOT] = integer(e)
            call OnApply.execute(e)
            return e
        endmethod
        static method Remove takes Enchantment e returns nothing
            set e.Duration = 0
        endmethod
    endstruct
endscope
//! endtextmacro

I want to know, am I doing this, the custom event thing, right?
12-07-2007, 11:18 PM#2
Malf
Raowr, HALP ME PLZ
12-08-2007, 01:03 AM#3
darkwulfv
Double post...

call Fail(Player(Malf), FAIL_TYPE_INSANE_EPIC_FAIL)
It hasn't even been 12 hours, you gotta chill.