utilisation de NWN2x : sauvegarder les points de vie du PJ et sa location

Répondre
Partager Rechercher
Salut à vous,

un sujet un peu long mais qui résume bien ma question :

Possédant NWN2x, je me demandais comment fait on pour avoir un système de scripts permettant de sauvegarder la position du joueur et ses points de vie puis qui permettrait lorsque ce joueur se reconnecte de lui assigner ses points de vie ainsi que de le téléportez vers la location sauvegardée ?

Voila , ça fait 2 semaines que je suis dessus, sans succès !
Merci d'avance pour l'aide que vous pourrez m'apporter,

Prince Nexus.

P.S. : ce sujet sera à l'ordre du jour lors de la sortie de la Data Base de Bioware.
J'ai deja fait mes scripts pour la database Bioware, la il est un peu tard je te filerai les bouts qui t'interessent demain, par contre pour NWNX, je connais pas la syntaxe des fonctions

Mais a mon avis, tu auras une réponse avant
J'ai ce qu'il te faut pour la position, mais je suis en train de faire celui pour les pvs.

Crée un script de nom biblio par exemple :
Code PHP:

#include "aps_include"

/*
CREATE TABLE player (
  playerId bigint(20) NOT NULL auto_increment,
  name varchar(255) NOT NULL default '',
  charecter varchar(255) NOT NULL default '',
  storedLoc varchar(255) NOT NULL default '',
  PRIMARY KEY (playerId)
) TYPE=MyISAM;
*/

//charge la position du joueur
void LoadPlayer(object oPC);

//sauvegarde la position d'un joueur
void SavePlayer(object oPC);

//sauvegarde les positions de tous les joueurs
void SaveAllPlayers();

void LoadPlayer(object oPC)
{
  
int rc 0;
  
string playerNamecharecterName;
  
string query;
  if (
GetIsPC(oPC))
  {
    
charecterName GetName(oPC);
    
playerName GetPCPlayerName(oPC);

    
query "SELECT playerId, storedLoc FROM player " +
               
"WHERE name='" playerName "' "+
               
"AND charecter='"charecterName +"' ";
    
SQLExecDirect(query);
    
rc SQLFirstRow();

    if (
rc == SQL_ERROR)
    {
      
      
query "INSERT INTO player (name, charecter) VALUES " +
              
"('" playerName "', '"charecterName +"')";
      
SQLExecDirect(query);
    }
    else
    {

      
SetLocalInt(oPC"playerId"StringToInt(SQLGetData(1)));


      
DelayCommand(5.0AssignCommand(oPCJumpToLocation(StringToLocation(SQLGetData(2)))));
    }
  }
}

void SavePlayer(object oPC) {
  
string query;
  
string charecterName;
  
int playerId 0;

  
playerId GetLocalInt(oPC"playerId");
  if (
playerId 0) {
    
charecterName GetName(oPC);
    
/*
    query = "UPDATE player "+
            "SET storedLoc='"+ LocationToString(GetLocation(oPC)) +"' "+
            "WHERE playerId='" + IntToString(GetLocalInt(oPC, "playerId")) + "' ";
    */
    
query "UPDATE player "+
            
"SET storedLoc='"LocationToString(GetLocalLocation(oPC"currentLoc")) +"' "+
            
"WHERE playerId='" IntToString(GetLocalInt(oPC"playerId")) + "' ";
    
SQLExecDirect(query);
  }
}

