Lektion 4
In der letzten Lektion habe ich euch ein Beispiel versprochen. Dieses Versprechen werde ich natürlich auch halten.
In den meisten Fällen werdet ihr eure Bewohner eine bestimmte Handlungsweise "nahe legen" wollen.
...ja, ich meine Beherrschungszauber...
Da aber das Gildenhaus von Bioware den Leuten und Monstern bereits ein eigenes Bewusstsein geschenkt hat, solltet ihr tunlichst vermeiden diese Arbeit zu zerstören.
Wie ihr statt dessen vorgehen solltet werde ich euch natürlich auch sofort verraten.
Statt direkt die Scripte zu verändern, die Bioware den verschiedenen Kreaturen zugedacht hat, solltet ihr nur in zwei bestimmten Schriftrollen arbeiten.
Zunächst öffnen wir die Ereignistafel der Kreatureneigenschaften eines beliebigen "Opfers".
Nehmen wir doch einfach das Beispiel, dass ihr einen Fremden bei seiner Ankunft begrüßen lassen möchtet. Also immer dann, wenn er einen Fremden erblickt soll er ihn grüßen.
Editiert nun das Script des Ereignisses OnSpawn
Sucht euch die Zeile '//SetSpawnInCondition(NW_FLAG_PERCIEVE_EVENT); //OPTIONAL BEHAVIOR - Fire User Defined Event 1002' und entfernt die Kommentarzeichen am Anfang der Zeile, und wirklich NUR die am Anfang! Von nun an wird für diese Kreatur bei jedem "OnPerception"-Ereignis auch das "OnUserDefined"-Ereignis aktiviert.
Bitte legt die frisch veränderte Schriftrolle unter neuem Namen ab, da ihr ja nicht für alle eure Kreaturen, die die vorgegebene These verwenden, den OnUserDefined Event aktivieren wollt.
Bearbeitet nun besagtes OnUserDefined Ereignis eurer Kreatur. Ersetzt die leere Hauptfunktion des Ereignisses durch diese These:
void main() { int nUser = GetUserDefinedEventNumber(); //eine Wertzuweisung if (nUser == 1002) //erklaere ich spaeter { object oCreature = GetLastPerceived(); /* erklaere ich beides spaeter */ if ((TRUE == GetLastPerceptionSeen()) && (GetIsPC(oCreature))) { ActionDoCommand(SetFacingPoint(GetPosition(oCreature))); ActionPlayAnimation(ANIMATION_FIREFORGET_GREETING); SpeakString("Seid willkommen, Fremder."); /* Das waren drei Funktionsaufrufe. Wozu die gut sind, erfahrt ihr gleich. */ } } return; }
Legt auch diese Schriftrolle unter neuem Namen ab.
Nun wird dieser Bewohner dem ersten Fremden den er sieht einmal zuwinken und ihn durch den Satz "Seid willkommen, Fremder." begrüßen.
Besser, ich erkläre euch genau, was hier passiert, damit ihr es auch richtig versteht.
if (nUser == 1002) //ist ein NW_FLAG_PERCIEVE_EVENT
{
}
Das "If" sorgt für eine Verzweigung in der These. Der Teil in dem Block nach dem "if()" wird nur dann ausgeführt, wenn der Ausdruck in den runden Klammern Positiv ist. Ihr erinnert euch, ein Block wird durch geschweifte Klammern gesetzt.
Ihr solltet meinem Bespiel unbedingt folgen und eure Blöcke durch sauberes Einrücken leichter kenntlich machen. Die zusammengehörenden geschweiften Klammern stehen immer genau untereinander. So könnt ihr leicht Anfang und Ende eines Blockes erkennen.
Wie eine "If()"-Verzeigung genau funktioniert werde ich euch in einer der nächsten Lektionen genauer erklären. Jetzt braucht ihr nur zu wissen, dass der Block nach der Verzweigung nur dann ausgeführt wird, wenn der Inhalt der Variable "nUser" der integer-Zahl 1002 entspricht.
Ihr erinnert euch? Das war die Zahl, die in dem Kommentar der veränderten Zeile des OnSpawn-Scripts stand.
Das ist nämlich genau dann der Fall, wenn das aktuelle Ereignis ein "OnPerception"-Event ist.
Die Zeile "object oCreature = GetLastPerceived();" erstellt ein Behältnis des Typs "object" und füllt es mit dem Rückgabewert der StandardFunktion "GetLastPerceived()", also dem Objekt, das als letztes wahr genommen wurde.
if ((TRUE == GetLastPerceptionSeen()) && (GetIsPC(oCreature)))
{
}
Diese If-Bedingung ist nur dann erfüllt, wenn das, was wir zuvor durch "GetLastPerceived()" erhielten auch wirklich gesehen, und nicht etwa gehört, wurde. Und, wenn das bemerkte Objekt ein "Gast" ist. Diese Bedingung ist nur dann erfüllt, wenn beide Teile erfüllt sind.
Ist dem so, dann wird sich unser Bewohner in Richtung des Gastes drehen.
ActionDoCommand(SetFacingPoint(GetPosition(oCreature));
Einmal kurz zuwinken,
ActionPlayAnimation(ANIMATION_FIREFORGET_GREET);
SpeakString("Seid willkommen, Fremder.");
und den Satz "Seid willkommen, Fremder." sagen.
Durch diese wenigen Zeilen wird unser Bewohner sich immer dazu veranlasst fühlen einen Gast zu begrüßen, wenn er einen erblickt.
Wenn wir einen unserer Bewohner diese Begrüßung nur ein einziges mal aussprechen lassen wollen, müssen wir uns zunächst noch das ein oder andere Quäntchen an Wissen erarbeiten.
Diese These hat übrigens einen interessanten Effekt auf aggressive Kreaturen. Denn genau wie normale Bewohner grüßen auch sie nun freundlich, machen sich dann aber daran dem Gast den Kopf vom Rumpfe zu trennen.
Wir sehen uns zur fünften Lektion, meine Schüler.