Autoit Création d'un bot paysan

  • Auteur de la discussion Anonymous
  • Date de début
A

Anonymous

Invité
#1
Bonjour à tous, pour débuter avec AutoIt j'aimerai commencer avec un bot paysan pour dofus assez complet avant de l'étendre aux autres récoltes de ressources et enfin aux combats. Je souhaiterai le programmer en socket. Malheureusement le tuto sur les socket en AutoIt présent sur l'ancienne version du forum est inaccessible...Réflexion faite, pour un premier bot, le socket a l'air trop compliqué !

Je vais tout d'abord poster les fonctionnalités de ce bot et les décomposer. Je pourrai à partir de là les programmer.

Lancement du jeu :

1. Lancer le Launcher.
2. Repositionner les Launcher.
3. Cliquer sur "Jouer".
4. Repositionner "Dofus".

Connexion :

1. Cliquer sur la case nom du compte.
2. Taper le nom du compte.
3. Cliquer sur la case mot de passe.
4. Taper le mot de passe.
5. Envoyer "entrée".
6. Attendre 30s.
7. Envoyer "entrée".

(on suppose que la case connexion rapide est ici utilisée, et que le dernier personnage connecté est celui sur lequel on va botter)

Récolter :

1. Trouver la ressource.
2. Cliquer sur la ressource.
3. Envoyer "entrée". (car les boutons comme "faucher" sont transparents à 10%.
4. Attendre X secondes (défini au début dans le GUI).
5. Retour à l'étape 1.

Gérer le up :

1. Détecter la fenêtre de up.
2. Trouver la croix pour ferme la fenêtre de up.
3. Retirer 0.1 au nombre X de secondes entre chaque fauche.

Détecter un inventaire plein :

1. Envoyer "i" toutes les X fauches (défini au début dans le GUI).
2. Déplacer le curseur au début de la barre de pods.
3. Vérifier la couleur.
4. Si la couleur est rouge l'inventaire est plein. Sinon il ne l'est pas.
5. Envoyer "i".

Détecter la postion du personnage (map) :

A voir une fois le reste fait.

Retour en banque :

De même.

Retour après la mort :

De même.

Reconnexion :

1. Détecter une déconnexion.
2. Suivre le processus de connexion vu plus haut.


Voilà un peu pour le premier jet ! J'attends vos réactions et espère que vous me retrouverez le tuto pour coder en socket sous AutoIt, sinon je vais pas pouvoir commencer à coder :p
 
A

Anonymous

Invité
#3
Merci beaucoup :) Je devais pas avoir assez de droit sur l'ancienne version pour les voir !
 
A

Anonymous

Invité
#4
Bonsoir,
j'aurai simplement quelque rubrique a ajouter, des améliorations pour vous :p
Notamment;

- gestion des combats (défenseur de ressource, click sur mob, qui se trouve au même endroit que la ressource a récolter, ...)

- pour la détection d'inventaire plein, faire attention notamment au nombre mit, un nombre trop élevé risquerai de faire buguer votre BOT (du genre, vérifier inventaire après 1000 fauches :p)

- Pour votre personnage, et la détection sur la map. Vous voulez le faire hors combat ou dans le combat ?
(pour dans le combat, il suffit de détecter la couleur, cercle rouge), pour dehors, j'ai bien une idée ... mais y'a peut être mieux. (elle consiste a coder les cellID dans un tableau qui contient la position x,y sur la fenêtre, ainsi on récupere la position de notre personnage en passant par le chat "/cellid")

- pour la rubrique UP, plus spécifiquement ceci => "2. Trouver la croix pour ferme la fenêtre de up." il suffirai d'envoyer un "escape" pour fermer la fenêtre, si la touche raccourci n'a pas été modifiée.

- pour la rubrique Inventaire plein, plus spécifiquement ceci =>"2. Déplacer le curseur au début de la barre de pods.", il est inutile de déplacer le curseur, un pixelgetcolor(x,y) devrai être suffisant. non?

- j'ajouterai, des phrase dites au hasard, du genre "quelle belle journée", "pourquoi tu me dérange, tu vois bien que je travaille non ?", pour masquer un peu le fait d'être un BOT :)

Sinon, ça m'a l'air pas mal du tout ^^
Courage ! & Bon codage !! :D
 
A

Anonymous

Invité
#5
Pas bête :)

La détection de la map serait hors combat. Elle permettrait de pouvoir se situer afin de pouvoir retourner à l'entrée d'astrub/bonta (le plus proche), puis à la banque.
 
A

Anonymous

Invité
#6
ha oui, vous parlez de map, moi je pensait par "case" (cellid) :oops:

