C/C++ Par où commencer ?

Inscrit
1 Mars 2014
Messages
120
Reactions
0
#1
Salut,

Je voudrai me faire un petit bot en socket avec un ami pour comprendre un peu le fonctionnement de ceux-ci. On sait faire du C/C++ mais par contre on ne sait pas trop pas où commencer. J'ai lu quelques tutos sur le forum, notamment sur le protocole de D2 mais j'arrive pas vraiment à me lancer.

Je voudrais savoir si quelqu'un peut au moins me faire une petite liste des objets fondamentaux à coder et leur utilité.
On bosse sous linux si ça peut vous aider à m'aider ^^.

Merci beaucoup d'avoir pris le temps de me lire :)
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#2
Bon, déjà, lis un peu mon tout nouveau tuto sur la communication si ce n'est pas encore fait (il est dans ma signature).
Après, télécharge un décompilateur comme JPEXS pour ouvrir les sources.
Ensuite, utilise par exemple wireshark pour comprendre sur quelques exemples comment le code du jeu marche.
Puis, crée un convertisseur de sources pour convertir tes class D. d'actionscript vers C/C++.
Enfin, code un faux client qui gère tout ça, plus une AI pour jouer à ta place.
Quand tu auras fini, profite !
 
Inscrit
1 Mars 2014
Messages
120
Reactions
0
#3
Ok merci de ta réponse rapide.
Je vais lire ton tuto qui a l'air vraiment bien fait. Sinon au niveau des sources à analyser, je dois m'orienter vers quels fichiers ? Je suis vraiment un noob dans la prog de bots pour D, c'est mon premier ^^
 
Inscrit
1 Mars 2014
Messages
120
Reactions
0
#5
Merci beaucoup je regarde tous ça et je reviens vers vous quand j'aurai des questions :).
Hésitez pas à me donner encore des conseils si vous en avez !
 
A

Anonymous

Invité
#6
Labo a dit:
Puis, crée un convertisseur de sources pour convertir tes class D. d'actionscript vers C/C++.
Je trouve que c'est un peu chaud pour commencer. À mon avis il vaut mieux que tu traduise à la main quelques classes pour démarrer, afin de pouvoir entrer rapidement dans le vif du sujet. Comme ça tu te familiarisera avec le protocole et tu verras si ça te plait ou pas, parce que créer un bot socket ne se fera pas en deux jours.

Mais si vous avez la motivation pour passer du temps sur un convertisseur avant de vraiment exploiter le protocole, faites-le !
 
Inscrit
1 Mars 2014
Messages
120
Reactions
0
#7
Tu sais faire des projets dur en peu de temps ça me connais, mais je sais bien que je vais y passer du temps et j'ai la motiv en plus donc pas de problème. Après je pense faire les classes à la main oui.
Sinon vous avez pas une idée des classes fondamentales à coder ? Histoire de bien partir, les erreurs à éviter ?
 
A

Anonymous

Invité
#8
La base de la base c'est un reader/writer big endian, et le décodage/encodage de messages dans un bytestream (souvent une socket).
Après il va falloir t'attaquer à la partie identification, il y a maintenant pas mal d'explications sur le forum et Munrek a sorti un bout de code qui t'aidera sûrement beaucoup : viewtopic.php?p=15776#p15776.

Surtout organise bien ton code, car on début tu ne traites que 10 messages, mais à la fin ton bot en traitera des centaines différents. Il faut donc éviter les gros switch difficiles à maintenir, par exemple lors du "routage" d'un message vers le code qui le traite.
 
Inscrit
1 Mars 2014
Messages
120
Reactions
0
#9
Salut, je reviens vous voir !

J'ai commencé avec des amis à sniffer les paquets de D. mais je me demande à quoi sert de décompiler le code du jeu en fait ^^ ? C'est peut être une question con mais la dans l'immédiat je vois pas trop :/

Si vous pouvez m'expliquer l’intérêt.

Merci de votre aide.
 

Labo

Membre Actif
Inscrit
16 Aout 2013
Messages
799
Reactions
15
#10
Sans le code du jeu, tu ne peux pas comprendre le contenu des paquets !

Par exemple, dans mon tuto, pour arriver à "comprendre" ce que disent les messages du serveur, je regarde la source contenant l'id correspondant, et de là, je déduis ce que contient mon paquet. Sinon, je me retrouve avec une séquence de chiffres hexa sans aucun sens.
 
