Archives des forums MMO/MMORPG > Neverwinter Nights > NWN - Maskado > la base temporelle....
la base temporelle....
Par Prophetia Astrae le 12/2/2003 à 13:19:18 (#3221584)
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)
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)
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)
Par Reyan le 12/2/2003 à 14:54:43 (#3222475)
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)
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)
le boucle nss, c'est un bibliothèque ?
Par Jaha Effect le 12/2/2003 à 15:26:35 (#3222700)
DelayCommand(nsecondes, ExecuteScript "nom du script");
Jaha Effect :D
Par Jedaï le 12/2/2003 à 15:43:39 (#3222847)
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)
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)
Par Prophetia Astrae le 15/2/2003 à 2:30:45 (#3242335)
Merci à tous
Prophetia
Par Prophetia Astrae le 15/2/2003 à 11:44:47 (#3243244)
les correction sont en rouge if(GetLocalInt( oPC, "bRecent_Rested")){
Ici, il manque un ";" apres le return.
DeleteLocalInt(oPC, "bRecent_Rested");
return;
}
La ligne suivanteint nF = GetLocalInt( oPC, "nFatigue" );
Il manque le type à la déclaration de la variable
A la fin du script, dans le Default du Switchdefault :
La fonction est SendMessageToAllDMs() au lieu de SendToAllDMs()
{
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 ) );
}
Voila, je vais tester ça maintenant ;)
Prophetia
Par Prophetia Astrae le 15/2/2003 à 12:19:21 (#3243391)
Testé et Approuvé
Merci de tout coeur pour ton travail Jedaï :merci:
Prophetia
Par Jedaï le 15/2/2003 à 20:43:23 (#3245503)
Ton approbation me fait chaud au coeur. :cool:
Je mets ce script en persistant, avec quelques commentaires ! :)
JOL Archives 1.0.1
@ JOL / JeuxOnLine