Bon, premiers résultats.
En premier, une bête petite fonction en NWScript, Set2DAString :
// Ecrit dans le log la demande d'ecriture dans un fichier
// 2DA, interpretee par le 2DAWriter.
void Set2DAString(string s2DA, string sColonne, int nLigne, string sValeur) {
WriteTimestampedLogEntry("2DAWrite|"+s2DA+"|"+sColonne+"|"+IntToString(nLigne)+"|"+sValeur);
}
Et en second, un script PHP à mettre en shell ou a executer de temps en temps, qui parse les logs et modifie les 2DA en fonction.
//:: Fonction : Parse2DAWrite
// Traite les 2DAWrite dans un fichier de log NWN et régénère un
// nouveau log sans les 2DAWrite déjà traités pour remplacer l'ancien.
// $file => Chemin du fichier du log serveur
// $2dapath => Chemin du répertoire des 2DA (ne pas oublier le slash ou l'antislash à la fin, je ne le met pas pour la compatibilité Lin/Win)
function Parse2DAWrite($file,$2dapath) {
$fp = fopen($file,"r");
$started = 0;
while(!feof($fp)) {
$line = fgets($fp,8192);
while($line[0] == ".") $line[0] = "";
if($started == 1) {
if(strpos($line,"[") === false) $started = 0;
else {
$line = substr($line,strpos($line,"]") + 2);
if(substr($line,0,9) == "2DAWrite|") {
$new = explode("|",substr($line,9));
$data[$new[0]][] = array($new[1],$new[2],$new[3]);
}
}
}
if(strpos($line,"End Server Options") > 0) $started = 1;
}
fclose($fp);
foreach($data as $key => $value) {
$work = new C2DA($2dapath.$key.".2da");
foreach($value as $key2 => $value2) $work->Set2DAString($value2[0],$value2[1],$value2[2]);
$work->Save2DA($2dapath.$key.".2da");
unset($work);
}
}
Cette fonction nécessite au préalable l'inclusion de l'objet C2DA précédemment posté.
Encore un dernier truc : pourquoi avoir choisi PHP ? Plusieures raisons.
- C'est un langage que je maitrise pas trop mal, et ça aide à pas mettre 3 plombes à faire un script;
- C'est un langage sur, efficace, open-source;
- Il est portable sur Windows et Linux;
- On peut l'utiliser dans des pages Web.
Je demandais pas mieux, alors j'ai adopté.
J'ai testé le script, ça fonctionne. J'ai utilisé l'override pour procéder, ayant la flemme de faire (ou de chercher, je crois que ça existe déjà) un module PHP pour décompresser/recompresser les 2DA d'un HAK ou d'un BIF.
Dernière étape : Un p'tit prog (Windows, vu que sous Linux, un shell suffit) qui se lance en tray pour parser automatiquement les logs tous les X temps.
J'ai vaguement commencé le développement, mais c'est assez chiant, vu que je dois refaire toute la classe C2DA en C# (je code ça en C#) pour éviter de devoir installer à chaque fois l'interpréteur PHP.
Je sais pas si ça va vraiment servir à quelqu'un, vu que 90% des serveurs qui auraient usage du script tournent sous Linux, et vu les améliorations très très nettes de la nouvelle version du serveur Linux (encore en beta fermée, je crois).
Bref, votre avis. Ca vaut le coup que je finisse, ou je laisse dans l'état ? C'est fonctionnel ainsi, le "relanceur", c'est du gadget.