Jour/Nuit (suite a un post d'Azrael)

Répondre
Partager Rechercher
Citation :
CELA DIT, pour ton exemple, j'utiliserais plutôt les évenements récursifs, comme dans la plupart des cas, je trouve ca vraiment plus propre qu'un OnHeartBeat (j'ai entre autre crée l'évenement "OnHourPassed", ou encore "OnDay" et "OnNight" dans mon module, par utilisation de fonction récursives
Je profite de cette remarque pour poser cette question :
Comment detecter le passage du jour a la nuit ? (je ne parle pas de savoir si c'est le jour ou la nuit mais bien de detecter l'instant t)

Autre point, quelle heure est-il lorsqu'on lance un module ? Il y a une constante ? *a jamais fait attention*
Re: Jour/Nuit (suite a un post d'Azrael)
Citation :
Provient du message de Iridian
Je profite de cette remarque pour poser cette question :
Comment detecter le passage du jour a la nuit ? (je ne parle pas de savoir si c'est le jour ou la nuit mais bien de detecter l'instant t)

Autre point, quelle heure est-il lorsqu'on lance un module ? Il y a une constante ? *a jamais fait attention*
Normalement tout ce gère dans les propriétés du module, tu peux régler toi même l'instant (t) et l'heure qu'il est quand tu lance le module, après suivant que tu gère ça dans ta persistance ou pas tu va voir dans les logs ou c'est toujours la même heure de départ et le même jour.

Jaha Effect
OnModuleLoad :

Code PHP:

int nDayHour 6;
int nNightHour 18;

void OnDay();
void OnNight();

void main()
{
    
//code

    
int nTimeHour GetTimeHour();
    if(
GetIsDay()) DelayCommand(IntToFloat(nNightHour GetTimeHour()), OnNight());
    else 
DelayCommand(IntToFloat(24 nDayHour GetTimeHour()) * 3600.0fOnDay());
}

void OnDay()
{
    
//code

    
DelayCommand(IntToFloat(nNightHour nDayHour) * 3600.0fOnNight());
}

void OnNight()
{
    
//code

    
DelayCommand(IntToFloat(24 nDayHour nNightHour) * 3600.0fOnDay());

Les fDayHour et fNightHour sont les valeurs dans les propriétés avancées du module heure de l'aube et heure du crépuscule

EDIT : quelques chtites correction pour que le script passe au moins la compilation ^_^'
REDIT : encore quelques trucs de corrigés, pour faire plaisir a Jedai ^_^
Code PHP:

void OnDay()
{
    
//code
    
DelayCommand(fNightHour fDayHourOnNight);
}

void OnNight()
{
    
//code
    
DelayCommand(fDayHour fNightHourOnDay);

J'imagine que tu les mets dans un include général, me trompe-je ?
Bien la question se pose elle ? ^_^

j'ai un fichier include que j'ai fait spécialement pour les evenements supplémentaires (j'en ai quelques autres)
Citation :
Provient du message de Azrael07
bon j'ai édité le code si dessus, il était affreusement buggé (j'aurais du modifer discret, personne ne l'avais vu ^^)
En effet je n'ai pas fait gaffe, faut dire aussi que mon patron ne veux toujours pas que j'installe NWN au taf ...
Wink
remarque t'aurais pu tout aussi bien faire une seule conversion :
Code PHP:

float fTimeHour IntToFloat(GetTimeHour()); 

plutôt que 2...
Bon j'arrête de te titiller, parceque sérieusement j'ai encore pas mal de choses à apprendre avant de donner des leçons

HP : J'ai vu que tu cherchais un modeleur pour ton module ?
Je vais justement m'y mettre, j'ai déjà pas mal de pratique sur 3DS max 4 et je viens de faire l'acquisition de la version 5.
Est-ce que vous avez un truc à faire pour commencer, histoire que je me fasse les dents sur un truc utile ...(j'aime pas bosser pour rien)
vi c'est vrai, mais en fait, la seule raison vient du fait que je préfère manipuler des int que des float, puis les constantes sont plus jolies en int ^_^
De toutes facon, pas grande différence en vitesse d'execution, passer une int en float prend vraiment rien du tout comme ressource.
Peut-être, mais je suis pas sûr que des heures d'une seconde ça soit bien long....
Et je me demande aussi comment DelayCommand() réagit quand on lui demande de remonter dans le temps

Moi aussi j'avais fait un code comme ça pour des loups garous...

J'espère que tu vas nous donner une version corrigée.
Mais euh......................

Jedaï il arrete pas de m'embeter

Toujours a trouver le petit détail qui va pas celui la ^_^

bon voila c'est REcorrigé
Heuu, question bête, mais.. le temps d'un DelayCommand est vraiment le même que les heures du jeu ? Je crois pas hein...
A moins de se régler en 60min/h dans les propriétés du module, le DelayCommand est, sauf erreur, en temps réel et les nuits/jours sont en temps "horloge du jeu" (où les heures ne sont pas des heures..).
Ca marche ce script ? Je testerais bien mais j'ai pas le jeu sous la main.
Oui, voilà, à la place du * 3600.0 il faudrait un HoursToSeconds()..
Je vais le refaire avec un ExecuteScript pour passer l'événement en paramètre, et une version qui fait un SignalEvent. On peut aussi éviter d'avoir à écrire en dur dans le code les variables d'aube et de crépuscule, il suffit de les chercher par un test horaire. Si ça intéresse quelqu'un ou si j'y repense, je posterai ça ici.
Hop, donc.
A mettre dans un daytime_inc à inclure dans les scripts concernés.

Pour l'utiliser, il y a deux types de fonctions.
  • onDawn et onDusk peuvent se mettre dans un onModuleLoad, dans le onSpawn d'une créature, etc. Ils feront exécuter à la cible le script précisé, à chaque aube (dawn) ou crépuscule (dusk).
    Exemple : onDusk("backhome", oPNJ) fera exécuter "backhome.nss" à oPNJ chaque soir.
  • InitializeDawnEvent et InitializeDuskEvent peuvent se placer aussi dans un onModuleLoad, dans le onSpawn d'une créature, etc. Ils activeront l'UserDefined Event correspondant, à chaque aube ou crépuscule. Le "event number" qui correspond est défini au début de la lib, par EVENT_DAWN et EVENT_DUSK, et il peut être récupéré dans le onUserDefined par un GetUserDefinedEventNumber() classique.

Je vais le tester dans les jours qui viennent, s'il y a des corrections à apporter je préviendrai.

Code PHP:

//::///////////////////////////////////////////////
//:: Dawn and Dusk events and script scheduler
//:: daytime_inc
//:: (Feel free to use or modify)
//:://////////////////////////////////////////////
/*
    Calls a script or signals an event
    when dawn or dusk
*/
//:://////////////////////////////////////////////
//:: Created By: Gad, for Faltazia
//:: Created On: Sep 9, 2003
//:://////////////////////////////////////////////



// DECLARATIONS

int EVENT_DAWN 100;
int EVENT_DUSK 101;

// Make oTarget run sScript on each dawn
void onDawn(string sScriptobject oTarget OBJECT_SELF);

// Make oTarget run sScript on each dusk
void onDusk(string sScriptobject oTarget OBJECT_SELF);

// Signal UserDefined Event EVENT_DAWN on each dawn for oTarget
void InitializeDawnEvent(object oTarget OBJECT_SELF);

// Signal UserDefined Event EVENT_DUSK on each dusk for oTarget
void InitializeDuskEvent(object oTarget OBJECT_SELF);



// FUNCTIONS

int DAYTIME_DAWN 0;
int DAYTIME_DUSK 1;

void RunDailyScript(string sScriptobject oTarget)
{
  
ExecuteScript(sScriptoTarget);
  
DelayCommand(HoursToSeconds(24) - HoursToSeconds(GetTimeMinute()) / 60RunDailyScript(sScriptoTarget));
}

void SignalDailyEvent(object oTargetint iEvent)
{
  
SignalEvent(oTargetEventUserDefined(iEvent));
  
DelayCommand(HoursToSeconds(24) - HoursToSeconds(GetTimeMinute()) / 60SignalDailyEvent(oTargetiEvent));
}

void WaitForDawnOrDusk(object oTargetint DayTimestring sScript)
{
  if (
GetIsDawn())
    
SetLocalInt(GetModule(), "DawnHour"GetTimeHour());
  if (
GetIsDusk())
    
SetLocalInt(GetModule(), "DuskHour"GetTimeHour());
  if (((
DayTime == DAYTIME_DAWN) && (GetIsDawn())) || ((DayTime == DAYTIME_DUSK) && (GetIsDusk())))
    if (
sScript != "")
      
RunDailyScript(sScriptoTarget);
    else
      
SignalDailyEvent(oTargetEVENT_DAWN * (DayTime == DAYTIME_DAWN) + EVENT_DUSK * (DayTime == DAYTIME_DUSK));
  else
    
DelayCommand(HoursToSeconds(1), WaitForDawnOrDusk(oTargetDayTimesScript));
}

void onDawnOrDusk(object oTargetint DayTimestring sScript "")
{
  if (!
GetLocalInt(GetModule(), "DawnAndDusk initialized"))
  {
    
SetLocalInt(GetModule(), "DawnHour", -1);
    
SetLocalInt(GetModule(), "DuskHour", -1);
    
SetLocalInt(GetModule(), "DawnAndDusk initialized"TRUE);
  }
  
int iEventHour;
  if (
DayTime == DAYTIME_DAWN)
    
iEventHour GetLocalInt(GetModule(), "DawnHour");
  else
    
iEventHour GetLocalInt(GetModule(), "DuskHour");
  if (
iEventHour != -1)
  {
    
int CurrentHour GetTimeHour();
    if (
iEventHour CurrentHour)
      
iEventHour += 24;
    if (
sScript != "")
      
DelayCommand(HoursToSeconds(iEventHour CurrentHour), RunDailyScript(sScriptoTarget));
    else
      
DelayCommand(HoursToSeconds(iEventHour CurrentHour), SignalDailyEvent(oTargetDayTime));
  }
  else
    
DelayCommand(HoursToSeconds(60 GetTimeMinute()) / 60WaitForDawnOrDusk(oTargetDayTimesScript));
}

void onDawn(string sScriptobject oTarget OBJECT_SELF)
{
  
onDawnOrDusk(oTargetDAYTIME_DAWNsScript);
}

void onDusk(string sScriptobject oTarget OBJECT_SELF)
{
  
onDawnOrDusk(oTargetDAYTIME_DUSKsScript);
}

void InitializeDawnEvent(object oTarget OBJECT_SELF)
{
  
onDawnOrDusk(oTargetDAYTIME_DAWN);
}

void InitializeDuskEvent(object oTarget OBJECT_SELF)
{
  
onDawnOrDusk(oTargetDAYTIME_DUSK);

__________________

Serveur francophone Faltazia,
serveur 100% roleplay.
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés