La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 02/06/2024 07:05:12


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
Le Blaireau
Chevalier
Inscrit le: 17 Jan 2005
Messages: 71
Répondre en citant
Posté le : 22/01/2006 19:31:52 Sujet du message : Une porte 3 clef....

Bonjours a tous !!
J'ai une quete à faire qui se termine avec l'ouverture d'une porte qui demanderait 3 objets pour etre dévérouillée.... Est-ce possible ? Et si oui, comment ?
 
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 : 22/01/2006 20:06:40 Sujet du message :

Oui c'est tout à fait possible. Il faut plaçer comme condition, la possession de ces 3 objets en question.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Semcatala
Grand Sage du Conseil
Inscrit le: 20 Jan 2004
Messages: 951
Répondre en citant
Posté le : 22/01/2006 22:21:25 Sujet du message :

tiens , j'avais un peu de temps et comme j'avais jamais fait ça , j'ai un peu cherché et je t'ai fait ce piti script , je pense que ça devrait t'aller :

A mettre dans le "onareatransitionclick" de la porte

NWScript :

#include "nw_i0_plot"

void main()
{
object oPC = GetClickingObject();
int clef_or = HasItem(oPC,"clefor");
int clef_argent = HasItem(oPC,"clefargent");
int clef_bronze = HasItem(oPC,"clefbronze");

    if ( clef_or == TRUE && clef_argent == TRUE && clef_bronze == TRUE )
    {
    SetLocked(OBJECT_SELF,FALSE);
    ActionOpenDoor(OBJECT_SELF);
    DelayCommand(15.0,ActionCloseDoor(OBJECT_SELF));
    DelayCommand(15.0,SetLocked(OBJECT_SELF,TRUE));
    }
    else
    SetLocked(OBJECT_SELF,TRUE);
}
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.

_________________
" La ruse doit être employée pour faire croire que l'on est où l'on est pas, que l'on veut ce qu'on ne veut pas. " CdG
" La véritable école du Commandement est la culture générale. " CdG
" Une société prête à sacrifier un peu de liberté contre un peu de sécurité ne mérite ni l'une ni l'autre et finit par perdre les deux. " B.F
" La gloire se donne seulement à ceux qui l'ont toujours rêvée. " CdG
" La fin de l'espoir est le commencement de la mort. " CdG
 
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 : 23/01/2006 00:27:47 Sujet du message :

Coucou, pourquoi le "onareatransitionclick"? Je le mettrais plutôt dans le OnFailToOpen, si la porte est initialement verrouillée. De plus, cela rend le else SetLocked facultatif.

Pourquoi le "#include "nw_i0_plot""?
 
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 : 23/01/2006 01:08:31 Sujet du message :


L'Erudit a écrit :
Pourquoi le "#include "nw_i0_plot""?
Pour le HasItem().

Et à propos, HasItem c'est pratique, mais dans ce cas là, ça fait faire 3 boucles là où une suffit, dans ces cas là il vaut mieux y aller à la main et faire un truc du genre :
NWScript :

