La Bibliothèque de Neverwinter Nights
Aide et informations diverses sur Neverwinter Nights ainsi que D&D3.
La date/heure actuelle est 19/05/2024 15:40:45


  Page 1 sur 1 ¤

Voir le sujet précédent ¤ Voir le sujet suivant 
Auteur Message
Albator003
Invité


Répondre en citant
Posté le : 04/08/2003 21:14:18 Sujet du message : probleme pour defenir l'heure

Bonjour a tous voila encore un problème dont je ne vois pas l'erreur . Voila je fais un script pour que quand il est minuit (par exemple ) une cloche sonne 12 foiset pour ca il me faut defenir l'heure alors voila ce que j'ai fais mais evidement ca ne marche pas Very Happy

Code :


void main()
{
object oSound = GetObjectByTag("");
int hour;
 hour = GetTimeHour();
 if (hour = 0)
 {
 DelayCommand(0.0, SoundObjectPlay(oSound));
  DelayCommand(2.0, SoundObjectPlay(oSound));
   DelayCommand(4.0, SoundObjectPlay(oSound));
    DelayCommand(6.0, SoundObjectPlay(oSound));
     DelayCommand(8.0, SoundObjectPlay(oSound));
      DelayCommand(10.0, SoundObjectPlay(oSound));
       DelayCommand(12.0, SoundObjectPlay(oSound));
        DelayCommand(14.0, SoundObjectPlay(oSound));
         DelayCommand(16.0, SoundObjectPlay(oSound));
          DelayCommand(18.0, SoundObjectPlay(oSound));
           DelayCommand(20.0, SoundObjectPlay(oSound));
            DelayCommand(22.0, SoundObjectPlay(oSound));
             
 }
}



J'ai verifier le tag et si lobjet est actif est tout et tout et c'est ok il dois y avoir un probleme sur le debut du script si quelq'un voit le probleme merci de me donnerun coup de paluche Laughing
 
Revenir en haut
 
lendraste
Grand Maître Chanteur du Conseil
Inscrit le: 20 Fév 2003
Messages: 1403
Localisation: Quelque part ailleurs
Répondre en citant
Posté le : 04/08/2003 21:30:05 Sujet du message : Re: probleme pour defenir l'heure


albator003 a écrit :

J'ai verifier le tag et si lobjet est actif est tout et tout et c'est ok il dois y avoir un probleme sur le debut du script si quelq'un voit le probleme merci de me donnerun coup de paluche Laughing
En fait il manque plusieurs précision de taille comme :
- Ou as-tu placé le script ?
- Est-ce normal que le tag de l'objet sonore soit une chaine de caractère vide ?
- Est-ce que tu es sûr qu'il est minuit à un moment donné lors de tes tests ?

Mais ce qui me saute aux yeux, si tu as bien copier/coller ton script ici c'est ça : "if (hour = 0)" pour lequel je rappelle que "=" est un opérateur d'affectation et que pour comparer il faut utiliser "==".

A part ça, je manque d'idée ou d'information.
_________________
Lendraste de Loreval
Qui cherche la Vérité cherche celui qui la détient, car elle n'existe pas à l'état naturel.
La cité des mensonges - 1
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger Numéro ICQ Ignorer l'utilisateur
 
Albator003
Invité


Répondre en citant
Posté le : 04/08/2003 22:22:57 Sujet du message :

Erreur de débutant Boulet ! C'était les "==" il m'en manquer un lol bon ca va chut on dira que c'est pas de ma faute c'est l'ordi qui n'a pas taper le second Smile merci pour ton aide Iendraste
 
Revenir en haut
 
nunch
Grand Sage du Conseil
Inscrit le: 23 Mai 2003
Messages: 966
Localisation: Dans la gueule du Lyon
Répondre en citant
Posté le : 05/08/2003 09:00:20 Sujet du message :

Et si tu faisais un boucle pour tes 12 coups de minuit ?

Code :

void main()
{
   object oSound = GetObjectByTag("");
   int hour;
   hour = GetTimeHour();
   if (hour == 0)
   {
      float fCoup = 0;
      while(fCoup < 12.0)
         DelayCommand(iCoup*2.0, SoundObjectPlay(oSound));
    }
}


Comme ça tu peux transformer ton script en fonction avec paramètre (le nombre de coups à sonner, ici le "12.0") sans avoir à tout te repalucher à chaque fois.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur MSN Messenger Ignorer l'utilisateur
 
lendraste
Grand Maître Chanteur du Conseil
Inscrit le: 20 Fév 2003
Messages: 1403
Localisation: Quelque part ailleurs
Répondre en citant
Posté le : 05/08/2003 09:18:05 Sujet du message :


nunch a écrit :
Code :

void main()
{
   object oSound = GetObjectByTag("");
   int hour;
   hour = GetTimeHour();
   if (hour == 0)
   {
      float fCoup = 0;
      while(fCoup < 12.0)
         DelayCommand(iCoup*2.0, SoundObjectPlay(oSound));
    }
}

Ce script là ne va pas se compiler car "iCoup" n'est pas déclaré. De plus, la condition de sortie "(fCoup<12.0)" ne sera jamais vrai puisque tu n'incrémentes pas fCoup.
L'idée de générer les 12 coups dans une boucle est bonne, mais il faut le faire proprement Smile
Ca devrait donner ça :

Code :

void main()
{
  object oSound = GetObjectByTag("");
  int hour;
  hour = GetTimeHour();
  if (hour == 0)
  {
    float fCoup = 0;
    while(fCoup < 12.0)
    {
      DelayCommand(fCoup*2.0, SoundObjectPlay(oSound));
      fCoup++;
    }
  }
}


Ensuite, je ne sais pas quand est-ce que ce script est déclenché, mais s'il est utilisé astucieusement, on peut carrément faire sonner la cloche en fonction de l'heure.

Code :

void main()
{
  object oSound = GetObjectByTag("");
  int nHour;
  int nCoup;
  nHour = GetTimeHour();
  if (nHour=0) //Si l'heure est 0 on la déclare à 24
  {
    nHour=24;
  }
  if (nHour>12) //Si l'heure est supérieure à 12 le nombre de coup est heure-12
  {
    nCoup=nHour-12;
  }
  else
  {
    nCoup=nHour;
  }
  while(nCoup > 0)
  {
    DelayCommand(IntToFloat(13-nCoup)*2.0, SoundObjectPlay(oSound)); //programmer un coup toutes les 2 secondes
    nCoup--;
  }
}


Ceci vaux pour une horloge affichant 12 heures, bien sûr Smile
Pour une horloge 24 heures (qui sonnerait 24 fois à minuit), il n'y a qu'une toute petite modification à faire.
_________________
Lendraste de Loreval
Qui cherche la Vérité cherche celui qui la détient, car elle n'existe pas à l'état naturel.
La cité des mensonges - 1
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger Numéro ICQ Ignorer l'utilisateur
 