C'est "simple" pour la map, vous récupérez l'info grâce à la commande "%pos%" avec un petit algorithme, vous devriez arriver a vos fin :p
 

Geraff

Administrateur
Membre du personnel
Inscrit
13 Mars 2008
Messages
564
Reactions
0
#7
Plutôt que de copier coller des tutos il ne serait pas plus normal de donner les liens vers ceux-ci?
 
A

Anonymous

Invité
#8
A vrai dire, donner des liens vers l'ancien forum, sans savoir quand il sera "détruit", j'ai pas trop aimer cette idée.
sans oublier qu’apparemment il ne pouvais pas y accéder ^^
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#10
Pandi_Panda a dit:
Pour votre personnage, et la détection sur la map. Vous voulez le faire hors combat ou dans le combat ?
(pour dans le combat, il suffit de détecter la couleur, cercle rouge), pour dehors, j'ai bien une idée ... mais y'a peut être mieux. (elle consiste a coder les cellID dans un tableau qui contient la position x,y sur la fenêtre, ainsi on récupere la position de notre personnage en passant par le chat "/cellid")
Je code actuellement moi aussi un bot, et cette idée me semble pas mal, mais je n'ai pas trop compris.

Pourrais-tu m'expliquer plus en détails le fond de ton idée ?
 
Inscrit
17 Mars 2009
Messages
48
Reactions
0
#11
Le dernier message date du 30 Juin.

En fait, je crois qu'il voulait récupérer l'ID de chaque map (/mapid) et d'y inscrire les pos dans un fichiers, par la suite le personnage n'aurais qu'à taper "/mapid" dans le chat pour savoir où il se trouve. MAIS il est impossible (ou presque) de récupérer un nombre avec un bot "recherche de pixel".
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#12
Ah ouais, je confonds cellid et mapid. cellid je pense pas que ce soit très utile. Mais mapid, ça peut être intéressant pour se repérer dans le jeu, pour aller à la banque par exemple.

KardSharpz a dit:
MAIS il est impossible (ou presque) de récupérer un nombre avec un bot "recherche de pixel".
Là, tu te trompes ;)

Pandi_Panda a dit:
Le plus facile étant de faire un "selectioner tout - copier". Un petit click au dessus de ou vous parler, donc ou vous pouvez lire les messages, un envoi de "ctrl+a" et ensuite un "ctrl+c" ! Il vous suffit de parser les données qui sont dans le clipboard (à savoir ClipGet()).
 
Inscrit
17 Mars 2009
Messages
48
Reactions
0
#13
Si je me trompe, prouve moi le contraire (avec un code) :D
 
A

Anonymous

Invité
#14
La recherche de pixel ne peut pas rechercher un caractère, cependant une fonction autoit peut identifier la pos sur la map dans la quel on est, je ne me rapelle plus la quelle c'est. (En haut a gauche du jeu, la pos s'affiche)
 
A

Anonymous

Invité
#15
Pourquoi vouloir rechercher un caractère ? Sans oublier qu'il est TOUT à fait possible de le faire en Autoit, très hardu, mais faisable ...

Bref, j'ai rechercher dans mes archives et ceci devrai vous convenir;

