Pointer + Offsets in AutoIt beschreiben

05/15/2010 22:40 Chillex#1
Also ein HI an alle AutoIt'ler,
Erstmal ich bin AutoIt Anfänger.:D (nur so zur Info)

Jetzt auch schon sofort zur Frage:

Ich hab im Spiel "4story"(online Game) den Pointer + 2 Offsets für die Adresse gefunden ,die mich durch Beeinflussen
entweder sichtbar oder unsichtbar erscheinen lässt.

Dazu ein Screen aus Moonlight Engine
Pointeradresse ist "0069D8F0"
Offset 1 : A20
Offset 2 : 42c
..bringen mich zu der Adresse mit der ich im Spiel "visible" bzw "invisible" bin.

So nun meine Frage ist wie ich Pointer + die Offsets im AutoIt script so verbaue ,dass sie durch einen Buttonklick aktiviert werden.

Bis dahin komme ich zuzeit aber weiter weiß ich nicht mehr.
der Anfang müsste doch so richtig sein oder?

Nur ich weiß wirklich nicht wie ich nun die Pointer mit den Offsets benutzen soll.
Wenn ich Button1 anklicke soll ich unsichtbar werden.
(ahso value die einen unsichtbar macht 16842753)
so hätte ich es mir vorgestellt aber es klappt nicht ^^
Hab schon im 4story bereich gefragt hab auch Antworten bekommen
bei denen ich anfangs dachte sie würden mir weiterhelfen
aber dem ist nicht so.

Nun hoffe ich hier auf Hilfe, dass mir jemand erklären kann wie man Pointer+ Offsets ins AutoItscript einbaut
und wie ich sie ,wie Adressen beschreiben(im Sinne verändern) kann :D
(Habe hier schon einige threads dazu gefunden (9stück) aber keiner hat mir wirklich weitergeholfen.
In Google hab ich auch schon lange Zeit gesucht aber nirgends gibts ein Beispiel an dem ich sehen könnte wies geht)
05/16/2010 02:03 huberhans#2
Du mußt erstmal nachsehen, ob deine NomadMemory.au3 die Funktionen _MemoryPointerRead und _MemoryPointerWrite hat.

Falls ja ist es ganz einfach:

PHP Code:
#include <NomadMemory.au3>

Hier sollte irgendwo die GUI definiert werden <

GUISetState(@SW_SHOW$GUI)

Global 
$Pointer 0x0069D8F0
Global $Open _MemoryOpen(ProcessExists("TClient.exe"))
Global 
$Offset[3] = [00xA200x42c]

While 
1
   $NMG 
GUIGetMsg()
      Switch 
$NMG
         
Case $GUI_EVENT_CLOSE
            
Exit
         Case 
$Button1
            _MemoryPointerWrite
($Pointer$Open$Offset16842753)
      EndSwitch
WEnd 
Wichtig hierbei: Bei den Offsets musst du die "0x" mit angeben, damit die Werte als Hex-Zahlen erkannt werden!

Wenn du nur die Funktion _MemoryWrite zur Verfügung hast, mußt du meines Wissens die Offsets auf den Pointer addieren, hab ich persönlich aber nie so gemacht, da die MemoryPointer-Geschichte einfacher in der Handhabung ist.

Gruß
05/16/2010 13:41 Chillex#3
Meine Nomadmemory.au3 hat zwar MemoryPointerWrite und MemoryPointerRead nicht dafür hab ich die Pointer.au3 genommen.
Deine Antwort war mir eine wirklich groooße Hilfe :D
Es funktioniert, so mein Problem wäre damit gelöst :)
05/18/2010 17:55 eexerasann#4
wo kann ich die Pointer.au3 runterladen
05/18/2010 18:29 huberhans#5
Einfach mal googlen
05/22/2010 19:38 Chillex#6
so hab jetzt noch eine Frage ..
das mit pointern beschreiben hab ich verstanden danke nochmal :D

also:
ich hab einen Radio(-button?)
so ich weiß wie ich nun auslese
und beschreibe:
das "$check" müsste eigentlich nichtmal in den PointerWrite teil.
naja egal.
Es geht mir nur darum dass ich die Adresse nicht "freezen" kann wie bei CE zum bespiel.
Sobald ich im SPiel eine Aktion ausführe sezt sich der Wert "424" einfach zurück.
Und ich weiß nicht warum.
Bei anderen Adressen wie z.B bei "Invisible"(der Unsichtbarkeit) freezt sich der Wert und bei der nicht.
Hab es mal mit einer while Schleife probiert da "freezt" sich der Wert zwar dann aber ich kann in dem Fenster keine weiteren Sachen mehr anklicken.
Also habs mal so probiert nur so kann ich nichts mehr im Fenster machen^^
hoffentlich kann mir jemand sagen wie man denn nun den einen Wert in AutoIt freezen kann.
(ahja der Wert ,um den es hier geht ist in CE freezbar nur in AutoIt schaff ich's nicht)

(edit. obwohl die adressen freezen sich bei mir nie so richtig nur ne zeit lang oder garnicht^^
also meine Frage lautet nun eher wie man jeden Wert in AutoIt freezt :D)
05/22/2010 20:18 huberhans#7
Freezen an sich kannst mit AutoIt nicht. Was du machen kannst, ist folgendes.
Du kannst die _MemoryPointerWrite()-Zeile in ner Schleife laufen lassen, dann wird dein Wert immer wieder neu gesetzt.
So, nun gibt's aber auf dem ersten Blick das Problem, daß das Script ja dann in dieser Schleife hängen bleibt. Dazu ist die Lösung eigentlich ganz simpel.

Eine Haupt-Schleife hast ja sowieso. Nun kannst du ja aus dieser Funktionien aufrufen.
Setz für den Wert, den du gefreezt haben willst einfach ne Checkbox als Bedingung, dann siehts folgendermaßen aus:
PHP Code:
While 1
.
.
.

   
Setze_Wert() ; Hier wird die Funktion zur Abarbeitung aufgerufen
Wend

Func Setze_Wert
()
   If 
GUICtrlRead($CheckBox) = $GUI_CHECKED THEN
       _MemoryPointerWrite
()
   EndIf
Endfunc 
Kurz zur Erklärung:
Dein Script durchläuft ja immer die HauptSchleife von oben nach unten und springt von dort aus immer zu den aufgerufenen Funktionen und wieder zurück in die Schleife. Ist nun in der GUI die Bedingung erfüllt (Checkbox angehakt) dann setzt dein Script in der Funktion Setze_Wert() eben die Memory-Adresse jedes mal, wenn es an der Reihe ist (im Millisekunden-Takt) den Wert neu.
Fertig

Gruß

P.S.: Die Checkbox war nur zur Erklärung, die Bedingung kannst natürlich auch über 'n Radion-Button oder sonstiges festlegen.
05/22/2010 21:07 Chillex#8
Danke für deine Antwort :)
...Mh also verstanden hab ichs aber der Wert setzt sich leider immer noch zurück.

