In diesem Teil werden wir einen Nametag-Hack schreiben. Dieser zeigt einfach die ganze Zeit (auch durch Wände) den Namen von Gegnern über deren Köpfen an. Das ist jetzt nicht soooo spektakulär, dennoch ist es gut zum Verständnis von (später folgenden) komplexeren Aktionen.
Um es erst einmal in Pseudocode auszudrücken; Im Grunde müssen wir folgende Schritte machen:
- Gehe jeden Spieler-Eintrag in dem Array durch
- Wende die WorldToScreen Funktion auf die Position an um die 3D Koordinaten in ein 2D System zu bekommen
- Zeichne den Namen des Spielers an der WorldToScreen Position
Klingt relativ simple, oder?
Quelle : http://easysurfer.back2hack.cc
[spoiler]
Ich habe hierzu eine Klasse MW2Player, welche die Container von Entity und Clientinfo aus den vorherigen Teilen beinhaltet. Zudem gibt es ein Member “Vector2 vPosOnScreenLast”, welche jeweils geupdated wird:
public class MW2Player { public EntityContainer Entity; public ClientinfoContainer Clientinfo; public Vector2 vPosOnScreenLast; public MW2Player(int iIndex) { Entity = new EntityContainer(iIndex); Clientinfo = new ClientinfoContainer(iIndex); vPosOnScreenLast = new Vector2(-100, -100); } }
Das ist im Grunde alles was wir brauchen. Daher folgt gleich die Update-Methode:
public void Update() { Entity.RefreshData(); Clientinfo.RefreshData(); this.vPosOnScreenLast = ScreenManager.WorldToScreen(this.Entity.Instance.Origin + new Vector3(0,0,55.0f));
Wir fügen dem Origin der Entity 55 Einheiten in Richtung der Z-Achse hinzu, da wir ja den Nametag nicht in den Beinen, sondern ca. auf Kopfhöhe haben wollen!
Wie ihr sehen könnt wird hier Gebrauch von der WorldToScreen-Funktion gemacht. Die genaue Mathematik dahinter kann ich euch leider nicht erklären, aber dafür hab ich euch einen interessanten Link für Euch am Beispiel von COD4, was im Grunde auf der selben Engine beruht.
public class ScreenManager { // Needed because we'll have to change the RefDef-Values for the Aimbot -> wrong results in WorldToScreen public static Vector3[] vViewAxisCopy; public static void Update(Vector3 Axis0, Vector3 Axis1, Vector3 Axis2) { vViewAxisCopy = new Vector3[3] { new Vector3(Axis0.fX, Axis0.fY, Axis0.fZ), new Vector3(Axis1.fX, Axis1.fY, Axis1.fZ), new Vector3(Axis2.fX, Axis2.fY, Axis2.fZ) }; } private static Vector3 WorldToScreen_Transform(Vector3 vPos) { Vector3 vReturnVec = new Vector3(0, 0, 0); Vector3 vTempPos = vPos - GameManager.RefDefI.Instance.Origin; vReturnVec.fX = vTempPos.DotProduct(vViewAxisCopy[1]); vReturnVec.fY = vTempPos.DotProduct(vViewAxisCopy[2]); vReturnVec.fZ = vTempPos.DotProduct(vViewAxisCopy[0]); return vReturnVec; } public static Vector2 WorldToScreen(Vector3 vPos) { Vector3 vTransform = WorldToScreen_Transform(vPos); Vector2 vReturn = new Vector2(); if (vTransform.fZ < 0.1f) return new Vector2(-100, -100); vReturn.fX = (GameManager.RefDefI.Instance.ScreenX / 2) * (1 - (vTransform.fX / GameManager.RefDefI.Instance.fov_x / vTransform.fZ)); vReturn.fY = (GameManager.RefDefI.Instance.ScreenY / 2) * (1 - (vTransform.fY / GameManager.RefDefI.Instance.fov_y / vTransform.fZ)); return vReturn; } }
Erst wird eine Kopie von den ViewAchsen angelegt, da diese später im Aimbot modifiziert werden. Dann wird die Gegnerposition von unserer Position abgezogen, was ein Vector ZU dem Gegner ergibt. Davon wird 3 mal das Punktprodukt gezogen und geprüft, ob sich der Gegner überhaupt “vor” uns befindet. Wenn nein, wird -100|-100 zurückgeliefert, sonst wird die Hälfe des Screens genommen, dieses Punktprodukt durch die aktuelle FOV (FieldOfView) geteilt und nochmal durch Z dividiert. Raus kommt eine Position in unserem Screenspace! (Wie schon gesagt, für die genaue Mathematik verweise ich euch auf den Link weiter oben )
Nun muss das nur noch gezeichnet werden und wir sind fertig!
public void Render() { if (this.IsAlive() && this.Clientinfo.Instance.Team != GameManager.PlayerManagerInz.GetMyPlayer().Clientinfo.Instance.Team) { // Nametag TextManager.DrawString(new String(this.Clientinfo.Instance.Name), vPosOnScreenLast.fX, vPosOnScreenLast.fY, TextManager.Color.Blue, TextManager.Font.Smalldevfont); } }
Greez und schönes Wochenende!
Easy
[/spoiler]