La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 17/05/2024 03:57:04


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
Djezebel
Héros
Inscrit le: 29 Sep 2005
Messages: 252
Répondre en citant
Posté le : 27/01/2006 12:45:58 Sujet du message : [Résolu] ListenPattern

Bonjour !

J'ai du mal actuellement avec les patterns.

Voici l'effet voulu :
Un groupe d'aventuriers arrive dans une pièce où il n'y a qu'un piedestal en son centre et deux "issues".
Si un PJ dit le mot de passe ("Silence"), l'une des portes s'ouvre.
Si le placeable "entend" un autre mot, c'est l'autre porte qui s'ouvre.

Actuellement je dispose de ceci :

- Une porte avec pour tag "D1Porte1"
- Une autre avec pour tag "D1Porte2"
- Un piedestal avec comme scripts :


NWScript :
// Dans le onUserDefined du placeable

#include "NW_I0_GENERIC"

void main()
{
SetAssociateListenPatterns();
SetListeningPatterns();

SetListening(OBJECT_SELF, TRUE);
SetListenPattern(OBJECT_SELF, "Silence", 1000);
SetListenPattern(OBJECT_SELF, "**", 1001);
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.



Et cela :

NWScript :
// Dans le onHeartbeat du placeable

#include "NW_I0_GENERIC"
void main()
{
int iNb = GetListenPatternNumber();
object oPJ = GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC);
//Le PJ le plus proche

switch (iNb)
{

    case 1000 :
            object oDoor = GetObjectByTag("D1Porte1");
          AssignCommand(oDoor, ActionOpenDoor(oDoor));
        break;


}
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.


Mais bien évidement... ça ne fonctionne pas.
Est-ce que le GetListenPatternNumber ne peut être fait que par un PNJ ?
Merci d'avance !
Dernière édition par Djezebel le 30/01/2006 20:29:50; édité 1 fois
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Sith Vicious
Grand Sage du Conseil
Inscrit le: 19 Oct 2005
Messages: 693
Répondre en citant
Posté le : 27/01/2006 13:24:32 Sujet du message :

Yup, il n'y a que les créatures qui peuvent écouter.
Définis les Patterns dans le OnSpawn, ensuite chaque fois qu'il va entendre une phrase ça va déclancher un script OnConversation. Teste donc la phrase entendue dans ce script (avec le GetListenPatternNumber) et ça devrait marcher beaucoup mieux.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Enki
Légende vivante
Inscrit le: 06 Déc 2005
Messages: 432
Répondre en citant
Posté le : 27/01/2006 13:26:40 Sujet du message :

Salut Djezebel !
Il y a plusieurs problème dans tes scripts.
Le premier : un placeable n'a pas d'oreille ! Utilise un PNJ invisible et transparent à la place, à coté de ton piedestal.
Le deuxième : il faut placer tes scripts sur le OnSpawn pour écouter les Patterns et sur le OnConversation (le Onuserdefined est encore mieux) pour ouvrir la porte.
Le troisième : Pas besoin de /else/ puisque tu as un /switch/.
Mets ces deux scripts :

NWScript :Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.



NWScript :
//:Confused///////////////////////// /////////////////////
//:: Custom User Defined Event


#include "NW_I0_GENERIC"
void main()
{
    int nUser = GetUserDefinedEventNumber();


    if(nUser == 1004) // ON DIALOGUE
    {

int iNb = GetListenPatternNumber();
object oPJ = GetLastSpeaker();
//Le PJ le plus proche
    object oDoor = GetObjectByTag("D1Porte1");
      object oDoor01 = GetObjectByTag("D1Porte2");
switch (iNb)
{
        case 1000 :

          AssignCommand(oDoor, ActionOpenDoor(oDoor));
        break;

      case 1001 :
      //

          AssignCommand(oDoor01, ActionOpenDoor(oDoor01));
        break;


        }

    }
}
Note : le code affiché ci-dessus n'est pas rendu tel qu'il devrait l'être réellement, en particulier des sauts de lignes sont automatiquement insérés pour éviter de casser la mise en page. En le copiant/collant, vous résoudrez ce problème.

Voilà, ça doit marcher !
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Djezebel
Héros
Inscrit le: 29 Sep 2005
Messages: 252
Répondre en citant
Posté le : 27/01/2006 14:08:36 Sujet du message :

Salut Sith Vicious et Enki !

Ca marche déjà mieux mais il y a un petit problème :

Quand le joueur dit un mot, la porte s'ouvre (jusque là, c'est normal)
Mais si on ferme la porte, toutes les 8 secondes elle se rouvre !
En gros à chaque OnHeartbeat le script va avoir en mémoire la dernière phrase prononcée et ouvrir la porte même s'il n'y a plus personne.

