Ja, das Script ist Müll.
Quote:
Originally Posted by Logtetsch
Mach das mal so
PHP Code:
Global $PID = ProcessExists ("TClient.exe")
Global $Base = 0x7443280
Global $offsetshop[3]
$offsetshop[0] = 0
$offsetshop[1] = 0x***
$offsetshop[2] = 0x***
While 1
$Open = _MemoryOpen ($PID)
If guictrlread ($checkbox1) = 1 then
_MemoryPointerWrite ($Base, $Open, $offsetshop, 1)
else
_MemoryPointerWrite ($Base, $Open, $offsetshop, 0) ; Das else kannst du weglassen
endif
$close = _MemoryClose ($Open)
Wend
|
Du überprüfst nie, ob der Prozess existiert, oder ob du ein gültiges Handle als Rückgabewert bekommst. Startet man das Script, ohne das 4Story schon läuft, schmiert es gleich ab. Beendet man 4Story vor dem Script trifft selbiges zu.
Ohne weitere Überprüfung fressen die ständigen "_MemoryOpen" und "_MemoryClose" Funktionsaufrufe nur unnötig Ressourcen. Da wäre es besser, wenn man das Script vor 4Story starten muss und "_MemoryOpen" nur einmalig benutzt wird. Handles werden beim beenden von AutoIt Scripts automatisch "geschlossen", "_MemoryClose" würde also komplett entfallen.
Das die Checkbox Variable nie deklariert wurde kreide ich jetzt nicht an, es ist ja nur ein Beispiel. Es geht mir um den Effekt. Wenn das Script läuft und der Shophack nicht ständig aktiv ist kann man von NPCs keine Items kaufen, da sich das Shopfenster nicht öffnet. Der Rat mit weglassen ist auch nicht gut gemeint. Beim aktivieren des Shophacks sollte man eher eine Variable auf "true" setzen. Wird der Hack deaktiviert und die Variable beinhaltet den Wert "true", schließt man das Fenster einmalig und setzt den Wert der Variable auf "false". So kann man auch Items bei NPCs kaufen bzw. verkaufen.
Du musst die benötigten Parameter auch nicht unbedingt alle als globale Variablen definieren. Die Offsets so einem Array zuzuweisen ist Platzverschwendung, das geht auch kürzer. Und warum benutzt du *** bei den Offsets? Ich habe die Pointer released.
Falls du argumentieren möchtest, dass es nur ein Beispiel sei: Wegen schlechten Beispielen entstehen oftmals unnötige Fragen.
Ich habe mal ein vollständiges Beispiel erstellt:
Code:
#include <GUIConstantsEx.au3>
#include <NomadMemory.au3>
GUICreate("KD", 200, 60)
$C_Speed = GUICtrlCreateCheckbox("Speedhack", 5, 5, 90, 17)
$I_Speed = GUICtrlCreateInput("16500", 100, 5, 95, 21)
$C_Skill = GUICtrlCreateCheckbox("Skillhack", 5, 35, 90, 17)
$I_Skill = GUICtrlCreateInput("", 100, 35, 95, 21)
GUISetState()
$Base = 0x719350
Dim $O_Speed1[3] = [0, 0xAF8, 0x9F8]; Standard: 1063675494, +1: 65536
Dim $O_Speed2[3] = [0, 0xAF8, 0xA04]; Standard: 1063675494, +1: 65536
Dim $O_Skill[3] = [0, 0xAF8, 0x460]; 327680000 + Skill ID
Do
$ProcessId = ProcessExists("TClient.exe")
If $ProcessId > 0 Then; wenn der Prozess "TClient.exe" existiert
$Handle = _MemoryOpen($ProcessId)
If Not @error Then; wenn kein Fehler aufgetreten ist (= gültiges Handle)
If BitAND(GUICtrlRead($C_Speed), $GUI_CHECKED) Then; wenn die Checkbox "C_Speed" ausgewählt wurde
$SpeedValue = GUICtrlRead($I_Speed) * 65536
_MemoryPointerWrite($Base, $Handle, $O_Speed1, $SpeedValue)
_MemoryPointerWrite($Base, $Handle, $O_Speed2, $SpeedValue)
EndIf
If BitAND(GUICtrlRead($C_Skill), $GUI_CHECKED) Then; wenn die Checkbox "C_Skill" ausgewählt wurde
$SkillValue = GUICtrlRead($I_Skill) + 327680000
_MemoryPointerWrite($Base, $Handle, $O_Skill, $SkillValue)
EndIf
_MemoryClose($Handle)
EndIf
EndIf
Sleep(50); reduziert die CPU auslastung
Until GUIGetMsg() == $GUI_EVENT_CLOSE
;Script
;wurde
;nicht
;vollständig
;angezeigt
Bringen wird es allerdings nicht viel. Mit AutoIt kommt man nicht weit. Das hat SilverAngel(CZ) auch gemerkt, nachdem er ein Screenshot seiner GUI in meinem Thread gepostet hat und den Hack für den nächsten Tag versprochen hat. Ist wohl nicht's draus geworden.