Probleme de location

Répondre
Partager Rechercher
Bonjour,

Comme je l'avais dis une fois, j'ai fais un système de téléportation pour les mages. Cela marche tres bien un certain tps, maiis fini par bugger pour une raison inconnue.

Je m'explique :

Le mage peut memoriser une location n'importe ou dans mon module, mais une seule par zone et max 10 locations.
En memorisant je sauvegarde le nom de la zone, et la location du mage (SetLocalLocation).

J'ai remarqué qu'au bout d'un certain temps, certaines locations disparaissaient, et d'autre non. Je n'ai pas changé les zones en question, je n'ai que changer certaines zones et rajoutées d'autres. Les noms des zones ou les locations ont étés apprises, elles ne disparaissent jamais pourtant, seul les locations le font.

Si vous m'avez suivi, et que vous avez une idée la dessus, je vous ecoute. J'imagine que certains vont me demander les scripts, je les donnerais c'est juste une question de flemme. Cependant je confirme que tous les scriptes fonctionne tres bien, mais pas longtemps, et que je pense que les fonctions setlocallocation et getlocallocation doivent en faite buggées.
La question qui me vient à l'esprit concerne la sauvegarde des localisations.
Je suis encore novice sur ce genre de chose, donc ma question pourrait être mal formulée...
Sauvegardes-tu sur un item dans l'inventaire du joueur ? Ou sur une BDD ?

Tu as la flemme peut-être mais c'est vraiment mieux de poster des scripts si tu veux que des gens puissent d'aider dessus.
Je sauvegarde sur un item dans l'inventaire, je n'ais jamais su utiliser un BDD... Je mettrais les scripts si vous y tenez mais je sais que mes scripts fonctionnent, donc le probleme ne vient pas de mes script mais d'un éventuel bug sur le setlocallocation, car s'il faut ce bug n'apparaîtrait pas sur un systeme de sauvegarde par BDD.

Quoi qu'il en soit j'utilisais le system sur les objets dans mon module (sombrelune), ce qui me permettais de stocker tout un tas de données (pour ceux qui connaissaient mon module modification des caractéristiques, vitesse de déplacement...), et a ce niveau cela a toujours tres bien marché.
Quelqu'un de plus expérimenté pourra peut-être te confirmer que cette fonction bug...

Mais si j'ai bien compris, la cible de téléportation reste sélectionnable, sauf qu'au final il ne se passe rien ?

Lorsque tu auras placer tes scripts, au pire, je peux te les modifier pour tester avec la BDD BioWare, ou avec la NBDE, après tu verras bien si c'est effectivement le setlocallocation, comme tu as l'air de le dire.


***

Cf Lexicon : GetLocalLocation.

" You cannot use SetLocalLocation on a persistant PC's item because of the problems with the way locations are stored"

Or j'imagine que tu récupères la donné avec cette fonction... Donc à priori c'est l'object de setlocallocation qui déconne...
Bonjour,

Tu devrais utiliser la BDD NwN.

Elle est aussi simple a utiliser que les fonctions qui attribuent une variable à un objet.

Au lieu de mettre "SetLocalInt" par exemple, tu utilises "SetCampaignInt". Les valeurs seront stockées sur la BDD du jeu. Le soucis c'est que j'ai remarqué que sur un serveur online, a chaque reboot, si tu ne "charges" pas la dernière partie, tu perd tout.

La seule solution est de passer par une BDD. C'est pas si compliqué que ça en pratique ^^
Cette fonction ne "bugge" pas. Le problème vient de la façon dont sont stockées les positions dans NWN.
Cette fonction marche très bien si on ne touche plus au module une fois qu'on a commencé à l'exploiter. Par contre, dès qu'on rajoute des objets au contenu, c'est foutu.
La solution consiste à stocker la position dans la zone et le tag de la zone à condition que ce tag soit unique, sinon, tu vas avoir d'autres soucis. Ensuite, tu reconstruis la position à partir des données stockées. Il y a toutes les fonctions nécessaires pour ce faire.

Quant à la BDD, elle te créera le même problème. De plus, la BDD reste d"une lenteur épouvantable.
Donc si je comprends bien ton truc je prend comme object pour stocker ma location la zone concernée ? Je pensais qu'une fois le module arrêté la donnée disparaissait. La ou je ne comprends pas c'est pourquoi toutes les autres données(int, float) stockées dans un objet qui ce trouve dans l'inventaire, il n'y a pas de problèmes... Bref si tu es certain de toi, je verrais.
Je vois plutôt dans sa réponse un système qui stocke ta position comme n'importe quelle autre variable.

La différence ce n'est pas que tu stocke la donnée de position mais des coordonnées et un TAG de map. En fait tu stocke plusieurs variables.

