Bienvenue sur JeuxOnLine - MMO, MMORPG et MOBA !
Les sites de JeuxOnLine...
 

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

Sesame ouvre-toi

Par Symphonik le 17/10/2002 à 17:06:21 (#2352728)

Mon besoin :

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)

Super idée ! bravo j'aurais aimé l'avoir celle là.

Par eMRaistlin le 17/10/2002 à 17:51:13 (#2353072)

En gros, la solution la plus simple, pour eviter le OnHeartBeat : Tu fais en sorte que la porte s'autodetruise une fois l'enigme resolue (en plus, ca peut faire sympa avec un visualFX.)

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)

Bon j'ai crée une variante qui évite le OnHeartBeat

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)

Je pense que ta deuxième solution est bien plus propre, le heartbeat en lui même est déjà un petit pbm, mais surtout aucun autre événement que l'OnConversation ne peut garantir de choper toutes les "matchs". Si des NPCs en combat sont dans les environs, par exemple, il y a peu de chance que les joeurs arrivent à se faire entendre au millieu des "SHOUT_ATTACK_MY_TARGET" et autres "I_AM_DYING".

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)

il est vraiment genial, avec ta permition je vai de ce pas m'en servire dans mon modul
encore bravo

JOL Archives 1.0.1
@ JOL / JeuxOnLine