Merci pour ta contribution qui a l'air super efficace et je testerais ce soir.
J'ai une petite "requête" à formuler...mon personnage crève parce qu'il ne surveille pas sa vie lorsqu'il se déplace (et qu'il n'y a pas de mobs).
Je m'explique : Je joue en inferno mp0 avec mon moine en ambidextrie...j'ai 170k dps donc si tu veux quand je rentre dans un pack il fait 3 secondes, sympa me diras-tu.....sauf que ce qui se passe généralement :
- Le moine rentre dans le pack
- Il ruine le pack en 2-3 coups
- Il ramasse
- Il continue son run...
Sauf que parfois...les élites en question collent des arcane centry
Et le problème c'est que les arcanes centry c'est du pipi de chat quand y a du mob à coté pour voler de la vie...mais quand il y a personne autours et que le moine fais des aller / retour pour looter puis revenir sur son chemin, il crève et souvent en plus...
Sincèrement...c'est quand même rare...mais je suis un peu perfectionniste et que je vois que je crève 4 fois sur 160 runs à cause de ça... ça salie mes stats et j'aime pas ça
Penses-tu qu'il est possible de faire en sorte qu'il utilise ses sorts de survie / potions même lorsqu'il n'y a pas de monstres...?
Bon par contre la fonction tel quelle ne pourra jamais être intégré dans la version actuelle.
Il faut impérativement faire un tableau à deux voir trois dimensions (pour le nombre de séquence) et ne pas déclarer les tableaux manuellement.
Voici un exemple :
#include <Array.au3>
Local $pos[1][5]
Func GetPosToAnArray($newPos)
$Bound = UBound($pos)
ReDim $pos[$Bound+1][5]
$pos[$Bound][5] = $newPos
EndFunc
Func getPos()
GetPosToAnArray([206.692764282227, 722.693603515625, -35.8240203857422,1,25])
GetPosToAnArray([327.7802734375, 722.134643554688, 0.100000239908695, 0, 25])
GetPosToAnArray([361.233367919922, 723.155029296875, 0.0999998897314072, 1, 25])
GetPosToAnArray([396.636413574219, 727.132934570313, 0.292241543531418, 1, 25])
_ArrayDisplay($pos) ; juste pour voir a quoi ressemble larray : à enlever une fois bien compris.
EndFunc
Donc maintenant tu n'auras plus de pos1, pos2 ..... et il nous sera possible d'ajouter cette fonction avec les autres. Ensuite il faut aussi remanier la fonction pour qu'elle puisse gérer un autre tableau de séquence.
Je ne sais plus si autoit autorise à affecter un array directement dans un autre, s'il ne veut pas il faudra faire une boucle for de 0 à 5-1 pour ajouter chaque partie de la position.
Je pense, je n'ai pas testé mais je ne vois pas pourquoi ça marcherai pas :-) Et oui c'est rien de compliqué, c'est juste une projection d'un point sur une droite en 2D
@xoum : J'avoue que c'est moche la déclaration de mes arrays, j'ai pas voulu me prendre la tête et j'ai fait ça vite fait à coup de Find&Replace ;-) Je vais essayer de déclarer les arrays avec ce que tu proposes (quand j'aurai le temps). Merci.
@xoum : Je viens de mettre à jour le code. C'est mieux comme ça ? :-) C'est vraiment une syntaxe à la *** ce langage, mais là je pense que c'est pas trop mal.
Pour que tout le monde comprenne, le code est juste plus "joli", il n'y a rien de nouveau niveau fonctionnel entre la v1.0 et la v1.1 :-)
Re Ultos, j'viens de tester, ca marche du feu de dieu !
J'ai aussi ajouté la fonction de Kick pour pouvoir utiliser les skills pendant le grab des items, mais le truc c'est que je crève toujours quand je cours et que je me prend les arcane centry qui comme par hasard tournent bien en même temps que moi je passe C'est possible d'adapter ça par hasard?
While _MemoryRead($ClickToMoveToggle, $d3, 'float') = 0
par :
While _MemoryRead($ClickToMoveToggle, $d3, 'float') = 0
checkForSpell()
Dans la fonction: MoveToPos($_x, $_y, $_z, $_a, $m_range)
Le problème c'est que cette fonction n'existe plus
Sinon, encore chapeau pour ta fonction, vraiment impressionnant comment ca change la vie
@xoum : Je viens de mettre à jour le code. C'est mieux comme ça ? :-) C'est vraiment une syntaxe à la *** ce langage, mais là je pense que c'est pas trop mal.
Pour que tout le monde comprenne, le code est juste plus "joli", il n'y a rien de nouveau niveau fonctionnel entre la v1.0 et la v1.1 :-)
Ca commence à être très bien, bravo pour la rapidité
Ensuite il faudrait faire la même chose pour les différentes variables : AreaFieldPath et AreaTowerPath. Car la tu prévois déjà des séquences maximum défini et on ne pourra pas facilement en changer.
C'est pour ça qu'il faut refaire un tableau d'un tableau d'un tableau.
Essaye d'indenter ton code c'est un peu dure de le lire .
Spoiler
;;--------------------------------------------------------------------------------
; Function: UsePath(ByRef $path)
; Description:
;;--------------------------------------------------------------------------------
Func UsePath(ByRef $path)
Local $posIndex = 0
Local $size = UBound($path)
Local $TimeOut = TimerInit()
Local $toggletry = 0
$grabtimeout = 0
$killtimeout = 0
$Coords = FromD3toScreenCoords($path[$posIndex][0], $path[$posIndex][1], $path[$posIndex][2])
MouseMove($Coords[0], $Coords[1], 3)
$LastCP = GetCurrentPos()
MouseDown("middle")
Sleep(10)
While 1
If _playerdead() Or $GameOverTime = True Or $GameFailed = 1 Or $SkippedMove > 6 Then
$GameFailed = 1
ExitLoop
EndIf
If TimerDiff($TimeOut) > 75000 Then
_log("UsePath Timed out ! ! ! ")
$GameFailed = 1
ExitLoop
EndIf
GameOverTime()
If $GameOverTime = True Then
ExitLoop
EndIf
$Distance = GetDistance($path[$posIndex][0],$path[$posIndex][1],$path[$posIndex][2])
If $Distance < $path[$posIndex][4] Then
$posIndex +=1
If ($posIndex > $size - 1) Then ExitLoop
$TimeOut = TimerInit()
$toggletry = 0
$grabtimeout = 0
$killtimeout = 0
EndIf
;If _MemoryRead($ClickToMoveToggle, $d3, 'float') = 0 Then ExitLoop
Local $angle = 1
Local $Radius = 25
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
While _MemoryRead($ClickToMoveToggle, $d3, 'float') = 0
;_log("Togglemove : " & _MemoryRead($ClickToMoveToggle, $d3, 'float'))
$Coords = FromD3toScreenCoords($path[$posIndex][0],$path[$posIndex][1],$path[$posIndex][2])
$angle += $Step
$Radius += 45
;MouseMove($Coords[0] - (Cos($angle) * $Radius), $Coords[1] - (Sin($angle) * $Radius), 3)
; ci desssous du dirty code pour eviter de cliquer n'importe ou hos de la fenetre du jeu
$Coords[0] = $Coords[0] - (Cos($angle) * $Radius)
$Coords[1] = $Coords[1] - (Sin($angle) * $Radius)
$Coords[0] = min($Coords[0], 790)
$Coords[0] = max($Coords[0], 40) ;car on a pas l'envie de cliquer dans les icone du chat
$Coords[1] = min($Coords[1], 540);car on a pas l'envie de cliquer dans la bare des skills
$Coords[1] = max($Coords[1],10)
MouseMove($Coords[0], $Coords[1], 3)
$toggletry += 1
;_log("Tryin move :" & " x:" & $_x & " y:" & $_y & "coords: " & $Coords[0] & "-" & $Coords[1] & " angle: " & $angle & " Toggle try: " & $toggletry)
If $angle >= 2.0 * $PI Or $toggletry > 9 Or _playerdead() Then
$SkippedMove += 1
_log("Toggle try: " & $toggletry & " Movement Skipped : " & $SkippedMove & " Pos Skipped : " & $posIndex)
$newIndex = $posIndex + 1;
If ($newIndex > $size -1 )Then ExitLoop 2
If ($newIndex <> $posIndex) Then
_log("MoveToPos pos " & $posIndex & " to pos " & $newIndex)
$posIndex = $newIndex
$TimeOut = TimerInit()
$toggletry = 0
$grabtimeout = 0
$killtimeout = 0
EndIf
ExitLoop
EndIf
Sleep(10)
WEnd
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Sleep(10)
;ConsoleWrite("currentloc: " & $_Myoffset & " - "&$CurrentLoc[0] & " : " & $CurrentLoc[1] & " : " & $CurrentLoc[2] &@CRLF)
;ConsoleWrite("distance/m range: " & $Distance & " : " & $pos[4] & @CRLF)
If $path[$posIndex][3] = 1 And GetDistance($LastCP[0], $LastCP[1], $LastCP[2]) >= $a_range / 2 Then
MouseUp("middle")
$LastCP = GetCurrentPos()
If $path[$posIndex][3] = 1 Then Attack($a_range, $monsterList)
;ConsoleWrite("Last check: " & $Distance & @CRLF)
EndIf
$newIndex = getNextPosIndex($path, $posIndex)
If ($newIndex > $size - 1)Then ExitLoop
If ($newIndex <> $posIndex) Then
_log("MoveToPos pos " & $posIndex & " to pos " & $newIndex)
$posIndex = $newIndex
$TimeOut = TimerInit()
$toggletry = 0
$grabtimeout = 0
$killtimeout = 0
EndIf
$Coords = FromD3toScreenCoords($path[$posIndex][0],$path[$posIndex][1],$path[$posIndex][2])
MouseMove($Coords[0], $Coords[1], 3)
MouseDown("middle")
WEnd
MouseUp("middle")
;;
;Sleep(100)
EndFunc ;==>UsePath
Salut, y a t-il moyen d'adapter ton sequence.au3 pou rla fonction résurrection? Merci
Oui c'est possible mais on va devoir le faire dans l'ordre. Pour ne pas devoir retravailler chaque fonction.
Ensuite il faudrait faire la même chose pour les différentes variables : AreaFieldPath et AreaTowerPath. Car la tu prévois déjà des séquences maximum défini et on ne pourra pas facilement en changer.
C'est pour ça qu'il faut refaire un tableau d'un tableau d'un tableau.
Je ne comprends pas en quoi c'est pas flexible. Les 3 trajets sont bien séparés et éditable chacun de leur coté. Si je veux en ajouter un ou en supprimer un suffit de modifier en 2 secondes la fonction sequence(). Toi tu veux une dimension supérieure dans le tableau réservées aux trajets, je ne vois pas ce que j'y gagne. Et j'ai peur de complexifier la lecture, car les tableaux > 2 dimensions, ça fait pas du code super joli. Peux-tu développer stp ?
Essaye d'indenter ton code c'est un peu dure de le lire .
Les balises spoiler cassent mon indentation, mais je viens de voir comment tu fais, tu mets une balise code dans la balise spoiler, belle astuce ! Idem je ferai ça dés que possible.
Car il va y avoir une fonction qui pourra lire les séquences directement depuis des fichier.
Puis une fonction qui permettra de revivre la personne en fonction de ce qu'elle a déjà fait.
C'est trois fonctions se ressemble et il faut partir sur les mêmes bases pour pouvoir les liées le plus facilement possible.
Mais ne change rien pour l'instant tu as raisons.
(J'ai l'habitude de travailler avec des matrices de 3 voir 4 dimensions, mais c'est vrai que dans un code cela ne reste pas forcement claire.
On verra comment on fera plus tard.)
(J'ai l'habitude de travailler avec des matrices de 3 voir 4 dimensions, mais c'est vrai que dans un code cela ne reste pas forcement claire. On verra comment on fera plus tard.)
Tu peux pas donner des noms a certaines dimensions pour rendre le code plus clair...admettons la première, par exemple :
Bon alors, d’après l'idée de Mat et à la demande de xoum, j'ai ajouter une petite fonctionnalité au revive, lorsque l'on revive la fonction s’appelle elle même pour relancer la séquence en cour depuis le début.
Si nous nous trouvons sur une séquence ronde (ndlr: le point de départ et le point d'arrivée sont le même) après le revive la fonction calcule si il ne serait pas plus avantage d'inverser l'array de base, en partant de la fin en sens inverse jusqu'au point de decé puis repartir dans le bon sens pour finir la séquence en cour.
En devellopant ceci, je me suis rendu compte de deux chose :
- d'une l’amélioration des déplacements rentrera en conflit avec la réécriture de l'array (puisqu'il s'agit d'un aller retour, la fonction voudra abrégé le chemin vers la fin)
- la gestion des déplacements sous forme d'array empêche actuellement d'utiliser toute commande, t'elle que -> sleep, send, InteractByActorName etc... (il va donc falloir travailler ce point !)
Bon j'avoue que je post pas vraiment au bon endroit mais bon ;D
je serais toi Ultos, je mettrais en stand-by le développement de ta fonction en attendant la nouvelle version du bot.
Car moi qui boss sur le revive + chargement des séquences depuis un fichier txt + toi qui améliore le déplacement + hammer qui modifie les routines d'attaque et de grabit. Au final on boss tous sur la même portion de code et je pense que tout ne vas pas s’emboîter comme il faut ;D.
Si tu as un micro, mp moi je te donnerais l'adresse de mon serveur ts pour que l'on discute, peut être pourront nous trouver une méthodologie de travail pour faire fonctionne nos fonctions de concert ;D
D'abord merci Ultos pour ton travail qui est super,
et que je n'arrive pas a mettre en place -.- quand je fais toute les modification à appoter
et que je lance le bot celui ci ne bouge pas et ce message s'affiche dans les logs