Archives des forums MMO/MMORPG > Neverwinter Nights > NWN - Maskado > PWUM automatique ?
PWUM automatique ?
Par eMRaistlin le 3/1/2003 à 10:01:45 (#2933225)
http://nwvault.ign.com/Files/other/data/1041387039453.shtml
A priori (je ne 'ai pas encore testé...) il semblerait que grace a cela, le systeme du parser log soit lancé automatiquement lors du lancement du serveur.
Merci a ceux qui testeront de donner leur avis
Par RAT le 3/1/2003 à 14:43:07 (#2935336)
Mais Bon ne vendons pas la peau de l'ours avant de l'avoir tuer.
eM, je vais aller le tester aujourd'hui, je ferai mon rapport en fin d'aprem :):D
Par coolstar le 3/1/2003 à 15:23:42 (#2935651)
Merci pour votre compréhension. :merci:
Par miriandel le 3/1/2003 à 15:53:18 (#2935905)
It currently only works on Windows unless you can port the nwnnsscomp.exe to Linux.
huhuhu
De plus, pas un seul mot sur le fonctionnement du machin qui se présente sous forme d'un .exe
Oué, oué, oué... ouvrez la cage aux oiseaux...
Par miriandel le 3/1/2003 à 15:54:29 (#2935916)
Ca, c'est propre et fiable.
Par eMRaistlin le 3/1/2003 à 15:55:59 (#2935932)
c'est plutot un .cmd...
Here is the PW implementation as it stands. It is designed so that it requires
no in-game tokens to get lost nor any manual intervention to restore the
values.
Requirements:
Java 1.4.1 from java.sun.com, alternatively, you could rewrite the log parser
in no time from the Java source I have included. As an additional alternative
you can use jview from Microsoft (if installed) by changing the first line of
the script to:
jview /cp logparser.jar logs.0/nwserverLog1.txt override
Download from another site:
nwnnsscomp.exe: I got it from http://www.torlack.com/. It seemed better tested and
more stable than what I was doing by hand. Put it in your NeverwinterNights\NWN
directory.
Contents of the archive:
logparser.jar: This is the jar of the log parser that generates the scripts
that are compiled.
pwnwserver.cmd: This is a batch file that processes the previous NWN log
before starting the new server. This generates the script that is executed at
module load time and sets all the values then starts the nwserver.exe as
normal.
sam_inc_ps.nss: This is the include file needed by the modules and the
generated scripts.
java/LogParser.java: The source for the log parser.
java/manifest: Used for generating the runnable .jar file.
mod/PW Test Module.mod: A very simple mod that shows how you can increment a
counter between server invocations.
override/sam_pw_start.ncs: An empty script that is just a place holder for
where the generated script will go.
Installation instructions:
1. Unzip the contents of the attached .zip file into your NeverwinterNights\NWN
directory. It should not overwrite anything that is there already.
2. Use the sam_inc_pw.nss file within your module, replacing global
SetLocalInt(GetModule(), ..., ...) with StoreInt(..., ...) and
GetLocalInt(GetModule(), ...) with LoadInt(...). These could be generalized to
include values for specific objects, but I thought it would be simpler this way
and leave it to the user to generate unique names.
3. Add a hook to OnModuleLoad that does a ExecuteScript("sam_pw_start"). This
will execute the script in the override directory. Make sure that you have no
such script in your module. It would get confusing if there were.
4. Change the way you start your server from calling nwserver.exe to call
pwnwserver.cmd. Make sure thats the only way the server is ever started,
perhaps by changing the name of nwserver.exe. If it is started another way and
there is no backup of the most recent serverlog or a master backup of all
serverlogs you will not be able to recover the persistent data. I do this by
keeping a complete history of all server logs, also convenient for finding
cheaters.
5. You're done. Start the included module a few times to see how the counter
is increased each restart by looking at the server log.
Par RAT le 3/1/2003 à 18:15:19 (#2936977)
Provient du message de coolstar
Heeuuu, au passage... Je vais peut-être être un peu H-S là (Sorry, mais y'a pas moyen de trouver un Mot de 3 lettres ou moins!)... alors comme ça concerne aussi un "Procédé de Gestion"... je voulais juste avoir des infos sur le 'Système RAT'... car il se trouve qu'un gars à besoin d'un tuyau par ici... et je sais que RAT avait justement parlé du truc... :D
Merci pour votre compréhension. :merci:
Lu cool, pour le logiciel RAT, je n'en sais pas énormément plus, je ne l'ai pas encore testé. Je sais juste que normalement, tu dois pouvoir relancer ton server en cas de crash :D:D.
C'est bien ça que tu voulais savoir cool???
pour le pwum auto, pour l'instant j'essaye de comprendre le truc, mais cela à l'air chaud comme truc lol.
Rapport du pw automatique
Par RAT le 3/1/2003 à 19:22:24 (#2937559)
Oui, vous pouvez lancez le module, un crash de server, et vous n'avez plus qu'à relancer le server sans modification à faire , il le fait lui même.
J'ai installé une créature, pour qu'elle me dise exactement la valeur de la variable qui est incrementé à chaque chargement du module.
Je lance la commance pwnwserver.cmd, ce dernier lance auto nwnserver.exe , je charge mon module. et hop la créature me dit 1.
je me deco, je me reco, et elle me redit 1. Bon pour l'instant tout va bien. J'éteins le serveur, je le relance avec la même commande.
Et là, la créature me dit 2.
Je suis resté sur le cul, faut le dire clairement.
Deux choses à dire quand même la dessus:
1) au debut, un peu chiant à installer, mais bon sinon ca va.
2) les variables persistantes ne ressemblent pas du tout à celle du pwum. Donc je vais voir ce qu'on peut faire la dessus. Car perso, cela serait chiant de tout recommencer.
Voilà mon rapport,
Ici RAT de bibliothèque (private joke avec coolstar :D:p) , à vous Jeux online :)
Par Iridian le 3/1/2003 à 19:31:26 (#2937632)
Je vais essayer ça.
Par Jaha Effect le 3/1/2003 à 19:31:30 (#2937633)
Jaha Effect :D
Par RAT le 3/1/2003 à 19:55:25 (#2937810)
Mais perso, moi cela ne me suffit pas héhé, je vais essayer de retravailler le script pour qu'il gère les variables de tynril et de pwum, si on doit faire des changements dessus. Je n'ai pas encore vérifier pour l'instant.
Mais je m'y mets.
:):)
Par Jaha Effect le 3/1/2003 à 19:57:05 (#2937828)
Jaha Effect :D
Par Iridian le 3/1/2003 à 19:58:12 (#2937840)
Euh dites, je trouves pas les logs, comment on les actives ?
Par RAT le 3/1/2003 à 20:27:33 (#2938095)
Bon moi en attendant,
Pour commencer voici le inc ou se situe son code. Comme vous pouvez voir, il n'a rien prévu pour le string, ni le float, ni le location rien de pwum en fait.
Mais certaines vont me dire, ba on les rajoutes. Ba cela ne fera pas grand chose, je vais vous montrer les logs en txt de son parser.
Le problème, bien que le java ressemble au c, je m'y perds en peu sur certains trucs, n'ayant jamais fais de java, excepte du javascript mais c'est totalement différents lol.
Donc voici le script du pwum:
"sam_inc_pw"
// Include this to use Sam's PW implementation
void StoreInt(string name, int value) {
SetLocalInt(GetModule(), "sampw_" + name, value);
WriteTimestampedLogEntry("[sampw:" + name + "=" + IntToString(value) + "]");
}
int LoadInt(string name) {
return GetLocalInt(GetModule(), "sampw_" + name);
}
et voici pour les personnes qui voudraient bien connaître le code du parser :):
import java.io.*;
import java.util.*;
public class LogParser implements Runnable {
public static void main(String[] args) {
// Parse the command line
if (args.length != 2) {
System.out.println("Usage: LogParser [log filename] [override directory]");
System.exit(1);
}
String logFilename = args[0];
String overrideDirectoryFilename = args[1];
String scriptFilename = "sam_pw_start.nss";
// Make sure the override directory exists
File overrideDirectory = new File(overrideDirectoryFilename);
if (!overrideDirectory.exists()) {
System.out.println("ERROR: Override directory " + overrideDirectoryFilename + " does not exist");
System.exit(1);
return; // compiler doesn't know we exited
}
// Make sure we can read the log
DataInputStream dis;
try {
dis = new DataInputStream(new BufferedInputStream(new FileInputStream(logFilename)));
} catch (IOException ioe) {
System.out.println("ERROR: Could not read the log file " + logFilename + " because " + ioe);
System.exit(1);
return; // compiler doesn't know we exited
}
// Make sure we can write the script
PrintStream ps;
try {
ps = new PrintStream(new BufferedOutputStream(new FileOutputStream(scriptFilename)));
} catch (IOException ioe) {
System.out.println("ERROR: Could not write the script file " + scriptFilename + " because " + ioe);
System.exit(1);
return; // compiler doesn't know we exited
}
// Store the name/value pairs
Hashtable ht = new Hashtable();
// Parse the log file
try {
String line;
while ((line = dis.readLine()) != null) {
int index;
if ((index = line.indexOf("[sampw:")) != -1) {
line = line.substring(index + 7);
line = line.substring(0, line.length() - 1);
if ((index = line.lastIndexOf("=")) != -1) {
String name = line.substring(0, index);
String value = line.substring(index + 1);
ht.put(name, value);
}
}
}
} catch (IOException ioe) {
System.out.println("ERROR: Could not parse the log file " + logFilename + " because " + ioe);
System.exit(1);
}
//*************** Ce qui nous intéresse surtout***********
// Write the script that we need
ps.println("#include \"sam_inc_pw\");
ps.println("void main() {");
for (Enumeration e = ht.keys(); e.hasMoreElements(); ) {
String name = (String) e.nextElement();
String value = (String) ht.get(name);
ps.println(" StoreInt(\" + name + "\", " + value + ");");
}
ps.println("}");
ps.close();
//*************** FIN********************************
//*************** Ce qui nous interresse aussi***********
// Compile the script
try {
Process process = Runtime.getRuntime().exec(new String[] {"nwnnsscomp.exe", scriptFilename, new File(overrideDirectory, "sam_pw_start.ncs").getCanonicalPath()});
new Thread(new LogParser(process.getInputStream())).start();
new Thread(new LogParser(process.getErrorStream())).start();
try {
int result = process.waitFor();
System.exit(result);
} catch (InterruptedException ie) {
System.out.println("Compile interrupted");
System.exit(1);
}
} catch (IOException ioe) {
System.out.println("ERROR: Could not execute compiler nwnnsscomp.exe");
System.exit(1);
}
}
//*************** FIN********************************
// Read the exec streams
private LogParser(InputStream is) {
this.is = is;
}
private InputStream is;
public void run() {
try {
int b;
while((b = is.read()) != -1) {
System.out.write(b);
}
} catch (IOException ioe) {
}
}
}
Comme vous pouvez le voir, il ne s'est occuper que pour les integer.
Bon Le défi que je lance à tous nos scripteurs , c'est qu'on essaye de bidouiller le code, pour que le parser s'occupe des sauvegardes pwum. Comme cela on pourra utiliser les capacités du pwum et des flags de Tyn , sans avoir besoin de faire une quelconque sauvegarde tout sera géré automatiquement.
Cela vous dit? Je pense sincèrement que c'est faisable.
Moi en tout cas, je m'y mets. Le top c'est qu'on soit solidaire, et qu'on travaille tous ensemble. Si cela vous interresse, vous pouvez choper mon icq ou mon msn :), ou mail etc... :)
Par Iridian le 3/1/2003 à 23:17:42 (#2938976)
Il suffi de reprendre l'existant et de le dupliquer pour les float et les string (pour les locations et les object je ne sais pas si c'est possible) tout en différenciant le type de variable dans le log.
Quand au parser, le plus simple a mon avis c'est de le re-développer en delphi ou autre *aime pas le java*
Sinon je trouve le principe du prog (compilation => overide) vraiment très cool.
Evidemment je suis partant pour participer au projet :)
Il faut voir aussi s'il est possible de reprendre les fonctions de Tynril pour PWUM (a mon avis elle n'auront meme pas besoin d'etre retouché)
Reste a analyser la syntaxe des log pour faire le parser, ou pourquoi pas reprendre le parser deja existant pour PWUM et automatiser la compilation et le placement dans overide.
Donc presque rien a faire en fait ... *a du oublier un detail, vu comme ca c'est trop simple*
[EDIT : Euh .. . RAT, je ne trouves pas ton MSN dans ton profil]
Par eMRaistlin le 4/1/2003 à 0:09:11 (#2939349)
mais le nom de la variable, il se sert de quoi, pour le stocker ??
On peut pas s'en servir de ca ?
PS : je ne lis pas du tout le java
Par Dudu99 le 4/1/2003 à 3:45:58 (#2940480)
Bonsoir
ne comprends pas trop votre probleme sur ce coup là.
Pourquoi bidouiller le code du parser si c'est le java qui rebute à premiere vue?
ça va plus vite de le refaire :
Le parser c'est un simple parcours sequentiel (ligne à ligne de la premiere à la
derniere) et un reperage de valeurs spécifiques de debut de ligne.
Chaque occurance trouvée est reecrite ds un fichier txt en sortie,
comprehensible syntaxiquement par le compilateur autonome fait pour le nwnscript.
Puis on fait compiler le fichier ainsi creer par le nwnnsscomp.exe avec le path de sortie ds
le dossier override (si simple cette astuce là que personne
n'y avait encore pensé aarrrg, mais ça va servir à bien d'autres trucs ça !!!)
si en quittant le jeu, je logue les lignes suivantes
...
[TotoI:nb_xp 123]
[TotoF:coef 0.4]
[TotoS:nom_mission taratata]
[Titi à quitte le monde honteusement en plein combat contre gros minet]
...
il suffit, sequentiellement, de ne s'occuper que des occurrences commençant par la
sous chaine "[Toto" dans le fichier de log
je sais que devant le caractere separateur ":" se trouve le type de ma variable
je sais qu'entre les caracteres separateurs ":" et " " se trouve le nom de ma variable
je sais que derriere le caractere separateur " " se trouve la valeur de ma variable
****************************************************
algo super basique et ultra rapide fait (sans doute trop):
****************************************************
(avec une fonction substring(string name, int position_debut, int longueur) renvoyant la
sous partie d'une chaine )
int headers=0;// flux de fichier
string prefixe = "[Toto"; // chaine à rechercher dans le log
string chaine=";// chaine contenant la ligne lue ds le fichier de log
string nom_variable=";//sous chaines de traitements
char type_variable=";
string valeur_variable=";
int i;// compteur de boucles
int nb_trouve=0;// compteur de variables persistantes
int nb_max=5000;// param de taille maxi du tableau ci dessous
string tab_elem_int[nb_max, 3];// tableau de string stockant nos valeurs trouvees
/* ***************************************************************************************/
/* etape 1 Lecture du log et stockage des infos reperées */
/* ***************************************************************************************/
headers=open("(chemin/)nom_fic_log", mode_lecture_sequentielle);
//j'ouvre le fichier texte de log en lecture
while (!EOF)//pour chaque ligne de mon fichier de log
{
string chaine= read(headers);//on lit la ligne courante du fichier
taille = longueur(chaine) - 1;// (on vire le " ] " de fin de ligne du nbre de chars)
// je repere l'index du ":" ds la chaine (= position1)
for(i=0, i<taille, i++)
{
if chaine= ":"
{
position1=i;
break ;
}
}
// je repere l'index de " " ds la chaine (= position2)
for(i=0, i<taille, i++)
{
if chaine= " "
{
position2=i;
break ;
}
}
/*deux boucles differentes permettent de ne pas s'embetter à gerer les cas ou la suite de
la chaine contient de nouveau les caracteres cherches (ex: dans la zone valeur pour une
variable string) d'ou le break qui sort de la boucle si la condition est vrai... ce sera tjs la
premiere occurence trouvée, la bonne ...*/
if substring(chaine, 0, longueur(prefixe)) = prefixe //(que les lignes commençant par [Toto)
{
nb_trouve++;//j'incremente mon compteur d'elements trouvés
type_variable = substring(chaine, (position1 - 1), 1)
//(=I pour Int, F pour float, S pour String)
nom_variable=vire_espace(substring(chaine, position1 + 1, position2 - position1)))
valeur_variable= vire_espace(substring(chaine, position2, taille - position2)))
/*la fonction vire_espace vire le caractere separateur de la chaine sans m'embetter
à faire du position2 - (position1 +1...) d'ou le choix du " " ici*/
tab_elem_int[i, 0]=nom_variable;
tab_elem_int[i, 1]=valeur_variable;
tab_elem_int[i, 2]=type_variable;
/* je stocke ces elements, ex au plus simpliste : un tableau à 3 dimensions (nom, val, type)*/
}
} //fin_boucle (End of File)
close(headers);//on ferme le fichier de log
/* ***************************************************************************************/
/* etape 2 creation du fichier txt de sortie pour envoyé vers le compilateur nwnscript */
/* ****************************************************************************************/
headers=open("(chemin/)nom_fic_sortie", mode_ecriture_creation); // ouverture du fic de sortie
write_line(headers, "void main() {");
for (i=0;i<nb_trouve;i++)
{
/* suivant son type au lieu du ps.println(" StoreInt(\" + son_nom + "\", " + sa_valeur+ ");");
le StoreInt peut devenir un storestring, storefloat on ajuste la syntaxe de la valeur */
switch(tab_elem_int[i, 2])
{
case I:
write_line(headers, "StoreInt( tab_elem_int[i, 0] + ", " + tab_elem_int[i, 1] + ");");
case F:
write_line(headers, "Storefloat( tab_elem_int[i, 0] + ", " + tab_elem_int[i, 1] + ");");
case S:
write_line(headers, "Storestring( tab_elem_int[i, 0] + ", ' " ' "+ tab_elem_int[i, 1] + ' " ' );");
}
}
write_line(headers, " } ");
close(headers);
//j'appelle par une commande shell l'executable "nwnnsscomp.exe"
shell "(chemin/)nwnnsscomp.exe" + " " + "(chemin/)nom_fic_sortie" + " "
+ "(chemin/)override/sam_pw_start.ncs"
// (au lieu de shell, on peut mettre par exemple un command.com /C /E ...)
Exit()
enfin bref c'est juste une boucle toute bete, on vous a dejà vu realiser des trucs bien
plus effrayants sur ce forum :)
PS: je ne peux pas trop mettre direct un code tout fait, vu mon boulot, je n'ai sous la
main que des langage de scripts exotiques guere plus parlant que le code java..
bon, bah avant de me coucher, apres une soirée galere au boulot, me serais changé
les idées par la meme chose qu'au boulot ...(vais aller voir un psy j'crois).
(excusez la mise en forme brute de pomme, mais en un mot "pffffff" ...)
Par RAT le 4/1/2003 à 3:57:34 (#2940535)
iridian je te l'envoie par mp alors, je pensais l'avoir mis dans mon profil.
Pour le reste. Perso, le java, je n'en ai jamais fait, par contre il est à peu près aussi simple à lire que n'importe quel langage tant que nous possédons la base du C et du pascal. Après c'est surtout de la logique.
Après , je ne savais pas si on pouvait le faire avec un autre langage, comme il utilise quand même des fichiers compiler. on ne s'est pas ce qu'il a mis dedans non?
C'est pour cela que je pensais qu'il fallait le faire sous java uniquement, mais après je n'ai pas non plus la science infuse lol, donc je peux me gourer.
Pour terminer, je l'ai codé ce soir sous java, donc comme je ne connais pas le langage, il y a sûrement plus simple. Comme utiliser qu'un seul tableau , j'ai utiliser 9 hashtable, qui est un fait une sorte de dictionnaire. Possedant une clé, et un objet. L'objet sera sa valeur qui sera référencé par sa clé.
Je verrai pour l'optimiser plus tard, je n'avais pas trop le temps de chercher toutes les syntaxes et les fonctions disponibles.
Avant de vous le mettre, je vais d'abord le tester et je vous ferai mon rapport demain, dans l'aprem.
Iridian, toujours prêt à bosser avec toi, on se contactera par msn demain :). je vais t'envoyer un mp :).
Et pour répondre a Dudu99, vivi, je pense bien que nous avons déjà fait des scripts beaucoup plus balaise, mais bon croyant au début qu'il fallait mieux le faire sous java, il y a toujours une réticence quand on ne connait pas les bibliothèques ou les fonctions disponibles non???
pour le reste cela ressemble énormément à du C voila tout :):D
Re: Rapport du pw automatique
Par coolstar le 4/1/2003 à 14:54:16 (#2942961)
Ici RAT de bibliothèque (private joke avec coolstar :D:p) , à vous Jeux online :)
;)
Et, au fait... merci d'avoir tenté de me répondre (tu peux me rappeler ton Topic?)... et chapeau bas pour tes recherches sur PWUM... :merci:
Par RAT le 4/1/2003 à 17:37:49 (#2943980)
lol et de rien pour essayer de t'avoir répondu même si je n'ai pas pu te donner toutes les infos que tu voulais , n'ayant pas encore tester à fond ce logiciel.
Et tu veux que je te rappelle quel topic lol la?:D:D:D
Par coolstar le 4/1/2003 à 18:22:40 (#2944259)
Par RAT le 4/1/2003 à 19:04:35 (#2944568)
Tiens voici le thread, surveiller un serveur
Par Iridian le 5/1/2003 à 0:11:25 (#2946421)
Je cherche de GROS logs de PWUM pour tester mon parser :)
Merci de les envoyer (zipper hein !) ici : davidvergison@yahoo.fr
Par coolstar le 5/1/2003 à 10:37:10 (#2948054)
Par gaeriel/nekresh le 5/1/2003 à 11:15:43 (#2948195)
Exemple simple, une page web. Le navigateur dispose d'un parseur pour pouvoir effectuer un rendu de la page.
Par coolstar le 5/1/2003 à 11:18:15 (#2948211)
JOL Archives 1.0.1
@ JOL / JeuxOnLine