Ouverture de porte sous condition

Répondre
Partager Rechercher
Voila j'ai un soucis pour finir une quête, j'explique le joueur doit se positionner devant une porte et "dire" le mot de passe pour qu'elle s'ouvre, jusque là ça le fait , mais j'aimerai rajouter une condition, à savoir la reconnaissance d'un objet dans l'inventaire , si le joueur donne le mdp sans l'item(une bouteille dans ce cas ci ) niet .. voila le script juste avec le mdp qui fonctionne .
Code PHP:

void main()
{
  
object riddledoor GetObjectByTag("riddledoor");
  if (!
GetIsOpen(riddledoor))
  {
     
location loc GetLocation(OBJECT_SELF);
     
vector temp GetPositionFromLocation(loc);
     
vector zIndexCorrection Vector(temp.x,temp.y,GetPositionFromLocation(GetLocation(riddledoor)).z);
     
location correctedloc Location(GetAreaFromLocation(loc),zIndexCorrection,90.0);

     
object listener CreateObject(OBJECT_TYPE_PLACEABLE,"td2_mdp",correctedloc);

     
SetListenPattern(listener,"Mephi",1000); // Entrer le MDP,
     
SetListening(listener,TRUE);
     
int seconds;
     for (
seconds 1seconds 7seconds++)
        
DelayCommand(IntToFloat(seconds),SignalEvent(listener,EventUserDefined(1300)));
  }

quelqu'un pour me sortir de ce guêpier ? :d
Je vais pas trop pouvoir t'aider dans l'immédiat vu que ça fais un moment que j'ai pas touché aux fonctions d'écoute, mais pour ajouter une condition type objet dans l'inventaire j'utilise la fonction suivante :

Code:
    
HasItem(oPJ, "tag_objet") == TRUE)
    {
    script...
    script...
    script...
    }
Ce n'est pas une fonction de base de NwN, il faut ajouter l'inclusion suivante au début du script pour la rendre accessible (erreur de compilation autrement) :

Code:
#include "nw_i0_tool"
Maintenant pour l'associer à ton mot de passe, je saurais pas faire ça maintenant. Comme je l'ai dit ça fais un bail que j'y ai pas touché et je procède pas comme sur ton script. :S

