Bienvenue sur JeuxOnLine - MMO, MMORPG et MOBA !
Les sites de JeuxOnLine...
 

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

la base temporelle....

Par Prophetia Astrae le 12/2/2003 à 13:19:18 (#3221584)

Bonjours,

Je me demandais si il etait possible de changer la base de temps pour un module, car je trouve que par défaut, le temps passe un peu trop vite, et ce qui fait que lorsqu'on commence à faire un petit rp, ça a tendance à durer des semaines....

Rien que dire bonjours à trois quatre personne ça vous prend déjà des heures... donc j'aimerais pouvoir changer celle ci pour ne plus me retrouver dans le cas ou je dis bonjour à quelqu'un et que le temps de tapper la phrase il fait déjà nuit..... (image un peu exagérée)

Sinon une deuxieme petite chose qui me tient à coeur, ça serrait de pouvoir obliger les joueur à se reposer au bout d'un certain temps, pas obligatoirement la mettre en repos forcé, mais par exemple commencer à diminuer ses capacités physiques pour simuller de la fatigue. Car encore une fois, c'est simpa le rp, mais quand on papotte 2 semaine d'affilé sans ce reposer ou qu'on court dans tout les sens, ben je trouve pas ça tres rp, on a peut etre besoin d'un peu de repos quand meme.....


Merci d'avance

Prophetia

Par Jedaï le 12/2/2003 à 13:47:07 (#3221864)

1) Oui on peut changer la base temporelle dans les propriétés du module (si je me souviens bien :p ).


2) à l'entrée du joueur dans le module tu lance un script récursif qui lui donne des effect curse toutes les 24h : si tu les mets en permanents, ils disparaîtront quand il se reposera. Si tu veux moins aléatoire ("ça fait 2h que je me suis reposé pourquoi je suis déjà maudit ?"), tu gère la réinitialisation du script sur le OnRest avec des local int sur le PJ. :)

Au fait ma proposition d'aide pour Ambre t'intéresse-t-elle ??:chut:

