La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 23/11/2024 16:11:55


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
Djezebel
Héros
Inscrit le: 29 Sep 2005
Messages: 252
Répondre en citant
Posté le : 18/10/2005 17:39:18 Sujet du message : [Résolu] Apparition de 2 objets au lieu d'un

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 :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.




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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Dangon
Acolyte
Inscrit le: 18 Oct 2005
Messages: 21
Répondre en citant
Posté le : 18/10/2005 18:06:01 Sujet du message :

J'ai bien une idée Wink

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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
marneus
Chevalier
Inscrit le: 17 Oct 2005
Messages: 89
Localisation: devant mon pc ... surment
Répondre en citant
Posté le : 18/10/2005 18:16:18 Sujet du message :

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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Djezebel
Héros
Inscrit le: 29 Sep 2005
Messages: 252
Répondre en citant
Posté le : 18/10/2005 18:29:07 Sujet du message :

Dans le script, il y a :

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.


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 Smile 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 :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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Dangon
Acolyte
Inscrit le: 18 Oct 2005
Messages: 21
Répondre en citant
Posté le : 18/10/2005 19:43:33 Sujet du message :

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 Confused

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));
}


}
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.


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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Seth de Sombrelune
Seigneur
Inscrit le: 10 Jan 2005
Messages: 156
Répondre en citant
Posté le : 18/10/2005 20:13:09 Sujet du message :

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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Djezebel
Héros
Inscrit le: 29 Sep 2005
Messages: 252
Répondre en citant
Posté le : 19/10/2005 12:15:36 Sujet du message :

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 Smile

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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Ailesnoires
Grand Chevalier
Inscrit le: 21 Oct 2004
Messages: 110
Localisation: Vendée
Répondre en citant
Posté le : 20/10/2005 01:06:23 Sujet du message :

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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Djezebel
Héros
Inscrit le: 29 Sep 2005
Messages: 252
Répondre en citant
Posté le : 20/10/2005 04:18:12 Sujet du message :

Ah bah voilà la réponse qu'il me manquait! Smile
Merci Ailesnoires ! Smile

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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Ailesnoires
Grand Chevalier
Inscrit le: 21 Oct 2004
Messages: 110
Localisation: Vendée
Répondre en citant
Posté le : 20/10/2005 09:22:25 Sujet du message :

essaye l'un de ces deux test

Si le PNJ voit
NWScript :
void main()
{
object oPc = GetLastPerceptionSeen();
  if(GetIsPC(oPc))
  {
  //place le code ici
  }
}
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 :
void main()
{
object oPc = GetLastPerceptionHeard();
  if(GetIsPC(oPc))
  {
  //place le code ici
  }
}
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 Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Montrer les messages depuis :
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


Sauter vers:
FAQ | Rechercher | Liste des Membres | Groupes d'utilisateurs | S'enregistrer | Profil | Se connecter pour vérifier ses messages privés | Connexion
Powered by phpBB 2.* [m] © 2001, 2002 phpBB Group
Theme rewritten in beautiful XHTML code by Baldurien.
Thème "La Bibliothèque de Neverwinter" crée par Kruger
Traduction par : phpBB-fr.com
Page generated in 72.738ms