Code:
#cs ----------------------------------------------------------------------------

 AutoIt Version : 3.3.6.0
 Auteur:         Pandi_Panda

 Fonction du Script :
	 # _Chat_Capt_String($fenetre,$x,$y); permet de recuperer le texte du chat Do.fus, de la fenetre voulue ; $_Do_fus_Chat_String contient le texte
		@PARAM:
			> $fenetre = le nom de la fenetre, le meme que le nom du Personnage
			> $x,$y = les position en x et y du chat (ou l'on voit les message défilé)
		@ERROR:
			> @ERROR=1 ; fenetre pas trouvée
	# _Send_To_Do_fus($fenetre,$str="",$chat=true); envoi sur le chat do.fus, le string mit !
		@DESCRIPTION:
			> permet d'envoyer une phrase/mot à un chat de dofus, sans avoir la fenetre active (ctrlSend())
			> permet de gerer l'envoi de touche clavier. [ouvrir inventaire, sort, ...]
			> Problème actuel, l'envoi de ctrl^w,ctrl^c,ctr^a ne fonctionne pas. il faut passer par un "Send()".
			> changer le raccourci ctrl^w par ["p" par exemple], permet de passer le tour, sans que la fenêtre soit "active"
		@PARAM
			> $fenetre = le nom de votre personnage ou fenetre de Dofus.
			> $str = le mot / la phrase a envoyer
			> $chat, pour si taper dans le chat ou pas ! [si false => exemple : 'i' ouvre l'inventaire]
		@ERROR:	
			> @ERROR=1 ; erreur parametre
			> @ERROR=2 ; pas trouver de fenetre
#ce ----------------------------------------------------------------------------
#include-once

Global $_Do_fus_Chat_String=""

Local $nom_Perso_Egal_Nom_Fenetre="VotreNomDePersoCaseComprise"
Local $phraseEnvoi="kikouuuu"

WinActivate($nom_Perso_Egal_Nom_Fenetre)
Sleep(500)
WinMove($nom_Perso_Egal_Nom_Fenetre,"",0,0,500,500) ; on met en haut a gauche en 0,0 [optionnel]

_Send_To_Do_fus($nom_Perso_Egal_Nom_Fenetre,$phraseEnvoi,True) ; envoi "kikouuuu"
Sleep(500); pour attendre qu'il envoi ;)
If Not @error Then
	_Chat_Capt_String($nom_Perso_Egal_Nom_Fenetre,160,428) ; permet de recuperer les String(s) du Chat[$x,$y sont les positions ou click au chat]
	MsgBox(0,'',$_Do_fus_Chat_String)
Else
	MsgBox(0,"","erreur, fenetre ou nom de fenetre incorrecte !")
EndIf

Func _Chat_Capt_String($fenetre,$x,$y)
	If WinExists($fenetre) Then
		If WinActive($fenetre) Then
;~ 			MouseClick("left",527,707,1,0); rendre actif le "chat pour selectionner"
			MouseClick("left",$x,$y,1,0); rendre actif le "chat pour selectionner"
			Send("^a"); tout selectionner
			Send("^c"); copier
			$_Do_fus_Chat_String=ClipGet(); on recupere les infos du chat
			_Send_To_Do_fus($fenetre,"",True); pour eviter d'avoir tout en "surligner", simule un "{enter}" avec envoi de ""
		Else
			WinActivate($fenetre)
			_Chat_Capt_String($fenetre,$x,$y) ; recuservité
		EndIf
	Else
		SetError(1)
	EndIf
EndFunc

Func _Send_To_Do_fus($fenetre,$str="",$chat=True)
	If IsString($fenetre) And IsString($str) And IsBool($chat) Then; verifie les parametre bien initialiser
		Local $error
		If $chat Then
			$error=ControlSend($fenetre,"","","{ENTER}",0)
			If $error <> 0 Then ; si on a trouver la fenetre
				Sleep(50)
				ControlSend($fenetre,"","",$str,1)
				ControlSend($fenetre,"","","{ENTER}",0)
			Else
				Return SetError(2,0,False); erreur nom de la fenetre.
			EndIf
		Else
			$error=ControlSend($fenetre,"","",$str,0)
			If $error=0 Then Return SetError(2,0,False); FENETRE PAS TROUVEE
		EndIf
	Else
		return SetError(1,0,False); ERREUR VARIABLE.
	EndIf
EndFunc

Edit: ajout des commentaire pour les fonctions :p
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#16
@Pandi_Panda : Intéressant, je risque de m'en servir, merci. Mais y a un truc que je comprends pas : "include-once", ce n'est pas l'orthographe que j'ai l'habitude de voir, peux-tu m'expliquer ?

@Lolodu92 : Je vois pas comment c'est possible de récupérer les coordonnées affichés en haut à gauche... Vu qu'on ne peut pas les sélectionner.
 
A

Anonymous

Invité
#17
c'est simplement que ca permet d'avoir un exemplaire unique d'une include ^^

si tu as 3 fichier test.au3,test2.au3 et test3.au3

Si dans le test.au3, tu as un #include "test2.au3"
et dans le test2.au3, tu as un #include de "test.au3"

le #include-once , permet de pas avoir le problème de double fonction qui on le même nom, ... comme tu ne garde en réalité qu'un seul exemplaire / include

je sais pas trop si c'est clair :p
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#18
Ça permet juste d'éviter les conflits de fonctions, s'il y a des fonctions de même nom ?

Par exemple, si test2 appelles une fct dans test3 qui a le même nom qu'une fonction dans test1 ?
 
A

Anonymous

Invité
#19
NicoMasterChief a dit:
Ça permet juste d'éviter les conflits de fonctions, s'il y a des fonctions de même nom ?

Par exemple, si test2 appelles une fct dans test3 qui a le même nom qu'une fonction dans test1 ?
Oui +- xD ^^ voici la doc
 
A

Anonymous

Invité
#20
Sinon pour récupérer les coordonnées tu pourrais peut être utiliser Tesseract
 
Haut Bas