JeuxOnLineForumsPlusConnectés : 319 (sites) | 767 (forums)Créer un compte
Neverwinter Nights 2
La Tour des Arcanes
Répondre
Partager Outils Rechercher
Arno4485
Duc / Duchesse
 

Temps ne se sauvegarde pas

Bonjour,

je refais un post car j'ai bien suivi le post de KorTex sur la persistance, et donc ses scripts, mais au reboot, je perds les informations et recommence donc à la date 0.

J'ai placé l'année de début du serveur à 0, mais impossible de garder la date.

Je pensais sinon, sauvegarder la date dans ma propre base de données, mais je crains de faire une surcharge si je place la save sur le OHB.


Qu'en pensez vous ?

merci
Lien direct vers le message - Vieux
Avatar de Lv4
Lv4
Duc / Duchesse
 
Avatar de Lv4
 
Personnellement je ne connais pas bien la bdd campaign de never. Je te conseillerais donc d'utiliser ta propre bdd.

Pour le heart beat, tu peux y aller. A l'époque ce qui faisait planter c'était souvent des boucles longues, sur des items, sur des persos. Une requête SQL toutes les heures in game ça devrait pas faire tomber ton serveur.
Lien direct vers le message - Vieux
Arno4485
Duc / Duchesse
 
nickel merci, il faut que j' arrive désormais à trouver la bonne ligne sql pour exporter les infos.

ça fait des lustres que je n'ai pas écrit une ligne en sql.

merci beaucoup
Lien direct vers le message - Vieux
Arno4485
Duc / Duchesse
 
bon .. vraiment du mal avec le langage SQl de nwn.

dans mon OnModuleLoad je mets ca, je n'ai pas réussi a trouver la syntaxe correcte donc la c'est un peu crade

(Cliquez le bouton ou survolez le contenu pour afficher ce spoiler.)
#include "nwnx_sql"
void main()
{

// OnModuleLoad
object oMod=GetModule();

string sYear = "select annees from dates where id='1'";
string sMonth = "select mois from dates where id='1'";
string sDay = "select jours from dates where id='1'";
string sHour = "select heures from dates where id='1'";
string sMinute = "select minutes from dates where id='1'";

SetCalendar(StringToInt(sYear), StringToInt(sMonth), StringToInt(sDay));

} [/CODE]et celui ci serait sur le OHB mais il coince.

[CODE]#include "nwnx_sql"
void main()
{

// Met a jour le nouveau temps
object oMod=GetModule();
SetCampaignInt("Dates","TIMEHOUR",GetTimeHour(),oMod);
SetCampaignInt("Dates","TIMEMINUTES",GetTimeMinute(),oMod);
SetCampaignInt("Dates","TIMEDAY",GetCalendarDay(),oMod);
SetCampaignInt("Dates","TIMEMONTH",GetCalendarMonth(),oMod);
SetCampaignInt("Dates","TIMEYEAR",GetCalendarYear(),oMod);

/*string query = "update annnes,mois,jours,heures,minutes from dates where id = '1' values(" +
"'" + IntToString(GetCalendarYear()) + "', " +
"'" + IntToString(GetCalendarMonth()) + "', " +
"'" + IntToString(GetCalendarDay()) + "', " +
"'" + IntToString(GetTimeHour()) + "', " +
"'" + IntToString(GetTimeMinute()) + "')";
SQLExecDirect(query);*/

string sSQL = "UPDATE dates SET annees= '"+ GetCalendarYear() +"', mois= '" + GetCalendarMonth() + "', jours= '"+ GetCalendarDay() +"',heures= '" + GetTimeHour() + "'minutes= '"+GetTimeMinute()+'" WHERE id='1';
SQLExecDirect(sSQL);
}

Ce serait possible de m'aiguiller un peu sur la syntaxe à adopter ?
j'ai étudié un peu le fonctionnement du nwnx_time mais ça reste fouilli.

