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 15:52:55


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
Seth de Sombrelune
Seigneur
Inscrit le: 10 Jan 2005
Messages: 156
Répondre en citant
Posté le : 06/11/2005 00:21:36 Sujet du message : [RESO] appliquer un DelayCommand sur un CreateObject

Bonsoir à vous, je fait appel à vos lumières :

j'ai une créature(A) qui se balade dans une zone, elle n'est pas hostile, le curseur de pointage indique donc une conversation possible. Si le joueur decide de cliquer dessus pour lui parler, lors du clic, la créature(A) se transforme (effet polymorphe) et devient une autre créature(B) qu entame la conversation. Lorsque la conversation est terminée, la créature(B) redevient la créature(A) initiale.

Mon probleme :
Losque on clique sur la créature(A) originelle, la seconde(B) apparait a coté de la première (au lieu de prendre sa place) et avant que la première est disparue. J'ai un probleme de delais entre le temps où la première est detruite et où la seconde apparait. Idem pour la fin de conversation.

Ma question :

Comment apliquer un delaycommand sur la création d'une créature ?
Apres divers test, je n'y arrive pas car un delaycomand sur un créatobject semble ne pas fonctionner.

Je vous livre ici mes 2 scripts (ils compilent mais l'apparition de la seconde créature n'est pas syncrone).

Sur le OnConversation de la Créature 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.


Dans le Action conséquante de la fin de mes Dialogues :
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.
Dernière édition par Seth de Sombrelune le 07/11/2005 10:28:05; édité 1 fois
 
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 : 06/11/2005 09:06:09 Sujet du message :

il est impossible de créer un delay a la création sans utiliser une fonction telle que cell-ci :
NWScript :
// fonction permettant d'appliquer un delai a la creation d'un objet
void CreateObjectVoid(object oPC, int nObjectType, string sTemplate, location lLoc, int bUseAppearAnimation = FALSE, string sNewTag= "")
{
    CreateObject(nObjectType, sTemplate, lLoc, bUseAppearAnimation, sNewTag);
    object oNgrid=GetObjectByTag("trans1");
    DelayCommand(0.5,AssignCommand(oPC,ActionStartConversation(oNgrid)));
}

void main()
{
object oGrid=OBJECT_SELF;
object oPC=GetLastSpeaker();
location lGrid=GetLocation(oGrid);
effect eEffect=EffectVisualEffect(VFX_IMP_POLYMORPH);
DestroyObject(oGrid,1.0);
DelayCommand(1.1,CreateObjectVoid(oPC,OBJECT_TYPE_CREATURE,"pixie_melodie",lGrid,FALSE,"trans1"));
ApplyEffectToObject(DURATION_TYPE_INSTANT, eEffect,oGrid);
}
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.


essaye voir avec ceci, il ne te reste plus qu'à faire pour la fin de la conversation
Dernière édition par Ailesnoires le 06/11/2005 09:09:40; édité 1 fois
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Black Knight
Grand Maître Chanteur du Conseil
Inscrit le: 27 Oct 2005
Messages: 1031
Localisation: Fin fond du trou du cul du monde
Répondre en citant
Posté le : 06/11/2005 09:07:21 Sujet du message :

Biowar je crois avait un bug la dessus et donc le CreateObject ne marche pas avec un DelayCommand donc dsl tu peut pas ...
 
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 : 06/11/2005 11:56:23 Sujet du message :

L'idée de la fonction est bien, mais :
J'aurais preferer utiliser la fonction uniquement pour retarder la création de l'objet (ici une créature), car la conversation je peux la scripter sans souci, c'est juste le delais qui coince, j'ai donc simplifier la ligne de commande comme suis :

NWScript :
// fonction permettant d'appliquer un delai a la creation d'un objet
void CreateObjectVoid(object oPC, int nObjectType, string sTemplate, location lLoc, int bUseAppearAnimation = FALSE, string sNewTag= "")
{
CreateObject(nObjectType, sTemplate, lLoc, bUseAppearAnimation, sNewTag);

}

void main()
{
object oGrid=OBJECT_SELF;
object oPC=GetLastSpeaker();
location lGrid=GetLocation(oGrid);
effect eEffect=EffectVisualEffect(VFX_IMP_POLYMORPH);
DestroyObject(oGrid,1.0);
DelayCommand(1.1,CreateObjectVoid(oPC,OBJECT_TYPE_CREATURE,"pixie_melodie",lGrid,FALSE,"trans1"));
ApplyEffectToObject(DURATION_TYPE_INSTANT, eEffect,oGrid);
}
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 compile, mais lors de l'utilisation, la créature(A) est bien détruite, mais la créature(B) elle n'est jamais apparue.
Il se passe exactement la même chose si j'utilise le script original, tel qu'il m'a été proposé au dépard...

Une idée ?
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Yoyo
Seigneur
Inscrit le: 31 Aoû 2003
Messages: 223
Répondre en citant
Posté le : 06/11/2005 12:19:34 Sujet du message :

En fait je ne sais pas si c'est un bug car CreateObject renvoi un objet :

NWScript :
object CreateObject(int nObjectType, string sTemplate, location lLocation, int bUseAppearAnimation=FALSE, string sNewTag="")
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.


