sniffer
Cette partie est faite pour les développeurs doués.
Ces méthodes ont deux buts :
Possibilité d'envoyer au serveur du jeu un message de votre choix.
Possibilité de lire les messages reçus par le serveur et de les interpréter.
Exemple d'utilisation :
On va lancer ce script :
-- Charger le module JSON
JSONFile = script.folder().."\\JSON.lua"
JSON = (loadfile(JSONFile))()
-- Afficher les messages reçus et envoyés
function print_messages()
while true do
local messages = sniffer.messages()
for _, msg in ipairs(messages) do
if msg.received then
console.print("[IN] ["..msg.timestamp.."] "..msg.name.."\n"..msg.content, console.pink)
else
console.print("[OUT] ["..msg.timestamp.."] "..msg.name.."\n"..msg.content, console.cyan)
end
end
global.delay(100)
end
end
-- Start
function move()
print_messages()
endCe script va nous afficher dans la console les messages échangés entre le client et le serveur du jeu.

Dans notre cas, nous avons envoyé dans le chat du jeu la phrase "Hello !".
Dans la console, on remarque l'envoi du message :
[16:09:09] [OUT] [1763392149499] jhp
{"fffs":{"fffc":[],"fffd":[],"fffe":{}},"ffft":"","fffu":"Hello !","fffv":0}Le nom du message envoyé est : jhp
Le contenu du message envoyé est {"fffs":{"fffc":[],"fffd":[],"fffe":{}},"ffft":"","fffu":"Hello !","fffv":0}
Remarquez la présence de la phrase "Hello !" dans le contenu, maintenant, pour envoyer un message similaire au serveur du jeu, avec la phrase "blablabla" on fait comme ça :
sniffer.send('jhp', '{"fffs":{"fffc":[],"fffd":[],"fffe":{}},"ffft":"","fffu":"blablabla","fffv":0}')Quand un joueur rentre dans la map, on remarque la réception du message :

[16:20:38] [IN] [1763392838445] iiq
{"fbgt":[{"fhal":634655670566,"fham":{"fhae":{"fias":[80,5230,3391,5761,5762,3971,5764,5143],"fiat":0,"fiau":null,"fiav":[55],"fiaw":[31102310,46778825,64329260,83162348,98211174,114660908,117440512,145389890],"fiax":1,"fiay":[{"fgcy":0,"fgcz":{"fias":[],"fiat":0,"fiau":null,"fiav":[],"fiaw":[],"fiax":5994,"fiay":[]},"fgda":1,"fgdb":0,"fgdc":0}]},"fhaf":{"fgxe":null,"fgxf":null,"fgxg":0,"fgxh":false,"fgxi":null,"fgxj":null,"fgxk":{"fgvl":"Theodorus-Rex","fgvm":null,"fgvn":{"fguv":[11],"fguw":0,"fgux":null,"fguy":1,"fguz":[{"fgtz":null,"fgua":0,"fgub":false,"fguc":null,"fgud":null,"fgue":null,"fguf":null,"fgug":null,"fguh":null,"fgui":null,"fguj":{"fhvp":24640,"fhvq":"Les Papis Flinguer","fhvr":40,"fhvs":{"fhvj":null,"fhvk":{"fhcx":0,"fhcy":383,"fhcz":25,"fhda":11172162},"fhvl":null},"fhvt":0},"fguk":10},{"fgtz":null,"fgua":1,"fgub":true,"fguc":null,"fgud":null,"fgue":null,"fguf":null,"fgug":null,"fguh":null,"fgui":null,"fguj":null,"fguk":1}],"fgva":false,"fgvb":148594559,"fgvc":{"fifl":2,"fifm":null,"fifn":0,"fifo":0,"fifp":0,"fifq":200}},"fgvo":3},"fgxl":null,"fgxm":null,"fgxn":5},"fhag":null,"fhah":1},"fhan":null,"fhao":0,"fhap":{"ffui":0,"ffuj":0,"ffuk":0,"fful":false,"ffum":0,"ffun":false,"ffuo":490,"ffup":true}}],"fbgu":0}Pour mieux comprendre la structure de ce JSON, copiez-collez le dans un outil comme https://jsonviewer.stack.hu/

Remarquez le nom du joueur et sa cellule.
Maintenant qu'on connait la structure, on peut passer à la lecture du message :
-- Charger le module JSON
JSONFile = script.folder().."\\JSON.lua"
JSON = (loadfile(JSONFile))()
-- Afficher les messages reçus et envoyés
function print_messages()
while true do
local messages = sniffer.messages()
for _, msg in ipairs(messages) do
if msg.received then
if msg.name == "iiq" then
local obj = JSON:decode(msg.content)
if obj.fbgt[1].fham ~= nil and obj.fbgt[1].fham.fhaf ~= nil and obj.fbgt[1].fham.fhaf.fgxk ~= nil then
console.success("Le personnage "..obj.fbgt[1].fham.fhaf.fgxk.fgvl.." est apparut dans la cellule "..obj.fbgt[1].fhap.ffuo)
end
end
end
end
global.delay(100)
end
end
-- Start
function move()
print_messages()
end
Contraintes et difficultés
Comme vous l'avez remarqué, les noms des messages, ainsi que leurs contenus, sont obfusqués, cette obfusquation rend la tache très complexe, vous devez donc être familier avec le protocol du jeu pour pouvoir en profiter (remarquez les identifiants tel que les mapId, contextualId, GID, UID, questId, cellId, breedId, fightId, partyId, elementId ...).
Ankama fait des rotations de temps en temps, cela veut dire que les messages vont changer leurs noms, et les fields du contenu vont changer leurs noms et leurs ordres, et d'autres fields "mort" seront ajoutés ou supprimés, c'est à vous de maintenir vos scripts à jour.
Mis à jour