Je cherche a connaitre la position du pj lors de sa deconnexion

Répondre
Partager Rechercher
Bonjour,
je cherche depuis quelques temps a sauvegarder la position d'un joueur avant sa déconnexion. L'un d'entre vous pourrais il m'expliquer pourquoi l'objet que l'on récupère dans l'évènement onClientLeave du module, n'est plus a proprement parler dans le jeu, et encore moins un pj. D'apres mes tests c'est effectivement un objet de type personnage, mais rien de plus.

PS je récupère cet objet par la fonction GetExitingObject()

Merci d'avance.
C'est toujours le meme principe : un evenement ne peut pas etre declenché avant de s'etre reellement produit.

Hors, tant que le Pj a une position, il est en jeu. S'il quitte le jeu, il n'y est plus, il n'a donc plus de position.

Il parait toutefois que certains arrivenet a avoir le script qui s'execute si rapidmeent que l'Objet est encore en jeu (RAT et acha, a priori). Personellement, je n'y arrive pas...
Vivi j'avoue que j'y arrive bien, et c'est en compilant le module entièrement

*3h00 de compil sur le module officiel :/*

Et en utilisant une fonction du PUMA que je mets dans le Onleave.

Comme le fait de bloquer un pnj qui meurt et qui décide de se déco/reco, mais bon ça tout le monde y arrive enfin je crois lol.
c'est le fait de compiler entièrement le module qui permet cela O_o

un peu étrange comme explication.
Je ne me suis jamais penché sur le sujet, mais ce serait pas mal de trouver exatctement ce qui permet ou non l'utilisation de la fonction GetLastExitingObject

Citation :
Et en utilisant une fonction du PUMA que je mets dans le Onleave.
quelle fonction ? tu peux mettre le corp, s'il n'est pas trop long ?

J'avoue que j'aimerais vraiment réussir à cerner le sujet, l'utilisation d'un OnClientLeave qui marche simplifirait infiniment de nombreux scripts...
Selon moi, la question n'est pas seulement que "ca marche" ou que "ca marche pas", mais de savoir pourquoi.

Immaginez la scène : un gros module persistant remplis de scripts bien complexes (ben... 4eage a tout hasard ^^), utilisant le GetLastExitingObject dans le OnClientLeave. Tout marche bien, c'est parfait, la vie est belle. Puis on fait une petite mise a jour du module, et la d'un coup sa marche plus o_o alors que toute la gestion des pj est basée sur leurs entrées/sorties dans le module. Je n'ose même pas immaginer la merde que sa peux provoquer, et je ne me lancerais jamais la dedant sans savoir avec PRECISION quel est le phénomène qui rend possible (ou impossible) l'utilisation du GetLastExitingObject.

vala, donc si quelqu'un à quelque chose à ajouter sur le sujet, moi je suis pret à m'investir un peu pour en savoir plus (d'ailleur, je vous laisse, je file faire des essais ^^)
Citation :
Provient du message de RAT
Vivi j'avoue que j'y arrive bien, et c'est en compilant le module entièrement

*3h00 de compil sur le module officiel :/*
Qu'est ce que tu appelles compiler entièrement le module exactement ?
Bon, j'ai trouvé quelques trucs, qui tout téféchis sont des évidences.

Après testes avec GetLastExitingObject dans le OnClientLeave, il s'est avéré que :

- Le script est lancé APRES que le joueur ai déconnecté, mais AVANT que l'objet pj soit détruit.

DONC : (avec oCreature = GetLastExitingObject() )
- GetIsPC(oCreature) = FALSE
- GetObjectType(oCreature) = 1 (soit OBJECT_TYPE_CREATURE)
- GetLocation(oCreature) = location invalide
- GetArea(oCreature) = Area invalide
- Toutes les informations en variables locales sur la creature sont conservées

voila, je pense que j'ai dit le principal

ATTENTION !!!!!
Ces testes ne marchent QU'EN MULTIJOUEUR !!! si vous lancez un module en solo, j'ai l'impression que le OnClientLeave n'est même pas executé. Si vous voulez tester vos scripts, vous pouvez facilement lancer un server dédié et y jouer en LAN sur la même machine

bon, bien si vous avez des trucs a ajouter, allez y

Citation :
Qu'est ce que tu appelles compiler entièrement le module exactement ?
dans outil, ca doit s'appeller "compiler le module" ou un truc comme ca. Il vérifie toutes les liens entre les blueprints, les zones, et compile tout les scripts. Indipensable avant tout lancement d'un module
Citation :
Provient du message de Azrael07
DONC : (avec oCreature = GetLastExitingObject() )
- GetIsPC(oCreature) = FALSE
- GetObjectType(oCreature) = 1 (soit OBJECT_TYPE_CREATURE)
- GetLocation(oCreature) = location invalide
- GetArea(oCreature) = Area invalide
- Toutes les informations en variables locales sur la creature sont conservées

voila, je pense que j'ai dit le principal
Donc un Set/GetLocalLocation devrait fonctionner?

Jaha Effect
Citation :
Donc un Set/GetLocalLocation devrait fonctionner?
Oui, MAIS :

le probleme n'est pas dans le GetLocalLocation, mais le GetLocation, pour pouvoir le Set apres

En effet : s'il declenche le OnClientLeave, il a au prealable declenché le OnAreaExit, car il a quitté l'area.

Or, il ne va pas dans une nouvelle area : il n'est donc plus dans une area. Donc la location de l'objet est invalid : ce n'est plus qu'une reference objet, auxquelles sont attachées les variable, mais qui n'as plus de position, ni d'inventaire (ce qui m'epate, vu que l'objet est toujours la, mais bon).

Le plus embetant, dans l'affaire, c'est le GetIsPC() qui rammene non. Ca, c'est nul... Ca m'a d'ailleurs géné longtemps, avant que je Set une local Int dans le OnEnterClient qui dise : GetLocalInt(oPC,"PC")==TRUE. Du coup, tu peux faire un Get sur le OnClientLeave, qui verifie si c'est un PC.

Bricole' powaaa, mais bon, quand il faut, il faut...


PS : a noter que l'objet est bien conserve quelque part, vu que si tu cree, par exemple un PJ avec le nom X, que tu le deplace dans le serveur, puis que tu quitte, que tu recree un Pj avec le même nom STRICTEMENT, tu va effectuer ta premiere connexion avec ce nouveau PC à l'endroit ou avait quitté l'ancien : il a associé ca avec le nom du PC, et l'a conservé pendant la cession... Etonant... non ?
Citation :
Le plus embetant, dans l'affaire, c'est le GetIsPC() qui rammene non.
O_o

i don't understand la... si le script ce déclanche, c'est forcement un pc de toutes facons non ? (aie non, c'est vrai, ca peut être un dm :/ vi en effet c'est un problème de taille)

Citation :
PS : a noter que l'objet est bien conserve quelque part, vu que si tu cree, par exemple un PJ avec le nom X, que tu le deplace dans le serveur, puis que tu quitte, que tu recree un Pj avec le même nom STRICTEMENT, tu va effectuer ta premiere connexion avec ce nouveau PC à l'endroit ou avait quitté l'ancien : il a associé ca avec le nom du PC, et l'a conservé pendant la cession... Etonant... non ?
bien... essaye de mettre de coté l'objet du joueur, puis de voir s'il existe toujours si celui ci n'est plus la.
Tu peux aussi essayer d'enregistrer l'objet, deco/reco, et voir si c'est toujours le même.

Bon, moi j'ai passé mon aprem a des tests en tout genre, donc je ferais pas ca today ^^
Deja je tiens a vous remercier pour votre aide abondante. Ca me rassure de voir que je suis pas le seul a avoir le problème. J'ai moi aussi fait pas mal de test avant de poser la question en ce lieu. J'ai remarque que le onExiting sur les area ne permet pas non plus de disposer de la position du joueur. et que le dit joueur est lui aussi plus vraiment un joueur. Ca correspond bien au fait que le joueur ne soit plus en jeu. Puisque le serveur sauve la position du PJ avant sa déconnexion. Il doit être possible de récupérer cela.

Savez vous comment je pourrais faire pour connaitre la liste des variables associer a un objet ?
Citation :
Savez vous comment je pourrais faire pour connaitre la liste des variables associer a un objet ?
aahhhhhhhhhhhhh si c'était possible...... vous immaginez un peu, avoir accet a TOUTES les variables d'un objet.....

bon, on arrete de réver et on reste réaliste : c'est malheureusement pas possible, tu n'as accet qu'aux variables auquelles les fonction te donnent accet, et celle que tu as crées toi même avec du SetLocal*

Citation :
Deja je tiens a vous remercier pour votre aide abondante
ouarf, bientot je vais passer pour un saint. Est ce que j'ai la tête d'un saint moi

Gniarf gniarf, preend pas tout pour toi, c'était un sujet qui n'avait pas été abordé vraiment dans le fond (a ma connaissance), et nous somme X a avoir après quelque chose sur le sujet, ou X est égal au nombre de visiteur du forum - ceux qui connaissais déjà le truc (au moins je prend pas trop de risque mdr)
Répondre

Connectés sur ce fil

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