Bonjour,
Je vous propose quelque chose qui pourrait aider à pallier au problème d'inventaire plein, grâce à euclide et ses fonctions listuiitemvisible et fastcheckuivalue qui ont ouvert de nouvelles possibilités.
Principe : lorsque le bot try de grab, on check si un message d'erreur s'affiche. Si c'est le cas, town portal puis vidage de l'inventaire. On reprend le tp et on retry de grab l'objet. Ensuite le bot continue sa route.
Je préviens je n'ai pas fais 200 runs avec. Mais grâce à la contribution des testeurs, la fonction s'améliore et on résoud les bugs.
Important : Par défaut mettez-vous sur l'onglet numéro un du coffre.
Comme bug potentiellement déja connu il y a celui qui fait peut-être que le bot peut avoir des mouvements bizarres lorsqu'il revient de la ville, un peu comme quand on repair en début de game.
Récemment en passant le sleep à la fin de 800 à 3000 un posteur a affirmé que ça avait arrangé le soucis pour lui. Je l'ai mis par défaut.
Autres bugs potentiels :
Il se peut que le bot prenne du temps à comprendre que l'inventaire est plein, si un autre message d'erreur (lié au buff etc.) s'affiche en même temps. Cela risque d'arriver si vous avez des buffs à intervalle très court (3 secs et moins).
N'hésitez pas à reporter tout bug si vous désirez essayer cette astuce.
Gestion des onglets du coffre :
Si un message d'erreur apparaît quand le bot veut mettre un objet dans le coffre, sous-entendant que l'onglet est plein, celui-ci change d'onglet.
Si le 3e onglet est plein aussi, le bot s'arrête.
Tout d'abord la fonction principale . A copier dans toolkit.au3. Il s'agit en fait d'une simple combinaison de fonctions existant déja :
;
; tpfilter
;
Func tpfilter()
_log("Inventory may be full")
$PortBack = False
While Not _intown()
$grabskip = 1
Attack($a_range, $monsterList)
$grabskip = 0
Sleep(500)
$currentloc = getcurrentpos()
MoveToPos($currentloc[0] + 5, $currentloc[1] + 5, $currentloc[2], 0, 6)
If _playerdead() = False Then
_townportal()
Else
Return False
ExitLoop
EndIf
$PortBack = True
WEnd
While Not offsetlist()
Sleep(10)
WEnd
;MoveToPos(2903.009765625,2785.84033203125,28.0814247131348,1,20) ;act 1
;MoveToPos(2903.009765625,2785.84033203125,28.0814247131348,1,10) ;act 1
;MoveToPos(403.055877685547, 371.524749755859, 0.326129168272018, 0, 2) ;act3
;MoveToPos(443.109527587891, 331.811401367188, 0.498693227767944, 0, 2) ;act3
Sleep(Random(500, 1000))
_log('Filter Backpack')
If IsDeclared("item_check_activated") Then
If $item_check_activated = "true" then
_log('Filter BackpackAdvanced')
$Items = FilterBackpackAdvanced()
else
_log('Filter Backpack')
$Items = FilterBackpack()
Endif
else
_log('Filter Backpack')
$Items = FilterBackpack()
EndIf
;Storage
$ToStash = _ArrayFindAll($Items, "Stash", 0, 0, 0, 1, 3)
If $ToStash <> -1 Then
Send("{SPACE}")
; MoveToPos(384.502319335938, 393.374298095703, 0.332142919301987, 0, 6)
Sleep(500)
InteractByActorName('Player_Shared_Stash')
Sleep(700)
Local $stashtry = 0
While _checkStashopen() = False
If $stashtry <= 4 Then
_log('Fail to open Stash')
$stashtry += 1
InteractByActorName("Player_Shared_Stash")
Sleep(Random(100, 200))
Else
Log('Failed to open Stash after 4 try')
WinSetOnTop("Diablo III","",0)
MsgBox(0, "Impossible d'ouvrir le stash :", "SVP, veuillez reporter ce problème sur le forum. Erreur : s001 ")
Terminate()
EndIf
WEnd
$tabfull = 0
For $i = 0 To UBound($ToStash) - 1
_log($Items[$ToStash[$i]][0] & " stash : " & $Items[$ToStash[$i]][1])
Sleep(Random(100, 200))
InventoryMove($Items[$ToStash[$i]][0], $Items[$ToStash[$i]][1])
Sleep(Random(100, 500))
MouseClick('Right')
Sleep(Random(50, 200))
If _inventoryfull() Then
_log('Tab is full : Switching tab')
Sleep(6000)
$i = $i-1
If $tabfull = 0 Then
mouseclick('left',286,194,10)
$tabfull = 1
Elseif $tabfull = 1 Then
mouseclick('left',282,266)
$tabfull = 2
Elseif $tabfull = 2 Then
_log('Stash is full : Botting stopped')
Terminate()
Endif
Else
$ItemToStash = $ItemToStash + 1
Endif
Next
Sleep(Random(50, 100))
Send("{SPACE}")
Sleep(Random(100, 150))
EndIf
Sleep(Random(100, 200))
Send("{SPACE}")
Sleep(Random(100, 200))
Sleep(Random(500, 1000))
Repair()
Sleep(Random(100, 200))
Send("{SPACE}")
Sleep(Random(100, 200))
;Trash
$ToTrash = _ArrayFindAll($Items, "Trash", 0, 0, 0, 1, 3)
If $ToTrash <> -1 Then
Sleep(Random(100, 200))
Send("{SPACE}")
Sleep(500)
InteractByActorName($RepairVendor)
Sleep(700)
Local $vendortry = 0
While _checkVendoropen() = False
If $vendortry <= 4 Then
_log('Fail to open vendor')
$vendortry = $vendortry + 1
InteractByActorName($RepairVendor)
Else
_log('Failed to open Vendor after 4 try')
WinSetOnTop("Diablo III","",0)
MsgBox(0, "Impossible d'ouvrir le vendeur :", "SVP, veuillez reporter ce problème sur le forum. Erreur : v002 ")
Terminate()
ExitLoop
EndIf
WEnd
For $i = 0 To UBound($ToTrash) - 1
InventoryMove($Items[$ToTrash[$i]][0], $Items[$ToTrash[$i]][1])
Sleep(Random(100, 500))
$ItemToSell = $ItemToSell + 1
MouseClick('Right')
Sleep(Random(100, 200))
Next
Sleep(Random(100, 200))
Send("{SPACE}")
Sleep(Random(100, 200))
EndIf
If $PortBack Then
;MoveToPos(403.055877685547, 371.524749755859, 0.326129168272018, 0, 2)
;MoveToPos(382.773223876953, 410.205902099609, 0.703640997409821, 0, 2)
;Sleep(Random(500, 1000))
InteractByActorName('hearthPortal')
Sleep(Random(500, 1000))
While Not offsetlist()
Sleep(10)
WEnd
EndIf
Sleep(3000)
EndFunc ;tpfilter
La fonction qui sert à check le message d'erreur, à coller aussi dans toolkit :
Func _inventoryfull()
$ptr1 = _memoryread($ofs_objectmanager, $d3, "ptr")
$ptr2 = _memoryread($ptr1 + 2364, $d3, "ptr")
$ptr3 = _memoryread($ptr2 + 0, $d3, "ptr")
$ofs_uielements = _memoryread($ptr3 + 8, $d3, "ptr")
$uielementpointer = _memoryread($ofs_uielements + 4 * 1185, $d3, "ptr")
While $uielementpointer <> 0
$npnt = _memoryread($uielementpointer + 528, $d3, "ptr")
$name = BinaryToString(_memoryread($npnt + 56, $d3, "byte[256]"), 4)
If StringInStr($name, "Root.TopLayer.error_notify.error_text") Then
If _memoryread($npnt + 40, $d3, "int") = 1 Then
$uitextptr = _memoryread($npnt + 0xAE0, $d3, "ptr")
$uitext = BinaryToString(_memoryread($uitextptr, $d3, "byte[1024]"),4)
;~ ConsoleWrite(@CRLF & $uitext)
If StringInStr($uitext,'nulle part') or StringInStr($uitext,'inventaire') or StringInStr($uitext,'no place') or StringInStr($uitext,'enough inventory') Then
ConsoleWrite(@CRLF & $uitext)
Return true
Endif
Else
;~ _log($valuetocheckfor & " is invisible")
Return False
EndIf
EndIf
$uielementpointer = _memoryread($uielementpointer, $d3, "ptr")
WEnd
;~ _log($valuetocheckfor & " not found")
Return False
Endfunc
Puis, toujours dans toolkit, vous recherchez la fonction grabit(), et après :
If TimerDiff($begin) > $IgnorePoint Then
; After this time we should already had the item
Return False
Endif
Vous insérez :
If $grabskip = 1 Then Return False Exitloop Endif
A la suite de la deuxième ligne suivante dans grabit :
Interact(_MemoryRead($offset + 0xB0, $d3, 'float'), _MemoryRead($offset + 0xB4, $d3, 'float'), _MemoryRead($offset + 0xB8, $d3, 'float'))
Insérez :
If _inventoryfull() Then Unbuff() tpfilter() Buffinit() Endif
Enfin dans main.au3, ajoutez au début avec toutes les variables qui commencent par Global :
Global $grabskip = 0
Voilà. J'ai décidé de coder et poster cette fonction puisqu'il semble que grâce au travail de tazgrominet, pas mal de gens risquent d'avoir besoin de vider leur inventaire assez souvent.
J'espère que cette fonction, que je compte améliorer au fur et à mesure, et d'ailleurs n'hésitez pas à donner des pistes, vous servira, dans le sens pas trop buggée
Tout retour bienvenu de toute façon.
A plus.
Modifié par plpp, 24 November 2012 - 10:35.


Ce sujet est fermé



