Wait – Mappedia

Wait

Aus Mappedia
Wechseln zu: Navigation, Suche

Als Wait bezeichnet man eine Aktion, die den Auslöser eine bestimmte Zeit warten lässt, also pausiert. In Warcraft III gibt es dafür drei verschiedene Arten von Aktionen.

Inhaltsverzeichnis

Arten von Waits

Es gibt verschiedene Arten von Waits, die sich in ihrer Funktion minimal unterscheiden. Hier wird jeweils der Name der Aktion im Auslöser-Editor angegeben:

Wait

Dieses Wait pausiert den Auslöser für genau die Zeit, die angegeben wird. Deshalb wird sie auch Realtime Wait genannt. Gerechnet wird dabei mit der Uhr, im lokalen Computer. Dieses Wait ist asynchron.

Entspricht der Funktion TriggerSleepAction.

Wait (Game Time)

Dieses Wait wird im Gegensatz zum Realtime Wait mit dem Server synchronisiert, um Netsplits zu verhindern. Realisiert wird dies durch einen unsichtbaren Timer. Da ein Timer verwendet wird, ist die Auflösung aka Genauigkeit des Waits leider nicht sehr hoch. Der Wert wird bestimmt durch die Konstante bj_POLLED_WAIT_INTERVAL und beträgt 0,1 Sekunden.

Entspricht der Funktion PolledWait.

Wait (for condition)

Pausiert den Auslöser bis eine bestimmte Bedingung erfüllt ist. Bedingung und Häufigkeit der Überprüfung können konfiguriert werden. Das kleinste mögliche Intervall für die Überprüfung entspricht der Konstante bj_WAIT_FOR_COND_MIN_INTERVAL und beträgt 0,1 Sekunden.

Wait per Timer

Dies ist die genaueste Variante ein Wait durchzuführen, dafür etwas umständlicher. Mehr dazu siehe Timer

Globale Variablen mit Waits

Eine nicht sehr bekannte Tatsache ist, dass viele Funktionen, so etwa Last Created Unit, Casting Unit, Target Unit Of Issued Order, Last Created Destructable und viele andere, so genannte Globale Variablen sind. Das bedeutet, dass es sie nur genau einmal für alle Trigger gibt und dass sie vom ganzen Spiel aus von jedem Trigger theoretisch modifiziert werden können. Dabei kann es zu sehr schwer auffindbaren Fehlern kommen.

Blizzard hat viele Auslöser, die wir nicht kennen, die auf Globale Variablen zugreifen. Daher kann der Inhalt dieser Variablen praktisch jederzeit verändert werden. Ohne Waits ist das kein Problem. Sobald wir in einem Trigger warten, werden die Daten in allen Globalen Variablen inkonsistent, das heißt, es ist nicht mehr sicher, ob das drin ist, was wir wollen.

Beispiel

Create Units
Ereignisse
Zeit - Every 5.00 seconds of game time
Bedingungen
Aktionen
Einheit - Create 1 Soldat for Spieler 1 (Rot) at (Random point in (Playable map area)) facing Vorgabe für Gebäude-Ausrichtung degrees
Wait 0.20 seconds
Einheit - Create 1 Soldat for Spieler 1 (Rot) at (Random point in (Playable map area)) facing Vorgabe für Gebäude-Ausrichtung degrees
Wait 0.20 seconds
Einheit - Create 1 Soldat for Spieler 1 (Rot) at (Random point in (Playable map area)) facing Vorgabe für Gebäude-Ausrichtung degrees
Wait 0.20 seconds
Einheit - Create 1 Soldat for Spieler 1 (Rot) at (Random point in (Playable map area)) facing Vorgabe für Gebäude-Ausrichtung degrees
Wait 0.20 seconds
Einheit - Create 1 Soldat for Spieler 1 (Rot) at (Random point in (Playable map area)) facing Vorgabe für Gebäude-Ausrichtung degrees
Wait 0.20 seconds
Einheit - Create 1 Soldat for Spieler 1 (Rot) at (Random point in (Playable map area)) facing Vorgabe für Gebäude-Ausrichtung degrees
Wait 0.20 seconds
Einheit - Create 1 Soldat for Spieler 1 (Rot) at (Random point in (Playable map area)) facing Vorgabe für Gebäude-Ausrichtung degrees
Ping Units
Ereignisse
Einheit - A unit enters (Playable map area)
Bedingungen
Aktionen
Wait 2.50 seconds
Video - Ping minimap for (All players) at (Position of (Last created unit)) for 1.00 seconds

In diesem Beispiel werden alle 5 Sekunden nacheinander eine Reihe von Soldaten gespawnt. Diese sollen jeder einzeln nach 2,5 Sekunden nach ihrem Erstellen angepingt werden. Stattdessen wird nur der letzte angepingt. Alle Trigger teilen sich die Last Created Unit, und jedes Erstellen einer Einheit überschreibt sie wieder. Alle Trigger greifen dann auf die selbe Variable zu, in der nur die letzte Einheit gespeichert ist, die erstellt wurde. Deshalb wird nur die letzte Einheit mehrfach gepingt.

Lösung

Die einfachste Möglichkeit, dieses Problem zu umgehen, ist Lokale Variablen zu verwenden.

Meine Werkzeuge
Namensräume
Varianten
Aktionen
Navigation
Warcraft-Mapping
Werkzeuge