Trigger - Einleitung

Grundgerüst[ Codeblock kopieren ]
<Asset> <Template>Trigger</Template> <Values> <Standard /> <Trigger> <TriggerCondition> //hier wird eine condition erwartet </TriggerCondition> <TriggerActions> <Item> //hier wird eine Action erwartet </Item> </TriggerAction> </Trigger> <TriggerSetup /> </Values> </Asset>

Ein sehr simples, aber mächtiges Konzept, was seit Anno 2205 existiert, sind die Trigger.
Von Fishboss im Sommer 2019 entdeckt, basiert das Unlocksystem auf Triggern, basiert auf Triggern, die ausgelöst werden, sobald ihre Bedingung erfüllt ist. Werden sie einmal ausgelöst, dann schalten sie alles frei was sie freischalten sollen und bleiben dann ausgelöst.
Ein Trigger implementiert also folgendes Konzept: Wenn Vorraussetzung (Condition) erfüllt - ein oder mehrere Aktionen (Action) ausführen.

Dabei gibt es in der templates.xml eine Reihe vordefinierter Conditions und Actions. Auf diese ist man zwar beschränkt (gibt auch noch Codemüll aus Anno 2205) - aber sie können extrem viel und sind vielseitig einsetzbar. Diese Conditions und Actions können beliebig miteinander kombiniert werden. So kann man bspw die Freischaltung der schweren KI in der KI-Schiffswerft an den Bau eines Gebäudes (z.B. einer Botschaft) anstatt einer erreichten Bevölkerungszahl knüpfen. Die Actions eines Triggers werden in ihrer Reihenfolge ausgelöst.

Registrierung von Triggern

Folgendes Problem: Ich habe einen Trigger zum freischalten der Bank bei einem Ingeneur geschrieben und ihn ausgelöst, Bank freigeschaltet und Bewohner happy. Im Nachhinein fällt mir dann aber auf, dass ich doch auch das Clubhaus gerne ab einem Ingeneur haben will, also füge ich es in meinen Trigger ein. Lade ich meinen Spielstand erneut, fällt mir aber auf, dass es gar nicht freigeschaltet ist, obwohl ich doch einen Ingeneur habe?
Warum ist das so?

Anno verwaltet die Trigger in einer internen Eventliste, in der ein Trigger erst registriert werden muss. Beim Registrieren des Triggers wird das Asset geparst und auf dessen Basis für Anno ein Event erstellt. In unserem Fall: 1 Ingeneur erreicht -> Bank freischalten. Dieses Event erhält die GUID des Triggers als ID. Befindet sich Event 42 bereits in der Eventliste, werden keine Änderungen an diesem Event mehr vorgenommen, egal, ob wir den Trigger ändern. Wird Event 42 in der Eventliste ausgelöst, merkt sich das Spiel das. Egal, was wir jetzt am Asset mit GUID = 42 ändern, das Spiel wird es nicht von selbst neu registrieren.

Im Normalfall werden Assets mit der Template Trigger beim ersten Mal automatisch registriert, außer, wir stellen das ab. (siehe unten)
Danach müssen wir manuell neu registrieren. Zum Testen ist es meistens ganz hilfreich, einfach die GUID des Assets zu ändern, weil Anno den Trigger dann als neues Event sieht und entsprechend neu einliest. Zur manuellen Registrierung kommen jetzt ein paar Handgriffe:

Ein paar Handgriffe für Trigger

Einen Trigger nicht automatisch registrieren: unter TriggerSetup kann man das Automatische Registrieren des Triggers abschalten

Trigger Setup[ Codeblock kopieren ]
<TriggerSetup> <AutoRegisterTrigger>0</AutoRegisterTrigger> </TriggerSetup>

Einen Trigger durch einen anderen Trigger registrieren lassen: Über die ActionRegisterTrigger - Das geht auch, wenn der Trigger bereits ausgelöst wurde! Nach der Neuregistrierung kann der dann wieder ausgelöst werden.

ActionRegisterTrigger[ Codeblock kopieren ]
<Template>ActionRegisterTrigger</Template> <Values> <Action /> <ActionRegisterTrigger> <TriggerAsset>1443041</TriggerAsset> </ActionRegisterTrigger> </Values>

Einen Trigger sich selbst zurücksetzen lassen: Über die ActionResetTrigger

ActionResetTrigger[ Codeblock kopieren ]
<Template>ActionResetTrigger</Template> <Values> <Action/> <ActionResetTrigger/> </Values>

Einen Trigger erst bei Erfüllung einer bestimmten Bedingung registrieren lassen: Das ganze geht über einen SubTrigger im SubTriggers Container. Dieser muss unter Values/Trigger.

SubTrigger[ Codeblock kopieren ]
<SubTriggers> <Item> <SubTrigger> <Template>AutoCreateTrigger</Template> <Values> <Trigger> <TriggerCondition> //Hier wird eine Condition erwartet </TriggerCondition> </Trigger> </Values> </SubTrigger> </Item> </SubTriggers> <SubTriggers> <Item> <SubTrigger> <Template>AutoCreateTrigger</Template> <Values> <Trigger> <TriggerCondition> //Hier wird eine Condition erwartet </TriggerCondition> </Trigger> </Values> </SubTrigger> </Item> </SubTriggers> <SubTriggers> <Item> <SubTrigger> <Template>AutoCreateTrigger</Template> <Values> <Trigger> <TriggerCondition> //Hier wird eine Condition erwartet </TriggerCondition> </Trigger> </Values> </SubTrigger> </Item> </SubTriggers> <SubTriggers> <Item> <SubTrigger> <Template>AutoCreateTrigger</Template> <Values> <Trigger> <TriggerCondition> //Hier wird eine Condition erwartet </TriggerCondition> </Trigger> </Values> </SubTrigger> </Item> </SubTriggers>
Code ausklappen

Einem SubTrigger können auch weitere SubTrigger hinzugefügt werden, wer Lust hat, kann sich mal die uPlay-Club Herausforderung "Silocon Valley" anschauen, da ist es aufs Extremste getrieben worden.