| 12-07-2007, 12:48 PM | #1 |
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: 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 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 |
Raowr, HALP ME PLZ |
| 12-08-2007, 01:03 AM | #3 |
Double post... call Fail(Player(Malf), FAIL_TYPE_INSANE_EPIC_FAIL) It hasn't even been 12 hours, you gotta chill. |
