C# [Résolu] Localiser un groupe de monstres (obtenir cellId)

A

Anonymous

Invité
#1
Bonjour,

Je souhaite localiser un groupe de monstres sur une map mais le problème c'est que cellId vaut toujours 0...

Voici mon code :
Code:
case MapComplementaryInformationsDataMessage.ProtocolID: // 226 (monstres : arrivée sur la map du personnage)
	Log("[Server] MapComplementaryInformationsDataMessage");


	MapComplementaryInformationsDataMessage Mcidm = new MapComplementaryInformationsDataMessage();
	Mcidm.Deserialize(Content);


	for (int i = 0; i < Mcidm.actors.Count; i++)
	{
		GameRolePlayActorInformations Grpai = Mcidm.actors[i];

		if (Grpai.contextualId < 0) // On vérifie si c'est bien un groupe de monstres (j'ai remarqué que les groupes de monstres avaient un contextualId < 0)
		{
			Log("disposition.cellId = " + Grpai.disposition.cellId.ToString());
		}
	}
	break;
J'ai lu pb-de-recuperation-des-infos-monstre-en-rp.314/]ce sujet qui, je pense, est en rapport mais je ne comprends pas où pourrait être mon erreur...

Vous, comment faites-vous pour trouver la cellId d'un groupe de monstres ?

Merci !
 
A

Anonymous

Invité
#2
Re: Localiser un groupe de monstres (obtenir cellId)

Bienvenue,

Mauvaise section mais c'est pas grave.
En fait tu dois verifier l'id de ton protocole id.
If id_message.protocoleid = x
C'est un joeur ou c'est un monstre.
36 pour les monstres je crois

Pour ton probleme de cellid ta pas un decalage ?
 
A

Anonymous

Invité
#3
Re: Localiser un groupe de monstres (obtenir cellId)

Pour la section, je m'excuse, je ne peux poster nulle part à part ici et Questions/Réponses. Comme quelqu'un avait poster son problème ici, j'ai fais de même :? . Où dois-je poster ?
EDIT : oh ! Mais il y a un sous-forum Questions/Réponses dans chaque langage... Ok, j'ai trouvé où poster ! Encore désolé ! Un modo/admin peut déplacer mes deux sujets s'il vous plaît ?

Pour l'histoire du ProtocoleId, tu parles du même ProtocoleId que dans pb-de-recuperation-des-infos-monstre-en-rp.314/]ce sujet ?

Pour mon cellId, le problème, c'est que j'ai toujours 0 (pas de décalage, toujours un simple 0). Alors que ce n'est pas du tout ça en réalité bien sûr (c'est un nombre aléatoire entre 0 et 559).
 
A

Anonymous

Invité
#4
Re: Localiser un groupe de monstres (obtenir cellId)

Chaque class possède une variable protocoleid
 
A

Anonymous

Invité
#5
Re: Localiser un groupe de monstres (obtenir cellId)

Tu me dis :
En fait tu dois verifier l'id de ton protocole id.
Je ne comprends pas ce que tu veux me dire et pourquoi tu me le dis (pour vérifier que c'est bien un monstre ?). Je vérifie bien l'ID du message que je reçois avec le switch :
Code:
case MapComplementaryInformationsDataMessage.ProtocolID: // 226 (monstres : arrivée sur la map du personnage)
   Log("[Server] MapComplementaryInformationsDataMessage");


   MapComplementaryInformationsDataMessage Mcidm = new MapComplementaryInformationsDataMessage();
   Mcidm.Deserialize(Content);


   for (int i = 0; i < Mcidm.actors.Count; i++)
   {
      GameRolePlayActorInformations Grpai = Mcidm.actors[i];

      if (Grpai.contextualId < 0) // On vérifie si c'est bien un groupe de monstres (j'ai remarqué que les groupes de monstres avaient un contextualId < 0)
      {
         Log("disposition.cellId = " + Grpai.disposition.cellId.ToString());
      }
   }
   break;
Ici, je reçois le message MapComplementaryInformationsDataMessage qui a l'ID 226.
Et apparemment, ma théorie que si contextualId est inférieur à 0 (if (Grpai.contextualId < 0)) alors c'est un monstre est vraie, non ?

Mon vrai problème c'est de trouver l'ID de la cellule sur laquelle est le groupe de monstres pour ensuite pouvoir les attaquer en allant sur cette cellule (en déplaçant le personnage avec GameMapMovementRequestMessage et GameMapMovementConfirmMessage).
Parce que comme je l'ai dis, malheureusement, la propriété disposition.cellId de la classe GameRolePlayActorInformations semble me renvoyer toujours 0.
 
A

Anonymous

Invité
#6
Re: Localiser un groupe de monstres (obtenir cellId)

Ton code semble bon, je regarderais du côté de la désérialisation de GameRolePlayActorInformations. Ton problème semble être à cet endroit, d'après moi il ne lit pas le cell id correctement.

Étrangement, il me semble que quelqu'un avait exactement le même problème mais je n'arrive pas à me rappeler qui.. C'est probablement un bug dans les classes que tu utilises.
 
A

Anonymous

Invité
#7
Re: Localiser un groupe de monstres (obtenir cellId)

Ok, donc selon toi, le problème se situe à cette ligne :
Code:
Mcidm.Deserialize(Content);
J'utilise la DLL de Bloodwolff. Pourtant, sinon, tout fonctionne bien...

Tu me conseilles quoi ?
Regarder si le code de sa fonction est identique à celui du client officiel (genre un short à la place d'un int ou je ne sais pas quoi) ? Peut-être que ce packet a changé depuis la release de la DLL (v2.5.1) ?
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#8
Re: Localiser un groupe de monstres (obtenir cellId)

tu as trouvé pourquoi ca marche pas , c'est la DLL ---> viewtopic.php?p=9357#p9357 (et pour le coup des contextualId < 0 c'est pas toujours vrai)

bon courage pour traduire le 226 , c'est le pire
 
A

Anonymous

Invité
#9
Re: Localiser un groupe de monstres (obtenir cellId)

ToOnS a dit:
tu as trouvé pourquoi ca marche pas , c'est la DLL ---> http://cadernis.fr/viewtopic.php?p=9357#p9357 (et pour le coup des contextualId < 0 c'est pas toujours vrai)

