Sauvegarde de Position OnExit

Répondre
Partager Rechercher
Bonjour,

je cherche a faire en sorte que la position des joueurs soit sauvé (grace a la BDD bioware) lorsqu'ils quittent le module pour permettre de les replacer au meme endroit lorsqu'il reviennent.
Hors ca marche pas, c'est très pénible voila le script que je met sur le OnClientLeave:

Code PHP:

void main()
{
    
object oPC GetExitingObject();
    
string sPlayerLocation "Kra_PlayerLocation";
    
string sLoc "VAR_LOCATION";
    
location lPJ GetLocation(oPC);
    
SetCampaignLocation(sPlayerLocationsLoclPJoPC);

Mon problème c'est que j'ai meme pas le fichier BDD qui se créé, ou est l'erreur c'est ma première tentative d'utilisation de la BDD.

Note: je n'ai pas SOU, je suis en 1.30 beta.

Merci,
Nono le vil
Un GetExitingObject() ne marche que pour les areas, pas pour le module voyons !

Morale, utilise le OHB ou le script mis dans le OnRest du module. Pour le OHB, j'ai fait le script que tu cherches, il est ici .

a+

Prince Nexus
Et bien non, Mercius te donne les equivalences, fo juste retaper les fonctions SetCampaign (beurk) a la place des SetPersistent (ah !) de meme pour les GetCampaign. Les declarations sont les memes mais dans un ordre different (la aussi, je comprends pas pkoi Biobio ne les ait pas mis dans le meme ordre que ses fonctions Get/SetLocal...)

J'ajoute qu'en plus, svgder les donnees quand le client quitte le module ne marcherait pas dans le cas d'un plantage donc meme si Biobio se decide a faire marcher cette fonction sur le OnClientLeave, ca ne changerait rien.

Prince Nexus.

P.S. : passe a nwnx2, c'est mieux, franchement !
je suis en train de changer tout ca.
Quand j'aurais finis je posterais tout ca si ca interresse du monde.
Ben la bdd de bioware me plait mieux dans le sens ou j'ai pas envi d'avoir une bdd compliquée a mettre en place, je lance mon truc et hop des set campaign et voila, surtout que c'est juste pour la location des Pj pour l'instant ca me suffit amplement.
1 question sauver régulièrement la position de tous les PJ grace a OnHeartBeat ca va pas faire ramer le machin?

et pour aller les chercher sur la vault j'en ai pas vu qui me conviennent et je préfère les faire ca m'apprend des tas de choses (avant de m'attaquer a ce truc j'airais eu l'idée de faire un script d'include).
Bon j'ai modifié les scripts pour aller avec la BDD bioware, j'ai vérifié mon fichier de BDD, et cette fois les valeurs sont sauvés.
Le problème qu'il reste c'est que rien n'est restitué au PJ je reprend au point de départ par défaut avec toute ma vie (sauf la première que je me connecte avec un perso ou je suis a 0 point de vie).
Voici mon script d'include:

Code PHP:

//::///////////////////////////////////////////////
//:: Name inc_liloxp_bio
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*  Ces fonctions permettent de sauvegarder les
points de vie, la location et les XPs des joueurs
avec le systme Bioware.
La location est sauve dans une table "lilo" .
Modifie par Nono le vil depuis le script cree par Prince Nexus, avec l'aide de MERCIUS

*/
//:://////////////////////////////////////////////
//:: Created By:  Prince Nexus, avec l'aide de MERCIUS
//:: Created On:  12/06/2003
//:://////////////////////////////////////////////

//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();

//Nom de la BDD bioware
const string slilo "Kra_PJLoc";


void LoadPlayer(object oPC)
{
int iXPC GetXP(oPC);
  if(
GetIsPC(oPC) && !GetIsDM(oPC) && iXPC!= 0)
  {
   
int iptlife GetCampaignInt(slilo"currentPtLife"oPC);
   
int iXP GetCampaignInt(slilo"currentXP"oPC);
   
location llocation GetCampaignLocation(slilo"currentLoc"oPC);
   
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.0, AssignCommand(oPC, JumpToLocation(llocation)));
   
AssignCommand(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);
  
SetCampaignInt(slilo"currentPtLife"iHPCurrentoPC);
  }
}



void SavePlayer(object oPC)
{
 if(
GetIsPC(oPC) && !GetIsDM(oPC))
 {
  
int iHPCurrent GetCurrentHitPoints(oPC);
  
int iXPC GetXP(oPC);
  
location llocation GetLocalLocation(oPC,"currentLoc");
  
SetCampaignInt(slilo"currentPtLife"iHPCurrentoPC);
  
SetCampaignLocation(slilo"currentLoc"llocationoPC); //sauvegarde de la location
  
SetCampaignInt(slilo"currentXP" ,iXPCoPC);
 }
}

