Von wo wird denn DoNebel() aufgerufen? Wird das auch noch aufgerufen, wenn 5 Nebelobjekte vorhanden sind? An und für sich müsste die erste Version funktionieren, auch wenn sie unübersichtlich geschrieben ist:
> / Eventuell Nebel erzeugen /
> private func DoNebel()
> {
> if(ObjectCount2(Find_ID(NB9Z))>=5) {RemoveAll(NBL1);}
> else {CreateObject(NB9Z);Log("Nebelerzeuger erzeugt Nebel");}
> return(1);
> }
Destruction(); ist ein Enginecall, d.h. die Funktion wird von der Engine unter bestimmten Bedingungen aufgerufen, daher ist es in der Regel eine schlechte Idee, den Aufruf manuell zu machen. Genauer gesagt wird Destruction() aufgerufen, wenn das Objekt zerstört (RemoveObject) wird. Deswegen ist folgendes auch eine besonders schlechte Idee:
> func Destruction()
> {
> RemoveAll(NBL1);
> return();
> }
Was passiert? Du rufst Destruction() auf, deine Destruction-Funktion zerstört sodann das Objekt (RemoveAll), weil das Objekt zerstört wird, wird Destruction
von der Engine im Objekt aufgerufen, Destruction führt wieder RemoveAll aus, das Objekt wird "noch mal" zerstört, es wird wieder Destruction aufgerufen usw. Die Engine stürzt davon nur nicht ab, weil nach einer bestimmten Anzahl von Kreisläufen aus Destruction und RemoveAll automatisch unterbrochen wird, weil der Speicher voll ist (stack overflow).