Objekte mit Scripten programmieren ed

Variablen-Typ ist object.

Die komplette Script-Datei wird für jedes Objekt einzeln neu erzeugt! Objekte gleichen Typs haben somit unabhängige (globale) Variablen, aber die gleichen Funktionen. Das erzeugende Objekt kann immer über this angesprochen werden.

Sobald das Objekt geladen wird, wird auch angefangen, seine void main() auszuführen. Durch eine while-Schleife kann ein dauerhaftes Verhalten programmiert werden, es muss aber unbedingt ein wait()-Befehl eingebaut sein!!! Wird das Objekt gelöscht, so wird auch das Script beendet, sobald es einen wait-Befehl erreicht.

Bevor das Objekt gelöscht wird, wird die Funktion void KillObject() in dessen Script ausgeführt ("Destructor"). Hierin können zum Beispiel für das Objekt geladene Partikel, Sounds, etc. gelöscht werden.

Alle Objekte in der 3d-Welt sind im Array Object[] enthalten, die Menge wird durch NumObjects angegeben. Der Index ist für jedes Objekt fest, weswegen der Array nach dem Löschen von Objekten Lücken enthalten kann.

Beispiel:

// per Makro einen Alias-Namen fuer die Objekt-Variable Nr 13 festlegen
#define Test	ScriptVar[13]

void main()
{
    this.Name = "Heinz"; // Name in Heinz aendern
    this.Test = 4.1f;

    while (true){

        // solange das Objekt existiert seine Geschwindigkeit festhalten
        this.Vel = vector(100, 0, 0);

        // einen Frame warten
        wait_of();
    }
}

Beispiel: (komplizierter)

void main()
{
    float time_run = 0;
    float min_distance = 200.0f;

    // das ego-Objekt verfolgen
    while (true){

        // in welcher Richtung ist ego?
        vector dpos = ego.Pos - this.Pos;
        float ang_y = atan2(dpos.z, dpos.x);
        float distance = VecLength(dpos);

        // in ego-Richtung ausrichten
        this.Ang = vector(0, ang_y, 0);

        // auf ego zulaufen
        vector dir;
        VecNormalize(dir, dpos);
        if (distance > min_distance)
            this.Vel = dir * 100.0f;
        else
            this.Vel = v0;

        // Animation
        ModelMoveReset(this.model);
        if (distance > min_distance)
            // vielleicht eine Lauf-Animation...
            ModelMoveSet(this.model, MoveOpSet, 0, 0, 13, time_run, elapsed, 0, true);

        wait_of();
    }
}