using System.Collections.Generic;
using cygwin_x32.ObscuredTypes;
using System.Collections;
private static GameObject gameObject;
private static string error = "";
public static void entry() {
gameObject = new GameObject();
gameObject.AddComponent<ESP>();
UnityEngine.Object.DontDestroyOnLoad(gameObject);
File.WriteAllText("crashlog.txt", error+e.ToString());
class ESP : MonoBehaviour {
private void drawESP(object player) {
var worldPos = (Transform)readField("BaseNetPlayer", "PlayerTransform", player);
Vector3 heading = worldPos.transform.position - Camera.main.transform.position;
if (Vector3.Dot(Camera.main.transform.forward, heading) > 0) {
var screenPos = Camera.main.WorldToScreenPoint(worldPos.position);
screenPos.y = Screen.height - screenPos.y;
var width = 120*(phi/screenPos.z);
var height = (isCrouching(player) ? 160 : 240) * (phi/screenPos.z);
GUI.Label(new Rect(screenPos.x-width/2, screenPos.y-height/2-20, 35, 20), ""+getHealth(player));
DrawBox(new Vector2(screenPos.x-width/2, screenPos.y-height/2),
new Vector2(width, height), thick, Color.red);
private float getHealth(object player) {
var pinfo = readField("BaseNetPlayer", "playerInfo", player);
return (float)((ObscuredFloat)readField("PlayerInfo", "_health", pinfo));
private IEnumerable getAlivePlayers() {
var alivePlayers = readProperty("BaseClientGame", "AlivePlayers",
readProperty("Peer", "ClientGame", GameObject.Find("net"))
private Vector3 getHead(object player) {
Camera cam = (Camera)readProperty("BaseNetPlayer", "MainCamera", player);
return cam.transform.position;
private object getLocalPlayer() {
return readProperty("BaseClientGame", "LocalPlayer",
readProperty("Peer", "ClientGame", GameObject.Find("net")));
private bool isCrouching(object player) {
return (bool)readProperty("BaseMoveController", "isSeat",
readProperty("BaseNetPlayer", "Controller", player));
private bool onOurTeam(object player) {
bool isTeamGame = (bool)readProperty("BaseGame", "IsTeamGame",
readProperty("Peer", "ClientGame", GameObject.Find("net")));
if (!isTeamGame) return false;
var localPlayer = readProperty("BaseClientGame", "LocalPlayer",
readProperty("Peer", "ClientGame", GameObject.Find("net")));
var myTeam = readProperty("BaseNetPlayer", "PlayerType", localPlayer);
var team = readProperty("BaseNetPlayer", "PlayerType", player);
return (int)myTeam == (int)team;
foreach (object player in getAlivePlayers()) {
ObscuredInt id = (ObscuredInt)readProperty("BaseNetPlayer", "UserID", player);
if ( id >= 100000000 && id <= 500000000 || onOurTeam(player))
File.WriteAllText("crashlog.txt", e.ToString());