nunch
Grand Sage du Conseil
Inscrit le: 23 Mai 2003
Messages: 966
Localisation: Dans la gueule du Lyon
Répondre en citant
Posté le : 05/08/2003 09:29:53 Sujet du message :

Bon j'ai un peu baclé la chose, j'avoue Confused . Mais je suis complètement abruti par la châleur et je suis entrain de me casser la tête sur le développement d'un driver win2K (qui est un peu ma priorité), alors j'ai du mal à jongler entre tous mes codes en C et ceux de NWN Smile
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur MSN Messenger Ignorer l'utilisateur
 
Albator003
Invité


Répondre en citant
Posté le : 05/08/2003 20:35:47 Sujet du message :

Bon alors pour ton script qui est je le rapelle celui la


Code :


void main()
{
  object oSound = GetObjectByTag("");
  int nHour;
  int nCoup;
  nHour = GetTimeHour();
  if (nHour=0) //Si l'heure est 0 on la déclare à 24
  {
    nHour=24;
  }
  if (nHour>12) //Si l'heure est supérieure à 12 le nombre de coup est heure-12
  {
    nCoup=nHour-12;
  }
  else
  {
    nCoup=nHour;
  }
  while(nCoup > 0)
  {
    DelayCommand(IntToFloat(13-nCoup)*2.0, SoundObjectPlay(oSound)); //programmer un coup toutes les 2 secondes
    nCoup--;
  }
}



je n'arrive pas a le faire fonctionné je l'ai pacer sur le Onheartbeat d'une zone et j'ai mis le son sur la map j'ai mis le tag dans le script mais marche pas... alors jai poursui mon idée de base car elle aussi a un probleme...

En faite pour avoir les 12 coup j'ai crée 12 son les meme (pourquoi 12 ? parce que si j'en met que 1 les son se jou 6sec l'un apres lautre en faite il faut que le son soit fini pour pouvoir le refaire ce que je trouve long...bref) J'ai mis 12 tag différents pourchaque son et j'ai crée ce script pour l'exemple de minuit

Code :


void main()
{
object oSound = GetObjectByTag("clochemal");
object oSound1 = GetObjectByTag("clochemal1");
object oSound2 = GetObjectByTag("clochemal2");
object oSound3 = GetObjectByTag("clochemal3");
object oSound4 = GetObjectByTag("clochemal4");
object oSound5 = GetObjectByTag("clochemal5");
object oSound6 = GetObjectByTag("clochemal6");
object oSound7 = GetObjectByTag("clochemal7");
object oSound8 = GetObjectByTag("clochemal8");
object oSound9 = GetObjectByTag("clochemal9");
object oSound10 = GetObjectByTag("clochemal10");
object oSound11 = GetObjectByTag("clochemal11");
int hour;
 hour = GetTimeHour();
  if (hour == 0)
 { DelayCommand(0.0, SoundObjectPlay(oSound));
  DelayCommand(2.0, SoundObjectPlay(oSound1));
   DelayCommand(4.0, SoundObjectPlay(oSound2));
    DelayCommand(6.0, SoundObjectPlay(oSound3));
     DelayCommand(8.0, SoundObjectPlay(oSound4));
      DelayCommand(10.0, SoundObjectPlay(oSound5));
       DelayCommand(12.0, SoundObjectPlay(oSound6));
        DelayCommand(14.0, SoundObjectPlay(oSound7));
         DelayCommand(16.0, SoundObjectPlay(oSound8));
          DelayCommand(18.0, SoundObjectPlay(oSound9));
           DelayCommand(20.0, SoundObjectPlay(oSound10));
            DelayCommand(22.0, SoundObjectPlay(oSound11));
 }
}

mais le problème c'est que il va me faire ce script a 0h00 mais aussi a 0h30 ou 0h34...etc car ce script est sur un heartbeat alors je me suis dis de rajouter une définition : celle des minute... alors ca me donne ca

Code :


void main()
{
object oSound = GetObjectByTag("clochemal");
object oSound1 = GetObjectByTag("clochemal1");
object oSound2 = GetObjectByTag("clochemal2");
object oSound3 = GetObjectByTag("clochemal3");
object oSound4 = GetObjectByTag("clochemal4");
object oSound5 = GetObjectByTag("clochemal5");
object oSound6 = GetObjectByTag("clochemal6");
object oSound7 = GetObjectByTag("clochemal7");
object oSound8 = GetObjectByTag("clochemal8");
object oSound9 = GetObjectByTag("clochemal9");
object oSound10 = GetObjectByTag("clochemal10");
object oSound11 = GetObjectByTag("clochemal11");
int hour;
int minute;



 hour = GetTimeHour();
 minute = GetTimeMinute();

 if ((hour == 00) && minute == 00)
 { DelayCommand(0.0, SoundObjectPlay(oSound));
  DelayCommand(2.0, SoundObjectPlay(oSound1));
   DelayCommand(4.0, SoundObjectPlay(oSound2));
    DelayCommand(6.0, SoundObjectPlay(oSound3));
     DelayCommand(8.0, SoundObjectPlay(oSound4));
      DelayCommand(10.0, SoundObjectPlay(oSound5));
       DelayCommand(12.0, SoundObjectPlay(oSound6));
        DelayCommand(14.0, SoundObjectPlay(oSound7));
         DelayCommand(16.0, SoundObjectPlay(oSound8));
          DelayCommand(18.0, SoundObjectPlay(oSound9));
           DelayCommand(20.0, SoundObjectPlay(oSound10));
            DelayCommand(22.0, SoundObjectPlay(oSound11));
 }
}


Alors cette fois ca marche plus du tout...Je me demande pourquoi et je vois que sur mon module 2 minute réel represente 1 heure virtuel..je calcule et je vois que en faite le moment ou la minute est a 0 se passe en 2 sec et un script sur le onHeartbeat se declanche toute les 6 sec alors je me dis que il faudrai modifier la vitesse du jeu... je la met donc a 6 min pour que une minute virtuel dur 6 sec et la ca marche!!! mais le truc c'est que ca fais pareil disons que tant que c'est dans les 0hXX il me joue les sons... Comprend pas pourquoi Surprised
 
Revenir en haut
 
Lavok
Légende vivante
Inscrit le: 22 Oct 2002
Messages: 434
Localisation: Sphère planaire
Répondre en citant
Posté le : 05/08/2003 21:12:14 Sujet du message :

