Bonjour,
Je viens de finir mon lecteur de maps et j'essaye d'obtenir les coordonnées d'une map à partir de son ID et inversement.
J'utilise pour cela les algorithmes des méthodes setFromMapId() et setFromCoords() de la classe WorldPoint :
Cliquez pour révéler
Cliquez pour masquer
protected function setFromMapId() : void
{
this._worldId = (this._mapId & 1073479680) >> 18;
this._x = this._mapId >> 9 & 511;
this._y = this._mapId & 511;
if((this._x & 256) == 256)
{
this._x = -(this._x & 255);
}
if((this._y & 256) == 256)
{
this._y = -(this._y & 255);
}
}
protected function setFromCoords() : void
{
if(this._x > MAP_COORDS_MAX || this._y > MAP_COORDS_MAX || this._worldId > WORLD_ID_MAX)
{
throw new JerakineError("Coordinates or world identifier out of range.");
}
else
{
var _loc1_:uint = this._worldId & 4095;
var _loc2_:uint = Math.abs(this._x) & 255;
if(this._x < 0)
{
_loc2_ = _loc2_ | 256;
}
var _loc3_:uint = Math.abs(this._y) & 255;
if(this._y < 0)
{
_loc3_ = _loc3_ | 256;
}
this._mapId = _loc1_ << 18 | _loc2_ << 9 | _loc3_;
return;
}
}
Cependant, j'ai dû louper quelque chose car ça ne me sort pas toujours les bonnes coordonnées même si des fois ça fonctionne...
J'ai remarqué que la variable mapId de ces méthodes fait en fait référence à la variable relativeId de classe Map (et non pas id !).
Premièrement, prenons un exemple qui fonctionne :
- mapId (fichier) : 73403401
- relativeId (fichier) : 73536522
- worldId (fichier) : 280
- Coordonnées trouvées : [-10,10]
- /mapid en [-10,10] : 73403401
Pour cas tout fonctionne bien donc.
En revanche, avec ce second exemple :
- mapId (fichier) : 73403911
- relativeId (fichier) : 73536008
- worldId (fichier) : 280
- Coordonnées trouvées : [-9,8]
- /mapid en [-9,8] : 135688
Le mapId renvoyé par le client sur la map [-9,8] n'est donc pas du tout celui attendu...
En plus, c'est assez perturbant car les deux mapId lus dans le fichier sont très proches (comme les maps en réalité) mais le "vrai" mapId (celui renvoyé par la commande /mapid dans le client) est très éloigné de ceux-ci.
EDIT : et encore plus perturbant, quand j'utilise le vrai mapId pour le second cas (135688) à la place du relativeId, ça me sort les bonnes coordonnées ([-9,8])... :shock:
Avez-vous une idée du problème ?