bon courage pour traduire le 226 , c'est le pire
Aïe !

Je pense avoir trouvé... Dans les sources du client officiel, on peut lire cela :
Code:
this.contextualId = param1.readInt();
this.look = new EntityLook();
this.look.deserialize(param1);

var _loc_2:* = param1.readUnsignedShort();
this.disposition = ProtocolTypeManager.getInstance(EntityDispositionInformations, _loc_2);
this.disposition.deserialize(param1);
Voici l'équivalent dans la DLL :
Code:
this.v_contextualId = reader.readInt();
this.v_look.Deserialize(reader);

dynamic instance = ProtocolTypeManager.GetInstance(reader.readShort());
instance.Deserialize(reader);
La 1ère partie, c'est à dire pour v_contextualId et pour v_look, pas de problème, c'est la même chose.
En revanche, la 2ème partie...
  • Déjà, à aucun moment on affecte this.v_disposition. Donc même si la variable instance contient bien la cellId et tout, bah... c'est perdu puisqu'il n'y a rien après instance.Deserialize(reader); (il faudrait quelque chose comme this.v_disposition = instance;).
  • En second lieu, le client officiel lit un UShort (Unsigned Short) : param1.readUnsignedShort() alors que la DLL lit un Short : reader.readShort()
Donc forcément...

D'après vous, est-ce que mon raisonnement est correct ? Est-ce la cause du problème ?
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#10
Re: Localiser un groupe de monstres (obtenir cellId)