Il y a peut-être plus simple... Le jeu commence par défaut à 13 heures précises. Sur le OnSpawn de ton horloge, tu mets un délai de 11 heures suivi d'un ExecuteScript() pour que le script s'enclenche à minuit et à la fin du script, tu remets un délai, de 24 heures cette fois. Ce qui fait qu'une fois le premier minuit passé, le script s'enclenche tous les minuits. En théorie, ça devrait marcher, non Very Happy?
_________________
ToB : Une seule chose semble certaine : tant que le trône de sang de Bhaal restera vide, le chaos règnera.

Moi : Une seule chose semble certaine : tant que la tête de singe de Bush restera vide, le chaos règnera.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Albator003
Invité


Répondre en citant
Posté le : 05/08/2003 21:34:34 Sujet du message :

Bon j'en ai marre de galéré alors je suis aller faire un tour et j'ai trouvé mon bonheur mais alors attention le script il est long tres long lol enfin bref voila ca marche c'est le principale

Créé un objet invisible et mettez lui se script sur le onHeartbeat

Code :



//::///////////////////////////////////////////////
//:: Custom User Defined Event
//:: FileName: HourBell
//:://////////////////////////////////////////////
/*

OnHeartbeat script for an invisible object
The bell tolls every hour counting the time.

*/
//:://////////////////////////////////////////////
//:: Created By: Ayath The Loafer
//:: Created On: October 26th 2002
//:://////////////////////////////////////////////

