OldSchoolHack

Register / Login English

Source Engine WorldtoScreen


icon Source Engine WorldtoScreen #1

Join Date: Jul 2015

Posts: 3

User-Rating:

1 positive
0 negative
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

Last edited by radiocity (Thu 23. Jul 2015, 23:10)

Reason: no reason given

icon #2

Join Date: Aug 2007

Posts: 8646

User-Rating:

199 positive
33 negative
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

Join Date: May 2011

Posts: 419

User-Rating:

199 positive
8 negative
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
Last edited by Dr_Pepper (Mon 27. Jul 2015, 22:04)

Reason: no reason given

3 positive
0 negative
This post has been rated by:
zZzeta/S (Sat 25. Jul 2015, 03:21), KN4CK3R (Sat 25. Jul 2015, 15:01), radiocity (Wed 23. Dec 2015, 18:00)
icon #4

Join Date: Dec 2014

Posts: 88

User-Rating:

6 positive
4 negative
Good job mate!

__________________

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