Inscrit
1 Mars 2014
Messages
120
Reactions
0
#11
Hum d'accord donc dans un premier temps le nom de la méthode t'aide à comprendre le but du paquet et ensuite son code te permet de comprendre l'utilité des bits ? C'est ça ?
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#12
A priori si tu as un peu de base tu pourrait facilement créer un traducteur avancé mais pour commencer pour comprendre le fonctionnement et envoyer tes premiers paquets fait le a la main et cherche a quoi correspond chaque ID manuellement (CF tuto maxilia).
 
Inscrit
1 Mars 2014
Messages
120
Reactions
0
#13
Ouai en C/C++ (et meme ASM) on est pas mal avec mes amis (on est en école d'ingénieur informatique ^^) mais faire un traducteur ça doit pas etre simple quand même.
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#14
Oui sa demande tout de même de la réflexion pour faire un truc propre et pouvoir mettre sa a jour facilement. Je recommande la création d'un dictionnaire avancé.
 
Inscrit
1 Mars 2014
Messages
120
Reactions
0
#15
La j'ai par exemple sniffer un paquet d'un message sur le chat (canal commerce) qui a cette tronche :

Code:
0dc5540500356a6520646566696520746f7574206c65206d6f6e646520212072656a6f69676e657a206d6f6920656e207b6d61702c352c312c327d5329e96e0008786438706b34306c00456a700004436f616803011301
les 14 premiers bits me donne l'ID 881 donc je décompile D. et je trouve ce code qui me semble pas mal :

Code:
public function deserializeAs_ChatServerMessage(param1:IDataInput) : void {
         super.deserialize(param1);
         this.senderId = param1.readInt();
         this.senderName = param1.readUTF();
         this.senderAccountId = param1.readInt();
      }
Donc j'en conclu qu'on a dans notre paquet (partie data) :
- sur 2 premiers octets (enfin 14 bits) l'id du paquet
- sur les 4 octets suivants l'id de l'envoyeur
- sur les suivants une chaine UTF-8 avec les 2 premier octets la taille de la chaine suivit de la chaine
- les 4 octets suivants l'id du compte de l'envoyeur

Déjà j'espère être bon. Mais je ne pense pas car je trouve en ID de personnage 1 409 613 877 (bon pourquoi pas ça même si ca me semble énorme ^^) mais surtout en taille de chaine UTF-8 je trouve 27 237 ! Et la je suis sûr que c'est pas bon. Qu'est ce que j'ai mal compris ?

Merci de votre patience et de votre aide :D !
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#16
Bravo donc tu as déjà bien compris le systèmes des messages. Par contre tu as parsé les autres données comme l'id or ce n'est pas la meme methode. Je ne vais pas te mentir, je ne m'y connais pas trop en parsing de data, j'utilise la classe de BiM, mais demain soir je te donnerais la methode exacte, soit patient ;)
 
Inscrit
1 Mars 2014
Messages
120
Reactions
0
#17
Merci beaucoup !!! J'attends ta réponse alors (et si tu peux me toucher un mot sur la classe de BiM aussi ?)
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
149
#19
Code:
uint header = reader.ReadUShort();
            uint id = header >> 2;

            int length = 0;

            switch (header & 3)
            {
                case 1:
                    length = reader.ReadByte();
                    break;
                case 2:
                    length = reader.ReadUShort();
                    break;
                case 3:
                    length = (reader.ReadByte() << 16) + (reader.ReadByte() << 8) + reader.ReadByte();
                    break;
            }

            byte[] data = (length > 0) ? reader.ReadBytes(length) : new byte[] { };
Donc voila, les 2 premiers octets -> ID paquet
ensuite tu as la taille du paquet et après tu peux faire les reads du paquet.
 
Inscrit
1 Mars 2014
Messages
120
Reactions
0
#20
Si je comprends bien ton exemple :

dans la variable header (uint) je met les deux premiers octets de mon paquet. Je récupère l'id de ce paquet en gardant les 14 premier bits (décalage de deux bits vers la droite du header).
Ensuite suivant la valeur de header & 3 (pourquoi 3 ^^ ?) je calcul ma longueur.
Dans le cas 1 je lis mal longueur sur 1 octet (mais je la lis à partir d'ou ? Du 3octets càd de l'octet suivant ceux du header ?).
Dans le cas 2 je lit sur 2 octets et dans le cas 3 c'est le premier octet décalé de 16 puis le second (ou le meme ?) décalé de 8 et enfin une derniere lecture.

Merci en tout cas !
 
Haut Bas