void SaveAllPlayers() {
  
  
object oPC OBJECT_INVALID;

  
  
oPC GetFirstPC();

  while (
oPC != OBJECT_INVALID) {
    
PrintString("Sauvegarde des joueurs effectuee");
    
    if (
GetIsObjectValid(GetArea(oPC)) == TRUE) {

      
SavePlayer(oPC);
    }
    
    
oPC GetNextPC();
  }

Remarque : j'ai mis en commentaires la table que tu dois crée.

Ensuite ceci dans le OnHearthBeat :
Code PHP:

#include "biblio"
void main()
{

int player_hb_counter 0;



  
object oPC OBJECT_INVALID;

  
oPC GetFirstPC();
  while (
oPC != OBJECT_INVALID)
  {
    if (
GetIsObjectValid(GetArea(oPC)) == TRUE)
    {
      
SetLocalLocation(oPC"currentLoc"GetLocation(oPC));
    }
    
oPC GetNextPC();
  }
  

  
  
player_hb_counter GetLocalInt(OBJECT_SELF"player_hb_counter");
  
player_hb_counter++;

  
// la tu peux personnaliser le temps entre chaque save
  
if (player_hb_counter >= 10) {
    
player_hb_counter 0;
    
SaveAllPlayers();
  }

  
  
SetLocalInt(OBJECT_SELF"player_hb_counter"player_hb_counter);

et enfin Met les fonction adéquates dans le OnEnter et OnLeave (respectivement LoadPC(oPC) et SavePC(oPC))

PS : Pour Zunder :
- SetPersistentInt(object oPC, string sVarName, int iValue, int iExpiration=0, string sTable="pwdata");
- SetPersistentString(object oPC, string sVarName, string sValue, int iExpiration=0, string sTable="pwdata");
- SetPersistentFloat(object oPC, string sVarName, float fValue, int iExpiration=0, string sTable="pwdata");
- SetPersistentVetor(object oPC, string sVarName, vector vValue, int iExpiration=0, string sTable="pwdata");

et

- GetPersistentInt(object oPC, string sVarName, string sTable="pwdata");
- GetPersistentString(object oPC, string sVarName, string sTable="pwdata");
- GetPersistentFloat(object oPC, string sVarName, string sTable="pwdata");
- GetPersistentVector(object oPC, string sVarName, string sTable="pwdata");

et puis il y a les autres fonctions pour jouer avec les tables mysql

Bon boulot merci beaucoup. Si je peux me permettre, il faut ajouter un test pour savoir si le joueur est un DM ou non.

Pour le script des points de vie, j'utilise une "Amulette de Vie" pour savoir si le joueur est mort ou non. Mais il faut ajouter à cela le stockage des pts de vie en persistant.

Ce qui m'ennuie dans ton script, c'est qu'il utilise OnHeartBeat : pour ma machine et tous les placeables qu'il y a sur mes maps ça risque d'être trop lourd à gèrer. C'est pourquoi j'essaie d'adopter un système sur le OnPlayerRest plutot. Le problème, c'est qu'il marche seulement quand le PJ se repose jusqu'au bout sans interruption. Enfin j'ajoute encore que les fonctions de l'aps_include permettent d'avoir acces à la location avec un Set/GetPersitantLocation.

Prince Nexus.
Le ohb est a mon avis une bonne alternative, la avec le script qu'il te donne ca ne sauvera que toutes les minutes, et tu peux encore augmenter.
Si le ohb existe, c'est pout qu'on s'en serve, le tout c'est de pas en abuser.
moi j'utilise ça pour mon module (450 scripts, 6 Mo, et environ 60 zones) et ça ne lag pas du tout, et ne prend pas trop le CPU. Je vais essayer "d'agrandir" le systeme pour la save des pvs.
Par contre autre question : est ce que l'inventaire du pj, ou ses lvls s'il en passe, sont sauvegardés?
La je peux te répondre sans même hésiter : OUI ! et dieu merci car sinon personne ne jouerait à Nwn. Mais tu peux stocker son nombre d'XP, c'est vrai que ça serait très utile meme : le nombre de fois où le joueur pleure passk'il a passé un level et qu'en suite le serveur ait planté et qu'il ne puisse pas le récupérer...

Tu me donnes une idée : utiliser ton système pour gèrer la location, les points de vie et les XPs des joueurs... (pour l'inventaire faut pas exagérer quand même : beaucoup trop lourd la...)

Prince Nexus
ça me rassure. Mais qq chose me chiffonne : pourquoi bioware n'a pas tout de suite fait une "sauvegarde automatique" du perso? je veux dire que les fiches persos stockées sur le serveur soient automatiquement mises à jour lors d'une deco, et toutes les x minutes, sans pour autant faire des sauvegardes du module? ça aurait été beaucoup plus simple que de faire tout ce bazar il me semble

Edit : je voudrais ajouter aussi, c'est sauvegardé l'inventaire et l'xp même si le serveur reboot?
Pourquoi Bioware n'a pas fait tout ce que tu dis ? Eh ben tout simplement passke ça ne rentrait pas dans leur priorité pour le marketing du jeu : ils veulent qu'on joue à Nwn en solo sur notre PC : tout y est fait pour (sauvegarde des parties, etc...)

Sinon, je suis en train de taper la fonction pour sauver tout ce que tu dis : dés que j'ai fini, je la met ici.

Prince Nexus.
et voila le travail :
Code PHP:

//::///////////////////////////////////////////////
//:: Name pw_liloxp
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*  Ces fonctions permettent de sauvegarder les
points de vie, la location et les XPs des joueurs
avec le systme NWN2x.
La location est sauve pour 10 jours dans la table "lilo" (life & location).
Les xps  et les pts de vie sont sauves eternellement dans la table par
defaut "pwdata" et "lilo" reciproquement.
*/
//:://////////////////////////////////////////////
//:: Created By:  Prince Nexus, avec l'aide de MERCIUS
//:: Created On:  12/06/2003
//:://////////////////////////////////////////////
#include "aps_include"

//charge les parametres du joueur
void LoadPlayer(object oPC);

//sauvegarde les parametres d'un joueur
void SavePlayer(object oPC);

//sauvegarde les parametres de tous les joueurs
void SaveAllPlayers();



void LoadPlayer(object oPC)
{
int iXPC GetXP(oPC);
  if(
GetIsPC(oPC) && !GetIsDM(oPC) && iXPC!= 0)
  {
   
int iptlife GetPersistentInt(oPC,"currentPtLife","lilo");
   
int iXP GetPersistentInt(oPC,"currentXP");
   
location llocation GetPersistentLocation(oPC,"currentLoc","lilo");
   
int iHPCurrent GetCurrentHitPoints(oPC);
   
int iblessure iHPCurrent-iptlife;
   
int iXPadjust iXP-iXPC;
   
effect eDamage EffectDamage(iblessure,DAMAGE_TYPE_DIVINE,0);
   
//on enregistre les variables en local sur le joueur :
   
SetLocalInt(oPC,"currentPtLife",iptlife);
   
SetLocalInt(oPC,"currentXP",iXP);
   
SetLocalLocation(oPC,"currentLoc",llocation);
   
// assigner les variables au joueur
   
DelayCommand(5.0AssignCommand(oPCJumpToLocation(llocation)));
   
AssignCommand(oPCApplyEffectToObject(DURATION_TYPE_INSTANTeDamageoPC));
   
GiveXPToCreature(oPC,iXPadjust);
  }
  else if(
GetIsPC(oPC) && !GetIsDM(oPC) && iXPC == 0)
  { 
// sauvegarde des points de vie du newbie
  
int iHPCurrent GetCurrentHitPoints(oPC);
  
SetPersistentInt(oPC,"currentPtLife",iHPCurrent,"lilo");
  }
}



void SavePlayer(object oPC)
{
 if(
GetIsPC(oPC) && !GetIsDM(oPC))
 {
  
int iHPCurrent GetCurrentHitPoints(oPC);
  
int iXPC GetXP(oPC);
  
location llocation GetLocalLocation(oPC,"currentLoc");
  
SetPersistentInt(oPC,"currentPtLife",iHPCurrent,"lilo");
  
SetPersistentLocation(oPC,"currentLoc",llocation,10,"lilo"); //sauvegarde de la location pendant 10 jours
  
SetPersistentInt(oPC,"currentXP",iXPC);  
 }
}

void SaveAllPlayers()
{
  
object oPC GetFirstPC();

  while (
oPC != OBJECT_INVALID)
  {
    if (
GetIsObjectValid(GetArea(oPC)) == TRUE)
    {
      
SavePlayer(oPC);
    }

    
oPC GetNextPC();
  }

/*--------------------------------------------------------------------------------

Ensuite ceci dans le OnHearthBeat : decommenter l'include

Code PHP:

--------------------------------------------------------------------------------
//#include "pw_liloxp"

void main()
{

int player_hb_counter 0;
object oPC GetFirstPC();
  while (
oPC != OBJECT_INVALID)
  {
    if (
GetIsObjectValid(GetArea(oPC)) == TRUE)
    {
      
SetLocalLocation(oPC"currentLoc"GetLocation(oPC));
    }
    
oPC GetNextPC();
  }



  
player_hb_counter GetLocalInt(OBJECT_SELF"player_hb_counter");
  
player_hb_counter++;

  
// la tu peux personnaliser le temps entre chaque save
  
if (player_hb_counter >= 10) {
    
player_hb_counter 0;
    
SaveAllPlayers();
  }


  
SetLocalInt(OBJECT_SELF"player_hb_counter"player_hb_counter);


donc il faut creer une table "lilo" de la meme manière que la table "pwdata" dans l'aps_demo (module livré avec Nwn2x)


Prince Nexus
Répondre

Connectés sur ce fil

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