GTAOnline.net

San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: chneubeul le 16 Février 2014, 11:49:38

Titre: [Demande Aide] Ushort
Posté par: chneubeul le 16 Février 2014, 11:49:38
Bonjour :) Je recréé un topic afin que les personnes puisse tombés sur le sujet spécifique à ma question qui je pense devrais intéressés pas mal de scripteurs confirmés :)

J'ai regardé les sources de mapandreas afin d'en connaitre un peu plus sur le classement de données, et j'ai vu que les données ne contiennent en réalités que les positions Z codés grâce à l'utilisation de ushort

pour être plus concrés, les données sont stockés ainsi 

X+3000;
(Y-3000)*-1;
data = (Y*6000) + X;


En utilisant cet outils existe-t-il une faille au niveau des valeurs ? des limites ?

Ainsi le plugin MapAndreas ne peut ressortir que la valeur Z en fonction de X et Y mais pourrait on par exemple ressortir la position X et Y en fonction de ce chiffrages ?


[Ce topic est en relation avec mon premier topic concernant la programmation d'une IA.]


A+, Sam.
:cheers:
Titre: Re : [Demande Aide] Ushort
Posté par: Ssk le 16 Février 2014, 14:08:25
J'ai pas très bien compris ce que tu voulais, mais je vais quand même essayer de t'expliquer le fonctionnement de MapAndreas.

Alors, MapAndreas stock toute les coordonnées Z dans un tableau à une dimension, de 72000000 octets (~68.6 méga octets).

Donc, la normalement si on connait un peu le plugin MapAndreas, on va se dire mais comment un tableau à une dimension peut servir à stocker la position Z selon X et Y.
Le plus logique serai d'utiliser un tableau à deux dimension.
Oui, mais on peut quand même utiliser un tableau à une dimension pour cela car au niveau mémoire, ces deux lignes sont exactement les mêmes.

Code: (c) [Sélectionner]
unsigned short m_pPointData[6000][6000];
unsigned short m_pPointData[6000*6000];

La seule différence est la façon d'accéder aux données, par exemple pour accéder à X, Y.

Code: (c) [Sélectionner]
m_pPointData[X][Y];
m_pPointData[X * 6000 + Y]; // (Par contre Kye, a inversé X et Y) c'est pour cela qu'il multiplie Y par 6000

Il n'existe pas de faille au niveau des valeurs (si tu parle de sortir de la limite du tableau) car, juste avant il vérifie que les valeurs sont bonnes.

Code: (c) [Sélectionner]
if(X < -3000.0f || X > 3000.0f || Y > 3000.0f || Y < -3000.0f) return 0.0f;
Et ensuite ces calculs la

Code: (c) [Sélectionner]
int iGridX = ((int)X) + 3000;
int iGridY = (((int)Y) - 3000) * -1;

ne servent qu'à faire en sorte que X et Y commencent à 0 car elles peuvent être négative et permettent d'arrondir à l'inférieur, pour qu'ensuite on puisse accéder à la bonne valeur de Z dans le tableau.

Par exemple :

X = -2999.7894, sera transformé en 0
X = 1500.897, sera transformé en 4500

Y = -2.549, sera transformé en 3002.
Y = 3000, sera transformé en 0.


J'espère que j'aurai répondu à quelques une de tes question car je suis pas sûr que ce soit ce que tu ai demandé.
Titre: Re : [Demande Aide] Ushort
Posté par: chneubeul le 16 Février 2014, 14:33:02
Salut,

Merci pour ta réponse, oui c'est déjà un peu claire, surtout sur le fonctionnement, parce qu'entre le 3000 et 6000 etc.. c'est le delire x)

mais en utilisant ce principe on ne pourrait pas ressortir le X et Y ?
Titre: Re : [Demande Aide] Ushort
Posté par: Ssk le 16 Février 2014, 14:44:59
Le truc c'est qu'il y a plusieurs solution de X et Y pour un Z.
Donc on pourrai ressortir toute les positions ayant un Z particulier mais pas un seul (sauf s'il est unique)