OldSchoolHack

Registrieren / Anmelden Deutsch

Source Engine WorldtoScreen


icon Source Engine WorldtoScreen #1

Anmeldungsdatum: Jul 2015

Beiträge: 3

Benutzer-Bewertung:

1 positiv
0 negativ
Hallo OSH Community.

Ich arbeite an  einem external hack für das Spiel DotA2. Mein ziel ist es Mana-Bars zu zeichnen.
Die X Y Z Postion meiner Spieler habe ich gefunden. Doch jetzt frage ich mich wie ich die Koordinaten in Bildschirm Koordinaten umwandle kann.

Ich hab gelesen das Spiele die auf der Source Engine basieren, diese Funktion immer mitliefern.
In OllyDbg hab ich dies hier gefunden.Weiß aber nicht ob und wie mir das weiterhelfen kann.

http://puu.sh/jajye/cf6f4b42d1.png

Zuletzt geändert von radiocity (Do 23. Jul 2015, 23:10)

Grund: kein Grund angegeben

icon #2

Anmeldungsdatum: Aug 2007

Beiträge: 8643

Benutzer-Bewertung:

199 positiv
33 negativ
Du suchst die Funktion WorldToScreenMatrix von der Engine Klasse. Wenn du nach der im Source Engine SDK suchst, findest du vielleicht eine Stelle, die du in Dota wiederfinden kannst.

__________________

Hallo
icon #3

Anmeldungsdatum: Mai 2011

Beiträge: 419

Benutzer-Bewertung:

199 positiv
8 negativ
Die ViewMatrix lässt sich im Speicher ziemlich einfach finden:

TEXT Code:
  1. ViewMatrix[3][3] == -1 * KameraPosition.X , wenn ViewAngle == { 0, 0, 0}
  2. ViewMatrix[3][3] == -1 * KameraPosition.Y , wenn ViewAngle == { 0, 90, 0}

So habe ich in Dota 2 ziemlich schnell eine ViewMatrix gefunden: client.dll + 0x13393AC (float [4][4])(03:02, 25.07.15)



Allerdings legt dir Dota noch ein paar Steine in den Weg..

http://abload.de/img/dota_viewportp1o0k.png

Nur innerhalb des roten Rechtecks hat das Game einen Viewport, wenn du die
ViewMatrix auf die volle Fenstergröße anwendest, wirst du verzerrte ergebnisse bekommen...

Das kann man aber Quick&Dirty fixen

CPP Code:
  1. ScreenOffset.x = 0;
  2. ScreenOffset.y = WindowSize.cy / 25.f + 0.5f;
  3.  
  4. ScreenSize.height = WindowSize.cy * 0.8038411f;
  5. ScreenSize.width = WindowSize.cx;

Problem solved

CPP Code:
  1. bool WorldToScreenMatrix::WorldToScreen(Vector& Position3D, D2D1_POINT_2F& ScreenPos)
  2. {
  3. float x, y, w;
  4.  
  5. w = this->W2SMat[3][0] * Position3D.x + this->W2SMat[3][1] * Position3D.y + this->W2SMat[3][2] * Position3D.z + this->W2SMat[3][3];
  6.  
  7. if (w <= 0) return false;
  8.  
  9. x = this->W2SMat[0][0] * Position3D.x + this->W2SMat[0][1] * Position3D.y + this->W2SMat[0][2] * Position3D.z + this->W2SMat[0][3];
  10. y = this->W2SMat[1][0] * Position3D.x + this->W2SMat[1][1] * Position3D.y + this->W2SMat[1][2] * Position3D.z + this->W2SMat[1][3];
  11.  
  12. float invw = 1.0f / w;
  13.  
  14. x *= invw;
  15. y *= invw;
  16.  
  17. ScreenPos.x = ((float)(this->ScreenSize.width)  / 2.f) + (0.5f * x * (float)(this->ScreenSize.width)  + 0.5f);
  18. ScreenPos.y = ((float)(this->ScreenSize.height) / 2.f) - (0.5f * y * (float)(this->ScreenSize.height) + 0.5f);
  19.  
  20. ScreenPos.x += ScreenOffset.x;
  21. ScreenPos.y += ScreenOffset.y;
  22.  
  23. return true;
  24. }

und schon ist die Dota 2 World-To-Screen Funktion fertig

mfg Dr_Pepper

__________________

http://abload.de/img/signaturmitoshlogos2ufb.jpg
http://abload.de/img/pfeila4uzk.png Da unten ist ein Like-Button, benutze ihn doch
Zuletzt geändert von Dr_Pepper (Mo 27. Jul 2015, 22:04)

Grund: kein Grund angegeben

3 positiv
0 negativ
Dieser Beitrag wurde bewertet von:
zZzeta/S (Sa 25. Jul 2015, 03:21), KN4CK3R (Sa 25. Jul 2015, 15:01), radiocity (Mi 23. Dez 2015, 18:00)
icon #4

Anmeldungsdatum: Dez 2014

Beiträge: 88

Benutzer-Bewertung:

6 positiv
4 negativ
Good job mate!

__________________

http://i.imgur.com/7V3hvsc.gif