
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.







La date/heure actuelle est 05/04/2025 19:43:21
La Bibliothèque de Neverwinter Nights Index du Forum »
La Bibliothèque Binaire du NWScript - Neverwinter Nights
Voir le sujet précédent ¤ Voir le sujet suivant | |
---|---|
Auteur | Message |
Le Blaireau Chevalier Messages: 71 |
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 | ![]() ![]() ![]() |
L'Erudit Seigneur ![]() Messages: 167 |
Oui c'est tout à fait possible. Il faut plaçer comme condition, la possession de ces 3 objets en question.
|
Revenir en haut | ![]() ![]() ![]() |
Semcatala Grand Sage du Conseil ![]() Messages: 951 |
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); } _________________ " 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 | ![]() ![]() ![]() |
L'Erudit Seigneur ![]() Messages: 167 |
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 | ![]() ![]() ![]() |
Sith Vicious Grand Sage du Conseil ![]() Messages: 693 |
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 } } |
Revenir en haut | ![]() ![]() ![]() |
Semcatala Grand Sage du Conseil ![]() Messages: 951 |
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 ! ![]() _________________ " 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 | ![]() ![]() ![]() |
Sith Vicious Grand Sage du Conseil ![]() Messages: 693 |
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 | ![]() ![]() ![]() |
Semcatala Grand Sage du Conseil ![]() Messages: 951 |
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 ! ![]() ![]() 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 | ![]() ![]() ![]() |
L'Erudit Seigneur ![]() Messages: 167 |
@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 | ![]() ![]() ![]() |
Sith Vicious Grand Sage du Conseil ![]() Messages: 693 |
>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 | ![]() ![]() ![]() |
Semcatala Grand Sage du Conseil ![]() Messages: 951 |
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()'"); } NWScript :
void main() { object oPC = GetLastUsedBy(); SendMessageToPC(oPC,"Vous jouez sur le jeu NeverWinterNights"); SendMessageToPC(oPC,"Test du 'GetLastUsedBy()'"); } 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 | ![]() ![]() ![]() |
L'Erudit Seigneur ![]() Messages: 167 |
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 ![]() 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 ![]() @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 | ![]() ![]() ![]() |
Sith Vicious Grand Sage du Conseil ![]() Messages: 693 |
>Semcatala, effectivement j'ai absolument pas testé, donc je pensais que GetLastUsedBy marchait. C'est bon à savoir
![]() >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 | ![]() ![]() ![]() |
L'Erudit Seigneur ![]() Messages: 167 |
Effectivement, la boucle est bien bouclée
![]() |
Revenir en haut | ![]() ![]() ![]() |
Le Blaireau Chevalier Messages: 71 |
![]() 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 | ![]() ![]() ![]() |
Sith Vicious Grand Sage du Conseil ![]() Messages: 693 |
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)); } } 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 | ![]() ![]() ![]() |
Le Blaireau Chevalier Messages: 71 |
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 | ![]() ![]() ![]() |
Sith Vicious Grand Sage du Conseil ![]() Messages: 693 |
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); } } C'est mieux ? |
Revenir en haut | ![]() ![]() ![]() |


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