void main()
{
    int nHour = GetTimeHour();
    //Purely for testing purposes
    SpeakString(IntToString(nHour));

    if (nHour==0 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour)
    {
        SetLocalInt(OBJECT_SELF,"Called_Time",0);
        DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(3.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(4.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(5.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(6.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(7.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(8.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(9.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(10.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(11.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
    }
    if (nHour==1 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour)
    {
        SetLocalInt(OBJECT_SELF,"Called_Time",1);
        DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
    }
    if (nHour==2 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour)
    {
        SetLocalInt(OBJECT_SELF,"Called_Time",2);
        DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
    }
    if (nHour==3 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour)
    {
        SetLocalInt(OBJECT_SELF,"Called_Time",3);
        DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
    }
    if (nHour==4 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour)
    {
        SetLocalInt(OBJECT_SELF,"Called_Time",4);
        DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(3.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
    }
    if (nHour==5 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour)
    {
        SetLocalInt(OBJECT_SELF,"Called_Time",5);
        DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(3.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(4.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
    }
    if (nHour==6 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour)
    {
        SetLocalInt(OBJECT_SELF,"Called_Time",6);
        DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(3.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(4.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(5.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
    }
    if (nHour==7 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour)
    {
        SetLocalInt(OBJECT_SELF,"Called_Time",7);
        DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(3.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(4.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(5.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(6.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
    }
    if (nHour==8 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour)
    {
        SetLocalInt(OBJECT_SELF,"Called_Time",8);
        DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(3.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(4.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(5.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(6.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(7.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
    }
    if (nHour==9 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour)
    {
        SetLocalInt(OBJECT_SELF,"Called_Time",9);
        DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(3.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(4.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(5.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(6.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(7.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(8.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
    }
    if (nHour==10 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour)
    {
        SetLocalInt(OBJECT_SELF,"Called_Time",10);
        DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(3.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(4.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(5.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(6.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(7.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(8.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(9.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
    }
    if (nHour==11 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour)
    {
        SetLocalInt(OBJECT_SELF,"Called_Time",11);
        DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(3.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(4.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(5.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(6.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(7.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(8.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(9.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(10.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
    }
    if (nHour==12 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour)
    {
        SetLocalInt(OBJECT_SELF,"Called_Time",12);
        DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(3.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(4.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(5.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(6.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(7.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(8.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(9.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(10.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(11.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
    }
    if (nHour==13 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour)
    {
        SetLocalInt(OBJECT_SELF,"Called_Time",13);
        DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
    }
    if (nHour==14 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour)
    {
        SetLocalInt(OBJECT_SELF,"Called_Time",14);
        DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
    }
    if (nHour==15 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour)
    {
        SetLocalInt(OBJECT_SELF,"Called_Time",15);
        DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
    }
    if (nHour==16 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour)
    {
        SetLocalInt(OBJECT_SELF,"Called_Time",16);
        DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(3.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
    }
    if (nHour==17 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour)
    {
        SetLocalInt(OBJECT_SELF,"Called_Time",17);
        DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(3.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(4.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
    }
    if (nHour==18 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour)
    {
        SetLocalInt(OBJECT_SELF,"Called_Time",18);
        DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(3.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(4.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(5.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
    }
    if (nHour==19 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour)
    {
        SetLocalInt(OBJECT_SELF,"Called_Time",19);
        DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(3.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(4.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(5.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(6.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
    }
    if (nHour==20 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour)
    {
        SetLocalInt(OBJECT_SELF,"Called_Time",20);
        DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(3.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(4.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(5.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(6.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(7.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
    }
    if (nHour==21 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour)
    {
        SetLocalInt(OBJECT_SELF,"Called_Time",21);
        DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(3.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(4.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(5.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(6.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(7.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(8.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
    }
    if (nHour==22 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour)
    {
        SetLocalInt(OBJECT_SELF,"Called_Time",22);
        DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(3.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(4.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(5.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(6.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(7.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(8.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(9.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
    }
    if (nHour==23 && GetLocalInt(OBJECT_SELF,"Called_Time")!=nHour)
    {
        SetLocalInt(OBJECT_SELF,"Called_Time",23);
        DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(1.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(3.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(4.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(5.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(6.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(7.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(8.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(9.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
        DelayCommand(10.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
    }
}



voila tout....
 
Revenir en haut
 
Lavok
Légende vivante
Inscrit le: 22 Oct 2002
Messages: 434
Localisation: Sphère planaire
Répondre en citant
Posté le : 05/08/2003 21:47:49 Sujet du message :

Houlà... C'est kilométrique... et sur un OnHeartbeat surtout... Je ne comprends pas trop pourquoi tu as changé tout, alors que l'autre système était valable.
_________________
ToB : Une seule chose semble certaine : tant que le trône de sang de Bhaal restera vide, le chaos règnera.

Moi : Une seule chose semble certaine : tant que la tête de singe de Bush restera vide, le chaos règnera.
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Ignorer l'utilisateur
 
Albator003
Invité


Répondre en citant
Posté le : 05/08/2003 22:10:02 Sujet du message :

lautre systeme ne marche pas helas....
 
Revenir en haut
 
lendraste
Grand Maître Chanteur du Conseil
Inscrit le: 20 Fév 2003
Messages: 1403
Localisation: Quelque part ailleurs
Répondre en citant
Posté le : 06/08/2003 07:43:14 Sujet du message :

Bon... il faut que je rappelle la phrase qui précédait mon script :


lendraste a écrit :
Ensuite, je ne sais pas quand est-ce que ce script est déclenché, mais s'il est utilisé astucieusement, on peut carrément faire sonner la cloche en fonction de l'heure.
Il est évident qu'il ne fallait pas le placer sur le OnHeartbeat, pas plus que le la première version du tien.

Ensuite, voici une nouvelle version du script "kilometrique" que tu nous a donné. Le gars qui a pondu ça ne connaissait manifestement pas les boucles :

Code :

void main()
{
  int nHour = GetTimeHour();
  //Purely for testing purposes
  SpeakString(IntToString(nHour));
  int nLasthour = GetLocalInt(OBJECT_SELF,"Called_Time");
  int nCount;

  if (nHour<>nLasthour)
  {
    SetLocalInt(OBJECT_SELF, "Called_Time", nHour);
    if (nHour==0)
    {
      nHour=24;
    }
    if (nHour>12)
    {
      nHour=nHour-12;
    }
    for (nCount=1;nCount<=nHour;nCount++)
    {
      DelayCommand(IntToFloat(nCount-1), AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell1")));
    }
  }
}


Si je ne me suis pas trompé, ça fait exactement (et j'insiste sur le exactement) la même chose que le long script que tu nous as donné.
Maintenant, il me semble bien que ce n'est pas ce que tu voulais. Si j'ai bien compris, tu souhaitais qu'on entende la cloche dans toutes la zone, car je suppose que tu as créé un objet "son" assez volumineux. Même l'idée de faire 12 objets son, un pour chaque son de cloche, n'est pas idiote si chacun dure trop longtemps à ton goût, mais là encore, l'usage d'une boucle résoud tout en simplicité. Voici une adaptation de ton script avec ma méthode (que tu pourras mettre sur le OnHeartbeat de la zone, je précise cette fois Smile ) :

Code :

void main()
{
  int nHour = GetTimeHour();
  int nLasthour = GetLocalInt(OBJECT_SELF,"LASTHOUR");
  int nCount;

  if (nHour<>nLasthour) //Teste s'il s'agit d'une nouvelle heure
  {
    SetLocalInt(OBJECT_SELF, "LASTHOUR", nHour); //sauve la nouvelle heure
    //ramène l'heure sur 12 heures pour correspondre au nombre de coup de cloche
    if (nHour==0)
    {
      nHour=24;
    }
    if (nHour>12)
    {
      nHour=nHour-12;
    }
    for (nCount=1;nCount<=nHour;nCount++) //Compte le nombre de coup à jouer
    {
      DelayCommand(IntToFloat(nCount-1)*2.0, SoundObjectPlay(GetObjectByTag("clochemal"+IntToString(nCount-1)))); //joue le son "clochemalX" ou X est déterminé par le compteur nCount, sur des intervalles de 2 secondes.
    }
  }
}


Cela t'oblige toutefois à changer un petit truc. Ton premier objet son devra porter le tag "clochemal0" et non pas "clochemal". A toute fin utile, je précise que la cloche jouera à l'ouverture du module quelle que soit l'heure sauf s'il est minuit au démarrage. La raison en est que la variable "LASTHOUR" sauvée sur la zone n'est pas initialisée au démarrage du module.
_________________
Lendraste de Loreval
Qui cherche la Vérité cherche celui qui la détient, car elle n'existe pas à l'état naturel.
La cité des mensonges - 1
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger Numéro ICQ Ignorer l'utilisateur
 
Albator003
Invité


Répondre en citant
Posté le : 06/08/2003 21:00:52 Sujet du message :

Merci pour le script helas entre temps j'en est etabli un nouveau... car sur les OnHeartbeat je commence a avoir beaucoup de script alors afin de limiter j'ai utiliser des delay command afin de placer ce script sur un Onspawn j'explique la technique

Deja savoir le delay command a faire
Sur les propriété du module allez a avancé et regarder combien de minute se passe en vrai pour une heure virtuel dans mon cas 5 min
si votre valeur est différente il vous suffit juste de prendre votre valeur en vrai et la multiplié par 60 (Ex : 60 x 5 = 300 seconde)
ceci vous permettera de savoir a combien vous devrez mettre le float de votre DelayCommand de la fin des script
pour le 1er script il faut savoir a quelle heure votre module commence dans mon cas il commence à 0h00

1er script : a mettre sur un Onspawn
ce script s'appelle cloche
Code :

void main()
{
// ici c'est 0h00 donc 12 coup
DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2")));
 DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2")));
  DelayCommand(4.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2")));
   DelayCommand(6.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2")));
    DelayCommand(8.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2")));
     DelayCommand(10.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2")));
      DelayCommand(12.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2")));
       DelayCommand(14.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2")));
        DelayCommand(16.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2")));
         DelayCommand(18.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2")));
          DelayCommand(20.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2")));
           DelayCommand(22.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2")));
            DelayCommand(300.0,ExecuteScript("cloche1", OBJECT_SELF));// un delay command de 300 secondes afin de passer une heure pour executer un nouveau script (celui de 1 heure du matin si votre float est différent remplacer le evidement
}



Le script de 1 heure du matin nom du script "cloche1"

Code :

void main()
{
DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2")));
DelayCommand(300.0,ExecuteScript("cloche2", OBJECT_SELF));// pareil que tout a l'heure on appelle le script dans 1 heure (pour le jeu) ce script est pour 2 heures du matin

}


le script de 2 heures du matin (appeler "cloche2")
Code :

void main()
{
DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2")));
DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2")));
DelayCommand(300.0,ExecuteScript("cloche3", OBJECT_SELF));//toujours pareil on appelle un nouveau script celui de 3 du matin...
}

Comme vous le voyez au fur est a mesure que l'on apelle un script on rajoute juste une ligne pour donner un coup de plus... repetter la procedure jusqua 11 coup

Pour le dernier script celui des 11 coup et oui on s'arrete a 11 il suffit juste de rappeler le 1er script (qui est celui de 12 coup ou de 0h00) le faite de rapeller ce 1er script crée une boucle qui ne se termine jamais puisqu le 1er script apelle les autre .. Very Happy

Voila le dernier script

Code :

void main()
{
DelayCommand(0.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2")));
DelayCommand(2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2")));
DelayCommand(4.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2")));
DelayCommand(6.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2")));
DelayCommand(8.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2")));
DelayCommand(10.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2")));
DelayCommand(12.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2")));
DelayCommand(14.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2")));
DelayCommand(16.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2")));
DelayCommand(18.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2")));
DelayCommand(20.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2")));
DelayCommand(300.0,ExecuteScript("cloche", OBJECT_SELF));// on apelle le 1er script pour crée une boucle
}



Je le redis encore une fois ces script sont valable pour une valeur de 5 min/heures si vous avez la valeur par default qui est de 2 min remplacer le dernier delay command (qui est de 300 pour l'exemple) par 2 x 60 c'est a dire 120 Laughing

voila c'est long a faire mais ca bouffe pas trop de ressource est empeche l'utilisation du Onheartbeat Wink
 
Revenir en haut
 
lendraste
Grand Maître Chanteur du Conseil
Inscrit le: 20 Fév 2003
Messages: 1403
Localisation: Quelque part ailleurs
Répondre en citant
Posté le : 07/08/2003 07:13:34 Sujet du message :


albator003 a écrit :
Merci pour le script helas entre temps j'en est etabli un nouveau... car sur les OnHeartbeat je commence a avoir beaucoup de script alors afin de limiter j'ai utiliser des delay command afin de placer ce script sur un Onspawn j'explique la technique
Heu... Sans vouloir te vexer, ton obstination à ne pas vouloir utiliser les boucles confine à l'hérésie Mr. Green
De plus, tu te compliques la vie en limitant à l'exécution toutes les 5 minutes, car dans ton cas, si l'heure dans le jeu dure 2 minutes réelles (durée par défaut), il faut changer 12 scripts pour se mettre à jour. Il existe une fonction qui rapporte le nombre de secondes réelles pour une heure dans le jeu (HoursToSeconds) qui tient évidemment compte du paramètre du module concernant la durée des heures.
Tes douze scripts peuvent être remplacés par 1 seul, parfaitement transportable d'un module à l'autre, que voici :
Code :

// Ce script s'appelle "cloche"
void main()
{
  int nHour=GetLocalInt(OBJECT_SELF, "HOUR");
  int nCount;
  if (nHour==0)
  {
    nHour=24;
  }
  if (nHour>12)
  {
    nHour=nHour-12;
  }
  for (nCount=1;nCount<=nHour;nCount++)
  {
    DelayCommand(IntToFloat(nCount-1)*2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2")));
  }
  nHour++;
  if (nHour>24)
  {
    nHour=1;
  }
  SetLocalInt(OBJECT_SELF, "HOUR", nHour);
  DelayCommand(HoursToSeconds(1),ExecuteScript("cloche", OBJECT_SELF));
}


Et bien sûr, dans le OnSpawn de ton "clocher" :
Code :

main void()
{
  SetLocalInt(OBJECT_SELF, "HOUR", GetTimeHour()); //optionnel si le démarrage n'est pas effectué à minuit, mais marche aussi à minuit
  ExecuteScript("cloche", OBJECT_SELF);
}


Avec toujours la contrainte de démarrer ton module pile à minuit, mais si tu laisses la ligne optionnelle que j'ai ajouté, tu peux démarrer au début de n'importe quelle heure.
Voilà... C'est pas long, ça bouffe pas de ressources, c'est simple et ça se transporte partout (avec le "clocher" en tout cas)


Revenons un moment sur le précédent script en OnHeartbeat qui avait été fait. Il est effectivement plus gourmand en ressource, mais les tâches effectuées sont rapides à exécuter, étant donné qu'on n'exécute le gros du script que si l'heure a changé. Sur un petit module peu chargé, ça ne se verra pas (à moins que tu mettes des "clocher" à tous les coins de rue, ce qui multipliera le nombre de OnHeartbeat).

En tout cas, après avoir suivi ce fil de discussion, je m'inquiète beaucoup de la taille que ferait un script qui doit sonner toutes les minutes Mr. Green . L'utilisation des boucles est quasiment indispensable. Qui voudrait utiliser 12 scripts à la place d'un seul ? Qui voudrait écrire 60 lignes à la place d'une seule ? Qui voudrait avoir à changer 60 lignes de script au lieu d'une seule le jour ou le son change ? Ce n'est pas pour dénigrer la solution trouvée, qui a le mérite de fonctionner, mais surtout pour attirer l'attention sur des notions basiques de programmation qui, si elles ne sont pas comprises ou maîtrisées, conduisent à l'élaboration de solution abominablement couteuse en temps de conception (et en cheveux aussi Wink ). Enfin, ce que j'en dis... *soupir* ce n'est jamais qu'un conseil que je crois avisé.
_________________
Lendraste de Loreval
Qui cherche la Vérité cherche celui qui la détient, car elle n'existe pas à l'état naturel.
La cité des mensonges - 1
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger Numéro ICQ Ignorer l'utilisateur
 
Albator003
Invité


Répondre en citant
Posté le : 07/08/2003 19:16:18 Sujet du message :

tu a entierement raison souvent je me prend la tete sur une chose et quand mon idée et de faire comme ca je cherche pas a comprendre je la fais meme si y'a plus simple lol.
Bon y'a surtout que je maitrise pas trop les "int" et Getlocalint ou SetLocalInt alors je tente de tourner mon script selon mes capacité mais bon j'apprend en voyant des script comme le tien je le compare au mien je tente de comprendre et de voir pourquoi
Genre ta command IntToFloat ou les "++" ou "--" ca veux dire quoi ca? eclair moi la dessus que je comprend pas ton script entier
 
Revenir en haut
 
lendraste
Grand Maître Chanteur du Conseil
Inscrit le: 20 Fév 2003
Messages: 1403
Localisation: Quelque part ailleurs
Répondre en citant
Posté le : 07/08/2003 22:59:32 Sujet du message :


albator003 a écrit :
tu a entierement raison souvent je me prend la tete sur une chose et quand mon idée et de faire comme ca je cherche pas a comprendre je la fais meme si y'a plus simple lol.
Bon y'a surtout que je maitrise pas trop les "int" et Getlocalint ou SetLocalInt alors je tente de tourner mon script selon mes capacité mais bon j'apprend en voyant des script comme le tien je le compare au mien je tente de comprendre et de voir pourquoi
Genre ta command IntToFloat ou les "++" ou "--" ca veux dire quoi ca? eclair moi la dessus que je comprend pas ton script entier
Effectivement, je n'ai pas été très loquace sur les commentaires ce coup-ci. Et tu me poses là des questions sur les fondements de la programmation ou presque. Je prendrais un peu de temps pour y répondre demain, car il se fait tard, mais je te ferais un petit cours Smile
_________________
Lendraste de Loreval
Qui cherche la Vérité cherche celui qui la détient, car elle n'existe pas à l'état naturel.
La cité des mensonges - 1
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger Numéro ICQ Ignorer l'utilisateur
 
lendraste
Grand Maître Chanteur du Conseil
Inscrit le: 20 Fév 2003
Messages: 1403
Localisation: Quelque part ailleurs
Répondre en citant
Posté le : 08/08/2003 13:06:32 Sujet du message :

Bien. Parlons un peu variables et tout le toutim. C'est là le B. A. BA de l'utilisation du langage de script (valable dans pas mal de langage de programmation). La première chose à apprendre et à savoir.

Une variable est un "emplacement" dans lequel nous pouvons "stocker" de l'information. J'emploie "emplacement" et "stocker" qui sont deux mots du langage courant qui me semblent les plus appropriés pour en parler. La position de cet emplacement n'a en soi rien de primordial. Dans la plupart des langages, dit "de haut niveau" (Java, NWNScript, VBScript, JavaScript), on se fiche de savoir ou sera cet emplacement, il nous suffit juste de le connaître. Et pour le connaître et le reconnaître, nous lui donnons un nom. En revanche, dans la plupart des langages, ces emplacements ne sont pas conçus pour accueillir n'importe quelle information. Imaginez des tiroirs dans un grand meubles, chacun faisant 20 cm de haut, vous ne ferez pas passer une sphère de 30cm de diamètre dedans. Autrement dit, il y a une place pour chaque chose et chaque chose à sa place. La notion de "format" ou de "dimensionnement" n'est pas spécifiquement informatique et permet de comprendre que pour ranger une sphère de 30 cm de diamètre dans un tiroir, il faut que celui-ci fasse au moins 30 cm de haut, de large et de profondeur. Contrairement à un entrepôt, la mémoire d'un ordinateur n'est absolument pas découpée en "emplacements" déjà défini et prêt à l'emploi. Il faut, à chaque fois que l'on veux y ranger quelque chose, définir l'emplacement qui lui conviendra.

Maintenant la véritable question qui se pose est : pourquoi range-t-on des informations ? Réponse : pour les garder. Ce concept est à rapprocher de celui d'un collectionneur de timbre. Le vrai, celui qui ne va pas acheter ses timbres à La Poste, les regarde passer sur les enveloppes. Un jour, il peut voir sur une enveloppe un timbre qu'il ne possède pas. Deux choix s'offrent à lui. Soit il le prend et l'ajoute à sa collection en le collant dans un album, soit il le laisse passé. Le timbre pourra finir dans une broyeuse ou dans la main d'un autre collectionneur, mais peu importe son avenir, le fait est que le premier collectionneur ne l'aura pas gardé, et donc, ne l'aura pas à sa disposition pour pouvoir le montrer ou le contempler. Dans une mémoire informatique, c'est surtout une question de besoin qui détermine si on doit ou non garder une information, mais si on ne la garde pas, elle cesse d'exister. C'est aussi simple que ça. Ce qui veux dire que si on obtient (d'une manière ou d'une autre) une information, il est important de savoir ce que l'on va en faire. Si nous décidons de la garder, nous avons besoin d'aller plus loin dans cette explication Smile

Pour garder une information, il faut donc lui définir un emplacement. Il n'y a que deux chose à connaître pour créer un emplacement pour notre information. En gros nous nous inquiétons de savoir quelle est sa "taille" et/ou sa "forme", puis nous nous évertuons à lui donner un nom, un nom unique qui nous permet de retrouver l'emplacement dans la mémoire. Une sorte d'adresse. Comme un bricoleur minutieux qui range sa visserie dans les petits tiroirs d'un établi et qui étiquette les tiroirs pour pouvoir retrouver facilement ce qu'il cherche sans avoir à regarder dans chacun d'eux, nous mettons nous aussi des "étiquettes" sur nos emplacements d'informations pour les retrouver. On va tout de suite laisser tomber le vocabulaire "profane" que je viens de mettre en place pour employer la terminologie informatique :
emplacement -> variable
étiquette -> nom de variable
dimension, taille, format ou forme -> type de variable
information -> valeur ou valeur de la variable
Les deux choses les plus importantes lorsque nous définissons un emplacement pour stocker nos informations (donc une variable) sont le nom de la variable et son type. Le type permet de savoir ce qu'elle "peut" contenir. Le nom permet de la retrouver à tout moment. Passons en revue la notion de type.

Un type indique à la fois les formes et les dimensions possibles d'une valeur que nous souhaitons stocker dans une variable. Un mot-clé du langage de programmation permet de se représenter les types :
int : un entier relatif variant entre -2 147 483 648 et 2 147 483 647.
float : un réel entre -3.402823 E38 à 3.402823 E38
string : une chaine de caractère pouvant comporter jusqu'à ... hum... beaucoup de caractères. Je n'ai pas trouvé cette spécification dans NWN (si quelqu'un la connaît). C'est au moins 65535 je pense. Peut-être plus, mais c'est à vérifier.

Il y a d'autres types, mais pour comprendre les explications qui vont suivre c'est suffisants.

Dans le langage NWNScript, la définition d'une variable s'opère de la façon suivante :
<type> <nom_de_variable>[=<valeur_initiale>][, <nom_de_variable[=<valeur_nitiale>]]*;

Je me dois d'expliquer un peu la notation que j'utilise. Les symbole "<" et ">" délimite un emplacement pour un élément de syntaxe (que je nomme). Les crochets délimitent une portion optionnelle de la syntaxe et "*" indique que la portion de syntaxe qui précède peut être répétée plusieurs fois.
<type> peut donc être égal à int, float et string
<nom_de_variable> peut être égal à ce que l'on veux. A noter qu'un nom de variable ne peut pas comporter d'espace.
<valeur_initiale> peut prendre différente forme. Il peut s'agir de ce qu'on appelle une valeur constante, mais il peut également s'agir d'une autre variable ou d'une fonction. Dans tous les cas, la valeur initiale doit être du même type que la variable que nous venons de déclarer
Voici un exemple d'écriture :
Code :

int nMonEntier; // Déclare une variable appelée nMonEntier de type int (donc entier naturel)
float fMonReel; // Déclare une variable appelée fMonReel de type float (donc un réel)
int nExemple=1; // Déclare une variable appelée nExemple de type int et lui donne une valeur initiale de 1
string sMaChaine="Ma chaîne de test"; //Déclare une variable appelée sMaChaine de type string (une chaine de caractère) et lui donne une valeur initiale de "Ma chaîne de test".
float fMonSecondReel=2.0; // Déclare une variable appelée fMonSecondReel de type float et lui donne une valeur initiale de 2.0
int nA=0, nB=1, nC=2; // Déclare 3 variable nA, nB et nC de type int en leur donnant chacun les valeurs respectives 0, 1 et 2.

A noter que je n'utilise pas n'importe quel nom pour mes noms de variable. Non seulement je tiens à ce qu'ils soient explicites, mais en plus j'inclus dans leur forme un "prefixe". C'est une convention d'écriture entre programmeur. Presque tous les programmeurs du monde savent que s'ils rencontrent une variable dont le nom comporte un "s" minuscule en début de nom, il s'agit d'une chaine de caractère. Et c'est une notation qui est assez pratique. Dans NWN, les prefixe de noms de variable ont été suggéré pas la communauté des développeurs. Pour les 3 types que j'ai évoqué ici sont ceux que j'ai utilisé dans mon exemple. Je répète que c'est une convention, qui, si elle est respectée, facilite la relecture d'un script par un autre développeur. Cela n'est toutefois pas une obligation, mais je conseille vivement de prendre l'habitude de le faire. C'est cette même convention qui nous fait commencer les noms de variable par des minuscules mais suivi immédiatement d'une majuscule (ou plusieurs comme dans mon exemple, pour délimiter les mots qui compose mon nom de variable sachant que je ne peux pas utiliser d'espace). On peut utiliser des chiffres dans un nom de variable, mais jamais dans le premier caractère de ce nom (mais normalement, on oublie cette règle la plupart du temps parce qu'on utilise les préfixes et que ceux-ci font partie du nom et sont forcément en première position).
En revanche, l'usage de minuscule ou de majuscule dans un mot clé du langage (comme les types de variables) n'est pas une convention, c'est une obligation. Si vous écrivez "Int" ça n'est pas la même chose que "int" et le compilateur de script ne sera pas d'accord.

On notera aussi que la valeur d'une chaine de caractère se délimite par des guillemets. Je précise que dans mon exemple, la valeur "Ma chaîne de test" est une constante. La constante, par oposition à la variable est une valeur qui ne varie pas. Lorsque j'écris une constante dans le code d'un script, cette valeur est figée et définitive. A chaque fois que j'exécute le scripte la valeur de la constante sera la même. Dans mon exemple, la variable de type "chaine de caractère", sMaChaine, prend pour valeur la valeur de la constante "Ma chaîne de test". La Phrase qui précède est l'exacte traduction en français de string sMaChaine="Ma chaîne de test";.

On se rappellera que "=" est un symbole d'affectation de valeur que l'on traduit par "prend pour valeur".

Les constantes sont l'un des moyens les plus simples de définir la valeur d'une variable (qu'il s'agisse de sa valeur initiale ou de sa valeur dans le cours de l'exécution d'un script).

Une règle à ne jamais oublier (mais le compilateur est là pour nous la rappeler), une variable ne peut être "utilisée" qu'à partir du moment ou elle est définie.

Une autre règle importante est qu'une variable a toujours une valeur par défaut si on ne lui donne pas de valeur initiale. Ce qui signifie qu'une variable n'est jamais vraiment "vide". Dans mon exemple de déclaration, je ne donne pas de valeur initiale à nMonEntier. Cependant il en a quand même une par défaut et cette valeur est 0. Pour un float c'est 0.0 (attention à la notation avec le ".", je vais expliquer juste après) et pour un string c'est "" (deux guillements avec rien entre les deux. On appelle cette chaine de caractère particulière la "chaine vide").

On aura remarqué que lorsque l'on fixe la valeur initiale d'une variable réelle, la constante utilisée comporte un point, même si la valeur que nous lui donnons ne comporte pas de chiffre significatif après la virgule, ce dernier apparaît (le point représentant la virgule d'une constante numérique dans les langages de programmation). C'est volontaire. Si nous ne faisions pas cela, le compilateur penserait que la valeur constante que nous lui donnons n'est pas un réel mais un entier.
Essayer de compiler ça :
Code :

void main()
{
  int nA = 2.0;
}

puis ça
Code :

void main()
{
  float fA = 2;
}

Dans les deux cas le compilateur va hurler. Il va vous dire que la valeur constante que vous voulez affecter à votre variable n'est pas du bon type. Le compilateur reconnaitra toujours 2.0 comme une constante de type float et 2 comme une constante de type int. La suite de l'histoire est connue, c'est celle de la sphère de 30cm que nous tentons de ranger dans le tiroir de 20cm. Ca rentre pas ! Des petit malins me diront que ce n'est pas normal que 2 ne rentre pas dans un float puisque en mathématique l'ensemble des entiers relatifs est inclu dans l'ensemble des réels. Mais hélas, nous ne faisons pas des mathématiques, mais de l'informatique et la manière dont la mémoire d'un ordinateur et les langages de programmation stockent l'information ne fonctionne que sur le terrain de la stricte égalité des formats. C'est ainsi. Il existe en revanche des manières détournées de faire entrer notre sphère dans notre tiroir. C'est ce qu'on appelle le trans-typage en informatique. C'est à dire une règle qui permet de transformer une information d'un type en un autre. Dans certains langages le transtypage est réalisé à l'aide d'un opérateur (que je ne décrirais pas ici car c'est hors du cadre de ce sujet). En NWNScript, faire du transtypage nécessite d'utiliser des fonctions fournies par le langage. Pour reprendre notre cas de figure ci-dessus, voici comment nous pourrions procéder.
Code :

void main()
{
  int nA = FloatToInt(2.0);
  float fA = IntToFloat(2);
}

Ce morceau de code est d'une débilité profonde. En effet, j'utilise des constantes pour initialiser mes variables. Il me suffirait d'utiliser une constante du type adéquat pour que cela fonctionne. Une écriture équivalente est donc :
Code :

void main()
{
  int nA = 2;
  float fA = 2.0;
}

Mais je voulais montrer l'usage d'une fonction et l'intérêt de fonction de transtypage comme FloatToInt et IntToFloat qui accomplissent donc, respectivement, la conversion d'un float en int et la conversion d'un int en float.

J'ai encore long à dire sur les variables et peut de temps pour en parler. Je vais donc laisser le sujet en suspens et voir si certains sont intéressé pour que je continue. Déjà ce premier bout devrait éclairer un peu ta lanterne, Albator Smile

(à suivre ou fin, selon les besoins)
_________________
Lendraste de Loreval
Qui cherche la Vérité cherche celui qui la détient, car elle n'existe pas à l'état naturel.
La cité des mensonges - 1
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger Numéro ICQ Ignorer l'utilisateur
 
WillGMN
Acolyte
Inscrit le: 24 Oct 2002
Messages: 34
Localisation: manche
Répondre en citant
Posté le : 08/08/2003 17:07:33 Sujet du message :

merci bien , ca me la éclairé ma lanterne .
par contre : comment le transtypage FloatToInt fonctionne ( 2.3 différent 2 ou de 3 )
ce n'est qu'une question rétorique bien sure .
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé Adresse AIM Ignorer l'utilisateur
 
Albator003
Invité


Répondre en citant
Posté le : 08/08/2003 19:44:39 Sujet du message :

bah la c'est deja plus clair j'ai bien suivi le cour et bien compris
la leçon je vais tout de site me mettre a faire u tutorial ou
tester de faire des scripts de ce genre
 
Revenir en haut
 
Albator003
Invité


Répondre en citant
Posté le : 08/08/2003 21:17:39 Sujet du message :

si j'ai bien comrpis la chose on peux par exemple ecrire ton script comme ca aussi
Code :
// Ce script s'appelle "cloche"
void main()
{
  int nHour=GetLocalInt(OBJECT_SELF, "HOUR");
  int nCount = 1;//terme changer
  if (nHour==0)
  {
    nHour=24;
  }
  if (nHour>12)
  {
    nHour=nHour-12;
  }
  while (nCount++ <= nHour)//terme changer 
  {
    DelayCommand(IntToFloat(nCount-1)*2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2")));
  }
  nHour++;
  if (nHour>24)
  {
    nHour=1;
  }
  SetLocalInt(OBJECT_SELF, "HOUR", nHour);
  DelayCommand(HoursToSeconds(1),ExecuteScript("cloche", OBJECT_SELF));
}


ou encore

Code :
void main()
{
  int nHour=GetLocalInt(OBJECT_SELF, "HOUR");
  int nCount = 1;//terme changer
  if (nHour==0)
  {
    nHour=24;
  }
  if (nHour>12)
  {
    nHour=nHour-12;
  }
  do //ajout de do
  {
    DelayCommand(IntToFloat(nCount-1)*2.0,AssignCommand(OBJECT_SELF, PlaySound("as_cv_bell2")));
  }
while (nCount++ <= nHour)//terme changer 
  nHour++;
  if (nHour>24)
  {
    nHour=1;
  }
  SetLocalInt(OBJECT_SELF, "HOUR", nHour);
  DelayCommand(HoursToSeconds(1),ExecuteScript("cloche", OBJECT_SELF));
}


bon ca ne sert a rien de faire ca mais c'est juste pour voir si ca marche aussi... camefaistavaillr un peu certaine fonction que je n'est jamais utilisé dis moi ce que tu pense de ca
 
Revenir en haut
 
lendraste
Grand Maître Chanteur du Conseil
Inscrit le: 20 Fév 2003
Messages: 1403
Localisation: Quelque part ailleurs
Répondre en citant
Posté le : 11/08/2003 09:51:11 Sujet du message :

A vrai dire, je suis en mal de répondre à ton exercice. J'ignore si l'opérateur "++" fonctionne dans NWNScript exactement comme en C ou en Java et je n'ai jamais eu l'occasion de faire le test. Je dirais que, par principe, et parce qu'elle est trop sujete à erreur, je n'utilise jamais la notation que tu as utilisé. Autrement dit je ne mélange pas les incréments et les comparaison sur la même ligne. Si l'opérateur "++" se comporte comme en C ou en Java, voici la réponse que je te ferai.

Le premier des deux scripts va fonctionner. Le second devrait fonctionner aussi mais te donnera un coup de cloche en trop. Je t'explique pourquoi.

Dans ton premier cas de figure, tu initialise nCount à 1. Lorsque tu déclares la boucle qui va sonner les coups, tu utilises cette expression "(nCount++ <= nHour)". C'est un cas typique de fénéantise d'informaticien (maladie fréquente dans le milieu Smile ) qui est hélas porteur d'une erreur très classique d'ignorance du fonctionnement d'un opérateur comme "++".

Oula, voilà que je cause gras Mr. Green . Reprenons plus lentement. "++" est un opérateurs arithmétique particulier et "<=" est un opérateur de comparaison. "++" a pour effet d'incrémenter de 1 la valeur de la variable qui le précède. Mais "++" n'est réalisé qu'après l'évaluation de l'expression dont il fait partie. Cela signifie que "++" ne sera exécuté qu'après avoir comparé la valeur courante de nCoup. Ca nous arrange dans le premier script. nCoup est égal à 1 lors du premier passage. On le compare à nHour, puis on l'incrémente. Dans le second script, on fait exactement la même chose, mais à la fin de la boucle. Si on a qu'un seul coup à donner (nHour=1), on va passer une première fois dans la boucle (puisqu'il n'y a pas de condition d'entrée) et arrivé au test on va se rendre compte que nCoup<=nHour puisqu'il est toujours égal à 1 à ce stade, donc on va relancer la boucle une autre fois après avoir incrémenté nCoup.

J'insiste ! Cela fonctionne ainsi dans le langage C ou le langage Java. Je n'ai pas fait le test en NWNScript. Pour éviter d'avoir à le faire, je peux toujours écrire la boucle ainsi :
Code :

  do
  {
    //..instructions de la boucle
    nCount++;
  } while (nCount <= nHour)

De cette façon, nCount sera bien incrémenté à coup sûr avant le test.

De la même façon, en C ou en Java, l'opérateur "++" (ou "--") peut être placé "avant" la variable. Il a exactement le même effet, à l'exception du fait qu'il est appliqué "avant" l'évaluation de l'expression dont il fait partie. En C ou en Java on pourrait donc écrire le second script de la façon suivante :
Code :

  do
  {
    //..instructions de la boucle
  } while (++nCount <= nHour)

Mais je le répète, je ne sais pas si l'opérateur "++" (ou "--") de NWNScript autorise cette interprétation. C'est à tester, si tu en as le courage Smile . Déjà, il est facile de s'assurer de la possibilité d'utiliser "++" ou "--" "devant" la variable à incrémenter en essayant de compiler un script utilisant cette notation. Si ça ne marche pas, l'affaire est reglée. Si on peut compiler le script, le test suivant devrait nous permettre d'y voir plus clair (sauver le script sous le nom "testoperateur") :
Code :

void main()
{
  int nA=0;
  object oPC=GetFirstPC();
  SendMessageToPC(oPC, IntToString(++nA));
  SendMessageToPC(oPC, IntToString(nA));
  SendMessageToPC(oPC, IntToString(nA++));
  SendMessageToPC(oPC, IntToString(nA));
}


On peut exécuter ce script en se connectant en solo (joueur) sur le module et en tapant dans la zone de saisie
Code :

##DebugMode 1

puis
Code :

##dm_runscript testoperateur

Normalement, si l'opérateur fonctionne comme en C ou en Java, le résultat est une suite de 4 messages s'affichant comme suit :
Code :

1
1
1
2


A tester, tout ça Smile
_________________
Lendraste de Loreval
Qui cherche la Vérité cherche celui qui la détient, car elle n'existe pas à l'état naturel.
La cité des mensonges - 1
 
Revenir en haut Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger Numéro ICQ 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 58.818ms