Par Azrael07 le 12/2/2003 à 13:49:03 (#3221887)

tu peux trouver ton bonheur dans les propriétés du module

Pour la seconde question, et ben incrémentation de variables dans le OnHeartBeat, puis baisse de carac si ta valeur dépasse ce le temp maximum sans sommeil. Je vois que ca comme ca.

Par mobidique le 12/2/2003 à 14:32:29 (#3222280)

Dans le cadre de modules dits "One shot", je suis arrivé à la conclusion qu'une solution nous rapprochant au plus prés de la situation de la partie du jeu de rôle était simplement d'opter pour du temps réel, une heure dans le jeu égal une heure IRL. Aprés, au concepteur du module à gérer les délais. Exemple : les perso passent l'après midi à une foire dans le village et lorsque que chacun a fini ses emplettes, en accord avec le DM ils rentrent dans l'auberge. Le DM peut alors faire avancer le temps jusqu'à 18 heure. Là, ils peuvent discuter de choses et d'autres, puis, toujours en accord avec le DM, ce dernier lance l'aventure en actionnant un levier par exemple qui entraine l'entrée théâtrale scriptée d'un PJ, et la mise à minuit de l'horloge (cf. trashcity2). Les PJ sortent de l'auberge (comme l'heure a été fixée à minuit, il fait bien nuit). Renseignés les PJ prennent la direction du sud. A l'occasion d'un changement de zone, en fait de l'entrée dans une zone, ou passage sur un trigger, le DM/concepteur peut faire avancer le temps de la durée qu'il désire de manière et l'agrémenter d'un texte rapide et explicatif du temps de parcours et d'une description sommaire des paysage traversée. Exactement comme lors d'une partie de JDR, le DM dit "Vous voyagez à travers des plaines et finalement vous arrivez dans la forêt noire ... brrr ... :doute: ". Me serais-je ENCORE laissé allé ? :doute:

Par Reyan le 12/2/2003 à 14:54:43 (#3222475)

tiens, c'est marrant, l'histoire sur la fatigue ca me rappel ce que j'ai lu hier sur le site d'un autre module ^_^ une histoire avec un post-3eme age :D
bref, je vois pas comment tu pourrais modifier le temps, sauf p-e dans les propriétés du module, je ne sais pas à quoi correspond "minute/heure" ds "avancé", sinon j'imagine qu'à coup de hakpak :o ...

par contre, pour l'autre, j'ai peut être un idée,

dans le onheartbeat du module


void main()
{
int nTps = GetLocalInt(GetModule(), "TPS");
int nLastHour = GetLocalInt(GetModule(), "LAST_HOUR");
int nHour = GetTimeHour();
int i = nHour;
i -= nLastHour;
if( i > 1)
{
nTps--;
SetLocalInt(GetModule(), "TPS", nTps);
SetLocalInt(GetModule(), "LAST_HOUR", nHour);
}
}
//si ca fait ce que j'espère, ca met +1à TPS toutes les heures


avec ds le onClientEnter

un

void main()
{
object oPc = GetEnteringObject();
int nTps = GetLocalInt(GetModule(), "TPS");
SetLocalInt(oPc, "TPS_ENTRE", nTps);
ExecuteScript("fatigue", oPc);
//le perso entre, on stocke son heure d'entrée et on commence le script fatigue
}



et le script fatigue (c'est qu'une idée, pas essayé et tout juste, mais là perso g pas de tps :D )

void main()
{

//alors, je me demande, le script est attaché au PJ,
//donc pour qu'une boucle se finisse quand il quitte le module,
//ba il suffit de faire une boucle infini ... mais en même tps c p-e pas bien du tt :D
while(1>0) //oui c'est un truc idiot :/
{
if(GetIsResting() == TRUE)
{
int nRepos = GetLocalInt(OBJECT_SELF, "REPOS");

if(nRepos == 1)
{//si il a besoin de repos
//enlever les dégats du a la fatigue, puisqu'il se repose :)
SetLocalInt(OBJECT_SELF, "REPOS", 2);
//il est reposé, il n'y aura plus besoin de lui enlever les dégats, faudrait voir à mettre ca à la fin du repos ...
}
else
{
int nTps = GetLocalInt(GetModule(), "TPS");
SetLocalInt(OBJECT_SELF, "TPS_EVEILLE", 0);
//tant qu'il dort, on stocke "l'heure" qu'il est
}
}
else
{
int nEtat = GetLocalInt(OBJECT_SELF, "TPS_EVEILLE");
//on recupere l'heure de son dernier repos
int nHour = GetLocalInt(GetModule(), "TPS");
//heure actuel
int nTps = nHour;
nTps -= nEtat;
//heure actuel - heure du dernier repos

//normalement grace à mon truc qui stocke +1 toutes le heures, j'ai plus de pb négatif/positifs etc.
if (nTps >12 )
{
//ba, met ce que tu veux faire sur le PJ si il est fatigué ...
//réduction de carac ...
//tu peu même mettre de plus grosse restriction si il continu a rester debout ...
}
}
}
}


bon, ca compile, mais je suis pas sure que ca marche :)
mais alors pas sure du tout :rolleyes:
*croise les doigts, serres les fesses, touche du bois, allume un cierge, trouve une main derniere pour refaire son lacet*

edit : MDR, le tps que je fasse mumuse tlm il a répondu :maboule:

Par eMRaistlin le 12/2/2003 à 15:01:05 (#3222520)

euh... Evite les boucles infinies...


Meme si NwN les gere pas mal en faisant un message d'erreur, il est possible que tu plante carrement...

Pas bien, les boucles infinies, pas bien...

Essaye plutot les boucles recurrentes (
boucle.nss :
void main(){DelayCommand(60.0,ExecuteScript("Boucle",OBJECT_SELF));}
)

Par Reyan le 12/2/2003 à 15:07:05 (#3222557)

c quoi une boucle récurente ?(enfin, comment ?)
le boucle nss, c'est un bibliothèque ?

Par Jaha Effect le 12/2/2003 à 15:26:35 (#3222700)

Va voir ma statue tout feu tout flamme , il y a un bel exemple boucle récurrente. en faite tu dis au scripte de se rappeler lui même toute les nsecondes grâce a un

DelayCommand(nsecondes, ExecuteScript "nom du script");


Jaha Effect :D

Par Jedaï le 12/2/2003 à 15:43:39 (#3222847)

[Edit] Houlà mais c'est qu'elle m'a pris du temps cette réponse, j'en étais encore au post de Mobi... :D

Ben c'est une excellente solution mais

Dans le cadre de modules dits "One shot"
.

Donc je parlais d'un script récursif, j'explicite donc :

sur le OnClientEnter :

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

DelayCommand( HoursToSeconds(12), ExecuteScript( "mod_fatigue", oPC ) );

//du code...

}


Sur le OnRest :

void main()
{
object oPC = GetLastPCRested();
int nTypeRest = GetLastRestEventType();

int nRR = GetLocalInt( oPC, "bRecent_Rested" );

if( (! nRR) && nTypeRest == REST_EVENTTYPE_REST_STARTED )
{
DelayCommand( HoursToSeconds(12), ExecuteScript( "mod_fatigue", oPC ) );
SetLocalInt( oPC, "bRecent_Rested", TRUE );
DeleteLocalInt( oPC, "nFatigue");
}
else if( nTypeRest == REST_EVENTTYPE_REST_STARTED )
{
SendMessageToPC( oPC, "Vous n'êtes pas vraiment fatigué en réalité et " +
"cette petite sieste ne vous reposera pas vraiment.");
}

//du code...

}


Et le script "mod_fatigue" :

//script "mod_fatigue"

void main()
{
object oPC = OBJECT_SELF;

if( GetLocalInt( oPC, "bRecent_Rested" ) )
{
DeleteLocalInt( oPC, "bRecent_Rested" );
return;
}

int nF = GetLocalInt( oPC, "nFatigue" );
nF++;
SetLocalInt( oPC, "nFatigue", nF);
effect eFatigue;

switch( nF )
{
case 1 :
{
SendMessageToPC( oPC, "Après douze heures passées sans vous reposez, "+
"vous commencez à sentir la fatigue peser sur vos épaule, "+
"mais cela reste très supportable..." );
DelayCommand( HoursToSeconds(12), ExecuteScript( "mod_fatigue", oPC ) );
break;
}
case 2 :
{
SendMessageToPC( oPC, "Vous venez de passer 24h sans dormir, les premières "+
"atteintes de la fatigue viennent entamer vos forces, "+
"reposez-vous vite !" );
eFatigue = ExtraordinaryEffect( EffectAbilityDecrease( ABILITY_STRENGTH, 2 ) );
ApplyEffectToObject( DURATION_TYPE_PERMANENT, eFatigue, oPC );
DelayCommand( HoursToSeconds(6), ExecuteScript( "mod_fatigue", oPC ) );
break;
}
case 3 :
{
SendMessageToPC( oPC, "Vous êtes en train de passer une nuit blanche !"+
"Dans votre état vous ne feriez même pas peur à un lapin"+
"aveugle, qu'espérez vous donc faire ? Reposez vous "+
"immédiatemment, à moins que vous ne teniez à tomber sur"+
"place !" );
eFatigue = ExtraordinaryEffect( EffectCurse( 3 ) );
ApplyEffectToObject( DURATION_TYPE_PERMANENT, eFatigue, oPC );
DelayCommand( HoursToSeconds(6), ExecuteScript( "mod_fatigue", oPC ) );
break;
}
case 4 :
{
SendMessageToPC( oPC, "La fatigue vous ronge, vos paupière sont de plomb... "+
"Vous titubez sans but, une poussée et vous tombez ! "+
"Dans peu de temps vous ne pourrez plus soutenir les "+
"assauts du sommeil et sombrerez dans l'inconscience..."+
"Dormez tant que vous pouvez encore en décider consciemment..." );
eFatigue = ExtraordinaryEffect( EffectCurse( 6 ) );
ApplyEffectToObject( DURATION_TYPE_PERMANENT, eFatigue, oPC );
DelayCommand( HoursToSeconds(3), ExecuteScript( "mod_fatigue", oPC ) );
break;
}
case 5 :
{
SendMessageToPC( oPC, "Zombifié par la fatigue, vous vous effondrez et "+
"rejoignez enfin les limbes accueillant du sommeil..." );
eFatigue = ExtraordinaryEffect( EffectSleep() );
ClearAllActions();
ActionRest();
ActionDoCommand( ApplyEffectToObject( DURATION_TYPE_TEMPORARY, eFatigue, oPC, 240.0 ) );
DelayCommand( HoursToSeconds(3), ExecuteScript( "mod_fatigue", oPC ) );
DelayCommand( 0.2, SetCommandable( FALSE, oPC ) );
DelayCommand( 250.0, SetCommandable( TRUE, oPC ) );
break;
}
default :
{
SendMessageToAllDMs("Problème avec le système de fatigue, joueur " + GetName( oPC ) +
". nFatigue vaut : " + IntToString( nF ) + ". Réinitialisation de "+
"la fatigue de ce joueur !" );
DeleteLocalInt( oPC, "nFatigue" );
DelayCommand( HoursToSeconds(12), ExecuteScript( "mod_fatigue", oPC ) );
}
}
}


Voilà, ce script est hautement modulable et j'espère que tu appréciera. :)

[Edit] petite erreur corrigée, alors, qu'est que vous pensez de ce script, marche-t-il ? (Mon ventilateur est mort et mon CPU a failli suivre le même chemin donc je peux pas tester...:D ).
[Edit] Rajout d'un "default" en cas de bug (normalement ça devrait pas, mais on sait jamais...).
[Edit] Encore une correction d'erreur (grave celle-là)
[Edit] Suite et fin des corrections suite au message de Prophetia

Par Jedaï le 14/2/2003 à 18:59:31 (#3239589)

Bon je up ce sujet, en espérant obtenir une réaction sur le script, un retour quelconque, étant donné que j'envisage de le placer en persistant, j'aimerais le purger un peu de ses bugs (je rappelle que je ne peux pas tester, pour cause de CPU en instance de flambée).
Alors si une bonne âme, ou tant qu'à faire un intéressé, pouvait essayer ce script en le modulant selon son idée, je lui serai très reconnaissant !:amour:

Par Gadjio le 14/2/2003 à 19:37:48 (#3239837)

Pour la base temporelle, on peut expliciter le champ à régler si besoin. On paramètre les "minutes par heure" (min/h), donc le temps réel serait en mettant 60 dans la case, si on met 10, on a 24h ig 4h irl, si on met 120, on a 24h ig 48h irl, etc, etc.

Par Prophetia Astrae le 15/2/2003 à 2:30:45 (#3242335)

Jedaï, je recupere le script et je me le garde sous le coude, je t'avoue que là j'ai pas le temps de le tester, mais j'essais de faire ça demain et je te tiens au courant, si les tests sont concluant, ça part dirct sur Ambre :)

Merci à tous

Prophetia

Par Prophetia Astrae le 15/2/2003 à 11:44:47 (#3243244)

Quelque correction pour la compilation, des erreurs d'étourderie sur le script principal:
les correction sont en rouge

if(GetLocalInt( oPC, "bRecent_Rested")){
DeleteLocalInt(oPC, "bRecent_Rested");
return;
}
Ici, il manque un ";" apres le return.

La ligne suivante
int nF = GetLocalInt( oPC, "nFatigue" );
Il manque le type à la déclaration de la variable

A la fin du script, dans le Default du Switch
default :
{
SendMessageToAllDMs("Problème avec le système de fatigue, joueur " + GetName( oPC ) +
". nFatigue vaut : " + IntToString( nF ) + ". Réinitialisation de "+
"la fatigue de ce joueur !" );
DeleteLocalInt( oPC, "nFatigue" );
DelayCommand( HoursToSeconds(12), ExecuteScript( "mod_fatigue", oPC ) );
}
La fonction est SendMessageToAllDMs() au lieu de SendToAllDMs()

Voila, je vais tester ça maintenant ;)

Prophetia

Par Prophetia Astrae le 15/2/2003 à 12:19:21 (#3243391)

Appose la mention:

Testé et Approuvé


Merci de tout coeur pour ton travail Jedaï :merci:
Prophetia

Par Jedaï le 15/2/2003 à 20:43:23 (#3245503)

Et merci beaucoup pour tes corrections ! :merci:
Ton approbation me fait chaud au coeur. :cool:

Je mets ce script en persistant, avec quelques commentaires ! :)

JOL Archives 1.0.1
@ JOL / JeuxOnLine