C# Pathfinding 1.29

A

Anonymous

Invité
#1
Salut !

Donc je viens à nouveau vers vous car je me retrouve fasse à un problème assez costaud (enfin, de mon point de vue).
Je travaille sur un emulateur 1.29, j'ai réussi à gerer la connexion et tout le tralala, mais là, c'est different, le pathfinding.

Lorsque je bouge imaginons de 2cases en diagonales j'obtiens : GA001ee4
GA donc le packet de GameAction, 001 "l'identifiant" de gameaction pour le mouvement, mais je ne trouve pas de logique au ee4. C'est le trajet à ce pu comprendre de diverses sources, mais comment le convertir pour renvoyer le packet, là, je bloque..
Si vous aviez une réponse ou m'apporter, ou si d'après vous c'est tout bête et que je passe pour celui qui ne cherche pas, uniquement des petits indices pour me mettre sur la voie n_n

Merci d'avance
 
Inscrit
27 Juin 2012
Messages
238
Reactions
0
#2
Je ne sais pas du tout comment était construit les paquets en 1.29 mais en 2.0 c'est effectivement la liste des cellules sur lequel ton personnage va marcher.
Donc peut-être qu'en traduisant chaque hexa en décimal tu trouveras des identifiants de cellules ?
 
A

Anonymous

Invité
#3
Je ne pense pas, là je bouge de 2cases en diagonales et le trajet est "ee4" si je bouge d'une seule case, en avant par exemple, mon trajet aura la même longueur, ça a radicalement changé entre 1.29 & 2.0 :c
 
A

Anonymous

Invité
#5
Merci pandora, mais j'ai déjà regardé ce code, et je n'arrive pas à bien comprendre en fait.. Ce n'est pas uniquement pour faire avancer mon émulateur que je demande, c'est surtout pour en apprendre d'avantage, du style "GetEstimateDistanceBetween(lastCell, toCell) / 1.4" pourquoi diviser par 1.4 ? J'ai beau tourner la chose dans tous les sens, impossible de comprendre n_n
 
Inscrit
5 Juin 2011
Messages
38
Reactions
0
#6
Hummm au feeling la tout de suite je dirais que tu divise la longueur obtenue avec GetEstimateDistanceBetween par 1.4 pour obtenir le nombre de cells que tu traverse

EDIT: [ Maths ] => Tu as ta map, Chaque cellule est en fait un carré de longueur 1 ( osef de l'unité ) donc d'après un très vieux théorème de trigo tu déduis que la longeur de la diagonale de la cellule est égale a sqrt(1^2 + 1^2) soit sqrt(2) soit environ 1,41 voila d'où sort le 1,4

EDIT2 : Oui ca viens bien de la vue que l'on ne fait la division que lorsque les cells traversées ne sont pas sur la même ligne ( le cas d'un déplacement en diago quoi :p )
 
Inscrit
5 Juin 2011
Messages
38
Reactions
0
#8
Avec plaisir :p j'bosse aussi la dessus en ce moment x)
 
A

Anonymous

Invité
#9
Juste est-ce que c'est moi ou il s'est un peu embrouiller ?
Code:
var backCell = lastCell;
var actuelCell = lastCell;
for (var i = 1; i <= lenght; i++)
{
actuelCell = NextCell(map, actuelCell, direction);
backCell = actuelCell;
if (trigger & map.Triggers.Any(x => x.CellID == backCell))
return GetDirChar(direction) + GetCellChars(backCell) + ",0";
}
il donne une valeur à actuelCell qu'il donne du coup par la suite à backCell & utilise "GetCellChars(backCell)" alors quil a la même valeur que "actuelCell". On pourrait se passer de la variable "backCell" ici, non? ça me perturbe vachement n_n

EDIT : Pareil :
Code:
public string RemakePath()
{
var newPath = "";
var newCell = GetCellNum(strPath.Substring(strPath.Length - 2, 2));
var lastCell = startCell;
[...]
destination = GetCellNum(newPath.Substring(newPath.Length - 2, 2));
direction = GetDirNum(newPath.Substring(newPath.Length - 3, 1));
strPath = newPath;
pourquoi re-recuperer la destination alors qu'il l'a déjà stocké ? Y'a vraiment des trucs que je ne comprends pas :c
 
Inscrit
5 Juin 2011
Messages
38
Reactions
0
#10
/!\ GetCellNum(strPath.Substring(strPath.Length - 2, 2)); =! GetCellNum(newPath.Substring(newPath.Length - 2, 2));

Pour ce qui est du reste oui ça sent le truc un peu moyen ...
 
A

Anonymous

Invité
#11
Ah oui effectivement, j'ai lu un peu vite..
Sinon j'ai bien réussi merci ! En fin de compte le trajet que le client nous envoie c'est celui que l'on renvoie (enfin, il faut le vérifier mais c'est tout), j'ai plus qu'un petit problème à regler qui est que mon perso se teleporte sur les lignes droites ou en diagonales au lieu de bouger simplement \o
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#12
Faut pas compresser le pathfinding comme sur dofus 2.0 ;)
Tu l'envoi tel quel.
 
A

Anonymous

Invité
#13

je renvoie bien le chemin qu'ils m'ont envoyé (je ne m'occupe pas des obstacles ou quoi pour l'instant je verrais ça plus tard), mais mon perso se teleporte toujours :c
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#14
Regarde le nombre de cellule que tu envois, et compte les cellules que tu devrais parcourir.

Si le nombre de cellule que tu envois < nombre de cellules à parcourir, c'est que ton chemin est compressé.
 
A

Anonymous

Invité
#15
Ah d'accord je vois, en gros le client menvoie un path compressé et je lui renvoie le path avec toutes les cellules à parcourir ?
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#16
Exact, c'est facile à reconstruire. Les cellules manquantes sont celles qui ne changent pas de direction. Afin que le paquet soit plus léger.
 

Sparkdaemon

Staff
Membre du personnel
Inscrit
7 Avril 2009
Messages
556
Reactions
3
#17
J'ai toujours trouvé les techniques de pathfinding très passionnantes.
 
Haut Bas