La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 27/12/2024 19:50:08


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
Tititatoum
Voyageur
Inscrit le: 09 Juil 2008
Messages: 2
Localisation: Clermont-Ferrand
Répondre en citant
Posté le : 09/07/2008 14:49:18 Sujet du message : (débutant) Déclencheur ne réalise que certaines conditions

Bonjour. Je suis navré de poster une demande qui paraîtra sans doute banale aux habitués d'Aurora, mais je débute depuis peu dans la réalisation de scripts (simples!) et je tombe sur un os en essayant d'appliquer ce que je pensais avoir compris.

J'explique le contexte de mon problème :

    Un Tilset campagne représentant un ile (on s'en f... un peu, je crois, mais bon...);
    En bas de cette ile, sur un passage peu large, un déclencheur à quelques mètres de l'entrée d'une caverne;
    A l'entrée de la caverne, une cloche (Placable, statique).


Ce que je cherche :

Je voudrais que le passage sur le déclencheur fasse sonner la cloche ( j'aimerais son + texte), puis provoque l'apparition successive (à quelques secondes d'intervalle) de trois pirates.
Chacun jette un oeil à droite puis à gauche, lance une menace et (enfin) attaque le PJ.
Enfin, une fois tous apparus, le déclencheur se contentera désormais de faire sonner la cloche.

J'ai tenté un script assez basique, mais la seule chose qu'il produit est l'apparition simltanée des trois pirates.
Il ne tient aucun compte des textes ou sons marqués.
De plus, il se redéclenche à chaque passage durant un certain temps (que je n'ai pas réussi à définir) avant de ne plus rien faire (ni les sons ni les textes demandés).

J'avoue que je sèche...

Voici mon script :
NWScript :

//:Confused///////////////////////// ////////////////////////////// ////////////////////
//:: OnEnter script : sonclochecave
//:Confused///////////////////////// ////////////////////////////// ////////////////////
/*
    Le passage du PC sur le Trigger declenche la cloche de l'entree de la caverne,
ce qui provoque la venue successive de trois pirates.
    Chaque pirate fait une animation puis parle puis attaque.
    Apres l'apparition des trois pirates, le trigger ne fait plus que faire
sonner la cloche.
*/

//:Confused///////////////////////// ////////////////////////////// ////////////////////
//:: Cree par : Tititatoum
//::
//:: avec l'aide precieuse des "Cours de Scripts pour les Quiches" de Celowin
//:: traduits par Amaranthe
//::
//:: Le : 08 Juillet 2008  02h34
//:Confused///////////////////////// ////////////////////////////// ////////////////////


// on definit oPC
object oPC = GetEnteringObject();

//on va definir la variable de passage
int nPASSAGE = GetLocalInt(OBJECT_SELF, "PASSAGE");

void main()

{
    // si le PC n'est pas encore passe
    if (nPASSAGE != 1 && GetIsPC(oPC))

        {
            // on joue seulement le son de cloche 1 puis on attend 3 secondes
            ActionDoCommand(PlaySound("as_cv_bell1"));
            ActionSpeakString("Une petite cloche se met a tinter devant l'entree de la caverne");
            ActionWait(3.0);

                {
                // assigne les objets "oPirate1" et "oDest"
                object oPirate1 = GetNearestObjectByTag("Pirate1");
                object oPirate2 = GetNearestObjectByTag("Pirate2");
                object oPirate3 = GetNearestObjectByTag("Pirate3");
                object oDest = GetWaypointByTag("WP_CaveDoor_1");

                // On cree le premier pirate au WP de la caverne,
                // on lui fait tourner la tete a droite et a gauche puis parler
                // on lui demande d'attaquer ce qu'il a vu (le PC),
                // puis on attend 3 secondes
                CreateObject(OBJECT_TYPE_CREATURE,"bandit001",GetLocation(oDest));
                AssignCommand(oPirate1,ActionPlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_RIGHT));
                AssignCommand(oPirate1,ActionPlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_LEFT));
                AssignCommand(oPirate1,ActionSpeakString("Toi ici ! Tu vas mourir !!!"));
                AssignCommand(oPirate1,ActionAttack(oPC));
                ActionWait(5.0);

                    {


                    // on fait la meme chose avec le deuxieme pirate
                    CreateObject(OBJECT_TYPE_CREATURE,"bandit002",GetLocation(oDest));
                    AssignCommand(oPirate1,ActionPlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_RIGHT));
                    AssignCommand(oPirate1,ActionPlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_LEFT));
                    AssignCommand(oPirate1,ActionSpeakString("Par la Malpeste ! Je croyais que..."));
                    AssignCommand(oPirate2,ActionAttack(oPC));
                    ActionWait(6.0);

                        {
                        // on refait la meme chose avec le troisieme pirate
                        CreateObject(OBJECT_TYPE_CREATURE,"bandit003",GetLocation(oDest));
                        AssignCommand(oPirate1,ActionPlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_RIGHT));
                        AssignCommand(oPirate1,ActionPlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_LEFT));
                        AssignCommand(oPirate1,ActionSpeakString("Mince alors !"));
                        AssignCommand(oPirate3,ActionAttack(oPC));

                            {
                                // On initialise la variable de passage en lui donnant la valeur 1
                                ActionDoCommand(SetLocalInt(OBJECT_SELF,"PASSAGE",1));
                            }


                        }
                    }
                }

            }
    else
      {
            // s'il est deja passe, alors on joue le son de cloche 2,
            // on attend 2 secondes puis on joue le 1
            ActionDoCommand(PlaySound("as_cv_bell2"));
            ActionSpeakString("La petite cloche de la caverne se met a tinter");
            ActionWait(2.0);
            ActionSpeakString("La cloche retentit de nouveau, mais rien ne semble se produire");
            ActionDoCommand(PlaySound("as_cv_bell1"));
      }
}
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 ne suis pas franchement sûr de tout ce que j'utilise, mais il me semble que, même si les animations demandées aux pirates ne fonctionnent pas (faut-il que je les mette en "ActionDoCommand" ?), je devrais au moins avoir les textes et les sons correctement puisque le "CreateObject" fonctionne. Non...?
J'ai pensé à tout mettre en pile d'Action, histoire de ne pas coincer sur les timings, mais c'est peut-être ça qui empêche mon déclencheur de changer d'état avant un certain temps ?