pour le readshort en effet ca peu poser probleme (sauf ici par un coup de chance ca depasse pas la valeur max d'un short)
je pense plutot que ca vien de la fonction appellée par protocoletypemanager qui doit avoir cellid en private ou en tout cas pas renvoyée
 
A

Anonymous

Invité
#11
Re: Localiser un groupe de monstres (obtenir cellId)

ToOnS a dit:
pour le readshort en effet ca peu poser probleme (sauf ici par un coup de chance ca depasse pas la valeur max d'un short)
je pense plutot que ca vien de la fonction appellée par protocoletypemanager qui doit avoir cellid en private ou en tout cas pas renvoyée
*Crie « OUI MOTHERFUCKER ! » IRL*

C'était bien ça ! Je résume, j'ai :
  • Décompilé la DLL
  • Modifié le code comme je l'ai dis dans mon message du dessus, c'est à dire que j'ai remplacé :
    Code:
    this.v_contextualId = reader.readInt();
    this.v_look.Deserialize(reader);
    
    dynamic instance = ProtocolTypeManager.GetInstance(reader.readShort());
    instance.Deserialize(reader);
    Par :
    Code:
    this.v_contextualId = reader.readInt();
    this.v_look.Deserialize(reader);
    
    dynamic instance = ProtocolTypeManager.GetInstance(reader.readUShort());
    instance.Deserialize(reader);
    
    this.v_disposition = instance;
  • Recompilé la DLL

Au moment de tester, le suspens est à son comble, et enfin, je vois s'afficher dans mes logs de bot :
Code:
disposition.cellId = 56
disposition.cellId = 217
disposition.cellId = 161
:D
Si vous voulez plus d'explications, allez-y, même si je vois pas trop ce que je pourrais expliquer de plus.

Problème résolu !
Je retourne sur Visual Studio, j'ai encore pas mal de trucs à coder pour avoir un bot potable :p !

Merci à tous pour m'avoir aidé !

PS : même si cellId était en privé, la valeur aurait pu être retournée.
 
A

Anonymous

Invité
#12
Re: [Résolu] Localiser un groupe de monstres (obtenir cellId

Décompilé ?
Aucun respect du travail des autre, franchement. C'est a cause des gens comme toi que les gens ne poste plus de dll.
 

ToOnS

Membre Actif
Inscrit
8 Avril 2009
Messages
974
Reactions
0
#13
Re: [Résolu] Localiser un groupe de monstres (obtenir cellId

pour une fois c'est pour la bonne cause , y'avait un bug qu'il a resolu
 
A

Anonymous

Invité
#14
Re: [Résolu] Localiser un groupe de monstres (obtenir cellId

Je suis d'accord avec ToOns, on peut pas lui reproché d'avoir résolu un bug et en plus il donne la solution
 
A

Anonymous

Invité
#15
Re: [Résolu] Localiser un groupe de monstres (obtenir cellId

lolodu92 a dit:
Décompilé ?
Aucun respect du travail des autre, franchement. C'est a cause des gens comme toi que les gens ne poste plus de dll.
Ne pas respecter le travail des autres ça serait décompiler et recompiler en mettant son propre nom dessus et éventuellement en vendant le bot (ça s'appelle le leech, mais je ne t'apprends rien). Autre caractéristique des leechers : ils ne comprennent rien, se foutent totalement du code. Je crois que ce n'est pas mon cas...

Je vais te dire pourquoi je m'intéresse aux bots :
Je joue à Dofus depuis pas mal d'années (j'ai commencé en 2007) et c'est un jeu auquel je suis très attaché. En 2009, j'ai commencé à m'intéresser à la programmation (sur le SdZ) et c'est rapidement devenu aussi important que Dofus (j'ai même arrêté pendant un temps à cause de ça).
Cela fait maintenant 2 ans que je programme en .NET et depuis environ 1 an je suis passé au C#. Pendant ces 2 années, j'ai eu l'occasion de me familiariser avec le le framework, le langage en lui même et le réseau en général (j'ai fais des applications client/serveur, etc). Je pense donc que j'ai les compétences pour faire un bot un minimum potable.
Tout ça pour dire que je suis un passionné de programmation et de Dofus. Je me suis donc dis « Pourquoi ne pas mettre en relation ces deux activités ? Ça serait le pied ! ». Tout de suite, l'idée du bot a fait tilte. On en voit partout, 24h/24h. Je me suis dis que ça pourrait être intéressant de voir comment ces bêtes là fonctionnent (oui, je suis très curieux et j'aime comprendre)... Et je ne suis pas déçu !
Bref, voilà.

Merci à ToOnS et à Munkellz d'avoir pris ma défense.

EDIT : et si je peux donner à Cadernis, je donnerai à Cadernis... Je ne suis pas là comme un noob leecher. Je suis là pour apprendre sur un forum qui m'a l'air très sympathique et qui, je pense, a du potentiel.
 
A

Anonymous

Invité
#16
Re: [Résolu] Localiser un groupe de monstres (obtenir cellId

Oui, c'est vrai tu as raison. Ma remarque est inutile desole.
 
A

Anonymous

Invité
#17
Re: [Résolu] Localiser un groupe de monstres (obtenir cellId

Pas grave, on oublie :) .
 
A

Anonymous

Invité
#18
Re: [Résolu] Localiser un groupe de monstres (obtenir cellId

Le sujet est résolu mais je poste quand même mon nouveau code car en effet les contextualId < 0 ne sont pas forcément des monstres.

Code:
MapComplementaryInformationsDataMessage myMapComplementaryInformationsDataMessage = new MapComplementaryInformationsDataMessage();
myMapComplementaryInformationsDataMessage.Deserialize(data);

for (int i = 0; i < myMapComplementaryInformationsDataMessage.actors.Count; i++)
{
    GameRolePlayActorInformations myGameRolePlayActorInformations = myMapComplementaryInformationsDataMessage.actors[i];

    if (myGameRolePlayActorInformations is GameRolePlayGroupMonsterInformations)
        GameRolePlayGroupMonsterInformations myGameRolePlayGroupMonsterInformations = (GameRolePlayGroupMonsterInformations)myGameRolePlayActorInformations;
}
De cette manière on est sûr que c'est un groupe de monstres et on peut accéder à toutes les informations (nombre de monstres, lvl, bonus étoiles, etc).
 
A

Anonymous

Invité
#19
Re: [Résolu] Localiser un groupe de monstres (obtenir cellId

Ya plus simple,
If protocoleid = 39 then ...
 
A

Anonymous

Invité
#20
Re: [Résolu] Localiser un groupe de monstres (obtenir cellId

lolodu92 a dit:
Ya plus simple,
If protocoleid = 39 then ...
Tu peux détailler un peu plus s'il te plaît ?
 
Haut Bas