/////
void main()
{
object oPC = GetLastUsedBy();
if (!GetIsPC(oPC)) return;
object oItem = GetFirstItemInInventory(oPC);
string sTag = "";
int bGold,bBronze,bSilver,bAll = FALSE;
while (!bAll && GetIsObjectValid(oItem))
{
sTag = GetTag(oItem);
if (sTag == "clefor") bGold = TRUE;
else if (sTag == "clefargent") bSilver = TRUE;
else if (sTag == "clefbronze) bBronze = TRUE;
bAll = (bGold && bSilver && bBronze);
oItem = GetNextItemInInventory(oPC);
}
if (bAll)
{
//fin du script
}
}
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.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Semcatala
Grand Sage du Conseil
Inscrit le: 20 Jan 2004
Messages: 951
Répondre en citant
Posté le : 23/01/2006 11:15:24 Sujet du message :

SiThvicious > En effet je ferais 3 boucles , mais avec ta solution , on fera AU MINIMUM 3 boucles ( si il n'y a que les 3 clefs dans l'inventaire du joueur ) , et au maximum autant de boucles qu'il y aura d'objets entre le premier objet de l'inventaire et ta derniére clef.


Je ne suis pas convaincu que ta solution soit la plus économique ! Surprised
_________________
" La ruse doit être employée pour faire croire que l'on est où l'on est pas, que l'on veut ce qu'on ne veut pas. " CdG
" La véritable école du Commandement est la culture générale. " CdG
" Une société prête à sacrifier un peu de liberté contre un peu de sécurité ne mérite ni l'une ni l'autre et finit par perdre les deux. " B.F
" La gloire se donne seulement à ceux qui l'ont toujours rêvée. " CdG
" La fin de l'espoir est le commencement de la mort. " CdG
 
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 : 23/01/2006 13:02:59 Sujet du message :

Je comprends pas bien ta remarque. Je ne fais qu'une boucle sur l'inventaire du joueur, de plus elle s'arrete si les 3 clefs sont présentes, je vois pas trop comment faire plus économique. Le seul doute qu'on puisse avoir, c'est sur le fonctionnement de GetItemPossessedBy(), qui est codé en dur et qui du coup est peut-être plus rapide qu'une boucle sur l'inventaire mais j'en suis pas convaincu.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Semcatala
Grand Sage du Conseil
Inscrit le: 20 Jan 2004
Messages: 951
Répondre en citant
Posté le : 23/01/2006 13:28:37 Sujet du message :

Sith Vicious> ok , je comprends mieux ce que tu veux dire , j'avais pris le HasItem pour une fonction rapide qui vérifie instantanement si on possede ou pas un objet , mais apparement chaque HasItem fait un tour complet de l'inventaire du joueur pour vérifier si on à l'objet ou pas.

En fait j'ai découvert le HasItem hier soir ( tout nouveau tout beau ! Very Happy ) , j'ai trouvé ça sympa , et je trouvais que ça rendais le script plus clair de l'utiliser ! Laughing

En tout cas c'est clair que si je dois économiser des ressources je ferais une seule boucle !
_________________
" La ruse doit être employée pour faire croire que l'on est où l'on est pas, que l'on veut ce qu'on ne veut pas. " CdG
" La véritable école du Commandement est la culture générale. " CdG
" Une société prête à sacrifier un peu de liberté contre un peu de sécurité ne mérite ni l'une ni l'autre et finit par perdre les deux. " B.F
" La gloire se donne seulement à ceux qui l'ont toujours rêvée. " CdG
" La fin de l'espoir est le commencement de la mort. " CdG
 
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 : 24/01/2006 06:09:38 Sujet du message :

@Sith Vicious

Je crois que oPC=GetClickingObject() et non GetLastUsedBy()
Oui personnellement, j'aurais pensé à GetItemPossessedBy() en premier, pas besoin d'include, pas besoin de boucle(s) et ca simplifie de beaucoup vos scripts longs et compliqués.
 
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 : 24/01/2006 11:22:46 Sujet du message :

>L'érudit : pour la définition d'oPC, tout dépend de là où tu cases le script, et je suis assez d'accord avec toi qu'il serait mieux sur un OnFailedToOpen d'où le GetLastUsedBy.

Sinon HasItem c'est GetItemPossessedBy, c'est juste un raccourci, au lieu de renvoyer l'item ça renvoie une valeur TRUE/FALSE. Et je pense que grosso modo ça fait un scan de l'inventaire, donc je reste convaincu que faire soi même la boucle va plus vite (mais je peux pas être sur) que de la faire faire trois fois.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Semcatala
Grand Sage du Conseil
Inscrit le: 20 Jan 2004
Messages: 951
Répondre en citant
Posté le : 24/01/2006 12:37:32 Sujet du message :

Sith Vicious & L'erudit > je viens de faire des essais , en effet , j'étais persuadé d'avoir mis mes scripts dans le "onareatransitionclick " , ce que j'avais fait , mais je les avait AUSSI mis dans le " onfailtoopen " , donc je confirme qu'ils ont leur place dans le " onfailtoopen " en non pas dans le " onareatransitionclick ".

Par contre sithvicious , je ne pense pas que tu ai essayé ton script , car le GetLastUsedBy ne fonctionne pas sur le Onfailtoopen , seul le "GetClickingObject()" fonctionne.

J'ai pris 2 portes et dans le "onfailtoopen" de chacune j'ai mis un de ces 2 scripts :

NWScript :


void main()
{
object oPC = GetClickingObject();

SendMessageToPC(oPC,"Vous jouez sur le jeu NeverWinterNights");
SendMessageToPC(oPC,"Test du 'GetClickingObject()'");

}
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 :


void main()
{
object oPC = GetLastUsedBy();

SendMessageToPC(oPC,"Vous jouez sur le jeu NeverWinterNights");
SendMessageToPC(oPC,"Test du 'GetLastUsedBy()'");

}
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 seul celui du GetClickingObject renvoie le message en message serveur.
_________________
" La ruse doit être employée pour faire croire que l'on est où l'on est pas, que l'on veut ce qu'on ne veut pas. " CdG
" La véritable école du Commandement est la culture générale. " CdG
" Une société prête à sacrifier un peu de liberté contre un peu de sécurité ne mérite ni l'une ni l'autre et finit par perdre les deux. " B.F
" La gloire se donne seulement à ceux qui l'ont toujours rêvée. " CdG
" La fin de l'espoir est le commencement de la mort. " CdG
 
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 : 24/01/2006 13:11:39 Sujet du message :


Citation :
Sith Vicious & L'erudit > je viens de faire des essais , en effet , j'étais persuadé d'avoir mis mes scripts dans le "onareatransitionclick " , ce que j'avais fait , mais je les avait AUSSI mis dans le " onfailtoopen " , donc je confirme qu'ils ont leur place dans le " onfailtoopen " en non pas dans le " onareatransitionclick ".
Bah voui, c'est ce que je disais Laughing !


Citation :
Par contre sithvicious , je ne pense pas que tu ai essayé ton script , car le GetLastUsedBy ne fonctionne pas sur le Onfailtoopen , seul le "GetClickingObject()" fonctionne.
Qu'est ce que je disais Laughing ?

@Sith Vicious
Dans le cas où HasItem() ou GetItemPossessedBy() parcourent tout l'inventaire pour trouver chaque instance, il vaut mieux en effet utiliser une boucle.
Imaginons que le dernier objet testé soit une des 3 clés, et que le PJ ait les deux autres, alors, bAll = TRUE, mais, GetNextItemInInventory() renverra OBJECT_INVALID, pour le prochain item, ce qui fera s'executer de nouveau la boucle (à moins que la fonction GetNextItemInInventory() teste de nouveau le premier item après le dernier?).
 
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 : 24/01/2006 14:31:58 Sujet du message :

>Semcatala, effectivement j'ai absolument pas testé, donc je pensais que GetLastUsedBy marchait. C'est bon à savoir Very Happy

>L'érudit : ?? dans ce cas la condition c'est (!TRUE && FALSE) == (FALSE && FALSE) == FALSE, donc la boucle s'arrete, il n'y a pas de problème, lapin compris.
 
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 : 25/01/2006 06:51:54 Sujet du message :

Effectivement, la boucle est bien bouclée Laughing !
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Le Blaireau
Chevalier
Inscrit le: 17 Jan 2005
Messages: 71
Répondre en citant
Posté le : 26/01/2006 14:04:15 Sujet du message :

Laughing:lol
Je dois dire que vous m'avez légèrement perdu.
Pour faire un court résumé, quel est le bon script et je dois le placer où ??
Merci
 
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 : 26/01/2006 19:23:52 Sujet du message :

Ben pour résumer, je crois que le comité populaire du script estime que ce script devrait convenir :

A placer dans le OnFailToOpen de la porte (véruillée la porte hein, sinon ça fail pas to open...)

NWScript :

void main()
{
object oPC = GetClickingObject();
if (!GetIsPC(oPC)) return;
object oItem = GetFirstItemInInventory(oPC);
string sTag = "";
int bGold,bBronze,bSilver,bAll = FALSE;
while (!bAll && GetIsObjectValid(oItem))
{
    sTag = GetTag(oItem);
    if (sTag == "clefor") bGold = TRUE;
      else if (sTag == "clefargent") bSilver = TRUE;
      else if (sTag == "clefbronze) bBronze = TRUE;
    bAll = (bGold && bSilver && bBronze);
    oItem = GetNextItemInInventory(oPC);
}
if (bAll)
{
    SetLocked(OBJECT_SELF,FALSE);
    ActionOpenDoor(OBJECT_SELF);
    DelayCommand(15.0,ActionCloseDoor(OBJECT_SELF));
    DelayCommand(15.0,SetLocked(OBJECT_SELF,TRUE));

}
}
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.


Donc à remplacer les tags des clefs (ouais on est pas dans l'aigle d'or là). Et aussi vérifier si ça marche parce qu'on a beaucoup parlé mais on a pas trop essayé non plus. En tout cas ni moi ni aucun memebre du comité ne pourra être tenu responsable du non fonctionnement du script ou des dommages qu'il pourrait créer à des tiers.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Le Blaireau
Chevalier
Inscrit le: 17 Jan 2005
Messages: 71
Répondre en citant
Posté le : 27/01/2006 16:27:30 Sujet du message :

Bon... Ca fonctionne mais....
Je vous explique...
Lors de mon test, j'arrive à cette fameuse porte, j'essais d'ouvrir et elle est verrouillée.
Je prends ensuite les 3 objets nessesaire à l'ouverture. J'essais d'ouvrir une première fois et c'est verrouillé... au deuxième essai ça ouvre....donc ont est très prêt du but...

Ah oui !! j'avais oublié de mentionner... Les 3 objets doivent disparaître de l'inventaire un fois la porte ouverte...
 
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 18:09:00 Sujet du message :

NWScript :

void main()
{
object oPC = GetClickingObject();
if (!GetIsPC(oPC)) return;
object oItem = GetFirstItemInInventory(oPC);
string sTag = "";
int bGold,bBronze,bSilver,bAll = FALSE;
object oKeyG,oKeyS,oKeyB = OBJECT_INVALID;
while (!bAll && GetIsObjectValid(oItem))
{
sTag = GetTag(oItem);
if (sTag == "clefor")
{
bGold = TRUE;
oKeyG = oItem;
}
else if (sTag == "clefargent")
    {
        bSilver = TRUE;
        oKeyS = oItem;
    }
else if (sTag == "clefbronze)
    {
        bBronze = TRUE;
        oKeyB = oItem;
      }
bAll = (bGold && bSilver && bBronze);
oItem = GetNextItemInInventory(oPC);
}
if (bAll)
{
SetLocked(OBJECT_SELF,FALSE);
AssignCommand(OBJECT_SELF,ActionOpenDoor(OBJECT_SELF));
DelayCommand(15.0,AssignCommand(OBJECT_SELF,ActionCloseDoor(OBJECT_SELF)));
DelayCommand(15.0,SetLocked(OBJECT_SELF,TRUE));
DestroyObject(oKeyG);
DestroyObject(oKeyB);
DestroyObject(oKeyS);
}
}
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.


C'est mieux ?
 
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 132.858ms