Ne vaudrait-il pas mieux que je place les actions à effectuer des pirates dans leur propre script "onSpawn" (enfin, "userDefine", plutôt...). Je n'ai pas encore osé tenter...

Est-ce que je place certaines fonction au mauvais endroit (avant le main, plus haut ou plus bas)...?
J'avoue que je n'ai pas encore bien saisi toutes ces subtilités...


Si quelqu'un a une idée ou peut m'expliquer où je fais les erreurs, je suis preneur.

Merci d'avance.
_________________
a découvert Aurora depuis trois semaines; commence un long cycle de nuits blanches à cause de lui...
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
vicayne vrae
Ecuyer
Inscrit le: 25 Aoû 2007
Messages: 62
Localisation: Les Marches d'Argent
Répondre en citant
Posté le : 11/07/2008 13:01:43 Sujet du message :

Bonjour, je suis très loin d'être un expert, je début tout comme toi je pense. Wink

J'ai regardé ton script et il y a quelques choses que je peux te dire:

- Pour que ton déclencheur ne refasse pas apparaître d'autres pirates.

// On initialise la variable de passage en lui donnant la valeur 1
ActionDoCommand(SetLocalInt(OBJECT_SELF,"PASSAGE",1));

Mettre au début, au lieux de à la fin, car le script peut très bien ce lancer plusieurs fois avant qu'il soit fini d'être exécuter.


- Je ne pense pas que tu puisses trouver un tag avant d'avoir créé la créature donc à mettre juste après le CreateObjet

object oPirate1 = GetNearestObjectByTag("Pirate1");


- Il me semble qu'il y a aussi des erreurs de nom dans les AssignCommand qui sont normalement pour oPirate2 et oPirate3 au lieux de oPirate1.

-Si tu veux être sur que les animations sois joué je pense qu'il faudra leur laisser le temps d'être jouer avec une petite attente entre les deux peu t'être.

J'espère que ça te fera avancer dans ton module. Very Happy
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Ivellios
Légende vivante
Inscrit le: 25 Jan 2005
Messages: 447
Localisation: Poitiers
Répondre en citant
Posté le : 11/07/2008 20:37:34 Sujet du message :

Quelques remarques :
- Comme précisé dans le post précédent la définition des pirates est mauvaise, le coup des GetNearestObjectByTag() ne risque pas de marcher tant que les pirate ne sont pas créé en jeu ^^. Pour celà le plus simple est de recupéré dans la variable lors du CreateObject() directement car la fonction renvoie l'objet créé.

- Tu mets des accolades là où il ne faut pas, c'est pas forcemment génant normalement, mais prend un tuto de base de C tu devrais y voir plus clair, et ça allègera tes scripts.

