Jump to content
Sign in to follow this  
Nicky31

SumBox

Recommended Posts

SumBox

 

I/ Informations

SumBox est une sandbox* Dofus 1.29 codée en C++ à l'aide de la librairie Qt.

Elle est développée par Sgt Fatality et Nicky31, mais est totalement open source. Ainsi, n'importe qui peut apporter son aide en critiquant le code, nous fournissant des correctifs, débugs ...

Nous ne manquerons pas de les remercier.

 

* Sorte de base d'émulateur

 

 

 

II/ Statistiques

- Ohloh -

 

 

 

III/ Avancement

 

  • 1 - Serveur de connexion
    • Fait :

  • Connexion avec gestion des ips bannies, compte bannis, déjà connectés.
  • Envois des infos du compte dont le temps d'abonnement
  • Envoi de la liste des personnages
  • Fonction recherche d'amie fonctionelle
  • File d'attente gérée
  • Envoi des serveurs de jeux disponibles

 


  • A Faire :

--

 

 

  • 2 - Serveur de jeux
    • Fait :

  • File d'attente gérée
  • Envoi liste des personnages
  • Création de personnages
    • Avec génération de pseudo aléatoires

    [*] Suppression de personnages

 

 

 

IV/ Sources

- Dépôt Git -

  • Like 3

Share this post


Link to post

Comme je l'ai déjà dit, même en Cpp, je peux te faire la fonction de recherche d'ami, il n'y a rien de compliqué :P

Share this post


Link to post

n'importe qui peut apporter son aide en critiquant le code

 

Ton code il est pourri!!!! WAAAIIIIIII !!!!

 

Bref, après cet instant délire, j'vous souhaite bonne chance à tous deux pour ce projet :)

Share this post


Link to post

Tu ne penses pas que pour une application serveur il vaut mieux utiliser libevent ou asio ? Et je te conseille de partir sur un système modulaire, non de la façon que tu code.

Share this post


Link to post

Salut,

 

L'équivalent de libevent est déjà intégré dans la librairie Qt avec les signals et les slots et pareil pour asio (réseau). Qu'entends-tu par un système modulaire ? Étant donné qu'on développe une sandbox et qu'il y a juste le minimum je ne vois pas trop comment rendre plus modulable. Je veux bien des exemples.

 

Sgt Fatality

Share this post


Link to post

Quelques petites remarques pendant les 5 minutes qui m'ont permis de regarder le code.

 

Pourquoi ne pas utiliser un Switch plutôt que la tonne de 'IF' pour le parsage des packets ?

Pourquoi ne pas parser les erreurs ou les packets "non-originaux" ? Je m'explique, si quelqu'un utilise WPE par exemple

et change le packet AX1 en AXA, vous aurez une jolie erreur et fera crash votre serveur...

Share this post


Link to post

Hello,

 

Alors un switch est plus lent que if...else, par contre plus lisible, c'est bien possible qu'on l'utilise pour la partie auth. Ou alors qu'on fasse le même système "d'handling" que pour le world. Il n'y a pas non plus une "tonne" de if.

 

Concernant la vérification sur les paquets on n'y avait pas pensé, il faut qu'on réfléchisse comment implémenter ça.

 

Merci pour les commentaires,

Sgt

  • Like 1

Share this post


Link to post

Alors un switch est plus lent que if...else, par contre plus lisible, c'est bien possible qu'on l'utilise pour la partie auth. Ou alors qu'on fasse le même système "d'handling" que pour le world. Il n'y a pas non plus une "tonne" de if.

 

Concernant la vérification sur les paquets on n'y avait pas pensé, il faut qu'on réfléchisse comment implémenter ça.

 

Ce que j'entends par une tonne de 'IF', c'est le fait d'utiliser 3 if différent pour les packets "Af", "Ax" et "AX". Dans ce cas un elseif ? Mais c'est vrai que pour un serveur d'authentification, un switch est plus adapté, il n'a pas 36XXX packets à parser comme le serveur de jeu :)

 

Sinon pour la vérification, c'est ce qui a porté défaut à de nombreux serveurs sous Ancestra ou Vemu pendant certain moment, les failles de duplication, les erreurs fatales du serveur, cela vient de là généralement, l'oublie de vérification d'une variable ;)

Share this post


Link to post

Un switch c'est bien plus rapide qu'un if/else, mais de toutes façons pas possible de switch sur une chaîne de caractère en C++

 

De plus Shaak, il n'y aura absolument aucun problème si quelqu'un envoie "AXA", étant donné que QString::toUint renvoie 0 en cas d'erreur...

Share this post


Link to post

Ouais apparemment c'est très variable car le code généré par le compilateur et presque identique. De toute façon on va mettre un switch car c'est plus lisible.

Share this post


Link to post

Un switch c'est bien plus rapide qu'un if/else, mais de toutes façons pas possible de switch sur une chaîne de caractère en C++

 

