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 16:30:07
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 |
Djezebel Héros Messages: 252 |
Bonjour,
J'ai fais un PNJ qui a sur le "onPerception" un script qui dans la théorie devrait faire en sorte que : - Le PNJ lance un sort de toile d'araignée sur le joueur quand il le voit (ça c'est OK) - Le PNJ parle (ça c'est OK) - Le PNJ invoque une arme (genre Lame persistante de Shelgarn) - Le PNJ reparle (ça c'est OK) - Le PNJ se téléporte ailleurs (ça c'est OK) Le problème est que je ne peux pas lancer le sort "Lame persistante de Shelgarn" sinon quand le PNJ se téléporte (détruit en fait), l'objet aussi se détruirait. Donc j'ai fais un script qui fait "semblant" que le PNJ incante (c'est un peu foiré) puis que la Lame apparaisse dans un sort. J'ai créé une créature (néant invisible) avec une dague avec le tag et resref "Lame". NWScript :
void main() { object oPC = GetLastPerceived(); location lNPC = GetLocation(oPC); effect eVfx = EffectVisualEffect(34); ActionCastSpellAtObject(SPELL_WEB, oPC, METAMAGIC_ANY, TRUE, 0 ,PROJECTILE_PATH_TYPE_DEFAULT, TRUE); DelayCommand(1.0, AssignCommand(OBJECT_SELF, SpeakString("", TALKVOLUME_TALK ))); DelayCommand(2.5, AssignCommand(OBJECT_SELF,ActionPlayAnimation(ANIMATION_LOOPING_CONJURE1,1.0, 2.0))); DelayCommand(2.6, AssignCommand(OBJECT_SELF,PlaySound("vs_chant_evoc_lm"))); DelayCommand(3.0, AssignCommand(OBJECT_SELF, SpeakString("", TALKVOLUME_TALK ))); ActionWait(3.1); CreateObject(OBJECT_TYPE_CREATURE, "lame", GetLocation(oPC), TRUE); DelayCommand(3.5, ApplyEffectToObject(0, eVfx , OBJECT_SELF)); DelayCommand(3.7, DestroyObject(OBJECT_SELF)); } Le problème principal : ça me créer 2 lames au lieu d'une. Second problème : il n'y a pas d'effet quand elle apparait Troisième problème : j'ai l'impression que l'enchainement ne se fait pas correctement Des idées ? Dernière édition par Djezebel le 19/10/2005 14:32:53; édité 1 fois
|
Revenir en haut | |
Dangon Acolyte Messages: 21 |
J'ai bien une idée
En fait, lorsque ta premiere dague est crée, un nouvel event OnPerception doit être généré sur le PNJ, ce qui doit lancer la création de la seconde dague avent qu'il ne soit détruit. |
Revenir en haut | |
marneus Chevalier Messages: 89 Localisation: devant mon pc ... surment |
sa doit etre sa surement , jaime bien l'idée , comment tu fait pour qu'il y est l'effet visuel du pnj en train de lancer un sort?
|
Revenir en haut | |
Djezebel Héros Messages: 252 |
Dans le script, il y a :
NWScript :
DelayCommand(2.5, AssignCommand(OBJECT_SELF,ActionPlayAnimation(ANIMATION_LOOPING_CONJURE1,1.0, 2.0))); Qui est sensé faire à l'"OBJECT_SELF" (le PNJ) le lancement du sort. Je vais rajouter un truc disant que si la personne perçue est un PJ alors le script se déclenche Je teste et j'édite mon message ensuite si ça marche. EDIT : Bon, ça ne marchait toujours pas avec un GetIsPC , alors j'ai rajouté une variable qui s'inscrémente et donc le script ne se lance qu'une fois et ça marche pour une seule lame. Par contre, les sons et les sorts sont décallés. Des idées ? Voilà pour l'instant ce que ça donne : NWScript : void main() { object oPC = GetLastPerceived(); location lNPC = GetLocation(oPC); effect eVfx = EffectVisualEffect(34); int nDoOnce = GetLocalInt(OBJECT_SELF, "DO_ONCE"); if (GetIsPC(oPC) == TRUE ) { if(nDoOnce == 1) return; SetLocalInt(OBJECT_SELF, "DO_ONCE", 1); ActionCastSpellAtObject(SPELL_WEB, oPC, METAMAGIC_ANY, TRUE, 0 ,PROJECTILE_PATH_TYPE_DEFAULT, TRUE); DelayCommand(1.0, AssignCommand(OBJECT_SELF, SpeakString("", TALKVOLUME_TALK ))); DelayCommand(2.5, AssignCommand(OBJECT_SELF,ActionPlayAnimation(ANIMATION_LOOPING_CONJURE1,1.0, 2.0))); DelayCommand(2.6, AssignCommand(OBJECT_SELF,PlaySound("vs_chant_evoc_lm"))); ActionWait(2.8); CreateObject(OBJECT_TYPE_CREATURE, "lame", GetLocation(oPC), TRUE); DelayCommand(4.6, AssignCommand(OBJECT_SELF, SpeakString("", TALKVOLUME_TALK ))); DelayCommand(4.7, ApplyEffectToObject(0, eVfx , OBJECT_SELF)); DelayCommand(6.0, DestroyObject(OBJECT_SELF)); } } |
Revenir en haut | |
Dangon Acolyte Messages: 21 |
Je crois savoir où est le problème :
En fait, dans la chaine de temps que tu crées avec les DelayCommand, tu mélanges les exécutions normales ( immédiates ) et les ActionXXXX qui sont ajoutées à la liste des actions a effectuées par la cible ( effectuées les unes après les autres ). Si tu veux créer une chaine parfaitement continue d'action, il te faut soit tout faire en exécutions immédiates retardées ( avec le DelayCommand ) soit utiliser ActionDoCommand() qui permet de placer les exécutions dans la liste d'action de la cible. Peut être pas très clair Ca donne quelque chose comme cela en passant par la liste d'actions : NWScript :
void GenerateObject(int nObjectType, string sTemplate, location lLocation, int bUseAppearAnimation=FALSE, string sNewTag="") { CreateObject(nObjectType,sTemplate,lLocation,bUseAppearAnimation,sNewTag); } void main() { object oPC = GetLastPerceived(); location lNPC = GetLocation(oPC); effect eVfx = EffectVisualEffect(34); int nDoOnce = GetLocalInt(OBJECT_SELF, "DO_ONCE"); if (GetIsPC(oPC) == TRUE ) { if(nDoOnce == 1) return; SetLocalInt(OBJECT_SELF, "DO_ONCE", 1); ClearAllActions(); ActionCastSpellAtObject(SPELL_WEB, oPC, METAMAGIC_ANY, TRUE, 0 ,PROJECTILE_PATH_TYPE_DEFAULT, TRUE); ActionSpeakString("", TALKVOLUME_TALK ); ActionPlayAnimation(ANIMATION_LOOPING_CONJURE1,1.0, 2.0); ActionDoCommand(PlaySound("vs_chant_evoc_lm")); ActionWait(2.8); ActionDoCommand(GenerateObject(OBJECT_TYPE_CREATURE, "lame", GetLocation(oPC), TRUE)); ActionSpeakString("", TALKVOLUME_TALK ); ActionDoCommand(ApplyEffectToObject(0, eVfx , OBJECT_SELF)); ActionDoCommand(DestroyObject(OBJECT_SELF)); } } Tu remarquera que j'ai été obligé de passer par une fonction toute bête, GenerateObject() qui ne renvoye pas un object, comme CreateObject(). EDIT : j'ai rajouté le ClearAllActions(). |
Revenir en haut | |
Seth de Sombrelune Seigneur Messages: 156 |
Pour l'annimation de sort, il y a la commande suivante : ActionCastFakeSpellAtObject qui reproduit un lancement de sort (animation du Personage, effet visuel et son) mais pas les effet du sort. POur cette commande il faut indiquer quel annimation de sort tu veux utiliser.
Code : ActionCastFakeSpellAtObject(SPELL_HASTE,oPC)
Pour ce qui est de l'endroit où doit apparaitre ta créature "Dague", place un WaiPoint, et assigne lui un tag "Tartempion" tu recupère la Location du Waypoint, tu applique l'effet d'invocation au WP et tu crée ta bestiole... |
Revenir en haut | |
Djezebel Héros Messages: 252 |
Merci pour les infos !
Pour le ActionCastFakeSpell , le problème est que le personnage s'approche du PJ pour invoquer. Donc autant qu'il reste à faire des mouvements de loin. Le résultat actuel n'est pas encore au top mais déjà le ActionDoCommand arrange certains points, merci Actuellement ça donne ceci : Code : void GenerateObject(int nObjectType, string sTemplate, location lLocation, int bUseAppearAnimation=FALSE, string sNewTag="")
{ CreateObject(nObjectType,sTemplate,lLocation,bUseAppearAnimation,sNewTag); } void main() { object oPC = GetLastPerceived(); location lNPC = GetLocation(oPC); effect eVfx = EffectVisualEffect(34); int nDoOnce = GetLocalInt(OBJECT_SELF, "DO_ONCE"); if (GetIsPC(oPC) == TRUE ) { if(nDoOnce == 1) return; SetLocalInt(OBJECT_SELF, "DO_ONCE", 1); ActionCastSpellAtObject(SPELL_WEB, oPC, METAMAGIC_ANY, TRUE, 0 ,PROJECTILE_PATH_TYPE_DEFAULT, TRUE); ActionSpeakString("Décidément, je ne serai jamais tranquille.", TALKVOLUME_TALK ); ActionWait(1.0); ActionDoCommand(AssignCommand(OBJECT_SELF,ActionPlayAnimation(ANIMATION_LOOPING_CONJURE1,1.0, 2.0))); ActionWait(1.0); ActionDoCommand(GenerateObject(OBJECT_TYPE_CREATURE, "lame", GetLocation(oPC), FALSE)); ActionSpeakString("Voilà qui devrait vous occuper. Adieu.", TALKVOLUME_TALK ); ActionDoCommand(DelayCommand(2.0, ApplyEffectToObject(0, eVfx , OBJECT_SELF))); ActionDoCommand(DelayCommand(4.0, DestroyObject(OBJECT_SELF))); } } J'ai supprimé la ligne de l'effet sur l'apparition de l'objet pour le mettre sur le onspawn. |
Revenir en haut | |
Ailesnoires Grand Chevalier Messages: 110 Localisation: Vendée |
juste pour info, il y a deux évenements qui déclanchent le OnPerception
lorsque le pnj voit le joeur mais aussi lorsqu'il l'entend ce qui fait que le script est lancé deux fois |
Revenir en haut | |
Djezebel Héros Messages: 252 |
Ah bah voilà la réponse qu'il me manquait!
Merci Ailesnoires ! Il y a-t-il un moyen de dissocier les deux ? (ou il faut mettre une boucle comme je l'ai fait ? ) |
Revenir en haut | |
Ailesnoires Grand Chevalier Messages: 110 Localisation: Vendée |
essaye l'un de ces deux test
Si le PNJ voit 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. Si le PNJ entend 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. |
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