En script il te faut trouver les coordonnées en X et Y de la position du joueur dans la map ( en float je suppose ? ). Map dont tu choppe le TAG sous forme de string.

Tu stocke ces trois variables et quand on se reconnecte, tu fais une fonction qui te spawne sur la map aux coordonnées enregistrées.
Attention si au cours d'une mise à jour la map est modifiée : un PJ enregistré au milieu d'une plaine pourrait se voir téléporté dans un placeable ou un élément de décor rajouté à cet endroit.
Ce que j'avais fait c'est un placeable qui stockait les maps modifiées (entre deux mises à jour, on rajoutait les tags à la main en LocalString). Les sauvegardes dans les maps modifiées n'étaient pas prises en compte pour éviter les téléportations bizarres.
Si tu as le temps kermo de me donner la marche a suivre pour stocker les variables, par contre je ne changerais pas les zones, ou très faiblement, donc cela ne me posera pas de problèmes.

si je prends le lexicon :

Code PHP:

void main()
{
     
object oThis OBJECT_SELF;
     
string sKey “foo”;
     
object oArea GetArea(OBJECT_SELF);
     
vector vPosition Vector(0.00.00.0);
     
location lValue Location(oAreavPosition0.0);
     
SetLocalLocation(oThissKeylValue);

mais que dois je utiliser comme object pour stocker les données ? comment m'y prendre ? la je flanche un peu...
La solution proposée est, d'après ce que j'ai compris, de stocker sur un objet les variables de la position plutôt que la position elle-même.
La première étape est de récupérer toutes les variables constituant la position: zone, constituant du vecteur. Donc au lieu de faire SetLocalLocation, enregistre ces variables sur un objet (oObject) possédé par le PJ:

Enregistrment de la zone :
- SetLocalString(oObject,"zone",GeTag(GetArea(oPJ)))

Enregistrement de la position :

vector vPositionPJ=GetPosition(oPJ);
float xPositionPJ=vPositionPJ.x;
float yPositionPJ=vPositionPJ.y;
float zPositionPJ=vPositionPJ.z;
SetLocalFloat(oObject,"x",xPositionPJ);
SetLocalFloat(oObject,"y",yPositionPJ);
SetLocalFloat(oObject,"z",zPositionPJ);

Après, tu peux récupérer chacune de ces données, reconstituer le vecteur avec la fonction vector et donc reconstituer la position et l'utiliser pour téléporter le PJ.

EDIT: bien-sûr, il y a vait une erreur, le "string" est GetTag(GetArea(oPJ))
Donc en un premier temps j'ai fait cette commande pour sauvegarder la location :

Code PHP:

void SaveLocation(object oPCobject oAmustring sTPValide// oPC le joueur, oAmu l'objet ou sont stockées les variables, sTPValide c'est juste pour savoir s'il peut dans cette zone.
{
     
vector vPositionPJ GetPosition(oPC);
     
float  xPositionPJ vPositionPJ.x;
     
float  yPositionPJ vPositionPJ.y;
     
float  zPositionPJ vPositionPJ.z;
     
float        fFace GetFacing(oPC);
     
SetLocalString(oAmu,sTPValide+"zone",GetTag(GetArea(oPC)));
     
SetLocalFloat (oAmu,sTPValide+"x",xPositionPJ);
     
SetLocalFloat (oAmu,sTPValide+"y",yPositionPJ);
     
SetLocalFloat (oAmu,sTPValide+"z",zPositionPJ);
     
SetLocalFloat (oAmu,sTPValide+"f",fFace);

Ensuite pour recuperer je n'y arrive pas car impossible de trouver la zone, je ne sais pas comment m'y prendre...

Code PHP:

     string      sZone GetLocalString(oAmu,sLoc+"zone");
     
float xPositionPJ GetLocalFloat (oAmu,sLoc+"x");
     
float yPositionPJ GetLocalFloat (oAmu,sLoc+"y");
     
float zPositionPJ GetLocalFloat (oAmu,sLoc+"z");
     
float       fFace GetLocalFloat (oAmu,sLoc+"f");
     
vector       vVec Vector(xPositionPJyPositionPJzPositionPJ);
     
location     lLoc Location(zone?, vVecfFace); 
En effet dans le commande "location", il veut un object qui est la zone, et je ne peut stocker qu'un string non ?

Si quelqu'un peut m'éclairer, le lexicon reste vague, et je ne maîtrise pas bien l'affaire. je m'y prend certainement mal...
Si tu veux ta map sous forme d'objet il te faut quelque chose du genre

Code:
object oZone = GetObjectByTag("sZone");
Tu déclares simplement un object avec pour tag la valeur du string
Répondre

Connectés sur ce fil

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