Merci
Lien direct vers le message - Vieux
Avatar de Lv4
Lv4
Duc / Duchesse
 
Avatar de Lv4
 
Concernant le on module load, note que tu utilise des requêtes sans les exécuter, du coup :
StringToInt(sYear) donne StringToInt("select annees ...") ce qui n'est pas bon.
Par ailleurs, tu peux faire quelque chose comme ça pour récupérer plusieurs données en une seule requête :
Code PHP:
void main()
{
  
// annees = colonne 1, mois = colonne 2, jours = colonne 3
  
string query "select annees, mois, jours from dates where id='1'";

  
// Pas de gestion d'erreur, à toi de faire
  
SQLExecDirect(query);
  
SQLFetch();

  
// On utilise le paramètre nCol de SQLGetData, qui récupère la colonne numéro nCol.
  
int year StringToInt(SQLGetData(1));
  
int month StringToInt(SQLGetData(2));
  
int day StringToInt(SQLGetData(3));

A première vue l'update me paraît presque bon. Ton update a juste des problèmes de quote, le plus simple c'est d'ouvrir ton script sous un éditeur et de mettre la coloration syntaxique de C.
Tu verras tout de suite où est le problème, je te laisse regarder.

Edit : n'oublie pas de limiter ton on heart beat avec un test pour n'exécuter la requête que toutes les heures par exemple, comme dans le tuto que tu as suivi.
Lien direct vers le message - Vieux
Arno4485
Duc / Duchesse
 
Un souci persiste, car il me charge bien l'année, le mois, le jour, l'heure,
mais lorsqu'il fait l'UPDATE après la première heure,
il me remet la première fois l'année à 0, le mois à 6, le jour et les heures à 1


Dans les logs de mysql j'ai ça

Code:
* Executing: UPDATE dates SET annees= '0', mois= '6', jours= '1',heures= '1', minutes= '0' WHERE id=1
Dnas le OHB je me retrouve avec ça

(Cliquez le bouton ou survolez le contenu pour afficher ce spoiler.)
#include "nwnx_sql"
void main()
{
object oMod=GetModule();
int iCurrentHour = GetTimeHour();
int nCurrentMinute = GetTimeMinute();
int nCurrentSecond = GetTimeSecond();
int nCurrentMilli = GetTimeMillisecond();
SetTime(iCurrentHour, nCurrentMinute, nCurrentSecond, nCurrentMilli);

//Sauvegarde a chaque heure
if (GetLocalInt(oMod, "CheckHour") != GetTimeHour())
{
SetLocalInt(oMod, "CheckHour", GetTimeHour());


// Met a jour le nouveau temps

SetCampaignInt("Dates","TIMEHOUR",GetTimeHour(),oMod);
SetCampaignInt("Dates","TIMEMINUTES",GetTimeMinute(),oMod);
SetCampaignInt("Dates","TIMEDAY",GetCalendarDay(),oMod);
SetCampaignInt("Dates","TIMEMONTH",GetCalendarMonth(),oMod);
SetCampaignInt("Dates","TIMEYEAR",GetCalendarYear(),oMod);

string sSQL = "UPDATE dates SET annees= '"+ IntToString(GetCalendarYear()) +"', mois= '" + IntToString(GetCalendarMonth()) + "', jours= '"+ IntToString(GetCalendarDay()) +"',heures= '" + IntToString(GetTimeHour()) + "', minutes= '"+ IntToString(GetTimeMinute()) +"' WHERE id=1";
SQLExecDirect(sSQL);


}
}



et dans mon OnModuleLoad j'ai ça

(Cliquez le bouton ou survolez le contenu pour afficher ce spoiler.)
#include "nwnx_sql"
void main()
{

// OnModuleLoad
object oMod=GetModule();


// annees = colonne 1, mois = colonne 2, jours = colonne 3
string query = "select annees, mois, jours, heures, minutes from dates where id=1";

// Pas de gestion d'erreur, à toi de faire
SQLExecDirect(query);
SQLFetch();

// On utilise le paramètre nCol de SQLGetData, qui récupère la colonne numéro nCol.
int year = StringToInt(SQLGetData(1));
int month = StringToInt(SQLGetData(2));
int day = StringToInt(SQLGetData(3));
int hour = StringToInt(SQLGetData(4));
int min = StringToInt(SQLGetData(5));

SetLocalInt(oMod, "CheckHour", hour);
SetCalendar(year,month,day);

SetCampaignInt("Dates","TIMEHOUR",hour,oMod);
SetCampaignInt("Dates","TIMEMINUTES",min,oMod);
SetCampaignInt("Dates","TIMEDAY",day,oMod);
SetCampaignInt("Dates","TIMEMONTH",month,oMod);
SetCampaignInt("Dates","TIMEYEAR",year,oMod);

}



D'ailleurs le numéro indiqué lors du SQLGetData, c'est l'ordre dans la requête ? ou bien c'est le numéro de colonne dans la table ? dans mon cas années serait en deux si tel est le cas

Auriez vous une idée du pourquoi de ce retour à 0 ? il doit rester une variable de campagne ou je ne sais pas trop quoi qui revient.


merci
Lien direct vers le message - Vieux
Avatar de Lv4
Lv4
Duc / Duchesse
 
Avatar de Lv4
 
Simplifie au maximum ton script en virant ce dont tu n'as pas besoin, puis ajoute au fur et à mesure pour debugger ça.

Pour SQLGetData il s'agit du numéro de la colonne du retour de MySQL.
Lien direct vers le message - Vieux
Arno4485
Duc / Duchesse
 
En fait je viens de me rendre compte que je ne dois pas vraiment récupérer les valeurs de ma base de données dans le jeu sur le OnModuleLoad, ou bien que je n' arrive pas à les enregistrer dans le jeu.

je n' avais pas fit attention que sur ma montre en jeu j'allais chercher l'heure directement dans la BDD Mysql et non celle du jeu.
Lien direct vers le message - Vieux
Arno4485
Duc / Duchesse
 
mon souci persiste mais je me suis rendu compte que lorsque je lançais manuellement par exemple à l'activation d'un objet, cela fonctionnait.

il semblerait donc que ça ne s'active pas au lancement du module, ou alors, que quelque chose l'écrase au lancement du module.


auriez vous une idée de ce qui pourrait l'effacer ?

merci

j'ai mis ici le script que je lance dans "script déclenché au lancement du module"

(Cliquez le bouton ou survolez le contenu pour afficher ce spoiler.)
#include "nwnx_sql"
void main()
{

// OnModuleLoad
object oPC=GetPCSpeaker();

// annees = colonne 1, mois = colonne 2, jours = colonne 3
string query = "select annees, mois, jours, heures, minutes from dates where id=1";

SQLExecDirect(query);
SQLFetch();

// On utilise le paramètre nCol de SQLGetData, qui récupère la colonne numéro nCol.
int year = StringToInt(SQLGetData(1));
int month = StringToInt(SQLGetData(2));
int day = StringToInt(SQLGetData(3));
int hour = StringToInt(SQLGetData(4));
int min = StringToInt(SQLGetData(5));

ActionSpeakString("Nous sommes le : "+ SQLGetData(3) + " " + SQLGetData(2) + " " + SQLGetData(1) + " , il est " + SQLGetData(2) + " : " + SQLGetData(5) );

SetCalendar(year,month,day);

DisplayGuiScreen(oPC,"KEMO_ANIM",FALSE,"kemo_anim.xml");
return;

}
Lien direct vers le message - Vieux
clementC
Dieu / Déesse suprême
 
GetPCSpeaker return le pj qui parle dans une conversation, hors la tu n'est pas dans une conversation .
Lien direct vers le message - Vieux
Arno4485
Duc / Duchesse
 
arff oui c'est une erreur de ma part lorsque j'ai recopié le script du NPC que je voulais faire parler.


Mais rien ne change si je corrige cela.
cependant, je viens de voir dans les logs nwnServerLog1, ces lignes ci

(Cliquez le bouton ou survolez le contenu pour afficher ce spoiler.)
[Sat Jun 14 11:09:42] Loading Module: test2
TRANS: [Sat Jun 14 11:09:42]Not decompressing as not loading from a previously visited module.
TRANS: [Sat Jun 14 11:09:42]Setting up Stall Event now.

---- End Server Options ----
Error: Resource zone1.trx has no server and no override URL configured.
ERROR: resource zone1.trx is not valid.
Error: Resource campaign.CAM has no server and no override URL configured.
ERROR: resource campaign.CAM is not valid.



Edit : Si je regarde dans le fichier dates.dbf, je peux trouver cette ligne

TIMEMONTH 06/14/1411:58:46I 6

cela semble correspondre à ce moi de juin que je retrouver par défaut sur mon module au lieu de la date que je voudrais mettre.
J'ai testé manuellement en changeant ce 6, mais il revient dès le lancement du module.

Il y a peut être un lien ?

Dernière modification par Arno4485 ; 14/06/2014 à 12h01.
Lien direct vers le message - Vieux
clementC
Dieu / Déesse suprême
 
Tu l'as modifie au moins à un moment donné ta table data à l'aide d'une requete update? Parceque si tu ne le fais pas c'est normal qu'elle te renvoie toujours la même chose.
Lien direct vers le message - Vieux
Arno4485
Duc / Duchesse
 
je viens de tester ce script.

je l'ai placé sur "au lancement du module" et ça ne fonctionne pas, mais aussi sur un PNJ dans le "déclenchement de la conversation", et la ça fonctionne.

(Cliquez le bouton ou survolez le contenu pour afficher ce spoiler.)
#include "nwnx_sql"
void main()
{

object oMod=GetModule();
int year = 1354;
int month = 10;
int day = 19;
int hour = 1;
int min = 1;

//etLocalInt(oMod, "CheckHour", hour);
SetCalendar(year,month,day);

SetCampaignInt("Dates","TIMEHOUR",hour,oMod);
SetCampaignInt("Dates","TIMEMINUTES",min,oMod);
SetCampaignInt("Dates","TIMEDAY",day,oMod);
SetCampaignInt("Dates","TIMEMONTH",month,oMod);
SetCampaignInt("Dates","TIMEYEAR",year,oMod);
}


une idée ?

merci
Lien direct vers le message - Vieux
Arno4485
Duc / Duchesse
 
personne n'aurait une idée s'il vous plait ? ou alors je passe à coté de quelque chose ?

Merci
Lien direct vers le message - Vieux
Avatar de Lv4
Lv4
Duc / Duchesse
 
Avatar de Lv4
 
Il faut que tu nous donne plus d'info. "ça fonctionne /pas" ne nous permet pas de t'aiguiller sur une solution.

De plus, dans ton script tu sembles utiliser un coup MySQL un coup la db interne de never, donc on sait pas quoi te dire.

Edit: tu peux utiliser la balise php sur ce forum pour afficher ton code nwscript avec un semblant de coloration syntaxique.

Dernière modification par Lv4 ; 21/06/2014 à 00h31. Motif: ++info
Lien direct vers le message - Vieux
Répondre

Outils Rechercher
Rechercher:

Recherche avancée

Thème visuel : Fuseau horaire GMT +1. Il est actuellement 02h56.
   

© JeuxOnLine, le site des MMO, MMORPG et MOBA. Tous droits réservés. - Conditions générales d'utilisation - Conditions d'utilisation des forums - Traitement des données personnelles - ! Signaler un contenu illicite