Bienvenue sur JeuxOnLine - MMO, MMORPG et MOBA !
Les sites de JeuxOnLine...
 

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

[Monde Persistant] PWUM, Location et infos du PJ ?

Par Jaha Effect le 5/2/2003 à 4:31:09 (#3173309)

J'utilise PWUM (PUMA) depuis quelques temps et j'en suis très content excepte pour une chose qui me titille.
Comment sauvegarder la position d'un joueur quand il quitte la partie et comment sauvegarder son nombre de points de vie ?
Mon problème de location se résumant par le fait que si un perso se retrouve en taule, il n'ai pas juste besoin de déco / reco pour en sortir.
Le nombre de point de vie du perso pour éviter qu'il ne déco et reco avec son max de point de vie alors qu'il était en fâcheuse position avant de déconnecter.
Ces deux questions se posant dans le cas d'un reboot serveur.
Merci d'avance :)

Jaha Effect :D

Par Gadjio le 5/2/2003 à 9:39:19 (#3173792)

Je remets pour plus de clarté de ce que j'ai posté sur l'autre thread :

Provient du message de Iridian
Il doit sûrement y avoir une bonne raison pour ne pas avoir mis le script dans le onExit, reste a voir si avec les changements de versions de nwn certaines choses n'ont pas été corrigé.


Là ça me surprend beaucoup, ce que dit Rat, parce que chez moi le GetLocation(GetExitingObject) dans le onClientLeave du module, ça renvoie une location vide (une area ", et 0.0 dans les trois vecteurs). Visiblement l'objet est détruit dès sa déconnexion, et plus moyen d'accéder aux informations qui le concernait (c'est très frustrant ;)).

Du coup, le timewarp dont parle Taern devient très gênant, puisqu'il survient à chaque déco/reco, même si le serveur n'a pas été rebooté entre deux. Or dans le cas normal (sans ResumePCLocation), le serveur stocke bien la position et la restore au retour du joueur s'il n'y a pas eu de reboot.

J'ai commencé par contourner le désagrément (faute de mieux) en passant les sauvegardes de position à la fréquence de 30 secondes (au lieu de 300s), ça ne posait pas trop de problèmes vu la rapidité de la fonction de sauvegarde, mais le log a vite enflé et je me retrouvais avec 2,5 mb de logs tous les jours (que le PUMA digérait très bien, au passage :) même si dans ces cas là il rame pendant trente secondes en donnant l'air d'être planté).

Actuellement, je note le "numéro" de ma session dans une variable persistante incrémentée à chaque reboot et je ne lance ResumePCLocation que si la location sauvée appartient à une session strictement inférieure (autrement dit, je ne Resume pas s'il n'y a pas eu de reboot, vu que le jeu le gère très bien de lui-même, et sans time warp). Inconvénient, je dois sauver le numéro de session avec chaque sauvegarde de position (mais je pense pouvoir gérer ça par la date d'expiration des variables, en la comparant à la date de reboot du module... je verrai bien).

Bref, dans mon cas c'est loin d'être aussi simple qu'il n'y paraît. Donc si vous avez quelque chose de plus optimal, je prends. ;)

______________

Pour le problème que tu évoques, tu dois pouvoir te fier à la sauvegarde régulière des positions effectuée par LocationTimer() qui est exécuté de façon circulaire toutes les 300s (par défaut). Eventuellement, s'il y a un reboot prévu et qu'un personnage est en prison depuis moins de 300s, tu peux forcer l'appel de la fonction de sauvegarde en "avançant" l'heure du jeu, avec le DM helper notamment (ça joue sur les DelayCommand en attente).

Mais j'imagine que la solution réside effectivement dans le onClientLeaving... je vais refaire quelques tests (mais c'est mieux d'être deux, pour tester ça ;)).

Par Jaha Effect le 5/2/2003 à 9:49:46 (#3173836)

Moi je privilégierais peut être une autre piste qui est le OnExit d'une zone mais pour ça il reste à savoir si le fait de quitter la partie dans une zone implique que le OnExit de la zone fonctionne sur lui.
Auquel cas ça réglerais le problème.

Jaha Effect :D

Par Jaha Effect le 5/2/2003 à 10:02:53 (#3173885)

Visiblement après test, avec

SetPCToSaveLocation(oClient);

Ca marche pas, même sur le OnExit de la zone, je nage complet là...

Jaha Effect :D

Par eMRaistlin le 5/2/2003 à 10:36:37 (#3174036)

L'inconvenient, c'est que le OnExit est aussi declenche, mais comme l'objet n'est plus la, les fonctions qui l'interrogent n fonctionnent que partiellement (je dirait pas fontionnent pas du tout, mais presque.)


La meilleur solution, a mon avis, c'est de fabriquer l'etat toi-même, et de le stocker sur le module, en l'associant au nom du PJ...

Mais pour recuperer une position... c'est mort... Désolé...

La c'est carrément 1 km

Par Blam le 5/2/2003 à 10:37:28 (#3174043)

au dessus de mes capacités, mais vous m'interressez car même si je me suis pas encore penché sur ce problème, je l'ai avec mon monde.

Donc dans la mesure du possible essayez d'être très clair si vous apportez une vraie solution.


Merci

Par Gadjio le 5/2/2003 à 10:55:30 (#3174123)

Eventuellement tu peux gérer tes prisons en cas particulier si nécessaire (par exemple forcer la sauvegarde de position sur le onEnter de la prison... au pire un évadé sera timewarpé à l'intérieur si ça plante à ce moment là). Sinon, le LocationTimer n'est pas si mauvais, les cas de reboot moins de 5 min après une mise en prison ne doivent pas être si fréquents (bien sûr, si le joueur déco juste quand tu viens de le mettre en cage et qu'il attend un reboot pour reco, tu l'as dans l'os... mais c'est vicieux, non ?). Après, je te conseille de ne pas lancer ResumePCLocation s'il n'y a pas eu de reboot depuis la dernière connexion du PJ, ça évite les timewarp "gratuits" (si mon premier post était pas clair, dis-le, je préciserai).

Pour les PV, la seule solution serait sans doute un log très régulier (genre sur le onHeartbeat, ou avec un Delay recurrent assez court), mais d'une part ça va charger ton serveur d'appels de fonctions pas très optimisés (boucles sur tous les PJ à chaque fois), d'autre part ton log va faire 10km de long... Et ça restera très approximatif. Il faudrait un événement "onPlayerDamaged" dans le module... :/

Un problème auquel je ne repense que maintenant : le ResumePCLocation peut "buguer" dans certains cas, à cause du lag réseau. En gros, il exécute le onClientEnter en même temps qu'il charge la zone de la start location (celle où on apparaît quand on crée un perso), et si ce chargement est un peu trop long (plus de 2s par défaut), le perso va être téléporté à son ancienne position (ResumePCLocation), puis retéléporté à la start location... J'ai corrigé ça en différant de quelques secondes de plus la téléportation de ResumePCLocation, ça ne semble plus buguer.

Par Jaha Effect le 13/2/2003 à 0:54:43 (#3227062)

Allez hop un coup de latte pour remonter le post :)

Jaha Effect :D

Par Verchanal le 13/2/2003 à 2:41:39 (#3227497)

De toute façon, la plus part des projets que je connais de prés compteront des joueurs plutot triés sur le volet et connus (vu qu'il y a un password. Donc le petit malin qui est en prison et qui se ballade, il va sa faire remarquer vu que les deux, trois ou 4 dm savent tous qu'il ne devrait pas etre là.

Par contre, la situation s'inverse, je suis d'accord pour ceux qui comptent avoir 30 ou 50 personnes chez eux (et qui ont un gros pc...:))

Par Archamedes_Fr le 13/2/2003 à 4:05:09 (#3227686)

Ca dans le OnClientLeave


#include "pwum_functions"

void main()
{
object oClient = GetExitingObject();

SetPCToSaveLocation(oClient);
}


Et une "compilation" complète du module.
Chez moi ça marche très bien...

Par RAT le 13/2/2003 à 4:15:16 (#3227702)

Provient du message de Archamedes_Fr
Ca dans le OnClientLeave


#include "pwum_functions"

void main()
{
object oClient = GetExitingObject();

SetPCToSaveLocation(oClient);
}


Et une "compilation" complète du module.
Chez moi ça marche très bien...


Quand je vous dis que chez moi ca marche aussi. Je ne suis pas fou lol, je me sens moins seul la , Merci Archamedes_fr.


Par contre, pour répondre à mon ami Jaha, c'est tout simple pour la prison ayant fait un système de prison en utilisant le PWUM.

Tu flagues le joueur s'il doit etre en prison soit par un integer si tu utilises des waypoints par exemples , soit par un flague Loc en lui donnant un nom bien précis.

Sur le ClientEnter du module, si le flague n'est pas vide alors cela veut dire que c'est un prisonnier, l'ayant flaguer alors il retourne automatiquement à sa localisation. Bon mon système fait pire que ca, mais bon je te donne une idée parmi tant d'autre :):D.

PS: Merci Archamedes_fr pour être passer sur mon forum de rôliste :p.

Bon allez je vais aller dormir a demain :).

Dsl aussi, si je suis un peu moins présent mais je suis en train de terminer d'installer mes nouveaux sites :) donc j'ai du faire une pause niveau scripting :p.


RAT

Par Archamedes_Fr le 13/2/2003 à 4:27:51 (#3227724)

Provient du message de RAT
Quand je vous dis que chez moi ca marche aussi. Je ne suis pas fou lol, je me sens moins seul la , Merci Archamedes_fr.

Mon ti nom c'est Archa. :D
Après tout ce que tu as déjà fait indirectement pour mon module, je ne pouvais laisser une telle injustice sans crier la vérité haut et fort.

Provient du message de RAT
PS: Merci Archamedes_fr pour être passer sur mon forum de rôliste :p.

Très bon au passage.

Provient du message de RAT
Bon allez je vais aller dormir a demain :).RAT

Bonne nuit.

Moi aussi d'ailleurs...

_________________
Archamedes

( oupsss )

Par eMRaistlin le 13/2/2003 à 9:45:12 (#3228395)

^
|--------- : This is no spam....











....well, maybe it is :D

Par Gadjio le 14/2/2003 à 0:50:26 (#3234306)

Après une série de tests, même si je crée un module avec juste un ptit "WriteTimestampedLogEntry" de la location du GetExitingObject, dans onExit de la zone et onClientLeave du module, ça ne marche pas. :/

En gros, la ligne de log est correcte pour les changements de zone (appel à onExit de l'area sans que le client quitte le jeu), mais dès que le client quitte, ça appelle effectivement onClientLeave et onExit (dans cet ordre, d'ailleurs), ça écrit bien une "timestamped log entry", ça écrit bien une location, mais la position est vide, ça me donne un 0.000000 0.0000000 0.000000 avec " comme area... :(

Le pire c'est que GetName fonctionne, mais GetLocation, GetPosition et GetArea, pas moyen, rien à faire. Alors Rat, soit tu m'héberges mon serveur, soit tu me donnes ton truc pour que ça marche ! ;):)

Par RAT le 14/2/2003 à 1:27:10 (#3234452)

Lool héberger ton serveur cela risque d'être dur car mon PC n'est pas une affaire crois moi :D :). Par contre que je te donne une explication à cette affaire, essaye de faire un truc du genre créé un module tout simple, importe le PWUM, met le ResumePCLocation() et compile ton module . Et test pour voir si cela passe :)

et après on verra bien , faisons étape par étape :)

Par Gadjio le 14/2/2003 à 1:53:37 (#3234530)

Mais je fais que çaaaa ! depuis le débuuuuuut ! *bouh* :( (:D)

Je viens de créer un module tout neuf.
J'ai fait "importer puma.erf", j'ai mis les pwum module load et pwum client enter, j'ai mis la sauvegarde de location dans le onClientLeave, et ma position n'a pas été sauvegardée. :monstre:
Le ResumePCLocation appelle la location vide et ne me téléporte donc pas, bref, ça bug toujours autant.

Le log contient ça, justement :
(...)

...[Fri Feb 14 01:39:21] Gyrdengaard Joined as Player 1
.......[Fri Feb 14 01:40:30] Gyrdengaard Left as a Player (0 players left)
[Fri Feb 14 01:40:31] LOC#GadCurrentLocation#* 0.000000000* 0.000000000* 0.000000000* 174.291244507*#121000000#0#0#
.[Fri Feb 14 01:40:40] Gyrdengaard Joined as Player 1
...[Fri Feb 14 01:41:12] Gyrdengaard Left as a Player (0 players left)
[Fri Feb 14 01:41:12] LOC#GadCurrentLocation#* 0.000000000* 0.000000000* 0.000000000* 315.963806152*#121000000#0#0#
..

(...)

Gyrdengaard c'est mon compte.
Gad c'est mon perso.
CurrentLocation c'est la variable utilisée par ResumePCLocation.
Le nom de la zone est stocké entre le # et le * (donc ya rien).
Les x, y, z de la position sont séparés par les * suivantes.
Le float d'après, c'est l'orientation (elle est enregistrée, certes, mais c'est pas génial).
Le 1210000000 et le reste, c'est pour l'expiration de la variable.

Alors, c'est quoi ton PC.. ? Je suis sûr que tu peux héberger un ptit module-qui-marche-pas-chez-moi... :p
Non, c'est louche, quand même.
Tu es sûr que ça fonctionne ? Tu as testé avec des locations ? Tu as testé en quittant le client avant le serveur ? (parce que si tu quittes le serveur, onClientLeave n'est pas appelée et ResumePCLocation utilisera la dernière location en date, celle stockée par LocationTimer, et celle là elle marche)

Bon, enfin pour l'instant ça ne me gêne pas trop, vu que j'ai contourné le problème, mais ce serait pratique pour faire des sauvegarde comme les PV courants, par exemple... :)

[edit] Oh, je viens de tester à tout hasard, les PV sont encore accessibles dans le onClientLeave. On peut donc les rétablir à la reco si on veut... :) *Va faire ça tout de suite* (Par contre la location, rien à faire :p:p)

Par RAT le 14/2/2003 à 3:23:07 (#3234743)

Provient du message de Gadjio
Mais je fais que çaaaa ! depuis le débuuuuuut ! *bouh* :( (:D)

Je viens de créer un module tout neuf.
J'ai fait "importer puma.erf", j'ai mis les pwum module load et pwum client enter, j'ai mis la sauvegarde de location dans le onClientLeave, et ma position n'a pas été sauvegardée. :monstre:
Le ResumePCLocation appelle la location vide et ne me téléporte donc pas, bref, ça bug toujours autant.

Le log contient ça, justement :
(...)

...[Fri Feb 14 01:39:21] Gyrdengaard Joined as Player 1
.......[Fri Feb 14 01:40:30] Gyrdengaard Left as a Player (0 players left)
[Fri Feb 14 01:40:31] LOC#GadCurrentLocation#* 0.000000000* 0.000000000* 0.000000000* 174.291244507*#121000000#0#0#
.[Fri Feb 14 01:40:40] Gyrdengaard Joined as Player 1
...[Fri Feb 14 01:41:12] Gyrdengaard Left as a Player (0 players left)
[Fri Feb 14 01:41:12] LOC#GadCurrentLocation#* 0.000000000* 0.000000000* 0.000000000* 315.963806152*#121000000#0#0#
..

(...)

Gyrdengaard c'est mon compte.
Gad c'est mon perso.
CurrentLocation c'est la variable utilisée par ResumePCLocation.
Le nom de la zone est stocké entre le # et le * (donc ya rien).
Les x, y, z de la position sont séparés par les * suivantes.
Le float d'après, c'est l'orientation (elle est enregistrée, certes, mais c'est pas génial).
Le 1210000000 et le reste, c'est pour l'expiration de la variable.

Alors, c'est quoi ton PC.. ? Je suis sûr que tu peux héberger un ptit module-qui-marche-pas-chez-moi... :p
Non, c'est louche, quand même.
Tu es sûr que ça fonctionne ? Tu as testé avec des locations ? Tu as testé en quittant le client avant le serveur ? (parce que si tu quittes le serveur, onClientLeave n'est pas appelée et ResumePCLocation utilisera la dernière location en date, celle stockée par LocationTimer, et celle là elle marche)

Bon, enfin pour l'instant ça ne me gêne pas trop, vu que j'ai contourné le problème, mais ce serait pratique pour faire des sauvegarde comme les PV courants, par exemple... :)

[edit] Oh, je viens de tester à tout hasard, les PV sont encore accessibles dans le onClientLeave. On peut donc les rétablir à la reco si on veut... :) *Va faire ça tout de suite* (Par contre la location, rien à faire :p:p)


Attend je pense qu'on ne doit pas trop se comprendre :D:D:D sur ce point. Moi je n'utilise pas du tout de sauvegarde persistante dans le onleave. Comme j'utilise une fonction je ne sais plus comment elle s'appelle mais je l'avais mis dans un autre post.
En tout cas, tant que ton serveur fonctionne, que tu quittes ou que tu reviens, cela te ramène automatiquement au point ou tu as quitté. Il faut peut être pensez une chose , entre l'enregistrement qui se fait en mémoire donc il arrive peut être à récuperer l'object avant de partir et l'écriture en log. Enfin là je pars en tripe lol.

Mais je vais essayer de retrouver l'autre post ou je donne la fonction , Ah vi je crois , je viens de m'en souvenir je crois que c'est SavePCToLocation (TRUE);

C'est quand même byzarre qu'on soit que deux à réussir :).

Par Cheni Poussière le 14/2/2003 à 11:17:22 (#3236100)

:rolleyes:
(coucou aussi, Baron :cool: )
Tu ne peux accéder qu'au nom du perso qui a quitté, pas à l'objet lui-même (il est déjà parti). Je te suggère trifouiller ton script pour accéder à la variable à partir du nom du joueur/pc, et pas simplement par un "SetPersistentLocation(oPC, ...) (ou SetPuma ou quoique ce soit selon ce que tu utilise ;) ). Car après tout, la variable n'est jamais véritablement stockée sur le perso, mais toujours sur un autre objet (universal mind, dans ce cas, je crois. pwdb_quote dans le cas du système de V.Santineli, etc). Donc c'est faisable, mais je reste toujours autant étonné que ça marche chez Rat et une autre personne. Ton problème me paraît bien plus "normal" que le "bug" de Rat :D
Cela dit, je suis loin d'être un fin connaisseur du pwum, mais ce que j'en ai vu me paraît fonctionner de manière très très similaire à d'autres systèmes :ange:

JOL Archives 1.0.1
@ JOL / JeuxOnLine