Dauerhafter Deathcheck

12/31/2008 15:03 i4mSoH34Vy#1
Hi also ich wollte gerne den Deathcheck über AdlibEnable laufen lassen.
Aber das geht ja nicht, weil er dann die laufende Funktion nicht abbricht.
Wie regelt ihr das denn mit den Deathcheck?
12/31/2008 15:17 Valvepro#2
Ich würds wie folgt machen (ich denke das du probleme damit hast, wegen der MoveTo).
Lass den DeathCheck einfach parallel laufen...
PHP Code:
Bot.exe
DeathCheck
.exe 
In der 'DeathCheck.exe' sollte dann folgendes sein... wenn Bot/Char stirbt dann beende Process Bot.exe und starte ihn erneut (In Bot.exe sollte dann nur die Running Phase sein und keine GUI).

Hoffe es hilft dir :)

Mit freundlichen Grüßen
12/31/2008 15:23 i4mSoH34Vy#3
Denke schon. Dann würde ich das so machen das er zuerst zurück zum Außenposten geht und dann die exe killt. An der MoveTo lag es nicht.^^ Er hat ja resignt als er tot war nur macht er dann trotzdem mit der laufenden funktion weiter
12/31/2008 15:27 Gabba2#4
Ich habs so:
Code:
AdlibEnable("_Deathcheck", 500)
[...]
Func _Deathcheck()
	Select
		Case _MemoryRead($Death, $hprocess) = 1
			$Runs = $Runs - 1
			*resign*
			_Schleife()
	EndSelect
EndFunc  

_schleife() ist dann halt die Schleife die er normal durchgehend ausführt also
while 1
*Wayout*
*fight*
*loot*
*resign*
wend
endfunc
Ist bestimmt auch nicht die beste Lösung, funktioniert aber.
12/31/2008 15:29 __wadim#5
erstell einen zweiten thread, der das für dich überprüft.

[Only registered and activated users can see links. Click Here To Register...]
12/31/2008 15:29 i4mSoH34Vy#6
Danke ihr beiden.
12/31/2008 15:30 kknb#7
@ gabba2 was passiert während dessen mit deiner fight func?
12/31/2008 17:57 tonitusch666#8
Habs im Prinzip auch so gelöst nur dass ich in den Unterschritten und in meiner
MoveTo beim Einsrpung auf einen globalen "dead" Status prüfe, der im addlib Thread gesetzt wird. Dadurch fällt die main loop durch bis an einen bestimmten Punkt zB dort wo auch im Normalfall resign o.ä. abgewickelt wird.
War ganz nützlich bei den ersten Schneemanndungeon Versionen :)
12/31/2008 18:05 Gabba2#9
Quote:
Originally Posted by kknb View Post
@ gabba2 was passiert während dessen mit deiner fight func?
Wie während dessen? Während was genau? Die läuft halt normal weiter bis der Char tot ist, dann wird resigned und die Schleife neu ausgeführt
12/31/2008 18:34 kknb#10
die fight func wird doch nicht abgebrochen wenn die bedingung eintrift, oder?

hab mal nen beispiel gemacht, wenn du f5 drückst wird zwar adlibenable ausgeführt, aber nebenbei läuft noch die "main func weiter, und wird somit nicht abgebrochen.

Code:
#include <Misc.au3>

$dll = DllOpen("user32.dll")


go()

func go()
	adlibenable("msgbox1", 100)
	while 1
		MsgBox (0,"","go")
		sleep(1000)
	wend
	adlibdisable()
EndFunc

func msgbox1()
	if _IsPressed("74", $dll) Then
		MsgBox (0,"","msgbox")
	EndIf
EndFunc
12/31/2008 18:44 Gabba2#11
Ne die func wird nicht abgebrochen aber es werden ja die Funcs dann dazwischen geschoben und _Schleife ist halt eine endlos Schleife. Wenn die Schleife irgendwann enden würde, würde danach die fight Func zu ende gemacht werden da ses aber nie ist...
Optimal ist die Lösung bestimmt nicht und es gibt garantiert elegantere Lösungen aber es funktioniert halt. € Ok, es funtzt doch nicht so wirklich prickelnd.
12/31/2008 18:50 kknb#12
hm bin mir nicht sicher, aber würde dann nicht mit der zeit die speicherauslastung potenziell ansteigen^^?

übrigens hatte ich j199207 vor paar tagen im icq geraten so zu machen, nur ich dachte das es da vielleicht zu problemen mit den funktionen kommen könnte.
01/01/2009 09:36 tonitusch666#13
Erstmal ein gutes neues Jahr @ all :),
scheinbar hat meinen kleinen Einwurf niemand so recht verstanden oder ernst genommen :rolleyes: hier die Grundarchitektur:
* deathcheck, parallelcasts (beim rennen) und status krams in addlib-thread
* ablauf steuerung, einsammeln, resign usw. in main loop
Also in pseudo code sieht das dann so aus:

global tick=0
global dead=false
global running=false

renncast()
if dead return
else
deathcheck()
if tick=0 then hau_ne_sf_rein / running=false ;cast hat running abgebrochen
if tick=7 then machdiesunddas
tick +=1
if tick=72 then tick=0 ;72 is ne nette zahl wenn man obsi loops baut ;-)

killcast()
if dead return
else
deatthcheck()
if mod(tick, 10) then hauaufsmaul ;zyklisch alle 10s
tick +=1
if tick= 30 then tick=0

rennen(x,y)
if dead return
if running=false then running=true / rennlos()
while nichtda und !dead
drehdich und steuer
sleep(100)
wend

deathcheck()
if readmem() then dead=true

;main

rennen(..)
addlib(deathcheck)
rennen(..)
rennen(..)
addlib(renncast)
rennen(..)
rennen(..)
bleibstehn() / running=false /tick=0

if !dead then
addlib(killcast)
while !alletot and !dead
sleep()
wend
sammelkrams()
else
ojeschontoträummalauf()

resign
tick=0 / running=false /dead=false
nochmlvonvorn

so long..
01/01/2009 11:53 Gabba2#14
Das geht so schon aber du musst halt bei längeren Funcs extrem viele If Abfragen machen was bei nem X100 Zeilen Script auch nicht so praktisch ist.

Quote:
Originally Posted by kknb View Post
hm bin mir nicht sicher, aber würde dann nicht mit der zeit die speicherauslastung potenziell ansteigen^^?
Jo stimmt müsste se theoretisch. Aber sagen wir mal der übersprungene Teil hat 5kb selbst wenn der dann 1000 mal übersprungen wird hast du am Ende nur 5mb mehr Ram die verbraucht werden. Eventuell löst AutoIT das ganze ja auch anders und braucht da (fast) gar nicht mehr Speicher für oder löscht die Befehle nach X Stunden oder so.
01/01/2009 20:54 aLasca#15
Also ich habs immer so gemacht
PHP Code:
AdlibEnable("_deathcheck")

Func _deathcheck()

$dcheck PixelGetColor(x,y)
$farbe Iniread(...)

If 
$dcheck $farbe Then

_resign
()

While 
1

_bot
()

Wend

Else
EndFunc 
Ging soweit auch ganz gut.