Autoit FastFind, mal utilisé ?

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

Anonymous

Invité
#1
Bonjour,bonsoir,

J'ai découvert ce forum il y a peux ( pour dire moins d'une semaine ), et y est découvert les joies de l'AutoIt, ainsi que beaucoup d'astuces fortes utiles :D , et je vous en remercie ! ;)

Donc ayant la tête pleine "d'astuce cadernisène" :p je me lance dans la création d'un petit bot récolte pour D. ( faut bien commencer quelque part non ?)
Tout ce passe bien je prend les couleurs de mes pixels, je fait mes fonctions bla,bla,bla....

Tout d'abord avec PixelSearch() puis j'ai vue sur plusieurs posts que FastFind pouvait faciliter grandement le repérage d'un pixel à l'écran, et plein d'autre chose !

Donc je m’attelle à intégrer ce fameux FastFind ainsi que sa fonction FFNearestPixel() !

Mais voilà il y a un problème ( Bah oui, EVIDEMMENT ! EVIDEMMENT ! )

Voici le code
Code:
;---------------------------------------
; ----- LES VARIABLES -------------------
; ---------------------------------------

Global $couleurBle[14] = ["0xF9E243", "0xF8DC40", "0xF9CE2B", "0xF7E13F", "0xF8E141", "0xF9E141","0xF7D73E", "0xFFD92B", "0xF8C62A", "0xBD9C2D", "0xFFED2F", "0xFFE82E", "0xFFFF4C", "0xF7DE2C"]


; ===============================
; === Fonctions de Fauche =======
; ===============================


Func _fauchage()
        $posBle = 0
        $i = Random(0,14,1)
        $posBle = FFNearestPixel(1280,1024,$couleurBle[$i]) ;on cherche le blé à l'aide des couleurs stockés dans la variable $couleurBle
        if Not @error Then
				;si le blé est trouvé:
				Win_Click("$NameWindow","left",$posBle[0], $posBle[1],1) ;on clic à la position trouvé à l'aide de PixelSearch puis:
                sleep(7.2*1000+2000);on fait une pause de: Temps_de_fauche(en sec)*1000(pour convertire en ms)+Temps_de_déplacement

        Else
				;sinon :
				TrayTip("non trouvé", "Aucun blé trouvé !", 1000);on indique que rien n'a été trouvé

        EndIf
EndFunc

