Über die SP oder EXP erkennen lassen, dass Ergebnis kann allerdings nach einer Questabgabe verfälscht werden.
Hier mal ein Beispiel:
Als erstes brauchst du natürlich eine GUI, gehen wir von diesem Beispiel aus:
Code:
#Region GUI
$GUI = GUICreate("KDMobzähler", 205, 25)
GUISetBkColor(0xFFFFFF)
GUICtrlCreateLabel("getötete Gegner:", 5, 5, 95, 17)
$L_GG = GUICtrlCreateLabel("0", 100, 5, 100, 17)
GUISetState(@SW_SHOW)
#EndRegion
While True
$nMsg = GUIGetMsg()
Switch $nMsg
Case -3
Exit
EndSwitch
WEnd
Unter der GUI (nicht in der Schleife) definierst du einfach die Base und das Offset:
Code:
#Region GUI
$GUI = GUICreate("KDMobzähler", 205, 25)
GUISetBkColor(0xFFFFFF)
GUICtrlCreateLabel("getötete Gegner:", 5, 5, 95, 17)
$L_GG = GUICtrlCreateLabel("0", 100, 5, 100, 17)
GUISetState(@SW_SHOW)
#EndRegion
[COLOR="Red"]$Base = 0x106445A8 ;DE Base
Dim $Offset_SP[2] = [0, 0x10A5F8] ;SP Offset[/COLOR]
While True
$nMsg = GUIGetMsg()
Switch $nMsg
Case -3
Exit
EndSwitch
WEnd
Um einen Anhaltspunkt zum vergleichen zu erhalten, liest du den Wert einfach einmal aus (nicht in der Schleife).
Zum auslesen wird die "NomadMemory.au3" oder die "Pointer.au3" benötigt:
Code:
#include <NomadMemory.au3> ;oder: #include <Pointer.au3>
#Region GUI
$GUI = GUICreate("KDMobzähler", 205, 25)
GUISetBkColor(0xFFFFFF)
GUICtrlCreateLabel("getötete Gegner:", 5, 5, 95, 17)
$L_GG = GUICtrlCreateLabel("0", 100, 5, 100, 17)
GUISetState(@SW_SHOW)
#EndRegion
[COLOR="DarkOrchid"]$Base = 0x106445A8 ;DE Base
Dim $Offset_SP[2] = [0, 0x10A5F8] ;SP Offset[/COLOR]
[COLOR="Red"]$Handle = _MemoryOpen(WinGetProcess("[CLASS:Nksp]"))
$Data_SP = _MemoryPointerWrite($Base, $Handle, $Offset_SP) ;liest die SP aus
_MemoryClose($Handle)[/COLOR]
While True
$nMsg = GUIGetMsg()
Switch $nMsg
Case -3
Exit
EndSwitch
WEnd
Jetzt musst du nur noch die SP in der While-Schleife auslesen, haben sie sich erhöht, wird auf eine globale Variable addiert:
Code:
#include <NomadMemory.au3> ;oder: #include <Pointer.au3>
#Region GUI
$GUI = GUICreate("KDMobzähler", 205, 25)
GUISetBkColor(0xFFFFFF)
GUICtrlCreateLabel("getötete Gegner:", 5, 5, 95, 17)
$L_GG = GUICtrlCreateLabel("0", 100, 5, 100, 17)
GUISetState(@SW_SHOW)
#EndRegion
$Base = 0x106445A8 ;DE Base
Dim $Offset_SP[2] = [0, 0x10A5F8] ;SP Offset
[COLOR="DarkOrchid"]$Handle = _MemoryOpen(WinGetProcess("[CLASS:Nksp]"))
$Data_SP_1 = _MemoryPointerRead($Base, $Handle, $Offset_SP) ;liest die SP aus[/COLOR]
[COLOR="Red"]If IsArray($Data_SP_1) Then
$Data_SP_1 = $Data_SP_1[1] ;darf beim späteren Vergleich kein Array mehr sein
EndIf
Global $Kills[/COLOR]
While True
$nMsg = GUIGetMsg()
Switch $nMsg
Case -3
Exit
EndSwitch
[COLOR="Red"]$Data_SP_2 = _MemoryPointerRead($Base, $Handle, $Offset_SP) ;liest die SP aus
If IsArray($Data_SP_2) Then
$Data_SP_2 = $Data_SP_2[1]
EndIf
If $Data_SP_1 <> $Data_SP_2 Then ;wenn der alte Wert nicht mit dem neuen übereinstimmt, dann...
If $Data_SP_1 < $Data_SP_2 Then ;wenn sich die SP erhöht haben
$Kills = $Kills + 1
GUICtrlSetData($L_GG, $Kills)
EndIf
$Data_SP_1 = $Data_SP_2 ;beide Variablen beinhalten wieder den selben Wert
EndIf[/COLOR]
WEnd
Beim Lesen der Werte muss man nur beachten, dass die Variable als Array zurück gegeben wird, "$Data_SP[0]" beinhaltet die Adresse und "$Data_SP[1]" den Wert.
Aus diesem Grund erklärt sich auch:
PHP Code:
If IsArray($Data_SP_1) Then
$Data_SP_1 = $Data_SP_1[1]
EndIf
Das ist nur ein kleines Beispiel, man kann noch weitere Faktoren mit einbeziehen, z. B. ob sich die Anzahl der NPCs ((_pNetwork) + 0x1C) + 0x1C) verringert hat. Wenn sich dieser Wert nicht geändert hat (z. B. bei einer Questabgabe) wird kein Kill addiert.
Müsste fürs erste ausführlich genug gewesen sein.