Noob Question about running multiple instant triggers

tommerbob

Minecraft. :D
Reaction score
110
I can't believe I don't know this yet, but I've been trying to optimize some GUI coding, and up until now I've used different variables for each spell/trigger, even though they may run instantly. I've run into this question:

If I have multiple triggers that all run instantly and simultaneously, and they all use the same Global variable (ex. Temp_Integer), will the data be overwritten or is this okay to do?
 

Weep

Godspeed to the sound of the pounding
Reaction score
401
It depends if they all run purely in sequence, or if any of them can "interrupt" another trigger.

For example, if all triggers are instant, but one has a damage event, and another trigger causes a unit to deal damage, the first trigger will immediately run "in the middle" of the actions of the second trigger. This can cause a conflict. Otherwise, instant triggers complete their actions before going on to the next one.
 

evilwolf

Member
Reaction score
11
I can't believe I don't know this yet, but I've been trying to optimize some GUI coding, and up until now I've used different variables for each spell/trigger, even though they may run instantly. I've run into this question:

If I have multiple triggers that all run instantly and simultaneously, and they all use the same Global variable (ex. Temp_Integer), will the data be overwritten or is this okay to do?
The variable will be overwritten by your next action, but it still works.
 

Sevion

The DIY Ninja
Reaction score
424
It depends if they all run purely in sequence, or if any of them can "interrupt" another trigger.

For example, if all triggers are instant, but one has a damage event, and another trigger causes a unit to deal damage, the first trigger will immediately run "in the middle" of the actions of the second trigger. This can cause a conflict. Otherwise, instant triggers complete their actions before going on to the next one.

IIRC everything is run on a single thread. That means things are run one at a time. So following this, assuming I'm correct, the second trigger shouldn't fire until after the first is finished. I don't know for sure, but it can be easily tested for.
 

tommerbob

Minecraft. :D
Reaction score
110
It depends if they all run purely in sequence, or if any of them can "interrupt" another trigger.

For example, if all triggers are instant, but one has a damage event, and another trigger causes a unit to deal damage, the first trigger will immediately run "in the middle" of the actions of the second trigger. This can cause a conflict. Otherwise, instant triggers complete their actions before going on to the next one.

I see. Thanks for the clarification.

@evilwolf:

Huh? That seems like a contradiction.
 

Weep

Godspeed to the sound of the pounding
Reaction score
401
That means things are run one at a time. So following this, assuming I'm correct, the second trigger shouldn't fire until after the first is finished.
Your first assertion is true; the second is not. A trigger can interrupt another; the interrupted trigger's actions will be queued and run after the interrupting trigger completes. Only action runs at a time, just the order changes.
 

Ayanami

칼리
Reaction score
288
I think a trigger runs like this. Let's say in your trigger you have 3 actions, A, B and C. Normally, it would run like this:

Code:
A -> B -> C

However, let's say you run another trigger called "T" within the trigger. And you run this trigger right after action "A".

Code:
A -> T -> B -> C

I think that's how it runs. So if you were to run another trigger in middle of another executing trigger, rest of the actions of that trigger would execute after the other trigger is completely ran. Could be wrong though.
 

chobibo

Level 1 Crypt Lord
Reaction score
48
Code:
A -> T -> A -> B -> C

If T was called by a, then T will return to A's thread and not continue on to B. If that (the first example) where so then the sequence would be:

Code:
A -> T -> B -> C -> A
 

vypur85

Hibernate
Reaction score
803
Just think of it as... it follows sequence. Simple.
When you run a trigger within a trigger, it will complete everything in sequence of run.

All in all, you don't have to worry about variables being overwritten. Common sense would tell you whether it will be overwritten or not.
 

chobibo

Level 1 Crypt Lord
Reaction score
48
Here's a test script:
JASS:

globals
    trigger A=CreateTrigger()
    trigger B=CreateTrigger()
    trigger C=CreateTrigger()
    integer I=0
endglobals

function ActionA takes nothing returns nothing
    set I=0
    call BJDebugMsg("A: "+I2S(I))
    call TriggerExecute(C)
    call BJDebugMsg("A: "+I2S(I))
endfunction

function ActionB takes nothing returns nothing
    call BJDebugMsg("B executed")
endfunction

function ActionC takes nothing returns nothing
    set I=100
    call BJDebugMsg("C executed")
endfunction

//===========================================================================
function InitTrig_thread_test takes nothing returns nothing
    call TriggerAddAction(A,function ActionA)
    call TriggerAddAction(B,function ActionB)
    call TriggerAddAction(C,function ActionC)
    call TriggerExecute(A)
    call TriggerExecute(B)
endfunction
 

Sevion

The DIY Ninja
Reaction score
424
I wasn't originally talking about using things like [ljass]TriggerExecute[/ljass]. It's obvious that if you use that in that way what'll happen is what you say. (confusing sentence)

I was talking about using events.

I.E.

Unit Dies -> Run Trigger A

Unit Takes Damage -> Run Trigger B

In Trigger A, cause a unit to take damage

I haven't the time right now to test it, but I hypothesize that Trigger A will finish before Trigger B begins.

Someone can test and confirm?
 

DioD

New Member
Reaction score
57
nothing instant, triggers on same event will run in (reverse)creation order
 

Sevion

The DIY Ninja
Reaction score
424
Tested with this quick script:

Trigger:
  • TestGUI
    • Events
      • Player - Player 1 (Red) skips a cinematic sequence
    • Conditions
    • Actions
      • Game - Display to (All players) the text: 1
      • Unit - Kill Paladin 0004 <gen>
      • Game - Display to (All players) the text: 2


Trigger:
  • TestGUI2
    • Events
      • Unit - A unit Dies
    • Conditions
    • Actions
      • Game - Display to (All players) the text: 3


Output was 1, 3, 2

chobibo was right. I stand corrected.
 

tommerbob

Minecraft. :D
Reaction score
110
Hmmm, okay. Thanks for everyone's help. (I guess my question wasn't so noob afterall. :p)
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Staff online

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top