Events

Narks

Vastly intelligent whale-like being from the stars
Reaction score
90
Originally, I was going to use Event like this:
- a custom damage event is triggered
- all modifying functions for that event are fired in the correct order
- the damage is dealt

eg.
- an effect Shield reduces damage by 50%, so Shield is attached to the custom damage Event, and has a priority of 10
- an effect Stoneskin reduces damage by 5, so Stoneskin is attached to the custom damage Event, and has a priority of 1
- a unit casts a spell on Bob, dealing x damage, which fires the damage Event
- since the Shield trigger has the highest priority, the Shield trigger is fired first, which reduces the value of x by 50%
- since the Stoneskin trigger has the second highest priority, the Stoneskin trigger reduces the value of x by 5
- finally, x damage is dealt to Bob (which could be considered a trigger with a priority of 0)

Unfortunately, looking at the Event system, I realized that its not capable of doing this - mostly the lack of a priority system to control the order that triggers are fired in.

I want to write my own system to do this, similar to Event, except instead of a linked list, an ordered linked list. Problem is, I don't understand how internally Event works, apart from that it is a linked list - like what's the purpose of the EventStack...
 

Solmyr

Ultra Cool Member
Reaction score
30
  1. I don't see why you need a custom damage event.
  2. If damage modification is the only thing you're after, use DamageEvent & DamageModifiers. It is definitely the best thing out there, and it also allows you to give different priorities to different damage modifiers (which is exactly what you're after).
EDIT: Man, just when I started writing something very similar to what kingking posted. Guess that saves me the trouble :)
 

kingkingyyk3

Visitor (Welcome to the Jungle, Baby!)
Reaction score
216
Instant 1. :p
JASS:
library EventEx
    
    struct EventEx
        private thistype prev
        private thistype next
        //Next (Higher Priority)
        private integer p
        private trigger trig
        
        static method create takes nothing returns thistype
            local thistype this=thistype.allocate()
            set this.prev=this
            set this.next=this
            set this.p=0
            return this
        endmethod
        
        method register takes trigger trig, integer priority returns nothing
            local thistype node=thistype.allocate()
            set node.p=priority
            set node.trig=trig
            
            set this=this.prev
            loop
            exitwhen node.p>=this.p
                set this=this.prev
                //Searching from largest to smallest priority.
            endloop
            //Nearest small number is found, we shall attach it into the list now.
            set this.next.prev=node
            set node.prev=this
            set node.next=this.next
            set this.next=node
        endmethod
        
        method unregister takes trigger trig returns nothing
            local thistype ori=this
            set this=this.next
            loop
            exitwhen ori==this
                if this.trig==trig then
                    set this.prev.next=this.next
                    set this.next.prev=this.prev
                    call this.deallocate()
                endif
                set this=this.next
            endloop
        endmethod
        
        method fire takes nothing returns nothing
            local thistype ori=this
            set this=this.prev//We will fire from highest to lowest priority.
            loop
            exitwhen ori==this
                if IsTriggerEnabled(this.trig) and TriggerEvaluate(this.trig) then
                    call TriggerExecute(this.trig)
                endif
                set this=this.prev
            endloop
        endmethod
        
        method destroy takes nothing returns nothing
            local thistype ori=this
            set this=this.next
            loop
            exitwhen ori==this
                call this.deallocate()
                set this=this.next
            endloop
            call this.deallocate()
        endmethod
    endstruct
    
endlibrary
 

Narks

Vastly intelligent whale-like being from the stars
Reaction score
90
@ Solmyr
I should have been more specific, there are no native damage sources in my map, so all damage is triggered, hence why I called it a "custom" damage event.

@ kingkingyyk3
Thanks, I could have written this myself though, but I wanted to understand why Jesus4Lyf added a stack structure to his code. I think I just realized why - won't yours cause a recursive loop if I created an event to fire when damage is dealt?

I've also decided, after reading the Event thread, that a priority system isn't needed, and that I should just add separate Events for each part of damage calculation (one for % reduction, one for absolute reduction, etc).
 

kingkingyyk3

Visitor (Welcome to the Jungle, Baby!)
Reaction score
216
Thanks, I could have written this myself though, but I wanted to understand why Jesus4Lyf added a stack structure to his code. I think I just realized why - won't yours cause a recursive loop if I created an event to fire when damage is dealt?
That's for Event.getTriggered() and EventReg. :)
 

Solmyr

Ultra Cool Member
Reaction score
30
@ Solmyr
I should have been more specific, there are no native damage sources in my map, so all damage is triggered, hence why I called it a "custom" damage event.
That doesn't mean you can't use DamageModifiers. I generally despise those "event systems", so I'd say it's up you.
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Members online

      No members online now.

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top