PS: le bot est en "module" (je sais si c'est comme ça qu'on dit ^^' ) le code ci-dessus est le fichier permettant de faucher, fauchage.au3


Donc le problème est que,

Sois aucun pixel n'est détecter et il m'affiche "Aucun blé trouvé !",
Sois il détecte le pixel vas à la position mais ne fauche pas,
Sois il s’éteint ( je sais pas comment puis ce que je ne lui ai pas demandé, j'ai une fonction prévu pour)
Mais bon réussis à faucher de trois blé quand même ( quand même !)

Pourtant avec PixelSearch() tout marchai très bien, mais je ne jette pas la faute à FastFind au contraire je la jette sur moi !

Vue le nombre de com's positifs envers cet UDF j'ai dû faire une erreur quelque pars :p ! Merci de m'aider svp ;) !

Je remercie aussi FastFrench pour FFShowPixels !
 
A

Anonymous

Invité
#2
D’accord, merci pour ton aide NicoMasterChief :)

je cite aussi la doc française :

Code:
; Exemple : pour trouver le pixel de couleur 0x00AB0C45 le plus proche possible du joueur situé en 500, 500
"Du joueur situé en 500,500" mais comment puis-je déterminer sa pos :?: je ne suis pas en combat, il n'y a aucun anneaux rouge sous ses pieds pour m'aider à le repérer ^^' je ne vois comment récupérer sa pos ...
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#3
Salut, voici mon aide :

1. C'est codé à l'arrache, essaye de travailler un peu l'esthétique, tu arriveras mieux à résoudre tes erreurs si t'y vois plus clair.
2. Ton tableau à 1 dimension "$couleurBle" comporte 14 valeurs numérotés de 0 à 13, or la fonction Random que tu utilises, va de 0 à 14. Quand elle tombe sur 14, ton code plante (et s'éteint), ce qui est normal car il n'y a pas de 15ème valeur dans ton tableau ;)
3. Tu n'as pas déclaré ta variable "$posBle" en tant que tableau, donc elle ne peut pas accueillir des coordonnées.
4. Win_Click c'est quoi ? Ça ne figure pas dans la documentation AutoIt. Moi j'utilise MouseClick, c'est très fiable.
5. S'il ne détecte pas ton pixel, c'est qu'il n'y en a pas, FFNearestPixel ne se trompe pas. Les pixels sont très variés dans les céréales. De plus, je serais toi, j'utiliserais FFNearestSpot plutôt que FFNearestPixel.

Bon courage !
 
A

Anonymous

Invité
#4
Win_click n'est pas une fonction native d'autoit elle me permet de cliqué sans monopoliser ma souris à l'aide d'un dll de windows je te donne la source ou j'ai chopper ce script demain si tu veux ;)

Code:
; ===============================
; === Fonctions de Clic =========
; ===============================


Func _MakeLong($LoWord,$HiWord)
    Return BitOR($HiWord * 0x10000, BitAND($LoWord, 0xFFFF))
EndFunc

Func Win_Click($Title, $iButton = "left", $X = "", $Y = "", $iClicks = 1)
		Local $Full = WinGetTitle ($Title)
		Local $HWnD = WinGetHandle ($Full)
		Local $MK_LBUTTON       =  0x0001
		Local $WM_LBUTTONDOWN   =  0x0201
		Local $WM_LBUTTONUP     =  0x0202
		Local $MK_RBUTTON       =  0x0002
		Local $WM_RBUTTONDOWN   =  0x0204
		Local $WM_RBUTTONUP     =  0x0205
		Local $WM_MOUSEMOVE     =  0x0200
		Local $i                = 0
    If IsHWnD ($HWnD) And WinExists ($Full) <> '0' Then
        Select
			Case $iButton = "left"
				$Button     =  $MK_LBUTTON
				$ButtonDown =  $WM_LBUTTONDOWN
				$ButtonUp   =  $WM_LBUTTONUP
			Case $iButton = "right"
				$Button     =  $MK_RBUTTON
				$ButtonDown =  $WM_RBUTTONDOWN
				$ButtonUp   =  $WM_RBUTTONUP
        EndSelect

        If $X = "" OR $Y = "" Then
           $MouseCoord = MouseGetPos()
           $X = $MouseCoord[0]
           $Y = $MouseCoord[1]
        EndIf

        For $i = 1 to $iClicks
           DllCall("user32.dll", "int", "SendMessage","hwnd",$HWnD,"int",$WM_MOUSEMOVE,"int",0,"long",_MakeLong($X, $Y))
           DllCall("user32.dll", "int", "SendMessage","hwnd",$HWnD,"int",$ButtonDown,"int",$Button,"long",_MakeLong($X, $Y))
           DllCall("user32.dll", "int", "SendMessage","hwnd",  $HWnD,"int",$ButtonUp,"int",   $Button,"long",  _MakeLong($X, $Y))
        Next
    EndIf
EndFunc

je verrais tout cela demain encore merci pour ton aide ;) et bonne fin de soiré/bonne nuit
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#5
Désolé, j'ai supprimé ma réponse, je pensais au début que tu t'étais trompé en utilisant la fonction FF, mais finalement tu l'utilises bien.

Vanggs a dit:
D’accord, merci pour ton aide NicoMasterChief :)

je cite aussi la doc française :

Code:
; Exemple : pour trouver le pixel de couleur 0x00AB0C45 le plus proche possible du joueur situé en 500, 500
"Du joueur situé en 500,500" mais comment puis-je déterminer sa pos :?: je ne suis pas en combat, il n'y a aucun anneaux rouge sous ses pieds pour m'aider à le repérer ^^' je ne vois comment récupérer sa pos ...
Les deuxième et troisième paramètres sont inutiles dans ton cas, mets n'importe quoi (0,0 par exemple, qui est le coin haut-gauche de ton écran, la recherche commencera de haut à gauche jusqu'en bas à droite).
 
A

Anonymous

Invité
#6
Premièrement j'ai remarqué que ma version de FF était la 1.3 et non la 2.0 (dernière en date il me semble) ^^' donc MAJ !

