Willkommen Anonymous, es sind 31 User online. [ Anzeigen ]


[RPG]Board Neverwinter Nights NWN Scripting


[ Login ] [ Registrieren ] [ Abo ] [ Suche ] [ Profil ] [ Hilfe ]


Operatoren: zauriel, Avantenor
Moderatoren: NWN Moderat, Camael, IRQ
[ ANTWORTEN ]
[ FAQ ]
Autor Druckansicht   Thema: Parole wird abgefragt
Seite: 1
Meruba2

Profil anschauen ]

erstellt am 14.07.2013 um 03:37 Uhr eMail schreiben      Zitatantwort        #1858486

Und da bin ich schon wieder mit einer Frage.

Ich habe eine Tür und möchte, sobald der Spieler sie anklickt, dass sich ein Satz löst mit einer Frage.
Daraufhin soll der Spieler die Parole tippern und wenn richtig, geht die Tür auf.

In eurem Forum habe ich ein schönes Skript entdeckt und es funktioniert soweit, das die Tür sich öffnet, sobald man das Losungswort sagt. Doch die Frage will mir die doofe Tür nicht ausspucken *grml*

Ich hab es bisher folgendermaßen versucht....

Einstellungen
Tür - Kennzeichnung patrole01
Schloss - verschlossen + kann wieder verschlossen werden

Skript
unter OnHeartbeat:

//::///////////////////////////////////////////////
//:: FileName ci_parole01
//:://////////////////////////////////////////////

void main()
{
object oTargetDoor;
oTargetDoor = GetObjectByTag ("parole01"); // Kennzeichnung Tuer
SetListening(OBJECT_SELF,TRUE);
SetListenPattern(OBJECT_SELF,"Scharfrichter",2001); // Oeffnen
SetListenPattern(OBJECT_SELF,"Zu",2002); // Schliessen
if (GetIsOpen(oTargetDoor) == FALSE)
{
int nMatch = GetListenPatternNumber();
if (nMatch == 2001) {
SpeakString("Ihr hört ein lautes Knarren und die Türe öffnet sich.");
AssignCommand(oTargetDoor, ActionOpenDoor(oTargetDoor));
}
}
}


-----------------------------------------------------------
Skript unter OnOpen

//::///////////////////////////////////////////////
//:: FileName tlk_parole01
//:://////////////////////////////////////////////

void main()
{
ActionStartConversation(GetLastUsedBy(),"",TRUE);
}

-----------------------------------------------------------

Bei Erweitert habe ich folgendes herumgeschraubt...

Fraktion Bürgerlicher
Gespräch kein Abbruch und das Gespräch hat genau eine Zeile.

"Ich binde mir den Hanfkragen um , um mit ....hmhmhm...zu tanzen?"

Und die genau die Zeile spuckt die Tür nicht aus.
Habe schon versucht die Frage in das Skript ci_parole01 einzubinden, bisher erfolglos.

Kann mir hierbei jemand einen kleinen Tipp geben bitte?

--
Isladora - Eine Insel im Schwertmeer
[Externer Link - Bitte einloggen oder registrieren]

MonsieurPomme@ZW

Profil anschauen ]

erstellt am 14.07.2013 um 12:34 Uhr   Homepage besuchen    Zitatantwort        #1858508

seit 1.69 gibts ja dankenswerterweise das PCChat Event, deswegen brauchst du das imho nicht mehr über ein Heartbeat Script machen. Ich hätte das deswegen so gelöst:

OnPCChat Script:

 
 
void main() 
{ 
 
object oPC = GetPCChatSpeaker(); 
string sPhrase = GetPCChatMessage(); 
 
if (GetLocalInt(oPC, "ParoleTrigger") == 1) 
        { 
        object oDoor = GetNearestObjectByTag("ParoleDoor", oPC); 
        string sPasswortToOpen = GetLocalString(oDoor, "Open"); 
        string sPasswortToClose = GetLocalString(oDoor, "Close"); 
 
            if (GetIsOpen(oDoor) != TRUE) 
            { 
                if(sPhrase == sPasswortToOpen) 
                { 
                AssignCommand(oDoor, ActionOpenDoor(oDoor)); 
                AssignCommand(oDoor, SpeakString("Text bla bla..")); 
                } 
            } 
            else 
            { 
                if(sPhrase == sPasswortToClose) 
                { 
                AssignCommand(oDoor, ActionCloseDoor(oDoor)); 
                AssignCommand(oDoor, SpeakString("Text bla bla..")); 
                } 
            } 
 
        } 
}


Damit nicht jede Eingabe abgefragt wird, wird nur nach Passwörtern gesucht, wenn der PC in einem Auslöser rumsteht. Die entsprechenden Passwörter für auf und zu lassen sich als Variable in den Türeigenschaften festlegen. so kann man das Skript für unendlich viele Türen nutzen (soll dabei der Text den die Tür spricht auch jedes mal anders sein, müsste man das auch noch über die Variablen der Tür machen).

