|
|
Lektion IV
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 "nahelegen" 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üssen, 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.
|
|
|