Mein Code:
Mach ich irgendetwas falsch?
Ich sehe in Cheat Engine dass sich der Wert in 424 ändert aber wenn ich im Spiel was mache ändert sich die Value wieder in eine ganz andere.
Das "$GUI_CHECKED" muss ich das vielleicht noch deffinieren in mein Script,
weil das ja eine variable ist?
Aber eigentlich ja nicht ,sonst hätte AutoIt ja schon gemekert dass es eine
nicht deffinierte variable ist und das hat es nicht.
Ich weiß nun wirklich nicht wie ich weitermachen soll
also wie ich adressen freezen soll.
Oder ist doch ein Fehler im dem Script von mir?:confused:

(sorry ,dass ich das ,von dir geschriebene nur doof kopiere und an meinem script leicht anpasse ,
aber hab leider nicht so viel Ahnung von AutoIt ^^)
05/22/2010 21:29 huberhans#9
Schreib mal den funktionsaufruf in der schleife nach dein EndSwitch.
Da in der Funktion die Bedingung sowieso abgefragt wird, brauchst sie nicht per Case $Radio1 aufrufen sondern einfach dauerhaft mit laufen lassen

Edit: Weil ich's grad seh, den Offset kannst auch vor der Schleife definiern, das muß nicht in der Funktion stehen
05/22/2010 22:06 Chillex#10
hm.
(1)okay Funktion hinter das EndSwitch getan aber jetzt kommt einer Error
"While Statment has no matching WEnd statement"
also die while schleife hat kein richtiges Ende.
Und es gibt ein "Wend".
(2)Und was ich noch nicht versteh ist dass ich das "Case $Radio1 " nicht brauche.
Das Programm muss doch wissen auf welche/n Radiobutton, Button Checkbox etc. ich die Funktion grade anwenden will?
(3) wenn ich dass Offset nicht vor den _MemoryPointerWrite teil schreibe dann sagt er mir dass er die variable $Offset nicht fiinden kann.
es geht nur wenn die Variable $Offset vor dem PointerWrite Teil steht.
Also hab das jetzt nicht ganz verstanden^^
05/22/2010 22:43 Benhero92#11
Hier so sollte es gehen:
Code:
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Radio1
			BeschreibeAdresse()
	EndSwitch
WEnd

Func BeschreibeAdresse()
	If GUICtrlRead($Radio1) = $GUI_CHECKED Then
		Global $EOffset[3] = [0, Dec("A08"), Dec("474")]
		_MemoryPointerWrite($pointer1, $open, $EOffset, "424")
	EndIf
EndFunc   ;==>BeschreibeAdresse
05/22/2010 22:54 Chillex#12
auch danke für die antwort nur das habe ich ja schon bereits gemacht.^^
leider wird die Adresse dadurch nicht gefreezt.
und ich weiß nicht wie ich das richtig anstellen soll.^^
05/22/2010 23:03 huberhans#13
Quote:
Originally Posted by Chillex View Post
auch danke für die antwort nur das habe ich ja schon bereits gemacht.^^
leider wird die Adresse dadurch nicht gefreezt.
und ich weiß nicht wie ich das richtig anstellen soll.^^
PHP Code:
While 1
    $nMsg 
GUIGetMsg()
    Switch 
$nMsg
        
Case $GUI_EVENT_CLOSE
        
Exit
EndSwitch

BeschreibeAdresse() 

WEnd








Func BeschreibeAdresse
()        
    If 
GUICtrlRead($Radio1) = $GUI_CHECKED THEN
        
Global $EOffset[3] = [00xA08 0x474]
     
_MemoryPointerWrite($pointer1,$open,$EOffset,"424")

   EndIf
Endfunc 
Probier's so
05/23/2010 18:51 Chillex#14
asoo :D
okay danke ..so wird die funktion also immer wiederholt^^
05/23/2010 20:28 huberhans#15
Quote:
Originally Posted by Chillex View Post
asoo :D
okay danke ..so wird die funktion also immer wiederholt^^
Richtig! Jede Funktion, die so in der Haupt-Schleife aufgerufen wird wird bei jedem Durchlauf derselben abgearbeitet. In den Funktionen einfach mit If eine Bedingung festlegen, die du dann per Button, Checkbox, Radio, TimerInit/TimerDiff oder auch über ausgelesene Values ansteuer kannst.

Gruß