Tutorial:Specific Unit Event – Mappedia

Tutorial:Specific Unit Event

Aus Mappedia
Wechseln zu: Navigation, Suche

Irgendwann hegt ein Triggerer mal die Intention, dass er den verursachten Schaden abfragen möchte, ihm allerdings die nötigen Ereignisse fehlen. Dazu ist das Specific Unit Event "A Unit takes Damage" oder "A Unit Nimmt Schaden" da. Das Problem hierbei ist nun allerdings, dass man bei folgender Ereignisart immer eine Einheit angeben muss. Dies ist natürlich zur Entwicklungszeit sehr schwer. Daher muss man dieses Problem zur Laufzeit lösen mit der Aktion "Trigger - Add New Event" oder "Auslöser - Add New Event". Diese Aktion fügt einem Trigger ein neues Ereignis hinzu.


Inhaltsverzeichnis

Beispiel: A Unit Takes Damage

In diesem Beispiel gehen wir davon aus, dass wir einen Trigger (im Beispiel "DamageTrigg") ein Generic Unit Event hinzufügen wollen, welches den Trigger auslöst, wenn irgendeine Einheit Schaden nimmt. Dieses Event existiert nicht als "Generic Event", sondern nur als "Specific Unit Event". Das bedeutet, dass man eine bestimmte Einheit auswählen muss. Das können wir aber den Trigger erledigen lassen. Dazu geben wir diesem Trigger kein Ereignis. Stattdessen erstellen wir zwei Initialisierungstrigger, welche dies für uns tun.

Initialisierung am Map-Start

Der erste Trigger wird alle Einheiten bei Spielstart in das entsprechende Ereignis des Haupttriggers einfügen. Dazu wählen wir als Ereignis "Time - Elapsed Game Time is 0.00", um sicherzugehen, dass alle Einheiten bereits erstellt sind. Nun lassen wir eine Pick-Schleife alle Einheiten der Map durchlaufen und diese in das "Takes Damage"-Event einsetzen. So sähe der Auslöser nun aus:

InitDmgAtStart
Ereignisse
Zeit - Elapsed game time is 0.00 seconds
Bedingungen
Aktionen
Einheitengruppe - Pick every unit in (Units in (Playable map area)) and do (Actions)
Schleifen - Aktionen
Auslöser - Add to DamageTrigg <gen> the event (Einheit - (Picked unit) Nimmt Schaden)

Eine neue Einheit wird gebaut

Der zweite Trigger macht im Prinzip genau dasselbe, mit dem Unterschied, dass nun alle neu gebauten/erstellten Einheiten in das Ereignis eingesetzt werden. Hier ist es dann allerdings nicht mehr nötig, eine Pick-Schleife zu verwenden. Das richtige Ereignis für diesen Trigger ist "Unit - A Unit enters (Playable Map Area)":

InitDmg
Ereignisse
Einheit - A unit enters (Playable map area)
Bedingungen
Aktionen
Auslöser - Add to DamageTrigg <gen> the event (Einheit - (Entering unit) Nimmt Schaden)

Natürlich kann hier auch die Bedingung modifiziert werden, falls man den späteren Effekt einschränken möchte.

Abschluss

Nun wurde das "Specific Unit Event" "globalisiert". Über die Funktion "Damage Source" kann auf den Verursacher des Schadens zugegriffen werden; über die Funktion "Damage Taken" auf den Schaden selbst. Das in diesem Beispiel erarbeitete Workaround kann beim Spelltriggern verwendet werden, um beispielsweise das Auslösen einer Bombe festzustellen oder ähnliches. Oft empfiehlt es sich aber, einen Buff zur Identifikation des schadenverursachenden Zaubers zu nehmen, der sofort wieder entfernt wird.

Warum funktioniert das?

Womöglich fragt man sich jetzt, wie das Ganze funktionieren kann. Denn das Ereignis fügt ja die (Entering Unit) bzw. (Picked Unit) hinzu. Diese ändert sich aber doch. Nun, diese Aktion fügt nicht die Variable (Entering/Picked Unit) hinzu, sondern den Wert, die Unit. Dies ist Ergebnis umfangreicher Tests.

Probleme mit nicht entfernten Ereignissen

Da mit dieser Methode immer mehr Ereignisse zu einem Auslöser hinzugefügt werden und es keine Möglichkeit gibt diese einzeln zu entfernen kann es nach einiger Zeit zu Performance-Problemen kommen. Abhilfe kann es schaffen, den Auslöser alle 10 Minuten zu zerstören und wieder neu zu erstellen:

Aktionen
-------- Trigger zerstören --------
Custom script: call DestroyTrigger(gg_trg_DamageTrigg)
-------- Trigger neu erstellen --------
Custom script: set gg_trg_DamageTrigg = CreateTrigger()
-------- Initialisierung erneut ausführen --------
Auslöser- Run InitDmgAtStart <gen> (checking conditions)

Zu beachten ist, dass das Zerstören von Auslösern zu Fehlern führen kann. Deshalb sollte man dies nur tun, wenn man weis was man tut, oder wirklich Performance-Probleme hat.

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