Hallo!
edit:
Crossposting Delphi Forum:
http://www.delphi-forum.de/topic_Zei...me_103845.html
Damit ihr nicht zurückschreckt: Es geht um ein etwas älteres Singleplayer Spiel. Das Thema "Hooking" und Assembler ist noch etwas neu für mich, Zeitberechnungen in Spielen erst recht. Ich habe nun vor, die Geschwindigkeit des lokalen Spielers zu erhöhen. Die Funktion die ich hooke, ist ein __thiscall, der this Pointer ist hierbei der Pointer zur Einheit, für welche die Geschwindigkeit berechnet werden soll. Die Funktion an sich scheint definitiv richtig, allerdings verstehe ich die Berechnung durch die 2 Parameter welche beide vom Typ DWORD sind nicht so recht. Die Berechnung läuft scheinbar über GetTickCount()
Folgende Parameter werden übergeben:
Parameter 1: 28986122
Parameter 2: 28986110
Die umgekehrte push Reihenfolge habe ich natürlich beachtet, die Parameter sind so in der Reihenfolge also korrekt.
Anfangs ging ich von einer recht simplen Berechnung aus, doch leider wurde ich wohl getäuscht. Folgende Funktion habe ich mir hier zusammengebastelt:
Delphi-Quellcode:
procedure hook_CalculateSpeed(dwTime1, dwTime2: Cardinal);
stdcall;
var
pLocal, pTemp: Pointer;
dwTemp: Cardinal;
const
factor: float = 1.0;
begin
asm
pushad
end;
// Pointer zur Einheit kopieren
asm
mov eax, [ecx+$100]
mov pTemp, eax
end;
pLocal := GetMyUnitPointer();
if (pLocal = pTemp)
then
begin
dwTemp := dwTime1 - dwTime2;
dwTemp := dwTemp * Trunc(factor);
dwTime1 := dwTime1 + dwTemp;
dwTime2 := dwTime2 + dwTemp;
end;
asm
popad
end;
oCalculateSpeed(dwTime1, dwTime2);
end;
Die Funktion an sich läuft ohne Probleme durch. Der Pointer-Check ob es denn auch meine Einheit ist funktioniert ebenfalls. Nun scheint es aber einen simplen Fehler mit großen Auswirkungen in meinem Code zu geben, denn meine Geschwindigkeit erhöht sich kein bisschen, selbst wenn ich den factor auf * 100 drehe.
dwTime1 & 2 direkt * 50 zu multiplizieren funktioniert ohne Probleme, mir kommt es aber nicht recht clever vor, den Wert bei jeder Bewegung derartig zu erhöhen :S Sind beide Werte (dwTime1, dwTime2) exakt gleich, kann ich mich schließlich gar nicht mehr bewegen, dwTime1 muss scheinbar höher sein.
Ich würde mich wirklich riesig freuen, wenn hier schon jemand Erfahrungen mit solchen Berechnungen gemacht hat. und mich ein wenig in die richtige Richtung lenken könnte.
lg