Voici ma fonction maintenant, je n'ai plus de problème d'arrêt, merci pour l'indication je n'avait pas compté le 0 ^^'

Code:
Func _fauchage()
        $posBle
        $i = Random(0,13,1)
        $posBle = FFNearestSpot(0,0,$couleurBle[$i])

	   if Not @error Then

				MsgBox("trouvé", " blé en :", $posBle[0] & "," & $posBle[1], 1000)
				Win_Click("$NameWindow","left",$posBle[0], $posBle[1],1)
                                sleep(7.2*1000+2000)

        Else

				TrayTip("non trouvé", "Aucun blé trouvé !", 1000)

        EndIf
EndFunc

j'ai changé $posBle = FFNearestPixel(0,0,$couleurBle[$i]) et y ai mis 0,0 (décidement ce 0 :p )

1.
Tu n'as pas déclaré ta variable "$posBle" en tant que tableau, donc elle ne peut pas accueillir des coordonnées.
What?

2. j'ai utilisé un Random pour la couleur du blé existe t-il une meilleur solution ?

3.Oui ça marche mieux maintenant, mais reste toujours moins performant que PixelSearch() qui trouve et fauche à chaque fois 0o (quand Random tombe sur la bonne couleur) !
Le problème de "Blé trouvé, perso qui se rend à la position du blé mais qui ne fauche pas" persiste encore donc j'ai rajouté MsgBox("trouvé", " blé en :", $posBle[0] & "," & $posBle[1], 1000)et il trouve le blé à la bonne position mais clique à côté (vérif avec autoitinfo)>< quand il fauche un blé ce n'est celui visée avec $posBle mais celui d'à côté ! Pourquoi ?

Edit 1 : finalement j'ai modifié et remplacé par FFNearestSpot() suivant ton conseil, et ça marche à merveille , il clique à chaque fois sur le blé ! beaucoup mieux que PixelSearch() !

Mais j'aimerais quand même savoir si repérer la couleur du blé à l'aide de Random est la/une bonne façon de faire ?
Et aussi pourquoi avec FFNearestPixel il cliquer à côté 0o
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#7
Vanggs a dit:
1.
Tu n'as pas déclaré ta variable "$posBle" en tant que tableau, donc elle ne peut pas accueillir des coordonnées.
What ?
Non rien, j'ai dit une connerie, j'ignorais jusqu'à présent qu'AutoIt allouer dynamiquement les tableaux. Donc pas besoin de déclarer un tableau.

Vanggs a dit:
2. j'ai utilisé un Random pour la couleur du blé existe t-il une meilleur solution ?
Bah le Random est inutile, tu pourrais tout simplement faire dans l'ordre avec un "For". De plus, avec un Random, tu peux tomber plusieurs fois sur la même couleur de céréale alors qu'elle n'est peut-être pas présente sur la map, donc une perte de temps (de quelques ms bien sûr^^). Tandis qu'avec un For, s'il ne trouve pas un pixel d'une certaine couleur, il passe à la suivante. Et donc tant qu'il trouve des pixels d'une couleur, il garde cette couleur tant qu'elle est présente sur la map.


Vanggs a dit:
3.Oui ça marche mieux maintenant, mais reste toujours moins performant que PixelSearch() qui trouve et fauche à chaque fois 0o (quand Random tombe sur la bonne couleur) !
Le problème de "Blé trouvé, perso qui se rend à la position du blé mais qui ne fauche pas" persiste encore donc j'ai rajouté MsgBox("trouvé", " blé en :", $posBle[0] & "," & $posBle[1], 1000)et il trouve le blé à la bonne position mais clique à côté (vérif avec autoitinfo)>< quand il fauche un blé ce n'est celui visée avec $posBle mais celui d'à côté ! Pourquoi ?
Il faut savoir que sur Dofus, des objets sont composés de pixels qui en fait ne font pas partie de cette objet, ils sont au bord de l'objet et lorsqu'on clique dessus, et bien ça n'interagit pas avec l'objet en question. Donc pour remédier à cela, il suffit de modifier les coordonnées trouvées. Tu sais que la recherche part d'en haut à gauche, donc les pixels que tu trouves en premier sont ceux qui sont en haut à gauche de l'objet. Il suffit de décaler le clic de la souris par rapport aux coordonnés trouvées, on décale le clic un peu en bas et un peu à droite ;)
Exemple : $posBle[0]=50 et $posBle[1]=100
On décale donc le clic : "Win_Click("$NameWindow","left",$posBle[0]+5, $posBle[1]+5,1)"

