A further note -
See how this is a scripteffectupdate block, and, it starts with this?
BEGIN ScriptEffectUpdateif(level) return
Scripteffectupdate blocks try to run over and over and over again. They run a couple times in the very first rendered frame they are "cast" and then run once per frame from them on. it's just what they do, they aren't like "scripteffectstart" which only runs once per effect. So, whenever you use a ScriptEffectUpdate block, you have to build your own "Hey I already did my thing, don't do it again" sort of code into it, if that's the function you really need.
I have been finding ScriptEffectUpdate to be very powerful because you can, in effect, build looping code into them, and pretty much no other script form lets you do that. Like
short countbegin scripteffectstart set count to 1endbegin scripteffectupdate if count > 10 dispel MyEffect return elseif count set count to count + 1 ; do stuff endifend
Because of the way scripteffectupdate blocks keep repeating their execution, that code will repeat the ";do stuff" segment of code over a number of frames, until the counter you set up is higher than 10. But you have to really watch the counter to prevent extra runs of the code. Pretend that "dispel" might not make the script effect end right away, and keep the variables in a state where they will continue to deny your finished-block of code after you call that dispel.