Seite 1 von 1

C++ Code in PureBasic-Code übersetzten?

Verfasst: 15.05.2008 11:03
von Programie
Hi,

Ich hab in einem Forum von GTA ein Code zum auslesen des Zielortes in GTA San Andreas gefunden. Aber der Code ist in C++ geschrieben und ich weiß nicht, wie ich ihn übersetzen soll. :(

Code: Alles auswählen

unsigned short usMarkerId = (* (unsigned short *) 0xBA6774) & 0xFFFF;
unsigned short usMarkerFlag = (* (unsigned short *) 0xBA6774) >> 16;

float fSelectionX = * (float *) 0xBA86F8 + 40 * usMarkerId;
float fSelectionY = * (float *) 0xBA86FC + 40 * usMarkerId;
Ich habe schon versucht den Code zu übersetzten, aber der funktioniert nicht so, wie er soll:

Code: Alles auswählen

usMarkerID=ReadProcessValue($BA6774&$FFFF,#Word)
usMarkerFlag=ReadProcessValue($BA6774>>16,#Word)

x.f=ReadProcessFloat($BA86F8+40*usMarkerID)
y.f=ReadProcessFloat($BA86FC+40*usMarkerID)

Debug x
Debug y
Hat jemand eine Idee, was ich das falsch mache?

PS: Hier ist der Thread in dem Forum


Thx :allright:

Verfasst: 15.05.2008 11:24
von DarkDragon
Woher hast du ReadProcessValue und ReadProcessFloat? Das steht in dem C Code auch nirgends.

So wären die 2 Zeilen in PureBasic:

Code: Alles auswählen

usMarkerId.l = PeekW($BA6774) & $FFFF
usMarkerFlag.l = PeekW($BA6774) >> 16;

fSelectionX.f = PeekF($BA86F8) + 40 * usMarkerId
fSelectionY.f = PeekF($BA86FC) + 40 * usMarkerId
Aber absolute Adressierung ist nunmal beim Protected Mode nicht so einfach. Ich denke dafür hast du auch das ReadProcessValue genommen und das ReadProcessFloat, oder?

Da es aber kein unsigned short in PureBasic gibt würde ich noch ein & $FFFF dranhängen:

Code: Alles auswählen

usMarkerId.l = PeekW($BA6774) & $FFFF
usMarkerFlag.l = PeekW($BA6774) & $FFFF >> 16;

fSelectionX.f = PeekF($BA86F8) + 40 * usMarkerId
fSelectionY.f = PeekF($BA86FC) + 40 * usMarkerId
Allerdings muss man da auf den Endian aufpassen. Desshalb ist das & $FFFF nicht ganz ok.

[EDIT]
Statt dem PeekF/PeekW musst du dann ja deine ReadProcess... Funktionen benutzen ;-) .

Verfasst: 15.05.2008 11:39
von Programie
@DarkDragon:

Die ReadProcessX()-Funktionen hab ich selbst erstellt.
Hab über dem Code noch "IncludeFile". :wink:

Wegen dem PeekX(): Das oll ja nicht aus dem eigenen Speicher, sondern aus dem Speicher von GTA San Andreas ausgelesen werden. :allright:

Aber da kommt nie raus, was eigentlich rauskommen sollte. :(

Beispiel:
Ich setzte den Zielort in GTA San Andreas ganz nach links oben, aber er gibt mir nicht irgendwelche Koordinaten aus dem Bereich aus, sondern was ganz anderes, was es eigentlich nicht sein könnte.
In der Mitte von der GTA San Andreas Karte ist ja die Position 0 x 0. Aber wenn ich da den Zielort hinsetze, kommen auch ganz andere Werte raus. :cry:

PS: Ich kann auch gern mal die "Common.pbi" posten (Die Datei, die ich über dem Code mit "IncludeFile" einfüge). <)

Verfasst: 15.05.2008 11:42
von DarkDragon
Programie hat geschrieben:@DarkDragon:

Die ReadProcessX()-Funktionen hab ich selbst erstellt.
Hab über dem Code noch "IncludeFile". :wink:

Wegen dem PeekX(): Das oll ja nicht aus dem eigenen Speicher, sondern aus dem Speicher von GTA San Andreas ausgelesen werden. :allright:

Aber da kommt nie raus, was eigentlich rauskommen sollte. :(

Beispiel:
Ich setzte den Zielort in GTA San Andreas ganz nach links oben, aber er gibt mir nicht irgendwelche Koordinaten aus dem Bereich aus, sondern was ganz anderes, was es eigentlich nicht sein könnte.
In der Mitte von der GTA San Andreas Karte ist ja die Position 0 x 0. Aber wenn ich da den Zielort hinsetze, kommen auch ganz andere Werte raus. :cry:

PS: Ich kann auch gern mal die "Common.pbi" posten (Die Datei, die ich über dem Code mit "IncludeFile" einfüge). <)
Bringt eh nichts, ich kanns nicht testen. Hast du denn den Code von mir getestet (Natürlich mit deinen Read... Funktionen statt den Peeks)? Das sollte eigentlich so stimmen wenn deine ReadProcess... Funktionen korrekt sind.

Verfasst: 15.05.2008 12:17
von Programie
DarkDragon hat geschrieben:

Code: Alles auswählen

usMarkerId.l = PeekW($BA6774) & $FFFF
usMarkerFlag.l = PeekW($BA6774) & $FFFF >> 16;

fSelectionX.f = PeekF($BA86F8) + 40 * usMarkerId
fSelectionY.f = PeekF($BA86FC) + 40 * usMarkerId
Das funktioniert! :allright:

Thx