Touch

Bienvenue dans l'espace développeur. Un espace réservé aux plus curieux d'entre-vous qui vous permettra de faire ce que vous souhaitez avec vos trajets sans aucune limite !

PS : Pour cette partie de la documentation vous devrez vous aider de la partie mode développeur dans le bot.

Accéder au Sniffer

Comme vous le savez surement la version SnowBot Touch ne possède pas de mode MITM et il serait donc compliqué pour vous de simuler des actions en jeu. Pour résoudre ce problème voici un tutoriel pour activer un sniffer sur LINDO :

Etape 1 :

Vous devez lancer LINDO et avant de connecter votre compte vous devez faire un ctrl + shift + i. Vous devriez voir apparaître une console comme ceci :

Etape 2 :

Rendez-vous dans la partie Network et appliquez le filtre WS (websocket) comme sur le screen ci-dessus.

Etape 3 :

Vous pouvez connecter votre compte, vous verrez alors 2 connexions apparaître, l'une est utilisé pour la connexion au serveur d'authentification et l'autre pour la connexion au serveur de jeu.

Etape 4 :

Vous pouvez maintenant voir apparaître toutes les données et simuler en jeu des actions.

Utilisation pour Dofus TOUCH :

Etape 1 : lire un message

Voici la valeur que nous souhaitons récupérer dans notre exemple :

[16:17:39] 4{
"_messageType":"GameRolePlayShowActorMessage",
"informations":
{"_type":"GameRolePlayCharacterInformations","contextualId":4285194,
"look":{"_type":"EntityLook","bonesId":1,"skins":[101,2165,284,1176],"indexedColors":[18483039,42299369,63737517,70051748,97144118],"scales":[145],"subentities":[]},
"disposition":{"_type":"EntityDispositionInformations","cellId":42,"direction":6},"name":"Agnea-Kushh",
"humanoidInfo":{"_type":"HumanInformations",
"restrictions":{"_type":"ActorRestrictionsInformations",
"cantBeAggressed":false,
"cantBeChallenged":false,
"cantTrade":false,
"cantBeAttackedByMutant":false,
"cantRun":false,
"forceSlowWalk":false,
"cantMinimize":false,
"cantMove":false, -- nous souhaitons récupérer cette valeur
"cantAggress":false,
"cantChallenge":false,
"cantExchange":false,
"cantAttack":true,
"cantChat":false,
"cantBeMerchant":false,
"cantUseObject":false,
"cantUseTaxCollector":false,
"cantUseInteractive":false,
"cantSpeakToNPC":false,
"cantChangeZone":false,
"cantAttackMonster":false,
"cantWalk8Directions":false},
"sex":true,
"options":[]},
"accountId":146491073,
"alignmentInfos":{"_type":"ActorAlignmentInformations","alignmentSide":0,"alignmentValue":0,"alignmentGrade":0,"characterPower":4285217}},
"_isInitialized":true}

Dans notre exemple nous souhaitons savoir si le joueur qui arrive sur la map peux se déplacer ou non. Pour se faire nous remarquons que le packet avec le nom GameRolePlayShowActorMessage est envoyé quand quelque chose apparait sur la map et contient une variable cantMove qui renvoie True si le personnage ne peut pas se déplacer. Pour vous aider a bien comprendre l'arbre du packet, rentrez le packet sur ce site : https://jsoneditoronline.org/ et vous devriez obtenir ceci :

Vous allez voir avec ce site ce sera vraiment plus simple pour vous de lire le contenu. Voici comment je récupère cette valeur dans mon script :


function move()
    
end

function messagesRegistering()
    developer:registerMessage("GameRolePlayShowActorMessage", receive_GameRolePlayShowActorMessage)
end

function receive_GameRolePlayShowActorMessage(message)
    global:printMessage(developer:deserializeObject(message, "informations,humanoidInfo,restrictions,cantMove"))
end

Pour commencer, vous remarquez qu'une nouvelle fonction fait son apparition, la fonction messagesRegistering(). Cette fonction comme son nom l'indique est un "Enregistrement des messages" et permet de s'abonner a des messages. Dans notre exemple, on s'abonne au message avec le nom GameRolePlayShowActorMessage et on souhaite appeler la fonction receive_GameRolePlayShowActorMessage quand on reçoit ce message. Ensuite pour récupérer la donnée que l'on souhaite, il nous suffit de descendre jusqu’à la variable cantMove.

Etape 2 : envoyer un message

Voici le message que nous allons envoyer :

Nous allons envoyer le message "ChatClientMultiMessage" qui nous permet de discuter en général sur la map. Dans notre exemple nous allons demander d'envoyer le message quand nous recevons le message GameMapMovementMessage (Quand quelqu'un se déplace sur la map). Voici mon rendu :

function move()
	
end

function messagesRegistering()
	developer:registerMessage("GameMapMovementMessage", receive_GameMapMovementMessage)
end

function receive_GameMapMovementMessage(message)
		developer:sendMessage('4{"call":"sendMessage","data":{"type":"ChatClientMultiMessage","data":{"channel":0,"content":"salut"}}}')
end

Dans notre exemple ici, nous remplissons la structure du message via un string ou l'on utilise des apostrophes(') pour contenir des guillemets(") et nous pouvons l'envoyer au serveur.

Nous envoyons donc salut sur le channel 0 qui est visiblement le channel du général.

Documentation :

registerMessage

Permet de s'abonner a un message a partir de son nom.

developer:registerMessage("messageType", function_name)

deserializeObject

Permet de récupérer le contenu d'une variable parmi un objet JSON (string)

developer:deserializeObject(message, "variable1,varable2")

deserializeJArray

Permet de récupérer un item parmi le contenu de la variable ARRAY (qui contient des [ ]) (string)

Exemple d'utilisation : voici le contenu de la variable [[0,1],6,7,8,9,10].

1) Vous souhaitez récupérer le 0 dans cet extrait.

developer:deserializeJArray("[[0,1],6,7,8,9,10]", "0,0")

2) Vous souhaitez récupérer le 6 voici le code :

developer:deserializeJArray("[[0,1],6,7,8,9,10]", "1")
developer:deserializeJArray(message, "0")

countJArray

Permet de récupérer le nombre d'item parmi le contenu de la variable ARRAY (qui contient des [ ]) (integer)

developer:countJArray(message)

historicalMessage

Retourne la liste des anciens message reçus avant le chargement du script.

monMessage = developer:historicalMessage("messageType")
monMessage1 = monMessage[1]

suspendScriptUntil

Suspend le script jusqu’à recevoir le nom et retourne false si le timeOut est dépassé.

developer:suspendScriptUntil("messageType", timeOut, showTimeOut)

sendMessage

Envoie un message au serveur Dofus.

developer:sendMessage("message")

postRequest

Retourne le résultat d'une postRequest. (string)

developer:postRequest(url, data)

getRequest

Retourne le résultat d'une getRequest. (string)

developer:getRequest(url)

Dernière mise à jour