AnkaBot
  • Préface
  • Introduction
  • Programmation avec LUA
  • Rejoindre notre Discord
  • Abonnement
  • espace débutant
    • Téléchargement et installation
    • Première utilisation
    • Comprendre et faire un script
    • Script avec RoadCreator
    • Dofus et Lindo sur un VPS
    • Proxy
    • Conseils en or
  • Boutique des scripts
    • Accéder à la boutique
    • Sandbox
    • Informations pour les vendeurs
  • Installation
    • Construction d'un script
      • Structure de base
      • Changement de carte - Path
      • Utilisation d'une porte - Door
      • Actions
      • Paramètres
      • Exercice
      • Bot "Banque"
    • Road Creator
    • Commandes rapides
  • Types de bannissement
    • Ban création
    • Dofus 2.0
      • Bannissement par modérateur
      • Bannissement par waveban (Août 2022)
      • Bannissement par Antibot (Août 2022)
      • Bannissement par le support
      • Bannissement par Antibot (Janvier 2023)
      • Antibot chasse au trésor
    • Dofus Touch
  • AnkaBot PC
    • Identifiants Dofus PC
    • Commandes console
    • Bot marchand
    • Format des pseudos
    • Problèmes MITM
    • Limite de Kamas
    • Fonctionnement du Kolizéum
    • Méthodes
      • global
        • thisAccountController
        • leaderAccountController
        • playAudio
        • openMitm
        • username
        • accountTag
        • print<Type>
        • printAccountDetails
        • delay
        • leaveDialog
        • mail
        • isModeratorPresent
        • disconnect
        • reconnect
        • reconnectBis
        • reconnectSec
        • reconnectWithToken
        • finishScript
        • loadConfiguration
        • loadConfigurationWithoutScript
        • loadAndStart
        • restartScript
        • afterFight
        • resetCountFight
        • getCountFight
        • resetCountGather
        • getCountGather
        • addInMemory
        • editInMemory
        • remember
        • deleteMemory
        • deleteAllMemory
        • getReplies
        • charactersList
        • getTeamMembersIds
        • getTeamMembersNames
        • totalTime
        • scriptName
        • subScript
        • fileExists
        • joinBoss
        • random
        • setPrivate
        • setPrivateTeam
        • teamCheck
        • inviteTeam
        • isBoss
        • question
        • input
        • getCurrentDirectory
        • getAllFilesNameInDirectory
        • getCurrentScriptDirectory
        • editAlias
        • consoleLines
        • clearConsole
        • saveConsole
      • character
        • server
        • name
        • id
        • level
        • kamas
        • sex
        • isBusy
        • isInFight
        • lifePoints
        • maxLifePoints
        • lifePointsP
        • experience
        • sessionExperience
        • energyPoints
        • maxEnergyPoints
        • breed
        • breedName
        • freeMode
        • statsPoint
        • getSpellVariant
        • get<Element>Base
        • getCost<Element>
        • upgrade<Element>
      • exchange
        • putItem
        • getItem
        • getAllItems
        • putAllItems
        • getAllItemsExcept
        • putAllItemsExcept
        • putKamas
        • getKamas
        • storageKamas
        • storageItems
        • storageItemCount
        • storageItemQuantity
        • launchExchangeWithPlayer
        • launchExchangeWithPlayerByName
        • ready
        • leave
        • isInExchange
      • inventory
        • pods
        • podsMax
        • podsP
        • inventoryContent
        • itemCount
        • itemWeight
        • itemNameId
        • useItem
        • useMultipleItem
        • equipItem
        • itemPosition
        • deleteItem
        • dropItem
        • getUID
        • getTypeId
        • getTypeName
        • getLevel
      • job
        • name
        • level
      • map
        • changeMap
        • moveToCell
        • door
        • useById
        • saveZaap
        • aggression
        • onMap
        • onCell
        • currentMap
        • currentCell
        • currentMapId
        • currentArea
        • currentSubArea
        • getMap
        • getX
        • getY
        • neighbourId
        • getArchiMonsters
        • containsArchi
        • lockedHouse
        • lockedStorage
        • countPlayers
        • isPlayerOnMap
        • players
        • getWalkableCells
        • monsterGroups
        • fight
        • forceFight
        • gather
        • closestZaap
        • closestZaapV2
        • toZaap
        • cellDistance
        • setCustomObstacles
        • resetCustomObstacles
        • setSpeedMultiplier
        • gotomap
        • Auto-pilotage
          • GetDistance
          • GetPathDistance
          • loadMove
          • loadToMapIdFrom
          • getLoadedRoad
          • moveToward
          • moveRandomToward
      • npc
        • npc
        • reply
        • npcBank
      • sale
        • availableSpace
        • sellItem
        • buyItem
        • getPriceItem
        • getAveragePriceItem
        • editPrice
        • editPriceByGID
        • updateAllItems
        • itemsOnSale
        • getItemPrice
        • getItemGID
        • getItemGUID
        • getItemQuantity
        • sellToPnj
        • buyToPnj
        • sellAllItemToPnj
      • craft
        • putItem
        • changeQuantityToCraft
        • ready
      • mount
        • myMount
        • hasMount
        • isRiding
        • toggleRiding
        • feedMount
        • setXpRatio
        • moveMounts
        • stabledMounts
        • paddockedMounts
        • newBorns
        • inventoryMounts
        • paddockItems
        • putPaddockItem
        • movePaddockItem
        • removePaddockItem
      • d2data
        • exportD2O
        • objectFromD2O
        • allObjectsFromD2O
        • text
        • exportMapData
        • mapData
      • quest
        • initialize
        • activeQuests
        • questActive
        • questCurrentStep
        • questDoneObjectives
        • questRemainingObjectives
        • questObjectiveDone
        • validateObjective
        • name
        • stepName
        • stepDescription
        • objectiveText
      • chat
        • sendPrivateMessage
        • sendGeneralMessage
        • sendGuildMessage
        • sendAllianceMessage
        • sendRecruitmentMessage
        • sendTradeMessage
    • Mode développeur
      • Utilisation
        • 1. Lire un message
        • 2. Envoyer un message
      • developer
        • toggleMultiThreading
        • registerMessage
        • unRegisterMessage
        • isMessageRegistred
        • historicalMessage
        • suspendScriptUntil
        • suspendScriptUntilMultiplePackets
        • typeOf
        • createMessage
        • sendMessage
        • postRequest
        • getRequest
        • postRequestThroughHTTPSProxy
        • getRequestThroughHTTPSProxy
        • postRequestThroughSocks5Proxy
        • getRequestThroughSocks5Proxy
        • postRequestThroughMyIP
        • getRequestThroughMyIP
        • isScriptPlaying
        • startScript
        • <action>GlobalMemory
  • AnkaBot Touch
    • Identifiants Dofus Touch
    • Commandes console
    • Synchronisation avec Lindo
    • Connexion avec Lindo
    • Méthodes
      • global
        • thisAccountController
        • leaderAccountController
        • playAudio
        • username
        • print<Type>
        • delay
        • printPhone
        • leaveDialog
        • mail
        • isModeratorPresent
        • disconnect
        • reconnect
        • reconnectBis
        • maximumNumberFightsOfDay
        • maximumNumberGathersOfDay
        • finishScript
        • loadConfiguration
        • loadConfigurationWithoutScript
        • loadAndStart
        • restartScript
        • afterFight
        • resetCountFight
        • getCountFight
        • resetCountGather
        • getCountGather
        • addInMemory
        • editInMemory
        • remember
        • deleteMemory
        • deleteAllMemory
        • getTeamMembersIds
        • getTeamMembersNames
        • random
        • setPrivate
        • setPrivateTeam
        • teamCheck
        • inviteTeam
        • question
        • Input
        • getCurrentDirectory
        • getAllFilesNameInDirectory
        • getCurrentScriptDirectory
        • scriptName
        • fileExists
        • editAlias
        • isBoss
        • consoleLines
        • clearConsole
        • saveConsole
      • character
        • server
        • serverName
        • isCaptchaPresent
        • name
        • id
        • level
        • kamas
        • sex
        • isBusy
        • isInFight
        • giveUpFight
        • lifePoints
        • maxLifePoints
        • lifePointsP
        • experience
        • energyPoints
        • maxEnergyPoints
        • breed
        • breedName
        • freeMode
        • bonusPackExpiration
        • statsPoint
        • isTeamLeader
        • getBonusPack
      • exchange
        • putItem
        • getItem
        • getAllItems
        • putAllItems
        • getAllItemsExcept
        • putAllItemsExcept
        • putAllItemsExchange
        • putKamas
        • getKamas
        • storageKamas
        • storageItems
        • storageItemCount
        • storageItemQuantity
        • launchExchangeWithPlayer
        • launchExchangeWithPlayerByName
        • ready
        • leave
        • isInExchange
      • inventory
        • pods
        • podsMax
        • podsP
        • openBank
        • inventoryContent
        • items
        • itemCount
        • itemWeight
        • itemNameId
        • useItem
        • useMultipleItem
        • equipItem
        • itemPosition
        • deleteItem
        • itemTypeId
        • getLevel
        • getUID
      • job
        • name
        • level
      • map
        • changeMap
        • saveZaap
        • moveToCell
        • Page
        • door
        • useById
        • onMap
        • onCell
        • currentMap
        • currentCell
        • currentMapId
        • currentArea
        • currentSubArea
        • getMap
        • getX
        • getY
        • neighbourId
        • moveToward
        • GetDistance
        • getArchiMonsters
        • containsArchi
        • lockedHouse
        • lockedStorage
        • countPlayers
        • isPlayerOnMap
        • players
        • getWalkableCells
        • npcInMap
        • avoidMonsters
        • avoidMonstersDistance
        • monsterGroups
        • cellDistance
        • fight
        • forceFight
        • gather
      • npc
        • npc
        • npcInMap
        • hasReply
        • getRepliesId
        • reply
        • npcBank
        • npcSale
        • npcBuy
      • sale
        • availableSpace
        • sellItem
        • buyItem
        • getPriceItemV2
        • editPrice
        • editPriceByGID
        • updateAllItems
        • itemsOnSale
        • getItemPrice
        • getItemGID
        • getItemGUID
        • getItemQuantity
        • sellToPnj
        • buyToPnj
        • sellAllItemToPnj
      • craft
        • putItem
        • changeQuantityToCraft
        • ready
      • mount
        • myMount
        • hasMount
        • isRiding
        • toggleRiding
        • feedMount
        • setXpRatio
        • stabledMounts
        • paddockedMounts
        • newBorns
        • inventoryMounts
        • moveMount
      • quest
        • initialize
        • activeQuests
        • questActive
        • questCurrentStep
        • questDoneObjectives
        • questRemainingObjectives
        • questObjectiveDone
        • validateObjective
        • name
        • stepName
        • stepDescription
        • objectiveText
      • chat
        • sendPrivateMessage
        • sendGeneralMessage
        • sendGuildMessage
        • sendAllianceMessage
        • sendRecruitmentMessage
        • sendTradeMessage
    • Mode développeur
      • Utilisation
        • 1. Accéder au Sniffer
        • 2. Lire un message
        • 3. Envoyer un message
      • developer
        • toggleMultiThreading
        • registerMessage
        • unRegisterMessage
        • isMessageRegistred
        • historicalMessage
        • suspendScriptUntil
        • suspendScriptUntilMultiplePackets
        • sendMessage
        • toObject
        • fromObject
        • deserializeObject
        • deserializeJArray
        • countJArray
        • postRequest
        • getRequest
        • postRequestThroughHTTPSProxy
        • getRequestThroughHTTPSProxy
        • postRequestThroughSocks5Proxy
        • getRequestThroughSocks5Proxy
        • postRequestThroughMyIP
        • getRequestThroughMyIP
        • isScriptPlaying
        • startScript
        • <action>GlobalMemory
  • AnkaBot Retro
    • Identifiants Dofus Retro
    • Commandes console
    • Chemin DofusRetro et MITM
    • Méthodes
      • global
        • addInMemory
        • deleteMemory
        • deleteAllMemory
        • editInMemory
        • remember
        • print<Type>
        • delay
        • afterFight
        • getCountFight
        • resetCountFight
        • getCountFight
        • loadConfiguration
        • finishScript
        • disconnect
        • reconnect
        • isModeratorPresent
        • reconnectBis
      • character
        • server
        • breed
        • name
        • sex
        • level
        • lifePoints
        • maxLifePoints
        • lifePointsP
        • energyPoints
        • maxEnergyPoints
        • experience
        • freeMode
        • kamas
      • exchange
        • getAllItems
        • getItem
        • getKamas
        • putAllItems
        • putItem
        • putKamas
        • storageKamas
        • storageItemCount
        • storageItemQuantity
        • ready
        • leaveDialog
        • launchExchangeWithPlayer
      • inventory
        • deleteItem
        • equipItem
        • itemCount
        • itemWeight
        • itemNameId
        • pods
        • podsMax
        • podsP
        • useItem
      • job
        • name
        • level
      • map
        • changeMap
        • countPlayers
        • currentCell
        • currentMapId
        • currentMap
        • door
        • moveToCell
        • onMap
        • onCell
        • saveZaap
        • isPlayerOnMap
      • npc
        • npc
        • reply
        • npcBank
        • leaveDialog
      • craft
        • moveToCraft
        • putItem
        • changeQuantityToCraft
        • ready
        • leaveDialog
    • Mode développeur
      • Utilisation
        • Lire un message
        • developer
          • registerMessage
          • historicalMessage
          • suspendScriptUntil
          • sendMessage
          • postRequest
          • getRequest
  • Mode contrôleur
    • Introduction
    • Méthodes
      • ankabotController
        • addPushBulletKey
        • assignProxyToAnAccount
        • createCharacter
        • clearCreations
        • getPassword
        • getAlias
        • registerAccount
        • deleteAccount
        • getAccount
        • accountIsRegistred
        • accountIsLoaded
        • getAliasAllRegistredAccounts
        • getUsernameAllRegistredAccounts
        • getAliasLoadedAccounts
        • getUsernameLoadedAccounts
        • getAliasNotLoadedAccounts
        • getUsernameNotLoadedAccounts
        • getLoadedAccounts
        • loadControllerAccount
        • loadAccount
        • loadTeamAccount
        • unloadAccountByUsername
        • unloadAccountByAlias
      • AccountController
        • toggleAntiModerator
        • forceServer
        • forceDelete
        • forceChoose
        • forceCreate
        • isItATeam
        • isTeamLeader
        • getTeamAccounts
        • connect
        • disconnect
        • unloadAccount
        • hasScript
        • isScriptPlaying
        • getScriptVariable
        • setScriptVariable
        • callScriptFunction
        • loadConfigNextConnection
        • loadScriptNextConnection
        • reloadScript
        • stopScript
        • startScript
        • loadScript
        • loadConfig
        • getUsername
        • getAlias
        • isAccountConnected
        • isAccountFullyConnected
        • executeCmd
        • abortCmd
        • isExecutingCmd
        • isBanned
        • isController
        • exchangeListen
  • Intelligence Artificielle (IA)
    • Introduction
    • Méthodes
      • fightBasic
        • playTurn
        • addSpell
        • clearSpells
        • setApproachDistance
        • setFightSpeed
      • fightAction
      • fightSlave
      • fightChallenge
        • Dofus 2.0
          • Gestion des challenges
        • Dofus Touch
      • fightCharacter
      • fightDebug
      • Entities
    • Créatures contrôlables
    • Emplacement personnalisé
  • Autres
    • API Modération
    • API Archi-Monstre
    • API Shield (AnkaBot)
    • API Portails (AnkaBot)
    • Choisir l'interface réseau
    • Déchiffrer les trajets dotrade
