Localisation permanente

Répondre
Partager Rechercher
Désolé si la question à déjà été posée, mais on ne peut pas faire de recherche, ca complique beaucoup.

J'essaie de garder de manière permanente la localisation du PJ, pour qu'il apparaisse au dernier endroit, même après reboot. Le problème c'est qu'il semble que sur le OnClientLeave du module, il ne soit plus possible de l'obtenir. L'objet récupéré est tronqué. Est-il possible de contourner ce problème sans passer par le OnHeartBeat du module?
Elle fait ch... cette recherche défaillante, ça devient ingérable ici. La vocation de ce forum est corrompue et il devient inexploitable !

Bon maintenant que ma mauvaise humeur est dirigée pour la journée, je me calme et je réponds...

Quel système de persistance utilises-tu ?

Mais de toute façon, basiquement, la réponse est "oui, mais ça revient au même et l'OHB du module reste la solution la plus simple et efficace".
Et bien désolé... Donne-moi un lien alors!
J'utilise NWNX2, mais je demande pas comment faire. Je demande juste si on peut éviter le OnHeartBeat.
Sur le changement de zone j'y ai pensé, mais je sais pas trop.... car cela veut dire apparaître chaque fois à l'entrée de zone!
Si tu veux faire des sauvegardes régulièrement espacées et non dépendantes de la bonne volonté du PJ, il n'y a que deux solutions : le OHB du module ou une pseudo-récursivité par DelayCommand().
Tu peux à la rigueur permettre en plus la sauvegarde au joueur par le biais d'un objet ou d'un menu.

Si tu veux voir ce que le second système permet et impose, je t'invite à visiter mon module. (Cf ma signature). Personnellement, si j'avais à le refaire, j'utiliserais l'OHB plutôt que ce que j'ai fait.

PS: ma mauvaise humeur n'est pas dirigée contre toi, mais contre le néant qui guette ce forum.
__________________
[Fr] Legundas - Les Jardins d'Oustandie.
Liberté totale de jeu dans le respect des autres
Bientôt sept ans d'existence
connexion directe pour jouer
Pas de hakpack requis. Seulement NWN + SoU + HotU. Version 1.69

Notre forum
si le Néant guette ce forum, alors Loreval est la solution ..
sinon, le fait d'exporter son perso ne le sauve pas sur le serveur ?
parce que sinon l'interface est toute trouvée ..

