Base du fonctionnement d'un module (Résolu)

Répondre
Partager Rechercher
Bonjour,

j'ai cherché un peu sur les Tutos un peu partout, mais j'ai du mal à trouver les infos que je cherche, pourtant basiques.


je viens de créer un petit module, et je souhaiterais le faire évoluer.
Pour cela j'utilise nwnx4 avec une base de données Mysql.

Ce que je n'arrive pas à trouver, c'est comment fonctionne le jeu, et Comment il enregistre les données, et où, par exemple, les données sur la création d'un personnage.

Si je veux ressortir sa classe, son niveau, son nom prénom, age, sexe, or etc ...

Comment puis je ressortir tout cela ?
ou bien est il possible de me dire où trouver ces infos ?

Merci beaucoup.

Dernière modification par Arno4485 ; 08/06/2014 à 12h29.
Si tu compte utiliser ça de manière dynamique il faudra que tu utilise le langage de script de never dont tu peux trouver les fonctions ici: [JOL nwref].

Si tu veux juste avoir des informations sur un personnage déjà créé sur ton serveur, tu peux utiliser le fichier de son personnage (d'extension BIC) qui se trouve dans le servervault. Ce fichier peut se lire avec un éditeur GFF, notamment [Tlkedit2].
Ce serait pour un serveur multijoueur donc ce serait bien sûr dynamique.

Mais lors de la création d'un PJ, les informations sont stockées sur les BDD internes à nwn ? ou bien on peut les stocker sur une BDD Mysql annexe ?

Les infos du personnages sont récupérables par où ?


Par exemple, à la création d'un personnage, les informations sur ses carac, classes etc .. sont gérées comment ?

merci
Toutes ses infos sont stockées dans le fichier BIC du personnage. Ce fichier est créé lors de la première connexion du joueur et mis à jour régulièrement par never. Il contient classes, race, caracs, dons, ... c'est la fiche de perso du joueur. Il se trouve dans ton servervault.

Tu as accès physiquement à ce fichier si tu veux corriger des trucs manuellement. Tu as également accès aux infos d'un joueur via nwscript mais il faut que ce joueur soit connecté. Par exemple tu vas récupérer le score de dex d'un personnage via la fonction GetAbilityScore(object, int, int) (voir la doc JOL dans mon post plus haut).

Si tu souhaites stocker en parallèle ces info dans une bdd à toi, il faudra faire le travail toi-même. Voici par exemple un script qui ajoute quelques info dans une bdd lorsqu'un joueur se connecte pour la première fois :

Code PHP:

void main()
{
  
object o GetEnteringObject();
  if (!
GetIsPC(o))
    return;

  
// les fonctions SQL proviennent du plugin nwnx et sa librairie nss
  
string account SQLEncodeSpecialChars(GetPCPlayerName(o));
  
string fname SQLEncodeSpecialChars(GetFirstName(o));
  
string lname SQLEncodeSpecialChars(GetLastName(o));

  
// identification du perso par compte+nom+prénom
  
string query "select id from players where " +
    
"account='" account "' and " +
    
"fname='" fname "' and " +
    
"lname='" lname "'";

  
// est-ce qu'on a déjà ce perso en base ?
  
SQLExecDirect(query);

  if (
SQLFetch() != SQL_SUCCESS// pas de résultats
  
{
    
// pas d'identifiant en bdd, on suppose
    // que c'est donc la première connexion de ce perso
    
query "insert into players(account,fname,lname,cdkey) values(" +
      
"'" account "', " +
      
"'" fname "', " +
      
"'" lname "', " +
      
"'" GetPCPublicCDKey(o) + "')";
    
SQLExecDirect(query);

    
// récup du dernier id ajouté
    
query "select last_insert_id()";
    
SQLExecDirect(query);
  }

  
// traitement du cas de première connexion (last_insert_id)
  // et du cas de nième connexion
  
int id StringToInt(SQLGetData(1));
  
SetLocalInt(o"__internal_id"id);

Edit: y a pas de traitement d'erreur là, paaas bien.

Dernière modification par Lv4 ; 08/06/2014 à 03h36.
Donc si j'ai bien compris "account" "fname=" "lname=" ce sont des champs de notre table c'est cela ?

mais où est ce que je définis quelle table et bases sont concernées ?

merci
Oui là j'ai pas montré le schéma mais tu peux le deviner avec les requêtes. A priori on aurait 5 colonnes: id|account|fname|lname|key
Code PHP:

CREATE TABLE `players` (
 `
idint(11NOT NULL AUTO_INCREMENT,
 `
accountvarchar(64NOT NULL,
 `
fnamevarchar(64NOT NULL,
 `
lnamevarchar(64NOT NULL,
 `
cdkeyvarchar(8NOT NULL,
 
PRIMARY KEY (`id`)

Tu définis la base, l'utilisateur et son mot de passe dans le INI de nwnx. Ensuite tu accèdes aux tables avec des requêtes SQL classiques depuis nwscript.
Code PHP:

select id from players where account='bob' and fname='robert' and lname='paulson' 

Pour le reste tu peux créer ce que tu veux, faire comme il te semble. Comme je l'ai dit avant il s'agit d'un traitement parallèle à celui de base de never (qui fonctionne avec les fichiers BIC); donc c'est à toi de le gérer.

Dernière modification par Lv4 ; 08/06/2014 à 03h36.
j'ai regardé un peu le script et ai modifié quelques lignes, mais je garde la même erreur de l'origine à la version modifiée, c'est à a dire un

ERREUR : PARSING VARIABLE LIST en ligne 8

Code PHP:

void main()
{
  
object oPC GetEnteringObject();
  if (!
GetIsPC(oPC))
    return;

  
// les fonctions SQL proviennent du plugin nwnx et sa librairie nss
  
string sAccount SQLEncodeSpecialChars(GetPCPlayerName(oPC));
  
string sFname SQLEncodeSpecialChars(GetFirstName(oPC));
  
string sLname SQLEncodeSpecialChars(GetLastName(oPC));

  
// identification du perso par compte+nom+prénom
  
string query "select id from players where " +
    
"account='" sAccount "' and " +
    
"fname='" sFname "' and " +
    
"lname='" sLname "'";

  
// est-ce qu'on a déjà ce perso en base ?
  
SQLExecDirect(query);

  if (
SQLFetch() != SQL_SUCCESS// pas de résultats
  
{
    
// pas d'identifiant en bdd, on suppose
    // que c'est donc la première connexion de ce perso
    
query "insert into players(account,fname,lname, key) values(" +
      
"'" sAccount "', " +
      
"'" sFname "', " +
      
"'" sLname "', " +
      
"'" SGetPCPublicCDKey(oPC) + "')";
    
SQLExecDirect(query);

    
// récup du dernier id ajouté
    
query "select last_insert_id()";
    
SQLExecDirect(query);
  }

  
// traitement du cas de première connexion (last_insert_id)
  // et du cas de nième connexion
  
int id StringToInt(SQLGetData(1));
  
SetLocalInt(oPC"__internal_id"id);

Serait ce un souci avec cette fameuse bibliothèque de scripts du Plugin nwnx qui serait manquante sur le module ?

En tout cas merci
Oui il faut que tu include la librairie, le fichier doit s'appeler nwnx_sql.NSS si je ne me trompe pas.

Code PHP:

#include "nwnx_sql"

void main()
{
  
// ...

Encore moi navré.

Pour que ce script se lance, je dois le placer sur "Script déclenché par la connexion d'un client ?"

car j'ai tenté ainsi mais il ne semble pas se lancer.

Faut il le mettre ailleurs ?

D'ailleurs à ce sujet, peut on placer deux scripts à lancer sur la même action ?
par exemple deux scripts sur le OnEnter ou quelque chose du genre

Merci
Oui le script peut se placer à l'entrée du module, envoie toi des phrases par script si tu veux debug, la fonction est SendMessageToPC(object, string).

Non tu ne peux pas placer deux scripts sur la même action. Mais tu peux exécuter plusieurs scripts (ExecuteScript) ou fonctions depuis un script, donc ça répond à ton problème.
Note que never est totalement synchrone : tu ne peux pas faire deux choses en même temps (peut-être que si avec les plugins qu'il y a maintenant mais je ne saurais te dire).
j'ai un petit souci visiblement, car ma bdd ne se rempli pas.

Code:
#include "nwnx_sql" 

void main()
{
  object oPC = (GetEnteringObject());
  if (!GetIsPC(oPC))
    return;

      // les fonctions SQL proviennent du plugin nwnx et sa librairie nss
  
  string account = SQLEncodeSpecialChars(GetPCPlayerName(oPC));
  string fname = SQLEncodeSpecialChars(GetFirstName(oPC));
  string lname = SQLEncodeSpecialChars(GetLastName(oPC));
  
SendMessageToPC(oPC, account);
SendMessageToPC(oPC, fname);
SendMessageToPC(oPC, lname);

  // identification du perso par compte+nom+prénom
  string query =  "select id from players where " +
    "account='" + account + "' and " +
    "fname='" + fname + "' and " +
    "lname='" + lname + "'";


  // est-ce qu'on a déjà ce perso en base ?
  SQLExecDirect(query);
 
  if (SQLFetch() != SQL_SUCCESS) // pas de résultats
  {
    // pas d'identifiant en bdd, on suppose
    // que c'est donc la première connexion de ce perso
    query = "insert into players(account,fname,lname, key) values(" +
      "'" + account + "', " +
      "'" + fname + "', " +
      "'" + lname + "', " +
      "'" + GetPCPublicCDKey(oPC) + "')";
    SQLExecDirect(query);

    // récup du dernier id ajouté
    query = "select last_insert_id()";
    SQLExecDirect(query);
  }

  // traitement du cas de première connexion (last_insert_id)
  // et du cas de nième connexion
  int id = StringToInt(SQLGetData(1));
  SetLocalInt(oPC, "__internal_id", id);
}
j'ai bien mes infos qui ressortent avec les SendMessageToPC, mais rien qui arrive en BDD.

Une idée de ce qui pourrait se passer ?
Ma BDD est en Mysql et codée MyISAM. (pas plus de résultats en Innodb)
Tu peux nous faire un dump de ta db en spoiler et l'ini de nwnx ?

L'erreur classique est de laisser l'ini de nwnx par défaut : il fonctionne en SQLite. Dedans tu as le paramètre MySQL qui est mis à "mysql_no" ou quelque chose comme ça.
Voila pour le .ini

Cliquez ce bouton ou survolez le contenu pour afficher le spoiler
# NWNX4 configuration file
# These are the default values for NWNX4.

# Path to NWN2 installation (where nwn2server.exe is located)
# no default. You really have to specify it, currently.
nwn2 = C:\Program Files (x86)\Atari\Neverwinter Nights 2

# You can override the tempory path NWN2 uses
# This is where NWN2 will put its logfiles (among other files)
# no default
nwn2temp = C:\Users\util\Documents\Nwn2_log_srv

# Command line parameters to start the server with
# default: no parameters
parameters = -module test

# Should NWNX restart the server if the server process has gone away ?
# 0 = do not restart the server
# 1 = restart the server
# default: 1
processWatchdog = 1

# Should NWNX restart the server if it locks up ?
# This can happen if the server is still running, but does not react to gamespy queries any more.
# 0 = do not query the server
# 1 = query the server
# default: 1
gamespyWatchdog = 1

# If you activate the gamespy watchdog, you need to specify the port your NWN2 server is running on
# default: 5151
gamespyPort = 5121

# How often should the gamespy watchdog query the server ?
# Note: The server will be restarted if it does not react to a certain number of
# queries in a row. See setting gamespyTolerance below.
# default: every 30 seconds
gamespyInterval = 30

# How often may the server not react to gamespy queries ?
# Note: The server will be restarted if it does not react this many queries in a row
# Example: gamespyInterval = 30 and gamespyTolerance = 4 means that the server will
# be restarted if it does not react within 2 minutes
# default: 4 queries
gamespyTolerance = 4

# How long should NWNX wait before the gamespy watchdog kick in ?
# Note: Give the server enough time to load the module, otherwise the watchdog will start to complain
# Value = seconds to wait
# default: 30 seconds
gamespyDelay = 30

# If the server crashes, how long should NWNX wait before it restarts the server ?
# Value = seconds to wait
# default: 5 seconds
restartDelay = 5

# Should NWNX disable the general protection fault error dialog ?
# Note: The watchdogs may fail to restart the server properly if this dialog stays open
# 0 = do not disable the GPFault dialog
# 1 = disable the GPFault dialog
# default: 1
noGPFaultErrorBox = 1

# If you want NWNX to execute a CMD or BAT file before restarting the server after
# a crash, specify it's name here. If you leave this setting empty, no program
# will be run. NWNX will wait for the program to finish before it continues.
# no default
# restartCmd = nwnx_restart.cmd

# How long should NWNX wait for the server to shutdown gracefully
# before it ends the server process forcefully ?
# Value = seconds to wait
# default: 10 seconds
gracefulShutdownTimeout = 10

# You can enter a server message that will be sent to all players
# as NWNX tries to shutdown the server.
# Value = message
# default: none
gracefulShutdownMessage = Le serveur va s'éteindre, merci de vous déconnecter

# How long should the shutdown server message be displayed ?
# Value = seconds to wait before actual shutdown
# default: 5 seconds
gracefulShutdownMessageWait = 5


en revanche je ne trouve pas la commande correcte pour le Dump, je cherche.

merci
En fait c'était le fichier xp_mysql.ini. si tu regardes, voilà ce qu'il contient par défaut:
Code:
# The function class that is provided by this plugin
class = SQLoff

# MySQL server connection parameters
server   = localhost
user     = nwn
password = nwn
schema   = nwnx

# How much information should be written to xp_mysql.txt:
# 0=nothing, 1=only errors, 2=everything
loglevel = 2
Et la classe est déclarée à SQLoff, il suffit que tu mette SQL pour que ça soit bon.
De même, autant désactiver le plugin SQLite (xp_sqlite) en mettant class = SQLoff dedans.
Ce fichier avait bien été édité.
Par ailleurs, j'ai placé le dossier nwnx4 à la racine de mon disque, ça ne pose pas de souci ?

Sinon, je viens de tester avec un script tout simple, et la encore pas d'inscription en bdd

Cliquez ce bouton ou survolez le contenu pour afficher le spoiler
#include "nwnx_sql"

void main()
{
string query = "insert into players(account,fname,lname, key) values(toto,nom ,prenom,cle)";
SQLExecDirect(query);
}
Dans le dossier NWNX, il y a 2 fichiers :

nwnx.txt et mysql.txt

Ce sont les logs de nwnx, si tu pouvais nous les poster on en saurait plus

Dernière modification par Mythyzyn ; 07/06/2014 à 13h34.
le log de nwnx.txt, où on peut voir une erreur mais je n'en connais pas l'importance

Code:
NWN Extender 4 V.1.0.9
(c) 2008 by Ingmar Stieger (Papillon)
visit us at http://www.nwnx.org

* Loading plugins...
* Loading plugin xp_mysql.dll: Successfully registered as class: SQL
* Loading plugin xp_time.dll: Successfully registered as class: TIME
* General protection fault error dialog disabled.
* NWNX4 activated.
et le xp_mysql.txt

Code:
NWNX MySQL Plugin V.0.0.9
(c) 2007 by Ingmar Stieger (Papillon)
(c) 2008 by virusman
visit us at http://www.nwnx.org
(built using mysql-5.0.27 source)

* Log level set to 2 (everything)
o SCO located at 78f440.
o RCO located at 78f090.
* Hooking successful
* Connecting to server localhost
* Plugin initialized.
* Registering under function class SQL
merci
Il n'y a pas d'erreur, c'est normal cette ligne

Apparemment il charge tout correctement mais à aucun moment il se passe des transactions entre le module et mysql.

Tu as bien lancé le script lors de ces logs ?

Quand il se passe quelque chose, c'est logué et ça ressemble à ça :

Code:
NWNX MySQL Plugin V.0.0.9
(c) 2007 by Ingmar Stieger (Papillon)
(c) 2008 by virusman
visit us at http://www.nwnx.org
(built using mysql-5.0.27 source)

* Log level set to 2 (everything)
o SCO located at 78f440.
o RCO located at 78f090.
* Hooking successful
* Connecting to server localhost
* Plugin initialized.
* Registering under function class SQL
* Executing: UPDATE lps_module set status='1' WHERE mod_id=1
* Executing: UPDATE lps_info_pj SET online=0
* Executing: UPDATE lss_subzone_creature SET current_number=0
* Executing: UPDATE lss_subzone SET nb_creatures=0
* Executing: UPDATE lss_subzone_point SET current_number=0
* Executing: select char(34)
* Returning: " (column 0)
* Executing: SELECT tagname, id_serrure FROM lps_static_placeable
* Returning: 0 (column 1)
* Returning: zone_ph_d2_batiment_01_porte_01 (column 0)
* Returning: 0 (column 1)
Vérifie voir que tu exécutes bien ton script et que ça écrit bien qq chose dans les logs
Ahhhh voila qui est mieux déjà.
j'ai des logs. il me reste une erreur sur le premier code de Lv4.

Çà progresse merci beaucoup !

Code:
NWNX MySQL Plugin V.0.0.9
(c) 2007 by Ingmar Stieger (Papillon)
(c) 2008 by virusman
visit us at http://www.nwnx.org
(built using mysql-5.0.27 source)

* Log level set to 2 (everything)
o SCO located at 78f440.
o RCO located at 78f090.
* Hooking successful
* Connecting to server localhost
* Plugin initialized.
* Registering under function class SQL
* Executing: select id from players where account='toto' and fname='lui' and lname='moi'
* Executing: insert into players(account,fname,lname,key) values('toto', 'lui', 'moi', 'KA46DGHR')
! SQL Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'key) values('toto', 'lui', 'moi', 'KA25D89R')' at line 1 (1064).
* Executing: select last_insert_id()
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés