Aller au contenu


Photo

[Fonction] Purge Inventaire Full


  • Ce sujet est fermé Ce sujet est fermé
205 réponses à ce sujet

#1 plpp

plpp

    Fragger débutant

  • Membres
  • 524 messages

Posté 07 November 2012 - 15:35

Ne fonctionne qu'avec les versions anglaises et françaises du jeu.

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 :D.
Tout retour bienvenu de toute façon.

A plus.

Modifié par plpp, 24 November 2012 - 10:35.


#2 Skd

Skd

    Hard Gamer

  • Membres
  • 398 messages
  • Location :Inferno

Posté 07 November 2012 - 16:12

Encore une belle amélioration!

Dans les bugs potentiels tu as peut-être aussi le problème quand le bot essaie de grab un item alors qu'il combat encore, actuellement il prend quelques claques mais rien de grave mais si il essaie de tp est-ce qu'il va pas mourir?
Image IPBDeux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...

#3 ludogiibs

ludogiibs

    Débutant lvl 2

  • Membres
  • 47 messages

Posté 07 November 2012 - 16:15

J'allais poster une fonction pour ce sujet, mais je vois que tu est plus rapide ce n'est plus nécessaire. joli travail ;)

#4 plpp

plpp

    Fragger débutant

  • Membres
  • 524 messages

Posté 07 November 2012 - 16:31

Encore une belle amélioration!

Dans les bugs potentiels tu as peut-être aussi le problème quand le bot essaie de grab un item alors qu'il combat encore, actuellement il prend quelques claques mais rien de grave mais si il essaie de tp est-ce qu'il va pas mourir?


Normalement le bot fight les mobs à portée de attack range avant de tp. J'ai testé une fois il l'a fait. Après je n'exclue pas complètement qu'un mob se pointe de nulle part alors qu'on a commencé à invoquer le tp. A report ici si ça arrive.

#5 plpp

plpp

    Fragger débutant

  • Membres
  • 524 messages

Posté 07 November 2012 - 16:41

Ajout de gestion des onglets pleins (cependant si 3e onglet plein l'inventaire restera plein). Par défaut mettez-vous sur le premier onglet (important).
Augmentation du temps de sleep lors du retour du bot après le vidage, pour éviter bug que le bot reprenne le tp pour vidage.

#6 Fsb

Fsb

    Gamer lvl 1

  • Membres
  • 137 messages

Posté 07 November 2012 - 16:43

Merci beaucoup plpp, je vais tester ca de suite :)

#7 plpp

plpp

    Fragger débutant

  • Membres
  • 524 messages

Posté 07 November 2012 - 17:47

Attention : j'avais oublié de rajouter le check de condition pour utiliser la fonction de tri avancé de tazgrosminet. C'est chose faite.

Et comme je l'ai rajouté au début du premier post, n'utilisez cette fonction que si vous utilisez la fonction de tri avancée de tazgrosminet.


Edit : ce cas est corrigé, voir post juste après.

#8 plpp

plpp

    Fragger débutant

  • Membres
  • 524 messages

Posté 07 November 2012 - 18:11

Ok. Normalement maintenant vous pouvez utiliser la fonction que vous utilisez ou pas celle de tazgrosminet.

Ajout important : pour ceux qui avaient déja copié la fonction (rajout fait dans le premier post).

Tout d'abord, dans main.au3, après (normalement au tout début) :

Global $AttribInterop = ObjCreate("AttribVB.ClsAttribVB");

Rajoutez :

Global $item_check_activated = "false"


#9 Fsb

Fsb

    Gamer lvl 1

  • Membres
  • 137 messages

Posté 07 November 2012 - 18:55

Hmm, j'ai pas tout saisit, j'utilise la fonction de taz et la tienne, avant ta modif de 18h11, mais il me semble ne pas rencontrer de problème ><

#10 plpp

plpp

    Fragger débutant

  • Membres
  • 524 messages

Posté 07 November 2012 - 18:59

Hmm, j'ai pas tout saisit, j'utilise la fonction de taz et la tienne, avant ta modif de 18h11, mais il me semble ne pas rencontrer de problème ><

Et bien le bot risque de ne pas appliquer tes filtres si tu n'as pas ajouté la condition de $item_check_activated = true dans tpfilter().

#11 Fsb

Fsb

    Gamer lvl 1

  • Membres
  • 137 messages

Posté 07 November 2012 - 19:02

Si il l'utilise, il vient de me filtrer un anneau DCC et CC, en utilisant ta fonction, mais par précaution, je vais la rajouter :)

Du coup ca donne :
Spoiler


C'est bien ca ?

Mettre true si on utilise la fonction de Taz et false sinon ?

#12 plpp

plpp

    Fragger débutant

  • Membres
  • 524 messages

Posté 07 November 2012 - 19:12

Si il l'utilise, il vient de me filtrer un anneau DCC et CC, en utilisant ta fonction, mais par précaution, je vais la rajouter :)

Du coup ca donne :

Spoiler


C'est bien ca ?

Mettre true si on utilise la fonction de Taz et false sinon ?


Si tu parlais juste de cet ajout, il n'est pas nécessaire si tu utilises la fonction de taz.
Je l'ai rajouté pour assurer le coup pour tout le monde. Tu peux le laisser à false par défaut.
Si tu le mets avant tous les #include (ce qui est préconisé), autoit te la mettra à true de toute façon par la suite avec la fonction de taz etc.

#13 Fsb

Fsb

    Gamer lvl 1

  • Membres
  • 137 messages

Posté 07 November 2012 - 19:20

ahhhh ok :)

Bah merci pour ces éclaircissements ;)

#14 plpp

plpp

    Fragger débutant

  • Membres
  • 524 messages

Posté 07 November 2012 - 19:24

Np. Mais tu parlais bien dans le cas de l'utilisation de ma fonction, quand le bot est parti purger l'inventaire ?

#15 Fsb

Fsb

    Gamer lvl 1

  • Membres
  • 137 messages

Posté 07 November 2012 - 19:30

Oui exactement, j'utilise la fonction de taz ET la tienne pour que le bot aille se vider quand il est full, et jusque la aucun probleme, tout fonctionne nikel

#16 D3Shines

D3Shines

    Gamer lvl 2

  • Membres
  • 161 messages

Posté 07 November 2012 - 19:30

J'ai une erreur aprés avoir fait tout les chgt cité

Fichier(s) joint(s)



#17 plpp

plpp

    Fragger débutant

  • Membres
  • 524 messages

Posté 07 November 2012 - 19:31

J'ai une erreur aprés avoir fait tout les chgt cité

http://imageshack.us...ugline1789.png/


Dsl l'img est illisible.

#18 D3Shines

D3Shines

    Gamer lvl 2

  • Membres
  • 161 messages

Posté 07 November 2012 - 19:37

Image uploaded , au cas ou ça dit

line 1789 dans le toolkit_au3
Wend

Error:Wend statement with no matching While statement

#19 plpp

plpp

    Fragger débutant

  • Membres
  • 524 messages

Posté 07 November 2012 - 19:42

Image uploaded , au cas ou ça dit

line 1789 dans le toolkit_au3
Wend

Error:Wend statement with no matching While statement

Copie colle moi le paragraphe qui englobe la ligne en question dans ton toolkit. J'utilise une version différente donc je peux pas te dire.

#20 D3Shines

D3Shines

    Gamer lvl 2

  • Membres
  • 161 messages

Posté 07 November 2012 - 19:47

je t'ai envoyé en mp.

Merci