Propulsé par GitBook
Sur cette page
  • Exemple de lecture d'un message
  • Exécution en parallèle
  • Exemple de risque du multi-threading
  • Analyse des deux exemples

Cet article vous a-t-il été utile ?

  1. AnkaBot PC
  2. Mode développeur
  3. Utilisation

1. Lire un message

PrécédentUtilisationSuivant2. Envoyer un message

Dernière mise à jour il y a 3 ans

Cet article vous a-t-il été utile ?

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 !

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

Exemple de lecture d'un message

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

Dans notre exemple nous souhaitons savoir si le bot peut actuellement se déplacer. Pour se faire nous remarquons que le paquet SetCharacterRestrictionsMessage contient une variable cantMove qui renvoie True si le personnage ne peut pas se déplacer. Voici comment je récupère cette valeur dans mon script :

function move()
	
end

function messagesRegistering()
	developer:registerMessage("SetCharacterRestrictionsMessage", setRestriction)
end

function setRestriction(message)
	global:printMessage(message.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 SetCharacterRestrictionsMessage et on souhaite appeler la fonction setRestiction quand on reçoit ce message. Ensuite pour récupérer la donnée que l'on souhaite, il nous suffit de remonter jusqu’à la variable cantMove.

Remarque importante : Les fonctions enregistrées grâce à developer:registerMessage peuvent s'exécuter même si votre script est OFF.

Exécution en parallèle

Par défaut, l'interpréteur LUA n'autorise pas l'accès au même script par deux threads différents, supposons le script et le scénario suivant :

function move()
	global:delay(100000)
end

function messagesRegistering()
	developer:registerMessage("ChatServerMessage", _ChatServerMessage)
end

function _ChatServerMessage(message)
	global:printMessage("Un message de chat a été reçu !")
end
  • Si on lance le script, il sera bloqué dans la fonction move() pendant 100 seconds.

  • Donc un thread A a accès au script et sera occupé par l'exécution de cette fonction move().

  • Pendant cette durée, si vous recevez un ChatServerMessage, un autre thread B essayera d'exécuter la fonction _ChatServerMessage().

  • L'exécution de cette dernière va échouer, vu que le thread A est celui qui a accès au script pendant ce moment.

Pour remédier à ce problème, il suffit d'ajouter la ligne suivante au début de votre script :

DEVELOPER_MULTI_THREADING = true

Elle indiquera à AnkaBot d'autoriser l'exécution en parallèle de la fonction move() et la fonction _ChatServerMessage().

Cette manipulation comporte plusieurs risque si vous êtes un débutant en programmation, car vous allez devoir gérer par vous mêmes l'accès aux variables par plusieurs threads.

Exemple de risque du multi-threading

On va faire la tache suivante par deux scripts différents :

  • Envoyer un BasicWhoAmIRequestMessage (/whoami)

  • Récupérer l'ID du serveur où je me trouve lorsqu'on reçoit BasicWhoIsMessage

1. Script (avec DEVELOPER_MULTI_THREADING)

DEVELOPER_MULTI_THREADING = true

function move()
	local BasicWhoAmIRequestMessage = developer:createMessage("BasicWhoAmIRequestMessage")
	serverId = 0
	developer:sendMessage(BasicWhoAmIRequestMessage)

	-- J'attend jusqu'à ce que serverId n'est plus égale à 0
	-- Le message BasicWhoIsMessage qu'on va recevoir permet d'avoir cette valeur
	while serverId == 0 do
		global:delay(10)
	end
	global:printSuccess("Mon serverId est "..serverId)
end

function messagesRegistering()
	developer:registerMessage("BasicWhoIsMessage", _BasicWhoIsMessage)
end

function _BasicWhoIsMessage(message)
	serverId = message.serverId
end

2. Script (sans DEVELOPER_MULTI_THREADING)

function move()
	local BasicWhoAmIRequestMessage = developer:createMessage("BasicWhoAmIRequestMessage")
	serverId = 0
	developer:sendMessage(BasicWhoAmIRequestMessage)

	-- J'attend jusqu'à ce que serverId n'est plus égale à 0
	-- Le message BasicWhoIsMessage qu'on va recevoir permet d'avoir cette valeur
	-- Je bloque la fonction move ici, jsuqu'à la réception de BasicWhoIsMessage et l'exécution de la fonction _BasicWhoIsMessage
	developer:suspendScriptUntil("BasicWhoIsMessage", 10000000, false)
	global:printSuccess("Mon serverId est "..serverId)
end

function messagesRegistering()
	developer:registerMessage("BasicWhoIsMessage", _BasicWhoIsMessage)
end

function _BasicWhoIsMessage(message)
	serverId = message.serverId
end

Analyse des deux exemples

Si vous exécuter les deux scripts, vous aurez les memes résultats, cependant le premier script n'est pas totalement stable, y'a une chance qu'il va produire une erreur imprévisible.

Cela vient du fait que le script essai de faire deux opérations en même temps à la meme variable serverId

	while serverId == 0 do
		global:delay(10)
	end

Ici le script 1, tous les 10 milliseconds, il lis la valeur de la variable serverId, et lorsqu'il reçoit BasicWhoIsMessage il va écraser la valeur de la variable serverId, et si ces deux opérations de lecture et écriture coincident dans un même instant, cela peut provoquer une erreur.

Eviter l'utilisation de DEVELOPER_MULTI_THREADING = true sauf si vous n'avez pas une alternative à votre problème.