Vanggs a dit:
Edit 1 : finalement j'ai modifié et remplacé par FFNearestSpot() suivant ton conseil, et ça marche à merveille ! beaucoup mieux que PixelSearch() !
Oui, c'est mieux car ça recherche une zone, ainsi ça évite les pixels "parasites" (décor, persos aux alentours, monstres,...). Fais voir le code de ta fonction FFNearestSpot que je vois ce que tu as mis en paramètre.
 
A

Anonymous

Invité
#8
Bon à savoir les pixel qui "ne sont en fait pas sur les objets"

Voici
Code:
$posBle = FFNearestSpot(40,50,0,0,$couleurBle[$i])

carré de 40x40 (un peux plus petit qu'une pousse de blé) contenant 50 pixels de la couleur demandé

Bah le Random est inutile, tu pourrais tout simplement faire dans l'ordre avec un "For". De plus, avec un Random, tu peux tomber plusieurs fois sur la même couleur de céréale alors qu'elle n'est peut-être pas présente sur la map, donc une perte de temps (de quelques ms bien sûr^^). Tandis qu'avec un For, s'il ne trouve pas un pixel d'une certaine couleur, il passe à la suivante. Et donc tant qu'il trouve des pixels d'une couleur, il garde cette couleur tant qu'elle est présente sur la map.
Je change de ce pas ! c'est surtout intéressant car il garde la couleur du blé en fait :D

Non rien, j'ai dit une connerie, j'ignorais jusqu'à présent qu'AutoIt allouer dynamiquement les tableaux. Donc pas besoin de déclarer un tableau.
Mais si ça n'aurait pas été le cas ça aurait donné ça " Local $posBle[2] = [0,0] " ?


Ha oui et enfin deux dernière question un peux HS :

Mais pense tu qu'avec le système de Win_click je puisse faire tourner deux bot en même temps ? Si deux clic se font au même instant il y aura conflit ?

J'ai vue ton post viewtopic.php?f=58&t=908 je ne trouve le lien vers la source !? D'autre y eu accès (y est-elle toujours je pense notamment à Pandi_Panda) ? Ce serait intéressant pour le script trajet
 
Inscrit
15 Avril 2011
Messages
457
Reactions
1
#9
Vanggs a dit:
Code:
$posBle = FFNearestSpot(40,50,0,0,$couleurBle[$i])
carré de 40x40 (un peux plus petit qu'une pousse de blé) contenant 50 pixels de la couleur demandé
Parfait ;)

Vanggs a dit:
Mais si ça n'aurait pas été le cas ça aurait donné ça " Local $posBle[2] = [0,0] " ?
Moi j'ai l'habitude de déclarer un tableau en AutoIt, comme ceci : "Dim $posBle[2]". Mais maintenant je me rends compte que c'est inutile sauf si je veux le réutiliser dans un autre fichier. Auquel cas, il faut agrandir sa portée, et donc un "Local" ne suffit plus.

Vanggs a dit:
Ha oui et enfin une dernière question un peux HS mais pense tu qu'avec le système de Win_click je puisse faire tourner deux bot en même temps ? Si deux clic se font au même instant il y aura conflit ?
Je connais pas Win_Click. Mais même si ça ne monopolise pas ta souris, les PixelSearch monopolisent ton écran. Tu peux faire tourner 2 bots en même en changeant de fenêtre (donc en utilisant plusieurs clients Dofus), ou utilisant des machines virtuelles, qui reproduire un second système d'exploitation dans ton premier système d'exploitation. Il faut un ordinateur puissant pour cette dernière solution.
 
A

Anonymous

Invité
#10
Moi j'ai l'habitude de déclarer un tableau en AutoIt, comme ceci : "Dim $posBle[2]". Mais maintenant je me rends compte que c'est inutile sauf si je veux le réutiliser dans un autre fichier. Auquel cas, il faut agrandir sa portée, et donc un "Local" ne suffit plus.
Effectivement ça peut être intéressant en fonction du cas

Je connais pas Win_Click. Mais même si ça ne monopolise pas ta souris, les PixelSearch monopolisent ton écran. Tu peux faire tourner 2 bots en même en changeant de fenêtre (donc en utilisant plusieurs clients D.), ou utilisant des machines virtuelles, qui reproduire un second système d'exploitation dans ton premier système d'exploitation. Il faut un ordinateur puissant pour cette dernière solution.
Win_click ---> http://www.cheat-gam3.com/2-cours-pour- ... ris-73759/

Dans ce cas pourrais-je faire tourné deux bot en même temps avec pour chacun assigné une fenêtre ( Sachant que la fonction Win_click ne clique que sur la fenêtre qu'on lui a indiqué ), si deux cliques se font en même ça rique de planter ou l'un prendra le dessus sur l'autre je pense.
Si tu ne sais pas malgré le lien si dessus ce n'est pas grave je ferais des test et si j'y arrive je posterai les résultats ou te préviendrai par mp si tu veux en tout cas un grand merci pour ton aide :) !

Et dernière question ( enfin je l'espère) y aurait t-il un moyen d'indiquer qu'il ne faut chercher les pixels de $color seulement dans une certaine fenêtre

exemple j'ai une fenêtre $NomFenetre et j'indique qu'il faut chercher seulement dans la longueur et la largeur de celle-ci ainsi l'utilisateur pourra redimensionner/placé sa fenêtre à souhait sans interféré dans la recherche de pixel et pas forcément en plein écran !
 

Kyu

Staff
Membre du personnel
Inscrit
4 Octobre 2009
Messages
327
Reactions
8
#11
Éventuellement, au lieu d'utiliser une VM, tu peux envisager un bureau virtuel.
 
A

Anonymous

Invité
#12
Merci, Jones pour l'intervention je ne connaissait pas l’existence du "bureau virtuel".

Mais je n'utiliserai une VM ou un bureau virtuel qu'en dernier recours actuellement je cherche comment récupérer troisvariable : $Height, $With, $x, $y ou simplement $Size et $Position à la manière de Au3info l'un de vous deux aurait'il une solution ?

Actuellement mes fenêtres sont positionnées comme ceci sur un seul écran :


et grâce à Win_click je peux aller sur internet ou autre tout en utilisant ma souris et sans interférer dans le fonctionnement du bot donc actuellement je n'ai ni l'utilité d'une VM ni d'une VD ( virtual desktop ).

EDIT 1 : j'ai trouver quelque chose , sur autoitscript, le WinGetPos() il me donne la taille et pos de la fenêtre

Je vous remercie pour votre aide et passe le sujet en résolut ( comment qu'on fait ? ) :D
 
Inscrit
12 Octobre 2012
Messages
21
Reactions
0
#13
Salut Vanggs, pour ne chercher que les pixels d'une certaine fenetre, et utilise les couleurs de ton blé tu peux proceder ainsi :
$hWnd= WinGetHandle("le_nom_de_ta_fenetre") ; on stocke le handle de la fenetre dans $hWnd
FFSetWnd($hWnd) ; on definit que la capture d'ecran se fera par defaut dans cette fenetre
FFAddColor($ble_color_array) ; on ajoute ce tableau de couleurs dans les valeurs a rechercher sur l'ecran
FFNearestPixel(0,0,-1) ; Je crois que c'est "-1" le parametre a donner pour utiliser par defaut les couleurs ajoutees ci-dessus, a verifier

Voila, en esperant t'avoir aidé :)
 
Inscrit
21 Octobre 2012
Messages
21
Reactions
0
#14
Je pense qu'il est un peu tard.. 3 mois après.. ><
 
Inscrit
12 Octobre 2012
Messages
21
Reactions
0
#15
Ouais je pense aussi, j'ai pas fait attention a la date, mais bon ca peut toujours servir a quelqu'un d'autre ( lors d'une recherche par exemple ) :)
 

Geraff

Administrateur
Membre du personnel
Inscrit
13 Mars 2008
Messages
564
Reactions
0
#16
Merci de ne pas citer directement les messages précédent.
On comprend que vous répondez au message précédent.
 
Haut Bas