Für den Auslöser braucht man dann nur noch simple OnEnter/OnExit Scripts

void main() 
{ 
object oPC = GetEnteringObject(); 
 
SetLocalInt(oPC, GetLocalString(OBJECT_SELF, "TriggerVar"),1); 
}


void main() 
{ 
object oPC = GetExitingObject(); 
 
DeleteLocalInt(oPC, GetLocalString(OBJECT_SELF, "TriggerVar")); 
}


auch hier wieder (ich mag das^^) über die Variablen des Auslösers. So brauche ich nur 2 Skripte für einen Auslöser, mache mir ein Blueprint davon und wann immer ich dann zukünftig ne simple ja-nein Abfrage in nem Auslöser brauche, nutze ich das Ding
Meruba2

Profil anschauen ]

erstellt am 14.07.2013 um 17:24 Uhr eMail schreiben      Zitatantwort        #1858532

Danke für die schnelle Antwort
Werd es heute noch ausprobieren, auch wenn ich aus dem Kopf nicht wüsste, schon mal OnPCChat in der Skriptliste der Tür gesehen zu haben. Werd das schon finden ^^

--
Isladora - Eine Insel im Schwertmeer
[Externer Link - Bitte einloggen oder registrieren]

MonsieurPomme@ZW

Profil anschauen ]

erstellt am 14.07.2013 um 17:37 Uhr   Homepage besuchen    Zitatantwort        #1858533

das läuft auch nicht über die Tür, das ist n Modulevent
dunahan

Profil anschauen ]

erstellt am 14.07.2013 um 20:14 Uhr   Homepage besuchen    Zitatantwort        #1858553

Ich hab das auch mal bei was annerem genutzt... Aber ohne OnHeartbeat zu nutzen....

Also du müsstest als erstes das Gespräch starten. Ich tats bei OnDisturbed, da bei mir ein Item rein gelegt werden musste. Das sollte eigentlich auch über OnOpen gehen... Habs aber gerade nicht ausprobiert.

Dann im Gespräch solltest du dann die folgenden zwei Skripte unterbringen:
1) Das auf jeden Fall zuerst!
void main() 
{ 
  SetListening(OBJECT_SELF, TRUE); 
  SelListenPattern(OBJECT_SELF, "**", 60002); 
}


2) Das hier Prüft dann nach ob der Spieler richtig gesprochen hat...
void main() 
{ 
  object oTargetDoor = GetObjectByTag ("parole01"); // Kennzeichnung Tuer  
 
  if (GetIsListening(OBJECT_SELF) == TRUE) 
  { 
    if (GetListenPatternNumber() == 60002) 
    { 
      string sSaid = GetMatchedSubstring(0); 
 
      if (sSaid == "Losung") 
      { 
        SpeakString("Ihr hört ein lautes Knarren und die Türe öffnet sich."); 
        AssignCommand(oTargetDoor, ActionOpenDoor(oTargetDoor));  
      } 
    } 
  } 
} 

Meruba2

Profil anschauen ]

erstellt am 14.07.2013 um 20:18 Uhr eMail schreiben      Zitatantwort        #1858554

Was würde ich ohne euch Zwei nur machen Fühlt euch mal ganz doll gedrückt und vielen vielen Dank.

--
Isladora - Eine Insel im Schwertmeer
[Externer Link - Bitte einloggen oder registrieren]

dunahan

Profil anschauen ]

erstellt am 23.07.2013 um 19:24 Uhr   Homepage besuchen    Zitatantwort        #1859471

Also mich hat die Anfrage nicht ganz losgelassen

Ich hab mir mal was ausgedacht und soweit ich das bisher getestet hab, funkt es auch.
Zuallererst brauchst du drei Dinge:
1) Einen Auslöser mit einem einzigartigen Tag,
2) Eine Tür mit dem Tag des Auslösers UND einem kleinen Kürzel, das sie von dem Auslöser unterscheidet,
3) Ein Gespräch mit nur zwei Zeilen, davon die Erste, die die Tür sprechen wird und die Zweite, die der SC "denken" darf.

Das rührst du mit diesen vier Skripten zusammen:

// Kommt in einen Ausloser bei OnEnter rein 
 
#include "door_par_inc" 
 
void main() 
{ 
  object oEnter = GetEnteringObject();         // Erfasse das betrende Objekt 
  string sTag = GetTag(OBJECT_SELF);           // Lese den Tag des Auslosers aus 
  object oDoor = GetObjectByTag("Door_"+sTag); // Erfasse die Tur 
 
  if (GetLocked(oDoor) == FALSE)               // Tur ist nicht abgeschlossen, 
    return;                                    // somit brich das Skript ab 
 
  sTag = GetStringLowerCase(sTag);             // Kleinschrift des Tags des Ausloesers zur Verarbeitung 
 
  string sParole = Parole(sTag);               // Bilde die Parole, siehe Include-File door_par_inc 
  string sLosung = Losung(sTag);               // Bilde die Losung 
 
  SetLocalString(oDoor, "parole", sParole);    // Speichere diese auf der Tur ab 
  SetLocalString(oDoor, "losung", sLosung);    // Speichere diese auf der Tur ab 
 
  AssignCommand(oEnter, ClearAllActions(TRUE)); // Beende alle Handlungen des betretenden Objekts und 
  AssignCommand(oDoor, ActionStartConversation(oEnter, "door_par_tlkfile", FALSE, TRUE)); // starte das Gesprach 
}