tu pourrais aussi utiliser le OnClientEnter du module ..
La sauvegarde du personnage par la GUI-NWN ne fait qu'exporter une copie du personnage en .BIC dans le local vault du joueur qui d'ailleurs sera vite encombré. Pour sauvegarder dans le servervault du serveur, c'est ExportAllCharacters() (pour TOUS les PJ sur le serveur) ou la nouvelle fonction ExportSingleCharacter() (pour un seul PJ désigné nommément).
Cela dit, avec NWNX2, il faut recourir à d'autres choses, de la même manière que si on stocke les infos sur un objet non droppable, il faut mettre à jour régulièrement les infos stockées. D'où les appels récursifs ou l'OHB du module.
Système de localisation du perso sur Oriel :
(avec un système d'antideco-reco)

Sur le OnClientEnter :

Code PHP:

#include "pv_loc_inc"
void main()
{
object oPJ GetEnteringObject();
GetLocPvPJ(oPJ);

Sur le OnModuleLoad :

Code PHP:

#include "pv_loc_inc"
void main()
{
float fDelay 30.0//Temps en secondes entre deux sauvegardes
   
SetLocPJ(fDelay);

L'include : pv_loc_inc

Code PHP:

void SetLocPJ(float fDelay);
void GetLocPvPJ(object oPJ);
void SetPvPJ(object oPJ);

void SetLocPJ(float fDelay)
{
object oPJ GetFirstPC();
string sArea;
location lLoc;

while(
GetIsObjectValid(oPJ) )
{
lLoc GetLocation(oPJ);
sArea GetTag(GetArea(oPJ) );

SetCampaignLocation("SAVEPJ","LocPJ",lLoc,oPJ);
SetPvPJ(oPJ);
oPJ GetNextPC();
}
DelayCommand(fDelay,SetLocPJ(fDelay) );
}

void SetPvPJ(object oPJ)
{
int nPv;
int mPv GetMaxHitPoints(oPJ);
int cPv GetCurrentHitPoints(oPJ);


nPv mPv cPv;
SetCampaignInt"SAVEPJ" ,"PvsPJ",nPv,oPJ);
}


void GetLocPvPJ(object oPJ)
{
int iPv GetCampaignInt("SAVEPJ","PvsPJ",oPJ);
location lLoc GetCampaignLocation("SAVEPJ","LocPJ",oPJ);

if(
iPv 0)
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDamage(iPv,DAMAGE_TYPE_DIVINE),oPJ);

DelayCommand(50.0,AssignCommand(oPJ,JumpToLocation(lLoc) ) );


Je cherche justement un moyen de sauvegarder les personnages de mes joueurs sur mon module, mais j'ai une petite machine, alors j'ai besoin que ce soit le moins gourmand possible. J'ai peur qu'une sauvegarde de tous les joueurs toutes les 30 sec (si j'ai bien compris ton script Camélia) ce soit un peu lourd... Je me trompe ?

Sinon, est-ce que éventuellement un système qui save les persos (avec leur position, etc.) quand ils sortent du module, additionné d'un objet pour qu'ils sauvegardent eux meme quand ils le souhaite, ce ne serait pas moins lourds ? (et faisable surtout...)

Merci d'avance.
[QUOTE=Camelia d'Oriel]Système de localisation du perso sur Oriel :
(avec un système d'antideco-reco)

Sur le OnClientEnter :

Code PHP:

#include "pv_loc_inc"
void main()
{
object oPJ GetEnteringObject();
GetLocPvPJ(oPJ);

Il refuse de me compiler ce script Camelia, il me met UNDEFINED IDENTIFIER
Tu n'as pas du créer le script : pv_loc_inc. Celui que t'as donné Camelia (Cf code deux ou trois posts ci-dessus) et dont un include est effectué.

Voici le code du script : pv_loc_inc

Code PHP:

void SetLocPJ(float fDelay); 
void GetLocPvPJ(object oPJ); 
void SetPvPJ(object oPJ); 

void SetLocPJ(float fDelay

object oPJ GetFirstPC(); 
string sArea
location lLoc

while(
GetIsObjectValid(oPJ) ) 

lLoc GetLocation(oPJ); 
sArea GetTag(GetArea(oPJ) ); 

SetCampaignLocation("SAVEPJ","LocPJ",lLoc,oPJ); 
SetPvPJ(oPJ); 
oPJ GetNextPC(); 

DelayCommand(fDelay,SetLocPJ(fDelay) ); 


void SetPvPJ(object oPJ

int nPv
int mPv GetMaxHitPoints(oPJ); 
int cPv GetCurrentHitPoints(oPJ); 


nPv mPv cPv
SetCampaignInt"SAVEPJ" ,"PvsPJ",nPv,oPJ); 



void GetLocPvPJ(object oPJ

int iPv GetCampaignInt("SAVEPJ","PvsPJ",oPJ); 
location lLoc GetCampaignLocation("SAVEPJ","LocPJ",oPJ); 

if(
iPv 0
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDamage(iPv,DAMAGE_TYPE_DIVINE),oPJ); 

DelayCommand(50.0,AssignCommand(oPJ,JumpToLocation(lLoc) ) ); 


Normal car il n'y a pas de fonction main dedans. Ajoute le pour voir si cela compile puis enlève le. (Cf. code post précédent)

Ton problème je pense vient du fait que tu n'as pas compilé tous tes scripts et que l'include n'est donc pas pris en compte. Sous Aurora, va dans l'onglet 'créer' puis 'créer module' et coche les cases 'Compiler' et 'Scripts'. Clique ensuite sur créer pour que tous tes scripts se compilent.
Bon alors j'ai fait tout ce que tu m'a proposé, et ça ne compile toujours pas.

En fait ce qui est bizarre, c'est que le script avec SetLoc se compresse, alors que celui avec GetLoc ne se compresse pas. Alors que les 2 ont l'include.

ok, bon ben j'allais vous faire toute une tartine parce que ça compilais tjs pas, mais en fait je viens de me rendre compte que j'avais oublié toute une partie du script pv_loc_inc.

Tout ce qui était après le
Code PHP:

SetCampaignInt"SAVEPJ" ,"PvsPJ",nPv,oPJ); 

pour être précis, car cela n'apparaissait pas sur mon écran du fofo... *se tape la tête contre le mur* Bon, ben merci BEAUUUUUCOUP, et désolé pour tout ces désagrément....
Y a juste un truc qui me chiffonne avec les localisations permanentes, c'est que lorsque le serveur Reboot, tu vas donc reapparaitre a l'endroit ou tu etais a la derniere sauvegarde ok.

Imagines maintenant, tu es en groupe avec 3 ou 4 camarades dans une zone pleines de monstres, vous arrivez difficilement a les tuer tous en restant en vie. Badaboum... le serveur plante. Plusieurs joueurs du groupe vu l'heure tardive en profitent pour aller dodoter. Tu te reconnectes et donc tu arrives dans la zone pleines de monstres mais cette fois ci, le hic c'est que vous etes plus que 2 et il y a tout plein de monstre... Argh ... mort assurée!!!!
lol
Completement d'accord, mais j'ai l'impression que ce genre de truc est souvent oublié...

Et franchement j'aimerais pas reapparaitre dans une zone pleine de monstres parce que le serveur a rebooté
Alors une sauvegarde de la position du PJ n'est pas forcement suffisante et interressante.
Il faudrait pouvoir svg soit le dernier endroit sans danger, soit permettre au PJ de choisir a la reco l'endroit ou il veut aller (dernier lieu ou il etait, ou derniere svg provoque par le PJ sans un lieu non dangereux )
Je suis pas sur qu'en cas de crash serveur ton PJ ai le temps d'aller dans une zone sans risque pour sauvegarder ...
Puis tu reboot pas sans prévenir les joueurs qui sont dessus ...c'est la moindre des choses que de les laisser se mettre à l'abri.
Citation :
Publié par Camelia d'Oriel
Je suis pas sur qu'en cas de crash serveur ton PJ ai le temps d'aller dans une zone sans risque pour sauvegarder ...
Exactement... Donc du coup quand tu reviens tu reapparais au millieux de plein de monstre... ca me parait moyen
Répondre

Connectés sur ce fil

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