Past 0.0.0.4 | Affichage de la map en jeu

Inscrit
25 Novembre 2015
Messages
169
Reactions
20
#1
Bonjour à tous !

Me revoilà aujourd'hui pour vous faire part de l'avancement de Past qui est maintenant en version 0.0.0.4 ! Je me suis pas mis d'accord avec skeezr concernant les versions mais j'ai fais des backup et un changelog (c'est plus un repère qu'autre chose, ça n'a pas de réel intérêt en soi) pour chaque versions que vous trouverez ici. (le changelog, pas les versions :p)

Comme vous pouvez le voir, on a dupliqué le protocole de connexion officiel dans le GameClient et sans grande surprise la map ne s'affiche toujours pas jeu.
Cependant cela nous a permis de "debug" des interfaces, elles sont visible en jeu mais pas utilisable.

Une petite vidéo pour vous montrer ce qui fonctionne en jeu : (en réalité ça fonctionne pas, mais c'est affiché, ce qui n'était pas le cas avant)


Les paquets sont envoyé dans l'ordre suivant :

Code:
using Past.Protocol;
using Past.Protocol.IO;
using Past.Protocol.Messages;
using Past.Protocol.Types;
using Past.Utils;
using System;
using System.Net.Sockets;
using Past.Network;
using Past.Protocol.Enums;
using System.Threading;

namespace Past.Network.Login
{
    public class GameClient
    {
        private Client Game { get; set; }

        public GameClient(Client client)
        {
            Game = client;
            Game_OnClientSocketConnected();
            Game.OnClientSocketClosed += Game_OnClientSocketClosed;
            Game.OnClientReceivedData += Game_OnClientReceivedData;
        }

        private void Game_OnClientSocketConnected() // Quand quelqu'un se connecte au Game
        {
            Send(new HelloGameMessage());
        }

        private void Game_OnClientSocketClosed()
        {
            Past.Network.Game.GameServer.Clients.Remove(this);
            Game.Close();
            ConsoleUtils.Write(ConsoleUtils.type.INFO, "Client disconnected from GameServer ...");
        }

        private void Game_OnClientReceivedData(byte[] data)
        {
            //read the incoming packet
            using (BigEndianReader reader = new BigEndianReader(data))
            {
                int header = reader.ReadShort();
                int id = header >> 2;
                int typeLen = header & 3;
                int length = 0;
                switch (typeLen)
                {
                    case 0:
                        break;
                    case 1:
                        length = reader.ReadByte();
                        break;
                    case 2:
                        length = reader.ReadUShort();
                        break;
                    case 3:
                        length = ((reader.ReadSByte() & 255) << 16) + ((reader.ReadByte() & 255) << 8) + (reader.ReadByte() & 255);
                        break;
                }
                ConsoleUtils.Write(ConsoleUtils.type.DEBUG, "Header {0} Id {1} TypeLen {2} Length {3}...", header, id, typeLen, length);

                if (id == 110) // AuthenticationTicketMessage
                {
                    Send(new AuthenticationTicketAcceptedMessage());
                }
                EntityLook look = new EntityLook(1, new short[] { 10 }, new int[0], new short[] { 125 }, new SubEntity[0]);
                if (id == 150) // CharactersListRequestMessage
                {
                    Send(new CharactersListMessage(false, false, new CharacterBaseInformations[] { new CharacterBaseInformations(1, "admin", 200, look, 1, false) }));
                }
                ObjectEffect effects = new ObjectEffect(1);
                ObjectItem potionrappel = new ObjectItem(63, 6965, new ObjectEffect[0], 144, 10);
                ObjectItem solomonk = new ObjectItem(6, 7143, new ObjectEffect[2], 123, 1);
                SpellItem spells = new SpellItem(1, 0, 1);

                if (id == 152) // CharacterSelectionMesage
                {
                    Send(new NotificationListMessage(new int[0]));
                    Send(new CharacterSelectedSuccessMessage(new CharacterBaseInformations(1, "admin", 200, look, 1, false)));
                    Send(new InventoryContentMessage(new ObjectItem[0], 1000000));
                    Send(new EmoteListMessage(new sbyte[0]));
                    Send(new JobDescriptionMessage(new JobDescription[0]));
                    Send(new JobExperienceMultiUpdateMessage(new JobExperience[0]));
                    Send(new AlignmentRankUpdateMessage(10, false));
                    // Send(new GuildMembershipMessage("Nameless Guild", new GuildEmblem[0], 1);
                    Send(new EnabledChannelsMessage(new sbyte[0], new sbyte[0]));
                    Send(new SpellListMessage(true, new SpellItem[0]));
                    Send(new InventoryWeightMessage(0, 5000));
                    Send(new FriendWarnOnConnectionStateMessage(true));
                    Send(new FriendWarnOnLevelGainStateMessage(true));
                    Send(new TextInformationMessage((sbyte)TextInformationTypeEnum.TEXT_INFORMATION_ERROR, 89, new string[0]));
                    Send(new StartupActionsListMessage(new StartupActionAddObject[0]));

                }
                FriendInformations friendsList = new FriendInformations("admin", 1, 0);
                IgnoredInformations ignoredList = new IgnoredInformations("admin");
                if (id == 4001) // FriendsGetListMessage
                {
                    Send(new FriendsListMessage(new FriendInformations[0]));
                }
                if (id == 5676) // IgnoredGetListMessage
                {
                    Send(new IgnoredListMessage(new IgnoredInformations[0]));
                }
                if (id == 250) // GameContextCreateRequestMessage
                {
                    Send(new BasicNoOperationMessage());
                    Send(new GameContextDestroyMessage());
                    Send(new GameContextCreateMessage((sbyte)Past.Protocol.Enums.GameContextEnum.ROLE_PLAY));
                    Send(new LifePointsRegenBeginMessage(1));
                    Send(new CurrentMapMessage(0));
                    Send(new CharacterStatsListMessage(new CharacterCharacteristicsInformations(0, 0, 0, 1000000, 0, 0, new ActorExtendedAlignmentInformations(0, 0, 0, 0, 0, 0, false), 55, 55, 0, 0, 7, 3, new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), 0, new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterBaseCharacteristic(0, 0, 0, 0), new CharacterSpellModification[0])));
                    Send(new BasicNoOperationMessage());
                    Send(new QuestListMessage(new short[0], new short[0]));
                }
                if (id == 225) // MapInformationsRequestMessage
                {
                    Send(new BasicNoOperationMessage());
                    Send(new MapComplementaryInformationsDataMessage(5120, 1, new HouseInformations[0], new GameRolePlayActorInformations[0], new InteractiveElement[0], new StatedElement[0], new MapObstacle[0], new FightCommonInformations[0]));
                    Send(new SetCharacterRestrictionsMessage(new ActorRestrictionsInformations(false, false, false, false, false, false, false, false, true, false, false, false, false, true, true, true, false, false, false, false, false)));
                }
            }
            ConsoleUtils.Write(ConsoleUtils.type.RECEIV, "{0} ...", Functions.ByteArrayToString(data));
        }
        public void Send(NetworkMessage message)
        {
            try
            {
                using (BigEndianWriter writer = new BigEndianWriter())
                {
                    message.Pack(writer);
                    Game.Send(writer.Data);
                }
                ConsoleUtils.Write(ConsoleUtils.type.SEND, "{0} to client {1}:{2} ...", message.ToString(), Game.Ip, Game.Port);
            }
            catch (Exception ex)
            {
                ConsoleUtils.Write(ConsoleUtils.type.ERROR, ex.ToString());
            }
        }
    }
}

