Archives des forums MMO/MMORPG > Neverwinter Nights > NWN - Maskado > Sesame ouvre-toi
Sesame ouvre-toi
Par Symphonik le 17/10/2002 à 17:06:21 (#2352728)
Une porte qui s'ouvre sur un mot de commande (que le joueur tape au clavier dans l'espace reservé a ce effet (cry))
Ce que j'ai déjà fais :
Et ca marche
Une porte vérouillée avec le script dialogue_p sur l'evenement OnFailToOen
le script motdepasse_p sur l'evenement OnHeartBeat
script dialogue_p :
void main()
{
ActionSpeakString("Enigme");
SetListening(OBJECT_SELF,TRUE);
SetListenPattern(OBJECT_SELF,"test",2001);
}
en gros la porte dit l'enigme quant on tente de l'ouvrir puis se prépare à l'écoute des mots "dits" par les joueurs.
Script motdepasse_p :
void main()
{
if(GetLocked(OBJECT_SELF))
{
int i = 0;
int nMatch = GetListenPatternNumber();
if(nMatch == 2001)
{
nMatch = GetMatchedSubstringsCount();
while(i<nMatch)
{
if(GetMatchedSubstring(i)=="reponse")
{
ActionUnlockObject(OBJECT_SELF);
ActionSpeakString("Correct, vous pouvez entrer");
}
i++;
}
}
}
}
en gros, teste si elle est verrouillée (si non, cela veut dire qu'on a deja donné le mot de passe donc plus besoin de la deverrouiller)
"lit" les mots entendus, les teste un a un pour voir si la reponse a été donnée, si oui deverrouillage de la porte.
Ce que je souhaite savoir :
Si mon script est correctement écrit (il fonctionne)
Si il y a plus simple (tout en conservant les même fonctionnalités)
Si on peut une fois déverrouillée, arreter l'evenement OnHeartBeat désormais inutile et qui "mange" un peu de ressource.
Merci :p
Par mobidique le 17/10/2002 à 17:47:26 (#2353043)
Par eMRaistlin le 17/10/2002 à 17:51:13 (#2353072)
Sinon, je crois que le OnHeartBeat est pas necessaire... je te cherche ca, et j'edite mon post.
En attendant : http://nwvault.ign.com/Files/scripts/data/1030932720341.shtml
Par Symphonik le 18/10/2002 à 9:55:20 (#2356081)
je me sers d'un pnj qui va me servir d'écoute
donc je crée une porte (verouillée, intrigue ok)
sur son evenement OnFailToOpen
void main()
{
ActionSpeakString("Enigme");
}
=> La porte dit l'enigme quant on essait de l'ouvrir
je crée un pnj à coté de la porte en rapport avec le décors, (pnj innoffensif qui ne surprend pas par sa présence, chauve souris dans les mines, chien dans une ville, etc)
(on peut aussi le rendre invisible au besoin)
sur son evenement OnSpawn
void main()
{
SetListening(OBJECT_SELF,TRUE);
SetListenPattern(OBJECT_SELF,"reponse",2001);
}
on défini la réponse à l'enigme
sur son evenement OnConversation (qui donc se déclenche quant le joueur "dit" (tape) quelque chose)
void main()
{
int nMatch = GetListenPatternNumber();
if(nMatch == 2001)
{
SetLocked ( GetObjectByTag("t_p_door_mine"),FALSE );
}
}
t_p_door_mine étant le TAG de la porte à dévérrouiller....
Si vous avez d'autres astuces ou solutions pour ce sesame, n'hésitez pas.
Par LeProctophantasmiste le 18/10/2002 à 17:08:13 (#2358245)
J'ai une suggestion si tu veux te "passer" du NPC il y a une apparence "Null human" ("Néant humain" en français), qui est un humain invisible (enfin pour peu que tu lui enlève l'équipement qui pourrait lui être conféré par défaut). Je n'ai pas trouvé son équivalent dans les blueprint standard (mais j'ai pu le rater), donc il faut passer par le "creature wizard", et selectionner cette apparence.
A vrai dire je ne comprenais pas très bien ton premier script, l'utilisation de GetMatchedSubstring() alors qu'il n'y avait pas de wildcard (**) notament.
Si tu as un peu utilisé cette fonction est ce que tu pourrais m'expliquer un truc? COmment est-ce que les substring sont déterminées:
pour reprendre l'exemple du lexicon soit
SetListenPattern(OBJECT_SELF, "**foo**bar**", 500);
et le NPC entend "foofoofoobarbarbar"
résultat:
GetMatchedSubstring(0) returns ".
GetMatchedSubstring(1) returns "foo".
GetMatchedSubstring(2) returns "foofoo".
GetMatchedSubstring(3) returns "bar".
GetMatchedSubstring(4) returns "barbar".
Mais sans précision sur le moteur ce pourrait aussi être:
GetMatchedSubstring(0) returns "foofoo".
GetMatchedSubstring(1) returns "foo".
GetMatchedSubstring(2) returns "bar".
GetMatchedSubstring(3) returns "bar".
GetMatchedSubstring(4) returns "bar".
Est-ce que c'est en partant de la fin et en maximisant les substring par exemple?
Merci.
escellent ce script
Par rincevent le 19/10/2002 à 17:22:05 (#2364393)
encore bravo
JOL Archives 1.0.1
@ JOL / JeuxOnLine