void SaveAllPlayers()
{
  
object oPC GetFirstPC();

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

    
oPC GetNextPC();
  }

puis le OnHeartBeat:

Code PHP:

#include "inc_liloxp_bio"

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);

Enfin mon OnEnter:

Code PHP:

#include "inc_liloxp_bio"

void main()
{
    
object oPC GetEnteringObject();
    
LoadPlayer(oPC);

voila si un pro pouvait m'expliquer ou ca coince ca serait fort sympathique (j'ai mal au crane...alors claire les explications svp )
Ben oui mais dans ce cas la, ma position est sauvé grave au OnHeartBeat (et au repos aussi), et j'ai regarde mon .dbf contient une location pour mon perso, mais quand je ré-entre avec un perso sur mon module je me retrouve toujours au starting point et non a la loc sauvé dans la base, c'est bien la le pb.
Oui, c'est normal. J'ai fait ce code en fait en pensant un peu trop a mon module et ses regles...

En fait, dans le LoadPlayer, si tu regardes bien, j'ai mis que si il s'agit d'un newbie, on enregistre ses carac et c'est tout. Donc pas de JumpToLocation pour le newbie.

Tu peux donc supprimer la distinction de cas
Code PHP:

iXPC==0 et iXPC!=
Sinon, les regles de mon module, c'est pas de perte d'XP au lvl1 et le joueur en arrivant, apres passage par un guide recoit 1 pt d'experience, ce qui permet de le distinguer du newbie qui n'est encore jamais passe par mon module (et plein d'autres trucs mais la secret defense !).

Quand a la surcharge que represente l'utilisation du OHB dans propriete module, je t'indique ici que tu peux choisir l'intervalle entre les sauvegardes :
Code PHP:

  // la tu peux personnaliser le temps entre chaque save
  // 10 => 10 * 6 secondes = 1 minute
  
if (player_hb_counter >= 10) {
    
player_hb_counter 0;
    
SaveAllPlayers();
  } 
Donc si ca te bouffe trop de charge CPU, passe de 10 a un nombre plus grand...

Prince Nexus.

P.S. : je te conseille ce LoadPlayer la :
Code PHP:


void LoadPlayer
(object oPC)
{
  if(
GetIsPC(oPC) && !GetIsDM(oPC) )
  {
   
int iptlife GetCampaignInt(slilo"currentPtLife"oPC);
   
int iXP GetCampaignInt(slilo"currentXP"oPC);
   
location llocation GetCampaignLocation(slilo"currentLoc"oPC);
   
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 :
     
SetLocalLocation(oPC,"currentLoc",llocation);
   
// assigner les variables au joueur
   // DelayCommand(5.0, AssignCommand(oPC, JumpToLocation(llocation)));
   
AssignCommand(oPCJumpToLocation(llocation))
   
AssignCommand(oPCApplyEffectToObject(DURATION_TYPE_INSTANTeDamageoPC));
   
GiveXPToCreature(oPC,iXPadjust);
  }

Bon j'ai lu les post de ce topic et effectivement vous m'aidez beaucoup dans mon "entreprise". Mais un problème reste.

Dans le OHB, si on ne veut pas surcharger le CPU de la machine, on est obligé d'espacer les tests et les sauvegardes.

Ce qui fait que en cas de crach server, il est fort probable que lors de la reconnection le pj ne se retrouve pas du tout ou il etait. Y a t il une possibilite de sauvegarder sa position en cas de crash server ?

Raistling

PS : Zunder, tu m'as laisser un bien jolie boxon a debuger et sans aucune indication...
désolé pour le titre de départ (qui reflétai ma pensée du moment)

Bon j'ai enlevé les conditions qui ne servaient a rien mais par contre je ne comprend pas pourquoi ma commande jumptolocation ne marche toujours pas. En effet je me retrouve toujours au lieux de départ le pj n'est pas renvoyé a sa dernière position, je comprend pas pourquoi la commande JumpToLocation ne fonctionne pas....

Pour les points de vie c'est OK je me retrouve bien avec les point de vie avant de quitter
pour le pj qui n'est pas teleporté. J'ai eut le meme probleme avec mon script. Je n'etais téléportée que quelquefois. Apparemment je crois que cela vient de la rapidité de lecture de la bdd de bioware.
Tu peux réduire les probs en faisant un delaycommand de ton jumptolocation. Mais meme comme ca, j'avais encore des problemes. Bizarrement tout c'est réglé quand je suis passée a NWNX. En fait, le seul avantage de la bdd de Bioware est de pouvoir stocker des objets...
__________________
..::Heavenlynet le net paradisiaque ::..
http://gw.heaven-ly.net/images/stories/divers/sigfg042.gif
Allez, on se lance, quelques phrases mechantes :

voila pourquoi je n'attends pas la version 1.30 avec impatience (au contraire meme, rien qu'a l'idee de revoir mon placeable.2da et le hack de placeable correspondant, ca me donne des nausees). Pourquoi n'ont ils pas choisi Mysql ???!!!

Enfin, heuresement qu'il y a des gens qui font tout pour rattraper les erreurs de Biobio. Et pour le stockage d'objet, Nwnx2 le fait tres bien...

Bref passe a Nwnx2 et oublie les BDD Bioware. Mysql a fait son chemin en matiere de BDD, ce n'est pas le cas de celle de Bioware. A mon avis, les deconvenues avec leur BDD seront nombreuses, je prevois meme que pour des gros modules persistants, elle ne tiendra pas !

Prince Nexus.

P.S. : Pour les defenseurs de Bioware, je connais vos arguments et je respecte le travail qui m'a permis de jouer au meilleur JdR sur PC, mais qui aime bien, chatie bien !
(ca reste une sacrée option, le stock des objets )


Sinon, oui, ca vient du manque de DelayCommand : l'instruction lui est donné lors du load du client, et tant que l'objet PC n'est pas 100% chargé, il n'accepte pas les AssignCommand.

Un test simple :

Sur le OnEnterClient :
Code PHP:

void main()
{
object oPC GetEnteringObject();
int nNb 0;

while (
nNb 150)
    {
    
DelayCommand(nNb/10,AssignCommand(oPC,SpeakString(IntToString(nNb))));
    
nNb ++;
    }

theoriquement (enfin, a moi, ca le faisait), tu devrait constater simplement dans la barre de dialogue que le PC ne commence pas a compter a 0, mais apres (chez moi, 10s, mais j'ai un gros hakpak...)
Citation :
Provient du message de Prince Nexus
Pourquoi n'ont ils pas choisi Mysql ???!!!
Ben le jeu n'etais au depart pas prevu pour ca. D'apres ce que j'ai lut sur les forums, ils voulaient garder l'utilisation d'une BDD aussi simple que possible (pas de mise en place de serveurs etc...). Il n'empeche qu'il n'ya a pas beaucoup de compagnie qui ajouterais ce genre de fonctionnalité a leur jeu.

Citation :
Et pour le stockage d'objet, Nwnx2 le fait tres bien...
Uh ?
__________________
..::Heavenlynet le net paradisiaque ::..
http://gw.heaven-ly.net/images/stories/divers/sigfg042.gif
Citation :
Provient du message de Rhyghar
Uh ?
Uh ?!

Ben oui, nwnx le fait, c'est pas miraculeux ca aussi ?

Quand a l'histoire de serveur, je n'en n'ai pas un mais j'utilise quand meme nwnx... Je vois pas ou est le probleme.

Mais en revenant au sujet, il est dommage de Loader le joueur tout de suite quand il entre. Je m'explique : dans le cas ou le serveur n'a pas plante, il a pu sauvegarde l'integralite du joueur (inventaire compris, le journal etant malheuresement efface) et donc si le joueur se reconnecte, il ira a la position a laquelle il etait en quittant.
Bref, vo mieux faire un sas ou se trouvera le Starting Point avec un portail, et quand le joueur click sur le portail, il est loader. Dans les modules, ils sont appeles, prologue, antichambre, preliminaire...
Citation :
Provient du message de Prince Nexus

Ben oui, nwnx le fait, c'est pas miraculeux ca aussi ?
Comment tu fais ?

Citation :
Quand a l'histoire de serveur, je n'en n'ai pas un mais j'utilise quand meme nwnx... Je vois pas ou est le probleme.
Tu utilises bien l'ODBC de ta machine non ?
__________________
..::Heavenlynet le net paradisiaque ::..
http://gw.heaven-ly.net/images/stories/divers/sigfg042.gif
ah ok je comprend !
En fait non, là tu ne sauvegarde pas d'objets dans la BDD mais un string contenant le blueprint de l'objet.

Moi je te parle de sauvegarder des objets (items et creatures) directement dans la BDD tels qu'ils sont dans le jeu. C'est dire qu'avec la bdd de bioware, un type qui vient et qui pose son item dans le coffre (meme si cet item n'existe pas dans la palette de module) pourra le recuperer plus tard.
__________________
..::Heavenlynet le net paradisiaque ::..
http://gw.heaven-ly.net/images/stories/divers/sigfg042.gif
Et la différence entre NWNX et Bioware, c'est que dans un cas tu peux l'utiliser sans avoir besoin de toucher à quoique ce soit, alors que dans l'autre, non.
C'est évident que Bioware n'allait jamais choisir une base de donnée MySQL.
Bon après plusieurs essai j'ai surtout l'impression que ca marche pas leur truc, le delai commande ne change rien je me retrouve au point de départ, je viens de regarder la tronche que ca avait avec WBrose ca me met un entier la dedans, pfff un beau merdier pour un truc tout simple.
Répondre

Connectés sur ce fil

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