Inhaltsverzeichnis
Auslöser, Trigger
Mit Hilfe eines Auslösers kann man bei einem bestimmten Ereignis eine Funktion aufrufen lassen. So entsprechen Jobs den Ereignissen „jede Sekunde“ bzw. „jeder Tick“.
Die StartSimpleJob-Funktion sieht, stark vereinfacht, so aus:
function StartSimpleJob(_nFunction) return Trigger.RequestTrigger( Events.LOGIC_EVENT_EVERY_SECOND, "", _nFunction, 1, {}, {}); end
Nun eine Erklärung der Parameter:
Zunächst wird der Typ des Ereignisses angeben. Danach folgt der Name der Condition-Funktion. Gibt diese true zurück, wird die Action-Funktion aufgerufen. Diese Funktion ist (wie in diesem Beispiel zu sehen) optional. Dann folgt der Name der Action-Funktion. Diese muss vorhanden sein! Wenn diese Funktion true zurückgibt, wird der Auslöser beendet. Danach folgt zu Beginn aktiv/inaktiv (1/0).
Die letzten Parameter sind Tables, die die Parameter für die Condition-Funktion und die Action-Funktion enthalten. Es können Zahlen, Strings und Wahrheitswerte übergeben werden. Diese Werte müssen, wie immer bei unpack(), ohne Unterbrechung aufeinander folgen. Achtung! Funktionen oder Tables als Parameter für die Action- oder Condition-Funktion führen zu technischen Problemen und können zum Absturz führen! Eine Lösung ist der im nächsten Post erläuterte Fix.
Der Rückgabewert der Funktion ist die ID des Auslösers.
In den Action- und Condition-Funktionen können noch bestimmte Funktionen aufgerufen werden, die nur bei Ereignissen funktionieren. Die Aufführung dieser Funktionen folgt am Schluss zusammen mit den Ereignissen.
Ein Auslöser kann, wie ein Job, mit EndJob() beendet werden.
Möchte man einen Auslöser kurz pausieren lassen, kann man statt dem Umweg über EndJob() und Trigger.RequestTrigger() auch den Auslöser über Trigger.DisableTrigger(_id) und Trigger.EnableTrigger(_id) de-/aktivieren.
Jetzt noch eine Liste aller Ereignisse und der bei den Ereignissen aufrufbaren Funktionen:
Events.LOGIC_EVENT_DIPLOMACY_CHANGED Event.GetDiplomacyState() Event.GetSourcePlayerID() Event.GetTargetPlayerID() Events.LOGIC_EVENT_ENTITY_CREATED Event.GetEntityID() Events.LOGIC_EVENT_ENTITY_DESTROYED Event.GetEntityID() Events.LOGIC_EVENT_ENTITY_HURT_ENTITY Event.GetEntityID1() --Angreifer Event.GetEntityID2() --Angriffsziel Events.LOGIC_EVENT_EVERY_SECOND --Grundstein des SimpleJobs und des Jobs Events.LOGIC_EVENT_EVERY_TURN --Grundstein des SimpleHiResJobs und des HiResJobs Events.LOGIC_EVENT_GOODS_TRADED Event.GetEntityID() --Marktplatz Event.GetBuyAmount() Event.GetBuyResource() Event.GetSellAmount() Event.GetSellResource() Events.LOGIC_EVENT_PLAYER_DIED Event.GetPlayerID() Events.LOGIC_EVENT_RESEARCH_DONE Event.GetTechnologyType() Event.GetPlayerID() Events.LOGIC_EVENT_TRIBUTE_PAID Event.GetTributeUniqueID() Event.GetSourcePlayerID() Event.GetTargetPlayerID() Events.LOGIC_EVENT_WEATHER_STATE_CHANGED Event.GetOldWeatherState() Event.GetNewWeatherState()
Trigger-Fix
Mit Hilfe dieses Fixes ist es möglich, Funktionen und Tables zu übergeben. Der Fix bietet aber noch andere Möglichkeiten:
Man kann an die Funktion Trigger.RequestTrigger() die Condition- und die Action-Funktion direkt übergeben, was lokale Funktionsdefinitionen ermöglicht.
Außerdem wurden die Job-Funktionen verbessert: An die Funktionen StartSimpleJob() und StartSimpleHiResJob() kann die Job-Funktion direkt übergeben werden und Parameter können auch angegeben werden. Syntax:
StartSimpleXXXJob(_function, _param1, _param2, ..., _paramn)
Die Funktionen StartJob() und StartHiResJob() sind komplizierter, da der Job in dem Fall aus Condition- und Action-Funktion besteht. Man kann, wie bisher, den Stammnamen der Funktionen angeben, will man aber Parameter übergeben, müssen diese aber in Tables gepackt werden:
StartXXXJob(_name, _paramsAction, _paramsCondition)
Möchte man die Action- und die Condition-Funktion direkt übergeben, so sieht der Aufbau so aus:
StartXXXJob(_Action, _Condition, _paramsAction, _paramsCondition)
Außerdem kommt bei einem Fehler nur noch eine Message-Ausgabe mit der Beschreibung des Fehlers, keine Fehlermeldungen, aufgrund derer sich das Spiel nur noch mit Task-Manager beenden lässt.