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 20:21:57
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 |
finipe Grand Sage du Conseil Messages: 519 Localisation: Nantes |
Posté le : 18/05/2003 08:27:35 Sujet du message : Un placeable déclenche un script au bout de X secondes
Salut la compagnie !
Je me demandais s'il y avait moyen de savoir quand un jouer CESSE d'utiliser un placeable... en l'occurrence sur mon script (situé dans le onUsed d'un placeable) il y a une commande faisant effectuer une animation au joueur. J'aimerais que des trucs se produisent si et seulement si le joueur reste bien sage sans bouger pendant au moins 30 secondes... J'ai beau me creuser la tête je trouve pas de solution (il faudrait que l'animation en question soit considérée comme une action ce serait jouable peut-être, mais ce n'est pas le cas...) Que Scriptos le grand dieu du script me vienne en aide ! _________________ » Le Tref & l'Aucube : Histoire, misanthropie & zoologie léonine » 1626, le Gant & l'Epée : intrigues & duels sous le règne de Louis XIII |
Revenir en haut | |
Tyrion Ecuyer Messages: 43 |
Citation : J'aimerais que des trucs se produisent si et seulement si le joueur reste bien sage sans bouger pendant au moins 30 secondes... Ca doit etre faisable en mettant un systeme de perception ( un genre de testeur de proximite) et un chronometre pour le declenchement
Citation : Je me demandais s'il y avait moyen de savoir quand un jouer CESSE d'utiliser un placeable... en l'occurrence sur mon script (situé dans le onUsed d'un placeable) il y a une commande faisant effectuer une animation au joueur. hum pour sa je ne sais pas du tout. |
Revenir en haut | |
Wololo Légende vivante Messages: 385 |
hmm, tu peux toujours détruire l'ancien pour en créer un autre celui ci utilisable (2 versions du même placeable donc ..)
de toute facon, tu ne peux pas allouer dynamaiquement le OnUsed par défaut ... |
Revenir en haut | |
finipe Grand Sage du Conseil Messages: 519 Localisation: Nantes |
Eh oui, c'est bien ça le problème... je songeais à un script sur le onUsed, avec un EventUserDefined(1001) pour le joueur, et un compteur de cycles... enfin quelle galère ! Tant pis, je laisse tomber, je vais tricher avec un GetDistanceBetween(...) et pis voilà, ce sera imprécis
Merci pour les réponses à + _________________ » Le Tref & l'Aucube : Histoire, misanthropie & zoologie léonine » 1626, le Gant & l'Epée : intrigues & duels sous le règne de Louis XIII |
Revenir en haut | |
lendraste Grand Maître Chanteur du Conseil Messages: 1403 Localisation: Quelque part ailleurs |
Il existe une solution consistant à affecter deux actions dans la queue d'action du personnage. En l'occurrence une action d'attente de 30 seconde et une action personnalisée qui accomplira ce que tu veux qu'il se passe à ce moment. De cette façon, si le joueur ne reste pas en place, cela annule sa queue d'action et l'action devant se déclencher au bout de 30 secondes ne se produira pas.
Si tu veux des détails, je peux chercher la solution complète, mais le principe marche puisque je l'utilise dans mes Artisanats (en fait la séquence d'animation de l'artisanat peut-être interrompue pas une action du joueur ou une interventions extérieure, ce qui annule le travail). _________________ 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 | |
finipe Grand Sage du Conseil Messages: 519 Localisation: Nantes |
Oui, c'est à ça que je pensais, le problème étant que la 1ère action est du type ActionPlayAnimation(...), et lorsque le joueur effectue ça, il n'y a aucune action visible dans la queue d'action (contrairement à un ActionSit(...) par exemple). A partir de là, je ne vois pas comment faire pour justement transformer ça en une action. Enfin si tu as des détails, oui je suis preneur
Merci pour le coup de pouce ! _________________ » Le Tref & l'Aucube : Histoire, misanthropie & zoologie léonine » 1626, le Gant & l'Epée : intrigues & duels sous le règne de Louis XIII |
Revenir en haut | |
lendraste Grand Maître Chanteur du Conseil Messages: 1403 Localisation: Quelque part ailleurs |
Eh bien écoute, je ne m'appelle pas Scriptos et je ne suis pas un dieu, mais j'ai testé cela à l'instant et ça marche :
Code : //A mettre sur le OnUsed du placeable. void main() { object oPC=GetLastUsedBy(); AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_WORSHIP, 1.0, 20.0)); AssignCommand(oPC, ActionSpeakString("fini de prier ! attendons un peu")); AssignCommand(oPC, ActionWait(10.0)); AssignCommand(oPC, ActionSpeakString("voila, j'ai fini")); } Je te l'accorde, la queue d'action n'est pas correctement affichée mais malgré tout, tout fonctionne parfaitement. Ensuite, si tu veux créer des actions personnalisées tu as plusieurs solutions dont celle-là : Code : AssignCommand(oPC, ActionDoCommand(ActionPersonnalisee())); La fonction ActionDoCommand convertie une exécution standard d'une fonction en une exécution différée. Exemple concret : Code : void MyAction(object oPC, string sToSay) { AssignCommand(oPC, ActionSpeakString(sToSay)); } void main() { object oPC=GetLastUsedBy(); string sToSay="Bonjour la compagnie"; AssignCommand(oPC, ActionWait(30.0)); AssignCommand(oPC, ActionDoCommand(MyAction(oPC, sToSay))); } Ou encore. Code : void MyAction() { string sToSay=GetLocalString(OBJECT_SELF, "TOSAY"); AssignCommand(OBJECT_SELF, ActionSpeakString(sToSay)); } void main() { object oPC=GetLastUsedBy(); string sToSay="Bonjour la compagnie"; SetLocalString(oPC, "TOSAY", sToSay); AssignCommand(oPC, ActionWait(30.0)); AssignCommand(oPC, ActionDoCommand(MyAction())); } Attention lors de la création d'un action personnalisée à bien se souvenir que les actions vont être affectée à un objet par AssignCommand et que lors de leur exécution, ces objets sont les OBJECT_SELF de la fonction créée. Voici pourquoi je présentais cette autre solution. J'attire ton attention sur les actions différées de la sorte. Il est très difficile de lier les actions différées entre elle surtout si tu fais intervenir de la création ou de la destruction d'objet. Un objet créé par une action différée doit pouvoir être retrouvé par une autre actions différée sans possibilité de passer des paramètres d'une focntion à l'autre autrement que par des sauvegarde de variable (comme dans mon dernier exemple) ou des recherches systématique, ce qui peut s'avérer long... m'enfin je te laisse chercher les petites subtilités du problème. _________________ 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 | |
finipe Grand Sage du Conseil Messages: 519 Localisation: Nantes |
Merci pour ces précisions claires et précises sur le ActionDoCommand, j'ai appris plein de trucs ! Seulement, mon problème est que je veux que la seconde action, celle qui doit se faire au bout de xx secondes, ne se fasse qu'à condition que la première action, à savoir l'animation jouée par le pc, soit effectuée jusqu'au bout...
Bon pour être plus clair, un objet invisible nommé "Se recueillir..." est placé devant un autel. Sur le onUsed de cet objet, le script en question. J'aimerais que si le joueur reste à prier gentiment sans bouger pendant 30 secondes, il regagne une vingtaine de points de vie. Voilà voilà. Le script en lui-même fonctionne impeccable, il est très simple, sauf que si le joueur décide d'interrompre la prière avant ces 30 secondes, la guérison se fera quand même au bout des 30 secondes alors qu'il ne se trouve plus en train de prier, ce qui est débile Je mets le script tel quel pour info : Code : void main()
{ object oPC = GetLastUsedBy(); object oCible = GetNearestObjectByTag("Cible"); // un objet invisible pour que le joueur soit tourné face à l'autel object oTarget = OBJECT_SELF; int nHeal; if (GetIsPC(oPC)) { if(GetIsObjectValid(oTarget)) { DelayCommand(1.0, AssignCommand(oPC, SetFacingPoint(GetPosition(oCible)))); DelayCommand(1.0, AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_MEDITATE, 1.0, 35.0))); if(GetAlignmentGoodEvil(oPC) != ALIGNMENT_EVIL) { nHeal = 20; DelayCommand(30.0, FloatingTextStringOnCreature("Un profond bien-être vous envahit...", oPC, FALSE)); DelayCommand(34.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_HEALING_M), oPC)); DelayCommand(34.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectHeal(nHeal), oPC)); } else { if(GetCurrentHitPoints(oPC) <= 20) { nHeal = (GetCurrentHitPoints(oPC)-1); } else { nHeal = 20; } DelayCommand(30.0, FloatingTextStringOnCreature("Vous ressentez une violente douleur cérébrale...", oPC, FALSE)); DelayCommand(34.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_SLOW), oPC)); DelayCommand(34.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(nHeal), oPC)); DelayCommand(35.0, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectSlow(), oPC, 60.0)); } } } } Voilà comme ça ce sera peut-être plus clair Je réfléchis à tout ça de mon côté et si jamais qqun avait une idée de génie, je suis preneur PS : c'est d'autant plus idiot qu'au départ je voulais juste mettre un petit truc de fun dans mon module et là ça prend des proportions élyséennes _________________ » Le Tref & l'Aucube : Histoire, misanthropie & zoologie léonine » 1626, le Gant & l'Epée : intrigues & duels sous le règne de Louis XIII |
Revenir en haut | |
lendraste Grand Maître Chanteur du Conseil Messages: 1403 Localisation: Quelque part ailleurs |
Il est trop tard pour que je te rédige la solution, mais elle dérive de mon premier script. Si l'action d'animation est interrompue, le personnage n'aura pas l'action de guérison qu'on a placé dans sa queue d'action. Si tu es patient, je te fais le script qui correspond après ma nuit de sommeil, car là j'ai plus les yeux en face des trous
_________________ 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 | |
finipe Grand Sage du Conseil Messages: 519 Localisation: Nantes |
Hop là c'est bon je me suis débrouillé et ça fonctionne, pas la peine de te prendre la tête pour moi. Merci beaucoup en tout cas, ce petit truc tout bête fut fort instructif. Pour ceux qui sont curieux voilà donc le script final :
Code : void Guerison(object oPC, string sPhrase, int nHeal)
{ AssignCommand(oPC, FloatingTextStringOnCreature(sPhrase, oPC, FALSE)); AssignCommand(oPC, ActionWait(1.5)); AssignCommand(oPC, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_HEALING_M), oPC)); AssignCommand(oPC, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectHeal(nHeal), oPC)); } void Blessure(object oPC, string sPhrase, int nHeal) { AssignCommand(oPC, FloatingTextStringOnCreature(sPhrase, oPC, FALSE)); AssignCommand(oPC, ActionWait(1.5)); AssignCommand(oPC, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_HIT_NEGATIVE), oPC)); AssignCommand(oPC, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(nHeal), oPC)); AssignCommand(oPC, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectSlow(), oPC, 60.0)); } void main() { object oPC = GetLastUsedBy(); object oCible = GetNearestObjectByTag("Cible"); object oTarget = OBJECT_SELF; int nHeal; if (GetIsPC(oPC)) { if(GetIsObjectValid(oTarget)) { AssignCommand(oPC, SetFacingPoint(GetPosition(oCible))); AssignCommand(oPC, ActionPlayAnimation(ANIMATION_LOOPING_MEDITATE, 1.0, 35.0)); if(GetAlignmentGoodEvil(oPC) != ALIGNMENT_EVIL) { string sPhrase = "Un profond bien-être vous envahit..."; nHeal = 20; ActionWait(30.0); AssignCommand(oPC, ActionDoCommand(Guerison(oPC, sPhrase, nHeal))); } else { string sPhrase = "Vous ressentez une violente douleur cérébrale..."; if(GetCurrentHitPoints(oPC) <= 20) { nHeal = (GetCurrentHitPoints(oPC)-1); } else { nHeal = 20; } ActionWait(30.0); AssignCommand(oPC, ActionDoCommand(Blessure(oPC, sPhrase, nHeal))); } } } } Bye ! _________________ » Le Tref & l'Aucube : Histoire, misanthropie & zoologie léonine » 1626, le Gant & l'Epée : intrigues & duels sous le règne de Louis XIII |
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