Heh, almost forgot I was supposed to post this info.
If you have a trigger that is set to only fire once, then it will disable itself after it fires. The question I got from Hidiot, was at what point does the trigger get disabled.
Here's the sequence of events.
1) For each trigger:
2) Check if the trigger should fire
3) If the trigger fires, then get the callback address (the function you export from your DLL)
3b) When getting the callback address, call Disable() if it's a One-shot trigger
4) For each trigger that fired:
5) Call the trigger callback
This is important because, by the time your callback function executes, Disable() has already been called on that trigger. This means you can re-enable it in the callback. If it got disabled after the callback, then it would have forgotten any changes you tried to make.
This also means you can re-enable other One-shot triggers that are firing this tick, but haven't yet had their callback functions called. That is, if you have two triggers, A and B that will both fire on the current tick, then the callback for trigger A can re-enable trigger B, even before the callback for trigger B executes. As you can see in the above sequence of steps, all the triggers are checked and disabled if needed, before any of the callbacks are called.
Edit: I'd also like to point out that Disable() is not the same as Destroy(). If you Disable on a trigger, it still exists, and takes up one of the 255 ScStub objects, but won't fire. If you call destroy, then the space allocated for it is freed and can be reused.