De plus Shaak, il n'y aura absolument aucun problème si quelqu'un envoie "AXA", étant donné que QString::toUint renvoie 0 en cas d'erreur...

 

Autant pour moi, ne faisant pas de C++, je ne savais pas.

C'était simplement de petites remarques pour aider les développeurs si jamais le cas était vrai.

 

Mais sinon, il n'est pas possible de faire un Switch par 'char' ?

Il est toujours possible sur le serveur d'authentification de faire un switch des packets après le parsage du compte. (Af, Ax, AX), seule la deuxième lettre change, donc si ça marche, pourquoi pas.

Share this post


Link to post

Dans tous les cas t'as forcément un gain à utiliser switch, parce qu'au pire le code généré est identique et au mieux t'as une optimisation de la part du compilo.

Et si c'est possible d'utiliser des switch sur des char mais bon quel intérêt pour 3 packets

Share this post


Link to post

Dans tous les cas t'as forcément un gain à utiliser switch, parce qu'au pire le code généré est identique et au mieux t'as une optimisation de la part du compilo.

Et si c'est possible d'utiliser des switch sur des char mais bon quel intérêt pour 3 packets

 

C'est toujours plus beau de voir, et peut être plus performant pour le compilo (excusez pour l'exemple mais je le fais en C#, je pense que vous comprendrez):

switch(packet[1])
{
  case 'f':
     break;   
  case 'x':
     break;  
  case 'X':
     break;
}

 

Que

 

if(packet[1] == 'f');
else if(packet[1] == 'x');
else if(packet[1] == 'X');

 

Question d'organisation dans le code ?

 

Même pour 3 packets, c'est important pour la vue de l'intérieur, pour les personnes qui vont s'intéressés au code (même si moi je m'en fou), ça donne toujours bonne image. De plus, même personnellement, on est plus à l'aise en voyant son code "propre" plutôt que se dire que certains endroits sont dégueulasses.

Share this post


Link to post

Contrairement à vous, je préfere utiliser if/elseif

 

Avec switch, on peut faire ceci :

int i = 1;
       switch (i) {
           case 0:
               int j = 0;
               break;
           case 1:
               j = 1;
           case 2:
               j = 2;
               break;
       }

Ce code fonctionne...

Il faudrait donc écrire le switch de cette façon :

int i = 1;
       switch (i) {
           case 0: {
               int j = 0;
           } break;
           case 1: {
               int j = 1;
           } break;
           case 2: {
               int j = 2;
           } break;
       }

Mais personnellement, le break; après } me dérange un peu...

Pour case x:, ça me dérange moins mais ça me fait penser au label... :

label: for (int i = 0; i < 5; i++) {
           continue label;
       }

 

Alors qu'avec if/elseif :

int i = 1;
       if (i == 0) {
           int j = 0;
       } else if (i == 1) {
           j = 1;
       }

Ce code ne compilera pas (heuresement) et je vois pas en quoi le code est moins lisible ou mal organisé...

 

switch sur 0 et 1 : 8 lignes (+ une ligne pour int i = 0:)

if sur 0 et 1 : 5 lignes (+ une ligne pour int i = 0;)

Share this post


Link to post

Je me permet d'up le sujet pour vous dire qu'après une longue période d'inactivité le développement de SumBox redémarre peu à peu !

Ce qui a été fait :

  • Réécriture et centralisation de la réception des packets dans une classe SocketReader
  • Fixage de la récupération du temps d'abonnement
  • Envoi de la liste des personnages auth et world
  • Fonction recherche d'ami sur l'auth
  • Création de personnage avec génération de pseudo aléatoire
  • Suppression de personnage

Share this post


Link to post

Hello,

 

Bon on en pas mal avancé sur Sumbox. On peut maintenant se connecter dans le jeu mais on ne voit pas encore son personnage ^^.

La base du système de scripting (C++ et Lua) a été implémenté. Le système de commande via la console également.

 

Entre temps il y a eu une ré-organisation complète du projet et nous allons spécifier des règles pour la syntaxe du code.

 

Cordialement,

Sgt

  • Like 1

Share this post


Link to post

Bonsoir à tous,

 

Pour les personnes intéressées par SumBox ou globalement par l'émulation Dofus je vais donner un petit "cours" ce dimanche à 18h00

 

Les sujets abordés seront entre autre :

- Fonctionnement client serveur

- Les paquets, opcodes

- Hiérarchie du client, comment trouver les structures des paquets

- Fonctionnement de SumBox et de la gestion des paquets

- Comment ajouter la gestion de nouveaux paquets (on regardera comment implémenter la base du chat)

 

Je pense que le cours sera donné sur Skype (pour l'audio) et je partagerai mon écran en livestream. Je vous redirais, merci de me contacter par MP en me donnant pseudo Skype pour que je puisse vous ajouter.

 

Bonne soirée,

Sgt Fatality

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.