Events

Narks

Vastly intelligent whale-like being from the stars
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

Active Member
  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!)
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
@ 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!)
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

Active Member
@ 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.
  • Varine Varine:
    I don't want to compete for that, yall can have it.
  • Varine Varine:
    @The Helper I'm trying. Once I am more prepared to be figuring out school I'll probably ask for your advice
  • Varine Varine:
    Right now I'm just trying to get through the pandemic and figure out how I'm going to pay for it, and figure out what I need to get a job at Best Buy instead of a kitchen somewhere.
  • thewrongvine thewrongvine:
    oy just catching up on the discussion above. @Varine yeah I usually alternate between claritin & zyrtec, depending on whatever my body decides to reject at the time lol
  • thewrongvine thewrongvine:
    the more I use it the less effective it gets over time as my body accustoms to it so I try to not use it every day
  • S songbird:
    Glad to see some interest in the IS3 NUON reprint. :)
    +1
  • The Helper The Helper:
    Thank you Carl for making that happen that just might be the spark we need.
  • Varine Varine:
    I'm confused and amazed that NUON and TWV's news postings are the things still active.
  • Varine Varine:
    Or Tom Mai, not TWV
  • Varine Varine:
    Whatever happened to Cheshire? Or Firecat, whatever his real name was?
  • Varine Varine:
    I've been using both claritin and fexofenadine or something like that recently alternately and that's been kinda working, I don't feel like my face is going to explode at least. Eyes are still itchy as fuck though
  • tom_mai78101 tom_mai78101:
    I dunno, haven't seen Firecat in a long while now.
  • tom_mai78101 tom_mai78101:
    By the way, we have new file attachment size limits now.
  • Varine Varine:
    Are they bigger?
  • tom_mai78101 tom_mai78101:
    Yeah, new max size limit is 64 MB, to accommodate NUON-Dome emulation.
  • Varine Varine:
    I don't think I ever ran into a file size problem before. What was it before?
  • Varine Varine:
    I've had file type issues before I think, but I haven't uploaded anything since like 2010.
  • The Helper The Helper:
    alot smaller than that basically barely anything and it would have been different then 2010 because of the forum upgrade
  • Varine Varine:
    lol I forgot this used to look different
  • Varine Varine:
    It's by far the brightest webpage I regularly visit, the first thing I usually do is try to figure out dark mode.
  • tom_mai78101 tom_mai78101:
    If you invert the colors, The Helper Forums looks amazing
  • tom_mai78101 tom_mai78101:
    It still has that blue theme at the top
  • Ghan Ghan:
    There's no particular hard limit to attachments. "Something reasonable" is preferred to "a size large enough to fill up the server disk"
  • B Badmanhop (Andy):
    I would be interested to.
  • tom_mai78101 tom_mai78101:
    Feel free to contribute to NUON.

    Members online

    No members online now.

    Affiliates

    Hive Workshop
    Top