Je ne crois pas qu'on puisse mettre une boucle pour dire "ne le fait qu'une fois" vu que si le joueur dit une autre phrase il faut que la porte s'ouvre...
En somme, il ne faudrait que la porte ne s'ouvre qu'au moment où le PJ parle et autrement, rien ne se passe.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Sith Vicious
Grand Sage du Conseil
Inscrit le: 19 Oct 2005
Messages: 693
Répondre en citant
Posté le : 27/01/2006 17:59:49 Sujet du message :

Théoriquement, tu n'as rien à mettre dans le heartbeat, tout se passe dans le OnConversation (ou le userdef du coup). Du coup je comprends pas trop.

Autrement, tu devrais aussi vérifier que GetLastSpeaker est bien un joueur, car il peut y avoir plein de trucs qui parlent un peu partout et parfois bien cachés.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Djezebel
Héros
Inscrit le: 29 Sep 2005
Messages: 252
Répondre en citant
Posté le : 27/01/2006 19:37:05 Sujet du message :

Autant pour moi ! J'avais mis le script du OnUserDefined sur le OnHeartBeat... ceci expliquait cela ^^

Merci encore à vous deux !
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
L'Erudit
Seigneur
Inscrit le: 26 Oct 2005
Messages: 167
Répondre en citant
Posté le : 28/01/2006 04:39:31 Sujet du message :

Encore une victime de NWScript secourue Smile ! Ah, c'est beau la communauté Laughing !
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
AZAZEL11
Seigneur
Inscrit le: 08 Fév 2006
Messages: 156
Répondre en citant
Posté le : 16/12/2006 16:32:57 Sujet du message :

héhé c'est joli ce script, le ou les scripts changent beaucoup si on ne veut pas qu'il y ait de dialogues obligatoires? J'ai essayé pour moi même mais il doit avoir quelque chose que je ne fais pas de correct car rien ne fonctionne....il faut mettre quoi dans quel événements..? *a bien essayé*

le mieux encore serait le onuser en effet mais il faut changer quoi? (sans dialogues) mais j'aimerais quand meme savoir pourquoi ca ne marche pas chez moi...Mad
_________________
L'imagination est plus importante que le savoir. (Albert Einstein)
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
sto
Voyageur
Inscrit le: 11 Déc 2006
Messages: 2
Répondre en citant
Posté le : 20/12/2006 23:00:05 Sujet du message :

Le langage que vous utilisez ressemble énormément à du C. Je crois comprendre que vous avez résolu tous vos problèmes, mais peut être ça peut être interessant d'avoir des notions de C, si c'est bien le langage qui est utilisé.

Ainsi par exemple, dans un case, il est possible d'utiliser

default :
break;

c'est l'équivalent du else, pour le switch.

( [http] ) --> illustration
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
PetitPrince
Super-Mouton
Inscrit le: 12 Sep 2002
Messages: 2043
Localisation: Asteroïde B-612 actuellement crashé en Suisse
Répondre en citant
Posté le : 20/12/2006 23:14:13 Sujet du message :

sto > le NWScript est effectivement dérivé du C. Et l'utilisation du default: foo(); break; est effectivement possible Smile .
_________________
b-612.yi.org (chez moi) | tetrisconcept.com (LE site sur Tetris) | Grospixels (c'était mieux avant) | Geekzone (for and by crazy geeks)

Securom, ça suxe
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger Ignorer l'utilisateur
 
AZAZEL11
Seigneur
Inscrit le: 08 Fév 2006
Messages: 156
Répondre en citant
Posté le : 23/12/2006 21:49:47 Sujet du message :

se demande que veux dire *C* quel est son nom svp?
_________________
L'imagination est plus importante que le savoir. (Albert Einstein)
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Montrer les messages depuis :
Page 1 sur 1 ¤


Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


Sauter vers:
FAQ | Rechercher | Liste des Membres | Groupes d'utilisateurs | S'enregistrer | Profil | Se connecter pour vérifier ses messages privés | Connexion
Powered by phpBB 2.* [m] © 2001, 2002 phpBB Group
Theme rewritten in beautiful XHTML code by Baldurien.
Thème "La Bibliothèque de Neverwinter" crée par Kruger
Traduction par : phpBB-fr.com
Page generated in 28.984ms