- La fonction PlaySound() ne marche pas sur les trigger (et oui c'est chiant ^^) donc on assigne l'action au Joueur directement ou un Plaçable (genre une cloche ^^).




Ici une version où j'ai juste corrigé tes erreurs, et j'ai passé la création des pirates dans une fonction, c'est plus clair et comme ça t'apprendra par la même occasion ;p. Je me suis pas trop embété j'ai été au plus simple (même pas mit de commentaires, mais vu ton script tu devrais comprendre), à tester voir si ça marche, en tout cas ça compile ^^.

NWScript :
void Create_Pirate(object oCible, location lLoc, string sTag, string sSpeak);

void main()
{
object oPC = GetEnteringObject();

if(!GetLocalInt(OBJECT_SELF, "PASSAGE") && GetIsPC(oPC))
{
  object oPirate1, oPirate2, oPirate3;
  location lDest = GetLocation(GetWaypointByTag("WP_CaveDoor_1"));

  SetLocalInt(OBJECT_SELF, "PASSAGE" , TRUE);

  AssignCommand(oPC, PlaySound("as_cv_bell1"));

  FloatingTextStringOnCreature("", oPC);
  ActionWait(3.0);

  ActionDoCommand(Create_Pirate(oPC, lDest, "bandit001", "Toi ici ! Tu vas mourir !!!"));
  ActionWait(5.0);

  ActionDoCommand(Create_Pirate(oPC, lDest, "bandit002", "Par la Malpeste ! Je croyais que..."));
  ActionWait(6.0);

  ActionDoCommand(Create_Pirate(oPC, lDest, "bandit003", "Mince alors !"));
}
else
{
  AssignCommand(oPC, PlaySound("as_cv_bell2"));
  FloatingTextStringOnCreature("", oPC);
  DelayCommand(2.0, FloatingTextStringOnCreature("La cloche retentit de nouveau, mais rien ne semble se produire", oPC));
  DelayCommand(2.0, AssignCommand(oPC, PlaySound("as_cv_bell1")));
}
}



void Create_Pirate(object oCible, location lLoc, string sTag, string sSpeak)
{
  object oPirate = CreateObject(OBJECT_TYPE_CREATURE, sTag, lLoc);

  AssignCommand(oPirate, ActionPlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_RIGHT));
  AssignCommand(oPirate, ActionPlayAnimation(ANIMATION_FIREFORGET_HEAD_TURN_LEFT));
  AssignCommand(oPirate, ActionSpeakString(sSpeak));
  AssignCommand(oPirate, ActionAttack(oCible));
}
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.

_________________
Scripts, systèmes, fonctions,... c'est par ici...
Pyjama pour castor, une vocation, un avenir sûr
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur MSN Messenger Ignorer l'utilisateur
 
Tititatoum
Voyageur
Inscrit le: 09 Juil 2008
Messages: 2
Localisation: Clermont-Ferrand
Répondre en citant
Posté le : 12/07/2008 02:04:59 Sujet du message :

Un grand MERCI à vous deux pour toutes ces infos qui m'ont été d'une grande aide.

Merci, Ivellios, ton script fonctionne parfaitement bien, même si bien sûr tu te doutes que je préfère améliorer le mien (^^)
Il m'aura permis de comprendre :
  • la différence entre les ActionWait et les DelayCommand et leurs utilisations différentes ;
  • de simplifier la fonction concernant ma variable "passage";
  • ce qu'était ce truc bizarre genre "void Create_Pirate" que j'avais déjà vu mais pas compris (il permet de créer une fonction qu'on réutilise plus tard, si je saisis bien ?);
  • de me détendre sur l'utilisation à outrance des {} tellement j'avais peur de ne pas en mettre assez (^^);
  • d'oser assigner des commandes "déplacées" sur d'autres objets (je n'y avais pas pensé, mais ça m'a permis de faire fonctionner d'autres scripts bancals);
  • et enfin de voir une autre approche pour la méthode d'écriture.


Merci Vicayne vrae pour tous tes judicieux conseils :
  • J'ai ramené au début la commande de réinitialisation du "passage" au début de la fonction et depuis ça fonctionne;
  • J'ai effectivement corrigé l'emplacement de la définition des "objets-pirates", ça le fait;
  • J'ai aussi rectifié les Tags des N° des pirates, c'est mieux (saleté de copier-coller ^^)



Encore merci à vous deux, j'aurai réussi à faire avancer mon script et surtout à comprendre certaines fonctions de base que je veux maitriser avant d'oser m'attaquer à d'autres fonctions plus "lourdes".

Je retourne de suite essayer de compiler avec tout ça sous le coude...
Mais bon, pas ce soir, là je commence à fatiguer... ^^
_________________
a découvert Aurora depuis trois semaines; commence un long cycle de nuits blanches à cause de lui...
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
vicayne vrae
Ecuyer
Inscrit le: 25 Aoû 2007
Messages: 62
Localisation: Les Marches d'Argent
Répondre en citant
Posté le : 12/07/2008 13:25:24 Sujet du message :

Merci à toi Ivellios, pour ce cours de code. J'adore. Very Happy

Propre, claire, comme devraient l'être tous les scripts. Wink

Que du bonheur, je suis fan. Embarassed
 
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.012ms