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 28/12/2024 10:04:06
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 |
Cassin Papa-poule(t) & poissard intemporel Messages: 7471 Localisation: 6 bis rue de la Couveuse, Poulailler 39b |
Posté le : 17/12/2002 21:09:10 Sujet du message : [BBMOD] Problème de videur qui tabasse pas les clients ;o)
Bon, j'ai un petit problème sur le module commun de la Biblio...
En effet, à l'étage de l'auberge, il y a des chambres (logique) et donc par extension des portes (logique aussi ). Il y a aussi un videur qui surveille le coin. Ce que je veux, c'est que si les joueurs se mettent à fracasser les portes, le videur arrive et les avertit ; et qu'au bout du 3ème avertissement il les attaque. J'ai donc mis ce script sur le OnPhysicallyAttacked et le OnSpellCastAt des portes : Code : object oPC = GetLastAttacker(OBJECT_SELF);
object oVideur = GetObjectByTag("videur"); void main() { SetLocalInt(oPC, "gardeauberge", GetLocalInt(oPC, "gardeauberge")+1); AssignCommand(oVideur, ActionMoveToObject (oPC, TRUE)); AssignCommand(oPC, ClearAllActions(TRUE)); DelayCommand(3.0, ActionStartConversation(oVideur, "videur")); } (la variable est initialisée à 0 lorsque les joueurs rentrent dans la zone) et le dialogue "videur" est construit comme ça : - phrase 1 : 1er averto, si la variable est à 1 - phrase 2 : 2ème averto, si la variable est à 2 - phrase 3 : 3ème averto et attaque, si la variable est à 3 ou + - phrase 4 : phrase "d'accueil", sans condition Et donc lorsque je frappe une porte, le videur arrive bien mais il me sort tout le temps la phrase 4. MAIS si je lui parle normalement (autrement dit si je clique dessus pour dialoguer), là il me sort les bonnes phrases en fonction de l'état de la variable. J'ai pas tout compris, quelqu'un à une idée ??? _________________ Aventure ! Camaraderie ! Et acier sur acier ! Les ingrédients légendaires ! Hein Bouh ? http://cassin1306.spaces.live.com Dernière édition par Cassin le 14/01/2003 08:59:02; édité 1 fois
|
Revenir en haut | |
coolstar Grand Chevalier Messages: 148 Localisation: Les Mondes - Chambre 270997 |
Hi Cassin!
Il m'est apparu une origine possible du "Bug" en lisant le Script... alors j'ai fait l'essai et chez moi ça marche maintenant! Just pour dire que tu demandes à la "Porte" de parler au "Videur"... En effet, par défaut ActionStartConversation est assignée au 'Propriétaire' du Script (en ce cas la porte!) et l'oActionSubject demeure le 'Sujet' interpelé par le-dit 'Propriétaire' (c'est-à-dire ici le Videur que tu as désigné!)... Donc, pour inverser la donne, il suffit juste de faire un AssignCommand sur oVideur avec le ActionStartConversation à l'adresse du oPC... ... _________________ Ca c'est Envoyé! Docteur Cool! Honorable Canard |
Revenir en haut | |
Cassin Papa-poule(t) & poissard intemporel Messages: 7471 Localisation: 6 bis rue de la Couveuse, Poulailler 39b |
En effet... Oui, évidemment si le videur s'adresse à la porte au lieu du joueur (bon, c'est un demi-orc, il est con c'est pas sa faute ), c'est normal que ce soit toujours la dernière phrase qui apparaisse MAIS que ça marche quand le joueur lui parle (puisque la variable est stokée sur le joueur et non sur la porte).
Remarque, maintenant que j'y pense, il pourrait y avoir une autre méthode : stocker la variable sur le videur, ça marcherait aussi Et ben merci, parce que là je me demandais vraiment où ça clochait ! Je teste ça ce midi si j'ai le temps _________________ Aventure ! Camaraderie ! Et acier sur acier ! Les ingrédients légendaires ! Hein Bouh ? http://cassin1306.spaces.live.com |
Revenir en haut | |
coolstar Grand Chevalier Messages: 148 Localisation: Les Mondes - Chambre 270997 |
Attention toujours à l'évidente règle du multi, hein? parce que là sinon, si tu mets la Variable sur le NPC, ben tous les joueurs auront droit à la même réponse en cours!
... _________________ Ca c'est Envoyé! Docteur Cool! Honorable Canard Dernière édition par coolstar le 18/12/2002 11:49:36; édité 2 fois
|
Revenir en haut | |
Cassin Papa-poule(t) & poissard intemporel Messages: 7471 Localisation: 6 bis rue de la Couveuse, Poulailler 39b |
Oui mais bon, c'est trop grave, puisqu'ils sont sensés être du même groupe (c'est du mutli coop, pas un monde persistant "chacun pour soit" )
_________________ Aventure ! Camaraderie ! Et acier sur acier ! Les ingrédients légendaires ! Hein Bouh ? http://cassin1306.spaces.live.com |
Revenir en haut | |
coolstar Grand Chevalier Messages: 148 Localisation: Les Mondes - Chambre 270997 |
Enfin bon, c toi qui vois, mais c surtout pour le réalisment que je dis ça!
... PS : Content tout de même d'avoir pu te rendre service... _________________ Ca c'est Envoyé! Docteur Cool! Honorable Canard |
Revenir en haut | |
Cassin Papa-poule(t) & poissard intemporel Messages: 7471 Localisation: 6 bis rue de la Couveuse, Poulailler 39b |
Bon, pas eu beaucoup de temps ce midi (et en plus ce soir je vais voir le SdA donc je pourrais pas bosser dessus ), mais il en résulte que la conversation ne se déclenche plus du tout !
J'ai modifié mon script comme ça Code : object oPC = GetLastAttacker(OBJECT_SELF);
object oVideur = GetObjectByTag("videur"); void main() { SetLocalInt(oPC, "gardeauberge", GetLocalInt(oPC, "gardeauberge")+1); ActionSpeakString(GetLocalString(oPC, "gardeauberge")); // Test pour vérifier l'état de la variable AssignCommand(oVideur, ActionMoveToObject (oPC, TRUE)); AssignCommand(oPC, ClearAllActions(TRUE)); DelayCommand(5.0, AssignCommand(oVideur, ActionStartConversation(oPC, "videur"))); } Donc j'ai fais un AssignCommand imbriqué dans un DelayCommand, c'est peut-être ça qui fait planter (pas eu le temps de tester plus avant) De même, j'ai voulu vérifier l'état de la variable comme l'a conseillée Nylou sur JOL, mais j'ai du me gourer dans le ActionSpeakStringn car ça ne s'affiche pas. Enfin bref, je m'y plongerais plus profondément dès que possible _________________ Aventure ! Camaraderie ! Et acier sur acier ! Les ingrédients légendaires ! Hein Bouh ? http://cassin1306.spaces.live.com |
Revenir en haut | |
coolstar Grand Chevalier Messages: 148 Localisation: Les Mondes - Chambre 270997 |
Haa? J'espérais pouvoir t'orienter comme ça... enfin bon voilà le Script avec lequel ça marche chez moi...
Code : object oPC = GetLastAttacker(OBJECT_SELF); object oVideur = GetObjectByTag("videur"); void main() { SetLocalInt(oPC, "gardeauberge", GetLocalInt(oPC, "gardeauberge")+1); // Là on incrémente le compteur d'avertissements AssignCommand(oVideur, ActionMoveToObject (oPC, TRUE)); // Le videur marche vers le joueur AssignCommand(oPC, ClearAllActions(TRUE)); // On fait arrêter l'action d'attaquer la porte au joueur DelayCommand(3.0, AssignCommand(oVideur, ActionStartConversation(oPC, "videur"))); // Petit délais obligatoire pour laisser au videur le temps d'arriver jusqu'au joueur } EDIT : ---------------------- Ha ben tiens, c couillon... je viens de réaliser que c exactement le même que le tien... Comment est-ce possible alors que ça ne marche pas chez toi??? Tu dois effectivement avoir un prob externe... je vais essayer ton Script chez moi pour voir le "Test des Variables"... ---------------------- _________________ Ca c'est Envoyé! Docteur Cool! Honorable Canard |
Revenir en haut | |
Cassin Papa-poule(t) & poissard intemporel Messages: 7471 Localisation: 6 bis rue de la Couveuse, Poulailler 39b |
Bon, je viens d'essayer le tiens vite fait au bureau (mais quoi-heu ! ), en fait ça marche sauf qu'une fois sur deux il marque "vous êtes trop agité pour tenir une conversation".
En fait j'avais poussé le délais à 5s (parce qu'en 3, le videur n'a pas le temps d'arriver jusqu'au joueur s'il est à l'autre bout de la pièce), et ça a marché la première fois mais pas les 2 suivantes Bizarre ça... _________________ Aventure ! Camaraderie ! Et acier sur acier ! Les ingrédients légendaires ! Hein Bouh ? http://cassin1306.spaces.live.com |
Revenir en haut | |
coolstar Grand Chevalier Messages: 148 Localisation: Les Mondes - Chambre 270997 |
Effectivement... j'ai rencontré le même prob... et le tien marche, bien évidemment, aussi chez moi... le fait est que même avec ClearAllActions le PC achève au moins ce qu'il a commencé, ce qui peut ainsi prendre du temps selon l'action d'attaque ci-concernée... et si le NPC le sollicite alors, ben ça passe pas... Alors faut trouver un moyen de mieux neutraliser le PC pour qu'il soit réceptif!
... _________________ Ca c'est Envoyé! Docteur Cool! Honorable Canard |
Revenir en haut | |
coolstar Grand Chevalier Messages: 148 Localisation: Les Mondes - Chambre 270997 |
Et si tu essayais ça, non? Effet garanti!
Code : /* Script permettant au NPC de s’adresser au PC "en train de terminer" une ‘Action’… A mettre uniquement dans les ‘OnPhysicalAttacked’ & ‘OnSpellCastAt’ : NOTE: Il est inutile ici d’initialiser la Variable, puisqu'elle le sera par l''Incrémentation' ; au départ elle sera considérée donc comme ‘Nulle par défaut'. */ void main() { object oPC = GetLastAttacker(); // On repère l''Agresseur' de la Porte object oVideur = GetNearestObjectByTag("videur"); // Au cas où on voudrait avoir plusieurs gars int nValue = GetLocalInt(oPC, "gardeauberge"); // 'Acquisition' de la Valeur "en cours" AssignCommand(oPC, ClearAllActions()); // Arrête le PC dans son "Action d’éclat" AssignCommand(oVideur, ClearAllActions()); // On s’assure que le NPC puisse faire ainsi ce qu’on lui demande AssignCommand(oVideur, ActionMoveToObject (oPC, TRUE)); // Amène le NPC vers le fauteur SetLocalInt(oPC, "gardeauberge", nValue+1); // De ‘Nulle’ la Variable passe à ‘+1’ ; et ainsi de suite if (nValue < 1) // On vérifie si une Variable a déjà été définie ; sinon : AssignCommand(oVideur, SpeakString("Hé! Calmez-vous là!")); // Le NPC peut interpeller le PC avant de retourner à sa place DelayCommand(5.0, AssignCommand(oVideur, ActionMoveToLocation(GetLocation(GetObjectByTag("poste_videur"))))); if (nValue == 1) // On vérifie que la Variable est bien ‘Acquise’ à ‘1’ : AssignCommand(oVideur, SpeakString("Arrêtez-vous de suite! C'est la dernière fois que je vous le dis!")); // Idem au précédent DelayCommand(5.0, AssignCommand(oVideur, ActionMoveToLocation(GetLocation(GetObjectByTag("poste_videur"))))); if (nValue == 2) // On s’assure que la Variable est passée à ‘2’ : { AssignCommand(oVideur, SpeakString("Très bien, vous l'aurez voulu!")); // Dernière Sommation AdjustReputation(oPC, oVideur, -100); // Mode ‘Agressif’ du NPC contre le PC AssignCommand(oVideur, ActionAttack(oPC)); // Mode ‘Combat’ du NPC contre le PC } } _________________ Ca c'est Envoyé! Docteur Cool! Honorable Canard |
Revenir en haut | |
coolstar Grand Chevalier Messages: 148 Localisation: Les Mondes - Chambre 270997 |
Une autre idée?
Code : /* Script permettant au NPC de s’adresser au PC "en train de terminer" une ‘Action’… A mettre uniquement dans les ‘OnPhysicalAttacked’ & ‘OnSpellCastAt’ : NOTE: Il est inutile ici d’initialiser la Variable, puisqu'elle le sera par l''Incrémentation' ; au départ elle sera considérée donc comme ‘Nulle par défaut'. */ void main() { object oPC = GetLastAttacker(); // On repère l''Agresseur' de la Porte object oVideur = GetNearestObjectByTag("videur"); // Au cas où on voudrait avoir plusieurs gars int nValue = GetLocalInt(oPC, "gardeauberge"); // 'Acquisition' de la Valeur "en cours" AssignCommand(oPC, ClearAllActions()); // Arrête le PC dans son "Action d’éclat" AssignCommand(oVideur, ClearAllActions()); // On s’assure que le NPC puisse faire ainsi ce qu’on lui demande AssignCommand(oVideur, ActionMoveToObject (oPC, TRUE)); // Amène le NPC vers le fauteur DelayCommand(8.0, AssignCommand(oVideur, ActionMoveToLocation(GetLocation(GetObjectByTag("poste_videur"))))); // Retour SetLocalInt(oPC, "gardeauberge", nValue+1); // De ‘Nulle’ la Variable passe à ‘+1’ ; et ainsi de suite if (nValue < 1) // On vérifie si une Variable a déjà été définie ; sinon : AssignCommand(oVideur, SpeakString("Hé! Calmez-vous là!")); // Le NPC peut interpeller le PC if (nValue == 1) // On vérifie que la Variable est bien ‘Acquise’ à ‘1’ : AssignCommand(oVideur, SpeakString("Arrêtez-vous de suite! C'est la dernière fois que je vous le dis!")); // Idem au précédent if (nValue > 1) // On s’assure que la Variable est maintenant supérieur à '1' : { AssignCommand(oVideur, SpeakString("Très bien, vous l'aurez voulu!")); // Dernières Sommations AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_LISTEN)); // Le PC est interpelé par l'injonction DelayCommand(0.0, SetCommandable(FALSE, oPC)); // Le PC s'arrête sous l'ordre brutal AdjustReputation(oPC, oVideur, -100); // Mode ‘Agressif’ du NPC contre le PC AssignCommand(oVideur, ActionAttack(oPC)); // Mode ‘Combat’ du NPC contre le PC DelayCommand(1.5, SetCommandable(TRUE, oPC)); // Le PC reprends ensuite ses esprits DelayCommand(5.0, AssignCommand(oVideur, SurrenderToEnemies())); // Break, le NPC se contentant d'un brève correction DelayCommand(6.5, AssignCommand(oVideur, SpeakString("Et que je ne vous y reprenne plus!"))); } } _________________ Ca c'est Envoyé! Docteur Cool! Honorable Canard |
Revenir en haut | |
Cassin Papa-poule(t) & poissard intemporel Messages: 7471 Localisation: 6 bis rue de la Couveuse, Poulailler 39b |
OK, merci, j'essaie ça dès que je peux !
_________________ Aventure ! Camaraderie ! Et acier sur acier ! Les ingrédients légendaires ! Hein Bouh ? http://cassin1306.spaces.live.com |
Revenir en haut | |
Konrad Grand Maître Chanteur du Conseil Messages: 1258 Localisation: Empire d'Halöven |
Mais dites donc cassin ? tu es entrain de nous préparer un pire truc ?
_________________ Le site du Module Dragon Noir Le groupe du Module L5A - L'ombre et la Lumière Crimson Skies |
Revenir en haut | |
Cassin Papa-poule(t) & poissard intemporel Messages: 7471 Localisation: 6 bis rue de la Couveuse, Poulailler 39b |
Ben en fait je voulais implémenter ce système de garde/videur dans Loup Solitaire 2, donc le module de la Biblio servira un peu de cobaye
_________________ Aventure ! Camaraderie ! Et acier sur acier ! Les ingrédients légendaires ! Hein Bouh ? http://cassin1306.spaces.live.com |
Revenir en haut | |
coolstar Grand Chevalier Messages: 148 Localisation: Les Mondes - Chambre 270997 |
|
Revenir en haut | |
Cassin Papa-poule(t) & poissard intemporel Messages: 7471 Localisation: 6 bis rue de la Couveuse, Poulailler 39b |
Non, pas encore eu le temps d'essayer...
EDIT : Yep ! Ca marche ! Merci beaucoup, Maître Canard ! _________________ Aventure ! Camaraderie ! Et acier sur acier ! Les ingrédients légendaires ! Hein Bouh ? http://cassin1306.spaces.live.com |
Revenir en haut | |
coolstar Grand Chevalier Messages: 148 Localisation: Les Mondes - Chambre 270997 |
|
Revenir en haut | |
coolstar Grand Chevalier Messages: 148 Localisation: Les Mondes - Chambre 270997 |
Autre manière d'écrire ton Script très cher Cassin (et ça a le mérite très propre de pourvoir étendre le nombre d'interpellations par le biais de nouvelles CASES!)...
Code : /* Script permettant au NPC de s’adresser au PC "en train de terminer" une ‘Action’… A mettre uniquement dans les ‘OnPhysicalAttacked’ & ‘OnSpellCastAt’ : NOTE: Il est inutile ici d’initialiser la Variable, puisqu'elle le sera par l''Incrémentation' ; au départ elle sera considérée donc comme ‘Nulle par défaut'. */ void main() { object oPC = GetLastAttacker(); // On repère l''Agresseur' de la Porte object oVideur = GetNearestObjectByTag("videur"); // Au cas où on voudrait avoir plusieurs gars string sSpeak; // Phrase que le NPC devra prononcer... string sVarName = "gardeauberge"; // Nom de la Variable "gardeauberge" int nValue = GetLocalInt(oPC, sVarName); // 'Acquisition' de la Valeur "en cours" int bRun = TRUE; // Mode 'Course' location lPoste = GetLocation(GetObjectByTag("poste_videur")); // Localisation du 'Poste' du Videur AssignCommand(oPC, ClearAllActions()); // Arrête le PC dans son "Action d’éclat" AssignCommand(oVideur, ClearAllActions()); // On s’assure que le NPC puisse faire ainsi ce qu’on lui demande switch (nValue) { // Valeur par defaut avant initialisation de la Variable "gardeauberge" : case 0//: sSpeak = "Hé! Calmez-vous là!"; break; // Valeur de la Variable "gardeauberge" apres le 1er avertissement : case 1//: sSpeak = "Arrêtez-vous de suite! C'est la dernière fois que je vous le dis!"; break; // Toutes autres Valeurs de la Variable "gardeauberge" (a partir de la 3e Sommation) : default //: sSpeak = "Très bien, vous l'aurez voulu!"; AssignCommand(oVideur, ActionAttack(oPC)); break; // (NPC Mode en ‘Combat’ non 'Aggressif') } AssignCommand(oVideur, ActionMoveToObject (oPC, bRun)); // Amène le NPC vers le fauteur AssignCommand(oVideur, SpeakString(sSpeak)); // Le NPC interpelle le PC (par 'Texte Flottant') sSpeak = "Et que je ne vous y reprenne plus!"; // Phrase de 'Retour'... DelayCommand(7.8, AssignCommand(oVideur, SpeakString(sSpeak))); // Expression sur le 'Retour' DelayCommand(8.0, AssignCommand(oVideur, ActionMoveToLocation(lPoste))); // 'Retour' au Poste SetLocalInt(oPC, sVarName, nValue+1); // De ‘Nulle’ la Variable passe à ‘+1’ (et ainsi de suite!) } _________________ Ca c'est Envoyé! Docteur Cool! Honorable Canard |
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