et le DelayCommand ne "delai" que les "void" ou "action" :

NWScript :
void DelayCommand(float fSeconds, action aActionToDelay)
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.


En fait j'ai une astuce : tu crer un script (sans le mettre dans un evènement (OnDeath, OnEnter...)) avec dedans :

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.


(Dans mon exemple je le nomme "Creature" (tu peux bien sur choisir un autre nom))

Crer un autre script (lui tu le met dans l'evènement (OnEnter, OnDeath...)) avec dedans :
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.


Lui tu le nomme comme tu veux.

Et voila (bien sur complete les différents si tu veux rajouter des effets, modifier les différenrts paramètres des fonctions...)

OU il y a une technique plus simple :

NWScript :

#include "nw_i0_2q4luskan"
//IMPORTANT : ne PAS oublier le #include "nw_i0_2q4luskan"

void main()
{
DelayCommand(0.5, CreateObjectVoid(OBJECT_TYPE_CREATURE, "resref", GetLocation(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.

_________________
BOUH! (je vous ai fait peur ??) désolé

Vive moi
Pas vive Securom
 
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 : 07/11/2005 10:21:05 Sujet du message :

En fait l'astuce qu'avait suggerer AilesNoires etait la bonne dés le début, si cela ne fonctionnait pas, c'etait juste parceque j'avais oublier combient le mécanisme du scripting NWN etait tordus, j'ai donc été aussi tordu pour résoudre mon probleme.

La suggestion de Yoyo revient a ce qu'avait proposer AilesNoires, a cela pres que le script se retrouve avec une biblio qui ne me sert à rien.

Donc pour créer un objet ou une créature avec un delayCommand, il suffit de créer la fonction de la manière suivante :

NWScript :
// fonction permettant d'appliquer un delai a la creation d'un objet
void DelayCreatObject(int nObjectType, string sTemplate, location lLoc, int bUseAppearAnimation = FALSE, string sNewTag= "")
{
    CreateObject(nObjectType, sTemplate, lLoc, bUseAppearAnimation, sNewTag);
}
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.


Tout simplement, la ligne de code suivante donne l'exemple d'utilisation : La fonction DelayCreateObject se formate exactement comme la fonction CreateObject (si ce n'est qu'on peu mettre un DelayCommand avant Embarassed)

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.


En fait si mon script initial ne fonctionnait pas c'est parce que je detruisait la créature qui a lancer le script, donc dés qu'elle est détruite, le script s'arrete.
Donc il m'a falu contourner le probleme, du coup je doit conserver ma créature presente jusqu'a la fin de mon script. voici comment j'ai proceder :
Je ne peux detruire la pixie sous peine d'interompre le script, donc je l'efface de l'ecran grace a un cutcene invisibility (qui echape a la vision lucide).
Ensuite pour créer ma créature à la même place, je la rend intengible, donc mon monstre prendra bien sa place au lieu d'apparaitre à coté.
Coté script cela me donne ceci :

NWScript :
//:Confused///////////////////////// /////////////////////
//:: Name  dial_pixie_melo
//:: Copyright (c) 2001 Bioware Corp.
//:Confused///////////////////////// ////////////////////
/*
permet de changer la forme de maniere personaliser
*/

//:Confused///////////////////////// ////////////////////
//:: Created By: Seth de Sombrelune / Jean de Joux
//:: Created On: 06/11/05
//:Confused///////////////////////// ////////////////////


// fonction permettant d'appliquer un delai a la creation d'un objet
void DelayCreatObject(int nObjectType, string sTemplate, location lLoc, int bUseAppearAnimation = FALSE, string sNewTag= "")
{
    CreateObject(nObjectType, sTemplate, lLoc, bUseAppearAnimation, sNewTag);
}


void main()
{
    // Recuperation de l'objet crature qui produit le script actuel
    object oGrid=OBJECT_SELF;

    //Recuperation de l'objet parlant avec le PNJ (script OnConversation)
    object oPC=GetLastSpeaker();

    // Recuperation de la position de la petite pixie
    location lGrid=GetLocation(oGrid);

    // Cretaion des effets visuels
    effect eEffect0=EffectVisualEffect(VFX_IMP_POLYMORPH); // Effet de transformation
    effect eEffect1=EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY);// la creature disparait
    effect eEffect2=EffectCutsceneGhost();// la crature devient intangible

    // Application des effets
    ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect1,oGrid);//la crature change de forme, donc elle disparait
    ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect2,oGrid);// pour permetre de crer un monstre au meme endroit, on la rend intangible
    ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eEffect0,lGrid);// on applique l'effet visuel la ou se trouvait la creature

    // Creation de la pixie Melodie dans les 0,5 secondes
    DelayCommand(0.5,DelayCreatObject(OBJECT_TYPE_CREATURE,"pixie_melodie",lGrid));

    // Demarrage de la conversation de la pixie dans les 1,5 secondes
    DelayCommand(2.0,AssignCommand(oPC,ActionStartConversation(GetObjectByTag("pixie_melodie"))));

    // Destruction de l'objet petite pixie dans les 3 secondes, ce qui met fin a ce script
    DestroyObject(oGrid,3.0);

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


je passe la balise en réso Very Happy
 
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 60.115ms