La partie qui nous intéresse est celle contenu dans Game_OnClientReceivedData puisqu'elle permet, à la réception d'un paquet spécifié (if (id == paquetid)) exécuter un bloc de code (envoi de paquet par exemple).
L'émulateur ne gère pas le SQL, nous utilisons des arguments pour le faire fonctionner en local. Le problème se situe peut-être au niveau des arguments ?

Quoi qu'il en soit, j'ai sniffé le client officiel de Dofus 2.35 avec les logs de Mufibot afin de voir dans quel ordre sont envoyé les paquets (je parle bien d'ordre et non de timing).
J'ai donc reproduis à la lettre l'ordre d'envoi des paquets conformément aux logs de Mufibot (en passant au paquet suivant s'il n'existe pas dans le protocole de Dofus 2.0.0, par exemple des paquet pas encore implanté comme la gestion des conquêtes de guilde, puis qu'à cette version c'est les conquêtes des cités, enfin bref).

C'est à ce moment là que je me suis rendu compte que les interfaces sont maintenant visualisable, mais la map elle ne s'affiche toujours pas..
Maintenant j'ai plusieurs question à poser après cette brève introduction :

- L'ordre des paquet est-il bon ?
- Le timing d'envoi des paquets pourrait-il permettre d'afficher la map ?
- Les arguments à l'envoi des paquets sont-ils les bons ?
 
Dernière édition:
Inscrit
6 Avril 2016
Messages
85
Reactions
40
#2
client.Send(new CharacterLoadingCompleteMessage()); ? A la fin de 'Send(new StartupActionsListMessage(new StartupActionAddObject[0]));'
 
Inscrit
16 Mars 2014
Messages
214
Reactions
30
#3
client.Send(new CharacterLoadingCompleteMessage()); ? A la fin de 'Send(new StartupActionsListMessage(new StartupActionAddObject[0]));'
Existe pas en 2.0, sinon les maps chargent sans problème quand le client est en mode "event" :/
 
Inscrit
18 Février 2015
Messages
228
Reactions
7
#4
Send(new CurrentMapMessage(0));
non mais je pense que le prob viens du packet que vous lui envoyé vous lui dite que la map actuel est 0 puis dans le MapComplementaryInformationsDataMessage vous lui envoyé une autre map Id

et je crois que SetCharacterRestrictionsMessage doit être envoyé dans cette condition if (id == 152) // CharacterSelectionMesage
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
150
#5
@Waawi a tout dit, vous fournissez deux mapId qui ne sont pas les mêmes, donc le client plante.
Je vous invite à bien étudier les paquets du jeu, et notamment comparer vos data avec celle du serveur officiel.

Au passage, pensez à regarder les logs du client pour déterminer la sources de vos problèmes.
Un fichier 'debug.txt' vide à la racine du jeu et un F11 une fois le problème rencontré.
 
Inscrit
25 Novembre 2015
Messages
169
Reactions
20
#6
Merci pour vos réponses, je vais effectuer quelques tests et je vous tiens au courant ! Le problème se situe bien dans les arguments comme je le pensais, reste plus qu'à faire des tests. Par contre la manip' avec F11 fonctionne pas sur cette version, j'avais déjà essayé à l'époque :/

Edit : même en envoyant la même MapID il ne se passe toujours rien
 
Dernière édition:
Inscrit
16 Mars 2014
Messages
214
Reactions
30
#7
@Waawi a tout dit, vous fournissez deux mapId qui ne sont pas les mêmes, donc le client plante.
Je vous invite à bien étudier les paquets du jeu, et notamment comparer vos data avec celle du serveur officiel.

Au passage, pensez à regarder les logs du client pour déterminer la sources de vos problèmes.
Un fichier 'debug.txt' vide à la racine du jeu et un F11 une fois le problème rencontré.
Nop toujours pas malheureusement c'était juste pour test car en mettant deux mapid différente c'est la seul fois ou j'ai eu la map qui s'afficher :p et pareille pour les packets qui manque ou l'ordre sa ne change rien je pense plutôt que sa viens du timing des send, de toute manière je vais mettre en place un meilleur système pour gérer les packets entrant car la c'est fait à l'arrache ^^
 
Dernière édition par un modérateur:

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
150
#8
C'est assez gênant en effet, quelle version de Dofus vous utilisez ?
Sans logs client ça va être plutôt compliqué.
 
Inscrit
25 Novembre 2015
Messages
169
Reactions
20
#9
La toute premier version bêta 2.0.0 sortie fin 2009
 
Inscrit
18 Février 2015
Messages
228
Reactions
7
#10
Je crois qu'il y a moyen de récup les long via un fichier XML je ne me rappelle plus son nom il suffit de le mettre dans le dossier et @Sorrow avait fait un tutoriel l'a dessus et tout les logs se redirige automatique vers le dossier Roaming dans le Appdata. Si ça ne fonctionne pas faut alors que vous regardiez comment le client gère les erreurs.
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
150
#11
Il aurait fallu prendre une version à peine plus récente, il existe forcément un système de logs, mais encore faut il savoir à quoi il ressemble.
 
Inscrit
25 Novembre 2015
Messages
169
Reactions
20
#12
Trouver les clients de dofus c'est pas super évident... Surtout sur des versions pas spécialement marquante
 

BlueDream

Administrateur
Membre du personnel
Inscrit
8 Decembre 2012
Messages
2 010
Reactions
150
#13
C'est vrai que ce n'est pas la démarche la plus simple, tu peux aussi mettre à jour le système de Logs via un client plus récent.
Ce serait vraiment une aide essentielle lors de ton développement.
 
Inscrit
25 Novembre 2015
Messages
169
Reactions
20
#14
Je reprends du début sur la version 2.3.7 du coup, avant l'implantation du koli, m'enfin l'ému est full leech pour l'instant (quel intérêt de refaire des class que d'autres on déjà fais ?)
 

neross

Membre Actif
Inscrit
20 Decembre 2014
Messages
150
Reactions
0
#15
Je reprends du début sur la version 2.3.7 du coup, avant l'implantation du koli, m'enfin l'ému est full leech pour l'instant (quel intérêt de refaire des class que d'autres on déjà fais ?)
Pourquoi faire ce que les autres on déjà fait ? Comme j'aime le dire il faut utiliser seulement 0.5% de son cerveau pour connaitre la réponse.
Refaire permet de comprendre ce que le créateur initiale a voulus faire. Au moins si tu a un problème tu arrivera a comprendre beaucoup plus facilement d'ou ça viens.
Ça te permet aussi d’améliorer ce qui est déjà présent.
 
Inscrit
6 Avril 2016
Messages
85
Reactions
40
#16
+1
 
Dernière édition par un modérateur:
Haut Bas