[Edit : comme l'a dit Mythyzyn, créer l'auditeur dans le script change la donne. Perso j'ai plus l'habitude d'utiliser ce genre de script dans le OnConversation d'une créature. ^^']
Citation :
Publié par Mythyzyn
Tu crées le listener dans le script en lui même, je pense que c'est la base du soucis
Ba en fait le listener est là pour le mdp uniquement, je n'ai rien ajouté au script, au sujet du futur item indispensable pour le moment
Pas sûr d'avoir bien compris ce que tu voulais...

Si c'est une fonction pour déterminer si le joueur possède un item ou pas:
Code PHP:

// Renvoie vrai si player possède un objet de tag tag valide
int HasItem(object playerstring tag)
{
   return 
GetItemPossessedBy(playertag) != OBJECT_INVALID;

Si c'est autre chose explique :)
N'étant pas chez moi je ne sais pas si ça compilera:

Code PHP:

// Definition des variables
object oPorte GetObjectByTag("riddledoor");    // Tag de la porte concernee
object oPC GetEnteringObject();        // Joueur present sur le trigger
string sObjet "TagDeLObjet";            // Tag de l'objet a avoir dans l'inventaire
string sListener "td2_mdp";            // Tag du Listener dans la palette
    
object oListener;            // Listener qui sera cree
    
location lLoc;
    
vector vTemp;
    
vector vZIndexCorrection;
    
location lCorrectedloc;
string sMDP "Mephi";                // Mot de passe a saisir
int iSeconds;                    // Nombre de secondes pour le cycle d'ecoute

// Script principal
void main()
{
    if ((
GetIsPC(oPC)) && (GetItemPossessedBy(oPC,sObjet)) && (!GetIsOpen(oPorte)))
    
// Si c'est bien un joueur, qu'il possede l'objet et que la porte est fermee:
    
{
        
// Creation du Listener
        
lLoc GetLocation(OBJECT_SELF);
        
vTemp GetPositionFromLocation(lLoc);
        
vZIndexCorrection Vector(vTemp.x,vTemp.y,GetPositionFromLocation(GetLocation(oPorte)).z);
        
lCorrectedloc location(GetAreaFromLocation(lLoc),vZIndexCorrection,90.0);
        
oListener CreateObject(OBJECT_TYPE_PLACEABLE,sListener,lCorrectedloc);

        
// Attente du mot de passe
        
SetListenPattern(oListener,sMDP,1000); // En attente du sMDP
        
SetListening(oListener,TRUE);
        for (
iSeconds 1iSeconds 7iSeconds++)
            
DelayCommand(IntToFloat(iSeconds),SignalEvent(oListener,EventUserDefined(1300)));
    }

Je crois qu'on est pas loin de ce que tu voulais
Si j'ai bien compris ton script fonctionne pour le mot de passe et tu veux juste vérifier en complément que le joueur possède un objet.

Est ce qu'il ne suffirait pas de déclarer que la porte est verrouillée et ne peut être déverrouillée que par une 'clé' (dans ton cas une bouteille), dont le tag est indiqué dans le champ approprié de la porte.
Oui Krighaur c'est exactement ça .
Moi non plus je suis pas chez moi je travaille là ... ( si si ) je te remercie cedric je testerai ce soir et je vous tiens au courant .
Citation :
Publié par krighaur
Est ce qu'il ne suffirait pas de déclarer que la porte est verrouillée et ne peut être déverrouillée que par une 'clé' (dans ton cas une bouteille), dont le tag est indiqué dans le champ approprié de la porte.
Oui ça serai plus simple effectivement mais c'est pour une suite de quète
Bon après quelques rectification fait ensemble ça compile , la porte s'ouvre après le message, mais ne tiens pas compte de l'objet dans l'inventaire, par-contre là en regardant le script , je crois qu'il y a une chtite erreur que je testerai ce soir
( if ((GetIsPC(oPC)) && (GetItemPossessedBy(oPC,sObjet)) && (!GetIsOpen(oPorte))) )
peut être dois je le remplacer par
( if ((GetIsPC(oPC)) && (GetItemPossessedBy(oPC,sObjet)) && (!GetIsClose(oPorte))) )
non ?
Le premier cas entrera dans le if si la porte est fermée, le second si la porte est ouverte donc à toi de voir ^^

Au passage, object GetItemPossessedBy(object, string) ne renvoie pas un booléen mais un objet, à mon avis ça passera pas à la compilation. Il faut transformer la condition explicitement:
Code PHP:

(GetItemPossessedBy(oPCsObjet) != OBJECT_INVALID
Ça pourrait peut-être passer si OBJECT_INVALID est une constante entière valant 0, ce que je ne sais pas. Dans tous les cas c'est plus propre d'écrire la condition clairement.
en effet il y avait un soucis de compilation avec le script cité plus haut , cedric l'a modifié hier soir avec moi via msn , mais je ne sais pas trop ce qu'il a changé en fait j'ai fait des copié collé tout en regardant un match de foot
j'ai juste essayé la compil, qui était ok, par-contre lorsque j'ai testé la porte s'ouvrait à chaque mdp , avec ou sans item dans l'inventaire, bon en ce qui concerne le (!GetIsOpen(oPorte))) )
me suis planté j'avais compris que si le joueur avait l'item et que la porte était fermé alors... la condition suivrai, et comme j'ai vu GetIsOpen
j'ai cru que cedric avait inversé, en fait c moi qui sors
Thumbs up
en effet, voilà celui compile et fonctionne:
Code PHP:

// Definition des variables
object oPorte GetObjectByTag("riddledoor"); // Tag de la porte concernee
object oPC GetEnteringObject(); // Joueur present sur le trigger
string sObjet "podelou"// Tag de l'objet a avoir dans l'inventaire
string sListener "td2_mdp"// Tag du Listener dans la palette
 
object oListener// Listener qui sera cree
 
location lLoc;
 
vector vTemp;
 
vector vZIndexCorrection;
 
location lCorrectedloc;
string sMDP "Mephi"// Mot de passe a saisir
int iSeconds// Nombre de secondes pour le cycle d'ecoute
// Script principal
void main()
{
 if ((
GetIsPC(oPC)) && (GetItemPossessedBy(oPCsObjet) != OBJECT_INVALID) && (!GetIsOpen(oPorte)))
 
// Si c'est bien un joueur, qu'il possede l'objet et que la porte est fermee:
 
{
 
// Creation du Listener
 
lLoc GetLocation(OBJECT_SELF);
 
vTemp GetPositionFromLocation(lLoc);
 
vZIndexCorrection Vector(vTemp.x,vTemp.y,GetPositionFromLocation(GetLocation(oPorte)).z);
 
lCorrectedloc Location(GetAreaFromLocation(lLoc),vZIndexCorrection,90.0);
 
oListener CreateObject(OBJECT_TYPE_PLACEABLE,sListener,lCorrectedloc);
 
// Attente du mot de passe
 
SetListenPattern(oListener,sMDP,1000); // En attente du sMDP
 
SetListening(oListener,TRUE);
 for (
iSeconds 1iSeconds 7iSeconds++)
 
DelayCommand(IntToFloat(iSeconds),SignalEvent(oListener,EventUserDefined(1300)));
 }

Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés