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 22:24:39


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
Eldorane
Héros
Inscrit le: 18 Oct 2003
Messages: 298
Localisation: Moselle
Répondre en citant
Posté le : 05/10/2004 14:27:23 Sujet du message : Script pour transformer un PNJ [reglé]

Salut à tous,

je cherche à adapter un script que j'ai trouvé concernant des loups garoux :


Citation :

dans le onspawn de tes loups, tu mets ca
NWScript :
void main()
{
SetLocalInt(OBJECT_SELF, "LOUP", TRUE);
SetLocalString(OBJECT_SELF, "LOUP_GAROU", "TAG_DU_NPC");

}
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 dans le onspawn des NPC tu met :

NWScript :
void main()
{
SetLocalInt(OBJECT_SELF, "LOUP", TRUE);
SetLocalString(OBJECT_SELF, "LOUP_GAROU", "TAG_DU_LOUP");

}
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 enfin dans le onheartbeat de tout ce petit monde :


NWScript :
////////////////////////////// ///////////////////////
//:Le loup-garou
//:de VorpalBlade depuis Bioware

//modif de Reyan : necessite un SetLocalInt et un SetLocalSring dans le onspawn
////////////////////////////// ///////////////////////

void ChangeWerewolf(object oObject, string sTemp);
void ChangeTo(string sTemp, location lLoc);
void main()
{
int bDay = GetIsDay();
int nLoup = GetLocalInt(OBJECT_SELF, "LOUP");
string sChangeTo = GetLocalString(OBJECT_SELF, "LOUP_GAROU");
object oMe = OBJECT_SELF;
// If I'm a man and its night or I'm a WW and it is day.
if (((nLoup == FALSE) && (!bDay)) || ((nLoup == TRUE) && (bDay))){
AssignCommand(GetModule(), ChangeWerewolf(oMe, sChangeTo));
}

}
void ChangeWerewolf(object oObject, string sTemp)
{

effect eVis = EffectVisualEffect(VFX_FNF_HOWL_MIND);
location lLoc = GetLocation(oObject);
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eVis, lLoc, 2.0f);
DestroyObject(oObject);
DelayCommand(0.5f, ChangeTo(sTemp, lLoc));
}
void ChangeTo(string sTemp, location lLoc)
{
CreateObject(OBJECT_TYPE_CREATURE, sTemp, lLoc);
effect eVis = EffectVisualEffect(VFX_COM_CHUNK_RED_SMALL);
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eVis, lLoc, 2.0f);
}

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.


Voilà, ce script semble fonctionner mais comme je suis toujours aussi nulle:(, est-ce quelqu'un pourrai m'aider à l'adapter :

- Je souhaite que plusieurs corbeaux dans une forêt se rejoignent à un même point (avec je suppose des waypoints) et cela lorsqu'un évèment se produit (lorsque par exemple les PJ arrivent à un endroit précis de la zone).

- Ensuite une fois que tous les corbeaux se sont rassemblés, il faudrai qu'il disparaissent dans un nuage de fumée + lumières et qu'apparaisse à la place un humain quelconque.

Voilà, c'est tout... Confused hem...
Dernière édition par Eldorane le 16/04/2005 02:21:38; édité 1 fois
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Blackblood
Chevalier
Inscrit le: 20 Juil 2004
Messages: 80
Localisation: France
Répondre en citant
Posté le : 05/10/2004 15:05:26 Sujet du message :

Salut Eldorane, moi je n'ai pas copié sur le script que tu as passé mais j'ai fais ceci.

Pour le tester, tu devras créer :
- 5 corbeaux dont le tag devront être : corbeau1, corbeau2, ...., corbeau5
- 1PNJ (attention, il faudra que tu remplace dans le script "resref_pnj" par le resref du PNJ que tu aura crée (à placer entre guillemets)
- 1 waypoint dont le tag est wp_corbeau
- 1 trigger qui déclenchera le script

Place le script dans l'évènement "OnEnter" du trigger.

NWScript :
/// Placer sur le OnEnter du trigger
void main()
{

object oPC = GetEnteringObject();

if (!GetIsPC(oPC)) return;

object oTarget1;
oTarget1 = GetObjectByTag("corbeau1");

AssignCommand(oTarget1, ActionMoveToObject(GetObjectByTag("corbeau1", TRUE)));


object oTarget2;
oTarget2 = GetObjectByTag("corbeau2");

AssignCommand(oTarget2, ActionMoveToObject(GetObjectByTag("corbeau2", TRUE)));


object oTarget3;
oTarget3 = GetObjectByTag("corbeau3");

AssignCommand(oTarget3, ActionMoveToObject(GetObjectByTag("corbeau3", TRUE)));


object oTarget4;
oTarget4 = GetObjectByTag("corbeau4");

AssignCommand(oTarget4, ActionMoveToObject(GetObjectByTag("corbeau4", TRUE)));


object oTarget5;
oTarget5 = GetObjectByTag("corbeau5");

AssignCommand(oTarget5, ActionMoveToObject(GetObjectByTag("corbeau5", TRUE)));


//// Destruction des corbeaux

oTarget1 = GetObjectByTag("corbeau1");

DestroyObject(oTarget1, 3.0);

oTarget2 = GetObjectByTag("corbeau2");

DestroyObject(oTarget2, 3.0);

oTarget3 = GetObjectByTag("corbeau3");

DestroyObject(oTarget3, 3.0);

oTarget4 = GetObjectByTag("corbeau4");

DestroyObject(oTarget4, 3.0);

oTarget5 = GetObjectByTag("corbeau5");

DestroyObject(oTarget5, 3.0);


/// Apparition d'un humain

location lTarget;
oTarget = GetWaypointByTag("wp_corbeau");

lTarget = GetLocation(oTarget);

DelayCommand(4.0, CreateObjectVoid(OBJECT_TYPE_PLACEABLE, "resref_pnj", lTarget));

eEffect = EffectVisualEffect(VFX_FNF_SUMMON_GATE);

DelayCommand(4.0, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eEffect, lTarget));

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


Voilà, je ne l'ai pas testé, bon courage.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
grosraoul
Ecuyer
Inscrit le: 10 Sep 2004
Messages: 60
Répondre en citant
Posté le : 05/10/2004 18:44:02 Sujet du message :

coucou,

j'ai trouvé votre idée sympa alors j'ai essayé de faire ce que tu dis.
Le script plus haut est un bon début, mais y'a des choses qui marcheront pas bien:

- pas sur que tout les corbeaux arrivent en meme temps, ils ont a parcourir une distance qui sera forcement différente

- la creation d'un objet n'est pas retardable , c'est a dire que la ligne

NWScript :

  DelayCommand(4.0, CreateObjectVoid(OBJECT_TYPE_PLACEABLE, "resref_pnj", lTarget));
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.


n'est pas compilable.


c'est pour ca qu'il vaut mieux couper ce script en plusieurs autres.
par exemple tu peux creer un premier declencheur (TRIG1 par exemple, peu importe son nom) et sur le onenter de ce declencheur , tu peux y mettre ce script

NWScript :


void main()
{

object oPC = GetEnteringObject();
if (GetEnteringObject()==oPC)
{
object oTarget1;
oTarget1 = GetObjectByTag("corbeau1");
AssignCommand(oTarget1, ActionMoveToObject(GetObjectByTag("wp_corbeau"), TRUE));
object oTarget2;
oTarget2 = GetObjectByTag("corbeau2");
AssignCommand(oTarget2, ActionMoveToObject(GetObjectByTag("wp_corbeau"), TRUE));
object oTarget3;
oTarget3 = GetObjectByTag("corbeau3");
AssignCommand(oTarget3, ActionMoveToObject(GetObjectByTag("wp_corbeau"), TRUE));
object oTarget4;
oTarget4 = GetObjectByTag("corbeau4");
AssignCommand(oTarget4, ActionMoveToObject(GetObjectByTag("wp_corbeau"), TRUE));
object oTarget5;
oTarget5 = GetObjectByTag("corbeau5");
AssignCommand(oTarget5, ActionMoveToObject(GetObjectByTag("wp_corbeau"), TRUE));
  }

/* warning: 1 unclosed block {} */
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.


-les tag "corbeau_x" etant les tags de tes creatures corbeaux (ici y'en a 5 ),
- wp_corbeau est le point de rencontre de tes corbeaux (c'est un waypoint : ptit triangle bleu, drapeau jaune Wink si tu te souviens )

ok , à ce moment, des que le pj (et seulement le pj) rentre dans cette zone, hop tout les corbeaux doivent voler vers le waypoint que tu as défini.
ensuite, il faut prevoir le fait qu'ils vont pas tous venir en meme temps. Comme solution, (y'en a d'autres) tu peux faire un deuxieme declencheur qui va entouré ton waypoint wp_corbeau (TRIG2)

sur le onenter de ce nouveau declencheur, tu peux utiliser une variable locale qui s modifie selon que le corbeau est arrivé ou pas . ce qui donne :

NWScript :

void main()
{
      //// Destruction des corbeaux
object oPC=GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC);


if (GetEnteringObject()==GetObjectByTag("corbeau1"))
    SetLocalInt(oPC,"iCorbeau1",1);

if (GetEnteringObject()==GetObjectByTag("corbeau2"))
    SetLocalInt(oPC,"iCorbeau2",1);

if (GetEnteringObject()==GetObjectByTag("corbeau3"))
    SetLocalInt(oPC,"iCorbeau3",1);

if (GetEnteringObject()==GetObjectByTag("corbeau4"))
    SetLocalInt(oPC,"iCrbeau4",1);

if (GetEnteringObject()==GetObjectByTag("corbeau5"))
    SetLocalInt(oPC,"iCorbeau5",1);
  }

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.


des que corbeau1 est arrivé par exemple, la variable "iCorbeau1" passe a 1 , et de meme pour les autres variables de chaque corbeau.

ensuite il te reste le script d'effet spécial, si tout les corbeaux sont arrivés alors on envoie la sauce :

NWScript :

void main()
{

object oPC=GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR, PLAYER_CHAR_IS_PC);
      //// Destruction des corbeaux
if ((GetLocalInt(oPC,"iCorbeau1")==1) &&
    (GetLocalInt(oPC,"iCorbeau2")==1) &&
    (GetLocalInt(oPC,"iCorbeau3")==1) &&
    (GetLocalInt(oPC,"iCorbeau4")==1) &&
    (GetLocalInt(oPC,"iCorbeau5")==1))

    {
object oTarget1 = GetObjectByTag("corbeau1");
DestroyObject(oTarget1, 0.0);
SetLocalInt(oPC,"iCorbeau1",0); // pour que le script ne se reexecute pas

object oTarget2 = GetObjectByTag("corbeau2");
DestroyObject(oTarget2, 0.0);
SetLocalInt(oPC,"iCorbeau2",0); // la premiere remise a zero au dessus suffisait mais bon ...

object oTarget3 = GetObjectByTag("corbeau3");
SetLocalInt(oPC,"iCorbeau3",0);
DestroyObject(oTarget3, 0.0);

object oTarget4 = GetObjectByTag("corbeau4");
SetLocalInt(oPC,"iCorbeau4",0);
DestroyObject(oTarget4, 0.0);

object oTarget5 = GetObjectByTag("corbeau5");
SetLocalInt(oPC,"iCorbeau5",0);
DestroyObject(oTarget5, 0.0);


/// Apparition d'un humain

location lTarget;
object oTarget = GetWaypointByTag("wp_corbeau");

lTarget = GetLocation(oTarget);

CreateObject(OBJECT_TYPE_CREATURE, "resref_du_pnj_qui_apparait", lTarget);

effect eEffect1 = EffectVisualEffect(VFX_FNF_SUMMON_GATE);
effect eEffect2 = EffectVisualEffect(VFX_FNF_WAIL_O_BANSHEES);

DelayCommand(0.0, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eEffect1, lTarget));
DelayCommand(0.0, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eEffect2, lTarget));
      }
}

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.


voila , j'espere vous avoir aidé , bon courage
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger Ignorer l'utilisateur
 
Blackblood
Chevalier
Inscrit le: 20 Juil 2004
Messages: 80
Localisation: France
Répondre en citant
Posté le : 05/10/2004 21:50:36 Sujet du message :

Même si ce n'est pas moi qui en est fait la demande, je te remercie pour ta réponse, cela me permet de mieux comprendre le fonctionnement des scripts et ainsi d'éviter les erreurs.

En tout cas, ton info pour déclencher la suite des évènements seulements lorsque tous les corbeaux sont arrivés va m'aider pour certains de mes scripts.

Bonne soirée
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
grosraoul
Ecuyer
Inscrit le: 10 Sep 2004
Messages: 60
Répondre en citant
Posté le : 05/10/2004 23:00:03 Sujet du message :

ah oui pardon, je sais pas pourquoi je croyais que vous faisiez des scripts ensemble , je sais pas ce qui m'a mis ca en tete Wink
tcho
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger Ignorer l'utilisateur
 
Blackblood
Chevalier
Inscrit le: 20 Juil 2004
Messages: 80
Localisation: France
Répondre en citant
Posté le : 06/10/2004 06:53:49 Sujet du message :

Aucun problème, moi j'essaie de répondre avec mes petites connaissances. Maintenant si des personnes me corrige, je ne demande pas mieux Very Happy

Bonne journée
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur Ignorer l'utilisateur
 
Eldorane
Héros
Inscrit le: 18 Oct 2003
Messages: 298
Localisation: Moselle
Répondre en citant
Posté le : 06/10/2004 16:31:07 Sujet du message :

Smile Merci !!!! Smile


ça fonctionne parfaitement !!!

j'ai juste eu un doute sur l'emplacement du dernier script. Je l'ai finalement placé dans le ONHeartbeat du second trigger mais je sais pas si c'est l'idéal car la transformation prend du temps à se réalisé (5 sec après que les corbeaux se soient rassemblés...)

Aussi existe t'il une liste des effets possibles ?
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
grosraoul
Ecuyer
Inscrit le: 10 Sep 2004
Messages: 60
Répondre en citant
Posté le : 06/10/2004 16:57:10 Sujet du message :

oui le onheartbeat est un bon choix

- Car ce script ne s'execute qu'une seule fois finalement .

- Mais pas le meilleur,car comme tu le dis , le script du onheartbeat s'execute toutes les 6 secondes, donc tout depend du timing ; quand tes corbeaux arrivent, si tu as de la chance , le script peut s'executer pile poil quand les corbeaux arrivent ou bien au bout de 5.9999 secondes dans le plus malheureux des cas.

pour les effets , tu peux télécharger le Lexicon si tu veux : tu peux y trouver la liste des effets du type VFX_FNF_* et surtout les photos d'ecrans qui vont avec . ca te donne une bonne idée comme ça.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger Ignorer l'utilisateur
 
Eldorane
Héros
Inscrit le: 18 Oct 2003
Messages: 298
Localisation: Moselle
Répondre en citant
Posté le : 06/10/2004 17:15:16 Sujet du message :

Merci encore ! excellent ce lexicon !
 
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 87.579ms