// Kommt in das Gespraech in einen Zweig des SC's unter OnActionTaken rein (zweiter Reiter) 
 
#include "door_par_inc" 
 
void main() 
{ 
  object oDoor = OBJECT_SELF;                        // Erfasse die Tuer 
  object oEnter = GetPCSpeaker();                    // Erfasse den Sprecher 
 
  string sSaid;                                      // Lege eine notwendige temporaere Variable an 
  string sLosung = GetLocalString(OBJECT_SELF, "losung"); // Erfasse die Losung 
 
  if (GetIsListening(oDoor) == TRUE)                 // Hoert die Tuer zu? 
  { 
    if (GetListenPatternNumber() == 67000)           // Wenn die Tuer etwas hoerte 
    { 
      sSaid = GetMatchedSubstring(0);                // Erfasse das gehoehrte 
      sSaid = GetStringLowerCase(sSaid);             // und verwandle es in Kleinbuchstaben 
 
      if (TestStringAgainstPattern(sLosung, sSaid) == TRUE) // Stimmt das Gehoerte mit der Losung ueberein 
      { 
        SendMessageToPC(oEnter, "Ihr hört ein lautes Knarren und die Türe öffnet sich."); 
        AssignCommand(oDoor, ActionUnlockObject(oDoor)); 
        AssignCommand(oDoor, ActionOpenDoor(oDoor));      // Oeffne die Tuer 
      } 
    } 
  } 
}


// Kommt in das Gespraech unter den ERSTEN Abschnitt der Tuer und in OnTextAppearsWhen (erster Reiter) 
 
#include "door_par_inc" 
 
int StartingConditional() 
{ 
  string sParole = GetLocalString(OBJECT_SELF, "parole");  // Erfasse die Parole 
  SetCustomToken(67000, sParole);                          // und lege sie ins Gespraech 
 
  SetListening(OBJECT_SELF, TRUE);                         // Lasse die Tuer nun horchen 
  SetListenPattern(OBJECT_SELF, "**", 67000);              // Setze alle Woerter als Relevant 
 
  return TRUE;                                             // Gebe Wahr aus, damit der Gespraechsteil erscheint 
}


/* void main() { } 
 
Include Datei fuer das Parolen-Skript der Tueren 
Darin werden alle Parolen und Losungen abgelegt 
WIIIICHTIG: Nach jeder Veraenderung in diesem Skript, 
immer einen Module Build ausfuehren!!! 
 
*/ 
 
string Losung(string sTag) 
{ 
  string sResult; 
  sTag = GetStringLowerCase(sTag); 
 
  if (sTag == "") 
    sResult = "zu"; 
 
  else if (sTag == "parole01") 
    sResult = "parola"; 
 
/* fuer neue Parolen/Losungen. Folgenden Abschnitt kopieren und entsprechend ausgefuellt einfuegen 
  else if (sTag == "paroleXY") 
    sResult = "Losung fur neue Parole"; 
*/ 
 
  else 
    sResult = "zu"; 
 
  return sResult; 
} 
 
string Parole(string sTag) 
{ 
  string sResult; 
  sTag = GetStringLowerCase(sTag); 
 
  if (sTag == "") 
    sResult = "zu"; 
 
  else if (sTag == "parole01") 
    sResult = "Paroliere mal brav!"; 
 
/* fuer neue Parolen/Losungen. Folgenden Abschnitt kopieren und entsprechend ausgefuellt einfuegen 
  else if (sTag == "paroleXY") 
    sResult = "Losung fur neue Parole"; 
*/ 
 
  else 
    sResult = "zu"; 
 
  return sResult; 
}


Das sollte eigentlich auch zu deinem Erfolg führen

Grüßle
Dunahan
Meruba2

Profil anschauen ]

erstellt am 23.07.2013 um 21:46 Uhr eMail schreiben      Zitatantwort        #1859492

Guckt auf das Skript und schluckt kräftig... ooook das muss ich mir ohne Hitzeflash genau ansehen ^^ Danke Dunahan

--
Isladora - Eine Insel im Schwertmeer
[Externer Link - Bitte einloggen oder registrieren]

Seite: 1
Druckansicht   Thema: Parole wird abgefragt  
[ ANTWORTEN ]

[RPG]Board Neverwinter Nights NWN Scripting

  


[RPG]Board 1.94.01 wird betrieben von Sebastian "Pandur" Olle.
Programmiert von Andreas "Monti" Bytzek.
Nutzungsbedingungen / Impressum / Haftungsausschluss / Datenschutz
Scriptlaufzeit: 0.10 sec