La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
FAQ
Rechercher
Liste des Membres
Groupes d'utilisateurs
S'enregistrer Se connecter pour vérifier ses messages privés Connexion
S'enregistrer Se connecter pour vérifier ses messages privés Connexion
La date/heure actuelle est 23/11/2024 17:51:03
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 |
Fantome Ecuyer Messages: 63 |
Posté le : 12/01/2004 12:03:11 Sujet du message : Script - Prendre un objets à plusieurs joueurs ...
Bonjour à tous,
j'ai posté il y aquelques jours ce post sur un autre forum mais sans trop de succès... bref je suis toujours avec mon pb, aussi je me permet de vous l'exposer et voir si aupres de vous je peux trouver une solution. J'aimerais réaliser la mise en scene de cette quete : Un groupe de joueurs rencontre un pnj. Ce pnj au cours de la discution décide de prendre à chacun des joueurs un objet qu'il posséde en leur lancant un sort. Puis le PNJ disparait. Lesdit objets pris sont alors transféré dans un contenant et les joueurs doivent se débrouiller pour le retrouver et récupérer leur matos (peut etre en rajoutant une option de limite de durer pour récup leur matos, par exemple 1 heure). Savez vous si un tel script existe déjà ou s'en rapproche. J'ai cherché mais j'ai rien trouvé d'approchant. Peut etre que parmi vous, certains savent comment s'y prendre pour : - prendre un objet sur chacun des pjs (et si possible un objet qu'il porte(arme, armure, botte, bracelet, ou anneau). - placer ces objets dans un contenant pour une durée d'une heure (avec sauvegarde des objets dans le contenant). - je précise que pour simplifier, le pnj serait dans une et une seule piece avec tous les joueurs: il faudrait donc qu'il prenne un objet à tous les pjs présents dans la pieces (qu'ils soient visibles ou non). Merci pour votre aide. A+ |
Revenir en haut | |
Longbow Grand Sage du Conseil Messages: 638 Localisation: Orléans |
Hum... Hum...
Alors là c'est effectivement du lourd car il y a plusieurs choses à prendre en compte... Essayons... 1. Créer un journal avec un Tag "Quest" 10: L'annonce de la quête// 20: la quête a échouée // 30: la quête a réussi 2. Créer un coffre avec le tag CoffreBase 3. Placer le script suivant dans le HeartBeat du coffre NWScript :
// a placer dans le Heart Beat du coffre void main() { int iActuel = GetTimeHour(); int iTest = GetLocalInt(GetModule(), "Rebour"); if ((iActuel >= iTest) && (GetLocalInt(GetModule(), "Coffre_Quest") >= 10 )) { AddJournalQuestEntry("Quest", 20, GetFirstPC(), TRUE,TRUE,FALSE); DestroyObject(OBJECT_SELF,1.0); } } 4. Créer un dialogue et mettre ce script dans l'onglet "Actions Conséquentes" du PNJ NWScript :
// A mettre dans le "Actions Consequentes" du PNJ !!!!!! void main() { object oPC = GetFirstPC(); object oCoffre = GetObjectByTag("CoffreBase"); // L'heure de test = l'heure du dialogue + 12 heures int iRebour = (GetTimeHour()+12); SetLocalInt(GetModule(), "Rebour", iRebour); ActionPauseConversation(); // Une mise a niveau du journal des joueurs AddJournalQuestEntry("Quest", 10, GetPCSpeaker(), TRUE,TRUE,FALSE); // Une mise a niveau de la variable locale qui va gerer cette quete et le temps. SetLocalInt(GetModule(), "Coffre_Quest", 10); // Petite invocation ActionCastFakeSpellAtObject(SPELL_CREEPING_DOOM,GetPCSpeaker()); while(GetIsObjectValid(oPC)==TRUE) { //object oItem = GetFirstItemInInventory(oPC); object oItem = GetItemInSlot(INVENTORY_SLOT_CHEST, oPC); CopyItem(oItem, oCoffre); DestroyObject(oItem, 1.0); DelayCommand(1.0, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectKnockdown(),oPC,10.0)); DelayCommand(3.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect (VFX_IMP_DOOM),oPC)); } // "GetNextPC" avant ou apres la } ??? oPC = GetNextPC(); // La conversation reprend... ActionResumeConversation(); } Plusieurs interrogations... a/ oPC = GetNextPC() doit-il être avant ou après le "}" à essayer si ca marche pas ainsi... b/ La gestion du temps.. A essayer en modifiant le 12 par 1 pour tester. Si ca marche en 1 heure, ca fonctionnera en 12 !! Beaucoup de sources d'erreur... Tiens-moi au courant... Mais c'était stimulant... _________________ Rex illeteratus Quasi Asinus Coronatus Jean de Salisbury |
Revenir en haut | |
Fantome Ecuyer Messages: 63 |
Merci Longbow de t'être penché sur mon probleme. Je vais tester ta solution ce week end et je te tiendrais au courant.(j'ai pas le jeu avec moi durant la semaine)
J'aurais aimé une précision: comment fonctionne la ligne de code suivante : 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. ca prend: un objet porté par le joueur mais sur quel emplacement ? Ou est ce un objet porté sur le pj de facon aléatoire? Pourquoi dis tu que c'est source de beaucoup d'erreur ? Encore Merci, je suis impatient de tester ... |
Revenir en haut | |
lendraste Grand Maître Chanteur du Conseil Messages: 1403 Localisation: Quelque part ailleurs |
Fantome a écrit : comment fonctionne la ligne de code suivante :
INVENTORY_SLOT_CHEST est une constante donnée par Bioware. Elle représente, dans le cadre de la fonction utilisée GetItemInSlot, l'emplacement Armure/Vêtement du personnage. Si tu désires faire appel au hasard, il faut déterminer aléatoirement la valeur de la constante utilisée dans la commande. A noter, par ailleurs, qu'une détermination au hasard n'est pas forcément évidente, surtout si le joueur n'a aucun (ou presque) objet équipé sur lui. Il faudrait d'abord s'assurer de ce qu'il porte avant de décider de lui enlever quoi que ce soit. Par rapport à ce que tu demandais, le choix de l'Armure est assez arbitraire.
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. ca prend: un objet porté par le joueur mais sur quel emplacement ? Ou est ce un objet porté sur le pj de facon aléatoire? Citation : pourquoi dis tu que c'est source de beaucoup d'erreur ? Car Longbow laisse un doute planer sur l'emplacement d'une commande ( oPC=GetNextPC() ) laquelle doit d'ailleurs figurer dans la boucle (avant le } ) et non en dehors. L'idée de la boucle étant de parcourir la liste de tous les PJs présent dans le module pour leur enlever leur armure et la mettre dans un coffre. Ce n'est donc pas tout à fait ce que tu attendais, car tous les PJs seront affectés dans le module et non seulement les PJs présent dans la "pièce" ou se trouve le PNJ.
Je vais voir si je peux arranger cela, à moins que Longbow ait le temps de le faire _________________ Lendraste de Loreval Qui cherche la Vérité cherche celui qui la détient, car elle n'existe pas à l'état naturel. La cité des mensonges - 1 |
Revenir en haut | |
Fantome Ecuyer Messages: 63 |
Merci Lendraste pour ta réponse.
En fait, en ce qui concerne la prise de l'armure/vetement d'un pj, j'ai un peu peur, qu'avec le temps, les joueurs se rendent finallement compte qu'il suffit de ne pas porter d'armure/vetement pour éviter d'être affecté par ce petit emprunt momentanée . C'est pourquoi je pense qu'un tirage aléatoire est plus adapté, et j'irais même plus loin en disant qu'il faudrait que si le pj porte rien (y aura toujours un petit malin pour tout oter ! ) alors on prends directement dans le reste de l'inventaire. En effet je veux limiter l'effet du 'drop' à seulement la piece où sont les pjs et le pnj , et non à l'ensemble du module. Merci. |
Revenir en haut | |
Longbow Grand Sage du Conseil Messages: 638 Localisation: Orléans |
HUm... Hum...
Ne t'inquiètes pas pour l'objet à retirer, quand le reste sera clair, on fera un tirage aléatoire... _________________ Rex illeteratus Quasi Asinus Coronatus Jean de Salisbury |
Revenir en haut | |
lendraste Grand Maître Chanteur du Conseil Messages: 1403 Localisation: Quelque part ailleurs |
L'une des solutions pourrait consister à marquer les PJs lors de leur entrée dans la salle du PNJs. Pour cela il faut dessiner un trigger invisible qui couvre les dimensions de la salle et écrire les scripts suivant sur le OnEnter et le OnExit :
OnEnter du trigger NWScript :
void main() { object oCreature = GetEnteringObject(); if (GetIsPC(oCreature)) { SetLocalInt(oCreature, "VICTIM", 1); } } OnExit du trigger NWScript :
void main() { object oCreature = GetExitingObject(); if (GetIsPC(oCreature)) { DeleteLocalInt(oCreature, "VICTIM"); } } Une fois ceci fait, on sait qu'au moment ou le PNJ déclenche son sort, tous les PJs connectés au module portant une variable VICTIM égale à 1, il sont plus facile à repérer (même pour le cas ou le PJ se déco dans le salle, au moment de sa reconnexion le trigger est redéclenché donc il récupérera sa variable VICTIM). Pour le sort à proprement parler, voici ce que j'écrirai : NWScript :
object GetRandomItemFromPC(object oPC) { object oItem; return oItem; } void main() { object oItem; object oChest = GetObjectByTag("CoffreBase"); object oPC = GetFirstPC(); while (GetIsObjectValid(oPC)) { if (GetLocalInt(oPC, "VICTIM")==1) { // ici les fioritures. oItem = GetRandomItemFromPC(oPC); if (GetIsObjectValid(oItem)) { CopyItem(oItem, oChest); DestroyObject(oItem); } } oPC = GetNextPC(); } } Voilà, j'ai laissé des commentaires pour faire d'éventuels ajouts. Je n'ai pas résolu encore le cas de la sélection aléatoire de l'objet, mais il suffit de compléter la fonction GetRandomItemFromPC . Pour la durée de vie des objets dans le coffre, il me semble que la méthode était à peu près bonne. _________________ Lendraste de Loreval Qui cherche la Vérité cherche celui qui la détient, car elle n'existe pas à l'état naturel. La cité des mensonges - 1 |
Revenir en haut | |
Longbow Grand Sage du Conseil Messages: 638 Localisation: Orléans |
Hum... Hum...
Citation : Pour la durée de vie des objets dans le coffre, il me semble que la méthode était à peu près bonne. Comment ça à peu près bonne ? Soit ca fonctionne soit ca coince... Pour l'heure, j'attend que Fantome teste le script pour lancer la phase Random..._________________ Rex illeteratus Quasi Asinus Coronatus Jean de Salisbury |
Revenir en haut | |
lendraste Grand Maître Chanteur du Conseil Messages: 1403 Localisation: Quelque part ailleurs |
Longbow a écrit : Hum... Hum...
Allons, ne t'ennerves pas . Je ne me suis pas apesanti plus de 5 secondes sur cette partie de ton script, je ne peux donc donner qu'une impression (et encore sur la méthode et non sur le script). Je n'ai pas davantage eu le loisir de tester. On verra bien donc. C'était plus une manière de dire que je n'allais pas traiter ce qui l'a déjà été.Citation : Pour la durée de vie des objets dans le coffre, il me semble que la méthode était à peu près bonne. Comment ça à peu près bonne ? Soit ca fonctionne soit ca coince... Pour l'heure, j'attend que Fantome teste le script pour lancer la phase Random..._________________ Lendraste de Loreval Qui cherche la Vérité cherche celui qui la détient, car elle n'existe pas à l'état naturel. La cité des mensonges - 1 |
Revenir en haut | |
Longbow Grand Sage du Conseil Messages: 638 Localisation: Orléans |
Hum... Hum...
C'est la partie du script qui me tarabuste le plus... Et je n'ai pas le moyen de savoir si ca fonctionne ou non... Super frustrant... Alors Fantome, Au nom du Dieu Fou, est-ce que ca fonctionne ??? _________________ Rex illeteratus Quasi Asinus Coronatus Jean de Salisbury |
Revenir en haut | |
Fantome Ecuyer Messages: 63 |
Je pourrais pas tester avant ce week end, désolé je vais devoir vous faire patienter pour tester tout ca.
|
Revenir en haut | |
Fantome Ecuyer Messages: 63 |
Bonjour ,
j'ai testé le script de Longbow, résultat des courses : - au début j'ai cru que ca m'avais planté mon PC, l'anime ne s'intérrompait pas - j'ai bel et bien eu mon armure de droppée - dans la fenetre j'ai eu l'info comme quoi il y avait trop d'info a éxécuté (j'ai fait un screen mais je sias pas comment vous le montrer j'ai pas de site internet pour poser la photo) - je suis allé voir dans le coffre, il y aavit bien ma tenue mais le hic c'est qu'elle était présente pour les 25 pages de contenance du coffre, a raison de 3 par pages, ca en faisait 75 ! (c'est à mon avis pour ca que l'anim continuait sans cesse au début. - ce test j'ai pu le réaliser qu'en solo voilà je pense pas avoir oublié quoique se soit à vous dire sur ce test. Avez vous des questions ? Pouvez vous intégrez lefait que l'effet soit limité uniquement aux pjs présent dans la piece avec le pnj? J'ai pas testé le script de Lendraste, je vais essayer de le faire .... je vous tiens au courant. Merci pour votre aide. A+ PS: je sais pas trop comment m'y prendre pour tester ton code Lendraste, si je remplace ta partie dropp aléatoire par celle de longbow je vais avoir le même pb lié au drop des 75 fois, non ?! |
Revenir en haut | |
aldech Gagnant du Concours Gothic 3 Messages: 61 Localisation: Le Havre |
J'ai testé avec le code de Longbow, cela fonctionne bien !
Pour ton problème de 75 fois, je pense que ton problème vient de là : Citation : // "GetNextPC" avant ou apres la } ??? oPC = GetNextPC(); Citation : Pouvez vous intégrez le fait que l'effet soit limité uniquement aux pjs présent dans la piece avec le pnj? Citation : b/ La gestion du temps.. A essayer en modifiant le 12 par 1 pour tester. Si ca marche en 1 heure, ca fonctionnera en 12 !! |
Revenir en haut | |
Fantome Ecuyer Messages: 63 |
Désolé Aldech, j'ai effectivement passé sur les points que tu mentionnes.
Je vais re-testé des ce soir.... Et pour le dropp aléatoire, une petite idée ? |
Revenir en haut | |
lendraste Grand Maître Chanteur du Conseil Messages: 1403 Localisation: Quelque part ailleurs |
Pour la sélection aléatoire, il faudrait reprendre ma solution et implémenter la fonction GetRandomItemFromPC comme suit :
NWScript :
object GetRandomItemFromPC(object oPC) { object oItem = OBJECT_INVALID; int nCount = 0; int nCnt; object oTmp; for (nCnt = 0; nCnt <= 17; nCnt++) { oTmp = GetItemInInventory(nCnt, oPC); if (GetIsObjectValid(oTmp)) { nCount++; SetLocalObject(oPC, "EQUIPED" + IntToString(nCount), oTmp); } } if (nCount > 0) { int nRanItem = Random(nCount) + 1; oItem = GetLocalObject(oPC, "EQUIPED" + IntToString(nCount)); for (nCnt = 1; nCnt <= nCount; nCnt++) { DeleteLocalObject(oPC, "EQUIPED" + IntToString(nCnt)); } } else { nCnt = 0; oTmp = GetFirstItemInInventory(oPC); // retrouver le premier objet d'inventaire while (GetIsObjectValid(oTmp)) { nCnt++; oTmp = GetNextItemInInventory(oPC); // On va chercher l'objet suivant } if (nCnt>0) { nCount = Random(nCnt); oTmp = GetFirstItemInInventory(oPC); // On initialise un nouveau parcours d'inventaire while (nCount > 0) { nCount--; oTmp = GetNextItemInInventory(oPC); // On cherche l'objet d'inventaire suivant } oItem = oTmp; // Le dernier objet pris dans l'inventaire pour lequel le compteur est 0 } } return oItem; } Cette fonction parcours d'abord les objets équipés pour en choisir un aléatoirement dedans. Si aucun objet équipé n'est trouvé, elle parcoure l'inventaire, une première fois pour les compter, une seconde fois pour trouver celui qu'elle a choisi. La fonction renvoie donc un objet aléatoire de l'équipement pour être traité ensuite dans le reste du code que j'ai donné plus haut. _________________ Lendraste de Loreval Qui cherche la Vérité cherche celui qui la détient, car elle n'existe pas à l'état naturel. La cité des mensonges - 1 |
Revenir en haut | |
micka Grand Sage du Conseil Messages: 884 Localisation: /dev/null |
Pour le choix de l'objet, on pourrait peut être aussi choisir celui qui a le plus de valeur, en bouclant sur l'inventaire avec GetGoldPieceValue.
Ça mettrait un peu de piment, non? |
Revenir en haut | |
Fantome Ecuyer Messages: 63 |
Bonjour,
j'ai enfin testé (désolé ca été long!, j'avais pas trop le temps). Et ca marche comme je le souhaite. Mercie à Tous pour votre participation. |
Revenir en haut | |
La Bibliothèque de Neverwinter Nights Index du Forum »
La Bibliothèque Binaire du NWScript - Neverwinter Nights
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