JeuxOnLineForumsPlusConnectés : 622 (sites) | 1082 (forums)Créer un compte
Forum jeux-vidéo>Neverwinter Nights
Maskado
Les forums JOL > Forum jeux-vidéo > Neverwinter Nights > NWN - Maskado > Sauvegarde de Position OnExit RSS
   
Répondre
Partager Outils Rechercher
Nonolevil
Roi
 

raaaaaaaaaaaaa

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
Lien direct vers le message - Vieux
Avatar de Prince Nexus
Prince Nexus
Roi
 
Avatar de Prince Nexus
 
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
Lien direct vers le message - Vieux
Nonolevil
Roi
 
merci je comprend mieux maintenant pourquoi ca marchais sur le OnRest. Mais dans ton post c'est fais avec NWN2x non?
hors moi j'utilise la BDD bioware ca pose pas de pb?
Lien direct vers le message - Vieux
Avatar de Prince Nexus
Prince Nexus
Roi
 
Avatar de 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 !
Lien direct vers le message - Vieux
Nonolevil
Roi
 
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.
Lien direct vers le message - Vieux
Avatar de Prince Nexus
Prince Nexus
Roi
 
Avatar de Prince Nexus
 
Sinon, cherche sur le vault, y a deja ce que tu cherches et plus encore. Arretons de taper du code alors que les autres le font pour nous !
Lien direct vers le message - Vieux
Nonolevil
Roi
 
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).
Lien direct vers le message - Vieux
Nonolevil
Roi
 
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 )
Lien direct vers le message - Vieux
Avatar de Zunzun
Zunzun
Alpha & Oméga
 
Avatar de Zunzun
 
Il n'est pas possible de choper la location a la deco de toute facon. Par contre GetExitingObject est approprié dans le OnClientLeave.
Lien direct vers le message - Vieux
Nonolevil
Roi
 
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.
Lien direct vers le message - Vieux
Avatar de Prince Nexus
Prince Nexus
Roi
 
Avatar de Prince Nexus
 
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);
  }

Lien direct vers le message - Vieux
Avatar de eMRaistlin
eMRaistlin
Alpha & Oméga
 
Avatar de eMRaistlin
 
Merci d'eviter a l'avenir les titres monosyllabiques...
Lien direct vers le message - Vieux
Avatar de Raistling
Raistling [*ame*]
Alpha & Oméga
 
Avatar de Raistling
 
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...
Lien direct vers le message - Vieux
Nonolevil
Roi
 
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
Lien direct vers le message - Vieux
Avatar de Rhyghar
Rhyghar
Dauphine
 
Avatar de Rhyghar
 
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 ::..
Lien direct vers le message - Vieux
Répondre
Les forums JOL > Forum jeux-vidéo > Neverwinter Nights > NWN - Maskado > Sauvegarde de Position OnExit
   

Outils Rechercher
Rechercher:

Recherche avancée

Les vidéos de Neverwinter Nights RSS
  • Aucune vidéo pour le moment...
Thème visuel : Fuseau horaire GMT +1. Il est actuellement 20h26.
   

© JeuxOnLine, le site des MMO, MMORPG et MOBA. Tous droits réservés. - Conditions générales d'utilisation - Conditions d'utilisation des forums - Traitement des données personnelles - ! Signaler un contenu illicite