Bonsoir,
Vu le grand nombre de debutants qui arrive sur cadernis et qui ne sache pas gerer les mises à jour, ce tuto leur facilitera la vie. En général les mise a jour d'ankama sont juste des modifications des packet qui ne sont pas si dur que sa. Le problème persiste quand ankama met a jour autre chose. Par exemple son cryptage RSA.
Voila le sommaire pour le moment qui ne se compose que de deux section:
- Recevoir un packet
- Envoyer un packet
Pour bien comprend et aplliquer ce tuto il va vous falloir des connaissances sur le sniffage, la traduction AS ainsi qu'un minimum de bases dans le langage que vous pratiquez. Et oui ce tuto n'est pas que pour le C# et le VB.NET, a vous de comprendre Action Script ou de retraduire les codes que je mettrai a disposition dans ce tuto. Donc, je récapitule:
- connaissance dans le langage pratique -> SiteDuZero
- savoir sniffer -> https://cadernis.com/d/143-[tuto-identifier-les-packets
- savoir traduire le AS (tuto uniquement pour le VB.NET) -> https://cadernis.com/d/646
On y va !
Alors, on commence donc par:
- Recevoir un packet
Recevoir un packet cela revient un quoi ?
Cela revient a récupérer les informations que le serveur nous envoi, par une simple variable.
Pour ce tuto on va prendre pour exemple la classe: ServersListMessage qui sert a sélectionner' un serveur de jeu mais qui nous informe aussi de la liste des serveurs.
Voilà la class sous forme AS (Action Script) donc tel qu'ank@ma l'a faite.
Cliquez pour révéler
Cliquez pour masquer
Namespace com.ankamagames.dofus.network.messages.connection
imports __AS3__.vec
imports com.ankamagames.dofus.network.types.connection
imports com.ankamagames.jerakine.network
imports flash.utils
public class ServersListMessage
Inherits NetworkMessage
private Dim _isInitialized As Boolean = false
Public servers As New List(Of GameServerInformations)
Public protocolId As uinteger = 30
public function ServersListMessage()
me.servers = New List(Of GameServerInformations)
return me
end function
Public Overrides Function get_isInitialized() As Boolean
return me._isInitialized
end function
Public Overrides Function getMessageId() As uinteger
return 30
end function
public function initServersListMessage(param1 As New List(Of GameServerInformations) = nothing) As ServersListMessage
me.servers = param1
me._isInitialized = true
return me
end function
Public Overrides Function reset()
me.servers = New List(Of GameServerInformations)
me._isInitialized = false
return me
end function
Public Function pack(Byval Sock As System.Net.Sockets.Socket)
Dim writer As New Dofuswriter(Sock)
Me.serialise(writer)
Dofuswriter.send(protocolId)
Return me
End function
Public Overrides Function unpack(param1 As DofusReader, param2 As uinteger)
me.deserialize(param1)
return me
end function
public function serialize(param1 As DofusWriter)
me.serializeAs_ServersListMessage(param1)
return me
end function
public function serializeAs_ServersListMessage(param1 As DofusWriter)
param1.writeShort(me.servers.count)
Dim _loc_2 As uinteger = 0
while (_loc_2 < me.servers.count)
(me.servers(_loc_2) as GameServerInformations).serializeAs_GameServerInformations(param1)
_loc_2 = _loc_2 + 1
}
return me
end function
public function deserialize(param1 As DofusReader)
me.deserializeAs_ServersListMessage(param1)
return me
end function
public function deserializeAs_ServersListMessage(param1 As DofusReader)
Dim _loc_4 As GameServerInformations = nothing
Dim _loc_2 As UShort = param1.readUnsignedShort()
Dim _loc_3 As uinteger = 0
while (_loc_3 < _loc_2)
_loc_4 = new GameServerInformations()
_loc_4.deserialize(param1)
me.servers.add(_loc_4)
_loc_3 = _loc_3 + 1
}
return me
end function
End Class
End Namespace
Pour l'utiliser il va d'abord falloir la traduire, vous avez 5 minutes !
Bon après...
Non je rigole tenez la voilà en VB.NET et C#:
Cliquez pour révéler
Cliquez pour masquer
Cliquez pour révéler
Cliquez pour masquer
Imports Lux_Bot.Dofus
Imports Lux_Bot.com.ankamagames.dofus.network.types.connection
Namespace com.ankamagames.dofus.network.messages.connection
Public Class ServersListMessage
Private _isInitialized As Boolean = False
Public servers As New List(Of GameServerInformations)
Public protocolId As UInteger = 30
Public Function ServersListMessage()
Me.servers = New List(Of GameServerInformations)
Return Me
End Function
Public Overridable Function get_isInitialized() As Boolean
Return Me._isInitialized
End Function
Public Overridable Function getMessageId() As UInteger
Return 30
End Function
Public Function initServersListMessage(ByVal param1 As List(Of GameServerInformations)) As ServersListMessage
Me.servers = param1
Me._isInitialized = True
Return Me
End Function
Public Overridable Function reset()
Me.servers = New List(Of GameServerInformations)
Me._isInitialized = False
Return Me
End Function
Public Function pack(ByVal Sock As System.Net.Sockets.Socket)
Dim writer As New DofusWriter()
Me.serialize(writer)
DofusWriter.Send(protocolId, Sock)
Return Me
End Function
Public Overridable Function unpack(ByVal param1 As DofusReader, ByVal param2 As UInteger)
Me.deserialize(param1)
Return Me
End Function
Public Function serialize(ByVal param1 As DofusWriter)
Me.serializeAs_ServersListMessage(param1)
Return Me
End Function
Public Function serializeAs_ServersListMessage(ByVal param1 As DofusWriter)
param1.WriteShort(Me.servers.Count)
Dim _loc_2 As UInteger = 0
While (_loc_2 < Me.servers.Count)
Me.servers(_loc_2).serializeAs_GameServerInformations(param1)
_loc_2 = _loc_2 + 1
End While
Return Me
End Function
Public Function deserialize(ByVal param1 As DofusReader)
Me.deserializeAs_ServersListMessage(param1)
Return Me
End Function
Public Function deserializeAs_ServersListMessage(ByVal param1 As DofusReader)
Dim _loc_4 As GameServerInformations = Nothing
Dim _loc_2 As UShort = param1.ReadUnSignedshort()
Dim _loc_3 As UInteger = 0
While (_loc_3 < _loc_2)
_loc_4 = New GameServerInformations()
_loc_4.deserialize(param1)
Me.servers.Add(_loc_4)
_loc_3 = _loc_3 + 1
End While
Return Me
End Function
End Class
End Namespace
Cliquez pour révéler
Cliquez pour masquer
using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using Lux_Bot.Dofus;
using Lux_Bot.com.ankamagames.dofus.network.types.connection;
namespace com.ankamagames.dofus.network.messages.connection
{
public class ServersListMessage
{
private bool _isInitialized = false;
public List<GameServerInformations> servers = new List<GameServerInformations>();
public uint protocolId = 30;
public object ServersListMessage()
{
this.servers = new List<GameServerInformations>();
return this;
}
public virtual bool get_isInitialized()
{
return this._isInitialized;
}
public virtual uint getMessageId()
{
return 30;
}
public ServersListMessage initServersListMessage(List<GameServerInformations> param1)
{
this.servers = param1;
this._isInitialized = true;
return this;
}
public virtual object reset()
{
this.servers = new List<GameServerInformations>();
this._isInitialized = false;
return this;
}
public object pack(System.Net.Sockets.Socket Sock)
{
DofusWriter writer = new DofusWriter();
this.serialize(writer);
DofusWriter.Send(protocolId, Sock);
return this;
}
public virtual object unpack(DofusReader param1, uint param2)
{
this.deserialize(param1);
return this;
}
public object serialize(DofusWriter param1)
{
this.serializeAs_ServersListMessage(param1);
return this;
}
public object serializeAs_ServersListMessage(DofusWriter param1)
{
param1.WriteShort(this.servers.Count);
uint _loc_2 = 0;
while ((_loc_2 < this.servers.Count)) {
this.servers[_loc_2].serializeAs_GameServerInformations(param1);
_loc_2 = _loc_2 + 1;
}
return this;
}
public object deserialize(DofusReader param1)
{
this.deserializeAs_ServersListMessage(param1);
return this;
}
public object deserializeAs_ServersListMessage(DofusReader param1)
{
GameServerInformations _loc_4 = null;
ushort _loc_2 = param1.ReadUnSignedshort();
uint _loc_3 = 0;
while ((_loc_3 < _loc_2)) {
_loc_4 = new GameServerInformations();
_loc_4.deserialize(param1);
this.servers.Add(_loc_4);
_loc_3 = _loc_3 + 1;
}
return this;
}
}
}
On a donc nos classe traduite. Il va falloir que vous appreniez a les traduire seul, recherchez les termes que vous ne connaissez pas pour les traduire dans votre langage.
Bon on a traduit notre class, on va l'utiliser: (voir commentaire)
Rien de compliquer jusqu'ici:
Case 30 'Id de la classe
ID_Message = New com.ankamagames.dofus.network.messages.connection.ServersListMessage 'On stoke la class dans la variable id_message
ID_Message.Deserialize(PacketData) 'On active la fonction deserialize de la class, packetdata correspond aux données recu dans le packet essentiel pour le deserialize
Maintenant on se rend dans notre class, pour extraire les informations de cette class on va tout simplement récupérer les variable se trouvant tout au dessus de celle-ci.
private Dim _isInitialized As Boolean = false 'Private on oubli
Public servers As New List(Of GameServerInformations)
Public protocolId As uinteger = 30
//Private on oubli
private bool _isInitialized = false;
public List<GameServerInformations> servers = new List<GameServerInformations>();
public uint protocolId = 30;
Nous on va récupérer la liste des serveurs.
Rien de plus simple que ceux-ci:
For i = 0 To ID_Message.servers.count - 1
MsgBox(ID_Message.servers(i).id)
Next
for ( int i = 0; i <= ID_Message.servers.count; i++) {
Messagebox.show(ID_Message.servers(i).id);
}
Voilà vous êtes en mesure de Recevoir un packet.
- Envoyer un packet
Pour envoyer un packet vous n'avez pas besoin de traduire la class. (Je vous entend :D)
Vous avez juste besoin d'accéder a la class du packet à envoyer.
Mais comment savoir quelle packet envoyer ?
En fait, lors du sniffage vous regardez entre deux packet recu, quel packets ont été envoyé. Les packets qui ont été envoyé doivent être envoyé au dernier packet reçu.
Dans cette class on doit envoyer l'id 40 (ServerSelectionMessage).
Ce que l'on doit envoyer ce trouve dans le serialize_as de la classe correspondante, ici:
public function serializeAs_ServerSelectionMessage(param1 As DofusWriter)
param1.writeShort(me.serverId)
return me
end function
Donc on doit envoyer l'id du serveur.
Allez voila la list des id de tout les serveurs en bonus:
Cliquez pour révéler
Cliquez pour masquer
-1|Serveur de connexion
1|Jiva
2|Rushu
3|Djaul
4|Raval
5|Hecate
6|Sumens
7|Menalt
8|Rosal
9|Maimane
10|Silvosse
11|Brumaire
12|Pouchecot
13|Silouate
14|Domen
15|Amayiro
16|Rykke-Errel
17|Hyrkul
18|Helsephine
19|Allister
20|Otomaï
21|Lily
22|Oto Mustam
23|Hel Munster
24|Danathor
25|Kuri
26|Mylaise
27|Goultard
28|Ulette
29|Vil Smisse
30|Many
31|Solar
32|Crocoburio
33|Li Crounch
35|Farle
36|Agride
37|Bowisse
38|Ogivol
39|Lethaline
40|Aermyne
41|Zatoïshwan
99|Tournois
104|Bill
111|Nyx
112|Nyx3
118|Oopah 2
122|Nyx-Hardcore
124|Laetitia
126|Lim
127|Lim-Hardcore
670|Chacha
671|Zephyr
672|Zephyr-Hot
673|Tchatcha
900|Test
901|Test Heroique
902|Beta Dofus 2.0 INTL
903|Salon Dofus 2
904|Beta Dofus 2.0 FR
905|Beta Dofus 2.0 JA
1001|Shika
3001|Nehra
3002|Katar
4001|Alma
4002|Aguabrial
4003|Buhorado
4004|Ténèbres
4005|Bolgrot
4006|Nomekop
4007|Edasse
6001|Spiritia
6002|Helioboros
7001|Dark Vlad
8001|Lethaline
9001|Ereziah
10001|Ogivol
57005|Hardcore
Peut-être pas tour mais une bonne partie.
Donc pour envoyer un packet:
Cliquez pour révéler
Cliquez pour masquer
Dim param1 As New Dofus.DofusWriter 'défini le write
param1.WriteShort(id_serveur) 'on le rempli
Dofus.DofusWriter.Send(40, _socket_Connexion) 'on envoi
Dofus.DofusWriter param1 = new Dofus.DofusWriter();
//défini le write
param1.WriteShort(id_serveur);
//on le rempli
//on envoi
Dofus.DofusWriter.Send(40, _socket_Connexion);
A la suite de cette envoi, vous devriez recevoir un nouveau packet, et ainsi de suite.
Voilà ce que sa donne une fois fini:
Cliquez pour révéler
Cliquez pour masquer
Case 30
ID_Message = New com.ankamagames.dofus.network.messages.connection.ServersListMessage
ID_Message.Deserialize(PacketData)
'On indique serveur de connexion
Dim param1 As New Dofus.DofusWriter
param1.WriteShort(id_serveur)
Dofus.DofusWriter.Send(40, _socket_Connexion)
Case 30
ID_Message = New com.ankamagames.dofus.network.messages.connection.ServersListMessage
ID_Message.Deserialize(PacketData)
//On indique serveur de connexion
Dofus.DofusWriter param1 = new Dofus.DofusWriter();
param1.WriteShort(id_serveur);
Dofus.DofusWriter.Send(40, _socket_Connexion);
Voilà, j'ai fais ce tuto plutôt rapidement, je l'améliorais plus tard.
A bientôt